From 2976352723c6f022f44dabce8355b1c04846f68e Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 24 Dec 2022 16:06:28 +0800 Subject: [PATCH 001/238] =?UTF-8?q?:arrow=5Fup:=20=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=20springboot=202.7.7=20doc=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=86=E6=94=AF=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++++++- pom.xml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 412e642c..b5b42d9d 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,16 @@ ## 快速开始 +### 分支说明 + +- master: java8 + springboot 2.7 + springcloud 2021 +- jdk17: java17 springboot 3.0 + springcloud 2022 + ### 核心依赖 | 依赖 | 版本 | | ---------------------- |------------| -| Spring Boot | 2.7.6 | +| Spring Boot | 2.7.7 | | Spring Cloud | 2021.0.5 | | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.0 | diff --git a/pom.xml b/pom.xml index 2ed37322..7f0751e5 100755 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.6 + 2.7.7 2021.0.5 2021.0.4.0 UTF-8 -- Gitee From 65a998bba6ea3cff43297477248959115bd9c2a3 Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Mon, 26 Dec 2022 17:37:23 +0800 Subject: [PATCH 002/238] =?UTF-8?q?:sparkles:=20Introducing=20new=20featur?= =?UTF-8?q?es.=20=E8=A6=86=E7=9B=96nacos=E5=AE=98=E6=96=B9=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=AE=B0=E5=BD=95=E6=9F=A5=E8=AF=A2=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 数据库插件是oracle时 查询出空数据对比错误 --- .../nacos/config/service/HistoryService.java | 85 +++++++++++++++++++ .../nacos/config/service/package-info.java | 4 + 2 files changed, 89 insertions(+) create mode 100644 pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java create mode 100644 pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java b/pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java new file mode 100644 index 00000000..3a107c6a --- /dev/null +++ b/pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java @@ -0,0 +1,85 @@ +package com.alibaba.nacos.config.service; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.common.utils.Pair; +import com.alibaba.nacos.config.server.model.ConfigHistoryInfo; +import com.alibaba.nacos.config.server.model.ConfigInfoWrapper; +import com.alibaba.nacos.config.server.model.Page; +import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService; +import com.alibaba.nacos.config.server.service.repository.HistoryConfigInfoPersistService; +import com.alibaba.nacos.plugin.auth.exception.AccessException; +import com.alibaba.nacos.plugin.encryption.handler.EncryptionHandler; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class HistoryService { + + private final HistoryConfigInfoPersistService historyConfigInfoPersistService; + + private final ConfigInfoPersistService configInfoPersistService; + + public HistoryService(HistoryConfigInfoPersistService historyConfigInfoPersistService, + ConfigInfoPersistService configInfoPersistService) { + this.historyConfigInfoPersistService = historyConfigInfoPersistService; + this.configInfoPersistService = configInfoPersistService; + } + + public Page listConfigHistory(String dataId, String group, String namespaceId, Integer pageNo, + Integer pageSize) { + return this.historyConfigInfoPersistService.findConfigHistory(dataId, group, namespaceId, pageNo, pageSize); + } + + public ConfigHistoryInfo getConfigHistoryInfo(String dataId, String group, String namespaceId, Long nid) + throws AccessException { + ConfigHistoryInfo configHistoryInfo = this.historyConfigInfoPersistService.detailConfigHistory(nid); + if (Objects.isNull(configHistoryInfo)) { + return null; + } + else { + this.checkHistoryInfoPermission(configHistoryInfo, dataId, group, namespaceId); + String encryptedDataKey = configHistoryInfo.getEncryptedDataKey(); + Pair pair = EncryptionHandler.decryptHandler(dataId, encryptedDataKey, + configHistoryInfo.getContent()); + configHistoryInfo.setContent((String) pair.getSecond()); + return configHistoryInfo; + } + } + + public ConfigHistoryInfo getPreviousConfigHistoryInfo(String dataId, String group, String namespaceId, Long id) + throws AccessException { + ConfigHistoryInfo configHistoryInfo = this.historyConfigInfoPersistService.detailPreviousConfigHistory(id); + if (Objects.isNull(configHistoryInfo)) { + return null; + } + else { + this.checkHistoryInfoPermission(configHistoryInfo, dataId, group, namespaceId); + return configHistoryInfo; + } + } + + public List getConfigListByNamespace(String namespaceId) { + return this.configInfoPersistService.queryConfigInfoByNamespace(namespaceId); + } + + /** + * 覆盖原有的校验方式,oracle 数据库没有空 字符串 只有 null + * @param configHistoryInfo + * @param dataId + * @param group + * @param namespaceId + * @throws AccessException + */ + private void checkHistoryInfoPermission(ConfigHistoryInfo configHistoryInfo, String dataId, String group, + String namespaceId) throws AccessException { + if (!Objects.equals(configHistoryInfo.getDataId(), dataId) + || !Objects.equals(configHistoryInfo.getGroup(), group) + || (!StrUtil.isEmpty(configHistoryInfo.getTenant()) + && !Objects.equals(configHistoryInfo.getTenant(), namespaceId))) { + throw new AccessException("Please check dataId, group or namespaceId."); + } + } + +} diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java b/pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java new file mode 100644 index 00000000..53d83d08 --- /dev/null +++ b/pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java @@ -0,0 +1,4 @@ +/** + * 处理再oracle数据库下空置的判断 + */ +package com.alibaba.nacos.config.service; -- Gitee From 7d70766b17c5962810aa24977398f51bf4e7b5fb Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Tue, 27 Dec 2022 09:59:52 +0800 Subject: [PATCH 003/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20=E5=85=B3?= =?UTF-8?q?=E9=97=ADdocker-compose=20=E4=B8=AD=E7=9A=84mysql=20=E5=92=8Cre?= =?UTF-8?q?dis=20=E7=9A=84=E7=AB=AF=E5=8F=A3=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=92=8C=E5=85=B6=E4=BB=96=E9=A1=B9=E7=9B=AE=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index be419326..3380751d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,13 +9,9 @@ services: restart: always container_name: pig-mysql image: pig-mysql - ports: - - 3306:3306 pig-redis: image: redis:7.0.0 - ports: - - 6379:6379 restart: always container_name: pig-redis hostname: pig-redis -- Gitee From 5e138480feb43ac25bfe55bc0a25078821eb2575 Mon Sep 17 00:00:00 2001 From: TwelveT <2471835953@qq.com> Date: Wed, 28 Dec 2022 10:59:57 +0800 Subject: [PATCH 004/238] =?UTF-8?q?JavaFormat=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7f0751e5..a3e82cb9 100755 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ username password 4.9.9 - 0.0.34 + 0.0.35 -- Gitee From 5e1802192cd02d46dcb4901ae24b508f8a80e698 Mon Sep 17 00:00:00 2001 From: suntongwen Date: Wed, 28 Dec 2022 11:19:25 +0800 Subject: [PATCH 005/238] =?UTF-8?q?=E9=81=BF=E5=85=8D=20race=20condition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/PigAuthenticationSuccessEventHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java index 162babd2..003c085f 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java @@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.security.oauth2.core.OAuth2RefreshToken; @@ -71,7 +72,10 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce // 发送异步日志事件 PigUser userInfo = (PigUser) map.get(SecurityConstants.DETAILS_USER); log.info("用户:{} 登录成功", userInfo.getName()); - SecurityContextHolder.getContext().setAuthentication(accessTokenAuthentication); + //避免 race condition + SecurityContext context = SecurityContextHolder.createEmptyContext(); + context.setAuthentication(accessTokenAuthentication); + SecurityContextHolder.setContext(context); SysLog logVo = SysLogUtils.getSysLog(); logVo.setTitle("登录成功"); String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME); -- Gitee From 5b4dfcdcd55627f1264eae5bff5a896223355cb0 Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Wed, 28 Dec 2022 20:26:24 +0800 Subject: [PATCH 006/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dnacos=20=E8=A6=86=E7=9B=96=20HistoryService=20?= =?UTF-8?q?=E5=8C=85=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nacos/config/{ => server}/service/HistoryService.java | 5 ++++- .../nacos/config/{ => server}/service/package-info.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) rename pig-register/src/main/java/com/alibaba/nacos/config/{ => server}/service/HistoryService.java (97%) rename pig-register/src/main/java/com/alibaba/nacos/config/{ => server}/service/package-info.java (52%) diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java similarity index 97% rename from pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java rename to pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java index 3a107c6a..72a05665 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/config/service/HistoryService.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java @@ -1,4 +1,4 @@ -package com.alibaba.nacos.config.service; +package com.alibaba.nacos.config.server.service; import cn.hutool.core.util.StrUtil; import com.alibaba.nacos.common.utils.Pair; @@ -14,6 +14,9 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Objects; +/** + * @author aeizzz + */ @Service public class HistoryService { diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java similarity index 52% rename from pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java rename to pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java index 53d83d08..d3c747a1 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/config/service/package-info.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java @@ -1,4 +1,4 @@ /** * 处理再oracle数据库下空置的判断 */ -package com.alibaba.nacos.config.service; +package com.alibaba.nacos.config.server.service; -- Gitee From 1695ce3e84adde6d99e9addfec3de44806e75b57 Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Wed, 28 Dec 2022 20:26:45 +0800 Subject: [PATCH 007/238] :sparkles: Introducing new features. up mybatis-plus 3.5.3 --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index b82dd87b..5d5a07f1 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -25,7 +25,7 @@ 1.2.83 1.6.9 2.2.0 - 3.5.2 + 3.5.3 8.0.31 1.5.2 1.2.6 -- Gitee From 29efedb3e696d219100164e65c87b559470019d5 Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Wed, 28 Dec 2022 20:44:58 +0800 Subject: [PATCH 008/238] :art: Improving structure / format of the code. --- .../support/handler/PigAuthenticationSuccessEventHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java index 003c085f..3466b9ff 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java @@ -72,7 +72,7 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce // 发送异步日志事件 PigUser userInfo = (PigUser) map.get(SecurityConstants.DETAILS_USER); log.info("用户:{} 登录成功", userInfo.getName()); - //避免 race condition + // 避免 race condition SecurityContext context = SecurityContextHolder.createEmptyContext(); context.setAuthentication(accessTokenAuthentication); SecurityContextHolder.setContext(context); -- Gitee From 3eaba7501ce7c4d8efdb808a0af1b80d3067d061 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 29 Dec 2022 14:18:31 +0800 Subject: [PATCH 009/238] =?UTF-8?q?:arrow=5Fup:=20=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=20springboot=202.7.7=20doc=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=86=E6=94=AF=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index b5b42d9d..3cec9218 100644 --- a/README.md +++ b/README.md @@ -30,14 +30,12 @@ ![](https://minio.pigx.vip/oss/1648184189.png) - - ## 快速开始 ### 分支说明 - master: java8 + springboot 2.7 + springcloud 2021 -- jdk17: java17 springboot 3.0 + springcloud 2022 +- jdk17: java17 + springboot 3.0 + springcloud 2022 ### 核心依赖 -- Gitee From ea1acee88aa11a77969180e83e84ea55baeb058f Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Fri, 30 Dec 2022 09:00:47 +0800 Subject: [PATCH 010/238] :bookmark: Releasing / Version tags. 3.6.5 --- pig-auth/pom.xml | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- pig-common/pig-common-core/pom.xml | 2 +- pig-common/pig-common-datasource/pom.xml | 2 +- pig-common/pig-common-feign/pom.xml | 2 +- pig-common/pig-common-job/pom.xml | 2 +- pig-common/pig-common-log/pom.xml | 2 +- pig-common/pig-common-mybatis/pom.xml | 2 +- pig-common/pig-common-seata/pom.xml | 2 +- pig-common/pig-common-security/pom.xml | 2 +- pig-common/pig-common-swagger/pom.xml | 2 +- pig-common/pig-common-xss/pom.xml | 2 +- pig-common/pom.xml | 2 +- pig-gateway/pom.xml | 2 +- pig-register/pom.xml | 2 +- pig-upms/pig-upms-api/pom.xml | 2 +- pig-upms/pig-upms-biz/pom.xml | 2 +- pig-upms/pom.xml | 2 +- pig-visual/pig-codegen/pom.xml | 2 +- pig-visual/pig-monitor/pom.xml | 2 +- pig-visual/pig-sentinel-dashboard/pom.xml | 2 +- pig-visual/pig-xxl-job-admin/pom.xml | 2 +- pig-visual/pom.xml | 2 +- pom.xml | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 1e5e2da4..bb9dc812 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.5 pig-auth diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 5d5a07f1..9ebf9101 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common-bom - 3.6.4 + 3.6.5 pom pig-common-bom diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index d8457f55..16b84c5e 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-core diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index 0af20a6e..ee227c82 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -21,7 +21,7 @@ pig-common com.pig4cloud - 3.6.4 + 3.6.5 4.0.0 diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 26451d25..4026a01a 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 4.0.0 diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 1a12427d..0ab97cbf 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-job diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index 83acf4c3..aa1c2046 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-log diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index 84c3a56f..dd7d6b34 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-mybatis diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index 6b80cb4a..09a45976 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index 469aa634..ee8f4faa 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-security diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index 854dad19..f585a4c3 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 495cfe2b..387742b9 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.5 pig-common-xss diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 8c24c931..60616c98 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.5 pig-common diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 7f625d7a..6ce35adf 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.5 pig-gateway diff --git a/pig-register/pom.xml b/pig-register/pom.xml index d5309be0..45e0284e 100755 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -18,7 +18,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.5 pig-register diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index 03c66e10..68520c51 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.4 + 3.6.5 pig-upms-api diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index a3652ff2..2aac59cc 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.4 + 3.6.5 pig-upms-biz diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index a5994580..1b9cd02e 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.5 pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index d5cadd48..aa653941 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.5 pig-codegen diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index e643f3cf..4145a511 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.5 pig-monitor diff --git a/pig-visual/pig-sentinel-dashboard/pom.xml b/pig-visual/pig-sentinel-dashboard/pom.xml index 86f4321d..0840d161 100755 --- a/pig-visual/pig-sentinel-dashboard/pom.xml +++ b/pig-visual/pig-sentinel-dashboard/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.5 pig-sentinel-dashboard diff --git a/pig-visual/pig-xxl-job-admin/pom.xml b/pig-visual/pig-xxl-job-admin/pom.xml index 098b2cda..b3553c3e 100644 --- a/pig-visual/pig-xxl-job-admin/pom.xml +++ b/pig-visual/pig-xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.5 pig-xxl-job-admin diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 7366fa28..92ae2b61 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.5 pig-visual diff --git a/pom.xml b/pom.xml index a3e82cb9..c21f83b4 100755 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig ${project.artifactId} - 3.6.4 + 3.6.5 pom https://www.pig4cloud.com -- Gitee From efba30ac55923ad64a6facfb9bbd00c43fbdfdfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=91=A3?= <861571118@qq.com> Date: Mon, 2 Jan 2023 11:06:15 +0000 Subject: [PATCH 011/238] :bug: Fixing a bug.ObjectUtil.isEmpty . MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 小董 <861571118@qq.com> --- .../main/java/com/pig4cloud/pig/common/core/util/RetOps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java index ea59db5a..bc48065a 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java @@ -210,7 +210,7 @@ public class RetOps { * @throws Ex 断言失败时抛出 */ public RetOps assertDataNotEmpty(Function, ? extends Ex> func) throws Ex { - if (ObjectUtil.isNotEmpty(original.getData())) { + if (ObjectUtil.isEmpty(original.getData())) { throw func.apply(original); } return this; -- Gitee From 6757062d5624326a5bc23e0cde57346e5f9f38cf Mon Sep 17 00:00:00 2001 From: aeizzz Date: Tue, 3 Jan 2023 09:14:57 +0800 Subject: [PATCH 012/238] :sparkles: Introducing new features. up mybatis-plus 3.5.3.1 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3cec9218..beaca953 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ | Spring Cloud | 2021.0.5 | | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.0 | -| Mybatis Plus | 3.5.2 | +| Mybatis Plus | 3.5.3.1 | | hutool | 5.8.10 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 9ebf9101..b881b89f 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -25,7 +25,7 @@ 1.2.83 1.6.9 2.2.0 - 3.5.3 + 3.5.3.1 8.0.31 1.5.2 1.2.6 -- Gitee From c79a2588e42ee56c549985a7bc8662647c0211e8 Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 4 Jan 2023 12:55:31 +0800 Subject: [PATCH 013/238] =?UTF-8?q?:arrow=5Fup:=20=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=20springboot=203.0.1=20doc=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=86=E6=94=AF=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cec9218..eab12a5a 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,13 @@ - master: java8 + springboot 2.7 + springcloud 2021 - jdk17: java17 + springboot 3.0 + springcloud 2022 +| 分支 | 说明 | +|-----------------|------------------------------------------------------------------| +| master | java8 + springboot 2.7 + springcloud 2021 | +| sca-springboot3 | java17 + springboot 3.0 + springcloud 2022 | +| sct-springboot3 | java17 + springboot 3.0 + springcloud 2022 | + + ### 核心依赖 | 依赖 | 版本 | @@ -45,7 +52,7 @@ | Spring Cloud | 2021.0.5 | | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.0 | -| Mybatis Plus | 3.5.2 | +| Mybatis Plus | 3.5.3.1 | | hutool | 5.8.10 | ### 模块说明 -- Gitee From e45423c4ca1d9228cbd9be5c20fceb8d0b3be679 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Sat, 7 Jan 2023 09:38:57 +0000 Subject: [PATCH 014/238] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=8A=A0=E5=BF=AB=E6=9E=84=E5=BB=BA=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: twelvet <2471835953@qq.com> --- .github/workflows/maven.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b87d69b9..082741b9 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -22,6 +22,7 @@ jobs: with: java-version: ${{ matrix.java-version }} distribution: 'zulu' + cache: maven - name: mvn spring-javaformat:validate run: mvn spring-javaformat:validate -- Gitee From 56751368d41be1d8f5ef5b52798d434e1405e9dc Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Sat, 14 Jan 2023 19:01:58 +0800 Subject: [PATCH 015/238] =?UTF-8?q?:sparkles:=20close=20#I6AIC7=20pigx-reg?= =?UTF-8?q?ister=E6=94=AF=E6=8C=81=E5=BC=80=E5=90=AF=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-auth/src/main/resources/application.yml | 2 ++ pig-gateway/src/main/resources/application.yml | 2 ++ .../java/com/alibaba/nacos/PigNacosApplication.java | 2 +- .../java/com/alibaba/nacos/config/ConsoleConfig.java | 10 +++++++++- pig-register/src/main/resources/application.yml | 9 +++++++-- .../pig-upms-biz/src/main/resources/application.yml | 2 ++ .../pig-codegen/src/main/resources/application.yml | 2 ++ .../pig-monitor/src/main/resources/application.yml | 2 ++ .../src/main/resources/application.yml | 2 ++ pom.xml | 2 ++ 10 files changed, 31 insertions(+), 4 deletions(-) diff --git a/pig-auth/src/main/resources/application.yml b/pig-auth/src/main/resources/application.yml index 3690b33d..8c60e73e 100755 --- a/pig-auth/src/main/resources/application.yml +++ b/pig-auth/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-gateway/src/main/resources/application.yml b/pig-gateway/src/main/resources/application.yml index 4e9e8bdf..c694dc1b 100755 --- a/pig-gateway/src/main/resources/application.yml +++ b/pig-gateway/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java b/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java index 74397f97..42abdf46 100755 --- a/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java +++ b/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java @@ -43,7 +43,7 @@ public class PigNacosApplication { */ private static boolean initEnv() { System.setProperty(ConfigConstants.STANDALONE_MODE, "true"); - System.setProperty(ConfigConstants.AUTH_ENABLED, "false"); + System.setProperty(ConfigConstants.AUTH_ENABLED, "true"); System.setProperty(ConfigConstants.LOG_BASEDIR, "logs"); System.setProperty(ConfigConstants.LOG_ENABLED, "false"); return true; diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java index 7a3ec617..e7869b0f 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java @@ -16,6 +16,7 @@ package com.alibaba.nacos.config; +import com.alibaba.nacos.console.filter.XssFilter; import com.alibaba.nacos.core.code.ControllerMethodsCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; @@ -39,7 +40,7 @@ import java.time.ZoneId; */ @Component @EnableScheduling -@PropertySource("/application.properties") +@PropertySource("/application.yml") public class ConsoleConfig { @Autowired @@ -64,11 +65,18 @@ public class ConsoleConfig { config.addAllowedHeader("*"); config.setMaxAge(18000L); config.addAllowedMethod("*"); + config.addAllowedOriginPattern("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } + + @Bean + public XssFilter xssFilter() { + return new XssFilter(); + } + @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(ZoneId.systemDefault().toString()); diff --git a/pig-register/src/main/resources/application.yml b/pig-register/src/main/resources/application.yml index 60681dab..461e9178 100755 --- a/pig-register/src/main/resources/application.yml +++ b/pig-register/src/main/resources/application.yml @@ -2,6 +2,8 @@ server: port: 8848 #如何修改 pig-register 启动端口 >: https://t.cn/A6XGvTdb tomcat: basedir: logs + error: + include-message: always db: num: 1 @@ -14,12 +16,15 @@ db: nacos: core: auth: + server: + identity: + key: serverIdentity + value: security plugin.nacos.token.secret.key: SecretKey012345678901234567890123456789012345678901234567890123456789 - enabled: false system.type: nacos security: ignore: - urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** + urls: /actuator/**,/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** spring: datasource: diff --git a/pig-upms/pig-upms-biz/src/main/resources/application.yml b/pig-upms/pig-upms-biz/src/main/resources/application.yml index 7528a4fa..d3da88fc 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/application.yml +++ b/pig-upms/pig-upms-biz/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-visual/pig-codegen/src/main/resources/application.yml b/pig-visual/pig-codegen/src/main/resources/application.yml index 3a87b848..a21122e3 100644 --- a/pig-visual/pig-codegen/src/main/resources/application.yml +++ b/pig-visual/pig-codegen/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-visual/pig-monitor/src/main/resources/application.yml b/pig-visual/pig-monitor/src/main/resources/application.yml index 2ce78424..928dcb81 100755 --- a/pig-visual/pig-monitor/src/main/resources/application.yml +++ b/pig-visual/pig-monitor/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml b/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml index 20eccf92..1de05640 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml @@ -12,6 +12,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} metadata: diff --git a/pom.xml b/pom.xml index c21f83b4..5efa7fe1 100755 --- a/pom.xml +++ b/pom.xml @@ -249,6 +249,8 @@ dev + nacos + nacos -- Gitee From 578e275b7db34d8508f76f84e3490e63652cc8f2 Mon Sep 17 00:00:00 2001 From: aeizzz <1129603149@qq.com> Date: Sat, 14 Jan 2023 19:02:26 +0800 Subject: [PATCH 016/238] =?UTF-8?q?:sparkles:=20close=20#I6AIC7=20pigx-reg?= =?UTF-8?q?ister=E6=94=AF=E6=8C=81=E5=BC=80=E5=90=AF=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/alibaba/nacos/config/ConsoleConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java index e7869b0f..b5dbe6e8 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java @@ -71,7 +71,6 @@ public class ConsoleConfig { return new CorsFilter(source); } - @Bean public XssFilter xssFilter() { return new XssFilter(); -- Gitee From 596df42ae2a022ea6c8686a2fd914354606ed71d Mon Sep 17 00:00:00 2001 From: MuskLai Date: Mon, 16 Jan 2023 16:10:53 +0800 Subject: [PATCH 017/238] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=B8=85=E9=99=A4=E7=BC=93=E5=AD=98=20key=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java index 8934e827..487ddb5f 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java @@ -67,7 +67,7 @@ public class SysDictServiceImpl extends ServiceImpl impl * @return */ @Override - @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.type") + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictKey") public void updateDict(SysDict dict) { SysDict sysDict = this.getById(dict.getId()); // 系统内置 -- Gitee From 23826e0b44018a1d5e63d4f1078d5b499101a3dd Mon Sep 17 00:00:00 2001 From: MuskLai Date: Mon, 16 Jan 2023 16:25:26 +0800 Subject: [PATCH 018/238] =?UTF-8?q?Revert=20"fix:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E6=B8=85=E9=99=A4=E7=BC=93=E5=AD=98=20key?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E9=94=99=E8=AF=AF"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f1f18a1f --- .../pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java index 487ddb5f..8934e827 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java @@ -67,7 +67,7 @@ public class SysDictServiceImpl extends ServiceImpl impl * @return */ @Override - @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictKey") + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.type") public void updateDict(SysDict dict) { SysDict sysDict = this.getById(dict.getId()); // 系统内置 -- Gitee From daff7b1a4aa46ecbdf69ad80e6fc5de2256b7d45 Mon Sep 17 00:00:00 2001 From: MuskLai Date: Mon, 16 Jan 2023 16:27:51 +0800 Subject: [PATCH 019/238] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=B8=85=E9=99=A4=E7=BC=93=E5=AD=98=20key=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java index 8934e827..487ddb5f 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictServiceImpl.java @@ -67,7 +67,7 @@ public class SysDictServiceImpl extends ServiceImpl impl * @return */ @Override - @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.type") + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictKey") public void updateDict(SysDict dict) { SysDict sysDict = this.getById(dict.getId()); // 系统内置 -- Gitee From f48a8493343dc66f44c4545c6e562d27b4a0e0a2 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 21 Jan 2023 14:01:51 +0800 Subject: [PATCH 020/238] =?UTF-8?q?:recycle:=20=E9=87=8D=E6=9E=84=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E7=99=BB=E5=BD=95=E8=BF=87=E7=A8=8B=E7=9A=84=E7=89=B9?= =?UTF-8?q?=E6=AE=8A=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OAuth2ResourceOwnerBaseAuthenticationProvider.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index f551f77b..7df8b579 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -3,6 +3,7 @@ package com.pig4cloud.pig.auth.support.base; import cn.hutool.extra.spring.SpringUtil; import com.pig4cloud.pig.common.security.util.OAuth2ErrorCodesExpand; import com.pig4cloud.pig.common.security.util.ScopeException; +import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.context.support.MessageSourceAccessor; @@ -35,6 +36,7 @@ import java.util.function.Supplier; * * 处理自定义授权 */ +@Slf4j public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider implements AuthenticationProvider { @@ -263,7 +265,10 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider Date: Sat, 21 Jan 2023 14:02:35 +0800 Subject: [PATCH 021/238] :arrow_up: up springboot 2.7.8 --- pig-common/pig-common-bom/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index b881b89f..a66647d3 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -15,7 +15,7 @@ ${project.version} - 2.7.6 + 2.7.8 UTF-8 2.17.1 1.8 diff --git a/pom.xml b/pom.xml index 5efa7fe1..5b5a6293 100755 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.7 + 2.7.8 2021.0.5 2021.0.4.0 UTF-8 -- Gitee From 161d3a57f1743e704c3a33bf4a7bf218fa2efd6d Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 21 Jan 2023 14:06:47 +0800 Subject: [PATCH 022/238] =?UTF-8?q?:sparkles:=20close=20#I6B5EU=20common-f?= =?UTF-8?q?eign=20=E6=94=AF=E6=8C=81=E6=8E=A5=E5=8F=A3=E7=BA=A7=E5=88=AB?= =?UTF-8?q?=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-common/pig-common-feign/pom.xml | 97 ++++++++++--------- .../feign/PigFeignAutoConfiguration.java | 6 ++ .../pig/common/feign/annotation/Backoff.java | 21 ++++ .../common/feign/annotation/FeignRetry.java | 21 ++++ .../common/feign/retry/FeignRetryAspect.java | 94 ++++++++++++++++++ .../ext/PigSentinelInvocationHandler.java | 8 +- pig-upms/pig-upms-api/pom.xml | 4 +- 7 files changed, 201 insertions(+), 50 deletions(-) create mode 100644 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java create mode 100644 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java create mode 100644 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 4026a01a..8e133869 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -16,52 +16,57 @@ --> - - com.pig4cloud - pig-common - 3.6.5 - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + com.pig4cloud + pig-common + 3.6.5 + - 4.0.0 - jar - pig-common-feign - feign-sentinel服务降级熔断、限流组件 + 4.0.0 + jar + pig-common-feign + feign-sentinel服务降级熔断、限流组件 - - - com.pig4cloud - pig-common-core - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - io.github.openfeign - feign-okhttp - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.github.ben-manes.caffeine - caffeine - - - - org.springframework.security - spring-security-core - - + + + com.pig4cloud + pig-common-core + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.github.openfeign + feign-okhttp + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + com.github.ben-manes.caffeine + caffeine + + + + org.springframework.security + spring-security-core + + + + org.springframework.retry + spring-retry + + diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index 44de2836..d550babc 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -20,6 +20,7 @@ import com.alibaba.cloud.sentinel.feign.SentinelFeignAutoConfiguration; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pig.common.feign.retry.FeignRetryAspect; import com.pig4cloud.pig.common.feign.sentinel.ext.PigSentinelFeign; import com.pig4cloud.pig.common.feign.sentinel.handle.PigUrlBlockHandler; import com.pig4cloud.pig.common.feign.sentinel.parser.PigHeaderRequestOriginParser; @@ -61,4 +62,9 @@ public class PigFeignAutoConfiguration { return new PigHeaderRequestOriginParser(); } + @Bean + public FeignRetryAspect feignRetryAspect() { + return new FeignRetryAspect(); + } + } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java new file mode 100644 index 00000000..5efbdbce --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pig.common.feign.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 重试具体的策略 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Backoff { + + long delay() default 1000L;; + + long maxDelay() default 0L; + + double multiplier() default 0.0D;; + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java new file mode 100644 index 00000000..846d09a3 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pig.common.feign.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 重试注解,作用在 @FeignClient 注解之上 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +public @interface FeignRetry { + + Backoff backoff() default @Backoff(); + + int maxAttempt() default 3; + + Class[] include() default {}; + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java new file mode 100644 index 00000000..a1a33311 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java @@ -0,0 +1,94 @@ +package com.pig4cloud.pig.common.feign.retry; + +import com.pig4cloud.pig.common.feign.annotation.FeignRetry; +import feign.RetryableException; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.retry.backoff.BackOffPolicy; +import org.springframework.retry.backoff.ExponentialBackOffPolicy; +import org.springframework.retry.backoff.FixedBackOffPolicy; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * FeignRetry 注解切面注入 retryTemplate + * + * @author lengleng + * @date 2023/1/21 + * {@link org.springframework.cloud.loadbalancer.blocking.retry.BlockingLoadBalancedRetryPolicy}. + */ +@Slf4j +@Aspect +@Component +public class FeignRetryAspect { + + @Around("@annotation(feignRetry)") + public Object retry(ProceedingJoinPoint joinPoint, FeignRetry feignRetry) throws Throwable { + Method method = getCurrentMethod(joinPoint); + + RetryTemplate retryTemplate = new RetryTemplate(); + retryTemplate.setBackOffPolicy(prepareBackOffPolicy(feignRetry)); + retryTemplate.setRetryPolicy(prepareSimpleRetryPolicy(feignRetry)); + + // 重试 + return retryTemplate.execute(arg0 -> { + int retryCount = arg0.getRetryCount(); + log.info("Sending request method: {}, max attempt: {}, delay: {}, retryCount: {}", method.getName(), + feignRetry.maxAttempt(), feignRetry.backoff().delay(), retryCount); + return joinPoint.proceed(joinPoint.getArgs()); + }); + } + + /** + * 构造重试策略 + * @param feignRetry 重试注解 + * @return BackOffPolicy + */ + private BackOffPolicy prepareBackOffPolicy(FeignRetry feignRetry) { + if (feignRetry.backoff().multiplier() != 0) { + ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); + backOffPolicy.setInitialInterval(feignRetry.backoff().delay()); + backOffPolicy.setMaxInterval(feignRetry.backoff().maxDelay()); + backOffPolicy.setMultiplier(feignRetry.backoff().multiplier()); + return backOffPolicy; + } + else { + FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); + fixedBackOffPolicy.setBackOffPeriod(feignRetry.backoff().delay()); + return fixedBackOffPolicy; + } + } + + /** + * 构造重试策略 + * @param feignRetry 重试注解 + * @return SimpleRetryPolicy + */ + private SimpleRetryPolicy prepareSimpleRetryPolicy(FeignRetry feignRetry) { + Map, Boolean> policyMap = new HashMap<>(); + policyMap.put(RetryableException.class, true); // Connection refused or time out + + if (feignRetry.include().length != 0) { + for (Class t : feignRetry.include()) { + policyMap.put(t, true); + } + } + + return new SimpleRetryPolicy(feignRetry.maxAttempt(), policyMap, true); + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + return signature.getMethod(); + } + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java index da0afb5b..1c155d9f 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java @@ -25,12 +25,14 @@ import com.alibaba.csp.sentinel.Tracer; import com.alibaba.csp.sentinel.context.ContextUtil; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.FeignRetry; import feign.Feign; import feign.InvocationHandlerFactory; import feign.MethodMetadata; import feign.Target; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.core.annotation.AnnotationUtils; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -38,6 +40,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Objects; import static feign.Util.checkNotNull; @@ -134,8 +137,9 @@ public class PigSentinelInvocationHandler implements InvocationHandler { } } else { - // 若是R类型 执行自动降级返回R - if (R.class == method.getReturnType()) { + // 若是R类型 并且不包含@FeignRetry 执行自动降级返回R + FeignRetry feignRetry = AnnotationUtils.findAnnotation(method, FeignRetry.class); + if (R.class == method.getReturnType() && Objects.isNull(feignRetry)) { log.error("feign 服务间调用异常", ex); return R.failed(ex.getLocalizedMessage()); } diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index 68520c51..d924b07d 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -43,8 +43,8 @@ - org.springframework.cloud - spring-cloud-openfeign-core + com.pig4cloud + pig-common-feign true -- Gitee From 8e41f5e2622fbcb9d4b7a81d8c39da4baf448cc5 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 28 Jan 2023 14:41:01 +0800 Subject: [PATCH 023/238] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=97=A0=E7=94=A8oauth2=20client=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig_config.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/pig_config.sql b/db/pig_config.sql index ef211406..44137fdb 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -37,12 +37,12 @@ CREATE TABLE `config_info` ( -- Records of config_info -- ---------------------------- BEGIN; -INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# spring security 配置\nsecurity:\n oauth2:\n # 通用放行URL,服务个性化,请在对应配置文件覆盖\n ignore:\n urls:\n - /v3/api-docs\n - /actuator/**\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', 'a9fec7814841cfa5db8db2e4e6bdbf50', '2022-05-08 12:10:37', '2022-08-07 14:40:17', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', 'ef637d9ffc033db98d10f628cfec967e', '2022-05-08 12:10:37', '2023-01-28 14:13:58', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '74f53b71c7799aa754da75662378b93c', '2022-05-08 12:10:37', '2022-06-04 14:15:35', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(27v1agvAug87ANOVnbKdsw==)\n client-secret: ENC(VbnkopxrwgbFVKp+UxJ2pg==)\n scope: server\n\n# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', '02fe9e81c41986626067b8cbe589b77f', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'cf786dbe3b07074fc187bf2eab3266b1', '2022-05-08 12:10:37', '2023-01-28 14:05:36', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', '000988cf0102382d3f23df35027b47fd', '2022-05-08 12:10:37', '2022-06-07 14:00:11', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', 'security:\n oauth2:\n client:\n client-id: ENC(imENTO7M8bLO38LFSIxnzw==)\n client-secret: ENC(i3cDFhs26sa2Ucrfz2hnQw==)\n scope: server\n\n# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '107614b40932e8237787b769e0937ed2', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '899d2431d91da0d521378cc7fa61268d', '2022-05-08 12:10:37', '2023-01-28 14:01:46', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (7, 'pig-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# xxl\nxxl:\n job:\n accessToken: default_token\n i18n: zh_CN\n logretentiondays: 30\n triggerpool:\n fast.max: 200\n slow.max: 200\n\n# mybatis\nmybatis:\n mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n\nspring:\n datasource:\n url: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n mvc:\n static-path-pattern: /static/**\n freemarker:\n suffix: .ftl\n request-context-attribute: request\n settings:\n number_format: 0.##########\n mail:\n host: smtp.mxhichina.com\n port: 465\n from: xxxx@gitee.wang\n username: xxxx@gitee.wang\n password: xxxx\n properties:\n mail:\n smtp:\n auth: true\n ssl.enable: true\n starttls.enable: false\n required: false\n# spring boot admin 配置\n\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS\n\n', 'b67cbbd37c8b42cdc6521780b3ed742a', '2022-11-27 17:23:42', '2022-11-27 17:28:01', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); COMMIT; -- Gitee From d9738718bfb4c9189aca69c27274af7fc16e8dd7 Mon Sep 17 00:00:00 2001 From: unreleased Date: Tue, 31 Jan 2023 08:46:58 +0000 Subject: [PATCH 024/238] =?UTF-8?q?update=20pig-visual/pig-sentinel-dashbo?= =?UTF-8?q?ard/src/main/resources/application.yml.=20sentinel=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=B7=BB=E5=8A=A0nacos=E8=B4=A6=E5=8F=B7=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=90=A6=E5=88=99=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: unreleased --- .../pig-sentinel-dashboard/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml b/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml index f70cb932..d88c2d1b 100755 --- a/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml +++ b/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml @@ -9,6 +9,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} -- Gitee From 708d4f60cf6218cba7e35963aef8870011aa90ac Mon Sep 17 00:00:00 2001 From: yeluo Date: Tue, 7 Feb 2023 14:17:08 +0800 Subject: [PATCH 025/238] =?UTF-8?q?=E9=AD=94=E6=B3=95=E5=80=BC=20"state"?= =?UTF-8?q?=20=E7=BB=9F=E4=B8=80=E6=8D=A2=E6=88=90=20OAuth2ParameterNames.?= =?UTF-8?q?STATE=20=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PigRedisOAuth2AuthorizationService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java index 7ba2a225..ddfec49c 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java @@ -37,7 +37,7 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe Assert.notNull(authorization, "authorization cannot be null"); if (isState(authorization)) { - String token = authorization.getAttribute("state"); + String token = authorization.getAttribute(OAuth2ParameterNames.STATE); redisTemplate.setValueSerializer(RedisSerializer.java()); redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, TimeUnit.MINUTES); @@ -77,7 +77,7 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe List keys = new ArrayList<>(); if (isState(authorization)) { - String token = authorization.getAttribute("state"); + String token = authorization.getAttribute(OAuth2ParameterNames.STATE); keys.add(buildKey(OAuth2ParameterNames.STATE, token)); } @@ -120,7 +120,7 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe } private static boolean isState(OAuth2Authorization authorization) { - return Objects.nonNull(authorization.getAttribute("state")); + return Objects.nonNull(authorization.getAttribute(OAuth2ParameterNames.STATE)); } private static boolean isCode(OAuth2Authorization authorization) { -- Gitee From 2df4b463ff829a941f0e4d98fe136bf47a2dc4a0 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 7 Feb 2023 20:24:49 +0800 Subject: [PATCH 026/238] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96nacos=20=E6=95=B0=E6=8D=AE=E5=BA=93=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-register/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-register/src/main/resources/application.yml b/pig-register/src/main/resources/application.yml index 461e9178..58899527 100755 --- a/pig-register/src/main/resources/application.yml +++ b/pig-register/src/main/resources/application.yml @@ -11,7 +11,7 @@ db: password: ${MYSQL_PWD:root} url: 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true - + pool.config.connectionTimeout: 30000 nacos: core: -- Gitee From c15dc143fbf593e124a8a8831a1c26f852ea674e Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 16 Feb 2023 12:12:54 +0800 Subject: [PATCH 027/238] :arrow_up: Upgrading dependencies. hutool 5.8.12 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eab12a5a..719de259 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.0 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.10 | +| hutool | 5.8.12 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index a66647d3..9cbc23c4 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.10 + 5.8.12 2.7.4 1.8.4 -- Gitee From fd7be54d84493d791e1d753b5cc82c9f63d667c1 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 21 Feb 2023 10:04:48 +0800 Subject: [PATCH 028/238] =?UTF-8?q?:arrow=5Fup:=20Upgrading=20dependencies?= =?UTF-8?q?.=20maven=203.9.0=20=E7=BC=96=E8=AF=91=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-register/pom.xml | 2 ++ pig-visual/pig-xxl-job-admin/pom.xml | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 45e0284e..1dede07a 100755 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -94,6 +94,7 @@ **/*.woff **/*.woff2 **/*.ttf + **/*.eot @@ -103,6 +104,7 @@ **/*.woff **/*.woff2 **/*.ttf + **/*.eot diff --git a/pig-visual/pig-xxl-job-admin/pom.xml b/pig-visual/pig-xxl-job-admin/pom.xml index b3553c3e..ee359efc 100644 --- a/pig-visual/pig-xxl-job-admin/pom.xml +++ b/pig-visual/pig-xxl-job-admin/pom.xml @@ -95,9 +95,11 @@ src/main/resources true - sta**/*.woff + **/*.woff **/*.woff2 + **/*.otf **/*.ttf + **/*.eot @@ -107,6 +109,8 @@ **/*.woff **/*.woff2 **/*.ttf + **/*.otf + **/*.eot -- Gitee From 68ad6dffa95b391fb80000dc7d6e0505c494eb8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Wed, 22 Feb 2023 10:19:44 +0800 Subject: [PATCH 029/238] =?UTF-8?q?:arrow=5Fup:=20=E5=8D=87=E7=BA=A7=20spr?= =?UTF-8?q?ing-authorization-server=20=E5=88=B0=200.4.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 719de259..d0a9e050 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ | Spring Boot | 2.7.7 | | Spring Cloud | 2021.0.5 | | Spring Cloud Alibaba | 2021.0.4.0 | -| Spring Authorization Server | 0.4.0 | +| Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | | hutool | 5.8.12 | diff --git a/pom.xml b/pom.xml index 5b5a6293..16b1ed92 100755 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 1.8 1.8 2.7.9 - 0.4.0 + 0.4.1 3.6.0 2.2.2 2.3 -- Gitee From fc34c7b46672d6544b1bfd3dfed2fe2ee1bb9f3b Mon Sep 17 00:00:00 2001 From: jumuning <840256574@qq.com> Date: Thu, 23 Feb 2023 11:05:08 +0800 Subject: [PATCH 030/238] =?UTF-8?q?=E5=86=97=E4=BD=99=E6=A0=87=E7=82=B9?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/common/feign/annotation/Backoff.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java index 5efbdbce..65b29664 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java @@ -12,10 +12,10 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Backoff { - long delay() default 1000L;; + long delay() default 1000L; long maxDelay() default 0L; - double multiplier() default 0.0D;; + double multiplier() default 0.0D } -- Gitee From 6c1c772b8a188f6aa5fc6d807677991be99743c6 Mon Sep 17 00:00:00 2001 From: jumuning <840256574@qq.com> Date: Thu, 23 Feb 2023 14:40:27 +0800 Subject: [PATCH 031/238] =?UTF-8?q?=E5=86=97=E4=BD=99=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E9=87=8D=E6=96=B0=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=B0=B1=E8=83=BD?= =?UTF-8?q?=E6=BB=A1=E8=B6=B3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...edentialsOAuth2AuthenticatedPrincipal.java | 40 ------------------- .../PigCustomOpaqueTokenIntrospector.java | 5 ++- 2 files changed, 3 insertions(+), 42 deletions(-) delete mode 100644 pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java deleted file mode 100644 index 9765be35..00000000 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pig4cloud.pig.common.security.component; - -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; - -import java.util.Collection; -import java.util.Map; - -/** - * @author lengleng - * @date 2022/7/6 - * - * credential 支持客户端模式的用户存储 - */ -@RequiredArgsConstructor -public class PigClientCredentialsOAuth2AuthenticatedPrincipal implements OAuth2AuthenticatedPrincipal { - - private final Map attributes; - - private final Collection authorities; - - private final String name; - - @Override - public Map getAttributes() { - return this.attributes; - } - - @Override - public Collection getAuthorities() { - return this.authorities; - } - - @Override - public String getName() { - return this.name; - } - -} diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java index d250f389..17ecb1aa 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java @@ -11,6 +11,7 @@ import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal; import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; @@ -43,8 +44,8 @@ public class PigCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector // 客户端模式默认返回 if (AuthorizationGrantType.CLIENT_CREDENTIALS.equals(oldAuthorization.getAuthorizationGrantType())) { - return new PigClientCredentialsOAuth2AuthenticatedPrincipal(oldAuthorization.getAttributes(), - AuthorityUtils.NO_AUTHORITIES, oldAuthorization.getPrincipalName()); + return new DefaultOAuth2AuthenticatedPrincipal(oldAuthorization.getPrincipalName(), + oldAuthorization.getAttributes(), AuthorityUtils.NO_AUTHORITIES); } Map userDetailsServiceMap = SpringUtil -- Gitee From b6163ae2ebed294f83c3ce273c322ee86ed5390c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Thu, 23 Feb 2023 15:48:20 +0800 Subject: [PATCH 032/238] =?UTF-8?q?:arrow=5Fup:=20=E5=8D=87=E7=BA=A7=20spr?= =?UTF-8?q?ing-javaformat=200.0.38?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 23 ++-- .../auth/config/WebSecurityConfiguration.java | 21 ++- .../pig/auth/endpoint/PigTokenEndpoint.java | 5 +- .../CustomeOAuth2AccessTokenGenerator.java | 2 +- ...ourceOwnerBaseAuthenticationConverter.java | 9 +- ...sourceOwnerBaseAuthenticationProvider.java | 27 ++-- .../core/FormIdentityLoginConfigurer.java | 11 +- .../core/PigDaoAuthenticationProvider.java | 18 +-- .../PigAuthenticationSuccessEventHandler.java | 3 +- ...esourceOwnerSmsAuthenticationProvider.java | 2 +- .../pig/common/core/util/WebUtils.java | 2 +- .../pig/common/feign/annotation/Backoff.java | 2 +- .../feign/sentinel/ext/PigSentinelFeign.java | 4 +- .../ext/PigSentinelInvocationHandler.java | 2 +- .../handle/GlobalBizExceptionHandler.java | 4 +- .../openfeign/PigFeignClientsRegistrar.java | 2 +- .../common/job/XxlJobAutoConfiguration.java | 11 +- .../pig/common/log/util/SysLogUtils.java | 2 +- .../resolver/SqlFilterArgumentResolver.java | 10 +- .../security/component/PermissionService.java | 6 +- .../component/PermitAllUrlProperties.java | 12 +- .../component/PigBearerTokenExtractor.java | 7 +- .../PigCustomOpaqueTokenIntrospector.java | 11 +- .../PigResourceServerConfiguration.java | 21 ++- ...edisOAuth2AuthorizationConsentService.java | 6 +- .../PigRedisOAuth2AuthorizationService.java | 25 ++-- .../PigRemoteRegisteredClientRepository.java | 50 ++++---- .../service/PigUserDetailsService.java | 2 +- .../security/util/OAuth2EndpointUtils.java | 5 +- .../common/security/util/SecurityUtils.java | 11 +- .../common/xss/PigXssAutoConfiguration.java | 6 +- .../common/xss/core/DefaultXssCleaner.java | 8 +- .../config/RateLimiterConfiguration.java | 5 +- .../filter/PigRequestGlobalFilter.java | 5 +- .../filter/SwaggerBasicGatewayFilter.java | 2 +- .../pig/gateway/handler/ImageCodeHandler.java | 9 +- .../console/controller/HealthController.java | 2 +- .../exception/ConsoleExceptionHandler.java | 2 +- .../exception/NacosApiExceptionHandler.java | 2 +- .../pig/admin/controller/DictController.java | 2 +- .../pig/admin/controller/FileController.java | 2 +- .../pig/admin/controller/MenuController.java | 11 +- .../OauthClientDetailsController.java | 2 +- .../controller/PublicParamController.java | 8 +- .../admin/service/impl/AppServiceImpl.java | 4 +- .../impl/SysDeptRelationServiceImpl.java | 10 +- .../service/impl/SysDeptServiceImpl.java | 44 ++++--- .../admin/service/impl/SysLogServiceImpl.java | 8 +- .../service/impl/SysMenuServiceImpl.java | 20 ++- .../service/impl/SysPostServiceImpl.java | 5 +- .../impl/SysPublicParamServiceImpl.java | 2 +- .../service/impl/SysRoleServiceImpl.java | 5 +- .../service/impl/SysUserServiceImpl.java | 39 +++--- .../impl/GenDatasourceConfServiceImpl.java | 8 +- .../service/impl/GenFormConfServiceImpl.java | 5 +- .../service/impl/GeneratorServiceImpl.java | 6 +- .../pig/codegen/support/StyleTypeEnum.java | 7 +- .../monitor/config/WebSecurityConfigurer.java | 28 +++- .../NacosServiceInstanceConverter.java | 9 +- .../DefaultLoginAuthenticationFilter.java | 2 +- .../dashboard/client/SentinelApiClient.java | 121 ++++++++++-------- .../dashboard/controller/AppController.java | 6 +- .../controller/ParamFlowRuleController.java | 13 +- .../controller/ResourceController.java | 4 +- .../cluster/ClusterConfigController.java | 15 ++- .../gateway/GatewayApiController.java | 4 +- .../gateway/GatewayFlowRuleController.java | 28 ++-- .../sentinel/dashboard/discovery/AppInfo.java | 6 +- .../dashboard/discovery/MachineInfo.java | 30 ++++- .../dashboard/metric/MetricFetcher.java | 7 +- .../metric/InMemoryMetricsRepository.java | 17 +-- .../rule/InMemoryRuleRepositoryAdapter.java | 9 +- .../dashboard/rule/FlowRuleApiProvider.java | 10 +- .../service/ClusterAssignServiceImpl.java | 86 ++++++++----- .../service/ClusterConfigService.java | 68 +++++----- .../sentinel/dashboard/util/AsyncUtils.java | 13 +- .../dashboard/util/ClusterEntityUtils.java | 41 ++++-- .../admin/controller/JobApiController.java | 5 +- .../annotation/PermissionLimit.java | 1 + .../admin/core/alarm/impl/EmailJobAlarm.java | 5 +- .../admin/core/complete/XxlJobCompleter.java | 5 +- .../route/strategy/ExecutorRouteBusyover.java | 10 +- .../route/strategy/ExecutorRouteFailover.java | 9 +- .../admin/core/thread/JobCompleteHelper.java | 5 +- .../core/thread/JobFailMonitorHelper.java | 25 ++-- .../admin/core/thread/JobLogReportHelper.java | 15 ++- .../admin/core/thread/JobRegistryHelper.java | 36 +++--- .../admin/core/thread/JobScheduleHelper.java | 9 +- .../job/admin/core/trigger/XxlJobTrigger.java | 58 +++++---- .../com/xxl/job/admin/core/util/FtlUtil.java | 2 +- pom.xml | 2 +- 91 files changed, 752 insertions(+), 497 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index a6e9105d..f90d4dce 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -67,21 +67,24 @@ public class AuthorizationServerConfiguration { http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter - .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 - .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 + .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 + .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 - .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 - .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))); + .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))); RequestMatcher endpointsMatcher = authorizationServerConfigurer.getEndpointsMatcher(); DefaultSecurityFilterChain securityFilterChain = http.requestMatcher(endpointsMatcher) - .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated()) - .apply(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 - .authorizationServerSettings(AuthorizationServerSettings.builder() - .issuer(SecurityConstants.PROJECT_LICENSE).build())) - // 授权码登录的登录页个性化 - .and().apply(new FormIdentityLoginConfigurer()).and().build(); + .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated()) + .apply(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 + .authorizationServerSettings( + AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build())) + // 授权码登录的登录页个性化 + .and() + .apply(new FormIdentityLoginConfigurer()) + .and() + .build(); // 注入自定义授权模式实现 addCustomOAuth2GrantAuthenticationProvider(http); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java index 0ebc699d..81736c79 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java @@ -41,9 +41,15 @@ public class WebSecurityConfiguration { */ @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { - http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*").permitAll()// 开放自定义的部分端点 - .anyRequest().authenticated()).headers().frameOptions().sameOrigin()// 避免iframe同源无法登录 - .and().apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 + http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*") + .permitAll()// 开放自定义的部分端点 + .anyRequest() + .authenticated()) + .headers() + .frameOptions() + .sameOrigin()// 避免iframe同源无法登录 + .and() + .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 // 处理 UsernamePasswordAuthenticationToken http.authenticationProvider(new PigDaoAuthenticationProvider()); return http.build(); @@ -61,8 +67,13 @@ public class WebSecurityConfiguration { @Order(0) SecurityFilterChain resources(HttpSecurity http) throws Exception { http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/css/**", "/error")) - .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()).requestCache().disable() - .securityContext().disable().sessionManagement().disable(); + .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) + .requestCache() + .disable() + .securityContext() + .disable() + .sessionManagement() + .disable(); return http.build(); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java index 99b64714..51b358ed 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java @@ -107,8 +107,9 @@ public class PigTokenEndpoint { @RequestParam(OAuth2ParameterNames.CLIENT_ID) String clientId, @RequestParam(OAuth2ParameterNames.SCOPE) String scope, @RequestParam(OAuth2ParameterNames.STATE) String state) { - SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)).getData() - .orElseThrow(() -> new OAuthClientException("clientId 不合法")); + SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)) + .getData() + .orElseThrow(() -> new OAuthClientException("clientId 不合法")); Set authorizedScopes = StringUtils.commaDelimitedListToSet(clientDetails.getScope()); modelAndView.addObject("clientId", clientId); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java index 7865f68d..667f6da5 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java @@ -30,7 +30,7 @@ public class CustomeOAuth2AccessTokenGenerator implements OAuth2TokenGenerator additionalParameters = parameters.entrySet().stream() - .filter(e -> !e.getKey().equals(OAuth2ParameterNames.GRANT_TYPE) - && !e.getKey().equals(OAuth2ParameterNames.SCOPE)) - .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0))); + Map additionalParameters = parameters.entrySet() + .stream() + .filter(e -> !e.getKey().equals(OAuth2ParameterNames.GRANT_TYPE) + && !e.getKey().equals(OAuth2ParameterNames.SCOPE)) + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0))); // 创建token return buildToken(clientPrincipal, requestedScopes, additionalParameters); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 7df8b579..0f886493 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -141,7 +141,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider) () -> new InternalAuthenticationServiceException("web request is empty")); + HttpServletRequest request = WebUtils.getRequest() + .orElseThrow( + (Supplier) () -> new InternalAuthenticationServiceException("web request is empty")); Map paramMap = ServletUtil.getParamMap(request); String grantType = paramMap.get(OAuth2ParameterNames.GRANT_TYPE); @@ -104,12 +105,13 @@ public class PigDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat } Map userDetailsServiceMap = SpringUtil - .getBeansOfType(PigUserDetailsService.class); + .getBeansOfType(PigUserDetailsService.class); String finalClientId = clientId; - Optional optional = userDetailsServiceMap.values().stream() - .filter(service -> service.support(finalClientId, grantType)) - .max(Comparator.comparingInt(Ordered::getOrder)); + Optional optional = userDetailsServiceMap.values() + .stream() + .filter(service -> service.support(finalClientId, grantType)) + .max(Comparator.comparingInt(Ordered::getOrder)); if (!optional.isPresent()) { throw new InternalAuthenticationServiceException("UserDetailsService error , not register"); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java index 3466b9ff..b0e04323 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java @@ -103,7 +103,8 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce Map additionalParameters = accessTokenAuthentication.getAdditionalParameters(); OAuth2AccessTokenResponse.Builder builder = OAuth2AccessTokenResponse.withToken(accessToken.getTokenValue()) - .tokenType(accessToken.getTokenType()).scopes(accessToken.getScopes()); + .tokenType(accessToken.getTokenType()) + .scopes(accessToken.getScopes()); if (accessToken.getIssuedAt() != null && accessToken.getExpiresAt() != null) { builder.expiresIn(ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt())); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java index bc556612..d7779e90 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java @@ -52,7 +52,7 @@ public class OAuth2ResourceOwnerSmsAuthenticationProvider public void checkClient(RegisteredClient registeredClient) { assert registeredClient != null; if (!registeredClient.getAuthorizationGrantTypes() - .contains(new AuthorizationGrantType(SecurityConstants.APP))) { + .contains(new AuthorizationGrantType(SecurityConstants.APP))) { throw new OAuth2AuthenticationException(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT); } } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java index e454735f..d407e81d 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java @@ -111,7 +111,7 @@ public class WebUtils extends org.springframework.web.util.WebUtils { */ public Optional getRequest() { return Optional - .ofNullable(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); + .ofNullable(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); } /** diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java index 65b29664..7c4260d9 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java @@ -16,6 +16,6 @@ public @interface Backoff { long maxDelay() default 0L; - double multiplier() default 0.0D + double multiplier() default 0.0D; } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java index 474ff717..3a6e7ea4 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java @@ -106,8 +106,8 @@ public final class PigSentinelFeign { private Object getFromContext(String name, String type, Class fallbackType, Class targetType) { Object fallbackInstance = feignContext.getInstance(name, fallbackType); if (fallbackInstance == null) { - throw new IllegalStateException(String.format( - "No %s instance of type %s found for feign client %s", type, fallbackType, name)); + throw new IllegalStateException(String + .format("No %s instance of type %s found for feign client %s", type, fallbackType, name)); } if (!targetType.isAssignableFrom(fallbackType)) { diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java index 1c155d9f..d1bf4270 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java @@ -104,7 +104,7 @@ public class PigSentinelInvocationHandler implements InvocationHandler { if (target instanceof Target.HardCodedTarget) { Target.HardCodedTarget hardCodedTarget = (Target.HardCodedTarget) target; MethodMetadata methodMetadata = SentinelContractHolder.METADATA_MAP - .get(hardCodedTarget.type().getName() + Feign.configKey(hardCodedTarget.type(), method)); + .get(hardCodedTarget.type().getName() + Feign.configKey(hardCodedTarget.type(), method)); // resource default is HttpMethod:protocol://url if (methodMetadata == null) { result = methodHandler.invoke(args); diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java index 89bad620..3dccbf3c 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java @@ -88,8 +88,8 @@ public class GlobalBizExceptionHandler { @ExceptionHandler(AccessDeniedException.class) @ResponseStatus(HttpStatus.FORBIDDEN) public R handleAccessDeniedException(AccessDeniedException e) { - String msg = SpringSecurityMessageSource.getAccessor().getMessage("AbstractAccessDecisionManager.accessDenied", - e.getMessage()); + String msg = SpringSecurityMessageSource.getAccessor() + .getMessage("AbstractAccessDecisionManager.accessDenied", e.getMessage()); log.warn("拒绝授权异常信息 ex={}", msg); return R.failed(e.getLocalizedMessage()); } diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 8230d93d..55d495c1 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -91,7 +91,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, validate(attributes); BeanDefinitionBuilder definition = BeanDefinitionBuilder - .genericBeanDefinition(FeignClientFactoryBean.class); + .genericBeanDefinition(FeignClientFactoryBean.class); definition.addPropertyValue("url", getUrl(attributes)); definition.addPropertyValue("path", getPath(attributes)); String name = getName(attributes); diff --git a/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java b/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java index 0555aadb..e162c0f1 100644 --- a/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java +++ b/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java @@ -61,10 +61,13 @@ public class XxlJobAutoConfiguration { // 如果配置为空则获取注册中心的服务列表 "http://pig-xxl:9080/xxl-job-admin" if (!StringUtils.hasText(xxlJobProperties.getAdmin().getAddresses())) { - String serverList = discoveryClient.getServices().stream().filter(s -> s.contains(XXL_JOB_ADMIN)) - .flatMap(s -> discoveryClient.getInstances(s).stream()).map(instance -> String - .format("http://%s:%s/%s", instance.getHost(), instance.getPort(), XXL_JOB_ADMIN)) - .collect(Collectors.joining(",")); + String serverList = discoveryClient.getServices() + .stream() + .filter(s -> s.contains(XXL_JOB_ADMIN)) + .flatMap(s -> discoveryClient.getInstances(s).stream()) + .map(instance -> String.format("http://%s:%s/%s", instance.getHost(), instance.getPort(), + XXL_JOB_ADMIN)) + .collect(Collectors.joining(",")); xxlJobSpringExecutor.setAdminAddresses(serverList); } else { diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java index 4d980646..a748f19b 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java @@ -46,7 +46,7 @@ public class SysLogUtils { public SysLog getSysLog() { HttpServletRequest request = ((ServletRequestAttributes) Objects - .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); SysLog sysLog = new SysLog(); sysLog.setType(LogTypeEnum.NORMAL.getType()); sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 5084471d..683b13e0 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -88,10 +88,12 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver } List orderItemList = new ArrayList<>(); - Optional.ofNullable(ascs).ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList()))); - Optional.ofNullable(descs).ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList()))); + Optional.ofNullable(ascs) + .ifPresent(s -> orderItemList.addAll( + Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList()))); + Optional.ofNullable(descs) + .ifPresent(s -> orderItemList.addAll( + Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList()))); page.addOrder(orderItemList); return page; diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java index fcf394a4..5bef7ab3 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java @@ -46,8 +46,10 @@ public class PermissionService { return false; } Collection authorities = authentication.getAuthorities(); - return authorities.stream().map(GrantedAuthority::getAuthority).filter(StringUtils::hasText) - .anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x)); + return authorities.stream() + .map(GrantedAuthority::getAuthority) + .filter(StringUtils::hasText) + .anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x)); } } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java index 3e8aae22..f6f068cb 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java @@ -61,13 +61,17 @@ public class PermitAllUrlProperties implements InitializingBean { // 获取方法上边的注解 替代path variable 为 * Inner method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Inner.class); - Optional.ofNullable(method).ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) - .getPatternValues().forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); + Optional.ofNullable(method) + .ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) + .getPatternValues() + .forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); // 获取类上边的注解, 替代path variable 为 * Inner controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Inner.class); - Optional.ofNullable(controller).ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) - .getPatternValues().forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); + Optional.ofNullable(controller) + .ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) + .getPatternValues() + .forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); }); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java index 47353cf9..9868c7b1 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java @@ -55,8 +55,9 @@ public class PigBearerTokenExtractor implements BearerTokenResolver { @Override public String resolve(HttpServletRequest request) { - boolean match = urlProperties.getUrls().stream() - .anyMatch(url -> pathMatcher.match(url, request.getRequestURI())); + boolean match = urlProperties.getUrls() + .stream() + .anyMatch(url -> pathMatcher.match(url, request.getRequestURI())); if (match) { return null; @@ -68,7 +69,7 @@ public class PigBearerTokenExtractor implements BearerTokenResolver { if (authorizationHeaderToken != null) { if (parameterToken != null) { final BearerTokenError error = BearerTokenErrors - .invalidRequest("Found multiple bearer tokens in the request"); + .invalidRequest("Found multiple bearer tokens in the request"); throw new OAuth2AuthenticationException(error); } return authorizationHeaderToken; diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java index 17ecb1aa..631a99e6 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java @@ -49,12 +49,13 @@ public class PigCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector } Map userDetailsServiceMap = SpringUtil - .getBeansOfType(PigUserDetailsService.class); + .getBeansOfType(PigUserDetailsService.class); - Optional optional = userDetailsServiceMap.values().stream() - .filter(service -> service.support(Objects.requireNonNull(oldAuthorization).getRegisteredClientId(), - oldAuthorization.getAuthorizationGrantType().getValue())) - .max(Comparator.comparingInt(Ordered::getOrder)); + Optional optional = userDetailsServiceMap.values() + .stream() + .filter(service -> service.support(Objects.requireNonNull(oldAuthorization).getRegisteredClientId(), + oldAuthorization.getAuthorizationGrantType().getValue())) + .max(Comparator.comparingInt(Ordered::getOrder)); UserDetails userDetails = null; try { diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java index 4e5a2c29..c2ca9b80 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java @@ -51,13 +51,20 @@ public class PigResourceServerConfiguration { SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests(authorizeRequests -> authorizeRequests - .antMatchers(ArrayUtil.toArray(permitAllUrl.getUrls(), String.class)).permitAll().anyRequest() - .authenticated()) - .oauth2ResourceServer( - oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) - .authenticationEntryPoint(resourceAuthExceptionEntryPoint) - .bearerTokenResolver(pigBearerTokenExtractor)) - .headers().frameOptions().disable().and().csrf().disable(); + .antMatchers(ArrayUtil.toArray(permitAllUrl.getUrls(), String.class)) + .permitAll() + .anyRequest() + .authenticated()) + .oauth2ResourceServer( + oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) + .authenticationEntryPoint(resourceAuthExceptionEntryPoint) + .bearerTokenResolver(pigBearerTokenExtractor)) + .headers() + .frameOptions() + .disable() + .and() + .csrf() + .disable(); return http.build(); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java index 64e91940..df83102f 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java @@ -19,8 +19,8 @@ public class PigRedisOAuth2AuthorizationConsentService implements OAuth2Authoriz public void save(OAuth2AuthorizationConsent authorizationConsent) { Assert.notNull(authorizationConsent, "authorizationConsent cannot be null"); - redisTemplate.opsForValue().set(buildKey(authorizationConsent), authorizationConsent, TIMEOUT, - TimeUnit.MINUTES); + redisTemplate.opsForValue() + .set(buildKey(authorizationConsent), authorizationConsent, TIMEOUT, TimeUnit.MINUTES); } @@ -35,7 +35,7 @@ public class PigRedisOAuth2AuthorizationConsentService implements OAuth2Authoriz Assert.hasText(registeredClientId, "registeredClientId cannot be empty"); Assert.hasText(principalName, "principalName cannot be empty"); return (OAuth2AuthorizationConsent) redisTemplate.opsForValue() - .get(buildKey(registeredClientId, principalName)); + .get(buildKey(registeredClientId, principalName)); } private static String buildKey(String registeredClientId, String principalName) { diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java index ddfec49c..db7c6b1b 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java @@ -39,35 +39,38 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe if (isState(authorization)) { String token = authorization.getAttribute(OAuth2ParameterNames.STATE); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, - TimeUnit.MINUTES); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, TimeUnit.MINUTES); } if (isCode(authorization)) { OAuth2Authorization.Token authorizationCode = authorization - .getToken(OAuth2AuthorizationCode.class); + .getToken(OAuth2AuthorizationCode.class); OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); long between = ChronoUnit.MINUTES.between(authorizationCodeToken.getIssuedAt(), authorizationCodeToken.getExpiresAt()); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue()), - authorization, between, TimeUnit.MINUTES); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue()), authorization, + between, TimeUnit.MINUTES); } if (isRefreshToken(authorization)) { OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); long between = ChronoUnit.SECONDS.between(refreshToken.getIssuedAt(), refreshToken.getExpiresAt()); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue()), - authorization, between, TimeUnit.SECONDS); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue()), authorization, between, + TimeUnit.SECONDS); } if (isAccessToken(authorization)) { OAuth2AccessToken accessToken = authorization.getAccessToken().getToken(); long between = ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), - authorization, between, TimeUnit.SECONDS); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), authorization, between, + TimeUnit.SECONDS); } } @@ -83,7 +86,7 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe if (isCode(authorization)) { OAuth2Authorization.Token authorizationCode = authorization - .getToken(OAuth2AuthorizationCode.class); + .getToken(OAuth2AuthorizationCode.class); OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); keys.add(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue())); } @@ -125,7 +128,7 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe private static boolean isCode(OAuth2Authorization authorization) { OAuth2Authorization.Token authorizationCode = authorization - .getToken(OAuth2AuthorizationCode.class); + .getToken(OAuth2AuthorizationCode.class); return Objects.nonNull(authorizationCode); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java index ee44bae1..2d0b8ade 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java @@ -87,38 +87,44 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") public RegisteredClient findByClientId(String clientId) { - SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)).getData() - .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( - new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); + SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)) + .getData() + .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( + new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) - .clientId(clientDetails.getClientId()) - .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) - .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + .clientId(clientDetails.getClientId()) + .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); // 授权模式 Optional.ofNullable(clientDetails.getAuthorizedGrantTypes()) - .ifPresent(grants -> StringUtils.commaDelimitedListToSet(grants) - .forEach(s -> builder.authorizationGrantType(new AuthorizationGrantType(s)))); + .ifPresent(grants -> StringUtils.commaDelimitedListToSet(grants) + .forEach(s -> builder.authorizationGrantType(new AuthorizationGrantType(s)))); // 回调地址 - Optional.ofNullable(clientDetails.getWebServerRedirectUri()).ifPresent(redirectUri -> Arrays - .stream(redirectUri.split(StrUtil.COMMA)).filter(StrUtil::isNotBlank).forEach(builder::redirectUri)); + Optional.ofNullable(clientDetails.getWebServerRedirectUri()) + .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::redirectUri)); // scope - Optional.ofNullable(clientDetails.getScope()).ifPresent( - scope -> Arrays.stream(scope.split(StrUtil.COMMA)).filter(StrUtil::isNotBlank).forEach(builder::scope)); + Optional.ofNullable(clientDetails.getScope()) + .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::scope)); return builder - .tokenSettings(TokenSettings.builder().accessTokenFormat(OAuth2TokenFormat.REFERENCE) - .accessTokenTimeToLive(Duration.ofSeconds(Optional - .ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) - .refreshTokenTimeToLive( - Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) - .orElse(refreshTokenValiditySeconds))) - .build()) - .clientSettings(ClientSettings.builder() - .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())).build()) - .build(); + .tokenSettings(TokenSettings.builder() + .accessTokenFormat(OAuth2TokenFormat.REFERENCE) + .accessTokenTimeToLive(Duration.ofSeconds( + Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) + .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) + .orElse(refreshTokenValiditySeconds))) + .build()) + .clientSettings(ClientSettings.builder() + .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) + .build()) + .build(); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java index 53202225..4b33f304 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java @@ -62,7 +62,7 @@ public interface PigUserDetailsService extends UserDetailsService, Ordered { } Collection authorities = AuthorityUtils - .createAuthorityList(dbAuthsSet.toArray(new String[0])); + .createAuthorityList(dbAuthsSet.toArray(new String[0])); SysUser user = info.getSysUser(); // 构造security用户 diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java index 4ff9c03a..be8b7cb1 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java @@ -39,7 +39,7 @@ public class OAuth2EndpointUtils { public boolean matchesPkceTokenRequest(HttpServletRequest request) { return AuthorizationGrantType.AUTHORIZATION_CODE.getValue() - .equals(request.getParameter(OAuth2ParameterNames.GRANT_TYPE)) + .equals(request.getParameter(OAuth2ParameterNames.GRANT_TYPE)) && request.getParameter(OAuth2ParameterNames.CODE) != null && request.getParameter(PkceParameterNames.CODE_VERIFIER) != null; } @@ -63,7 +63,8 @@ public class OAuth2EndpointUtils { OAuth2RefreshToken refreshToken = authentication.getRefreshToken().getToken(); OAuth2AccessTokenResponse.Builder builder = OAuth2AccessTokenResponse.withToken(accessToken.getTokenValue()) - .tokenType(accessToken.getTokenType()).scopes(accessToken.getScopes()); + .tokenType(accessToken.getTokenType()) + .scopes(accessToken.getScopes()); if (accessToken.getIssuedAt() != null && accessToken.getExpiresAt() != null) { builder.expiresIn(ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt())); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java index 292636ec..a26c9e6a 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java @@ -74,11 +74,12 @@ public class SecurityUtils { Collection authorities = authentication.getAuthorities(); List roleIds = new ArrayList<>(); - authorities.stream().filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) - .forEach(granted -> { - String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); - roleIds.add(Long.parseLong(id)); - }); + authorities.stream() + .filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) + .forEach(granted -> { + String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); + roleIds.add(Long.parseLong(id)); + }); return roleIds; } diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java index b5f7b88c..2bf54e9b 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java @@ -75,8 +75,10 @@ public class PigXssAutoConfiguration implements WebMvcConfigurer { } com.pig4cloud.pig.common.xss.core.XssCleanInterceptor interceptor = new com.pig4cloud.pig.common.xss.core.XssCleanInterceptor( xssProperties); - registry.addInterceptor(interceptor).addPathPatterns(patterns) - .excludePathPatterns(xssProperties.getPathExcludePatterns()).order(Ordered.LOWEST_PRECEDENCE); + registry.addInterceptor(interceptor) + .addPathPatterns(patterns) + .excludePathPatterns(xssProperties.getPathExcludePatterns()) + .order(Ordered.LOWEST_PRECEDENCE); } } diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java index 338f2da3..7be9a6de 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java @@ -40,10 +40,10 @@ public class DefaultXssCleaner implements XssCleaner { private static Document.OutputSettings getOutputSettings(PigXssProperties properties) { return new Document.OutputSettings() - // 2. 转义,没找到关闭的方法,目前这个规则最少 - .escapeMode(Entities.EscapeMode.xhtml) - // 3. 保留换行 - .prettyPrint(properties.isPrettyPrint()); + // 2. 转义,没找到关闭的方法,目前这个规则最少 + .escapeMode(Entities.EscapeMode.xhtml) + // 3. 保留换行 + .prettyPrint(properties.isPrettyPrint()); } @Override diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java index a3c595c7..36cf7bf6 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java @@ -38,8 +38,9 @@ public class RateLimiterConfiguration { @Bean public KeyResolver remoteAddrKeyResolver() { return exchange -> Mono - .just(Objects.requireNonNull(Objects.requireNonNull(exchange.getRequest().getRemoteAddress())) - .getAddress().getHostAddress()); + .just(Objects.requireNonNull(Objects.requireNonNull(exchange.getRequest().getRemoteAddress())) + .getAddress() + .getHostAddress()); } } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java index 16b3f658..f432e1e6 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java @@ -65,8 +65,9 @@ public class PigRequestGlobalFilter implements GlobalFilter, Ordered { // 2. 重写StripPrefix addOriginalRequestUrl(exchange, request.getURI()); String rawPath = request.getURI().getRawPath(); - String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")).skip(1L) - .collect(Collectors.joining("/")); + String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")) + .skip(1L) + .collect(Collectors.joining("/")); ServerHttpRequest newRequest = request.mutate().path(newPath).build(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI()); diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java index e52e4c87..522d4093 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java @@ -68,7 +68,7 @@ public class SwaggerBasicGatewayFilter implements GlobalFilter { String password = swaggerProperties.getBasic().getPassword(); String encodeToString = Base64Utils - .encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8)); + .encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8)); return auth.equals(BASIC_PREFIX + encodeToString); } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java index ee227a3d..d401497a 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java @@ -59,15 +59,16 @@ public class ImageCodeHandler implements HandlerFunction { // 保存验证码信息 Optional randomStr = serverRequest.queryParam("randomStr"); redisTemplate.setKeySerializer(new StringRedisSerializer()); - randomStr.ifPresent(s -> redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + s, result, - SecurityConstants.CODE_TIME, TimeUnit.SECONDS)); + randomStr.ifPresent(s -> redisTemplate.opsForValue() + .set(CacheConstants.DEFAULT_CODE_KEY + s, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS)); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); captcha.out(os); - return ServerResponse.status(HttpStatus.OK).contentType(MediaType.IMAGE_JPEG) - .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray()))); + return ServerResponse.status(HttpStatus.OK) + .contentType(MediaType.IMAGE_JPEG) + .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray()))); } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java index 6799a0bc..2b088165 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java @@ -77,7 +77,7 @@ public class HealthController { if (!isConfigReadiness && !isNamingReadiness) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Config and Naming are not in readiness"); + .body("Config and Naming are not in readiness"); } if (!isConfigReadiness) { diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java index 9dd2b2f4..8b0d6fbd 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java @@ -57,7 +57,7 @@ public class ConsoleExceptionHandler { LOGGER.error("CONSOLE {}", uri, e); if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); + .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); } return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java index c73e8f8e..c704dd0f 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java @@ -59,7 +59,7 @@ public class NacosApiExceptionHandler { public ResponseEntity> handleNacosApiException(NacosApiException e) { LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); return ResponseEntity.status(e.getErrCode()) - .body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); + .body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); } @ExceptionHandler(NacosException.class) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java index 3c362354..da5ab018 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java @@ -76,7 +76,7 @@ public class DictController { @GetMapping("/page") public R> getDictPage(Page page, SysDict sysDict) { return R.ok(sysDictService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()))); + .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java index 96154d68..2e327244 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java @@ -65,7 +65,7 @@ public class FileController { @GetMapping("/page") public R> getSysFilePage(Page page, SysFile sysFile) { return R.ok(sysFileService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysFile.getFileName()), SysFile::getFileName, sysFile.getFileName()))); + .like(StrUtil.isNotBlank(sysFile.getFileName()), SysFile::getFileName, sysFile.getFileName()))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java index 31d7c968..0db7ba43 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java @@ -56,8 +56,11 @@ public class MenuController { @GetMapping public R>> getUserMenu(Long parentId) { // 获取符合条件的菜单 - Set menuSet = SecurityUtils.getRoles().stream().map(sysMenuService::findMenuByRoleId) - .flatMap(Collection::stream).collect(Collectors.toSet()); + Set menuSet = SecurityUtils.getRoles() + .stream() + .map(sysMenuService::findMenuByRoleId) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); return R.ok(sysMenuService.filterMenu(menuSet, parentId)); } @@ -79,8 +82,8 @@ public class MenuController { */ @GetMapping("/tree/{roleId}") public R> getRoleTree(@PathVariable Long roleId) { - return R.ok( - sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); + return R + .ok(sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java index e21bfc6e..52ec3bc8 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java @@ -59,7 +59,7 @@ public class OauthClientDetailsController { @GetMapping("/{clientId}") public R> getByClientId(@PathVariable String clientId) { return R.ok(sysOauthClientDetailsService - .list(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId))); + .list(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java index b9e23f77..d6be5790 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java @@ -71,10 +71,10 @@ public class PublicParamController { public R getSysPublicParamPage(Page page, SysPublicParam sysPublicParam) { return R.ok(sysPublicParamService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, - sysPublicParam.getPublicName()) - .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, - sysPublicParam.getPublicKey()))); + .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, + sysPublicParam.getPublicName()) + .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, + sysPublicParam.getPublicKey()))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java index 01e81a90..a68246b5 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java @@ -76,8 +76,8 @@ public class AppServiceImpl implements AppService { String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); log.info("手机号生成验证码成功:{},{}", sms.getPhone(), code); - redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + sms.getPhone(), code, - SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + redisTemplate.opsForValue() + .set(CacheConstants.DEFAULT_CODE_KEY + sms.getPhone(), code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); // 调用短信通道发送 this.smsClient.sendCode(code, sms.getPhone()); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java index f777a585..3f077e3d 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java @@ -55,10 +55,12 @@ public class SysDeptRelationServiceImpl extends ServiceImpl relationList = sysDeptRelationMapper.selectList( Wrappers.query().lambda().eq(SysDeptRelation::getDescendant, sysDept.getParentId())) - .stream().map(relation -> { - relation.setDescendant(sysDept.getDeptId()); - return relation; - }).collect(Collectors.toList()); + .stream() + .map(relation -> { + relation.setDescendant(sysDept.getDeptId()); + return relation; + }) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(relationList)) { this.saveBatch(relationList); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java index 029b3e81..b141b4e3 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java @@ -75,8 +75,10 @@ public class SysDeptServiceImpl extends ServiceImpl impl public Boolean removeDeptById(Long id) { // 级联删除部门 List idList = sysDeptRelationService - .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, id)).stream() - .map(SysDeptRelation::getDescendant).collect(Collectors.toList()); + .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, id)) + .stream() + .map(SysDeptRelation::getDescendant) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(idList)) { this.removeByIds(idList); @@ -108,7 +110,8 @@ public class SysDeptServiceImpl extends ServiceImpl impl @Override public List listChildDeptId(Long deptId) { List deptRelations = sysDeptRelationService.list(Wrappers.lambdaQuery() - .eq(SysDeptRelation::getAncestor, deptId).ne(SysDeptRelation::getDescendant, deptId)); + .eq(SysDeptRelation::getAncestor, deptId) + .ne(SysDeptRelation::getDescendant, deptId)); if (CollUtil.isNotEmpty(deptRelations)) { return deptRelations.stream().map(SysDeptRelation::getDescendant).collect(Collectors.toList()); } @@ -132,8 +135,10 @@ public class SysDeptServiceImpl extends ServiceImpl impl public List> listCurrentUserDeptTrees() { Long deptId = SecurityUtils.getUser().getDeptId(); List descendantIdList = sysDeptRelationService - .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, deptId)).stream() - .map(SysDeptRelation::getDescendant).collect(Collectors.toList()); + .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, deptId)) + .stream() + .map(SysDeptRelation::getDescendant) + .collect(Collectors.toList()); List deptList = baseMapper.selectBatchIds(descendantIdList); Optional dept = deptList.stream().filter(item -> item.getDeptId().intValue() == deptId).findFirst(); @@ -147,19 +152,22 @@ public class SysDeptServiceImpl extends ServiceImpl impl * @return */ private List> getDeptTree(List depts, Long parentId) { - List> collect = depts.stream().filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) - .sorted(Comparator.comparingInt(SysDept::getSortOrder)).map(dept -> { - TreeNode treeNode = new TreeNode(); - treeNode.setId(dept.getDeptId()); - treeNode.setParentId(dept.getParentId()); - treeNode.setName(dept.getName()); - treeNode.setWeight(dept.getSortOrder()); - // 扩展属性 - Map extra = new HashMap<>(4); - extra.put("createTime", dept.getCreateTime()); - treeNode.setExtra(extra); - return treeNode; - }).collect(Collectors.toList()); + List> collect = depts.stream() + .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) + .sorted(Comparator.comparingInt(SysDept::getSortOrder)) + .map(dept -> { + TreeNode treeNode = new TreeNode(); + treeNode.setId(dept.getDeptId()); + treeNode.setParentId(dept.getParentId()); + treeNode.setName(dept.getName()); + treeNode.setWeight(dept.getSortOrder()); + // 扩展属性 + Map extra = new HashMap<>(4); + extra.put("createTime", dept.getCreateTime()); + treeNode.setExtra(extra); + return treeNode; + }) + .collect(Collectors.toList()); return TreeUtil.build(collect, parentId); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index a88639f7..eb04d3f6 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -63,12 +63,12 @@ public class SysLogServiceImpl extends ServiceImpl impleme */ private LambdaQueryWrapper buildQueryWrapper(SysLogDTO sysLog) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .eq(StrUtil.isNotBlank(sysLog.getType()), SysLog::getType, sysLog.getType()) - .like(StrUtil.isNotBlank(sysLog.getRemoteAddr()), SysLog::getRemoteAddr, sysLog.getRemoteAddr()); + .eq(StrUtil.isNotBlank(sysLog.getType()), SysLog::getType, sysLog.getType()) + .like(StrUtil.isNotBlank(sysLog.getRemoteAddr()), SysLog::getRemoteAddr, sysLog.getRemoteAddr()); if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { - wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]).le(SysLog::getCreateTime, - sysLog.getCreateTime()[1]); + wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); } return wrapper; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java index 3eff49c5..22663d06 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java @@ -103,8 +103,10 @@ public class SysMenuServiceImpl extends ServiceImpl impl public List> treeMenu(boolean lazy, Long parentId) { if (!lazy) { List> collect = baseMapper - .selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSortOrder)).stream() - .map(getNodeFunction()).collect(Collectors.toList()); + .selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSortOrder)) + .stream() + .map(getNodeFunction()) + .collect(Collectors.toList()); return TreeUtil.build(collect, CommonConstants.MENU_TREE_ROOT_ID); } @@ -112,9 +114,11 @@ public class SysMenuServiceImpl extends ServiceImpl impl Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; List> collect = baseMapper - .selectList(Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent) - .orderByAsc(SysMenu::getSortOrder)) - .stream().map(getNodeFunction()).collect(Collectors.toList()); + .selectList( + Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent).orderByAsc(SysMenu::getSortOrder)) + .stream() + .map(getNodeFunction()) + .collect(Collectors.toList()); return TreeUtil.build(collect, parent); } @@ -128,8 +132,10 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List> filterMenu(Set all, Long parentId) { List> collect = all.stream() - .filter(menu -> MenuTypeEnum.LEFT_MENU.getType().equals(menu.getType())) - .filter(menu -> StrUtil.isNotBlank(menu.getPath())).map(getNodeFunction()).collect(Collectors.toList()); + .filter(menu -> MenuTypeEnum.LEFT_MENU.getType().equals(menu.getType())) + .filter(menu -> StrUtil.isNotBlank(menu.getPath())) + .map(getNodeFunction()) + .collect(Collectors.toList()); Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; return TreeUtil.build(collect, parent); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java index b2231106..925996a2 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java @@ -63,8 +63,9 @@ public class SysPostServiceImpl extends ServiceImpl impl for (PostExcelVO excel : excelVOList) { Set errorMsg = new HashSet<>(); // 检验岗位名称或者岗位编码是否存在 - boolean existPost = postList.stream().anyMatch(post -> excel.getPostName().equals(post.getPostName()) - || excel.getPostCode().equals(post.getPostCode())); + boolean existPost = postList.stream() + .anyMatch(post -> excel.getPostName().equals(post.getPostName()) + || excel.getPostCode().equals(post.getPostCode())); if (existPost) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_NAMEORCODE_EXISTING, excel.getPostName(), diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java index 7f9a3736..677065fd 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java @@ -47,7 +47,7 @@ public class SysPublicParamServiceImpl extends ServiceImpllambdaQuery().eq(SysPublicParam::getPublicKey, publicKey)); + .selectOne(Wrappers.lambdaQuery().eq(SysPublicParam::getPublicKey, publicKey)); if (sysPublicParam != null) { return sysPublicParam.getPublicValue(); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java index 3d6c9f6f..3af802c0 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java @@ -87,8 +87,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl for (RoleExcelVO excel : excelVOList) { Set errorMsg = new HashSet<>(); // 检验角色名称或者角色编码是否存在 - boolean existRole = roleList.stream().anyMatch(sysRole -> excel.getRoleName().equals(sysRole.getRoleName()) - || excel.getRoleCode().equals(sysRole.getRoleCode())); + boolean existRole = roleList.stream() + .anyMatch(sysRole -> excel.getRoleName().equals(sysRole.getRoleName()) + || excel.getRoleCode().equals(sysRole.getRoleCode())); if (existRole) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_NAMEORCODE_EXISTING, excel.getRoleName(), diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index b2b40166..1dc22a87 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -130,9 +130,13 @@ public class SysUserServiceImpl extends ServiceImpl impl List postList = sysPostMapper.listPostsByUserId(sysUser.getUserId()); userInfo.setPostList(postList); // 设置权限列表(menu.permission) - Set permissions = roleIds.stream().map(sysMenuService::findMenuByRoleId).flatMap(Collection::stream) - .filter(m -> MenuTypeEnum.BUTTON.getType().equals(m.getType())).map(SysMenu::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + Set permissions = roleIds.stream() + .map(sysMenuService::findMenuByRoleId) + .flatMap(Collection::stream) + .filter(m -> MenuTypeEnum.BUTTON.getType().equals(m.getType())) + .map(SysMenu::getPermission) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); return userInfo; @@ -213,7 +217,7 @@ public class SysUserServiceImpl extends ServiceImpl impl this.updateById(sysUser); sysUserRoleMapper - .delete(Wrappers.update().lambda().eq(SysUserRole::getUserId, userDto.getUserId())); + .delete(Wrappers.update().lambda().eq(SysUserRole::getUserId, userDto.getUserId())); userDto.getRole().forEach(roleId -> { SysUserRole userRole = new SysUserRole(); userRole.setUserId(sysUser.getUserId()); @@ -260,11 +264,15 @@ public class SysUserServiceImpl extends ServiceImpl impl List userExcelVOList = voList.stream().map(userVO -> { UserExcelVO excelVO = new UserExcelVO(); BeanUtils.copyProperties(userVO, excelVO); - String roleNameList = userVO.getRoleList().stream().map(SysRole::getRoleName) - .collect(Collectors.joining(StrUtil.COMMA)); + String roleNameList = userVO.getRoleList() + .stream() + .map(SysRole::getRoleName) + .collect(Collectors.joining(StrUtil.COMMA)); excelVO.setRoleNameList(roleNameList); - String postNameList = userVO.getPostList().stream().map(SysPost::getPostName) - .collect(Collectors.joining(StrUtil.COMMA)); + String postNameList = userVO.getPostList() + .stream() + .map(SysPost::getPostName) + .collect(Collectors.joining(StrUtil.COMMA)); excelVO.setPostNameList(postNameList); return excelVO; }).collect(Collectors.toList()); @@ -293,7 +301,7 @@ public class SysUserServiceImpl extends ServiceImpl impl Set errorMsg = new HashSet<>(); // 校验用户名是否存在 boolean exsitUserName = userList.stream() - .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); if (exsitUserName) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); @@ -301,7 +309,8 @@ public class SysUserServiceImpl extends ServiceImpl impl // 判断输入的部门名称列表是否合法 Optional deptOptional = deptList.stream() - .filter(dept -> excel.getDeptName().equals(dept.getName())).findFirst(); + .filter(dept -> excel.getDeptName().equals(dept.getName())) + .findFirst(); if (!deptOptional.isPresent()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); } @@ -309,8 +318,8 @@ public class SysUserServiceImpl extends ServiceImpl impl // 判断输入的角色名称列表是否合法 List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); List roleCollList = roleList.stream() - .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) - .collect(Collectors.toList()); + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); if (roleCollList.size() != roleNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); @@ -319,8 +328,8 @@ public class SysUserServiceImpl extends ServiceImpl impl // 判断输入的岗位名称列表是否合法 List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); List postCollList = postList.stream() - .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) - .collect(Collectors.toList()); + .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) + .collect(Collectors.toList()); if (postCollList.size() != postNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); @@ -393,7 +402,7 @@ public class SysUserServiceImpl extends ServiceImpl impl String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); // 默认角色 SysRole sysRole = sysRoleMapper - .selectOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + .selectOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); if (sysRole == null) { return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_PARAM_CONFIG_ERROR, "USER_DEFAULT_ROLE")); diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java index 7f3d5d2e..8dc7da32 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java @@ -82,7 +82,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpllambdaQuery().eq(GenFormConf::getTableName, tableName) - .orderByDesc(GenFormConf::getCreateTime), false); + GenFormConf form = getOne(Wrappers.lambdaQuery() + .eq(GenFormConf::getTableName, tableName) + .orderByDesc(GenFormConf::getCreateTime), false); if (form != null) { return form.getFormInfo(); diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java index 94b901bf..9d65392a 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java @@ -77,7 +77,8 @@ public class GeneratorServiceImpl implements GeneratorService { public Map previewCode(GenConfig genConfig) { // 根据tableName 查询最新的表单配置 List formConfList = genFormConfMapper.selectList(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, genConfig.getTableName()).orderByDesc(GenFormConf::getCreateTime)); + .eq(GenFormConf::getTableName, genConfig.getTableName()) + .orderByDesc(GenFormConf::getCreateTime)); String tableNames = genConfig.getTableName(); String dsName = genConfig.getDsName(); @@ -111,7 +112,8 @@ public class GeneratorServiceImpl implements GeneratorService { public byte[] generatorCode(GenConfig genConfig) { // 根据tableName 查询最新的表单配置 List formConfList = genFormConfMapper.selectList(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, genConfig.getTableName()).orderByDesc(GenFormConf::getCreateTime)); + .eq(GenFormConf::getTableName, genConfig.getTableName()) + .orderByDesc(GenFormConf::getCreateTime)); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java index de5a7ffd..3de92f7c 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java @@ -36,8 +36,11 @@ public enum StyleTypeEnum { private String description; public static String getDecs(String style) { - return Arrays.stream(StyleTypeEnum.values()).filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style)) - .findFirst().orElse(ELEMENT).getDescription(); + return Arrays.stream(StyleTypeEnum.values()) + .filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style)) + .findFirst() + .orElse(ELEMENT) + .getDescription(); } } diff --git a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java index 316f9a78..1498b0d8 100755 --- a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java +++ b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java @@ -49,12 +49,28 @@ public class WebSecurityConfigurer { SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); - http.headers().frameOptions().disable().and().authorizeRequests() - .antMatchers(adminContextPath + "/assets/**", adminContextPath + "/login", - adminContextPath + "/instances/**", adminContextPath + "/actuator/**") - .permitAll().anyRequest().authenticated().and().formLogin().loginPage(adminContextPath + "/login") - .successHandler(successHandler).and().logout().logoutUrl(adminContextPath + "/logout").and().httpBasic() - .and().csrf().disable(); + http.headers() + .frameOptions() + .disable() + .and() + .authorizeRequests() + .antMatchers(adminContextPath + "/assets/**", adminContextPath + "/login", + adminContextPath + "/instances/**", adminContextPath + "/actuator/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage(adminContextPath + "/login") + .successHandler(successHandler) + .and() + .logout() + .logoutUrl(adminContextPath + "/logout") + .and() + .httpBasic() + .and() + .csrf() + .disable(); return http.build(); } diff --git a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java index 6298de21..d5a87bc1 100644 --- a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java +++ b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java @@ -20,10 +20,11 @@ public class NacosServiceInstanceConverter extends DefaultServiceInstanceConvert @Override protected Map getMetadata(ServiceInstance instance) { - return (instance.getMetadata() != null) - ? instance.getMetadata().entrySet().stream().filter((e) -> e.getKey() != null && e.getValue() != null) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) - : emptyMap(); + return (instance.getMetadata() != null) ? instance.getMetadata() + .entrySet() + .stream() + .filter((e) -> e.getKey() != null && e.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) : emptyMap(); } } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java index b8a864de..af8c6a3d 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java @@ -88,7 +88,7 @@ public class DefaultLoginAuthenticationFilter implements LoginAuthenticationFilt // Exclude the urls which needn't auth boolean authFilterExcludeMatch = authFilterExcludeUrls.stream() - .anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath)); + .anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath)); if (authFilterExcludeMatch) { chain.doFilter(request, response); return; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java index afeb58bb..3cac7f99 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java @@ -87,7 +87,7 @@ public class SentinelApiClient { private static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type"; private static final String HTTP_HEADER_CONTENT_TYPE_URLENCODED = ContentType.create(URLEncodedUtils.CONTENT_TYPE) - .toString(); + .toString(); private static final String RESOURCE_URL_PATH = "jsonTree"; @@ -143,8 +143,11 @@ public class SentinelApiClient { private AppManagement appManagement; public SentinelApiClient() { - IOReactorConfig ioConfig = IOReactorConfig.custom().setConnectTimeout(3000).setSoTimeout(10000) - .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2).build(); + IOReactorConfig ioConfig = IOReactorConfig.custom() + .setConnectTimeout(3000) + .setSoTimeout(10000) + .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2) + .build(); httpClient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() { @Override protected boolean isRedirectable(final String method) { @@ -164,10 +167,10 @@ public class SentinelApiClient { } protected boolean isSupportPost(String app, String ip, int port) { - return StringUtil.isNotEmpty(app) - && Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version160))) - .orElse(false); + return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version160))) + .orElse(false); } /** @@ -178,10 +181,10 @@ public class SentinelApiClient { * @param port target node's port */ protected boolean isSupportEnhancedContentType(String app, String ip, int port) { - return StringUtil.isNotEmpty(app) - && Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version171))) - .orElse(false); + return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version171))) + .orElse(false); } private StringBuilder queryString(Map params) { @@ -476,8 +479,9 @@ public class SentinelApiClient { public List fetchFlowRuleOfMachine(String app, String ip, int port) { List rules = fetchRules(ip, port, FLOW_RULE_TYPE, FlowRule.class); if (rules != null) { - return rules.stream().map(rule -> FlowRuleEntity.fromFlowRule(app, ip, port, rule)) - .collect(Collectors.toList()); + return rules.stream() + .map(rule -> FlowRuleEntity.fromFlowRule(app, ip, port, rule)) + .collect(Collectors.toList()); } else { return null; @@ -487,8 +491,9 @@ public class SentinelApiClient { public List fetchDegradeRuleOfMachine(String app, String ip, int port) { List rules = fetchRules(ip, port, DEGRADE_RULE_TYPE, DegradeRule.class); if (rules != null) { - return rules.stream().map(rule -> DegradeRuleEntity.fromDegradeRule(app, ip, port, rule)) - .collect(Collectors.toList()); + return rules.stream() + .map(rule -> DegradeRuleEntity.fromDegradeRule(app, ip, port, rule)) + .collect(Collectors.toList()); } else { return null; @@ -498,8 +503,9 @@ public class SentinelApiClient { public List fetchSystemRuleOfMachine(String app, String ip, int port) { List rules = fetchRules(ip, port, SYSTEM_RULE_TYPE, SystemRule.class); if (rules != null) { - return rules.stream().map(rule -> SystemRuleEntity.fromSystemRule(app, ip, port, rule)) - .collect(Collectors.toList()); + return rules.stream() + .map(rule -> SystemRuleEntity.fromSystemRule(app, ip, port, rule)) + .collect(Collectors.toList()); } else { return null; @@ -520,8 +526,9 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); return fetchItemsAsync(ip, port, GET_PARAM_RULE_PATH, null, ParamFlowRule.class) - .thenApply(rules -> rules.stream().map(e -> ParamFlowRuleEntity.fromParamFlowRule(app, ip, port, e)) - .collect(Collectors.toList())); + .thenApply(rules -> rules.stream() + .map(e -> ParamFlowRuleEntity.fromParamFlowRule(app, ip, port, e)) + .collect(Collectors.toList())); } catch (Exception e) { logger.error("Error when fetching parameter flow rules", e); @@ -544,9 +551,11 @@ public class SentinelApiClient { Map params = new HashMap<>(1); params.put("type", AUTHORITY_TYPE); List rules = fetchRules(ip, port, AUTHORITY_TYPE, AuthorityRule.class); - return Optional.ofNullable(rules).map(r -> r.stream() - .map(e -> AuthorityRuleEntity.fromAuthorityRule(app, ip, port, e)).collect(Collectors.toList())) - .orElse(null); + return Optional.ofNullable(rules) + .map(r -> r.stream() + .map(e -> AuthorityRuleEntity.fromAuthorityRule(app, ip, port, e)) + .collect(Collectors.toList())) + .orElse(null); } /** @@ -607,7 +616,7 @@ public class SentinelApiClient { } try { String data = JSON - .toJSONString(rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())); + .toJSONString(rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())); Map params = new HashMap<>(1); params.put("data", data); return executeCommand(app, ip, port, SET_PARAM_RULE_PATH, params, true).thenCompose(e -> { @@ -634,7 +643,7 @@ public class SentinelApiClient { } try { return executeCommand(ip, port, FETCH_CLUSTER_MODE_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterStateSimpleEntity.class)); + .thenApply(r -> JSON.parseObject(r, ClusterStateSimpleEntity.class)); } catch (Exception ex) { logger.warn("Error when fetching cluster mode", ex); @@ -671,7 +680,7 @@ public class SentinelApiClient { } try { return executeCommand(ip, port, FETCH_CLUSTER_CLIENT_CONFIG_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterClientInfoVO.class)); + .thenApply(r -> JSON.parseObject(r, ClusterClientInfoVO.class)); } catch (Exception ex) { logger.warn("Error when fetching cluster client config", ex); @@ -712,15 +721,15 @@ public class SentinelApiClient { Map params = new HashMap<>(1); params.put("data", JSON.toJSONString(config)); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH, params, true) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server flow config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); + .thenCompose(e -> { + if (CommandConstants.MSG_SUCCESS.equals(e)) { + return CompletableFuture.completedFuture(null); + } + else { + logger.warn("Error when modifying cluster server flow config: " + e); + return AsyncUtils.newFailedFuture(new RuntimeException(e)); + } + }); } catch (Exception ex) { logger.warn("Error when modifying cluster server flow config", ex); @@ -738,15 +747,15 @@ public class SentinelApiClient { params.put("port", config.getPort().toString()); params.put("idleSeconds", config.getIdleSeconds().toString()); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH, params, false) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server transport config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); + .thenCompose(e -> { + if (CommandConstants.MSG_SUCCESS.equals(e)) { + return CompletableFuture.completedFuture(null); + } + else { + logger.warn("Error when modifying cluster server transport config: " + e); + return AsyncUtils.newFailedFuture(new RuntimeException(e)); + } + }); } catch (Exception ex) { logger.warn("Error when modifying cluster server transport config", ex); @@ -762,15 +771,15 @@ public class SentinelApiClient { Map params = new HashMap<>(1); params.put("data", JSON.toJSONString(set)); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH, params, true) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server NamespaceSet", e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); + .thenCompose(e -> { + if (CommandConstants.MSG_SUCCESS.equals(e)) { + return CompletableFuture.completedFuture(null); + } + else { + logger.warn("Error when modifying cluster server NamespaceSet", e); + return AsyncUtils.newFailedFuture(new RuntimeException(e)); + } + }); } catch (Exception ex) { logger.warn("Error when modifying cluster server NamespaceSet", ex); @@ -784,7 +793,7 @@ public class SentinelApiClient { } try { return executeCommand(ip, port, FETCH_CLUSTER_SERVER_BASIC_INFO_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterServerStateVO.class)); + .thenApply(r -> JSON.parseObject(r, ClusterServerStateVO.class)); } catch (Exception ex) { logger.warn("Error when fetching cluster sever all config and basic info", ex); @@ -847,8 +856,8 @@ public class SentinelApiClient { return executeCommand(ip, port, FETCH_GATEWAY_FLOW_RULE_PATH, false).thenApply(r -> { List gatewayFlowRules = JSON.parseArray(r, GatewayFlowRule.class); List entities = gatewayFlowRules.stream() - .map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)) - .collect(Collectors.toList()); + .map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)) + .collect(Collectors.toList()); return entities; }); } @@ -868,7 +877,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); String data = JSON - .toJSONString(rules.stream().map(r -> r.toGatewayFlowRule()).collect(Collectors.toList())); + .toJSONString(rules.stream().map(r -> r.toGatewayFlowRule()).collect(Collectors.toList())); Map params = new HashMap<>(2); params.put("data", data); String result = executeCommand(app, ip, port, MODIFY_GATEWAY_FLOW_RULE_PATH, params, true).get(); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java index b372453b..1efc019e 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java @@ -58,8 +58,10 @@ public class AppController { return Result.ofSuccess(null); } List list = new ArrayList<>(appInfo.getMachines()); - Collections.sort(list, Comparator.comparing(MachineInfo::getApp).thenComparing(MachineInfo::getIp) - .thenComparingInt(MachineInfo::getPort)); + Collections.sort(list, + Comparator.comparing(MachineInfo::getApp) + .thenComparing(MachineInfo::getIp) + .thenComparingInt(MachineInfo::getPort)); return Result.ofSuccess(MachineInfoVo.fromMachineInfoList(list)); } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java index f81d64cd..72ddaf3b 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java @@ -60,9 +60,10 @@ public class ParamFlowRuleController { private boolean checkIfSupported(String app, String ip, int port) { try { - return Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version020))) - .orElse(true); + return Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version020))) + .orElse(true); // If error occurred or cannot retrieve machine info, return true. } catch (Exception ex) { @@ -87,8 +88,10 @@ public class ParamFlowRuleController { return unsupportedVersion(); } try { - return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port).thenApply(repository::saveAll) - .thenApply(Result::ofSuccess).get(); + return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port) + .thenApply(repository::saveAll) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when querying parameter flow rules", ex.getCause()); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java index ad9148c6..c342d546 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java @@ -81,8 +81,8 @@ public class ResourceController { } if (StringUtil.isNotEmpty(searchKey)) { nodeVos = nodeVos.stream() - .filter(node -> node.getResource().toLowerCase().contains(searchKey.toLowerCase())) - .collect(Collectors.toList()); + .filter(node -> node.getResource().toLowerCase().contains(searchKey.toLowerCase())) + .collect(Collectors.toList()); } return Result.ofSuccess(ResourceVo.fromNodeVoList(nodeVos)); } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java index e967900b..d15dee28 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java @@ -147,7 +147,9 @@ public class ClusterConfigController { } try { return clusterConfigService.getClusterUniversalState(app) - .thenApply(ClusterEntityUtils::wrapToAppClusterServerState).thenApply(Result::ofSuccess).get(); + .thenApply(ClusterEntityUtils::wrapToAppClusterServerState) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when fetching cluster server state of app: " + app, ex.getCause()); @@ -166,7 +168,9 @@ public class ClusterConfigController { } try { return clusterConfigService.getClusterUniversalState(app) - .thenApply(ClusterEntityUtils::wrapToAppClusterClientState).thenApply(Result::ofSuccess).get(); + .thenApply(ClusterEntityUtils::wrapToAppClusterClientState) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when fetching cluster token client state of app: " + app, ex.getCause()); @@ -202,9 +206,10 @@ public class ClusterConfigController { private boolean checkIfSupported(String app, String ip, int port) { try { - return Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version140))) - .orElse(true); + return Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version140))) + .orElse(true); // If error occurred or cannot retrieve machine info, return true. } catch (Exception ex) { diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java index 32e18882..9415b577 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java @@ -125,7 +125,7 @@ public class GatewayApiController { // 匹配模式 Integer matchStrategy = predicateItem.getMatchStrategy(); if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .contains(matchStrategy)) { return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); } predicateItemEntity.setMatchStrategy(matchStrategy); @@ -197,7 +197,7 @@ public class GatewayApiController { // 匹配模式 int matchStrategy = predicateItem.getMatchStrategy(); if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .contains(matchStrategy)) { return Result.ofFail(-1, "Invalid matchStrategy: " + matchStrategy); } predicateItemEntity.setMatchStrategy(matchStrategy); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java index 016d4f39..5a9907c4 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java @@ -132,15 +132,17 @@ public class GatewayFlowRuleController { // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie Integer parseStrategy = paramItem.getParseStrategy(); - if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, - PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) { + if (!Arrays + .asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, + PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) + .contains(parseStrategy)) { return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy); } itemEntity.setParseStrategy(paramItem.getParseStrategy()); // 当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填 if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { + .contains(parseStrategy)) { // 参数名称 String fieldName = paramItem.getFieldName(); if (StringUtil.isBlank(fieldName)) { @@ -155,8 +157,8 @@ public class GatewayFlowRuleController { itemEntity.setPattern(pattern); Integer matchStrategy = paramItem.getMatchStrategy(); if (!Arrays - .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) + .contains(matchStrategy)) { return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); } itemEntity.setMatchStrategy(matchStrategy); @@ -199,7 +201,7 @@ public class GatewayFlowRuleController { return Result.ofFail(-1, "intervalUnit can't be null"); } if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY) - .contains(intervalUnit)) { + .contains(intervalUnit)) { return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit); } entity.setIntervalUnit(intervalUnit); @@ -283,15 +285,17 @@ public class GatewayFlowRuleController { // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie Integer parseStrategy = paramItem.getParseStrategy(); - if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, - PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) { + if (!Arrays + .asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, + PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) + .contains(parseStrategy)) { return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy); } itemEntity.setParseStrategy(paramItem.getParseStrategy()); // 当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填 if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { + .contains(parseStrategy)) { // 参数名称 String fieldName = paramItem.getFieldName(); if (StringUtil.isBlank(fieldName)) { @@ -306,8 +310,8 @@ public class GatewayFlowRuleController { itemEntity.setPattern(pattern); Integer matchStrategy = paramItem.getMatchStrategy(); if (!Arrays - .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) + .contains(matchStrategy)) { return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); } itemEntity.setMatchStrategy(matchStrategy); @@ -353,7 +357,7 @@ public class GatewayFlowRuleController { return Result.ofFail(-1, "intervalUnit can't be null"); } if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY) - .contains(intervalUnit)) { + .contains(intervalUnit)) { return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit); } entity.setIntervalUnit(intervalUnit); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java index 463412c8..33bfc2bb 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java @@ -98,8 +98,10 @@ public class AppInfo { long healthyCount = machines.stream().filter(MachineInfo::isHealthy).count(); if (healthyCount == 0) { // No healthy machines. - return machines.stream().max(Comparator.comparingLong(MachineInfo::getLastHeartbeat)) - .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold).orElse(false); + return machines.stream() + .max(Comparator.comparingLong(MachineInfo::getLastHeartbeat)) + .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold) + .orElse(false); } } return true; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java index 2b4a080b..357ed599 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java @@ -151,11 +151,31 @@ public class MachineInfo implements Comparable { @Override public String toString() { - return new StringBuilder("MachineInfo {").append("app='").append(app).append('\'').append(",appType='") - .append(appType).append('\'').append(", hostname='").append(hostname).append('\'').append(", ip='") - .append(ip).append('\'').append(", port=").append(port).append(", heartbeatVersion=") - .append(heartbeatVersion).append(", lastHeartbeat=").append(lastHeartbeat).append(", version='") - .append(version).append('\'').append(", healthy=").append(isHealthy()).append('}').toString(); + return new StringBuilder("MachineInfo {").append("app='") + .append(app) + .append('\'') + .append(",appType='") + .append(appType) + .append('\'') + .append(", hostname='") + .append(hostname) + .append('\'') + .append(", ip='") + .append(ip) + .append('\'') + .append(", port=") + .append(port) + .append(", heartbeatVersion=") + .append(heartbeatVersion) + .append(", lastHeartbeat=") + .append(lastHeartbeat) + .append(", version='") + .append(version) + .append('\'') + .append(", healthy=") + .append(isHealthy()) + .append('}') + .toString(); } @Override diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java index ec42af53..2b4cc788 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java @@ -101,8 +101,11 @@ public class MetricFetcher { fetchWorker = new ThreadPoolExecutor(cores, cores, keepAliveTime, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueSize), new NamedThreadFactory("sentinel-dashboard-metrics-fetchWorker", true), handler); - IOReactorConfig ioConfig = IOReactorConfig.custom().setConnectTimeout(3000).setSoTimeout(3000) - .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2).build(); + IOReactorConfig ioConfig = IOReactorConfig.custom() + .setConnectTimeout(3000) + .setSoTimeout(3000) + .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2) + .build(); httpclient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() { @Override diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java index 684ffc2c..7968851a 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java @@ -52,14 +52,15 @@ public class InMemoryMetricsRepository implements MetricsRepository new HashMap<>(16)) - .computeIfAbsent(entity.getResource(), e -> new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Entry eldest) { - // Metric older than {@link #MAX_METRIC_LIVE_TIME_MS} will be - // removed. - return eldest.getKey() < TimeUtil.currentTimeMillis() - MAX_METRIC_LIVE_TIME_MS; - } - }).put(entity.getTimestamp().getTime(), entity); + .computeIfAbsent(entity.getResource(), e -> new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Entry eldest) { + // Metric older than {@link #MAX_METRIC_LIVE_TIME_MS} will be + // removed. + return eldest.getKey() < TimeUtil.currentTimeMillis() - MAX_METRIC_LIVE_TIME_MS; + } + }) + .put(entity.getTimestamp().getTime(), entity); } finally { readWriteLock.writeLock().unlock(); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java index 2e6e15cf..d3be5f88 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java @@ -49,11 +49,12 @@ public abstract class InMemoryRuleRepositoryAdapter implem if (processedEntity != null) { allRules.put(processedEntity.getId(), processedEntity); machineRules - .computeIfAbsent(MachineInfo.of(processedEntity.getApp(), processedEntity.getIp(), - processedEntity.getPort()), e -> new ConcurrentHashMap<>(32)) - .put(processedEntity.getId(), processedEntity); + .computeIfAbsent( + MachineInfo.of(processedEntity.getApp(), processedEntity.getIp(), processedEntity.getPort()), + e -> new ConcurrentHashMap<>(32)) + .put(processedEntity.getId(), processedEntity); appRules.computeIfAbsent(processedEntity.getApp(), v -> new ConcurrentHashMap<>(32)) - .put(processedEntity.getId(), processedEntity); + .put(processedEntity.getId(), processedEntity); } return processedEntity; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java index c5bf9fc8..eabafdd2 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java @@ -44,10 +44,12 @@ public class FlowRuleApiProvider implements DynamicRuleProvider(); } - List list = appManagement.getDetailApp(appName).getMachines().stream() - .filter(MachineInfo::isHealthy) - .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())) - .collect(Collectors.toList()); + List list = appManagement.getDetailApp(appName) + .getMachines() + .stream() + .filter(MachineInfo::isHealthy) + .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())) + .collect(Collectors.toList()); if (list.isEmpty()) { return new ArrayList<>(); } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java index 1635e8d6..53a046af 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java @@ -60,13 +60,14 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { private ClusterAppAssignResultVO handleUnbindClusterServerNotInApp(String app, String machineId) { Set failedSet = new HashSet<>(); try { - List list = clusterConfigService.getClusterUniversalState(app).get(10, - TimeUnit.SECONDS); + List list = clusterConfigService.getClusterUniversalState(app) + .get(10, TimeUnit.SECONDS); Set toModifySet = list.stream() - .filter(e -> e.getState().getStateInfo().getMode() == ClusterStateManager.CLUSTER_CLIENT) - .filter(e -> machineId.equals(e.getState().getClient().getClientConfig().getServerHost() + ':' - + e.getState().getClient().getClientConfig().getServerPort())) - .map(e -> e.getIp() + '@' + e.getCommandPort()).collect(Collectors.toSet()); + .filter(e -> e.getState().getStateInfo().getMode() == ClusterStateManager.CLUSTER_CLIENT) + .filter(e -> machineId.equals(e.getState().getClient().getClientConfig().getServerHost() + ':' + + e.getState().getClient().getClientConfig().getServerPort())) + .map(e -> e.getIp() + '@' + e.getCommandPort()) + .collect(Collectors.toSet()); // Modify mode to NOT-STARTED for all associated token clients. modifyToNonStarted(toModifySet, failedSet); } @@ -79,11 +80,15 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { } private void modifyToNonStarted(Set toModifySet, Set failedSet) { - toModifySet.parallelStream().map(MachineUtils::parseCommandIpAndPort).filter(Optional::isPresent) - .map(Optional::get).map(e -> { - CompletableFuture f = modifyMode(e.r1, e.r2, ClusterStateManager.CLUSTER_NOT_STARTED); - return Tuple2.of(e.r1 + '@' + e.r2, f); - }).forEach(f -> handleFutureSync(f, failedSet)); + toModifySet.parallelStream() + .map(MachineUtils::parseCommandIpAndPort) + .filter(Optional::isPresent) + .map(Optional::get) + .map(e -> { + CompletableFuture f = modifyMode(e.r1, e.r2, ClusterStateManager.CLUSTER_NOT_STARTED); + return Tuple2.of(e.r1 + '@' + e.r2, f); + }) + .forEach(f -> handleFutureSync(f, failedSet)); } @Override @@ -97,7 +102,7 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { Set failedSet = new HashSet<>(); try { ClusterGroupEntity entity = clusterConfigService.getClusterUniversalStateForAppMachine(app, machineId) - .get(10, TimeUnit.SECONDS); + .get(10, TimeUnit.SECONDS); Set toModifySet = new HashSet<>(); toModifySet.add(machineId); if (entity.getClientSet() != null) { @@ -120,7 +125,7 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { AssertUtil.assertNotBlank(app, "app cannot be blank"); AssertUtil.isTrue(machineIdSet != null && !machineIdSet.isEmpty(), "machineIdSet cannot be empty"); ClusterAppAssignResultVO result = new ClusterAppAssignResultVO().setFailedClientSet(new HashSet<>()) - .setFailedServerSet(new HashSet<>()); + .setFailedServerSet(new HashSet<>()); for (String machineId : machineIdSet) { ClusterAppAssignResultVO resultVO = unbindClusterServer(app, machineId); result.getFailedClientSet().addAll(resultVO.getFailedClientSet()); @@ -142,13 +147,14 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { String ip = e.getIp(); int commandPort = parsePort(e); CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_SERVER) - .thenCompose(v -> applyServerConfigChange(app, ip, commandPort, e)); + .thenCompose(v -> applyServerConfigChange(app, ip, commandPort, e)); return Tuple2.of(e.getMachineId(), f); }).forEach(t -> handleFutureSync(t, failedServerSet)); // Assign client of servers and apply config. - clusterMap.parallelStream().filter(Objects::nonNull) - .forEach(e -> applyAllClientConfigChange(app, e, failedClientSet)); + clusterMap.parallelStream() + .filter(Objects::nonNull) + .forEach(e -> applyAllClientConfigChange(app, e, failedClientSet)); // Unbind remaining (unassigned) machines. applyAllRemainingMachineSet(app, remainingSet, failedClientSet); @@ -160,13 +166,18 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { if (remainingSet == null || remainingSet.isEmpty()) { return; } - remainingSet.parallelStream().filter(Objects::nonNull).map(MachineUtils::parseCommandIpAndPort) - .filter(Optional::isPresent).map(Optional::get).map(ipPort -> { - String ip = ipPort.r1; - int commandPort = ipPort.r2; - CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_NOT_STARTED); - return Tuple2.of(ip + '@' + commandPort, f); - }).forEach(t -> handleFutureSync(t, failedSet)); + remainingSet.parallelStream() + .filter(Objects::nonNull) + .map(MachineUtils::parseCommandIpAndPort) + .filter(Optional::isPresent) + .map(Optional::get) + .map(ipPort -> { + String ip = ipPort.r1; + int commandPort = ipPort.r2; + CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_NOT_STARTED); + return Tuple2.of(ip + '@' + commandPort, f); + }) + .forEach(t -> handleFutureSync(t, failedSet)); } private void applyAllClientConfigChange(String app, ClusterAppAssignMap assignMap, Set failedSet) { @@ -176,15 +187,20 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { } final String serverIp = assignMap.getIp(); final int serverPort = assignMap.getPort(); - clientSet.stream().map(MachineUtils::parseCommandIpAndPort).filter(Optional::isPresent).map(Optional::get) - .map(ipPort -> { - CompletableFuture f = sentinelApiClient - .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT) - .thenCompose(v -> sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2, - new ClusterClientConfig().setRequestTimeout(20).setServerHost(serverIp) - .setServerPort(serverPort))); - return Tuple2.of(ipPort.r1 + '@' + ipPort.r2, f); - }).forEach(t -> handleFutureSync(t, failedSet)); + clientSet.stream() + .map(MachineUtils::parseCommandIpAndPort) + .filter(Optional::isPresent) + .map(Optional::get) + .map(ipPort -> { + CompletableFuture f = sentinelApiClient + .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT) + .thenCompose(v -> sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2, + new ClusterClientConfig().setRequestTimeout(20) + .setServerHost(serverIp) + .setServerPort(serverPort))); + return Tuple2.of(ipPort.r1 + '@' + ipPort.r2, f); + }) + .forEach(t -> handleFutureSync(t, failedSet)); } private void handleFutureSync(Tuple2> t, Set failedSet) { @@ -205,10 +221,10 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { private CompletableFuture applyServerConfigChange(String app, String ip, int commandPort, ClusterAppAssignMap assignMap) { ServerTransportConfig transportConfig = new ServerTransportConfig().setPort(assignMap.getPort()) - .setIdleSeconds(600); + .setIdleSeconds(600); return sentinelApiClient.modifyClusterServerTransportConfig(app, ip, commandPort, transportConfig) - .thenCompose(v -> applyServerFlowConfigChange(app, ip, commandPort, assignMap)) - .thenCompose(v -> applyServerNamespaceSetConfig(app, ip, commandPort, assignMap)); + .thenCompose(v -> applyServerFlowConfigChange(app, ip, commandPort, assignMap)) + .thenCompose(v -> applyServerNamespaceSetConfig(app, ip, commandPort, assignMap)); } private CompletableFuture applyServerFlowConfigChange(String app, String ip, int commandPort, diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java index d1cf10ff..d8850631 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java @@ -61,7 +61,7 @@ public class ClusterConfigService { String ip = request.getIp(); int port = request.getPort(); return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig()) - .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT)); + .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT)); } private boolean notClientRequestValid(/* @NonNull */ ClusterClientModifyRequest request) { @@ -87,9 +87,9 @@ public class ClusterConfigService { String ip = request.getIp(); int port = request.getPort(); return sentinelApiClient.modifyClusterServerNamespaceSet(app, ip, port, namespaceSet) - .thenCompose(v -> sentinelApiClient.modifyClusterServerTransportConfig(app, ip, port, transportConfig)) - .thenCompose(v -> sentinelApiClient.modifyClusterServerFlowConfig(app, ip, port, flowConfig)) - .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_SERVER)); + .thenCompose(v -> sentinelApiClient.modifyClusterServerTransportConfig(app, ip, port, transportConfig)) + .thenCompose(v -> sentinelApiClient.modifyClusterServerFlowConfig(app, ip, port, flowConfig)) + .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_SERVER)); } /** @@ -107,11 +107,12 @@ public class ClusterConfigService { return CompletableFuture.completedFuture(new ArrayList<>()); } - List> futures = appInfo.getMachines().stream() - .filter(e -> e.isHealthy()) - .map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort()) - .thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e))) - .collect(Collectors.toList()); + List> futures = appInfo.getMachines() + .stream() + .filter(e -> e.isHealthy()) + .map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort()) + .thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e))) + .collect(Collectors.toList()); return AsyncUtils.sequenceSuccessFuture(futures); } @@ -125,36 +126,43 @@ public class ClusterConfigService { return AsyncUtils.newFailedFuture(new IllegalArgumentException("app does not have machines")); } - boolean machineOk = appInfo.getMachines().stream().filter(e -> e.isHealthy()) - .map(e -> e.getIp() + '@' + e.getPort()).anyMatch(e -> e.equals(machineId)); + boolean machineOk = appInfo.getMachines() + .stream() + .filter(e -> e.isHealthy()) + .map(e -> e.getIp() + '@' + e.getPort()) + .anyMatch(e -> e.equals(machineId)); if (!machineOk) { return AsyncUtils.newFailedFuture(new IllegalStateException("machine does not exist or disconnected")); } return getClusterUniversalState(app).thenApply(ClusterEntityUtils::wrapToClusterGroup) - .thenCompose(e -> e.stream().filter(e1 -> e1.getMachineId().equals(machineId)).findAny() - .map(CompletableFuture::completedFuture) - .orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId)))); + .thenCompose(e -> e.stream() + .filter(e1 -> e1.getMachineId().equals(machineId)) + .findAny() + .map(CompletableFuture::completedFuture) + .orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId)))); } public CompletableFuture getClusterUniversalState(String app, String ip, int port) { return sentinelApiClient.fetchClusterMode(ip, port) - .thenApply(e -> new ClusterUniversalStateVO().setStateInfo(e)).thenCompose(vo -> { - if (vo.getStateInfo().getClientAvailable()) { - return sentinelApiClient.fetchClusterClientInfoAndConfig(ip, port) - .thenApply(cc -> vo.setClient(new ClusterClientStateVO().setClientConfig(cc))); - } - else { - return CompletableFuture.completedFuture(vo); - } - }).thenCompose(vo -> { - if (vo.getStateInfo().getServerAvailable()) { - return sentinelApiClient.fetchClusterServerBasicInfo(ip, port).thenApply(vo::setServer); - } - else { - return CompletableFuture.completedFuture(vo); - } - }); + .thenApply(e -> new ClusterUniversalStateVO().setStateInfo(e)) + .thenCompose(vo -> { + if (vo.getStateInfo().getClientAvailable()) { + return sentinelApiClient.fetchClusterClientInfoAndConfig(ip, port) + .thenApply(cc -> vo.setClient(new ClusterClientStateVO().setClientConfig(cc))); + } + else { + return CompletableFuture.completedFuture(vo); + } + }) + .thenCompose(vo -> { + if (vo.getStateInfo().getServerAvailable()) { + return sentinelApiClient.fetchClusterServerBasicInfo(ip, port).thenApply(vo::setServer); + } + else { + return CompletableFuture.completedFuture(vo); + } + }); } private boolean invalidTransportConfig(ServerTransportConfig transportConfig) { diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java index b7372b27..2cf15bbc 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java @@ -39,13 +39,18 @@ public final class AsyncUtils { } public static CompletableFuture> sequenceFuture(List> futures) { - return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenApply( - v -> futures.stream().map(AsyncUtils::getValue).filter(Objects::nonNull).collect(Collectors.toList())); + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> futures.stream() + .map(AsyncUtils::getValue) + .filter(Objects::nonNull) + .collect(Collectors.toList())); } public static CompletableFuture> sequenceSuccessFuture(List> futures) { - return CompletableFuture.supplyAsync(() -> futures.parallelStream().map(AsyncUtils::getValue) - .filter(Objects::nonNull).collect(Collectors.toList())); + return CompletableFuture.supplyAsync(() -> futures.parallelStream() + .map(AsyncUtils::getValue) + .filter(Objects::nonNull) + .collect(Collectors.toList())); } public static T getValue(CompletableFuture future) { diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java index a4cb6de1..de2ed0c5 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java @@ -45,10 +45,15 @@ public final class ClusterEntityUtils { String serverId = ip + '@' + stateVO.getCommandPort(); ClusterServerStateVO serverStateVO = stateVO.getState().getServer(); map.computeIfAbsent(serverId, - v -> new AppClusterServerStateWrapVO().setId(serverId).setIp(ip) - .setPort(serverStateVO.getPort()).setState(serverStateVO).setBelongToApp(true) - .setConnectedCount(serverStateVO.getConnection().stream() - .mapToInt(ConnectionGroupVO::getConnectedCount).sum())); + v -> new AppClusterServerStateWrapVO().setId(serverId) + .setIp(ip) + .setPort(serverStateVO.getPort()) + .setState(serverStateVO) + .setBelongToApp(true) + .setConnectedCount(serverStateVO.getConnection() + .stream() + .mapToInt(ConnectionGroupVO::getConnectedCount) + .sum())); tokenServerSet.add(ip + ":" + serverStateVO.getPort()); } } @@ -69,8 +74,11 @@ public final class ClusterEntityUtils { // We are not able to get the commandPort of foreign token server // directly. String serverId = String.format("%s:%d", serverIp, serverPort); - map.computeIfAbsent(serverId, v -> new AppClusterServerStateWrapVO().setId(serverId).setIp(serverIp) - .setPort(serverPort).setBelongToApp(false)); + map.computeIfAbsent(serverId, + v -> new AppClusterServerStateWrapVO().setId(serverId) + .setIp(serverIp) + .setPort(serverPort) + .setBelongToApp(false)); } } return new ArrayList<>(map.values()); @@ -89,8 +97,11 @@ public final class ClusterEntityUtils { String ip = stateVO.getIp(); String clientId = ip + '@' + stateVO.getCommandPort(); ClusterClientStateVO clientStateVO = stateVO.getState().getClient(); - map.computeIfAbsent(clientId, v -> new AppClusterClientStateWrapVO().setId(clientId).setIp(ip) - .setState(clientStateVO).setCommandPort(stateVO.getCommandPort())); + map.computeIfAbsent(clientId, + v -> new AppClusterClientStateWrapVO().setId(clientId) + .setIp(ip) + .setState(clientStateVO) + .setCommandPort(stateVO.getCommandPort())); } } return new ArrayList<>(map.values()); @@ -108,8 +119,11 @@ public final class ClusterEntityUtils { String serverAddress = getIp(ip); int port = stateVO.getState().getServer().getPort(); String targetAddress = serverAddress + ":" + port; - map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity().setBelongToApp(true) - .setMachineId(ip + '@' + stateVO.getCommandPort()).setIp(ip).setPort(port)); + map.computeIfAbsent(targetAddress, + v -> new ClusterGroupEntity().setBelongToApp(true) + .setMachineId(ip + '@' + stateVO.getCommandPort()) + .setIp(ip) + .setPort(port)); } } for (ClusterUniversalStatePairVO stateVO : list) { @@ -122,8 +136,11 @@ public final class ClusterEntityUtils { continue; } String targetAddress = targetServer + ":" + targetPort; - ClusterGroupEntity group = map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity() - .setBelongToApp(true).setMachineId(targetServer).setIp(targetServer).setPort(targetPort)); + ClusterGroupEntity group = map.computeIfAbsent(targetAddress, + v -> new ClusterGroupEntity().setBelongToApp(true) + .setMachineId(targetServer) + .setIp(targetServer) + .setPort(targetPort)); group.getClientSet().add(ip + '@' + stateVO.getCommandPort()); } } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java index 7c5be8e6..4bea237b 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java @@ -49,8 +49,9 @@ public class JobApiController { } if (XxlJobAdminConfig.getAdminConfig().getAccessToken() != null && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length() > 0 - && !XxlJobAdminConfig.getAdminConfig().getAccessToken() - .equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) { + && !XxlJobAdminConfig.getAdminConfig() + .getAccessToken() + .equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) { return new ReturnT(ReturnT.FAIL_CODE, "The access token is wrong."); } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java index 1b3fcf1e..e60ea1cc 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java @@ -7,6 +7,7 @@ import java.lang.annotation.Target; /** * 权限限制 + * * @author xuxueli 2015-12-12 18:29:02 */ @Target(ElementType.METHOD) diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java index 4c52796e..869eb1d3 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java @@ -49,8 +49,9 @@ public class EmailJobAlarm implements JobAlarm { } // email info - XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao() - .load(Integer.valueOf(info.getJobGroup())); + XxlJobGroup group = XxlJobAdminConfig.getAdminConfig() + .getXxlJobGroupDao() + .load(Integer.valueOf(info.getJobGroup())); String personal = I18nUtil.getString("admin_name_full"); String title = I18nUtil.getString("jobconf_monitor"); String content = MessageFormat.format(loadEmailJobAlarmTemplate(), diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java index 92e50d15..435ac1fe 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java @@ -47,8 +47,9 @@ public class XxlJobCompleter { // 1、handle success, to trigger child job String triggerChildMsg = null; if (XxlJobContext.HANDLE_CODE_SUCCESS == xxlJobLog.getHandleCode()) { - XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao() - .loadById(xxlJobLog.getJobId()); + XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig() + .getXxlJobInfoDao() + .loadById(xxlJobLog.getJobId()); if (xxlJobInfo != null && xxlJobInfo.getChildJobId() != null && xxlJobInfo.getChildJobId().trim().length() > 0) { triggerChildMsg = "

>>>>>>>>>>>" diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java index 530d6dbf..3a5dd759 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java @@ -30,9 +30,13 @@ public class ExecutorRouteBusyover extends ExecutorRouter { idleBeatResult = new ReturnT(ReturnT.FAIL_CODE, "" + e); } idleBeatResultSB.append((idleBeatResultSB.length() > 0) ? "

" : "") - .append(I18nUtil.getString("jobconf_idleBeat") + ":").append("
address:").append(address) - .append("
code:").append(idleBeatResult.getCode()).append("
msg:") - .append(idleBeatResult.getMsg()); + .append(I18nUtil.getString("jobconf_idleBeat") + ":") + .append("
address:") + .append(address) + .append("
code:") + .append(idleBeatResult.getCode()) + .append("
msg:") + .append(idleBeatResult.getMsg()); // beat success if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java index 0889e3d3..f6d81518 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java @@ -30,8 +30,13 @@ public class ExecutorRouteFailover extends ExecutorRouter { beatResult = new ReturnT(ReturnT.FAIL_CODE, "" + e); } beatResultSB.append((beatResultSB.length() > 0) ? "

" : "") - .append(I18nUtil.getString("jobconf_beat") + ":").append("
address:").append(address) - .append("
code:").append(beatResult.getCode()).append("
msg:").append(beatResult.getMsg()); + .append(I18nUtil.getString("jobconf_beat") + ":") + .append("
address:") + .append(address) + .append("
code:") + .append(beatResult.getCode()) + .append("
msg:") + .append(beatResult.getMsg()); // beat success if (beatResult.getCode() == ReturnT.SUCCESS_CODE) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java index 52abfe89..4c57b120 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java @@ -76,8 +76,9 @@ public class JobCompleteHelper { try { // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; Date losedTime = DateUtil.addMinutes(new Date(), -10); - List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .findLostJobIds(losedTime); + List losedJobIds = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findLostJobIds(losedTime); if (losedJobIds != null && losedJobIds.size() > 0) { for (Long logId : losedJobIds) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 79863a0d..dc7156b6 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -42,20 +42,23 @@ public class JobFailMonitorHelper { while (!toStop) { try { - List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .findFailJobLogIds(1000); + List failLogIds = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findFailJobLogIds(1000); if (failLogIds != null && !failLogIds.isEmpty()) { for (long failLogId : failLogIds) { // lock log - int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .updateAlarmStatus(failLogId, 0, -1); + int lockRet = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .updateAlarmStatus(failLogId, 0, -1); if (lockRet < 1) { continue; } XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); - XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao() - .loadById(log.getJobId()); + XxlJobInfo info = XxlJobAdminConfig.getAdminConfig() + .getXxlJobInfoDao() + .loadById(log.getJobId()); // 1、fail retry monitor if (log.getExecutorFailRetryCount() > 0) { @@ -72,16 +75,18 @@ public class JobFailMonitorHelper { // 2、fail alarm monitor int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 if (info != null) { - boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, - log); + boolean alarmResult = XxlJobAdminConfig.getAdminConfig() + .getJobAlarmer() + .alarm(info, log); newAlarmStatus = alarmResult ? 2 : 3; } else { newAlarmStatus = 1; } - XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, - newAlarmStatus); + XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .updateAlarmStatus(failLogId, -1, newAlarmStatus); } } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java index d2c7c38e..93b1b089 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java @@ -70,8 +70,9 @@ public class JobLogReportHelper { xxlJobLogReport.setSucCount(0); xxlJobLogReport.setFailCount(0); - Map triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .findLogReport(todayFrom, todayTo); + Map triggerCountMap = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findLogReport(todayFrom, todayTo); if (triggerCountMap != null && triggerCountMap.size() > 0) { int triggerDayCount = triggerCountMap.containsKey("triggerDayCount") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))) : 0; @@ -89,8 +90,9 @@ public class JobLogReportHelper { } // do refresh - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao() - .update(xxlJobLogReport); + int ret = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogReportDao() + .update(xxlJobLogReport); if (ret < 1) { XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport); } @@ -120,8 +122,9 @@ public class JobLogReportHelper { // clean expired log List logIds = null; do { - logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, - clearBeforeTime, 0, 1000); + logIds = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findClearLogIds(0, 0, clearBeforeTime, 0, 1000); if (logIds != null && logIds.size() > 0) { XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds); } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java index 27d39219..967b4d0a 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -60,21 +60,24 @@ public class JobRegistryHelper { while (!toStop) { try { // auto registry group - List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao() - .findByAddressType(0); + List groupList = XxlJobAdminConfig.getAdminConfig() + .getXxlJobGroupDao() + .findByAddressType(0); if (groupList != null && !groupList.isEmpty()) { // remove dead address (admin/executor) - List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao() - .findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); + List ids = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); if (ids != null && ids.size() > 0) { XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); } // fresh online address (admin/executor) HashMap> appAddressMap = new HashMap>(); - List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao() - .findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + List list = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); if (list != null) { for (XxlJobRegistry item : list) { if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { @@ -165,13 +168,15 @@ public class JobRegistryHelper { registryOrRemoveThreadPool.execute(new Runnable() { @Override public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate( - registryParam.getRegistryGroup(), registryParam.getRegistryKey(), - registryParam.getRegistryValue(), new Date()); - if (ret < 1) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave( - registryParam.getRegistryGroup(), registryParam.getRegistryKey(), + int ret = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + if (ret < 1) { + XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), + registryParam.getRegistryValue(), new Date()); // fresh freshGroupRegistryInfo(registryParam); @@ -195,9 +200,10 @@ public class JobRegistryHelper { registryOrRemoveThreadPool.execute(new Runnable() { @Override public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete( - registryParam.getRegistryGroup(), registryParam.getRegistryKey(), - registryParam.getRegistryValue()); + int ret = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), + registryParam.getRegistryValue()); if (ret > 0) { // fresh freshGroupRegistryInfo(registryParam); diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java index 3d98bb5c..d4f97d83 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java @@ -87,8 +87,9 @@ public class JobScheduleHelper { // 1、pre read long nowTime = System.currentTimeMillis(); - List scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao() - .scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount); + List scheduleList = XxlJobAdminConfig.getAdminConfig() + .getXxlJobInfoDao() + .scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount); if (scheduleList != null && scheduleList.size() > 0) { // 2、push time-ring for (XxlJobInfo jobInfo : scheduleList) { @@ -101,7 +102,7 @@ public class JobScheduleHelper { // 1、misfire match MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum - .match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); + .match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) { // FIRE_ONCE_NOW 》 trigger JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, @@ -228,7 +229,7 @@ public class JobScheduleHelper { // pre-read period: success > scan each second; fail > skip // this period; TimeUnit.MILLISECONDS - .sleep((preReadSuc ? 1000 : PRE_READ_MS) - System.currentTimeMillis() % 1000); + .sleep((preReadSuc ? 1000 : PRE_READ_MS) - System.currentTimeMillis() % 1000); } catch (InterruptedException e) { if (!scheduleThreadToStop) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 2dd817ba..e0b660f1 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -66,7 +66,7 @@ public class XxlJobTrigger { } } if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == ExecutorRouteStrategyEnum - .match(jobInfo.getExecutorRouteStrategy(), null) && group.getRegistryList() != null + .match(jobInfo.getExecutorRouteStrategy(), null) && group.getRegistryList() != null && !group.getRegistryList().isEmpty() && shardingParam == null) { for (int i = 0; i < group.getRegistryList().size(); i++) { processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size()); @@ -106,7 +106,7 @@ public class XxlJobTrigger { ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION); // block strategy ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum - .match(jobInfo.getExecutorRouteStrategy(), null); // route strategy + .match(jobInfo.getExecutorRouteStrategy(), null); // route strategy String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) ? String.valueOf(index).concat("/").concat(String.valueOf(total)) : null; @@ -169,31 +169,45 @@ public class XxlJobTrigger { // 5、collection trigger info StringBuffer triggerMsgSb = new StringBuffer(); triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append(":").append(triggerType.getTitle()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":") - .append(IpUtil.getIp()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":") - .append((group.getAddressType() == 0) ? I18nUtil.getString("jobgroup_field_addressType_0") - : I18nUtil.getString("jobgroup_field_addressType_1")); - triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":") - .append(group.getRegistryList()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":") - .append(executorRouteStrategyEnum.getTitle()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobconf_trigger_admin_adress")) + .append(":") + .append(IpUtil.getIp()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobconf_trigger_exe_regtype")) + .append(":") + .append((group.getAddressType() == 0) ? I18nUtil.getString("jobgroup_field_addressType_0") + : I18nUtil.getString("jobgroup_field_addressType_1")); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobconf_trigger_exe_regaddress")) + .append(":") + .append(group.getRegistryList()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")) + .append(":") + .append(executorRouteStrategyEnum.getTitle()); if (shardingParam != null) { triggerMsgSb.append("(" + shardingParam + ")"); } - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":") - .append(blockStrategy.getTitle()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_timeout")).append(":") - .append(jobInfo.getExecutorTimeout()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":") - .append(finalFailRetryCount); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")) + .append(":") + .append(blockStrategy.getTitle()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_timeout")) + .append(":") + .append(jobInfo.getExecutorTimeout()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")) + .append(":") + .append(finalFailRetryCount); triggerMsgSb - .append("

>>>>>>>>>>>" - + I18nUtil.getString("jobconf_trigger_run") + "<<<<<<<<<<<
") - .append((routeAddressResult != null && routeAddressResult.getMsg() != null) - ? routeAddressResult.getMsg() + "

" : "") - .append(triggerResult.getMsg() != null ? triggerResult.getMsg() : ""); + .append("

>>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_run") + + "<<<<<<<<<<<
") + .append((routeAddressResult != null && routeAddressResult.getMsg() != null) + ? routeAddressResult.getMsg() + "

" : "") + .append(triggerResult.getMsg() != null ? triggerResult.getMsg() : ""); // 6、save log trigger-info jobLog.setExecutorAddress(address); diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java index 82e63c9d..7ee1830d 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java @@ -17,7 +17,7 @@ public class FtlUtil { private static Logger logger = LoggerFactory.getLogger(FtlUtil.class); private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS) - .build(); // BeansWrapper.getDefaultInstance(); + .build(); // BeansWrapper.getDefaultInstance(); public static TemplateHashModel generateStaticModel(String packageName) { try { diff --git a/pom.xml b/pom.xml index 16b1ed92..90a529f6 100755 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ username password 4.9.9 - 0.0.35 + 0.0.38
-- Gitee From 86c3dc2c10408015160f6fd67d611e3f30bef171 Mon Sep 17 00:00:00 2001 From: jumuning <840256574@qq.com> Date: Thu, 23 Feb 2023 17:27:15 +0800 Subject: [PATCH 033/238] =?UTF-8?q?=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/EnablePigResourceServer.java | 4 +-- .../PigOAuthRequestInterceptor.java | 2 +- .../PigResourceServerAutoConfiguration.java | 12 +++++++ .../feign/PigFeignClientConfiguration.java | 35 ------------------- 4 files changed, 14 insertions(+), 39 deletions(-) rename pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/{feign => component}/PigOAuthRequestInterceptor.java (97%) delete mode 100755 pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java index 806cbea8..53bac67b 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java @@ -18,7 +18,6 @@ package com.pig4cloud.pig.common.security.annotation; import com.pig4cloud.pig.common.security.component.PigResourceServerAutoConfiguration; import com.pig4cloud.pig.common.security.component.PigResourceServerConfiguration; -import com.pig4cloud.pig.common.security.feign.PigFeignClientConfiguration; import org.springframework.context.annotation.Import; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; @@ -35,8 +34,7 @@ import java.lang.annotation.*; @Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @EnableGlobalMethodSecurity(prePostEnabled = true) -@Import({ PigResourceServerAutoConfiguration.class, PigResourceServerConfiguration.class, - PigFeignClientConfiguration.class }) +@Import({ PigResourceServerAutoConfiguration.class, PigResourceServerConfiguration.class}) public @interface EnablePigResourceServer { } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigOAuthRequestInterceptor.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java similarity index 97% rename from pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigOAuthRequestInterceptor.java rename to pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java index 597ac362..bc0aece4 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigOAuthRequestInterceptor.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pig.common.security.feign; +package com.pig4cloud.pig.common.security.component; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java index 3aac75ac..9016c4dd 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java @@ -17,12 +17,14 @@ package com.pig4cloud.pig.common.security.component; import com.fasterxml.jackson.databind.ObjectMapper; +import feign.RequestInterceptor; import lombok.RequiredArgsConstructor; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; +import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; /** * @author lengleng @@ -73,4 +75,14 @@ public class PigResourceServerAutoConfiguration { return new PigCustomOpaqueTokenIntrospector(authorizationService); } + /** + * 注入 oauth2 feign token 增强 + * @param tokenResolver token获取处理器 + * @return 拦截器 + */ + @Bean + public RequestInterceptor oauthRequestInterceptor(BearerTokenResolver tokenResolver) { + return new PigOAuthRequestInterceptor(tokenResolver); + } + } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java deleted file mode 100755 index a66b52d0..00000000 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.common.security.feign; - -import feign.RequestInterceptor; -import org.springframework.context.annotation.Bean; -import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; - -public class PigFeignClientConfiguration { - - /** - * 注入 oauth2 feign token 增强 - * @param tokenResolver token获取处理器 - * @return 拦截器 - */ - @Bean - public RequestInterceptor oauthRequestInterceptor(BearerTokenResolver tokenResolver) { - return new PigOAuthRequestInterceptor(tokenResolver); - } - -} -- Gitee From 52cd93864311cdec86a649972fbaeaece65ae910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=90=91=E6=B3=A2?= <18369656203@163.com> Date: Fri, 24 Feb 2023 03:42:57 +0000 Subject: [PATCH 034/238] up spring boot 2.7 closed #I6HBI9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 杨向波 <18369656203@163.com> --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d0a9e050..9fea15f7 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ | 依赖 | 版本 | | ---------------------- |------------| -| Spring Boot | 2.7.7 | +| Spring Boot | 2.7.9 | | Spring Cloud | 2021.0.5 | | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.1 | diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 9cbc23c4..84176585 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -15,7 +15,7 @@ ${project.version} - 2.7.8 + 2.7.9 UTF-8 2.17.1 1.8 diff --git a/pom.xml b/pom.xml index 90a529f6..7bd86d78 100755 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.8 + 2.7.9 2021.0.5 2021.0.4.0 UTF-8 -- Gitee From dcbfdec9f06cfddaa23a184d27793a5f0046c120 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Fri, 24 Feb 2023 03:52:04 +0000 Subject: [PATCH 035/238] Spring Boot 2.7.9 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90a529f6..7bd86d78 100755 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.8 + 2.7.9 2021.0.5 2021.0.4.0 UTF-8 -- Gitee From 6816eac6aa2728c45575e4068ad7775f22a78e0d Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 24 Feb 2023 13:13:46 +0800 Subject: [PATCH 036/238] :art: Improving structure / format of the code. spring-format --- .../pig/common/security/annotation/EnablePigResourceServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java index 53bac67b..3dbbd0c6 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java @@ -34,7 +34,7 @@ import java.lang.annotation.*; @Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @EnableGlobalMethodSecurity(prePostEnabled = true) -@Import({ PigResourceServerAutoConfiguration.class, PigResourceServerConfiguration.class}) +@Import({ PigResourceServerAutoConfiguration.class, PigResourceServerConfiguration.class }) public @interface EnablePigResourceServer { } -- Gitee From a4c3c24faff55c6e6b6af679c2292f0a8be7350f Mon Sep 17 00:00:00 2001 From: ipod <10160846+ioy-op@user.noreply.gitee.com> Date: Tue, 28 Feb 2023 06:39:25 +0000 Subject: [PATCH 037/238] :up: close #I6HOX7 up spring-cloud 2021.0.6 Signed-off-by: ipod <10160846+ioy-op@user.noreply.gitee.com> --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9fea15f7..d92bac89 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ | 依赖 | 版本 | | ---------------------- |------------| | Spring Boot | 2.7.9 | -| Spring Cloud | 2021.0.5 | +| Spring Cloud | 2021.0.6 | | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | diff --git a/pom.xml b/pom.xml index 7bd86d78..f227978d 100755 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.7.9 - 2021.0.5 + 2021.0.6 2021.0.4.0 UTF-8 1.8 -- Gitee From e7564562adec6415e9182c0c88049bcb98f61d62 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 28 Feb 2023 14:48:05 +0800 Subject: [PATCH 038/238] =?UTF-8?q?:boom:=20=E8=AF=B7=E6=B3=A8=E6=84=8F?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20nacos=20=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6SQL=20=EF=BC=8C=20support=20jasypt=203.0.5=20close=20#?= =?UTF-8?q?I6ID53?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig_config.sql | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/pig_config.sql b/db/pig_config.sql index 44137fdb..3a404bb0 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -37,7 +37,7 @@ CREATE TABLE `config_info` ( -- Records of config_info -- ---------------------------- BEGIN; -INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', 'ef637d9ffc033db98d10f628cfec967e', '2022-05-08 12:10:37', '2023-01-28 14:13:58', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pig\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', '81f8bae4b8125fd198704f797268c6b5', '2022-05-08 12:10:37', '2023-02-28 14:45:23', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '74f53b71c7799aa754da75662378b93c', '2022-05-08 12:10:37', '2022-06-04 14:15:35', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'cf786dbe3b07074fc187bf2eab3266b1', '2022-05-08 12:10:37', '2023-01-28 14:05:36', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', '000988cf0102382d3f23df35027b47fd', '2022-05-08 12:10:37', '2022-06-07 14:00:11', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); diff --git a/pom.xml b/pom.xml index f227978d..67771d97 100755 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 2.3 3.1 1.10 - 2.1.0 + 3.0.5 3.0.0 3.0.3 2.3.1 -- Gitee From 6dbabd2f1d1b3720d0c002d3e508f7db05b97625 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 3 Mar 2023 16:19:31 +0800 Subject: [PATCH 039/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20close=20#I6?= =?UTF-8?q?IL1L=20=E6=96=B9=E6=B3=95=E5=90=8D=E5=91=BD=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E9=97=AE=E9=A2=98=20=E7=BD=AE=E9=A1=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/admin/controller/UserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java index ec4be7a1..28b47d7e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java @@ -122,8 +122,8 @@ public class UserController { * @return */ @Inner(false) - @GetMapping("/check/exsit") - public R isExsit(UserDTO userDTO) { + @GetMapping("/check/exist") + public R isExist(UserDTO userDTO) { List sysUserList = userService.list(new QueryWrapper<>(userDTO)); if (CollUtil.isNotEmpty(sysUserList)) { return R.ok(Boolean.TRUE, MsgUtils.getMessage(ErrorCodes.SYS_USER_EXISTING)); -- Gitee From bf3a840dbff8eb3c8fa4c7eda787ec0935647318 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 4 Mar 2023 23:07:13 +0800 Subject: [PATCH 040/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20close=20#I6?= =?UTF-8?q?IL1L=20=E6=96=B9=E6=B3=95=E5=90=8D=E5=91=BD=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E9=97=AE=E9=A2=98=20=E7=BD=AE=E9=A1=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index 1dc22a87..136739bd 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -300,10 +300,10 @@ public class SysUserServiceImpl extends ServiceImpl impl for (UserExcelVO excel : excelVOList) { Set errorMsg = new HashSet<>(); // 校验用户名是否存在 - boolean exsitUserName = userList.stream() + boolean existUserName = userList.stream() .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); - if (exsitUserName) { + if (existUserName) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); } -- Gitee From 3485586c19441c09040a155ca13f372f3c68a4e6 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 4 Mar 2023 23:10:38 +0800 Subject: [PATCH 041/238] =?UTF-8?q?:bookmark:=20:bookmark:=20:bookmark:=20?= =?UTF-8?q?v3.6.6=20=E5=BC=95=E5=85=A5=20jasypt=203.x=20=E6=B3=A8=E6=84=8F?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20pig=5Fconfig.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-auth/pom.xml | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- pig-common/pig-common-core/pom.xml | 2 +- pig-common/pig-common-datasource/pom.xml | 2 +- pig-common/pig-common-feign/pom.xml | 2 +- pig-common/pig-common-job/pom.xml | 2 +- pig-common/pig-common-log/pom.xml | 2 +- pig-common/pig-common-mybatis/pom.xml | 2 +- pig-common/pig-common-seata/pom.xml | 2 +- pig-common/pig-common-security/pom.xml | 2 +- pig-common/pig-common-swagger/pom.xml | 2 +- pig-common/pig-common-xss/pom.xml | 2 +- pig-common/pom.xml | 2 +- pig-gateway/pom.xml | 2 +- pig-register/pom.xml | 2 +- pig-upms/pig-upms-api/pom.xml | 2 +- pig-upms/pig-upms-biz/pom.xml | 2 +- pig-upms/pom.xml | 2 +- pig-visual/pig-codegen/pom.xml | 2 +- pig-visual/pig-monitor/pom.xml | 2 +- pig-visual/pig-sentinel-dashboard/pom.xml | 2 +- pig-visual/pig-xxl-job-admin/pom.xml | 2 +- pig-visual/pom.xml | 2 +- pom.xml | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index bb9dc812..c4fb3424 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.5 + 3.6.6 pig-auth diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 84176585..89a18939 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common-bom - 3.6.5 + 3.6.6 pom pig-common-bom diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index 16b84c5e..8619dd42 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-core diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index ee227c82..a993c050 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -21,7 +21,7 @@ pig-common com.pig4cloud - 3.6.5 + 3.6.6 4.0.0 diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 8e133869..481aedb7 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 4.0.0 diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 0ab97cbf..2f260ace 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-job diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index aa1c2046..e124c817 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-log diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index dd7d6b34..04cab5b2 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-mybatis diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index 09a45976..acaa0879 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index ee8f4faa..db14760c 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-security diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index f585a4c3..28c55dd5 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 387742b9..254eadf8 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.6.5 + 3.6.6 pig-common-xss diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 60616c98..619b5fa6 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.5 + 3.6.6 pig-common diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 6ce35adf..a15a3952 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.5 + 3.6.6 pig-gateway diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 1dede07a..11a17fbd 100755 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -18,7 +18,7 @@ com.pig4cloud pig - 3.6.5 + 3.6.6 pig-register diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index d924b07d..0cb6dd89 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.5 + 3.6.6 pig-upms-api diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index 2aac59cc..df4d2cc6 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.5 + 3.6.6 pig-upms-biz diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index 1b9cd02e..e69d83ce 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.5 + 3.6.6 pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index aa653941..7fc08956 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.6.5 + 3.6.6 pig-codegen diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index 4145a511..9c587b18 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.6.5 + 3.6.6 pig-monitor diff --git a/pig-visual/pig-sentinel-dashboard/pom.xml b/pig-visual/pig-sentinel-dashboard/pom.xml index 0840d161..46307f60 100755 --- a/pig-visual/pig-sentinel-dashboard/pom.xml +++ b/pig-visual/pig-sentinel-dashboard/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-visual - 3.6.5 + 3.6.6 pig-sentinel-dashboard diff --git a/pig-visual/pig-xxl-job-admin/pom.xml b/pig-visual/pig-xxl-job-admin/pom.xml index ee359efc..f49f2dac 100644 --- a/pig-visual/pig-xxl-job-admin/pom.xml +++ b/pig-visual/pig-xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.pig4cloud pig-visual - 3.6.5 + 3.6.6 pig-xxl-job-admin diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 92ae2b61..323bf7db 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.5 + 3.6.6 pig-visual diff --git a/pom.xml b/pom.xml index 67771d97..d3a2fcc0 100755 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig ${project.artifactId} - 3.6.5 + 3.6.6 pom https://www.pig4cloud.com -- Gitee From b7e6a670ce5932f0f41932291b0d2351708ffaa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Tue, 7 Mar 2023 09:14:31 +0800 Subject: [PATCH 042/238] =?UTF-8?q?:bug:=20HashMap=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E5=BA=94=E8=AF=A5=E6=98=AF2=E7=9A=84?= =?UTF-8?q?=E6=8C=87=E6=95=B0=EF=BC=8C=E5=A6=82=EF=BC=9A2=E3=80=814?= =?UTF-8?q?=E3=80=818=E3=80=8116=20...=EF=BC=8C=E9=BB=98=E8=AE=A4=E8=BE=BE?= =?UTF-8?q?=E5=88=B075%=E6=97=B6=E8=BF=9B=E8=A1=8C=E6=89=A9=E5=AE=B9?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysDeptServiceImpl.java | 2 +- .../dashboard/client/SentinelApiClient.java | 25 ++++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java index b141b4e3..319fc6bd 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java @@ -162,7 +162,7 @@ public class SysDeptServiceImpl extends ServiceImpl impl treeNode.setName(dept.getName()); treeNode.setWeight(dept.getSortOrder()); // 扩展属性 - Map extra = new HashMap<>(4); + Map extra = new HashMap<>(2); extra.put("createTime", dept.getCreateTime()); treeNode.setExtra(extra); return treeNode; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java index 3cac7f99..821727f5 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java @@ -371,7 +371,7 @@ public class SentinelApiClient { AssertUtil.isTrue(port > 0, "Bad machine port"); Map params = null; if (StringUtil.isNotEmpty(type)) { - params = new HashMap<>(1); + params = new HashMap<>(2); params.put("type", type); } return executeCommand(ip, port, api, params, false).thenApply(json -> JSON.parseArray(json, ruleType)); @@ -382,11 +382,6 @@ public class SentinelApiClient { try { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); - Map params = null; - if (StringUtil.isNotEmpty(type)) { - params = new HashMap<>(1); - params.put("type", type); - } return fetchItemsAsync(ip, port, api, type, ruleType).get(); } catch (InterruptedException | ExecutionException e) { @@ -412,7 +407,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); String data = JSON.toJSONString(entities.stream().map(r -> r.toRule()).collect(Collectors.toList())); - Map params = new HashMap<>(2); + Map params = new HashMap<>(4); params.put("type", type); params.put("data", data); String result = executeCommand(app, ip, port, SET_RULES_PATH, params, true).get(); @@ -441,7 +436,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); String data = JSON.toJSONString(entities.stream().map(r -> r.toRule()).collect(Collectors.toList())); - Map params = new HashMap<>(2); + Map params = new HashMap<>(4); params.put("type", type); params.put("data", data); return executeCommand(app, ip, port, SET_RULES_PATH, params, true).thenCompose(r -> { @@ -548,7 +543,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(app, "Bad app name"); AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("type", AUTHORITY_TYPE); List rules = fetchRules(ip, port, AUTHORITY_TYPE, AuthorityRule.class); return Optional.ofNullable(rules) @@ -617,7 +612,7 @@ public class SentinelApiClient { try { String data = JSON .toJSONString(rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())); - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", data); return executeCommand(app, ip, port, SET_PARAM_RULE_PATH, params, true).thenCompose(e -> { if (CommandConstants.MSG_SUCCESS.equals(e)) { @@ -656,7 +651,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("mode", String.valueOf(mode)); return executeCommand(ip, port, MODIFY_CLUSTER_MODE_PATH, params, false).thenCompose(e -> { if (CommandConstants.MSG_SUCCESS.equals(e)) { @@ -694,7 +689,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", JSON.toJSONString(config)); return executeCommand(app, ip, port, MODIFY_CLUSTER_CLIENT_CONFIG_PATH, params, true).thenCompose(e -> { if (CommandConstants.MSG_SUCCESS.equals(e)) { @@ -718,7 +713,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", JSON.toJSONString(config)); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH, params, true) .thenCompose(e -> { @@ -743,7 +738,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(2); + Map params = new HashMap<>(4); params.put("port", config.getPort().toString()); params.put("idleSeconds", config.getIdleSeconds().toString()); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH, params, false) @@ -768,7 +763,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", JSON.toJSONString(set)); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH, params, true) .thenCompose(e -> { -- Gitee From 02bcacfa53a72a6e0eb1954252a6aeff6c8a2b9f Mon Sep 17 00:00:00 2001 From: Lht Date: Tue, 7 Mar 2023 20:22:31 +0800 Subject: [PATCH 043/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.14 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d92bac89..dc6e0019 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.12 | +| hutool | 5.8.14 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 89a18939..413c7f18 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.12 + 5.8.14 2.7.4 1.8.4 -- Gitee From 43a9089f0ed05e29d189ca5d63b6e1f82246607d Mon Sep 17 00:00:00 2001 From: linck Date: Wed, 8 Mar 2023 17:51:23 +0800 Subject: [PATCH 044/238] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/pig4cloud/pig/admin/controller/DictController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java index da5ab018..f2fbaa5f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java @@ -81,7 +81,7 @@ public class DictController { /** * 通过字典类型查找字典 - * @param type 类型 + * @param key 类型 * @return 同类型字典 */ @GetMapping("/key/{key}") -- Gitee From 677f8e072aee8ba8aaccf19fe5df7f1a1e962313 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 9 Mar 2023 11:49:21 +0800 Subject: [PATCH 045/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84retry=20=E7=9B=B8=E5=85=B3=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-common/pig-common-feign/pom.xml | 1 + .../feign/PigFeignAutoConfiguration.java | 17 ++++++-- .../feign/PigFeignRetryAutoConfiguration.java | 40 +++++++++++++++++++ .../common/feign/retry/FeignRetryAspect.java | 2 - ...ot.autoconfigure.AutoConfiguration.imports | 1 + 5 files changed, 56 insertions(+), 5 deletions(-) create mode 100755 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 481aedb7..16aa0632 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -67,6 +67,7 @@ org.springframework.retry spring-retry + true diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index d550babc..ff9fa669 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -20,11 +20,11 @@ import com.alibaba.cloud.sentinel.feign.SentinelFeignAutoConfiguration; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pig.common.feign.retry.FeignRetryAspect; import com.pig4cloud.pig.common.feign.sentinel.ext.PigSentinelFeign; import com.pig4cloud.pig.common.feign.sentinel.handle.PigUrlBlockHandler; import com.pig4cloud.pig.common.feign.sentinel.parser.PigHeaderRequestOriginParser; import feign.Feign; +import okhttp3.OkHttpClient; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -32,6 +32,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; +import java.util.concurrent.TimeUnit; + /** * sentinel 配置 * @@ -62,9 +64,18 @@ public class PigFeignAutoConfiguration { return new PigHeaderRequestOriginParser(); } + /** + * OkHttp 客户端配置 + * @return OkHttp 客户端配 + */ @Bean - public FeignRetryAspect feignRetryAspect() { - return new FeignRetryAspect(); + public OkHttpClient okHttpClient() { + return new OkHttpClient.Builder().retryOnConnectionFailure(false) // 是否开启缓存 + .connectTimeout(30L, TimeUnit.SECONDS) // 连接超时时间 + .readTimeout(30L, TimeUnit.SECONDS) // 读取超时时间 + .writeTimeout(30L, TimeUnit.SECONDS) + .followRedirects(true) // 是否允许重定向 + .build(); } } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java new file mode 100755 index 00000000..413c35f7 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pig.common.feign; + +import com.pig4cloud.pig.common.feign.retry.FeignRetryAspect; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.retry.support.RetryTemplate; + +/** + * 重试配置 + * + * @author lengleng + * @date 2023年03月09日 + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnClass(RetryTemplate.class) +public class PigFeignRetryAutoConfiguration { + + @Bean + public FeignRetryAspect feignRetryAspect() { + return new FeignRetryAspect(); + } + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java index a1a33311..3119b7c0 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java @@ -13,7 +13,6 @@ import org.springframework.retry.backoff.ExponentialBackOffPolicy; import org.springframework.retry.backoff.FixedBackOffPolicy; import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.support.RetryTemplate; -import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.HashMap; @@ -28,7 +27,6 @@ import java.util.Map; */ @Slf4j @Aspect -@Component public class FeignRetryAspect { @Around("@annotation(feignRetry)") diff --git a/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index caa9f52f..4531157b 100644 --- a/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,4 @@ com.pig4cloud.pig.common.feign.PigFeignAutoConfiguration +com.pig4cloud.pig.common.feign.PigFeignRetryAutoConfiguration com.pig4cloud.pig.common.feign.sentinel.SentinelAutoConfiguration com.pig4cloud.pig.common.feign.sentinel.handle.GlobalBizExceptionHandler -- Gitee From 5a79ed742eb09938f46c39ac3ee4c5dae2620461 Mon Sep 17 00:00:00 2001 From: linck Date: Thu, 9 Mar 2023 12:25:08 +0800 Subject: [PATCH 046/238] =?UTF-8?q?=E4=BF=AE=E6=94=B9Controller=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=EF=BC=8C=E5=A2=9E=E5=8A=A0Sys=E5=89=8D=E7=BC=80?= =?UTF-8?q?=EF=BC=8C=E4=B8=8EService=E5=92=8CMapper=E7=B1=BB=E5=90=8D?= =?UTF-8?q?=E8=A7=84=E5=88=99=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/{DeptController.java => SysDeptController.java} | 2 +- .../controller/{DictController.java => SysDictController.java} | 2 +- .../controller/{FileController.java => SysFileController.java} | 2 +- .../controller/{LogController.java => SysLogController.java} | 2 +- .../controller/{MenuController.java => SysMenuController.java} | 2 +- ...ailsController.java => SysOauthClientDetailsController.java} | 2 +- .../controller/{PostController.java => SysPostController.java} | 2 +- ...PublicParamController.java => SysPublicParamController.java} | 2 +- .../{RegisterController.java => SysRegisterController.java} | 2 +- .../controller/{RoleController.java => SysRoleController.java} | 2 +- .../controller/{UserController.java => SysUserController.java} | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{DeptController.java => SysDeptController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{DictController.java => SysDictController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{FileController.java => SysFileController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{LogController.java => SysLogController.java} (98%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{MenuController.java => SysMenuController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{OauthClientDetailsController.java => SysOauthClientDetailsController.java} (98%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{PostController.java => SysPostController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{PublicParamController.java => SysPublicParamController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{RegisterController.java => SysRegisterController.java} (97%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{RoleController.java => SysRoleController.java} (99%) rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{UserController.java => SysUserController.java} (99%) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DeptController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DeptController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java index 23bd6dca..3e7df3a0 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DeptController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java @@ -45,7 +45,7 @@ import java.util.List; @RequestMapping("/dept") @Tag(name = "部门管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class DeptController { +public class SysDeptController { private final SysDeptService sysDeptService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index f2fbaa5f..c9b10d1c 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -52,7 +52,7 @@ import java.util.List; @RequestMapping("/dict") @Tag(name = "字典管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class DictController { +public class SysDictController { private final SysDictItemService sysDictItemService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java index 2e327244..59ed9868 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java @@ -51,7 +51,7 @@ import javax.servlet.http.HttpServletResponse; @RequestMapping("/sys-file") @Tag(name = "文件管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class FileController { +public class SysFileController { private final SysFileService sysFileService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/LogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java similarity index 98% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/LogController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index ff8c7f25..f33d031d 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/LogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -46,7 +46,7 @@ import java.util.List; @RequestMapping("/log") @Tag(name = "日志管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class LogController { +public class SysLogController { private final SysLogService sysLogService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java index 0db7ba43..6b9e057e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java @@ -44,7 +44,7 @@ import java.util.stream.Collectors; @RequestMapping("/menu") @Tag(name = "菜单管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class MenuController { +public class SysMenuController { private final SysMenuService sysMenuService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java similarity index 98% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java index 52ec3bc8..d01aad33 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java @@ -47,7 +47,7 @@ import java.util.List; @RequestMapping("/client") @Tag(name = "客户端管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class OauthClientDetailsController { +public class SysOauthClientDetailsController { private final SysOauthClientDetailsService sysOauthClientDetailsService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java index e2ed6c0e..b8bffb48 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java @@ -46,7 +46,7 @@ import java.util.List; @RequestMapping("/post") @Tag(name = "岗位管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class PostController { +public class SysPostController { private final SysPostService sysPostService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java index d6be5790..b3975718 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java @@ -44,7 +44,7 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/param") @Tag(name = "公共参数配置") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class PublicParamController { +public class SysPublicParamController { private final SysPublicParamService sysPublicParamService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RegisterController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java similarity index 97% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RegisterController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java index a5a0ab49..8ee36fec 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RegisterController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/register") @RequiredArgsConstructor @ConditionalOnProperty(name = "register.user", matchIfMissing = true) -public class RegisterController { +public class SysRegisterController { private final SysUserService userService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java index 570ac8c6..fc657136 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java @@ -48,7 +48,7 @@ import java.util.List; @RequestMapping("/role") @Tag(name = "角色管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class RoleController { +public class SysRoleController { private final SysRoleService sysRoleService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java index 28b47d7e..ae65ff8f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java @@ -58,7 +58,7 @@ import java.util.Set; @RequestMapping("/user") @Tag(name = "用户管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class UserController { +public class SysUserController { private final SysUserService userService; -- Gitee From b7d1f7eccf8d3c1bfd6cd3ab3ae466493f24d0bc Mon Sep 17 00:00:00 2001 From: linck Date: Fri, 10 Mar 2023 17:50:19 +0800 Subject: [PATCH 047/238] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84BeanUtils.copyProperties=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/admin/service/impl/SysDeptServiceImpl.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java index 319fc6bd..ade640ef 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java @@ -29,7 +29,6 @@ import com.pig4cloud.pig.admin.service.SysDeptRelationService; import com.pig4cloud.pig.admin.service.SysDeptService; import com.pig4cloud.pig.common.security.util.SecurityUtils; import lombok.RequiredArgsConstructor; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,10 +57,8 @@ public class SysDeptServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) public Boolean saveDept(SysDept dept) { - SysDept sysDept = new SysDept(); - BeanUtils.copyProperties(dept, sysDept); - this.save(sysDept); - sysDeptRelationService.saveDeptRelation(sysDept); + this.save(dept); + sysDeptRelationService.saveDeptRelation(dept); return Boolean.TRUE; } -- Gitee From d2dff1cf9f2dca3b7b614a1479b8a46d8626ee0b Mon Sep 17 00:00:00 2001 From: Lht Date: Fri, 10 Mar 2023 18:20:35 +0800 Subject: [PATCH 048/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.15 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dc6e0019..7cb0b042 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ | Spring Cloud Alibaba | 2021.0.4.0 | | Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.14 | +| hutool | 5.8.15 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 413c7f18..2bad618b 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.14 + 5.8.15 2.7.4 1.8.4 -- Gitee From b4a36f6a1b369fd60d252623e50274ffbcf28e01 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 14 Mar 2023 13:46:13 +0800 Subject: [PATCH 049/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20close=20#I6?= =?UTF-8?q?L95T=20=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86=E6=97=A0ip=E5=92=8C?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PigAuthenticationFailureEventHandler.java | 3 +++ .../PigAuthenticationSuccessEventHandler.java | 2 ++ pig-common/pig-common-log/pom.xml | 4 ++++ .../pig/common/log/util/SysLogUtils.java | 22 +++++++++++++++++++ .../PigCustomOpaqueTokenIntrospector.java | 9 +++++++- .../pig/common/security/service/PigUser.java | 4 +++- pom.xml | 9 -------- 7 files changed, 42 insertions(+), 11 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java index a12b2a99..979282e1 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java @@ -23,6 +23,7 @@ import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.core.util.WebUtils; import com.pig4cloud.pig.common.log.event.SysLogEvent; import com.pig4cloud.pig.common.log.util.LogTypeEnum; import com.pig4cloud.pig.common.log.util.SysLogUtils; @@ -75,6 +76,8 @@ public class PigAuthenticationFailureEventHandler implements AuthenticationFailu Long endTime = System.currentTimeMillis(); logVo.setTime(endTime - startTime); } + + logVo.setServiceId(WebUtils.getClientId()); logVo.setCreateBy(username); logVo.setUpdateBy(username); SpringContextHolder.publishEvent(new SysLogEvent(logVo)); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java index b0e04323..09e6f01f 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java @@ -84,6 +84,8 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce Long endTime = System.currentTimeMillis(); logVo.setTime(endTime - startTime); } + + logVo.setServiceId(accessTokenAuthentication.getRegisteredClient().getClientId()); logVo.setCreateBy(userInfo.getName()); logVo.setUpdateBy(userInfo.getName()); SpringContextHolder.publishEvent(new SysLogEvent(logVo)); diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index e124c817..8c3dacfa 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -54,5 +54,9 @@ org.springframework.security spring-security-core + + org.springframework.security + spring-security-oauth2-core + diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java index a748f19b..6046cfe9 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java @@ -16,10 +16,12 @@ package com.pig4cloud.pig.common.log.util; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpUtil; import com.pig4cloud.pig.admin.api.entity.SysLog; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import lombok.experimental.UtilityClass; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.expression.EvaluationContext; @@ -29,6 +31,7 @@ import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.http.HttpHeaders; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -56,9 +59,28 @@ public class SysLogUtils { sysLog.setParams(HttpUtil.toParams(request.getParameterMap())); sysLog.setCreateBy(getUsername()); sysLog.setUpdateBy(getUsername()); + sysLog.setServiceId(getClientId()); return sysLog; } + /** + * 获取客户端 + * @return clientId + */ + private String getClientId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return null; + } + + Object principal = authentication.getPrincipal(); + if (principal instanceof OAuth2AuthenticatedPrincipal) { + OAuth2AuthenticatedPrincipal auth2Authentication = (OAuth2AuthenticatedPrincipal) principal; + return MapUtil.getStr(auth2Authentication.getAttributes(), SecurityConstants.CLIENT_ID); + } + return null; + } + /** * 获取用户名称 * @return username diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java index 631a99e6..96148d10 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java @@ -1,6 +1,7 @@ package com.pig4cloud.pig.common.security.component; import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.service.PigUser; import com.pig4cloud.pig.common.security.service.PigUserDetailsService; import lombok.RequiredArgsConstructor; @@ -71,7 +72,13 @@ public class PigCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector catch (Exception ex) { log.error("资源服务器 introspect Token error {}", ex.getLocalizedMessage()); } - return (PigUser) userDetails; + + // 注入扩展属性,方便上下文获取客户端ID + PigUser user = (PigUser) userDetails; + Objects.requireNonNull(user) + .getAttributes() + .put(SecurityConstants.CLIENT_ID, oldAuthorization.getRegisteredClientId()); + return user; } } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java index 36f48f9e..723ac02d 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java @@ -36,6 +36,8 @@ public class PigUser extends User implements OAuth2AuthenticatedPrincipal { private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; + private final Map attributes = new HashMap<>(); + /** * 用户ID */ @@ -71,7 +73,7 @@ public class PigUser extends User implements OAuth2AuthenticatedPrincipal { */ @Override public Map getAttributes() { - return new HashMap<>(); + return this.attributes; } @Override diff --git a/pom.xml b/pom.xml index d3a2fcc0..e081cafb 100755 --- a/pom.xml +++ b/pom.xml @@ -230,15 +230,6 @@ io.spring.javaformat spring-javaformat-maven-plugin ${spring.checkstyle.plugin} - - - validate - true - - validate - - - -- Gitee From 0283b588d81a165a48a8d39694f6b379a66fe9cc Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 15 Mar 2023 10:08:45 +0800 Subject: [PATCH 050/238] :arrow_up: Upgrading dependencies. spring-boot-admin 2.7.10 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e081cafb..4ab2c816 100755 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ UTF-8 1.8 1.8 - 2.7.9 + 2.7.10 0.4.1 3.6.0 2.2.2 -- Gitee From 0126b6f0d46acbdf074a77d896df7ee2b0098251 Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 15 Mar 2023 10:29:40 +0800 Subject: [PATCH 051/238] =?UTF-8?q?:memo:=20Writing=20docs.=20=E6=95=B4?= =?UTF-8?q?=E7=90=86SQL=20=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 123 ++++++++++++++++++++++----------------------- db/pig_codegen.sql | 42 ++++++++-------- 2 files changed, 81 insertions(+), 84 deletions(-) diff --git a/db/pig.sql b/db/pig.sql index 9850a86f..7d162a28 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -7,21 +7,19 @@ SET FOREIGN_KEY_CHECKS = 0; USE `pig`; --- ---------------------------- --- Table structure for sys_dept --- ---------------------------- DROP TABLE IF EXISTS `sys_dept` ; +-- 创建表 `sys_dept` CREATE TABLE `sys_dept` ( - `dept_id` bigint NOT NULL, - `name` varchar(50) COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门名称', - `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', - `parent_id` bigint DEFAULT NULL, - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`dept_id`) + `dept_id` bigint NOT NULL COMMENT '部门ID', + `name` varchar(50) COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门名称', + `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', + `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记 -1:已删除 0:正常', + `parent_id` bigint DEFAULT NULL COMMENT '父部门ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`dept_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门管理'; -- ---------------------------- @@ -37,16 +35,14 @@ INSERT INTO `sys_dept` VALUES (6, '产品中心', 0, '0', 3, '2020-03-13 13:15:4 INSERT INTO `sys_dept` VALUES (7, '测试中心', 0, '0', 3, '2020-03-13 13:16:02', ' ', '2021-12-31 06:59:56', ' '); COMMIT; --- ---------------------------- --- Table structure for sys_dept_relation --- ---------------------------- DROP TABLE IF EXISTS `sys_dept_relation`; +-- 创建表 `sys_dept_relation` CREATE TABLE `sys_dept_relation` ( - `ancestor` bigint NOT NULL, - `descendant` bigint NOT NULL, - PRIMARY KEY (`ancestor`,`descendant`), - KEY `idx1` (`ancestor`), - KEY `idx2` (`descendant`) + `ancestor` bigint NOT NULL COMMENT '祖先节点', + `descendant` bigint NOT NULL COMMENT '后代节点', + PRIMARY KEY (`ancestor`,`descendant`), + KEY `idx1` (`ancestor`), + KEY `idx2` (`descendant`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门关系表'; -- ---------------------------- @@ -173,20 +169,21 @@ COMMIT; -- Table structure for sys_public_param -- ---------------------------- DROP TABLE IF EXISTS `sys_public_param`; +-- 创建表 `sys_public_param` CREATE TABLE `sys_public_param` ( - `public_id` bigint(0) NOT NULL COMMENT '编号', - `public_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `public_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `public_value` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', - `validate_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', - `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', - `public_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', - `system_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', - PRIMARY KEY (`public_id`) USING BTREE + `public_id` bigint(0) NOT NULL COMMENT '编号', + `public_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数名称', + `public_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数键名', + `public_value` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数键值', + `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态,1-启用,0-禁用', + `validate_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '校验码', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', + `public_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '参数类型,1-系统参数,2-业务参数', + `system_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否为系统内置参数,1-是,0-否', + PRIMARY KEY (`public_id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci COMMENT = '公共参数配置表'; -- ---------------------------- @@ -203,18 +200,18 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_file`; CREATE TABLE `sys_file` ( - `id` bigint NOT NULL, - `file_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `bucket_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `original` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `file_size` bigint DEFAULT NULL COMMENT '文件大小', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-正常,1-删除', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE + `id` bigint NOT NULL COMMENT '文件ID', + `file_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名称', + `bucket_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件存储桶名称', + `original` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '原始文件名', + `type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件类型', + `file_size` bigint DEFAULT NULL COMMENT '文件大小', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标志:0-正常,1-删除', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='文件管理表'; -- ---------------------------- @@ -427,17 +424,17 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( - `role_id` bigint NOT NULL, - `role_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标识(0-正常,1-删除)', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改人', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - PRIMARY KEY (`role_id`), - UNIQUE KEY `role_idx1_role_code` (`role_code`) + `role_id` bigint NOT NULL COMMENT '角色ID', + `role_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称', + `role_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色代码', + `role_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色描述', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标识:0-正常,1-删除', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改人', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + PRIMARY KEY (`role_id`), + UNIQUE KEY `role_idx1_role_code` (`role_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统角色表'; -- ---------------------------- @@ -453,9 +450,9 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_role_menu`; CREATE TABLE `sys_role_menu` ( - `role_id` bigint NOT NULL, - `menu_id` bigint NOT NULL, - PRIMARY KEY (`role_id`,`menu_id`) + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色菜单表'; -- ---------------------------- @@ -558,9 +555,9 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( - `user_id` bigint NOT NULL, - `role_id` bigint NOT NULL, - PRIMARY KEY (`user_id`,`role_id`) + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; -- ---------------------------- diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql index 7f8859f2..e78920ae 100644 --- a/db/pig_codegen.sql +++ b/db/pig_codegen.sql @@ -12,17 +12,17 @@ USE `pig_codegen`; -- ---------------------------- DROP TABLE IF EXISTS `gen_datasource_conf`; CREATE TABLE `gen_datasource_conf` ( - `id` bigint NOT NULL, - `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '数据源名称', - `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'jdbc-url', - `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户名', - `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE + `id` bigint NOT NULL COMMENT '数据源ID', + `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '数据源名称', + `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'jdbc-url', + `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='数据源表'; -- ---------------------------- @@ -36,16 +36,16 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `gen_form_conf`; CREATE TABLE `gen_form_conf` ( - `id` bigint NOT NULL, - `table_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '表名', - `form_info` json NOT NULL COMMENT '表单信息', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE, - KEY `table_name` (`table_name`) + `id` bigint NOT NULL COMMENT '表单配置ID', + `table_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '表名', + `form_info` json NOT NULL COMMENT '表单信息', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `table_name` (`table_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='表单配置'; -- ---------------------------- -- Gitee From 907eec18010f2d93c887f4d850f67a3893be5689 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 17 Mar 2023 16:44:49 +0800 Subject: [PATCH 052/238] :sparkles: Introducing new features.: support client_secret_header & client_secret_post --- .../service/PigRemoteRegisteredClientRepository.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java index 2d0b8ade..65583c1e 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java @@ -95,7 +95,11 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) .clientId(clientDetails.getClientId()) .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) - .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) + .clientAuthenticationMethods(clientAuthenticationMethods -> { + clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_POST); + }); // 授权模式 Optional.ofNullable(clientDetails.getAuthorizedGrantTypes()) -- Gitee From e0a75abeb0fbf804b8702d605470726faaa37da5 Mon Sep 17 00:00:00 2001 From: zhao Date: Tue, 21 Mar 2023 09:00:36 +0800 Subject: [PATCH 053/238] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/auth/support/core/PigDaoAuthenticationProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java index 8141c998..1be78b53 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java @@ -89,7 +89,6 @@ public class PigDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat @SneakyThrows @Override - protected final UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) { prepareTimingAttackProtection(); HttpServletRequest request = WebUtils.getRequest() -- Gitee From 893ca00a0d5cf53f508defd5a45b24570867b08e Mon Sep 17 00:00:00 2001 From: jiakang Date: Wed, 22 Mar 2023 20:11:22 +0800 Subject: [PATCH 054/238] =?UTF-8?q?=E5=BD=93=E8=8E=B7=E5=8F=96token?= =?UTF-8?q?=E5=8F=82=E6=95=B0grant=5Ftype=E4=B8=8D=E4=B8=BApassword?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E9=89=B4=E6=9D=83=E6=8E=A5=E5=8F=A3=E4=B8=80?= =?UTF-8?q?=E7=9B=B4=E6=8A=A5=E2=80=98=E7=94=A8=E6=88=B7=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E2=80=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...esourceOwnerBaseAuthenticationProvider.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 0f886493..0ef6892c 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -111,29 +111,29 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider authorizedScopes; // Default to configured scopes - if (!CollectionUtils.isEmpty(resouceOwnerBaseAuthentication.getScopes())) { - for (String requestedScope : resouceOwnerBaseAuthentication.getScopes()) { + if (!CollectionUtils.isEmpty(resourceOwnerBaseAuthentication.getScopes())) { + for (String requestedScope : resourceOwnerBaseAuthentication.getScopes()) { if (!registeredClient.getScopes().contains(requestedScope)) { throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_SCOPE); } } - authorizedScopes = new LinkedHashSet<>(resouceOwnerBaseAuthentication.getScopes()); + authorizedScopes = new LinkedHashSet<>(resourceOwnerBaseAuthentication.getScopes()); } else { throw new ScopeException(OAuth2ErrorCodesExpand.SCOPE_IS_EMPTY); } - Map reqParameters = resouceOwnerBaseAuthentication.getAdditionalParameters(); + Map reqParameters = resourceOwnerBaseAuthentication.getAdditionalParameters(); try { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = buildToken(reqParameters); @@ -149,14 +149,14 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider Date: Thu, 23 Mar 2023 19:54:13 +0800 Subject: [PATCH 055/238] :arrow_up: Upgrading dependencies. up spring-cloud-alibaba 2021.0.5.0 --- pom.xml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 4ab2c816..979a1d31 100755 --- a/pom.xml +++ b/pom.xml @@ -27,9 +27,9 @@ https://www.pig4cloud.com - 2.7.9 + 2.7.10 2021.0.6 - 2021.0.4.0 + 2021.0.5.0 UTF-8 1.8 1.8 @@ -159,13 +159,6 @@ true - - - - repackage - - - io.fabric8 @@ -240,8 +233,8 @@ dev - nacos - nacos + nacos + nacos -- Gitee From 7b0d08bd7c5751d9a670c43767b89f71aff53cb7 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 23 Mar 2023 19:54:24 +0800 Subject: [PATCH 056/238] :arrow_up: Upgrading dependencies. up springboot 2.7.10 --- README.md | 4 ++-- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7cb0b042..d24389ec 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,9 @@ | 依赖 | 版本 | | ---------------------- |------------| -| Spring Boot | 2.7.9 | +| Spring Boot | 2.7.10 | | Spring Cloud | 2021.0.6 | -| Spring Cloud Alibaba | 2021.0.4.0 | +| Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | | hutool | 5.8.15 | diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 2bad618b..d1a9980f 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -15,7 +15,7 @@ ${project.version} - 2.7.9 + 2.7.10 UTF-8 2.17.1 1.8 -- Gitee From 37325ad3121a33bfdad36f5dc6601cb878104944 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 23 Mar 2023 19:55:58 +0800 Subject: [PATCH 057/238] :bookmark: :bookmark: :bookmark: 3.6.7 --- pig-auth/pom.xml | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- pig-common/pig-common-core/pom.xml | 2 +- pig-common/pig-common-datasource/pom.xml | 2 +- pig-common/pig-common-feign/pom.xml | 2 +- pig-common/pig-common-job/pom.xml | 2 +- pig-common/pig-common-log/pom.xml | 2 +- pig-common/pig-common-mybatis/pom.xml | 2 +- pig-common/pig-common-seata/pom.xml | 2 +- pig-common/pig-common-security/pom.xml | 2 +- pig-common/pig-common-swagger/pom.xml | 2 +- pig-common/pig-common-xss/pom.xml | 2 +- pig-common/pom.xml | 2 +- pig-gateway/pom.xml | 2 +- pig-register/pom.xml | 2 +- pig-upms/pig-upms-api/pom.xml | 2 +- pig-upms/pig-upms-biz/pom.xml | 2 +- pig-upms/pom.xml | 2 +- pig-visual/pig-codegen/pom.xml | 2 +- pig-visual/pig-monitor/pom.xml | 2 +- pig-visual/pig-sentinel-dashboard/pom.xml | 2 +- pig-visual/pig-xxl-job-admin/pom.xml | 2 +- pig-visual/pom.xml | 2 +- pom.xml | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index c4fb3424..9557d78d 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.6 + 3.6.7 pig-auth diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index d1a9980f..561a74f4 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common-bom - 3.6.6 + 3.6.7 pom pig-common-bom diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index 8619dd42..6b3a2332 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-core diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index a993c050..e03d585e 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -21,7 +21,7 @@ pig-common com.pig4cloud - 3.6.6 + 3.6.7 4.0.0 diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 16aa0632..0f2332db 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 4.0.0 diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 2f260ace..6c5b166a 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-job diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index 8c3dacfa..b01f6f38 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-log diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index 04cab5b2..c2d0b5da 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-mybatis diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index acaa0879..d227a7fc 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index db14760c..46652e78 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-security diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index 28c55dd5..50015985 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 254eadf8..615fd489 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.6.6 + 3.6.7 pig-common-xss diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 619b5fa6..15908dee 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.6 + 3.6.7 pig-common diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index a15a3952..9e4ea278 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.6 + 3.6.7 pig-gateway diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 11a17fbd..afed927c 100755 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -18,7 +18,7 @@ com.pig4cloud pig - 3.6.6 + 3.6.7 pig-register diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index 0cb6dd89..9fae9627 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.6 + 3.6.7 pig-upms-api diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index df4d2cc6..ce53f69e 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.6 + 3.6.7 pig-upms-biz diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index e69d83ce..629b8138 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.6 + 3.6.7 pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index 7fc08956..6c5ebb1e 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.6.6 + 3.6.7 pig-codegen diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index 9c587b18..1be8a117 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.6.6 + 3.6.7 pig-monitor diff --git a/pig-visual/pig-sentinel-dashboard/pom.xml b/pig-visual/pig-sentinel-dashboard/pom.xml index 46307f60..9a3fb87e 100755 --- a/pig-visual/pig-sentinel-dashboard/pom.xml +++ b/pig-visual/pig-sentinel-dashboard/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-visual - 3.6.6 + 3.6.7 pig-sentinel-dashboard diff --git a/pig-visual/pig-xxl-job-admin/pom.xml b/pig-visual/pig-xxl-job-admin/pom.xml index f49f2dac..1478ed70 100644 --- a/pig-visual/pig-xxl-job-admin/pom.xml +++ b/pig-visual/pig-xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.pig4cloud pig-visual - 3.6.6 + 3.6.7 pig-xxl-job-admin diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 323bf7db..9469be1b 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.6 + 3.6.7 pig-visual diff --git a/pom.xml b/pom.xml index 979a1d31..9b572a45 100755 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig ${project.artifactId} - 3.6.6 + 3.6.7 pom https://www.pig4cloud.com -- Gitee From 48448fcbb29dae9d7de2937b7e8586003567fb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E5=B8=B8=E5=9D=A4?= Date: Tue, 28 Mar 2023 17:54:05 +0800 Subject: [PATCH 058/238] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84if=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/security/util/OAuth2EndpointUtils.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java index be8b7cb1..017cf3f0 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java @@ -28,10 +28,8 @@ public class OAuth2EndpointUtils { Map parameterMap = request.getParameterMap(); MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); parameterMap.forEach((key, values) -> { - if (values.length > 0) { - for (String value : values) { - parameters.add(key, value); - } + for (String value : values) { + parameters.add(key, value); } }); return parameters; -- Gitee From 5dad371547354287975b4b1c2cb3d4b31cee1914 Mon Sep 17 00:00:00 2001 From: Lht Date: Wed, 29 Mar 2023 19:02:55 +0800 Subject: [PATCH 059/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.16 --- README.md | 4 ++-- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d24389ec..7b7b13b4 100644 --- a/README.md +++ b/README.md @@ -48,12 +48,12 @@ | 依赖 | 版本 | | ---------------------- |------------| -| Spring Boot | 2.7.10 | +| Spring Boot | 2.7.10 | | Spring Cloud | 2021.0.6 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.15 | +| hutool | 5.8.16 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 561a74f4..4cbd5bbc 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.15 + 5.8.16 2.7.4 1.8.4 -- Gitee From 6991cdad557f4b9d79bba50d6aeede4edfe30eb2 Mon Sep 17 00:00:00 2001 From: Lht Date: Thu, 30 Mar 2023 19:02:47 +0800 Subject: [PATCH 060/238] :arrow_up: Upgrading dependencies. UP xxl-job 2.4.0 --- .../admin/controller/JobGroupController.java | 7 +++++++ .../job/admin/controller/JobLogController.java | 18 ++++++++++++------ .../main/resources/i18n/message_en.properties | 2 +- .../resources/i18n/message_zh_CN.properties | 2 +- .../resources/i18n/message_zh_TC.properties | 2 +- .../resources/static/js/joblog.detail.1.js | 2 -- .../templates/joblog/joblog.detail.ftl | 2 -- pom.xml | 2 +- 8 files changed, 23 insertions(+), 14 deletions(-) mode change 100755 => 100644 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java mode change 100755 => 100644 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java mode change 100755 => 100644 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js mode change 100755 => 100644 pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java old mode 100755 new mode 100644 index f52e941b..87c5da42 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.controller; +import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.core.util.I18nUtil; @@ -37,12 +38,14 @@ public class JobGroupController { private XxlJobRegistryDao xxlJobRegistryDao; @RequestMapping + @PermissionLimit(adminuser = true) public String index(Model model) { return "jobgroup/jobgroup.index"; } @RequestMapping("/pageList") @ResponseBody + @PermissionLimit(adminuser = true) public Map pageList(HttpServletRequest request, @RequestParam(required = false, defaultValue = "0") int start, @RequestParam(required = false, defaultValue = "10") int length, String appname, String title) { @@ -61,6 +64,7 @@ public class JobGroupController { @RequestMapping("/save") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT save(XxlJobGroup xxlJobGroup) { // valid @@ -107,6 +111,7 @@ public class JobGroupController { @RequestMapping("/update") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT update(XxlJobGroup xxlJobGroup) { // valid if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { @@ -177,6 +182,7 @@ public class JobGroupController { @RequestMapping("/remove") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT remove(int id) { // valid @@ -196,6 +202,7 @@ public class JobGroupController { @RequestMapping("/loadById") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT loadById(int id) { XxlJobGroup jobGroup = xxlJobGroupDao.load(id); return jobGroup != null ? new ReturnT(jobGroup) diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java old mode 100755 new mode 100644 index d7225dd1..8aad8291 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -138,23 +138,29 @@ public class JobLogController { model.addAttribute("triggerCode", jobLog.getTriggerCode()); model.addAttribute("handleCode", jobLog.getHandleCode()); - model.addAttribute("executorAddress", jobLog.getExecutorAddress()); - model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime()); model.addAttribute("logId", jobLog.getId()); return "joblog/joblog.detail"; } @RequestMapping("/logDetailCat") @ResponseBody - public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) { + public ReturnT logDetailCat(long logId, int fromLineNum) { try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); - ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); + // valid + XxlJobLog jobLog = xxlJobLogDao.load(logId); // todo, need to improve + // performance + if (jobLog == null) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_logid_unvalid")); + } + + // log cat + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress()); + ReturnT logResult = executorBiz + .log(new LogParam(jobLog.getTriggerTime().getTime(), logId, fromLineNum)); // is end if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { - XxlJobLog jobLog = xxlJobLogDao.load(logId); if (jobLog.getHandleCode() > 0) { logResult.getContent().setEnd(true); } diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties index 001f841a..589d9eb4 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -1,6 +1,6 @@ admin_name=Scheduling Center admin_name_full=Distributed Task Scheduling Platform XXL-JOB -admin_version=2.3.1 +admin_version=2.4.0 admin_i18n=en ## system diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index 69ef6e3d..fc1d2764 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -1,6 +1,6 @@ admin_name=任务调度中心 admin_name_full=分布式任务调度平台XXL-JOB -admin_version=2.3.1 +admin_version=2.4.0 admin_i18n= ## system diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index 35916c0d..49d39fd2 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -1,6 +1,6 @@ admin_name=任務調度中心 admin_name_full=分布式任務調度平臺XXL-JOB -admin_version=2.3.1 +admin_version=2.4.0 admin_i18n= ## system diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js b/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js old mode 100755 new mode 100644 index ddefd466..0638eee2 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js @@ -25,8 +25,6 @@ $(function() { async: false, // sync, make log ordered url : base_url + '/joblog/logDetailCat', data : { - "executorAddress":executorAddress, - "triggerTime":triggerTime, "logId":logId, "fromLineNum":fromLineNum }, diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl old mode 100755 new mode 100644 index 3881cfa6..bb8072f9 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl @@ -62,8 +62,6 @@ // 参数 var triggerCode = '${triggerCode}'; var handleCode = '${handleCode}'; - var executorAddress = '${executorAddress!}'; - var triggerTime = '${triggerTime?c}'; var logId = '${logId}'; diff --git a/pom.xml b/pom.xml index 9b572a45..82657ebe 100755 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ 3.0.5 3.0.0 3.0.3 - 2.3.1 + 2.4.0 0.32.0 http://192.168.0.100:2375 192.168.0.100 -- Gitee From 73ee2777e8d2591da90c5acc5f7e55e1f799a465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 3 Apr 2023 15:45:29 +0800 Subject: [PATCH 061/238] =?UTF-8?q?:art:=20=E7=AE=80=E5=8C=96=20OAuth=202.?= =?UTF-8?q?1=20=E9=85=8D=E7=BD=AE=201.=20=E4=BD=BF=E7=94=A8=E9=9D=99?= =?UTF-8?q?=E6=80=81=E6=96=B9=E6=B3=95=20OAuth2AuthorizationServerConfigur?= =?UTF-8?q?ation.applyDefaultSecurity(http)=EF=BC=8C=E7=BC=BA=E7=9C=81=20a?= =?UTF-8?q?uthorizeRequests.anyRequest().authenticated()=E3=80=81csrf.igno?= =?UTF-8?q?ringRequestMatchers(endpointsMatcher)=20=E7=AD=89=E7=AD=89=202.?= =?UTF-8?q?=20=E4=BD=BF=E7=94=A8=20HttpSecurity=20=E8=8E=B7=E5=8F=96=20OAu?= =?UTF-8?q?th=202.1=20=E9=85=8D=E7=BD=AE=E4=B8=AD=E7=9A=84=20OAuth2Authori?= =?UTF-8?q?zationServerConfigurer=20=E5=AF=B9=E8=B1=A1=203.=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=83=A8=E5=88=86=20HttpSecurity.apply?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index f90d4dce..8f1d0b8c 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -35,6 +35,7 @@ import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration; import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator; @@ -44,7 +45,6 @@ import org.springframework.security.oauth2.server.authorization.web.authenticati import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationConverter; -import org.springframework.security.web.util.matcher.RequestMatcher; import java.util.Arrays; @@ -63,23 +63,29 @@ public class AuthorizationServerConfiguration { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { - OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); - http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 + // OAuth 2.1 默认配置 + // 缺省配置:authorizeRequests.anyRequest().authenticated()、 + // csrf.ignoringRequestMatchers(endpointsMatcher) 等等 + OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); + + // 使用 HttpSecurity 获取 OAuth 2.1 配置中的 OAuth2AuthorizationServerConfigurer 对象 + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = http + .getConfigurer(OAuth2AuthorizationServerConfigurer.class); + + authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 - .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))); - - RequestMatcher endpointsMatcher = authorizationServerConfigurer.getEndpointsMatcher(); - DefaultSecurityFilterChain securityFilterChain = http.requestMatcher(endpointsMatcher) - .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated()) - .apply(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 - .authorizationServerSettings( - AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build())) + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI)); + + DefaultSecurityFilterChain securityFilterChain = authorizationServerConfigurer + .authorizationService(authorizationService)// redis存储token的实现 + .authorizationServerSettings( + AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build()) // 授权码登录的登录页个性化 .and() .apply(new FormIdentityLoginConfigurer()) -- Gitee From c59e23a2c115fbf9fe0e9116b09ddc1282d18768 Mon Sep 17 00:00:00 2001 From: fxw Date: Tue, 4 Apr 2023 10:25:16 +0800 Subject: [PATCH 062/238] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=E5=A4=84?= =?UTF-8?q?=E7=90=86sql=E5=AD=97=E7=AC=A6=E9=9B=86=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 210 ++++++++++++++++++++++----------------------- db/pig_codegen.sql | 28 +++--- db/pig_config.sql | 164 +++++++++++++++++------------------ db/pig_job.sql | 20 ++--- 4 files changed, 211 insertions(+), 211 deletions(-) diff --git a/db/pig.sql b/db/pig.sql index 7d162a28..afa97a07 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -1,6 +1,6 @@ DROP DATABASE IF EXISTS `pig`; -CREATE DATABASE `pig` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +CREATE DATABASE `pig` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; @@ -11,16 +11,16 @@ DROP TABLE IF EXISTS `sys_dept` ; -- 创建表 `sys_dept` CREATE TABLE `sys_dept` ( `dept_id` bigint NOT NULL COMMENT '部门ID', - `name` varchar(50) COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门名称', + `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '部门名称', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记 -1:已删除 0:正常', + `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记 -1:已删除 0:正常', `parent_id` bigint DEFAULT NULL COMMENT '父部门ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`dept_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门管理'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='部门管理'; -- ---------------------------- -- Records of sys_dept @@ -43,7 +43,7 @@ CREATE TABLE `sys_dept_relation` ( PRIMARY KEY (`ancestor`,`descendant`), KEY `idx1` (`ancestor`), KEY `idx2` (`descendant`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门关系表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='部门关系表'; -- ---------------------------- -- Records of sys_dept_relation @@ -73,18 +73,18 @@ COMMIT; DROP TABLE IF EXISTS `sys_dict`; CREATE TABLE `sys_dict` ( `id` bigint NOT NULL, - `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标识', - `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', - `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否是系统内置', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标识', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '是否是系统内置', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `sys_dict_del_flag` (`del_flag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict @@ -108,23 +108,23 @@ DROP TABLE IF EXISTS `sys_dict_item`; CREATE TABLE `sys_dict_item` ( `id` bigint NOT NULL, `dict_id` bigint NOT NULL COMMENT '字典ID', - `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典标识', - `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '值', - `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签', - `type` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', - `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字典标识', + `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '值', + `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标签', + `type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字典类型', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序(升序)', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '备注', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT ' ' COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `sys_dict_value` (`value`) USING BTREE, KEY `sys_dict_label` (`label`) USING BTREE, KEY `sys_dict_del_flag` (`del_flag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典项'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='字典项'; -- ---------------------------- -- Records of sys_dict_item @@ -172,19 +172,19 @@ DROP TABLE IF EXISTS `sys_public_param`; -- 创建表 `sys_public_param` CREATE TABLE `sys_public_param` ( `public_id` bigint(0) NOT NULL COMMENT '编号', - `public_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数名称', - `public_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数键名', - `public_value` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数键值', - `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态,1-启用,0-禁用', - `validate_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '校验码', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `public_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数名称', + `public_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数键名', + `public_value` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数键值', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '状态,1-启用,0-禁用', + `validate_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '校验码', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '修改人', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', - `public_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '参数类型,1-系统参数,2-业务参数', - `system_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否为系统内置参数,1-是,0-否', + `public_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '参数类型,1-系统参数,2-业务参数', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '是否为系统内置参数,1-是,0-否', PRIMARY KEY (`public_id`) USING BTREE -) ENGINE = InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci COMMENT = '公共参数配置表'; +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公共参数配置表'; -- ---------------------------- -- Records of sys_public_param @@ -201,18 +201,18 @@ COMMIT; DROP TABLE IF EXISTS `sys_file`; CREATE TABLE `sys_file` ( `id` bigint NOT NULL COMMENT '文件ID', - `file_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名称', - `bucket_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件存储桶名称', - `original` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '原始文件名', - `type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件类型', + `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件名称', + `bucket_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件存储桶名称', + `original` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '原始文件名', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件类型', `file_size` bigint DEFAULT NULL COMMENT '文件大小', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标志:0-正常,1-删除', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标志:0-正常,1-删除', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='文件管理表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='文件管理表'; -- ---------------------------- -- Records of sys_file @@ -226,27 +226,27 @@ COMMIT; DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint NOT NULL, - `type` char(1) COLLATE utf8_general_ci DEFAULT '1' COMMENT '日志类型', - `title` varchar(255) COLLATE utf8_general_ci DEFAULT '' COMMENT '日志标题', - `service_id` varchar(32) COLLATE utf8_general_ci DEFAULT NULL COMMENT '服务ID', - `remote_addr` varchar(255) COLLATE utf8_general_ci DEFAULT NULL COMMENT '操作IP地址', - `user_agent` varchar(1000) COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户代理', - `request_uri` varchar(255) COLLATE utf8_general_ci DEFAULT NULL COMMENT '请求URI', - `method` varchar(10) COLLATE utf8_general_ci DEFAULT NULL COMMENT '操作方式', - `params` text COLLATE utf8_general_ci COMMENT '操作提交的数据', + `type` char(1) COLLATE utf8mb4_bin DEFAULT '1' COMMENT '日志类型', + `title` varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '日志标题', + `service_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '服务ID', + `remote_addr` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作IP地址', + `user_agent` varchar(1000) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户代理', + `request_uri` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '请求URI', + `method` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作方式', + `params` text COLLATE utf8mb4_bin COMMENT '操作提交的数据', `time` bigint DEFAULT NULL COMMENT '执行时间', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', - `exception` text COLLATE utf8_general_ci COMMENT '异常信息', + `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', + `exception` text COLLATE utf8mb4_bin COMMENT '异常信息', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`), KEY `sys_log_create_by` (`create_by`), KEY `sys_log_request_uri` (`request_uri`), KEY `sys_log_type` (`type`), KEY `sys_log_create_date` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='日志表'; -- ---------------------------- -- Records of sys_log @@ -260,21 +260,21 @@ COMMIT; DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `menu_id` bigint NOT NULL, - `name` varchar(32) COLLATE utf8_general_ci NOT NULL COMMENT '菜单名称', - `permission` varchar(32) COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单权限标识', - `path` varchar(128) COLLATE utf8_general_ci DEFAULT NULL COMMENT '前端URL', + `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '菜单名称', + `permission` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单权限标识', + `path` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '前端URL', `parent_id` bigint DEFAULT NULL COMMENT '父菜单ID', - `icon` varchar(32) COLLATE utf8_general_ci DEFAULT NULL COMMENT '图标', + `icon` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图标', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', - `keep_alive` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-开启,1- 关闭', - `type` char(1) COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单类型 (0菜单 1按钮)', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0--正常 1--删除)', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `keep_alive` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-开启,1- 关闭', + `type` char(1) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单类型 (0菜单 1按钮)', + `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '逻辑删除标记(0--正常 1--删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`menu_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='菜单权限表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='菜单权限表'; -- ---------------------------- -- Records of sys_menu @@ -345,23 +345,23 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_oauth_client_details`; CREATE TABLE `sys_oauth_client_details` ( - `client_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户端ID', - `resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '资源列表', - `client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '客户端密钥', - `scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '域', - `authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '认证类型', - `web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '重定向地址', - `authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色列表', + `client_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '客户端ID', + `resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '资源列表', + `client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户端密钥', + `scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '域', + `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '认证类型', + `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '重定向地址', + `authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '角色列表', `access_token_validity` int DEFAULT NULL COMMENT 'token 有效期', `refresh_token_validity` int DEFAULT NULL COMMENT '刷新令牌有效期', - `additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '令牌扩展字段JSON', - `autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '是否自动放行', + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '令牌扩展字段JSON', + `autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否自动放行', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`client_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='终端信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='终端信息表'; -- ---------------------------- -- Records of sys_oauth_client_details @@ -381,17 +381,17 @@ COMMIT; DROP TABLE IF EXISTS `sys_post`; CREATE TABLE `sys_post` ( `post_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', - `post_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '岗位编码', - `post_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '岗位名称', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位名称', `post_sort` int(0) NOT NULL COMMENT '岗位排序', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新人', - `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注信息', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新人', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注信息', PRIMARY KEY (`post_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT = '岗位信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT = '岗位信息表'; -- ---------------------------- -- Records of sys_post @@ -410,7 +410,7 @@ CREATE TABLE `sys_user_post` ( `user_id` bigint(0) NOT NULL COMMENT '用户ID', `post_id` bigint(0) NOT NULL COMMENT '岗位ID', PRIMARY KEY (`user_id`, `post_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT = '用户与岗位关联表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT = '用户与岗位关联表'; -- ---------------------------- -- Records of sys_user_post @@ -425,17 +425,17 @@ COMMIT; DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `role_id` bigint NOT NULL COMMENT '角色ID', - `role_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称', - `role_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色代码', - `role_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色描述', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标识:0-正常,1-删除', + `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色名称', + `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色代码', + `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '角色描述', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标识:0-正常,1-删除', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改人', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', PRIMARY KEY (`role_id`), UNIQUE KEY `role_idx1_role_code` (`role_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统角色表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='系统角色表'; -- ---------------------------- -- Records of sys_role @@ -453,7 +453,7 @@ CREATE TABLE `sys_role_menu` ( `role_id` bigint NOT NULL COMMENT '角色ID', `menu_id` bigint NOT NULL COMMENT '菜单ID', PRIMARY KEY (`role_id`,`menu_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色菜单表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='角色菜单表'; -- ---------------------------- -- Records of sys_role_menu @@ -527,21 +527,21 @@ COMMIT; DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `user_id` bigint NOT NULL, - `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名', - `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码', - `salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '随机盐', - `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '简介', - `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '头像', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '密码', + `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '随机盐', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '简介', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像', `dept_id` bigint DEFAULT NULL COMMENT '部门ID', - `lock_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-正常,9-锁定', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-正常,1-删除', + `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,9-锁定', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,1-删除', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`user_id`), KEY `user_idx1_username` (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='用户表'; -- ---------------------------- -- Records of sys_user @@ -558,7 +558,7 @@ CREATE TABLE `sys_user_role` ( `user_id` bigint NOT NULL COMMENT '用户ID', `role_id` bigint NOT NULL COMMENT '角色ID', PRIMARY KEY (`user_id`,`role_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; -- ---------------------------- -- Records of sys_user_role diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql index e78920ae..bf6d22e0 100644 --- a/db/pig_codegen.sql +++ b/db/pig_codegen.sql @@ -1,6 +1,6 @@ DROP DATABASE IF EXISTS `pig_codegen`; -CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; +CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_bin; SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; @@ -13,17 +13,17 @@ USE `pig_codegen`; DROP TABLE IF EXISTS `gen_datasource_conf`; CREATE TABLE `gen_datasource_conf` ( `id` bigint NOT NULL COMMENT '数据源ID', - `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '数据源名称', - `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'jdbc-url', - `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户名', - `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '数据源名称', + `url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'jdbc-url', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名', + `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='数据源表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='数据源表'; -- ---------------------------- -- Records of gen_datasource_conf @@ -37,16 +37,16 @@ COMMIT; DROP TABLE IF EXISTS `gen_form_conf`; CREATE TABLE `gen_form_conf` ( `id` bigint NOT NULL COMMENT '表单配置ID', - `table_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '表名', + `table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '表名', `form_info` json NOT NULL COMMENT '表单信息', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`) USING BTREE, KEY `table_name` (`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='表单配置'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='表单配置'; -- ---------------------------- -- Records of gen_form_conf diff --git a/db/pig_config.sql b/db/pig_config.sql index 3a404bb0..6aedbcbf 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -1,10 +1,10 @@ DROP DATABASE IF EXISTS `pig_config`; -CREATE DATABASE `pig_config` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +CREATE DATABASE `pig_config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; USE pig_config; -SET NAMES utf8; +SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- @@ -13,25 +13,25 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `config_info`; CREATE TABLE `config_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', - `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'md5', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `src_user` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'source user', - `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip', - `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', - `c_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `c_use` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `effect` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `c_schema` text CHARACTER SET utf8 COLLATE utf8_bin, - `encrypted_data_key` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `c_use` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `effect` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `c_schema` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_info'; -- ---------------------------- -- Records of config_info @@ -52,16 +52,16 @@ COMMIT; DROP TABLE IF EXISTS `config_info_aggr`; CREATE TABLE `config_info_aggr` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', - `datum_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'datum_id', - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '内容', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'datum_id', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', - `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='增加租户字段'; -- ---------------------------- -- Records of config_info_aggr @@ -75,21 +75,21 @@ COMMIT; DROP TABLE IF EXISTS `config_info_beta`; CREATE TABLE `config_info_beta` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', - `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name', - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', - `beta_ips` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps', - `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'md5', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `src_user` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'source user', - `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip', - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', - `encrypted_data_key` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_info_beta'; -- ---------------------------- -- Records of config_info_beta @@ -103,20 +103,20 @@ COMMIT; DROP TABLE IF EXISTS `config_info_tag`; CREATE TABLE `config_info_tag` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id', - `tag_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_id', - `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name', - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', - `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'md5', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `src_user` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'source user', - `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_info_tag'; -- ---------------------------- -- Records of config_info_tag @@ -130,16 +130,16 @@ COMMIT; DROP TABLE IF EXISTS `config_tags_relation`; CREATE TABLE `config_tags_relation` ( `id` bigint NOT NULL COMMENT 'id', - `tag_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_name', - `tag_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type', - `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id', + `tag_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_id', `nid` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_tag_relation'; -- ---------------------------- -- Records of config_tags_relation @@ -153,7 +153,7 @@ COMMIT; DROP TABLE IF EXISTS `group_capacity`; CREATE TABLE `group_capacity` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', @@ -164,7 +164,7 @@ CREATE TABLE `group_capacity` ( `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='集群、各Group容量信息表'; -- ---------------------------- -- Records of group_capacity @@ -179,23 +179,23 @@ DROP TABLE IF EXISTS `his_config_info`; CREATE TABLE `his_config_info` ( `id` bigint unsigned NOT NULL, `nid` bigint unsigned NOT NULL AUTO_INCREMENT, - `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name', - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `src_user` text CHARACTER SET utf8 COLLATE utf8_bin, - `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `op_type` char(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', - `encrypted_data_key` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `op_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='多租户改造'; -- ---------------------------- -- Records of his_config_info @@ -208,11 +208,11 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `permissions`; CREATE TABLE `permissions` ( - `role` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `resource` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `action` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `resource` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `action` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_general_ci; -- ---------------------------- -- Records of permissions @@ -225,10 +225,10 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `roles`; CREATE TABLE `roles` ( - `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_general_ci; -- ---------------------------- -- Records of roles @@ -243,7 +243,7 @@ COMMIT; DROP TABLE IF EXISTS `tenant_capacity`; CREATE TABLE `tenant_capacity` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', @@ -254,7 +254,7 @@ CREATE TABLE `tenant_capacity` ( `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='租户容量信息表'; -- ---------------------------- -- Records of tenant_capacity @@ -268,17 +268,17 @@ COMMIT; DROP TABLE IF EXISTS `tenant_info`; CREATE TABLE `tenant_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `kp` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'kp', - `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id', - `tenant_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name', - `tenant_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc', - `create_source` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source', + `kp` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_id', + `tenant_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint NOT NULL COMMENT '创建时间', `gmt_modified` bigint NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='tenant_info'; -- ---------------------------- -- Records of tenant_info @@ -291,11 +291,11 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( - `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `password` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, `enabled` tinyint(1) NOT NULL, PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_general_ci; -- ---------------------------- -- Records of users diff --git a/db/pig_job.sql b/db/pig_job.sql index 585c6e8b..76617829 100644 --- a/db/pig_job.sql +++ b/db/pig_job.sql @@ -1,10 +1,10 @@ DROP DATABASE IF EXISTS `pig_job`; -CREATE DATABASE `pig_job` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +CREATE DATABASE `pig_job` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; use `pig_job`; -SET NAMES utf8; +SET NAMES utf8mb4; CREATE TABLE `xxl_job_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -32,7 +32,7 @@ CREATE TABLE `xxl_job_info` ( `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间', `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, @@ -53,7 +53,7 @@ CREATE TABLE `xxl_job_log` ( PRIMARY KEY (`id`), KEY `I_trigger_time` (`trigger_time`), KEY `I_handle_code` (`handle_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_log_report` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -64,7 +64,7 @@ CREATE TABLE `xxl_job_log_report` ( `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_logglue` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -75,7 +75,7 @@ CREATE TABLE `xxl_job_logglue` ( `add_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_registry` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -85,7 +85,7 @@ CREATE TABLE `xxl_job_registry` ( `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -95,7 +95,7 @@ CREATE TABLE `xxl_job_group` ( `address_list` text COMMENT '执行器地址列表,多地址逗号分隔', `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -105,12 +105,12 @@ CREATE TABLE `xxl_job_user` ( `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', PRIMARY KEY (`id`), UNIQUE KEY `i_username` (`username`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_lock` ( `lock_name` varchar(50) NOT NULL COMMENT '锁名称', PRIMARY KEY (`lock_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' ); INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', ''); -- Gitee From a04b47f4a1e9df5d8e9cd37163ea32fc083c9884 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 4 Apr 2023 10:28:06 +0800 Subject: [PATCH 063/238] :arrow_up: Upgrading dependencies. seata 1.6.1 --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 4cbd5bbc..ba87b8f4 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -27,7 +27,7 @@ 2.2.0 3.5.3.1 8.0.31 - 1.5.2 + 1.6.1 1.2.6 7.1 1.0.5 -- Gitee From 517e644e2c22665650535065c35f1c641725ab27 Mon Sep 17 00:00:00 2001 From: fxw Date: Tue, 4 Apr 2023 11:01:12 +0800 Subject: [PATCH 064/238] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=E5=9B=A0pig=5Fco?= =?UTF-8?q?nfig=E4=B8=AD=E8=81=94=E5=90=88=E4=B8=BB=E9=94=AE=E8=BF=87?= =?UTF-8?q?=E9=95=BF=E4=B8=8D=E8=83=BD=E9=87=87=E7=94=A8utf8mb4,=E4=BF=9D?= =?UTF-8?q?=E7=95=99utf8;=E4=BF=AE=E5=A4=8Dpig=5Fcodegen=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=B8=BA=E4=BF=AE=E6=94=B9=E7=9A=84=E5=AD=97=E7=AC=A6=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig_codegen.sql | 4 +- db/pig_config.sql | 164 ++++++++++++++++++++++----------------------- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql index bf6d22e0..791d1393 100644 --- a/db/pig_codegen.sql +++ b/db/pig_codegen.sql @@ -1,8 +1,8 @@ DROP DATABASE IF EXISTS `pig_codegen`; -CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_bin; +CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -SET NAMES utf8; +SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; USE `pig_codegen`; diff --git a/db/pig_config.sql b/db/pig_config.sql index 6aedbcbf..3a404bb0 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -1,10 +1,10 @@ DROP DATABASE IF EXISTS `pig_config`; -CREATE DATABASE `pig_config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; +CREATE DATABASE `pig_config` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE pig_config; -SET NAMES utf8mb4; +SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- @@ -13,25 +13,25 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `config_info`; CREATE TABLE `config_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', - `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'md5', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'source user', - `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'source ip', - `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', - `c_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `c_use` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `effect` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `c_schema` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, - `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `c_use` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `effect` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `c_schema` text CHARACTER SET utf8 COLLATE utf8_bin, + `encrypted_data_key` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_info'; +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; -- ---------------------------- -- Records of config_info @@ -52,16 +52,16 @@ COMMIT; DROP TABLE IF EXISTS `config_info_aggr`; CREATE TABLE `config_info_aggr` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', - `datum_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'datum_id', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '内容', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'datum_id', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', - `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='增加租户字段'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; -- ---------------------------- -- Records of config_info_aggr @@ -75,21 +75,21 @@ COMMIT; DROP TABLE IF EXISTS `config_info_beta`; CREATE TABLE `config_info_beta` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', - `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'app_name', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', - `beta_ips` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'betaIps', - `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'md5', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'source user', - `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'source ip', - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', - `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_info_beta'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; -- ---------------------------- -- Records of config_info_beta @@ -103,20 +103,20 @@ COMMIT; DROP TABLE IF EXISTS `config_info_tag`; CREATE TABLE `config_info_tag` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_id', - `tag_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'tag_id', - `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'app_name', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', - `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'md5', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'source user', - `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'source ip', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_info_tag'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; -- ---------------------------- -- Records of config_info_tag @@ -130,16 +130,16 @@ COMMIT; DROP TABLE IF EXISTS `config_tags_relation`; CREATE TABLE `config_tags_relation` ( `id` bigint NOT NULL COMMENT 'id', - `tag_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'tag_name', - `tag_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'tag_type', - `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', - `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_id', + `tag_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id', `nid` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='config_tag_relation'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; -- ---------------------------- -- Records of config_tags_relation @@ -153,7 +153,7 @@ COMMIT; DROP TABLE IF EXISTS `group_capacity`; CREATE TABLE `group_capacity` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', @@ -164,7 +164,7 @@ CREATE TABLE `group_capacity` ( `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='集群、各Group容量信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; -- ---------------------------- -- Records of group_capacity @@ -179,23 +179,23 @@ DROP TABLE IF EXISTS `his_config_info`; CREATE TABLE `his_config_info` ( `id` bigint unsigned NOT NULL, `nid` bigint unsigned NOT NULL AUTO_INCREMENT, - `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, - `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, - `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'app_name', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, - `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, - `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `op_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '租户字段', - `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', + `src_user` text CHARACTER SET utf8 COLLATE utf8_bin, + `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `op_type` char(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='多租户改造'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; -- ---------------------------- -- Records of his_config_info @@ -208,11 +208,11 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `permissions`; CREATE TABLE `permissions` ( - `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, - `resource` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, - `action` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `role` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `resource` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `action` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_general_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -- ---------------------------- -- Records of permissions @@ -225,10 +225,10 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `roles`; CREATE TABLE `roles` ( - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, - `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `role` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_general_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -- ---------------------------- -- Records of roles @@ -243,7 +243,7 @@ COMMIT; DROP TABLE IF EXISTS `tenant_capacity`; CREATE TABLE `tenant_capacity` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', @@ -254,7 +254,7 @@ CREATE TABLE `tenant_capacity` ( `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='租户容量信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; -- ---------------------------- -- Records of tenant_capacity @@ -268,17 +268,17 @@ COMMIT; DROP TABLE IF EXISTS `tenant_info`; CREATE TABLE `tenant_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `kp` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'kp', - `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_id', - `tenant_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT 'tenant_name', - `tenant_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'tenant_desc', - `create_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'create_source', + `kp` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id', + `tenant_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint NOT NULL COMMENT '创建时间', `gmt_modified` bigint NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='tenant_info'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; -- ---------------------------- -- Records of tenant_info @@ -291,11 +291,11 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, - `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8_general_ci NOT NULL, + `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `password` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `enabled` tinyint(1) NOT NULL, PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_general_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -- ---------------------------- -- Records of users -- Gitee From 6f2948b793866a0cfc76fff925ef842b0927b729 Mon Sep 17 00:00:00 2001 From: fxw Date: Tue, 4 Apr 2023 14:04:09 +0800 Subject: [PATCH 065/238] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=E7=BB=8F?= =?UTF-8?q?=E8=BF=87=E4=BB=A3=E7=A0=81=E6=A3=80=E6=9F=A5=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E4=BD=BF=E7=94=A8hutool=E7=9A=84StrUtil=20fi?= =?UTF-8?q?x:=20=F0=9F=90=9B=20=E5=8E=BB=E6=8E=89=E4=B8=80=E6=AE=B5?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81=EF=BC=9B=20fix:=20?= =?UTF-8?q?=F0=9F=90=9B=20=E5=88=9B=E5=BB=BA=E7=A7=81=E6=9C=89=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/PigOAuthRequestInterceptor.java | 4 ++-- .../security/component/PigSecurityInnerAspect.java | 11 ++++++----- .../pig/common/security/util/SecurityUtils.java | 5 +++-- .../com/pig4cloud/pig/common/xss/core/XssHolder.java | 2 ++ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java index bc0aece4..edb5812f 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java @@ -1,7 +1,7 @@ package com.pig4cloud.pig.common.security.component; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.WebUtils; import feign.RequestInterceptor; @@ -52,7 +52,7 @@ public class PigOAuthRequestInterceptor implements RequestInterceptor { HttpServletRequest request = WebUtils.getRequest().get(); // 避免请求参数的 query token 无法传递 String token = tokenResolver.resolve(request); - if (StrUtil.isBlank(token)) { + if (StringUtils.isBlank(token)) { return; } template.header(HttpHeaders.AUTHORIZATION, diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java index ddae7846..5d812e5f 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java @@ -48,12 +48,13 @@ public class PigSecurityInnerAspect implements Ordered { @Around("@within(inner) || @annotation(inner)") public Object around(ProceedingJoinPoint point, Inner inner) { // 实际注入的inner实体由表达式后一个注解决定,即是方法上的@Inner注解实体,若方法上无@Inner注解,则获取类上的 - if (inner == null) { - Class clazz = point.getTarget().getClass(); - inner = AnnotationUtils.findAnnotation(clazz, Inner.class); - } + // 这段代码没有意义,拦截的就是@Inner注解,怎么会为null呢 +// if (inner == null) { +// Class clazz = point.getTarget().getClass(); +// inner = AnnotationUtils.findAnnotation(clazz, Inner.class); +// } String header = request.getHeader(SecurityConstants.FROM); - if (inner.value() && !StrUtil.equals(SecurityConstants.FROM_IN, header)) { + if (inner.value() && !SecurityConstants.FROM_IN.equals(header)) { log.warn("访问接口 {} 没有权限", point.getSignature().getName()); throw new AccessDeniedException("Access is denied"); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java index a26c9e6a..de5368e0 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java @@ -16,6 +16,7 @@ package com.pig4cloud.pig.common.security.util; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.service.PigUser; @@ -75,9 +76,9 @@ public class SecurityUtils { List roleIds = new ArrayList<>(); authorities.stream() - .filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) + .filter(granted -> CharSequenceUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) .forEach(granted -> { - String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); + String id = CharSequenceUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); roleIds.add(Long.parseLong(id)); }); return roleIds; diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java index 017b6749..c3a53952 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java @@ -23,6 +23,8 @@ package com.pig4cloud.pig.common.xss.core; */ public class XssHolder { + private XssHolder() {} + private static final ThreadLocal TL = new ThreadLocal<>(); private static final ThreadLocal TL_IGNORE = new ThreadLocal<>(); -- Gitee From ac8e2d7b345bf094f35861b4c1eedbf4dcda62a1 Mon Sep 17 00:00:00 2001 From: fxw Date: Tue, 4 Apr 2023 14:32:52 +0800 Subject: [PATCH 066/238] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E8=8E=B7=E5=8F=96HttpServletRequest=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/core/util/ClassUtils.java | 1 - .../pig/common/core/util/WebUtils.java | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java index 6668c673..bf689fcd 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java @@ -81,7 +81,6 @@ public class ClassUtils extends org.springframework.util.ClassUtils { specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // 先找方法,再找方法上的类 A annotation = AnnotatedElementUtils.findMergedAnnotation(specificMethod, annotationType); - ; if (null != annotation) { return annotation; } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java index d407e81d..47ac39db 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java @@ -105,13 +105,20 @@ public class WebUtils extends org.springframework.web.util.WebUtils { response.addCookie(cookie); } + public ServletRequestAttributes getServletRequestAttributes(){ + return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } + /** * 获取 HttpServletRequest * @return {HttpServletRequest} */ public Optional getRequest() { - return Optional - .ofNullable(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); + ServletRequestAttributes servletRequestAttributes = getServletRequestAttributes(); + if (servletRequestAttributes == null) { + return Optional.empty(); + } + return Optional.of(servletRequestAttributes.getRequest()); } /** @@ -119,7 +126,11 @@ public class WebUtils extends org.springframework.web.util.WebUtils { * @return {HttpServletResponse} */ public HttpServletResponse getResponse() { - return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + ServletRequestAttributes servletRequestAttributes = getServletRequestAttributes(); + if (servletRequestAttributes == null) { + throw new CheckedException("无法获取HttpServletRequest"); + } + return servletRequestAttributes.getResponse(); } /** -- Gitee From 5caae30c86e6c1179b6ffa225d32f3b5d9af967c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E5=B8=B8=E5=9D=A4?= Date: Thu, 13 Apr 2023 17:00:24 +0800 Subject: [PATCH 067/238] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D=E4=B8=BA=E9=A9=BC=E5=B3=B0=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/admin/controller/SysDeptController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java index 3e7df3a0..c0e4a2bd 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java @@ -115,13 +115,13 @@ public class SysDeptController { /** * 根据部门名查询部门信息 - * @param deptname 部门名 - * @return + * @param deptName 部门名 + * @return SysDept */ - @GetMapping("/details/{deptname}") - public R user(@PathVariable String deptname) { + @GetMapping("/details/{deptName}") + public R user(@PathVariable String deptName) { SysDept condition = new SysDept(); - condition.setName(deptname); + condition.setName(deptName); return R.ok(sysDeptService.getOne(new QueryWrapper<>(condition))); } -- Gitee From 9db49bda5efc0f8e1baad411234bf3b39f836c6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E5=B8=B8=E5=9D=A4?= Date: Thu, 13 Apr 2023 17:01:46 +0800 Subject: [PATCH 068/238] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/admin/api/feign/RemoteUserService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java index 3dfc3f08..0af6d9ba 100755 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java @@ -46,7 +46,6 @@ public interface RemoteUserService { /** * 通过手机号码查询用户、角色信息 * @param phone 手机号码 - * @param from 调用标志 * @return R */ @GetMapping(value = "/app/info/{phone}", headers = SecurityConstants.HEADER_FROM_IN) @@ -55,7 +54,6 @@ public interface RemoteUserService { /** * 根据部门id,查询对应的用户 id 集合 * @param deptIds 部门id 集合 - * @param from 调用标志 * @return 用户 id 集合 */ @GetMapping(value = "/user/ids", headers = SecurityConstants.HEADER_FROM_IN) -- Gitee From 4f1d71161bc57370e0b9a837b2e2589d1171d33b Mon Sep 17 00:00:00 2001 From: Lht Date: Thu, 13 Apr 2023 18:32:29 +0800 Subject: [PATCH 069/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.17 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7b7b13b4..8f494cf9 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.1 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.16 | +| hutool | 5.8.17 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index ba87b8f4..ef5e0fac 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.16 + 5.8.17 2.7.4 1.8.4 -- Gitee From a13d5f286463284a8cafdc944a8961aaa9856386 Mon Sep 17 00:00:00 2001 From: Lht Date: Thu, 13 Apr 2023 18:35:14 +0800 Subject: [PATCH 070/238] :art: Improving structure / format of the code. spring-format --- .../java/com/pig4cloud/pig/common/core/util/WebUtils.java | 2 +- .../common/security/component/PigSecurityInnerAspect.java | 8 ++++---- .../java/com/pig4cloud/pig/common/xss/core/XssHolder.java | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java index 47ac39db..11a842bd 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java @@ -105,7 +105,7 @@ public class WebUtils extends org.springframework.web.util.WebUtils { response.addCookie(cookie); } - public ServletRequestAttributes getServletRequestAttributes(){ + public ServletRequestAttributes getServletRequestAttributes() { return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java index 5d812e5f..6d55f61e 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java @@ -49,10 +49,10 @@ public class PigSecurityInnerAspect implements Ordered { public Object around(ProceedingJoinPoint point, Inner inner) { // 实际注入的inner实体由表达式后一个注解决定,即是方法上的@Inner注解实体,若方法上无@Inner注解,则获取类上的 // 这段代码没有意义,拦截的就是@Inner注解,怎么会为null呢 -// if (inner == null) { -// Class clazz = point.getTarget().getClass(); -// inner = AnnotationUtils.findAnnotation(clazz, Inner.class); -// } + // if (inner == null) { + // Class clazz = point.getTarget().getClass(); + // inner = AnnotationUtils.findAnnotation(clazz, Inner.class); + // } String header = request.getHeader(SecurityConstants.FROM); if (inner.value() && !SecurityConstants.FROM_IN.equals(header)) { log.warn("访问接口 {} 没有权限", point.getSignature().getName()); diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java index c3a53952..128044e3 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java @@ -23,7 +23,8 @@ package com.pig4cloud.pig.common.xss.core; */ public class XssHolder { - private XssHolder() {} + private XssHolder() { + } private static final ThreadLocal TL = new ThreadLocal<>(); -- Gitee From 1797535f0bff5d1583213749912f466d2715a52f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Wed, 19 Apr 2023 14:13:17 +0800 Subject: [PATCH 071/238] =?UTF-8?q?:arrow=5Fup:=20=E5=8D=87=E7=BA=A7=20spr?= =?UTF-8?q?ing-authorization-server=200.4.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8f494cf9..e63bf849 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ | Spring Boot | 2.7.10 | | Spring Cloud | 2021.0.6 | | Spring Cloud Alibaba | 2021.0.5.0 | -| Spring Authorization Server | 0.4.1 | +| Spring Authorization Server | 0.4.2 | | Mybatis Plus | 3.5.3.1 | | hutool | 5.8.17 | diff --git a/pom.xml b/pom.xml index 82657ebe..74080b83 100755 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 1.8 1.8 2.7.10 - 0.4.1 + 0.4.2 3.6.0 2.2.2 2.3 -- Gitee From b794b86c5ae583fda0bd3e1b9f1b001adb62f30f Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Fri, 21 Apr 2023 02:27:13 +0000 Subject: [PATCH 072/238] springboot 2.7.11 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74080b83..86273b21 100755 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.10 + 2.7.11 2021.0.6 2021.0.5.0 UTF-8 -- Gitee From 8ef8d414e29f2b490c75532c7e2ec28422def452 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 21 Apr 2023 13:18:14 +0800 Subject: [PATCH 073/238] :arrow_up: Upgrading dependencies. springboot 2.7.11 --- README.md | 2 +- pom.xml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e63bf849..8f4cc7af 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ | 依赖 | 版本 | | ---------------------- |------------| -| Spring Boot | 2.7.10 | +| Spring Boot | 2.7.11 | | Spring Cloud | 2021.0.6 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.2 | diff --git a/pom.xml b/pom.xml index 86273b21..b716876a 100755 --- a/pom.xml +++ b/pom.xml @@ -159,6 +159,13 @@ true + + + + repackage + + + io.fabric8 -- Gitee From 5b963bae19340ddbb865ec5225f9686d96b246d2 Mon Sep 17 00:00:00 2001 From: jiakang Date: Thu, 27 Apr 2023 11:44:56 +0800 Subject: [PATCH 074/238] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E9=A1=B9=E6=8E=92=E5=BA=8F=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=AD=97=E5=85=B8=E9=A1=B9=E6=9C=AA=E6=B8=85=E9=99=A4?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig4cloud/pig/admin/controller/SysDictController.java | 5 +++-- .../pig/admin/service/impl/SysDictItemServiceImpl.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index c9b10d1c..0fb87a42 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -76,7 +76,8 @@ public class SysDictController { @GetMapping("/page") public R> getDictPage(Page page, SysDict sysDict) { return R.ok(sysDictService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()))); + .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()) + .orderByDesc(SysDict::getUpdateTime))); } /** @@ -87,7 +88,7 @@ public class SysDictController { @GetMapping("/key/{key}") @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#key") public R> getDictByKey(@PathVariable String key) { - return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictKey, key))); + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictKey, key).orderByAsc(SysDictItem::getSortOrder))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java index 65c729f2..b43e6dc6 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java @@ -65,7 +65,7 @@ public class SysDictItemServiceImpl extends ServiceImpl Date: Thu, 27 Apr 2023 14:56:39 +0800 Subject: [PATCH 075/238] =?UTF-8?q?:art:=20Improving=20structure=20/=20for?= =?UTF-8?q?mat=20of=20the=20code.=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/admin/controller/SysDictController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index 0fb87a42..3817925a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -75,9 +75,10 @@ public class SysDictController { */ @GetMapping("/page") public R> getDictPage(Page page, SysDict sysDict) { - return R.ok(sysDictService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()) - .orderByDesc(SysDict::getUpdateTime))); + return R.ok(sysDictService.page(page, + Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()) + .orderByDesc(SysDict::getUpdateTime))); } /** @@ -88,7 +89,10 @@ public class SysDictController { @GetMapping("/key/{key}") @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#key") public R> getDictByKey(@PathVariable String key) { - return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictKey, key).orderByAsc(SysDictItem::getSortOrder))); + return R.ok(sysDictItemService.list(Wrappers.query() + .lambda() + .eq(SysDictItem::getDictKey, key) + .orderByAsc(SysDictItem::getSortOrder))); } /** -- Gitee From 1911f1847b56d25235139302c80d2ccf2b18df9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 8 May 2023 08:09:00 +0800 Subject: [PATCH 076/238] =?UTF-8?q?:construction=5Fworker:=20github?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E6=89=AB=E6=8F=8F=E4=BE=9D=E8=B5=96=E5=B9=B6?= =?UTF-8?q?=E5=88=9B=E5=BB=BAPR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3e81d44f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,30 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "maven" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" + # https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#ignore + ignore: + - dependency-name: org.springframework.boot:spring-boot-dependencies + # spring-boot 3.0 不支持 JDK 8 + versions: + - ">= 3" + - dependency-name: org.springframework.cloud:spring-cloud-dependencies + # spring-cloud 2022 不支持 JDK 8 + versions: + - ">= 2022" + - dependency-name: de.codecentric:spring-boot-admin-dependencies + # spring-boot-admin 3.0 不支持 JDK 8 + versions: + - ">= 3" + - dependency-name: org.springframework.security:spring-security-oauth2-authorization-server + # spring-security-oauth2-authorization-server 1.0 不支持 JDK 8 + versions: + - ">= 1" -- Gitee From 876fb059b33393cca6d9d46d919bc3d7283f614f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 8 May 2023 08:11:56 +0800 Subject: [PATCH 077/238] =?UTF-8?q?:construction=5Fworker:=20github?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E6=89=AB=E6=8F=8F=E4=BE=9D=E8=B5=96=E5=B9=B6?= =?UTF-8?q?=E5=88=9B=E5=BB=BAPR=EF=BC=9A=E9=99=90=E5=88=B6=E5=88=86?= =?UTF-8?q?=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3e81d44f..f71c644f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,6 +10,7 @@ updates: directory: "/" # Location of package manifests schedule: interval: "daily" + target-branch: "dev" # https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#ignore ignore: - dependency-name: org.springframework.boot:spring-boot-dependencies -- Gitee From ac5f59ca56b1642d7d18c601d82208b5ebbf7470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 8 May 2023 10:10:24 +0800 Subject: [PATCH 078/238] =?UTF-8?q?:construction=5Fworker:=20github?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E6=89=AB=E6=8F=8F=E4=BE=9D=E8=B5=96=E5=B9=B6?= =?UTF-8?q?=E5=88=9B=E5=BB=BAPR=EF=BC=9A=E9=99=90=E5=88=B6spring-cloud-ali?= =?UTF-8?q?baba=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f71c644f..dfac2bc4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,6 +21,14 @@ updates: # spring-cloud 2022 不支持 JDK 8 versions: - ">= 2022" + - dependency-name: com.alibaba.cloud:spring-cloud-alibaba-dependencies + # spring-cloud-alibaba 2022 不支持 JDK 8 + versions: + - ">= 2022" + - dependency-name: com.alibaba.cloud:spring-cloud-alibaba-dependencies + # spring-cloud-alibaba 2021.1 为命名错误 + versions: + - "= 2021.1" - dependency-name: de.codecentric:spring-boot-admin-dependencies # spring-boot-admin 3.0 不支持 JDK 8 versions: -- Gitee From 6db720cd06d9c5b84bb831a298bce0c3f54f841b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 8 May 2023 10:13:11 +0800 Subject: [PATCH 079/238] =?UTF-8?q?:construction=5Fworker:=20github?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E6=89=AB=E6=8F=8F=E4=BE=9D=E8=B5=96=E5=B9=B6?= =?UTF-8?q?=E5=88=9B=E5=BB=BAPR=EF=BC=9A=E7=9B=AE=E6=A0=87=E5=88=86?= =?UTF-8?q?=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index dfac2bc4..e2a4b3de 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,6 +10,7 @@ updates: directory: "/" # Location of package manifests schedule: interval: "daily" + # 目标分支 target-branch: "dev" # https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#ignore ignore: @@ -37,3 +38,17 @@ updates: # spring-security-oauth2-authorization-server 1.0 不支持 JDK 8 versions: - ">= 1" + + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "daily" + # 目标分支 + target-branch: "sca-springboot3" + + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "daily" + # 目标分支 + target-branch: "sct-springboot3" -- Gitee From 9949a72838f8f4f4cb829c6453032a0de3e919b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 8 May 2023 17:06:45 +0800 Subject: [PATCH 080/238] =?UTF-8?q?:construction=5Fworker:=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20java=2017=20=E7=94=A8=E4=BA=8E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=9C=A8=20java=2017=20=E7=9A=84=E7=8E=AF=E5=A2=83=E4=B8=8B?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E8=83=BD=E8=BF=90=E8=A1=8C=20=E6=AF=94?= =?UTF-8?q?=E5=A6=82=EF=BC=9A=E9=98=B2=E6=AD=A2=E5=9C=A8=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=B8=AD=E4=BD=BF=E7=94=A8=E4=BA=86=E4=B8=80=E4=BA=9B=20sun=20?= =?UTF-8?q?=E5=8C=85=E4=B8=8B=E7=9A=84=E7=B1=BB=EF=BC=8C=E8=80=8C=20java?= =?UTF-8?q?=2017=20=E4=B8=8D=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 082741b9..9b2b5736 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java-version: [ 8, 11 ] + java-version: [ 8, 11, 17 ] steps: - uses: actions/checkout@v2 - name: Set up JDK ${{ matrix.java-version }} -- Gitee From 118ddf45ae60590312f74fc55022317b93118cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Mon, 8 May 2023 17:27:55 +0800 Subject: [PATCH 081/238] =?UTF-8?q?:construction=5Fworker:=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 082741b9..d8b1568d 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -16,9 +16,9 @@ jobs: matrix: java-version: [ 8, 11 ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: java-version: ${{ matrix.java-version }} distribution: 'zulu' -- Gitee From 1b58b391b0270df10de83bfe69ee19374b842135 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 07:53:26 +0000 Subject: [PATCH 082/238] :arrow_up: Bump mysql-connector-j from 8.0.31 to 8.0.33 Bumps [mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.0.31 to 8.0.33. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/8.0/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.0.31...8.0.33) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index ef5e0fac..42a7d31d 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -26,7 +26,7 @@ 1.6.9 2.2.0 3.5.3.1 - 8.0.31 + 8.0.33 1.6.1 1.2.6 7.1 -- Gitee From 06a5cda10bba1aa8c65c85136af2d695d2d4db5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 07:53:49 +0000 Subject: [PATCH 083/238] :arrow_up: Bump hutool-bom from 5.8.17 to 5.8.18 Bumps [hutool-bom](https://github.com/looly/hutool) from 5.8.17 to 5.8.18. - [Release notes](https://github.com/looly/hutool/releases) - [Changelog](https://github.com/dromara/hutool/blob/v5-master/CHANGELOG.md) - [Commits](https://github.com/looly/hutool/commits) --- updated-dependencies: - dependency-name: cn.hutool:hutool-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index ef5e0fac..6ba2abc2 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.17 + 5.8.18 2.7.4 1.8.4 -- Gitee From 8e2d1da99acce3a756eea30a7915b9b435d4f58a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 07:53:54 +0000 Subject: [PATCH 084/238] :arrow_up: Bump spring-cloud-dependencies from 2021.0.6 to 2021.0.7 Bumps [spring-cloud-dependencies](https://github.com/spring-cloud/spring-cloud-build) from 2021.0.6 to 2021.0.7. - [Commits](https://github.com/spring-cloud/spring-cloud-build/commits) --- updated-dependencies: - dependency-name: org.springframework.cloud:spring-cloud-dependencies dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 pom.xml diff --git a/pom.xml b/pom.xml old mode 100755 new mode 100644 index b716876a..acbfa251 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.7.11 - 2021.0.6 + 2021.0.7 2021.0.5.0 UTF-8 1.8 -- Gitee From d0ac469e01c88b7480ea4c92bd21d1544b317542 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 12 May 2023 16:00:49 +0800 Subject: [PATCH 085/238] =?UTF-8?q?:green=5Fheart:=20Fixing=20CI=20Build.?= =?UTF-8?q?=20ci=20=E4=B8=8D=E6=94=AF=E6=8C=81mirror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/mirror.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 47028f88..35d6cb69 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -3,8 +3,6 @@ name: 同步代码 on: push: branches: [ master,dev ] - pull_request: - branches: [ master,dev ] jobs: sync: -- Gitee From 00984915b4988c35670573eadef507e4ff727f3b Mon Sep 17 00:00:00 2001 From: xianxin Date: Fri, 12 May 2023 17:06:27 +0800 Subject: [PATCH 086/238] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98Red?= =?UTF-8?q?isUtils=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E4=BA=86=E5=90=84=E7=A7=8DRedisTemplate=E5=90=84=E7=A7=8D?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=E7=B3=96=EF=BC=8C=E5=93=8D=E5=BA=94=E4=BD=93?= =?UTF-8?q?R=E4=B8=AD=E5=A2=9E=E5=8A=A0=E5=86=85=E9=83=A8=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=98=AF=E5=90=A6=E6=88=90=E5=8A=9F=E5=88=A4=E6=96=AD?= =?UTF-8?q?R.isSuccess()=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BF=94=E5=9B=9E=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=A0=81R.result(null,=201001,=20"=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E6=8F=90=E7=A4=BA")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/common/core/util/R.java | 8 + .../pig/common/core/util/RedisUtils.java | 819 ++++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + 3 files changed, 828 insertions(+) create mode 100644 pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java index 7b79afa2..e33f1491 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java @@ -76,6 +76,10 @@ public class R implements Serializable { return restResult(data, CommonConstants.FAIL, msg); } + public static R result(T data, int code, String msg) { + return restResult(data, code, msg); + } + public static R restResult(T data, int code, String msg) { R apiResult = new R<>(); apiResult.setCode(code); @@ -84,4 +88,8 @@ public class R implements Serializable { return apiResult; } + public Boolean isSuccess() { + return (this.code == CommonConstants.SUCCESS); + } + } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java new file mode 100644 index 00000000..4172fc54 --- /dev/null +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -0,0 +1,819 @@ +package com.pig4cloud.pig.common.core.util; + +import cn.hutool.core.convert.Convert; +import lombok.experimental.UtilityClass; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * 缓存工具类 + * + * @author XX + * @date 2023/05/12 + */ +@UtilityClass +public class RedisUtils { + + private static final Long SUCCESS = 1L; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 根据 key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 查找匹配key + * + * @param pattern key + * @return / + */ + public List scan(String pattern) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 分页查询 key + * + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + public void del(String... key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 获取锁 + * + * @param lockKey 锁key + * @param value value + * @param expireTime:单位-秒 + * @return boolean + */ + public boolean getLock(String lockKey, String value, int expireTime) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Boolean result = false; + try { + result = redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS); + if (null == result) { + result = false; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 释放锁 + * + * @param lockKey 锁key + * @param value value + * @return boolean + */ + public boolean releaseLock(String lockKey, String value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); + Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value); + if (SUCCESS.equals(Convert.toLong(result))) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + // ============================String============================= + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 批量获取 + * + * @param keys + * @return + */ + public List multiGet(List keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Object obj = redisTemplate.opsForValue().multiGet(Collections.singleton(keys)); + return null; + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time, TimeUnit timeUnit) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, timeUnit); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + // ================================Map================================= + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().entries(key); + + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获集合key1和集合key2的差集元素 + * + * @param key 键 + * @return + */ + public Set sDifference(String key, String otherKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().difference(key, otherKey); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().remove(key, count, value); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将zSet数据放入缓存 + * + * @param key + * @param time + * @param tuples + * @return + */ + public long zSetAndTime(String key, long time, Set> tuples) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForZSet().add(key, tuples); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * Sorted set:有序集合获取 + * + * @param key + * @param min + * @param max + * @return + */ + public Set zRangeByScore(String key, double min, double max) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, min, max); + + } + + /** + * Sorted set:有序集合获取 正序 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.range(key, start, end); + + } + + /** + * Sorted set:有序集合获取 倒叙 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zReverseRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.reverseRange(key, start, end); + + } + + /** + * 获取zSet缓存的长度 + * + * @param key 键 + * @return + */ + public long zGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForZSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 6fe4f1ad..81cc2017 100644 --- a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,3 +4,4 @@ com.pig4cloud.pig.common.core.config.RedisTemplateConfiguration com.pig4cloud.pig.common.core.config.RestTemplateConfiguration com.pig4cloud.pig.common.core.util.SpringContextHolder com.pig4cloud.pig.common.core.config.WebMvcConfiguration +com.pig4cloud.pig.common.core.util.RedisUtils \ No newline at end of file -- Gitee From 42942ba4ae1524116e6c054c6ed3505c8ca2867a Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 13 May 2023 10:56:58 +0800 Subject: [PATCH 087/238] =?UTF-8?q?:art:=20Improving=20structure=20/=20for?= =?UTF-8?q?mat=20of=20the=20code.=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/core/util/RedisUtils.java | 1578 ++++++++--------- 1 file changed, 784 insertions(+), 794 deletions(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java index 4172fc54..fe17651d 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -21,799 +21,789 @@ import java.util.concurrent.TimeUnit; @UtilityClass public class RedisUtils { - private static final Long SUCCESS = 1L; - - /** - * 指定缓存失效时间 - * - * @param key 键 - * @param time 时间(秒) - */ - public boolean expire(String key, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - if (time > 0) { - redisTemplate.expire(key, time, TimeUnit.SECONDS); - } - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - /** - * 根据 key 获取过期时间 - * - * @param key 键 不能为null - * @return 时间(秒) 返回0代表为永久有效 - */ - public long getExpire(Object key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.getExpire(key, TimeUnit.SECONDS); - } - - /** - * 查找匹配key - * - * @param pattern key - * @return / - */ - public List scan(String pattern) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(); - while (cursor.hasNext()) { - result.add(new String(cursor.next())); - } - try { - RedisConnectionUtils.releaseConnection(rc, factory); - } catch (Exception e) { - e.printStackTrace(); - } - return result; - } - - /** - * 分页查询 key - * - * @param patternKey key - * @param page 页码 - * @param size 每页数目 - * @return / - */ - public List findKeysForPage(String patternKey, int page, int size) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(size); - int tmpIndex = 0; - int fromIndex = page * size; - int toIndex = page * size + size; - while (cursor.hasNext()) { - if (tmpIndex >= fromIndex && tmpIndex < toIndex) { - result.add(new String(cursor.next())); - tmpIndex++; - continue; - } - // 获取到满足条件的数据后,就可以退出了 - if (tmpIndex >= toIndex) { - break; - } - tmpIndex++; - cursor.next(); - } - try { - RedisConnectionUtils.releaseConnection(rc, factory); - } catch (Exception e) { - e.printStackTrace(); - } - return result; - } - - /** - * 判断key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public boolean hasKey(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.hasKey(key); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除缓存 - * - * @param key 可以传一个值 或多个 - */ - public void del(String... key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - if (key != null && key.length > 0) { - if (key.length == 1) { - redisTemplate.delete(key[0]); - } else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); - } - } - } - - /** - * 获取锁 - * - * @param lockKey 锁key - * @param value value - * @param expireTime:单位-秒 - * @return boolean - */ - public boolean getLock(String lockKey, String value, int expireTime) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Boolean result = false; - try { - result = redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS); - if (null == result) { - result = false; - } - } catch (Exception e) { - e.printStackTrace(); - } - return result; - } - - /** - * 释放锁 - * - * @param lockKey 锁key - * @param value value - * @return boolean - */ - public boolean releaseLock(String lockKey, String value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; - RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); - Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value); - if (SUCCESS.equals(Convert.toLong(result))) { - return true; - } - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - // ============================String============================= - - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public Object get(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return key == null ? null : redisTemplate.opsForValue().get(key); - } - - /** - * 批量获取 - * - * @param keys - * @return - */ - public List multiGet(List keys) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Object obj = redisTemplate.opsForValue().multiGet(Collections.singleton(keys)); - return null; - } - - /** - * 普通缓存放入 - * - * @param key 键 - * @param value 值 - * @return true成功 false失败 - */ - public boolean set(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForValue().set(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { - set(key, value); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间 - * @param timeUnit 类型 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time, TimeUnit timeUnit) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, timeUnit); - } else { - set(key, value); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - // ================================Map================================= - - /** - * HashGet - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return 值 - */ - public Object hget(String key, String item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().get(key, item); - } - - /** - * 获取hashKey对应的所有键值 - * - * @param key 键 - * @return 对应的多个键值 - */ - public Map hmget(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().entries(key); - - } - - /** - * HashSet - * - * @param key 键 - * @param map 对应多个键值 - * @return true 成功 false 失败 - */ - public boolean hmset(String key, Map map) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().putAll(key, map); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * HashSet 并设置时间 - * - * @param key 键 - * @param map 对应多个键值 - * @param time 时间(秒) - * @return true成功 false失败 - */ - public boolean hmset(String key, Map map, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().putAll(key, map); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().put(key, item, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().put(key, item, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除hash表中的值 - * - * @param key 键 不能为null - * @param item 项 可以使多个 不能为null - */ - public void hdel(String key, Object... item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForHash().delete(key, item); - } - - /** - * 判断hash表中是否有该项的值 - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return true 存在 false不存在 - */ - public boolean hHasKey(String key, String item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().hasKey(key, item); - } - - /** - * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * - * @param key 键 - * @param item 项 - * @param by 要增加几(大于0) - * @return - */ - public double hincr(String key, String item, double by) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().increment(key, item, by); - } - - /** - * hash递减 - * - * @param key 键 - * @param item 项 - * @param by 要减少记(小于0) - * @return - */ - public double hdecr(String key, String item, double by) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().increment(key, item, -by); - } - - // ============================set============================= - - /** - * 根据key获取Set中的所有值 - * - * @param key 键 - * @return - */ - public Set sGet(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().members(key); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 根据value从一个set中查询,是否存在 - * - * @param key 键 - * @param value 值 - * @return true 存在 false不存在 - */ - public boolean sHasKey(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().isMember(key, value); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将数据放入set缓存 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSet(String key, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().add(key, values); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 将set数据放入缓存 - * - * @param key 键 - * @param time 时间(秒) - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSetAndTime(String key, long time, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 获取set缓存的长度 - * - * @param key 键 - * @return - */ - public long sGetSetSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 移除值为value的 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 移除的个数 - */ - public long setRemove(String key, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 获集合key1和集合key2的差集元素 - * - * @param key 键 - * @return - */ - public Set sDifference(String key, String otherKey) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().difference(key, otherKey); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - // ===============================list================================= - - /** - * 获取list缓存的内容 - * - * @param key 键 - * @param start 开始 - * @param end 结束 0 到 -1代表所有值 - * @return - */ - public List lGet(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().range(key, start, end); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 获取list缓存的长度 - * - * @param key 键 - * @return - */ - public long lGetListSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 通过索引 获取list中的值 - * - * @param key 键 - * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 - * @return - */ - public Object lGetIndex(String key, long index) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().index(key, index); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPush(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, List value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPushAll(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, List value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 根据索引修改list中的某条数据 - * - * @param key 键 - * @param index 索引 - * @param value 值 - * @return / - */ - public boolean lUpdateIndex(String key, long index, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().set(key, index, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 移除N个值为value - * - * @param key 键 - * @param count 移除多少个 - * @param value 值 - * @return 移除的个数 - */ - public long lRemove(String key, long count, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().remove(key, count, value); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 将zSet数据放入缓存 - * - * @param key - * @param time - * @param tuples - * @return - */ - public long zSetAndTime(String key, long time, Set> tuples) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - Long count = redisTemplate.opsForZSet().add(key, tuples); - if (time > 0) { - expire(key, time); - } - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * Sorted set:有序集合获取 - * - * @param key - * @param min - * @param max - * @return - */ - public Set zRangeByScore(String key, double min, double max) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.rangeByScore(key, min, max); - - } - - /** - * Sorted set:有序集合获取 正序 - * - * @param key - * @param start - * @param end - * @return - */ - public Set zRange(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.range(key, start, end); - - } - - /** - * Sorted set:有序集合获取 倒叙 - * - * @param key - * @param start - * @param end - * @return - */ - public Set zReverseRange(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.reverseRange(key, start, end); - - } - - /** - * 获取zSet缓存的长度 - * - * @param key 键 - * @return - */ - public long zGetSetSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForZSet().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } + private static final Long SUCCESS = 1L; + + /** + * 指定缓存失效时间 + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 根据 key 获取过期时间 + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 查找匹配key + * @param pattern key + * @return / + */ + public List scan(String pattern) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } + catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 分页查询 key + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } + catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 判断key是否存在 + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.hasKey(key); + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * @param key 可以传一个值 或多个 + */ + public void del(String... key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } + else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 获取锁 + * @param lockKey 锁key + * @param value value + * @param expireTime:单位-秒 + * @return boolean + */ + public boolean getLock(String lockKey, String value, int expireTime) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Boolean result = false; + try { + result = redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS); + if (null == result) { + result = false; + } + } + catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 释放锁 + * @param lockKey 锁key + * @param value value + * @return boolean + */ + public boolean releaseLock(String lockKey, String value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); + Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value); + if (SUCCESS.equals(Convert.toLong(result))) { + return true; + } + } + catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + // ============================String============================= + + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + public Object get(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 批量获取 + * @param keys + * @return + */ + public List multiGet(List keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Object obj = redisTemplate.opsForValue().multiGet(Collections.singleton(keys)); + return null; + } + + /** + * 普通缓存放入 + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForValue().set(key, value); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } + else { + set(key, value); + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * @param key 键 + * @param value 值 + * @param time 时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time, TimeUnit timeUnit) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, timeUnit); + } + else { + set(key, value); + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + // ================================Map================================= + + /** + * HashGet + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().entries(key); + + } + + /** + * HashSet + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * @param key 键 + * @return + */ + public Set sGet(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().members(key); + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().isMember(key, value); + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().add(key, values); + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().size(key); + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获集合key1和集合key2的差集元素 + * @param key 键 + * @return + */ + public Set sDifference(String key, String otherKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().difference(key, otherKey); + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().range(key, start, end); + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().size(key); + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().index(key, index); + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().remove(key, count, value); + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将zSet数据放入缓存 + * @param key + * @param time + * @param tuples + * @return + */ + public long zSetAndTime(String key, long time, Set> tuples) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForZSet().add(key, tuples); + if (time > 0) { + expire(key, time); + } + return count; + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * Sorted set:有序集合获取 + * @param key + * @param min + * @param max + * @return + */ + public Set zRangeByScore(String key, double min, double max) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, min, max); + + } + + /** + * Sorted set:有序集合获取 正序 + * @param key + * @param start + * @param end + * @return + */ + public Set zRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.range(key, start, end); + + } + + /** + * Sorted set:有序集合获取 倒叙 + * @param key + * @param start + * @param end + * @return + */ + public Set zReverseRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.reverseRange(key, start, end); + + } + + /** + * 获取zSet缓存的长度 + * @param key 键 + * @return + */ + public long zGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForZSet().size(key); + } + catch (Exception e) { + e.printStackTrace(); + return 0; + } + } } -- Gitee From e3a9127d4e772eedafc5aa7d42a3fea3e1c7747d Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 14 May 2023 23:39:57 +0800 Subject: [PATCH 088/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=B3=9B=E5=9E=8B=E4=BC=98=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20RedisUtils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/core/util/RedisUtils.java | 434 ++++++------------ 1 file changed, 132 insertions(+), 302 deletions(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java index fe17651d..c02039a7 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -7,7 +7,6 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; -import org.springframework.util.CollectionUtils; import java.util.*; import java.util.concurrent.TimeUnit; @@ -29,16 +28,10 @@ public class RedisUtils { * @param time 时间(秒) */ public boolean expire(String key, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - if (time > 0) { - redisTemplate.expire(key, time, TimeUnit.SECONDS); - } - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate) + .filter(template -> time > 0) + .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); return true; } @@ -48,8 +41,10 @@ public class RedisUtils { * @return 时间(秒) 返回0代表为永久有效 */ public long getExpire(Object key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.getExpire(key, TimeUnit.SECONDS); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate) + .map(template -> template.getExpire(key, TimeUnit.SECONDS)) + .orElse(-1L); } /** @@ -58,22 +53,19 @@ public class RedisUtils { * @return / */ public List scan(String pattern) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(); - while (cursor.hasNext()) { - result.add(new String(cursor.next())); - } - try { + return Optional.ofNullable(redisTemplate).map(template -> { + RedisConnectionFactory factory = template.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } RedisConnectionUtils.releaseConnection(rc, factory); - } - catch (Exception e) { - e.printStackTrace(); - } - return result; + return result; + }).orElse(Collections.emptyList()); } /** @@ -106,12 +98,7 @@ public class RedisUtils { tmpIndex++; cursor.next(); } - try { - RedisConnectionUtils.releaseConnection(rc, factory); - } - catch (Exception e) { - e.printStackTrace(); - } + RedisConnectionUtils.releaseConnection(rc, factory); return result; } @@ -121,30 +108,20 @@ public class RedisUtils { * @return true 存在 false不存在 */ public boolean hasKey(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.hasKey(key); - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> template.hasKey(key)).orElse(false); } /** * 删除缓存 - * @param key 可以传一个值 或多个 + * @param keys 可以传一个值 或多个 */ - public void del(String... key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - if (key != null && key.length > 0) { - if (key.length == 1) { - redisTemplate.delete(key[0]); - } - else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); - } - } + public void del(String... keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(keys) + .map(Arrays::asList) + .filter(keysList -> !keysList.isEmpty()) + .ifPresent(redisTemplate::delete); } /** @@ -155,18 +132,10 @@ public class RedisUtils { * @return boolean */ public boolean getLock(String lockKey, String value, int expireTime) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Boolean result = false; - try { - result = redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS); - if (null == result) { - result = false; - } - } - catch (Exception e) { - e.printStackTrace(); - } - return result; + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate) + .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) + .orElse(false); } /** @@ -176,19 +145,13 @@ public class RedisUtils { * @return boolean */ public boolean releaseLock(String lockKey, String value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; - RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); - Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value); - if (SUCCESS.equals(Convert.toLong(result))) { - return true; - } - } - catch (Exception e) { - e.printStackTrace(); - } - return false; + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); + return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) + .map(Convert::toLong) + .filter(SUCCESS::equals) + .isPresent(); } // ============================String============================= @@ -198,9 +161,9 @@ public class RedisUtils { * @param key 键 * @return 值 */ - public Object get(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return key == null ? null : redisTemplate.opsForValue().get(key); + public T get(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForValue().get(key); } /** @@ -208,10 +171,9 @@ public class RedisUtils { * @param keys * @return */ - public List multiGet(List keys) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Object obj = redisTemplate.opsForValue().multiGet(Collections.singleton(keys)); - return null; + public List multiGet(List keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForValue().multiGet(keys); } /** @@ -221,15 +183,12 @@ public class RedisUtils { * @return true成功 false失败 */ public boolean set(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForValue().set(key, value); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForValue().set(key, value); return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }); + return true; } /** @@ -240,20 +199,16 @@ public class RedisUtils { * @return true成功 false 失败 */ public boolean set(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + template.opsForValue().set(key, value, time, TimeUnit.SECONDS); } else { - set(key, value); + template.opsForValue().set(key, value); } return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }).orElse(false); } /** @@ -264,21 +219,18 @@ public class RedisUtils { * @param timeUnit 类型 * @return true成功 false 失败 */ - public boolean set(String key, Object value, long time, TimeUnit timeUnit) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { + public boolean set(String key, T value, long time, TimeUnit timeUnit) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, timeUnit); + template.opsForValue().set(key, value, time, timeUnit); } else { - set(key, value); + template.opsForValue().set(key, value); } return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }); + return true; } // ================================Map================================= @@ -286,12 +238,12 @@ public class RedisUtils { /** * HashGet * @param key 键 不能为null - * @param item 项 不能为null + * @param hashKey 项 不能为null * @return 值 */ - public Object hget(String key, String item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().get(key, item); + public HV hget(String key, HK hashKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().get(key, hashKey); } /** @@ -299,10 +251,9 @@ public class RedisUtils { * @param key 键 * @return 对应的多个键值 */ - public Map hmget(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().entries(key); - + public Map hmget(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().entries(key); } /** @@ -312,15 +263,12 @@ public class RedisUtils { * @return true 成功 false 失败 */ public boolean hmset(String key, Map map) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().putAll(key, map); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().putAll(key, map); return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }); + return true; } /** @@ -331,18 +279,15 @@ public class RedisUtils { * @return true成功 false失败 */ public boolean hmset(String key, Map map, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().putAll(key, map); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().putAll(key, map); if (time > 0) { - expire(key, time); + template.expire(key, time, TimeUnit.SECONDS); } return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }); + return true; } /** @@ -353,15 +298,11 @@ public class RedisUtils { * @return true 成功 false失败 */ public boolean hset(String key, String item, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().put(key, item, value); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().put(key, item, value); return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }).orElse(false); } /** @@ -373,18 +314,14 @@ public class RedisUtils { * @return true 成功 false失败 */ public boolean hset(String key, String item, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForHash().put(key, item, value); + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().put(key, item, value); if (time > 0) { - expire(key, time); + template.expire(key, time, TimeUnit.SECONDS); } return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + }).orElse(false); } /** @@ -439,15 +376,9 @@ public class RedisUtils { * @param key 键 * @return */ - public Set sGet(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().members(key); - } - catch (Exception e) { - e.printStackTrace(); - return null; - } + public Set sGet(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().members(key); } /** @@ -458,13 +389,7 @@ public class RedisUtils { */ public boolean sHasKey(String key, Object value) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().isMember(key, value); - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + return redisTemplate.opsForSet().isMember(key, value); } /** @@ -475,13 +400,7 @@ public class RedisUtils { */ public long sSet(String key, Object... values) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().add(key, values); - } - catch (Exception e) { - e.printStackTrace(); - return 0; - } + return redisTemplate.opsForSet().add(key, values); } /** @@ -493,17 +412,11 @@ public class RedisUtils { */ public long sSetAndTime(String key, long time, Object... values) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } - catch (Exception e) { - e.printStackTrace(); - return 0; + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); } + return count; } /** @@ -513,13 +426,7 @@ public class RedisUtils { */ public long sGetSetSize(String key) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().size(key); - } - catch (Exception e) { - e.printStackTrace(); - return 0; - } + return redisTemplate.opsForSet().size(key); } /** @@ -530,14 +437,8 @@ public class RedisUtils { */ public long setRemove(String key, Object... values) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } - catch (Exception e) { - e.printStackTrace(); - return 0; - } + Long count = redisTemplate.opsForSet().remove(key, values); + return count; } /** @@ -545,15 +446,9 @@ public class RedisUtils { * @param key 键 * @return */ - public Set sDifference(String key, String otherKey) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForSet().difference(key, otherKey); - } - catch (Exception e) { - e.printStackTrace(); - return null; - } + public Set sDifference(String key, String otherKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().difference(key, otherKey); } // ===============================list================================= @@ -565,15 +460,9 @@ public class RedisUtils { * @param end 结束 0 到 -1代表所有值 * @return */ - public List lGet(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().range(key, start, end); - } - catch (Exception e) { - e.printStackTrace(); - return null; - } + public List lGet(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().range(key, start, end); } /** @@ -583,13 +472,7 @@ public class RedisUtils { */ public long lGetListSize(String key) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().size(key); - } - catch (Exception e) { - e.printStackTrace(); - return 0; - } + return redisTemplate.opsForList().size(key); } /** @@ -600,13 +483,7 @@ public class RedisUtils { */ public Object lGetIndex(String key, long index) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().index(key, index); - } - catch (Exception e) { - e.printStackTrace(); - return null; - } + return redisTemplate.opsForList().index(key, index); } /** @@ -617,14 +494,8 @@ public class RedisUtils { */ public boolean lSet(String key, Object value) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPush(key, value); - return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + redisTemplate.opsForList().rightPush(key, value); + return true; } /** @@ -635,18 +506,12 @@ public class RedisUtils { * @return */ public boolean lSet(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + Optional.ofNullable(redisTemplate).ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); } + return true; } /** @@ -657,14 +522,8 @@ public class RedisUtils { */ public boolean lSet(String key, List value) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPushAll(key, value); - return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + redisTemplate.opsForList().rightPushAll(key, value); + return true; } /** @@ -676,17 +535,11 @@ public class RedisUtils { */ public boolean lSet(String key, List value, long time) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); } + return true; } /** @@ -698,14 +551,8 @@ public class RedisUtils { */ public boolean lUpdateIndex(String key, long index, Object value) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - redisTemplate.opsForList().set(key, index, value); - return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } + redisTemplate.opsForList().set(key, index, value); + return true; } /** @@ -717,13 +564,7 @@ public class RedisUtils { */ public long lRemove(String key, long count, Object value) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForList().remove(key, count, value); - } - catch (Exception e) { - e.printStackTrace(); - return 0; - } + return redisTemplate.opsForList().remove(key, count, value); } /** @@ -735,17 +576,12 @@ public class RedisUtils { */ public long zSetAndTime(String key, long time, Set> tuples) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - Long count = redisTemplate.opsForZSet().add(key, tuples); - if (time > 0) { - expire(key, time); - } - return count; - } - catch (Exception e) { - e.printStackTrace(); - return 0; + Long count = redisTemplate.opsForZSet().add(key, tuples); + if (time > 0) { + expire(key, time); } + return count; + } /** @@ -797,13 +633,7 @@ public class RedisUtils { */ public long zGetSetSize(String key) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - try { - return redisTemplate.opsForZSet().size(key); - } - catch (Exception e) { - e.printStackTrace(); - return 0; - } + return redisTemplate.opsForZSet().size(key); } } -- Gitee From 3b5860077db20640df8aea6247e15c4111b4b3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Tue, 16 May 2023 10:33:51 +0800 Subject: [PATCH 089/238] =?UTF-8?q?:construction=5Fworker:=20spring-boot-a?= =?UTF-8?q?dmin=203.0=20=E4=B8=8D=E6=94=AF=E6=8C=81=20JDK=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e2a4b3de..f2d60dfa 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -34,6 +34,10 @@ updates: # spring-boot-admin 3.0 不支持 JDK 8 versions: - ">= 3" + - dependency-name: de.codecentric:spring-boot-admin-starter-server + # spring-boot-admin 3.0 不支持 JDK 8 + versions: + - ">= 3" - dependency-name: org.springframework.security:spring-security-oauth2-authorization-server # spring-security-oauth2-authorization-server 1.0 不支持 JDK 8 versions: -- Gitee From 803972592457e392ab975fd89e3c56c92813f443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Tue, 16 May 2023 11:00:26 +0800 Subject: [PATCH 090/238] =?UTF-8?q?:construction=5Fworker:=20git-commit-id?= =?UTF-8?q?-maven-plugin=205.0=20=E4=B8=8D=E6=94=AF=E6=8C=81=20JDK=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f2d60dfa..c216d4f1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -38,6 +38,10 @@ updates: # spring-boot-admin 3.0 不支持 JDK 8 versions: - ">= 3" + - dependency-name: io.github.git-commit-id:git-commit-id-maven-plugin + # git-commit-id-maven-plugin 5.0 不支持 JDK 8 + versions: + - ">= 5" - dependency-name: org.springframework.security:spring-security-oauth2-authorization-server # spring-security-oauth2-authorization-server 1.0 不支持 JDK 8 versions: -- Gitee From 2a67f10493b3cb43e5f24575d2ec5296733cba7e Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Fri, 19 May 2023 05:33:07 +0000 Subject: [PATCH 091/238] Spring boot 2.7.12 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index acbfa251..638d0d8b 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.11 + 2.7.12 2021.0.7 2021.0.5.0 UTF-8 -- Gitee From c0681cf572b619c1fd3c61ba3879cc04be33961f Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 26 May 2023 15:55:54 +0800 Subject: [PATCH 092/238] :green_heart: Fixing CI Build. remove dependabot.yml --- .github/dependabot.yml | 62 ------------------------------------------ README.md | 28 ++++++------------- 2 files changed, 9 insertions(+), 81 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index c216d4f1..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,62 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates -# https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: "maven" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "daily" - # 目标分支 - target-branch: "dev" - # https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#ignore - ignore: - - dependency-name: org.springframework.boot:spring-boot-dependencies - # spring-boot 3.0 不支持 JDK 8 - versions: - - ">= 3" - - dependency-name: org.springframework.cloud:spring-cloud-dependencies - # spring-cloud 2022 不支持 JDK 8 - versions: - - ">= 2022" - - dependency-name: com.alibaba.cloud:spring-cloud-alibaba-dependencies - # spring-cloud-alibaba 2022 不支持 JDK 8 - versions: - - ">= 2022" - - dependency-name: com.alibaba.cloud:spring-cloud-alibaba-dependencies - # spring-cloud-alibaba 2021.1 为命名错误 - versions: - - "= 2021.1" - - dependency-name: de.codecentric:spring-boot-admin-dependencies - # spring-boot-admin 3.0 不支持 JDK 8 - versions: - - ">= 3" - - dependency-name: de.codecentric:spring-boot-admin-starter-server - # spring-boot-admin 3.0 不支持 JDK 8 - versions: - - ">= 3" - - dependency-name: io.github.git-commit-id:git-commit-id-maven-plugin - # git-commit-id-maven-plugin 5.0 不支持 JDK 8 - versions: - - ">= 5" - - dependency-name: org.springframework.security:spring-security-oauth2-authorization-server - # spring-security-oauth2-authorization-server 1.0 不支持 JDK 8 - versions: - - ">= 1" - - - package-ecosystem: "maven" - directory: "/" - schedule: - interval: "daily" - # 目标分支 - target-branch: "sca-springboot3" - - - package-ecosystem: "maven" - directory: "/" - schedule: - interval: "daily" - # 目标分支 - target-branch: "sct-springboot3" diff --git a/README.md b/README.md index 8f4cc7af..36b06897 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ - 提供对常见容器化支持 Docker、Kubernetes、Rancher2 支持 - 提供 lambda 、stream api 、webflux 的生产实践 - ## 文档视频 [ 🚀🚀🚀 低代码数据可视化](http://datav.avuejs.com) @@ -37,23 +36,16 @@ - master: java8 + springboot 2.7 + springcloud 2021 - jdk17: java17 + springboot 3.0 + springcloud 2022 -| 分支 | 说明 | -|-----------------|------------------------------------------------------------------| -| master | java8 + springboot 2.7 + springcloud 2021 | -| sca-springboot3 | java17 + springboot 3.0 + springcloud 2022 | -| sct-springboot3 | java17 + springboot 3.0 + springcloud 2022 | - - ### 核心依赖 -| 依赖 | 版本 | -| ---------------------- |------------| -| Spring Boot | 2.7.11 | -| Spring Cloud | 2021.0.6 | -| Spring Cloud Alibaba | 2021.0.5.0 | +| 依赖 | 版本 | +|-----------------------------|------------| +| Spring Boot | 2.7.12 | +| Spring Cloud | 2021.0.6 | +| Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.2 | -| Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.17 | +| Mybatis Plus | 3.5.3.1 | +| hutool | 5.8.17 | ### 模块说明 @@ -137,7 +129,6 @@ pig 开源软件遵循 [Apache 2.0 协议](https://www.apache.org/licenses/LICEN ![](https://minio.pigx.vip/oss/1655474288.jpg) - ### 其他说明 1. 欢迎提交 [PR](https://dwz.cn/2KURd5Vf),注意对应提交对应 `dev` 分支 @@ -151,7 +142,8 @@ pig 开源软件遵循 [Apache 2.0 协议](https://www.apache.org/licenses/LICEN 2. 如果使用 IntelliJ IDEA 开发,请安装自动格式化软件 spring-javaformat-intellij-idea-plugin - 3. 其他开发工具,请参考 spring-javaformat + 3. 其他开发工具,请参考 + spring-javaformat 说明,或`提交代码前`在项目根目录运行下列命令(需要开发者电脑支持`mvn`命令)进行代码格式化 ``` mvn spring-javaformat:apply @@ -159,5 +151,3 @@ pig 开源软件遵循 [Apache 2.0 协议](https://www.apache.org/licenses/LICEN 2. 欢迎提交 [issue](https://gitee.com/log4j/pig/issues),请写清楚遇到问题的原因、开发环境、复显步骤。 - -3. 联系作者 pig4cloud@qq.com -- Gitee From 70204e0396dfa8628e7057f9a26548ee062c8967 Mon Sep 17 00:00:00 2001 From: Lht Date: Sat, 27 May 2023 09:52:21 +0800 Subject: [PATCH 093/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.19 --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 2afef282..4bb911a6 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.18 + 5.8.19 2.7.4 1.8.4 -- Gitee From 41206aba9a2273ae8fda37bd5465532121137c87 Mon Sep 17 00:00:00 2001 From: Lht Date: Sat, 27 May 2023 09:53:44 +0800 Subject: [PATCH 094/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.19 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 36b06897..82a83790 100644 --- a/README.md +++ b/README.md @@ -41,11 +41,11 @@ | 依赖 | 版本 | |-----------------------------|------------| | Spring Boot | 2.7.12 | -| Spring Cloud | 2021.0.6 | +| Spring Cloud | 2021.0.7 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.2 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.17 | +| hutool | 5.8.19 | ### 模块说明 -- Gitee From 3ca9d94ccec823656a4b5829462a8d7856acef32 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 27 May 2023 10:07:02 +0800 Subject: [PATCH 095/238] =?UTF-8?q?:rotating=5Flight:=20Removing=20linter?= =?UTF-8?q?=20warnings.=20=E9=94=99=E8=AF=AF=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....springframework.boot.autoconfigure.AutoConfiguration.imports | 1 - 1 file changed, 1 deletion(-) diff --git a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 81cc2017..6fe4f1ad 100644 --- a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,4 +4,3 @@ com.pig4cloud.pig.common.core.config.RedisTemplateConfiguration com.pig4cloud.pig.common.core.config.RestTemplateConfiguration com.pig4cloud.pig.common.core.util.SpringContextHolder com.pig4cloud.pig.common.core.config.WebMvcConfiguration -com.pig4cloud.pig.common.core.util.RedisUtils \ No newline at end of file -- Gitee From 94a3f32982ace2db0f4856e271adcec6f4e7af44 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 27 May 2023 10:07:02 +0800 Subject: [PATCH 096/238] =?UTF-8?q?:rotating=5Flight:=20Removing=20linter?= =?UTF-8?q?=20warnings.=20=E9=94=99=E8=AF=AF=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....springframework.boot.autoconfigure.AutoConfiguration.imports | 1 - 1 file changed, 1 deletion(-) diff --git a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 81cc2017..6fe4f1ad 100644 --- a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,4 +4,3 @@ com.pig4cloud.pig.common.core.config.RedisTemplateConfiguration com.pig4cloud.pig.common.core.config.RestTemplateConfiguration com.pig4cloud.pig.common.core.util.SpringContextHolder com.pig4cloud.pig.common.core.config.WebMvcConfiguration -com.pig4cloud.pig.common.core.util.RedisUtils \ No newline at end of file -- Gitee From 177a52d0bcffbc84923ea4bdee4385210ac7efa6 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 6 Jun 2023 13:13:38 +0800 Subject: [PATCH 097/238] =?UTF-8?q?:mute:=20=E5=88=A0=E9=99=A4login.ftl=20?= =?UTF-8?q?footer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-auth/src/main/resources/templates/ftl/login.ftl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pig-auth/src/main/resources/templates/ftl/login.ftl b/pig-auth/src/main/resources/templates/ftl/login.ftl index ede5e7dd..8935f8e5 100755 --- a/pig-auth/src/main/resources/templates/ftl/login.ftl +++ b/pig-auth/src/main/resources/templates/ftl/login.ftl @@ -28,9 +28,5 @@ - -- Gitee From 78b83e70e8a31ae891c9c2faf475c044782f8a1b Mon Sep 17 00:00:00 2001 From: zouhhhhh <1179036329@qq.com> Date: Wed, 7 Jun 2023 23:34:25 +0800 Subject: [PATCH 098/238] =?UTF-8?q?:refactor:=20=E5=88=A0=E9=99=A4Delegati?= =?UTF-8?q?ngAuthenticationConverter=E4=B8=AD=E5=A4=9A=E4=BD=99=E7=9A=84Co?= =?UTF-8?q?nverter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/auth/config/AuthorizationServerConfiguration.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index 8f1d0b8c..d41ea5d9 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -117,9 +117,11 @@ public class AuthorizationServerConfiguration { private AuthenticationConverter accessTokenRequestConverter() { return new DelegatingAuthenticationConverter(Arrays.asList( new OAuth2ResourceOwnerPasswordAuthenticationConverter(), - new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(), - new OAuth2ClientCredentialsAuthenticationConverter(), - new OAuth2AuthorizationCodeAuthenticationConverter(), + new OAuth2ResourceOwnerSmsAuthenticationConverter(), + // OAuth2TokenEndpointFilter中构造的DelegatingAuthenticationConverter中已经创建了这三个,会重复调用 + // new OAuth2RefreshTokenAuthenticationConverter(), + // new OAuth2ClientCredentialsAuthenticationConverter(), + // new OAuth2AuthorizationCodeAuthenticationConverter(), new OAuth2AuthorizationCodeRequestAuthenticationConverter())); } -- Gitee From e3e712801a179636881d2da97796df855f4340ed Mon Sep 17 00:00:00 2001 From: GuoZhang Date: Mon, 12 Jun 2023 06:05:31 +0000 Subject: [PATCH 099/238] =?UTF-8?q?=E4=BF=AE=E6=94=B9spring.checkstyle.plu?= =?UTF-8?q?gin=E7=89=88=E6=9C=AC=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GuoZhang --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 2afef282..09c96a12 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -21,7 +21,7 @@ 1.8 1.8 4.9.9 - 0.0.34 + 0.0.38 1.2.83 1.6.9 2.2.0 -- Gitee From f472e701ac774f3ff20aaf24dddefcca90c726e0 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 17 Jun 2023 17:14:59 +0800 Subject: [PATCH 100/238] =?UTF-8?q?:memo:=20Writing=20docs.=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=96=87=E6=A1=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/config.yml | 5 +++++ .gitee/ISSUE_TEMPLATE/issue.yml | 29 +++++++++++++++++++++++++++++ README.md | 29 ++++++++++++----------------- 3 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 .gitee/ISSUE_TEMPLATE/config.yml create mode 100644 .gitee/ISSUE_TEMPLATE/issue.yml diff --git a/.gitee/ISSUE_TEMPLATE/config.yml b/.gitee/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..83f9d2ba --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false # 不允许用户创建空白 Issue +contact_links: + - name: 遇到问题先去看文档!谢谢! # 外部网站名称 + url: https://wiki.pig4cloud.com/ # 跳转的外部网站目标地址 + about: 文档可以解决你80%的疑惑 # 跳转外部网站的描述说明 diff --git a/.gitee/ISSUE_TEMPLATE/issue.yml b/.gitee/ISSUE_TEMPLATE/issue.yml new file mode 100644 index 00000000..fd407871 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE/issue.yml @@ -0,0 +1,29 @@ +name: 问题咨询 +body: + - type: dropdown + id: version + attributes: + label: PIG版本 + options: + - "3.6" + - "3.5" + - "3.4" + - "3.3" + - "3.2" + - "3.1" + - "3.0" + validations: + required: true + - type: checkboxes + attributes: + label: 是否修改了包名 + options: + - label: 是 + required: false + - type: textarea + id: desired-solution + attributes: + label: 问题描述 + description: 详细问题,提供相应截图和日志 + validations: + required: true diff --git a/README.md b/README.md index 82a83790..53a504b1 100644 --- a/README.md +++ b/README.md @@ -15,19 +15,19 @@ ## 文档视频 -[ 🚀🚀🚀 低代码数据可视化](http://datav.avuejs.com) +[ 🚀🚀🚀 低代码数据可视化](http://datav.pig4cloud.com) -[ 配套文档 wiki.pigx.vip](https://wiki.pigx.vip) +[ 配套文档 wiki.pig4cloud.com](https://wiki.pig4cloud.com) -[ 配套视频 tv.pigx.vip](https://www.bilibili.com/video/BV12t411B7e9) +[ 配套视频 tv.pig4cloud.com](https://www.bilibili.com/video/BV12t411B7e9) -[PIGX 在线体验 pigx.pigx.vip](http://pigx.pigx.vip) +[PIGX 在线体验 pigx.pig4cloud.com](http://pigx.pig4cloud.com) -[产品白皮书 paper.pigx.vip](https://paper.pigx.vip) +[产品白皮书 paper.pig4cloud.com](https://paper.pig4cloud.com) ## 微信群 [禁广告] -![](https://minio.pigx.vip/oss/1648184189.png) +![](https://minio.pigx.top/oss/1648184189.png) ## 快速开始 @@ -80,15 +80,10 @@ pig ### 本地开发 运行 -pig 提供了详细的[部署文档 wiki.pigx.vip](https://www.yuque.com/pig4cloud/pig/vsdox9),包括开发环境安装、服务端代码运行、前端代码运行等。 +pig 提供了详细的[部署文档 wiki.pig4cloud.com](https://www.yuque.com/pig4cloud/pig/vsdox9),包括开发环境安装、服务端代码运行、前端代码运行等。 请务必**完全按照**文档部署运行章节 进行操作,减少踩坑弯路!! -### 定制自己微服务 - -[PIG DIY](https://pig4cloud.com/#/common/diy) - -[PIG ARCHETYPE](https://pig4cloud.com/#/common/archetype) ### Docker 运行 @@ -111,12 +106,12 @@ cnpm install && cnpm run build:docker && cd docker && docker-compose up -d - - + + - - + +
@@ -127,7 +122,7 @@ cnpm install && cnpm run build:docker && cd docker && docker-compose up -d pig 开源软件遵循 [Apache 2.0 协议](https://www.apache.org/licenses/LICENSE-2.0.html)。 允许商业使用,但务必保留类作者、Copyright 信息。 -![](https://minio.pigx.vip/oss/1655474288.jpg) +![](https://minio.pigx.top/oss/1655474288.jpg) ### 其他说明 -- Gitee From 0f4ca191b290ae9b44c0a1116396a1be9722e40d Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 17 Jun 2023 18:49:10 +0800 Subject: [PATCH 101/238] =?UTF-8?q?:art:=20Improving=20structure=20/=20for?= =?UTF-8?q?mat=20of=20the=20code.=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index d41ea5d9..a9c01e43 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -51,7 +51,7 @@ import java.util.Arrays; /** * @author lengleng * @date 2022/5/27 - * + *

* 认证服务器配置 */ @Configuration @@ -115,22 +115,17 @@ public class AuthorizationServerConfiguration { * @return DelegatingAuthenticationConverter */ private AuthenticationConverter accessTokenRequestConverter() { - return new DelegatingAuthenticationConverter(Arrays.asList( - new OAuth2ResourceOwnerPasswordAuthenticationConverter(), - new OAuth2ResourceOwnerSmsAuthenticationConverter(), - // OAuth2TokenEndpointFilter中构造的DelegatingAuthenticationConverter中已经创建了这三个,会重复调用 - // new OAuth2RefreshTokenAuthenticationConverter(), - // new OAuth2ClientCredentialsAuthenticationConverter(), - // new OAuth2AuthorizationCodeAuthenticationConverter(), - new OAuth2AuthorizationCodeRequestAuthenticationConverter())); + return new DelegatingAuthenticationConverter( + Arrays.asList(new OAuth2ResourceOwnerPasswordAuthenticationConverter(), + new OAuth2ResourceOwnerSmsAuthenticationConverter(), + new OAuth2AuthorizationCodeRequestAuthenticationConverter())); } /** * 注入授权模式实现提供方 - * + *

* 1. 密码模式
* 2. 短信登录
- * */ @SuppressWarnings("unchecked") private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) { -- Gitee From 46b0e0aeb22c8af21bc9b7a81c07e4cb12bd1a6a Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 17 Jun 2023 18:53:19 +0800 Subject: [PATCH 102/238] =?UTF-8?q?:memo:=20Writing=20docs.=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0issue=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/issue.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitee/ISSUE_TEMPLATE/issue.yml b/.gitee/ISSUE_TEMPLATE/issue.yml index fd407871..a122b21b 100644 --- a/.gitee/ISSUE_TEMPLATE/issue.yml +++ b/.gitee/ISSUE_TEMPLATE/issue.yml @@ -1,4 +1,5 @@ name: 问题咨询 +description: "![扫码加入微信群](https://minio.pigx.top/oss/1648184189.png)" body: - type: dropdown id: version -- Gitee From d0cddfd89c447b0fe20a11b401c9dc3aa790e2bf Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 18 Jun 2023 08:54:02 +0800 Subject: [PATCH 103/238] =?UTF-8?q?:memo:=20Writing=20docs.=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0issue=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53a504b1..3accd23c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ [ 配套视频 tv.pig4cloud.com](https://www.bilibili.com/video/BV12t411B7e9) -[PIGX 在线体验 pigx.pig4cloud.com](http://pigx.pig4cloud.com) +[PIGX 在线体验 pigx.pigx.top](http://pigx.pigx.top) [产品白皮书 paper.pig4cloud.com](https://paper.pig4cloud.com) -- Gitee From 8017f0400c704a3cd12a36f5145b52a229dca1ab Mon Sep 17 00:00:00 2001 From: charlessui Date: Sun, 18 Jun 2023 16:21:03 +0800 Subject: [PATCH 104/238] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E3=80=90=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=AE=A1=E7=90=86=E3=80=91=E9=A1=B5=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E3=80=90=E5=AD=97=E5=85=B8=E7=B1=BB=E5=9E=8B=E3=80=91=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=9D=A1=E4=BB=B6=E4=B8=8D=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/admin/controller/SysDictController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index 3817925a..02403680 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -78,6 +78,7 @@ public class SysDictController { return R.ok(sysDictService.page(page, Wrappers.lambdaQuery() .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()) + .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, sysDict.getSystemFlag()) .orderByDesc(SysDict::getUpdateTime))); } -- Gitee From 12f71f7b76deba5ccd170165219c87f993b24a61 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 19 Jun 2023 12:21:15 +0800 Subject: [PATCH 105/238] :arrow_up: Upgrading dependencies. nacos-server 2.2.3 close #I7EGAE --- pig-register/pom.xml | 2 +- .../config/server/service/HistoryService.java | 88 -------- .../config/server/service/package-info.java | 4 - .../console/controller/HealthController.java | 143 ++++++------ .../controller/NamespaceController.java | 204 ++++++++--------- .../controller/ServerStateController.java | 50 +++-- .../controller/v2/NamespaceControllerV2.java | 190 ++++++++-------- .../console/enums/NamespaceTypeEnum.java | 82 +++---- .../exception/ConsoleExceptionHandler.java | 49 ++-- .../exception/NacosApiExceptionHandler.java | 159 +++++++------ .../nacos/console/filter/XssFilter.java | 26 +-- .../nacos/console/model/Namespace.java | 180 +++++++-------- .../nacos/console/model/NamespaceAllInfo.java | 12 +- .../console/model/form/NamespaceForm.java | 160 +++++++------ .../service/NamespaceOperationService.java | 210 +++++++++--------- .../src/main/resources/nacos-version.txt | 2 +- .../public/fonts/font_1533967_slipq25tezj.ttf | Bin 0 -> 13564 bytes .../fonts/font_1533967_slipq25tezj.woff | Bin 0 -> 7724 bytes .../fonts/font_1533967_slipq25tezj.woff2 | Bin 0 -> 6448 bytes .../src/main/resources/static/css/main.css | 20 +- .../src/main/resources/static/index.html | 4 +- .../src/main/resources/static/js/main.js | 14 +- 22 files changed, 756 insertions(+), 843 deletions(-) delete mode 100644 pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java delete mode 100644 pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java create mode 100644 pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.ttf create mode 100644 pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff create mode 100644 pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff2 diff --git a/pig-register/pom.xml b/pig-register/pom.xml index afed927c..0c3f3af1 100755 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -27,7 +27,7 @@ nacos 注册配置中心 - 2.2.0.PIGOEM + 2.2.3 diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java deleted file mode 100644 index 72a05665..00000000 --- a/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.alibaba.nacos.config.server.service; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.nacos.common.utils.Pair; -import com.alibaba.nacos.config.server.model.ConfigHistoryInfo; -import com.alibaba.nacos.config.server.model.ConfigInfoWrapper; -import com.alibaba.nacos.config.server.model.Page; -import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService; -import com.alibaba.nacos.config.server.service.repository.HistoryConfigInfoPersistService; -import com.alibaba.nacos.plugin.auth.exception.AccessException; -import com.alibaba.nacos.plugin.encryption.handler.EncryptionHandler; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Objects; - -/** - * @author aeizzz - */ -@Service -public class HistoryService { - - private final HistoryConfigInfoPersistService historyConfigInfoPersistService; - - private final ConfigInfoPersistService configInfoPersistService; - - public HistoryService(HistoryConfigInfoPersistService historyConfigInfoPersistService, - ConfigInfoPersistService configInfoPersistService) { - this.historyConfigInfoPersistService = historyConfigInfoPersistService; - this.configInfoPersistService = configInfoPersistService; - } - - public Page listConfigHistory(String dataId, String group, String namespaceId, Integer pageNo, - Integer pageSize) { - return this.historyConfigInfoPersistService.findConfigHistory(dataId, group, namespaceId, pageNo, pageSize); - } - - public ConfigHistoryInfo getConfigHistoryInfo(String dataId, String group, String namespaceId, Long nid) - throws AccessException { - ConfigHistoryInfo configHistoryInfo = this.historyConfigInfoPersistService.detailConfigHistory(nid); - if (Objects.isNull(configHistoryInfo)) { - return null; - } - else { - this.checkHistoryInfoPermission(configHistoryInfo, dataId, group, namespaceId); - String encryptedDataKey = configHistoryInfo.getEncryptedDataKey(); - Pair pair = EncryptionHandler.decryptHandler(dataId, encryptedDataKey, - configHistoryInfo.getContent()); - configHistoryInfo.setContent((String) pair.getSecond()); - return configHistoryInfo; - } - } - - public ConfigHistoryInfo getPreviousConfigHistoryInfo(String dataId, String group, String namespaceId, Long id) - throws AccessException { - ConfigHistoryInfo configHistoryInfo = this.historyConfigInfoPersistService.detailPreviousConfigHistory(id); - if (Objects.isNull(configHistoryInfo)) { - return null; - } - else { - this.checkHistoryInfoPermission(configHistoryInfo, dataId, group, namespaceId); - return configHistoryInfo; - } - } - - public List getConfigListByNamespace(String namespaceId) { - return this.configInfoPersistService.queryConfigInfoByNamespace(namespaceId); - } - - /** - * 覆盖原有的校验方式,oracle 数据库没有空 字符串 只有 null - * @param configHistoryInfo - * @param dataId - * @param group - * @param namespaceId - * @throws AccessException - */ - private void checkHistoryInfoPermission(ConfigHistoryInfo configHistoryInfo, String dataId, String group, - String namespaceId) throws AccessException { - if (!Objects.equals(configHistoryInfo.getDataId(), dataId) - || !Objects.equals(configHistoryInfo.getGroup(), group) - || (!StrUtil.isEmpty(configHistoryInfo.getTenant()) - && !Objects.equals(configHistoryInfo.getTenant(), namespaceId))) { - throw new AccessException("Please check dataId, group or namespaceId."); - } - } - -} diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java deleted file mode 100644 index d3c747a1..00000000 --- a/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 处理再oracle数据库下空置的判断 - */ -package com.alibaba.nacos.config.server.service; diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java index 2b088165..f5b0e981 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java @@ -37,77 +37,74 @@ import javax.servlet.http.HttpServletRequest; @RestController("consoleHealth") @RequestMapping("/v1/console/health") public class HealthController { - - private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class); - - private final ConfigInfoPersistService configInfoPersistService; - - private final OperatorController apiCommands; - - @Autowired - public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) { - this.configInfoPersistService = configInfoPersistService; - this.apiCommands = apiCommands; - } - - /** - * Whether the Nacos is in broken states or not, and cannot recover except by being - * restarted. - * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code - * equal to 500 indicates that Nacos is in broken states. - */ - @GetMapping("/liveness") - public ResponseEntity liveness() { - return ResponseEntity.ok().body("OK"); - } - - /** - * Ready to receive the request or not. - * @return HTTP code equal to 200 indicates that Nacos is ready. HTTP code equal to - * 500 indicates that Nacos is not ready. - */ - @GetMapping("/readiness") - public ResponseEntity readiness(HttpServletRequest request) { - boolean isConfigReadiness = isConfigReadiness(); - boolean isNamingReadiness = isNamingReadiness(request); - - if (isConfigReadiness && isNamingReadiness) { - return ResponseEntity.ok().body("OK"); - } - - if (!isConfigReadiness && !isNamingReadiness) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Config and Naming are not in readiness"); - } - - if (!isConfigReadiness) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config is not in readiness"); - } - - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Naming is not in readiness"); - } - - private boolean isConfigReadiness() { - // check db - try { - configInfoPersistService.configInfoCount(""); - return true; - } - catch (Exception e) { - LOGGER.error("Config health check fail.", e); - } - return false; - } - - private boolean isNamingReadiness(HttpServletRequest request) { - try { - apiCommands.metrics(request); - return true; - } - catch (Exception e) { - LOGGER.error("Naming health check fail.", e); - } - return false; - } - + + private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class); + + private final ConfigInfoPersistService configInfoPersistService; + + private final OperatorController apiCommands; + + @Autowired + public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) { + this.configInfoPersistService = configInfoPersistService; + this.apiCommands = apiCommands; + } + + /** + * Whether the Nacos is in broken states or not, and cannot recover except by being restarted. + * + * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code equal to 500 indicates that + * Nacos is in broken states. + */ + @GetMapping("/liveness") + public ResponseEntity liveness() { + return ResponseEntity.ok().body("OK"); + } + + /** + * Ready to receive the request or not. + * + * @return HTTP code equal to 200 indicates that Nacos is ready. HTTP code equal to 500 indicates that Nacos is not + * ready. + */ + @GetMapping("/readiness") + public ResponseEntity readiness(HttpServletRequest request) { + boolean isConfigReadiness = isConfigReadiness(); + boolean isNamingReadiness = isNamingReadiness(request); + + if (isConfigReadiness && isNamingReadiness) { + return ResponseEntity.ok().body("OK"); + } + + if (!isConfigReadiness && !isNamingReadiness) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config and Naming are not in readiness"); + } + + if (!isConfigReadiness) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config is not in readiness"); + } + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Naming is not in readiness"); + } + + private boolean isConfigReadiness() { + // check db + try { + configInfoPersistService.configInfoCount(""); + return true; + } catch (Exception e) { + LOGGER.error("Config health check fail.", e); + } + return false; + } + + private boolean isNamingReadiness(HttpServletRequest request) { + try { + apiCommands.metrics(request); + return true; + } catch (Exception e) { + LOGGER.error("Naming health check fail.", e); + } + return false; + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java index 32d93ea2..ffe1e31d 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java @@ -48,104 +48,108 @@ import java.util.regex.Pattern; @RestController @RequestMapping("/v1/console/namespaces") public class NamespaceController { - - @Autowired - private CommonPersistService commonPersistService; - - @Autowired - private NamespaceOperationService namespaceOperationService; - - private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); - - private static final int NAMESPACE_ID_MAX_LENGTH = 128; - - /** - * Get namespace list. - * @return namespace list - */ - @GetMapping - public RestResult> getNamespaces() { - return RestResultUtils.success(namespaceOperationService.getNamespaceList()); - } - - /** - * get namespace all info by namespace id. - * @param namespaceId namespaceId - * @return namespace all info - */ - @GetMapping(params = "show=all") - public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException { - return namespaceOperationService.getNamespace(namespaceId); - } - - /** - * create namespace. - * @param namespaceName namespace Name - * @param namespaceDesc namespace Desc - * @return whether create ok - */ - @PostMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) - public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId, - @RequestParam("namespaceName") String namespaceName, - @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { - if (StringUtils.isBlank(namespaceId)) { - namespaceId = UUID.randomUUID().toString(); - } - else { - namespaceId = namespaceId.trim(); - if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { - return false; - } - if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { - return false; - } - } - try { - return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc); - } - catch (NacosException e) { - return false; - } - } - - /** - * check namespaceId exist. - * @param namespaceId namespace id - * @return true if exist, otherwise false - */ - @GetMapping(params = "checkNamespaceIdExist=true") - public Boolean checkNamespaceIdExist(@RequestParam("customNamespaceId") String namespaceId) { - if (StringUtils.isBlank(namespaceId)) { - return false; - } - return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0); - } - - /** - * edit namespace. - * @param namespace namespace - * @param namespaceShowName namespace ShowName - * @param namespaceDesc namespace Desc - * @return whether edit ok - */ - @PutMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) - public Boolean editNamespace(@RequestParam("namespace") String namespace, - @RequestParam("namespaceShowName") String namespaceShowName, - @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { - return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc); - } - - /** - * del namespace by id. - * @param namespaceId namespace Id - * @return whether del ok - */ - @DeleteMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) - public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) { - return namespaceOperationService.removeNamespace(namespaceId); - } - + + @Autowired + private CommonPersistService commonPersistService; + + @Autowired + private NamespaceOperationService namespaceOperationService; + + private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); + + private static final int NAMESPACE_ID_MAX_LENGTH = 128; + + /** + * Get namespace list. + * + * @return namespace list + */ + @GetMapping + public RestResult> getNamespaces() { + return RestResultUtils.success(namespaceOperationService.getNamespaceList()); + } + + /** + * get namespace all info by namespace id. + * + * @param namespaceId namespaceId + * @return namespace all info + */ + @GetMapping(params = "show=all") + public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException { + return namespaceOperationService.getNamespace(namespaceId); + } + + /** + * create namespace. + * + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + */ + @PostMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId, + @RequestParam("namespaceName") String namespaceName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { + if (StringUtils.isBlank(namespaceId)) { + namespaceId = UUID.randomUUID().toString(); + } else { + namespaceId = namespaceId.trim(); + if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { + return false; + } + if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { + return false; + } + } + try { + return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc); + } catch (NacosException e) { + return false; + } + } + + /** + * check namespaceId exist. + * + * @param namespaceId namespace id + * @return true if exist, otherwise false + */ + @GetMapping(params = "checkNamespaceIdExist=true") + public Boolean checkNamespaceIdExist(@RequestParam("customNamespaceId") String namespaceId) { + if (StringUtils.isBlank(namespaceId)) { + return false; + } + return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0); + } + + /** + * edit namespace. + * + * @param namespace namespace + * @param namespaceShowName namespace ShowName + * @param namespaceDesc namespace Desc + * @return whether edit ok + */ + @PutMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean editNamespace(@RequestParam("namespace") String namespace, + @RequestParam("namespaceShowName") String namespaceShowName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { + return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc); + } + + /** + * del namespace by id. + * + * @param namespaceId namespace Id + * @return whether del ok + */ + @DeleteMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) { + return namespaceOperationService.removeNamespace(namespaceId); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java index ceb34fa5..75056bf0 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java @@ -16,13 +16,18 @@ package com.alibaba.nacos.console.controller; -import com.alibaba.nacos.common.utils.VersionUtils; +import com.alibaba.nacos.common.model.RestResult; +import com.alibaba.nacos.common.model.RestResultUtils; import com.alibaba.nacos.sys.env.EnvUtil; +import com.alibaba.nacos.sys.module.ModuleState; +import com.alibaba.nacos.sys.module.ModuleStateHolder; +import com.alibaba.nacos.sys.utils.DiskUtils; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.File; import java.util.HashMap; import java.util.Map; @@ -34,21 +39,30 @@ import java.util.Map; @RestController @RequestMapping("/v1/console/server") public class ServerStateController { - - /** - * Get server state of current server. - * @return state json. - */ - @GetMapping("/state") - public ResponseEntity> serverState() { - Map serverState = new HashMap<>(4); - serverState.put("standalone_mode", - EnvUtil.getStandaloneMode() ? EnvUtil.STANDALONE_MODE_ALONE : EnvUtil.STANDALONE_MODE_CLUSTER); - - serverState.put("function_mode", EnvUtil.getFunctionMode()); - serverState.put("version", VersionUtils.version); - - return ResponseEntity.ok().body(serverState); - } - + + private static final String ANNOUNCEMENT_FILE = "announcement.conf"; + + /** + * Get server state of current server. + * + * @return state json. + */ + @GetMapping("/state") + public ResponseEntity> serverState() { + Map serverState = new HashMap<>(4); + for (ModuleState each : ModuleStateHolder.getInstance().getAllModuleStates()) { + each.getStates().forEach((s, o) -> serverState.put(s, null == o ? null : o.toString())); + } + return ResponseEntity.ok().body(serverState); + } + + @GetMapping("/announcement") + public RestResult getAnnouncement() { + File announcementFile = new File(EnvUtil.getConfPath(), ANNOUNCEMENT_FILE); + String announcement = null; + if (announcementFile.exists() && announcementFile.isFile()) { + announcement = DiskUtils.readFile(announcementFile); + } + return RestResultUtils.success(announcement); + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java index d082e3dd..c01325d5 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java @@ -51,98 +51,102 @@ import java.util.regex.Pattern; */ @NacosApi @RestController -@RequestMapping(path = "/v2/console/namespace") +@RequestMapping("/v2/console/namespace") public class NamespaceControllerV2 { - - private final NamespaceOperationService namespaceOperationService; - - public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) { - this.namespaceOperationService = namespaceOperationService; - } - - private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); - - private static final int NAMESPACE_ID_MAX_LENGTH = 128; - - /** - * Get namespace list. - * @return namespace list - */ - @GetMapping("/list") - public Result> getNamespaceList() { - return Result.success(namespaceOperationService.getNamespaceList()); - } - - /** - * get namespace all info by namespace id. - * @param namespaceId namespaceId - * @return namespace all info - */ - @GetMapping() - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.READ, - signType = SignType.CONSOLE) - public Result getNamespace(@RequestParam("namespaceId") String namespaceId) - throws NacosException { - return Result.success(namespaceOperationService.getNamespace(namespaceId)); - } - - /** - * create namespace. - * @param namespaceForm namespaceForm. - * @return whether create ok - */ - @PostMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE, - signType = SignType.CONSOLE) - public Result createNamespace(NamespaceForm namespaceForm) throws NacosException { - - namespaceForm.validate(); - - String namespaceId = namespaceForm.getNamespaceId(); - String namespaceName = namespaceForm.getNamespaceName(); - String namespaceDesc = namespaceForm.getNamespaceDesc(); - - if (StringUtils.isBlank(namespaceId)) { - namespaceId = UUID.randomUUID().toString(); - } - else { - namespaceId = namespaceId.trim(); - if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, - "namespaceId [" + namespaceId + "] mismatch the pattern"); - } - if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, - "too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH); - } - } - return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc)); - } - - /** - * edit namespace. - * @param namespaceForm namespace params - * @return whether edit ok - */ - @PutMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE, - signType = SignType.CONSOLE) - public Result editNamespace(NamespaceForm namespaceForm) throws NacosException { - namespaceForm.validate(); - return Result.success(namespaceOperationService.editNamespace(namespaceForm.getNamespaceId(), - namespaceForm.getNamespaceName(), namespaceForm.getNamespaceDesc())); - } - - /** - * delete namespace by id. - * @param namespaceId namespace ID - * @return whether delete ok - */ - @DeleteMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE, - signType = SignType.CONSOLE) - public Result deleteNamespace(@RequestParam("namespaceId") String namespaceId) { - return Result.success(namespaceOperationService.removeNamespace(namespaceId)); - } - + + private final NamespaceOperationService namespaceOperationService; + + public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) { + this.namespaceOperationService = namespaceOperationService; + } + + private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); + + private static final int NAMESPACE_ID_MAX_LENGTH = 128; + + /** + * Get namespace list. + * + * @return namespace list + */ + @GetMapping("/list") + public Result> getNamespaceList() { + return Result.success(namespaceOperationService.getNamespaceList()); + } + + /** + * get namespace all info by namespace id. + * + * @param namespaceId namespaceId + * @return namespace all info + */ + @GetMapping() + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.READ, signType = SignType.CONSOLE) + public Result getNamespace(@RequestParam("namespaceId") String namespaceId) + throws NacosException { + return Result.success(namespaceOperationService.getNamespace(namespaceId)); + } + + /** + * create namespace. + * + * @param namespaceForm namespaceForm. + * @return whether create ok + */ + @PostMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) + public Result createNamespace(NamespaceForm namespaceForm) throws NacosException { + + namespaceForm.validate(); + + String namespaceId = namespaceForm.getNamespaceId(); + String namespaceName = namespaceForm.getNamespaceName(); + String namespaceDesc = namespaceForm.getNamespaceDesc(); + + if (StringUtils.isBlank(namespaceId)) { + namespaceId = UUID.randomUUID().toString(); + } else { + namespaceId = namespaceId.trim(); + if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, + "namespaceId [" + namespaceId + "] mismatch the pattern"); + } + if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, + "too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH); + } + } + return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc)); + } + + /** + * edit namespace. + * + * @param namespaceForm namespace params + * @return whether edit ok + */ + @PutMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) + public Result editNamespace(NamespaceForm namespaceForm) throws NacosException { + namespaceForm.validate(); + return Result.success(namespaceOperationService + .editNamespace(namespaceForm.getNamespaceId(), namespaceForm.getNamespaceName(), + namespaceForm.getNamespaceDesc())); + } + + /** + * delete namespace by id. + * + * @param namespaceId namespace ID + * @return whether delete ok + */ + @DeleteMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) + public Result deleteNamespace(@RequestParam("namespaceId") String namespaceId) { + return Result.success(namespaceOperationService.removeNamespace(namespaceId)); + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java b/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java index c1c67b5c..8674ce8a 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java @@ -17,50 +17,50 @@ package com.alibaba.nacos.console.enums; /** - * the enum of namespace. 0 : Global configuration, 1 : Default private namespace ,2 : - * Custom namespace. + * the enum of namespace. + * 0 : Global configuration, 1 : Default private namespace ,2 : Custom namespace. * * @author chenglu * @date 2021-05-25 17:01 */ public enum NamespaceTypeEnum { - - /** - * Global configuration. - */ - GLOBAL(0, "Global configuration"), - - /** - * Default private namespace. - */ - PRIVATE(1, "Default private namespace"), - - /** - * Custom namespace. - */ - CUSTOM(2, "Custom namespace"); - - /** - * the namespace type. - */ - private final int type; - - /** - * the description. - */ - private final String description; - - NamespaceTypeEnum(int type, String description) { - this.type = type; - this.description = description; - } - - public int getType() { - return type; - } - - public String getDescription() { - return description; - } - + + /** + * Global configuration. + */ + GLOBAL(0, "Global configuration"), + + /** + * Default private namespace. + */ + PRIVATE(1, "Default private namespace"), + + /** + * Custom namespace. + */ + CUSTOM(2, "Custom namespace"); + + /** + * the namespace type. + */ + private final int type; + + /** + * the description. + */ + private final String description; + + NamespaceTypeEnum(int type, String description) { + this.type = type; + this.description = description; + } + + public int getType() { + return type; + } + + public String getDescription() { + return description; + } } + diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java index 8b0d6fbd..b7c7fcdb 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java @@ -37,29 +37,28 @@ import javax.servlet.http.HttpServletRequest; */ @ControllerAdvice public class ConsoleExceptionHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class); - - @ExceptionHandler(AccessException.class) - private ResponseEntity handleAccessException(AccessException e) { - LOGGER.error("got exception. {}", e.getErrMsg()); - return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg()); - } - - @ExceptionHandler(IllegalArgumentException.class) - private ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e)); - } - - @ExceptionHandler(Exception.class) - private ResponseEntity handleException(HttpServletRequest request, Exception e) { - String uri = request.getRequestURI(); - LOGGER.error("CONSOLE {}", uri, e); - if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); - } - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); - } - + + private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class); + + @ExceptionHandler(AccessException.class) + private ResponseEntity handleAccessException(AccessException e) { + LOGGER.error("got exception. {}", e.getErrMsg()); + return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg()); + } + + @ExceptionHandler(IllegalArgumentException.class) + private ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e)); + } + + @ExceptionHandler(Exception.class) + private ResponseEntity handleException(HttpServletRequest request, Exception e) { + String uri = request.getRequestURI(); + LOGGER.error("CONSOLE {}", uri, e); + if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); + } + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java index c704dd0f..df0c1f02 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java @@ -43,92 +43,89 @@ import java.io.IOException; /** * Exception Handler for Nacos API. - * * @author dongyafei * @date 2022/7/22 */ @Order(-1) -@ControllerAdvice(annotations = { NacosApi.class }) +@ControllerAdvice(annotations = {NacosApi.class}) @ResponseBody public class NacosApiExceptionHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class); - - @ExceptionHandler(NacosApiException.class) - public ResponseEntity> handleNacosApiException(NacosApiException e) { - LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); - return ResponseEntity.status(e.getErrCode()) - .body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); - } - - @ExceptionHandler(NacosException.class) - public ResponseEntity> handleNacosException(NacosException e) { - LOGGER.error("got exception. {}", e.getErrMsg()); - return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg())); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMessageNotReadableException.class) - public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMessageConversionException.class) - public Result handleHttpMessageConversionException(HttpMessageConversionException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(NumberFormatException.class) - public Result handleNumberFormatException(NumberFormatException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(IllegalArgumentException.class) - public Result handleIllegalArgumentException(IllegalArgumentException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(MissingServletRequestParameterException.class) - public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMediaTypeException.class) - public Result handleHttpMediaTypeException(HttpMediaTypeException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.FORBIDDEN) - @ExceptionHandler(AccessException.class) - public Result handleAccessException(AccessException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg()); - } - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(value = { DataAccessException.class, ServletException.class, IOException.class }) - public Result handleDataAccessException(Exception e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(Exception.class) - public Result handleOtherException(Exception e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(e.getMessage()); - } - + + private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class); + + @ExceptionHandler(NacosApiException.class) + public ResponseEntity> handleNacosApiException(NacosApiException e) { + LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); + return ResponseEntity.status(e.getErrCode()).body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); + } + + @ExceptionHandler(NacosException.class) + public ResponseEntity> handleNacosException(NacosException e) { + LOGGER.error("got exception. {}", e.getErrMsg()); + return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException.class) + public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageConversionException.class) + public Result handleHttpMessageConversionException(HttpMessageConversionException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(NumberFormatException.class) + public Result handleNumberFormatException(NumberFormatException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(IllegalArgumentException.class) + public Result handleIllegalArgumentException(IllegalArgumentException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMediaTypeException.class) + public Result handleHttpMediaTypeException(HttpMediaTypeException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(AccessException.class) + public Result handleAccessException(AccessException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg()); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(value = {DataAccessException.class, ServletException.class, IOException.class}) + public Result handleDataAccessException(Exception e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + public Result handleOtherException(Exception e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(e.getMessage()); + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java b/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java index 7764ec8a..192a609a 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java @@ -26,21 +26,19 @@ import java.io.IOException; /** * XSS filter. - * * @author onewe */ public class XssFilter extends OncePerRequestFilter { - - private static final String CONTENT_SECURITY_POLICY_HEADER = "Content-Security-Policy"; - - private static final String CONTENT_SECURITY_POLICY = "script-src 'self'"; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - - response.setHeader(CONTENT_SECURITY_POLICY_HEADER, CONTENT_SECURITY_POLICY); - filterChain.doFilter(request, response); - } - + + private static final String CONTENT_SECURITY_POLICY_HEADER = "Content-Security-Policy"; + + private static final String CONTENT_SECURITY_POLICY = "script-src 'self'"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + response.setHeader(CONTENT_SECURITY_POLICY_HEADER, CONTENT_SECURITY_POLICY); + filterChain.doFilter(request, response); + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java b/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java index 0137dade..0a13166f 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java @@ -22,94 +22,94 @@ package com.alibaba.nacos.console.model; * @author diamond */ public class Namespace { - - private String namespace; - - private String namespaceShowName; - - private String namespaceDesc; - - private int quota; - - private int configCount; - - /** - * see {@link com.alibaba.nacos.console.enums.NamespaceTypeEnum}. - */ - private int type; - - public String getNamespaceShowName() { - return namespaceShowName; - } - - public void setNamespaceShowName(String namespaceShowName) { - this.namespaceShowName = namespaceShowName; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public Namespace() { - } - - public Namespace(String namespace, String namespaceShowName) { - this.namespace = namespace; - this.namespaceShowName = namespaceShowName; - } - - public Namespace(String namespace, String namespaceShowName, int quota, int configCount, int type) { - this.namespace = namespace; - this.namespaceShowName = namespaceShowName; - this.quota = quota; - this.configCount = configCount; - this.type = type; - } - - public Namespace(String namespace, String namespaceShowName, String namespaceDesc, int quota, int configCount, - int type) { - this.namespace = namespace; - this.namespaceShowName = namespaceShowName; - this.quota = quota; - this.configCount = configCount; - this.type = type; - this.namespaceDesc = namespaceDesc; - } - - public String getNamespaceDesc() { - return namespaceDesc; - } - - public void setNamespaceDesc(String namespaceDesc) { - this.namespaceDesc = namespaceDesc; - } - - public int getQuota() { - return quota; - } - - public void setQuota(int quota) { - this.quota = quota; - } - - public int getConfigCount() { - return configCount; - } - - public void setConfigCount(int configCount) { - this.configCount = configCount; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - + + private String namespace; + + private String namespaceShowName; + + private String namespaceDesc; + + private int quota; + + private int configCount; + + /** + * see {@link com.alibaba.nacos.console.enums.NamespaceTypeEnum}. + */ + private int type; + + public String getNamespaceShowName() { + return namespaceShowName; + } + + public void setNamespaceShowName(String namespaceShowName) { + this.namespaceShowName = namespaceShowName; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Namespace() { + } + + public Namespace(String namespace, String namespaceShowName) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + } + + public Namespace(String namespace, String namespaceShowName, int quota, int configCount, int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + } + + public Namespace(String namespace, String namespaceShowName, String namespaceDesc, int quota, int configCount, + int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + this.namespaceDesc = namespaceDesc; + } + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + public int getQuota() { + return quota; + } + + public void setQuota(int quota) { + this.quota = quota; + } + + public int getConfigCount() { + return configCount; + } + + public void setConfigCount(int configCount) { + this.configCount = configCount; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java b/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java index 3d544188..92d9c8fd 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java @@ -22,10 +22,10 @@ package com.alibaba.nacos.console.model; * @author Nacos */ public class NamespaceAllInfo extends Namespace { - - public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type, - String namespaceDesc) { - super(namespace, namespaceShowName, namespaceDesc, quota, configCount, type); - } - + + public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type, + String namespaceDesc) { + super(namespace, namespaceShowName, namespaceDesc, quota, configCount, type); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java b/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java index 952d6efb..851429a3 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java @@ -26,90 +26,86 @@ import java.util.Objects; /** * NamespaceForm. - * * @author dongyafei * @date 2022/8/16 */ public class NamespaceForm implements Serializable { - - private static final long serialVersionUID = -1078976569495343487L; - - private String namespaceId; - - private String namespaceName; - - private String namespaceDesc; - - public NamespaceForm() { - } - - public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) { - this.namespaceId = namespaceId; - this.namespaceName = namespaceName; - this.namespaceDesc = namespaceDesc; - } - - public String getNamespaceId() { - return namespaceId; - } - - public void setNamespaceId(String namespaceId) { - this.namespaceId = namespaceId; - } - - public String getNamespaceName() { - return namespaceName; - } - - public void setNamespaceName(String namespaceName) { - this.namespaceName = namespaceName; - } - - public String getNamespaceDesc() { - return namespaceDesc; - } - - public void setNamespaceDesc(String namespaceDesc) { - this.namespaceDesc = namespaceDesc; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - NamespaceForm that = (NamespaceForm) o; - return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName) - && Objects.equals(namespaceDesc, that.namespaceDesc); - } - - @Override - public int hashCode() { - return Objects.hash(namespaceId, namespaceName, namespaceDesc); - } - - @Override - public String toString() { - return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\'' - + ", namespaceDesc='" + namespaceDesc + '\'' + '}'; - } - - /** - * check required param. - * @throws NacosException NacosException - */ - public void validate() throws NacosException { - if (null == namespaceId) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, - "required parameter 'namespaceId' is missing"); - } - if (null == namespaceName) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, - "required parameter 'namespaceName' is missing"); - } - } - + + private static final long serialVersionUID = -1078976569495343487L; + + private String namespaceId; + + private String namespaceName; + + private String namespaceDesc; + + public NamespaceForm() { + } + + public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) { + this.namespaceId = namespaceId; + this.namespaceName = namespaceName; + this.namespaceDesc = namespaceDesc; + } + + public String getNamespaceId() { + return namespaceId; + } + + public void setNamespaceId(String namespaceId) { + this.namespaceId = namespaceId; + } + + public String getNamespaceName() { + return namespaceName; + } + + public void setNamespaceName(String namespaceName) { + this.namespaceName = namespaceName; + } + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NamespaceForm that = (NamespaceForm) o; + return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName) + && Objects.equals(namespaceDesc, that.namespaceDesc); + } + + @Override + public int hashCode() { + return Objects.hash(namespaceId, namespaceName, namespaceDesc); + } + + @Override + public String toString() { + return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\'' + + ", namespaceDesc='" + namespaceDesc + '\'' + '}'; + } + + /** + * check required param. + * @throws NacosException NacosException + */ + public void validate() throws NacosException { + if (null == namespaceId) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceId' is missing"); + } + if (null == namespaceName) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceName' is missing"); + } + } } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java b/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java index c85bb505..199261ef 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java @@ -19,6 +19,7 @@ package com.alibaba.nacos.console.service; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.api.NacosApiException; import com.alibaba.nacos.api.model.v2.ErrorCode; +import com.alibaba.nacos.common.utils.NamespaceUtil; import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.config.server.model.TenantInfo; import com.alibaba.nacos.config.server.service.repository.CommonPersistService; @@ -41,108 +42,109 @@ import java.util.List; @Service public class NamespaceOperationService { - - private final ConfigInfoPersistService configInfoPersistService; - - private final CommonPersistService commonPersistService; - - private static final String DEFAULT_NAMESPACE = "public"; - - private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public"; - - private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace"; - - private static final int DEFAULT_QUOTA = 200; - - private static final String DEFAULT_CREATE_SOURCE = "nacos"; - - private static final String DEFAULT_TENANT = ""; - - private static final String DEFAULT_KP = "1"; - - public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService, - CommonPersistService commonPersistService) { - this.configInfoPersistService = configInfoPersistService; - this.commonPersistService = commonPersistService; - } - - public List getNamespaceList() { - // TODO 获取用kp - List tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP); - - Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA, - configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType()); - List namespaceList = new ArrayList<>(); - namespaceList.add(namespace0); - - for (TenantInfo tenantInfo : tenantInfos) { - int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId()); - Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), - tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType()); - namespaceList.add(namespaceTmp); - } - return namespaceList; - } - - /** - * query namespace by namespace id. - * @param namespaceId namespace Id. - * @return NamespaceAllInfo. - */ - public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException { - // TODO 获取用kp - if (StringUtils.isBlank(namespaceId)) { - return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA, - configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(), - DEFAULT_NAMESPACE_DESCRIPTION); - } - else { - TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId); - if (null == tenantInfo) { - throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST, - "namespaceId [ " + namespaceId + " ] not exist"); - } - int configCount = configInfoPersistService.configInfoCount(namespaceId); - return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount, - NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc()); - } - } - - /** - * create namespace. - * @param namespaceId namespace ID - * @param namespaceName namespace Name - * @param namespaceDesc namespace Desc - * @return whether create ok - */ - public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc) - throws NacosException { - // TODO 获取用kp - if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) { - throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST, - "namespaceId [" + namespaceId + "] already exist"); - } - - commonPersistService.insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, - DEFAULT_CREATE_SOURCE, System.currentTimeMillis()); - return true; - } - - /** - * edit namespace. - */ - public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) { - // TODO 获取用kp - commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc); - return true; - } - - /** - * remove namespace. - */ - public Boolean removeNamespace(String namespaceId) { - commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId); - return true; - } - + + private final ConfigInfoPersistService configInfoPersistService; + + private final CommonPersistService commonPersistService; + + private static final String DEFAULT_NAMESPACE = "public"; + + private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public"; + + private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace"; + + private static final int DEFAULT_QUOTA = 200; + + private static final String DEFAULT_CREATE_SOURCE = "nacos"; + + private static final String DEFAULT_TENANT = ""; + + private static final String DEFAULT_KP = "1"; + + public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService, + CommonPersistService commonPersistService) { + this.configInfoPersistService = configInfoPersistService; + this.commonPersistService = commonPersistService; + } + + public List getNamespaceList() { + // TODO 获取用kp + List tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP); + + Namespace namespace0 = new Namespace(NamespaceUtil.getNamespaceDefaultId(), DEFAULT_NAMESPACE, DEFAULT_QUOTA, + configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType()); + List namespaceList = new ArrayList<>(); + namespaceList.add(namespace0); + + for (TenantInfo tenantInfo : tenantInfos) { + int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId()); + Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), + tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType()); + namespaceList.add(namespaceTmp); + } + return namespaceList; + } + + /** + * query namespace by namespace id. + * + * @param namespaceId namespace Id. + * @return NamespaceAllInfo. + */ + public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException { + // TODO 获取用kp + if (StringUtils.isBlank(namespaceId) || namespaceId.equals(NamespaceUtil.getNamespaceDefaultId())) { + return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA, + configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(), + DEFAULT_NAMESPACE_DESCRIPTION); + } else { + TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId); + if (null == tenantInfo) { + throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST, + "namespaceId [ " + namespaceId + " ] not exist"); + } + int configCount = configInfoPersistService.configInfoCount(namespaceId); + return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount, + NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc()); + } + } + + /** + * create namespace. + * + * @param namespaceId namespace ID + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + */ + public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc) + throws NacosException { + // TODO 获取用kp + if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) { + throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST, + "namespaceId [" + namespaceId + "] already exist"); + } + + commonPersistService + .insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, DEFAULT_CREATE_SOURCE, + System.currentTimeMillis()); + return true; + } + + /** + * edit namespace. + */ + public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) { + // TODO 获取用kp + commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc); + return true; + } + + /** + * remove namespace. + */ + public Boolean removeNamespace(String namespaceId) { + commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId); + return true; + } } diff --git a/pig-register/src/main/resources/nacos-version.txt b/pig-register/src/main/resources/nacos-version.txt index 13794c20..cf199263 100755 --- a/pig-register/src/main/resources/nacos-version.txt +++ b/pig-register/src/main/resources/nacos-version.txt @@ -1 +1 @@ -version=2.2.0 +version=2.2.3 diff --git a/pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.ttf b/pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.ttf new file mode 100644 index 0000000000000000000000000000000000000000..40cb59e09a114d81504aca336b3763e7e4e66b3e GIT binary patch literal 13564 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 HiTQs5cH2E# literal 0 HcmV?d00001 diff --git a/pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff b/pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff new file mode 100644 index 0000000000000000000000000000000000000000..8ac144a41e0426543dfc2ba1b601cd8b9adabe70 GIT binary patch literal 7724 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 S!#6R~4_*3(hYRoB-2VX_5!YY< literal 0 HcmV?d00001 diff --git a/pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff2 b/pig-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..931e3f32f4517c656608812598cd5c7dcad05c0f GIT binary patch literal 6448 zcmV-08PDc-Pew8T0RR9102wd<3jhEB05tpn02tl?0RR9100000000000000000000 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:expandInWithFade;-ms-animation-name:expandInWithFade;-o-animation-name:expandInWithFade;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards}.expand-enter-active>*,.expand-leave-active>*{-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.expand-leave-active>*{-moz-animation-name:expandOutWithFade;-ms-animation-name:expandOutWithFade;-o-animation-name:expandOutWithFade;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards}.next-overlay-wrapper .next-overlay-backdrop{background-color:rgba(0,0,0,.2)}.next-loading-fusion-reactor[dir=rtl]{-moz-animation-name:nextVectorRouteRTL;-ms-animation-name:nextVectorRouteRTL;-o-animation-name:nextVectorRouteRTL}@-moz-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-ms-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-o-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}.next-loading-fusion-reactor{width:48px;height:48px;-moz-animation-duration:5.6s;-ms-animation-duration:5.6s;-o-animation-duration:5.6s;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;-moz-animation-name:nextVectorRoute;-ms-animation-name:nextVectorRoute;-o-animation-name:nextVectorRoute}.next-loading-fusion-reactor .next-loading-dot{background:#5584ff;-moz-animation-timing-function:ease-in-out;-ms-animation-timing-function:ease-in-out;-o-animation-timing-function:ease-in-out;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-moz-animation-duration:1.4s;-ms-animation-duration:1.4s;-o-animation-duration:1.4s}.next-loading-fusion-reactor .next-loading-dot:first-child{-moz-animation-name:nextVectorDotsX;-ms-animation-name:nextVectorDotsX;-o-animation-name:nextVectorDotsX}.next-loading-fusion-reactor .next-loading-dot:nth-child(2){-moz-animation-name:nextVectorDotsY;-ms-animation-name:nextVectorDotsY;-o-animation-name:nextVectorDotsY}.next-loading-fusion-reactor .next-loading-dot:nth-child(3){-moz-animation-name:nextVectorDotsXR;-ms-animation-name:nextVectorDotsXR;-o-animation-name:nextVectorDotsXR}.next-loading-fusion-reactor .next-loading-dot:nth-child(4){-moz-animation-name:nextVectorDotsYR;-ms-animation-name:nextVectorDotsYR;-o-animation-name:nextVectorDotsYR}.next-loading-medium-fusion-reactor{width:32px;height:32px}.next-loading-medium-fusion-reactor .next-loading-dot:first-child{-moz-animation-name:nextVectorDotsX-medium;-ms-animation-name:nextVectorDotsX-medium;-o-animation-name:nextVectorDotsX-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(2){-moz-animation-name:nextVectorDotsY-medium;-ms-animation-name:nextVectorDotsY-medium;-o-animation-name:nextVectorDotsY-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(3){-moz-animation-name:nextVectorDotsXR-medium;-ms-animation-name:nextVectorDotsXR-medium;-o-animation-name:nextVectorDotsXR-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(4){-moz-animation-name:nextVectorDotsYR-medium;-ms-animation-name:nextVectorDotsYR-medium;-o-animation-name:nextVectorDotsYR-medium}@-moz-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-ms-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-o-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-moz-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:16.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:16.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:16.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:16.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:16.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:16.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:16.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:16.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:16.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:16.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:16.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:16.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:11.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:11.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:11.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:11.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:11.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:11.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:11.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:11.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:11.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:11.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:11.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:11.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}.next-message.next-message-success.next-inline{background-color:#e4fdda;border-color:#e4fdda}.next-message.next-message-success.next-addon .next-message-symbol,.next-message.next-message-success.next-inline .next-message-symbol{color:#46bc15}.next-message.next-message-success.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-success.next-toast .next-message-symbol{color:#46bc15}.next-message.next-message-warning.next-inline{background-color:#fff3e0;border-color:#fff3e0}.next-message.next-message-warning.next-addon .next-message-symbol,.next-message.next-message-warning.next-inline .next-message-symbol{color:#ff9300}.next-message.next-message-warning.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-warning.next-toast .next-message-symbol{color:#ff9300}.next-message.next-message-error.next-addon .next-message-symbol,.next-message.next-message-error.next-inline .next-message-symbol{color:#ff3000}.next-message.next-message-error.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-error.next-toast .next-message-symbol{color:#ff3000}.next-message.next-message-notice.next-inline{background-color:#e3f2fd;border-color:#e3f2fd}.next-message.next-message-notice.next-addon .next-message-symbol,.next-message.next-message-notice.next-inline .next-message-symbol{color:#4494f9}.next-message.next-message-notice.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-notice.next-toast .next-message-symbol{color:#4494f9}.next-message.next-message-help.next-inline{background-color:#e3fff8;border-color:#e3fff8}.next-message.next-message-help.next-addon .next-message-symbol,.next-message.next-message-help.next-inline .next-message-symbol{color:#01c1b2}.next-message.next-message-help.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-help.next-toast .next-message-symbol{color:#01c1b2}.next-message.next-message-loading.next-addon .next-message-symbol,.next-message.next-message-loading.next-inline .next-message-symbol{color:#5584ff}.next-message.next-message-loading.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-loading.next-toast .next-message-symbol{color:#5584ff}.next-message.next-large .next-message-content,.next-message.next-medium .next-message-content{font-size:12px}.next-radio-wrapper .next-radio-inner{border:1px solid #c4c6cf}.next-radio-wrapper.checked .next-radio-inner{border-color:#5584ff;background:#5584ff}.next-radio-wrapper.disabled .next-radio-inner{border-color:#e6e7eb;background:#f7f8fa}.next-radio-wrapper.disabled .next-radio-inner.hovered,.next-radio-wrapper.disabled .next-radio-inner:hover{border-color:#e6e7eb}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#e6e7eb;background:#f7f8fa}.next-radio-wrapper:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper:not(.disabled):hover .next-radio-inner{border-color:#5584ff;background-color:#dee8ff}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner{background:#3e71f7}.next-radio-button>label{border:1px solid #c4c6cf}.next-radio-button>label.hovered,.next-radio-button>label:hover{border-color:#a0a2ad;background-color:#f2f3f7}.next-radio-button>label.checked{border-color:#5584ff}.next-radio-button>label.checked .next-radio-label{color:#5584ff}.next-radio-button>label.disabled{border-color:#e6e7eb;background-color:#f7f8fa}.next-radio-button>label.checked.disabled{border-color:#e6e7eb;background-color:#f2f3f7}.next-radio-button-medium>label{height:28px;line-height:28px}.next-radio-button-medium .next-radio-label{height:26px;line-height:26px;font-size:12px}.next-radio-label{margin:0 4px;font-size:12px}@-moz-document url-prefix(){.next-radio{margin-top:-1px}@supports(animation:calc(0s)){.next-radio{margin-top:-3px}}}.next-checkbox-wrapper .next-checkbox-inner{border:1px solid #c4c6cf}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{left:4px}.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper .next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner{background-color:#5584ff}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner{background-color:#5584ff}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner{border-color:#5584ff;background-color:#dee8ff}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner{background-color:#3e71f7}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner,.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#e6e7eb;background:#f7f8fa}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover{border-color:#e6e7eb}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#e6e7eb;background:#f7f8fa}.next-checkbox-label{font-size:12px;margin:0 4px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-right:-16px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before{width:12px;font-size:12px}.next-menu{border:1px solid #dcdee3}.next-menu,.next-menu-item-helper{font-size:12px}.next-menu-item.next-selected .next-menu-icon-selected{color:#5584ff}.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled):hover{background-color:#f2f3f7}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected{color:#5584ff}.next-menu-item-inner{font-size:12px}.next-menu-divider{border-bottom:1px solid #e6e7eb}.next-menu .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu .next-menu-icon-selected.next-icon:before{width:12px;font-size:12px}.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-icon-arrow.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow.next-icon:before{width:16px;font-size:16px}}.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-down.next-open:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow-down.next-open{transform:scale(.5) rotate(180deg);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow-down.next-open:before{width:16px;font-size:16px}}.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-right.next-open:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow-right.next-open{transform:scale(.5) rotate(-90deg);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow-right.next-open:before{width:16px;font-size:16px}}.next-btn.next-small{padding:0 8px;height:20px}.next-btn.next-small.next-btn-loading:before{left:8px}.next-btn.next-medium{padding:0 12px;height:28px;font-size:12px}.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-first:before,.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn.next-medium.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:12px}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:12px}.next-btn.next-large{padding:0 16px}.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-alone:before,.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-first:before,.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn.next-large.next-btn-loading:before{width:16px;height:16px;font-size:16px;line-height:16px;left:16px}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:16px}.next-btn.next-btn-normal{border-color:#c4c6cf}.next-btn.next-btn-normal.active,.next-btn.next-btn-normal.hover,.next-btn.next-btn-normal:active,.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover{background:#f2f3f7;border-color:#a0a2ad}.next-btn.next-btn-primary{background:#5584ff}.next-btn.next-btn-primary.active,.next-btn.next-btn-primary.hover,.next-btn.next-btn-primary:active,.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover{background:#3e71f7}.next-btn.next-btn-secondary{border-color:#5584ff}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary.visited,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited{color:#5584ff}.next-btn.next-btn-secondary.active,.next-btn.next-btn-secondary.hover,.next-btn.next-btn-secondary:active,.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover{background:#3e71f7;border-color:#3e71f7}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal.active,.next-btn.disabled.next-btn-normal.hover,.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary.active,.next-btn.disabled.next-btn-primary.hover,.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary.active,.next-btn.disabled.next-btn-secondary.hover,.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal.active,.next-btn[disabled].next-btn-normal.hover,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary.active,.next-btn[disabled].next-btn-primary.hover,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary.active,.next-btn[disabled].next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover{background:#f7f8fa;border-color:#e6e7eb}.next-btn-warning.next-btn-primary{background:#ff3000;border-color:#ff3000}.next-btn-warning.next-btn-primary.active,.next-btn-warning.next-btn-primary.hover,.next-btn-warning.next-btn-primary:active,.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover{background:#e72b00;border-color:#e72b00}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled].active,.next-btn-warning.next-btn-primary[disabled].hover,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover{background:#f7f8fa;border-color:#dcdee3}.next-btn-warning.next-btn-normal{border-color:#ff3000}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal.visited,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited{color:#ff3000}.next-btn-warning.next-btn-normal.active,.next-btn-warning.next-btn-normal.hover,.next-btn-warning.next-btn-normal:active,.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover{background:#e72b00;border-color:#e72b00}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled].active,.next-btn-warning.next-btn-normal[disabled].hover,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover{background:#f7f8fa;border-color:#e6e7eb}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary.visited,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited{color:#5584ff}.next-btn-text.next-btn-primary.active,.next-btn-text.next-btn-primary.hover,.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover{color:#3e71f7}.next-btn-text.next-btn-normal.active,.next-btn-text.next-btn-normal.hover,.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover,.next-btn-text.next-btn-secondary.active,.next-btn-text.next-btn-secondary.hover,.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover{color:#5584ff}.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-first:before,.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn-text.next-large.next-btn-loading:before{width:16px;height:16px;font-size:16px;line-height:16px}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:16px}.next-btn-text.next-medium{font-size:12px}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn-text.next-medium.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:12px}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#e6e7eb}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#e6e7eb}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:8px;padding-right:24px}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:8px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:12px;padding-right:28px}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:12px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:16px;padding-right:36px}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:16px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-right:20px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-right:16px}.next-dialog{border:1px solid #dcdee3;border-radius:3px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-dialog-body{font-size:12px}.next-dialog-body-no-footer{margin-bottom:0}.next-dialog-close .next-dialog-close-icon.next-icon{margin-top:-6px;margin-left:-6px;width:12px;height:12px}.next-dialog-close .next-dialog-close-icon.next-icon:before{width:12px;height:12px;font-size:12px}.next-dialog-v2 .next-dialog-header+.next-dialog-body-no-footer{margin-bottom:0}.next-input{border:1px solid #c4c6cf}.next-input.next-small{height:20px}.next-input.next-small input{height:18px;line-height:18px \0 }.next-input.next-small .next-input-text-field{height:18px;line-height:18px}.next-input.next-small .next-icon .next-icon-remote,.next-input.next-small .next-icon:before{width:12px;font-size:12px}.next-input.next-medium{height:28px}.next-input.next-medium .next-input-inner,.next-input.next-medium .next-input-label{font-size:12px}.next-input.next-medium input{height:26px;line-height:26px \0 ;font-size:12px}.next-input.next-medium input::placeholder{font-size:12px}.next-input.next-medium .next-input-text-field{font-size:12px;height:26px;line-height:26px}.next-input.next-medium .next-icon .next-icon-remote,.next-input.next-medium .next-icon:before{width:12px;font-size:12px}.next-input.next-large .next-icon .next-icon-remote,.next-input.next-large .next-icon:before{width:16px;font-size:16px}.next-input.next-input-textarea.next-small textarea,.next-input.next-input-textarea textarea{font-size:12px}.next-input.next-focus,.next-input:hover{border-color:#a0a2ad}.next-input.next-focus{border-color:#5584ff;box-shadow:0 0 0 2px rgba(85,132,255,.2)}.next-input.next-warning,.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#ff9300}.next-input.next-warning.next-focus{box-shadow:0 0 0 2px rgba(255,147,0,.2)}.next-input.next-error,.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#ff3000}.next-input.next-error.next-focus{box-shadow:0 0 0 2px rgba(255,48,0,.2)}.next-input-control .next-input-len.next-error{color:#ff3000}.next-input-control .next-input-len.next-warning,.next-input-control .next-input-warning-icon{color:#ff9300}.next-input-control .next-input-success-icon{color:#46bc15}.next-input-control .next-input-loading-icon{color:#4494f9}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#999}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#999}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#999}.next-input.next-disabled,.next-input.next-disabled:hover{border-color:#e6e7eb;background-color:#f7f8fa}.next-input-group-text{background-color:#f2f3f7;border:1px solid #c4c6cf}.next-input-group-text.next-disabled,.next-input-group-text.next-disabled:hover{border-color:#e6e7eb;background-color:#f7f8fa}.next-input-group-text.next-medium{font-size:12px}.next-col-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}@media(min-width:320px){.next-col-xxs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xxs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xxs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xxs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xxs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xxs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xxs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xxs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xxs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xxs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xxs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xxs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xxs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xxs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xxs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xxs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xxs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xxs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xxs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xxs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xxs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xxs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xxs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xxs-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xs-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-s-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-s-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-s-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-s-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-s-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-s-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-s-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-s-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-s-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-s-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-s-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-s-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-s-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-s-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-s-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-s-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-s-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-s-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-s-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-s-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-s-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-s-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-s-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-m-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-m-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-m-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-m-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-m-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-m-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-m-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-m-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-m-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-m-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-m-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-m-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-m-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-m-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-m-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-m-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-m-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-m-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-m-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-m-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-m-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-m-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-m-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-l-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-l-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-l-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-l-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-l-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-l-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-l-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-l-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-l-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-l-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-l-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-l-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-l-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-l-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-l-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-l-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-l-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-l-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-l-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-l-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-l-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-l-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-l-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xl-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xl-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xl-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xl-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xl-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xl-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xl-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xl-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xl-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xl-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xl-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xl-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xl-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xl-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xl-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xl-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xl-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xl-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xl-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xl-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xl-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xl-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xl-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:320px){.next-col-xxs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xxs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xxs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xxs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xxs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-s-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-s-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-s-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-s-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-m-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-m-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-m-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-m-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-l-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-l-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-l-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-l-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xl-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xl-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xl-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xl-5p5{flex:0 0 100%;width:100%;max-width:100%}}.next-col-offset-1{margin-left:4.1666666667%}.next-col-offset-2{margin-left:8.3333333333%}.next-col-offset-4{margin-left:16.6666666667%}.next-col-offset-5{margin-left:20.8333333333%}.next-col-offset-7{margin-left:29.1666666667%}.next-col-offset-8{margin-left:33.3333333333%}.next-col-offset-10{margin-left:41.6666666667%}.next-col-offset-11{margin-left:45.8333333333%}.next-col-offset-13{margin-left:54.1666666667%}.next-col-offset-14{margin-left:58.3333333333%}.next-col-offset-16{margin-left:66.6666666667%}.next-col-offset-17{margin-left:70.8333333333%}.next-col-offset-19{margin-left:79.1666666667%}.next-col-offset-20{margin-left:83.3333333333%}.next-col-offset-22{margin-left:91.6666666667%}.next-col-offset-23{margin-left:95.8333333333%}@media(min-width:320px){.next-col-xxs-offset-1{margin-left:4.1666666667%}.next-col-xxs-offset-2{margin-left:8.3333333333%}.next-col-xxs-offset-3{margin-left:12.5%}.next-col-xxs-offset-4{margin-left:16.6666666667%}.next-col-xxs-offset-5{margin-left:20.8333333333%}.next-col-xxs-offset-6{margin-left:25%}.next-col-xxs-offset-7{margin-left:29.1666666667%}.next-col-xxs-offset-8{margin-left:33.3333333333%}.next-col-xxs-offset-9{margin-left:37.5%}.next-col-xxs-offset-10{margin-left:41.6666666667%}.next-col-xxs-offset-11{margin-left:45.8333333333%}.next-col-xxs-offset-12{margin-left:50%}.next-col-xxs-offset-13{margin-left:54.1666666667%}.next-col-xxs-offset-14{margin-left:58.3333333333%}.next-col-xxs-offset-15{margin-left:62.5%}.next-col-xxs-offset-16{margin-left:66.6666666667%}.next-col-xxs-offset-17{margin-left:70.8333333333%}.next-col-xxs-offset-18{margin-left:75%}.next-col-xxs-offset-19{margin-left:79.1666666667%}.next-col-xxs-offset-20{margin-left:83.3333333333%}.next-col-xxs-offset-21{margin-left:87.5%}.next-col-xxs-offset-22{margin-left:91.6666666667%}.next-col-xxs-offset-23{margin-left:95.8333333333%}.next-col-xxs-offset-24{margin-left:100%}}@media(min-width:480px){.next-col-xs-offset-1{margin-left:4.1666666667%}.next-col-xs-offset-2{margin-left:8.3333333333%}.next-col-xs-offset-3{margin-left:12.5%}.next-col-xs-offset-4{margin-left:16.6666666667%}.next-col-xs-offset-5{margin-left:20.8333333333%}.next-col-xs-offset-6{margin-left:25%}.next-col-xs-offset-7{margin-left:29.1666666667%}.next-col-xs-offset-8{margin-left:33.3333333333%}.next-col-xs-offset-9{margin-left:37.5%}.next-col-xs-offset-10{margin-left:41.6666666667%}.next-col-xs-offset-11{margin-left:45.8333333333%}.next-col-xs-offset-12{margin-left:50%}.next-col-xs-offset-13{margin-left:54.1666666667%}.next-col-xs-offset-14{margin-left:58.3333333333%}.next-col-xs-offset-15{margin-left:62.5%}.next-col-xs-offset-16{margin-left:66.6666666667%}.next-col-xs-offset-17{margin-left:70.8333333333%}.next-col-xs-offset-18{margin-left:75%}.next-col-xs-offset-19{margin-left:79.1666666667%}.next-col-xs-offset-20{margin-left:83.3333333333%}.next-col-xs-offset-21{margin-left:87.5%}.next-col-xs-offset-22{margin-left:91.6666666667%}.next-col-xs-offset-23{margin-left:95.8333333333%}.next-col-xs-offset-24{margin-left:100%}}@media(min-width:720px){.next-col-s-offset-1{margin-left:4.1666666667%}.next-col-s-offset-2{margin-left:8.3333333333%}.next-col-s-offset-3{margin-left:12.5%}.next-col-s-offset-4{margin-left:16.6666666667%}.next-col-s-offset-5{margin-left:20.8333333333%}.next-col-s-offset-6{margin-left:25%}.next-col-s-offset-7{margin-left:29.1666666667%}.next-col-s-offset-8{margin-left:33.3333333333%}.next-col-s-offset-9{margin-left:37.5%}.next-col-s-offset-10{margin-left:41.6666666667%}.next-col-s-offset-11{margin-left:45.8333333333%}.next-col-s-offset-12{margin-left:50%}.next-col-s-offset-13{margin-left:54.1666666667%}.next-col-s-offset-14{margin-left:58.3333333333%}.next-col-s-offset-15{margin-left:62.5%}.next-col-s-offset-16{margin-left:66.6666666667%}.next-col-s-offset-17{margin-left:70.8333333333%}.next-col-s-offset-18{margin-left:75%}.next-col-s-offset-19{margin-left:79.1666666667%}.next-col-s-offset-20{margin-left:83.3333333333%}.next-col-s-offset-21{margin-left:87.5%}.next-col-s-offset-22{margin-left:91.6666666667%}.next-col-s-offset-23{margin-left:95.8333333333%}.next-col-s-offset-24{margin-left:100%}}@media(min-width:990px){.next-col-m-offset-1{margin-left:4.1666666667%}.next-col-m-offset-2{margin-left:8.3333333333%}.next-col-m-offset-3{margin-left:12.5%}.next-col-m-offset-4{margin-left:16.6666666667%}.next-col-m-offset-5{margin-left:20.8333333333%}.next-col-m-offset-6{margin-left:25%}.next-col-m-offset-7{margin-left:29.1666666667%}.next-col-m-offset-8{margin-left:33.3333333333%}.next-col-m-offset-9{margin-left:37.5%}.next-col-m-offset-10{margin-left:41.6666666667%}.next-col-m-offset-11{margin-left:45.8333333333%}.next-col-m-offset-12{margin-left:50%}.next-col-m-offset-13{margin-left:54.1666666667%}.next-col-m-offset-14{margin-left:58.3333333333%}.next-col-m-offset-15{margin-left:62.5%}.next-col-m-offset-16{margin-left:66.6666666667%}.next-col-m-offset-17{margin-left:70.8333333333%}.next-col-m-offset-18{margin-left:75%}.next-col-m-offset-19{margin-left:79.1666666667%}.next-col-m-offset-20{margin-left:83.3333333333%}.next-col-m-offset-21{margin-left:87.5%}.next-col-m-offset-22{margin-left:91.6666666667%}.next-col-m-offset-23{margin-left:95.8333333333%}.next-col-m-offset-24{margin-left:100%}}@media(min-width:1200px){.next-col-l-offset-1{margin-left:4.1666666667%}.next-col-l-offset-2{margin-left:8.3333333333%}.next-col-l-offset-3{margin-left:12.5%}.next-col-l-offset-4{margin-left:16.6666666667%}.next-col-l-offset-5{margin-left:20.8333333333%}.next-col-l-offset-6{margin-left:25%}.next-col-l-offset-7{margin-left:29.1666666667%}.next-col-l-offset-8{margin-left:33.3333333333%}.next-col-l-offset-9{margin-left:37.5%}.next-col-l-offset-10{margin-left:41.6666666667%}.next-col-l-offset-11{margin-left:45.8333333333%}.next-col-l-offset-12{margin-left:50%}.next-col-l-offset-13{margin-left:54.1666666667%}.next-col-l-offset-14{margin-left:58.3333333333%}.next-col-l-offset-15{margin-left:62.5%}.next-col-l-offset-16{margin-left:66.6666666667%}.next-col-l-offset-17{margin-left:70.8333333333%}.next-col-l-offset-18{margin-left:75%}.next-col-l-offset-19{margin-left:79.1666666667%}.next-col-l-offset-20{margin-left:83.3333333333%}.next-col-l-offset-21{margin-left:87.5%}.next-col-l-offset-22{margin-left:91.6666666667%}.next-col-l-offset-23{margin-left:95.8333333333%}.next-col-l-offset-24{margin-left:100%}}@media(min-width:1500px){.next-col-xl-offset-1{margin-left:4.1666666667%}.next-col-xl-offset-2{margin-left:8.3333333333%}.next-col-xl-offset-3{margin-left:12.5%}.next-col-xl-offset-4{margin-left:16.6666666667%}.next-col-xl-offset-5{margin-left:20.8333333333%}.next-col-xl-offset-6{margin-left:25%}.next-col-xl-offset-7{margin-left:29.1666666667%}.next-col-xl-offset-8{margin-left:33.3333333333%}.next-col-xl-offset-9{margin-left:37.5%}.next-col-xl-offset-10{margin-left:41.6666666667%}.next-col-xl-offset-11{margin-left:45.8333333333%}.next-col-xl-offset-12{margin-left:50%}.next-col-xl-offset-13{margin-left:54.1666666667%}.next-col-xl-offset-14{margin-left:58.3333333333%}.next-col-xl-offset-15{margin-left:62.5%}.next-col-xl-offset-16{margin-left:66.6666666667%}.next-col-xl-offset-17{margin-left:70.8333333333%}.next-col-xl-offset-18{margin-left:75%}.next-col-xl-offset-19{margin-left:79.1666666667%}.next-col-xl-offset-20{margin-left:83.3333333333%}.next-col-xl-offset-21{margin-left:87.5%}.next-col-xl-offset-22{margin-left:91.6666666667%}.next-col-xl-offset-23{margin-left:95.8333333333%}.next-col-xl-offset-24{margin-left:100%}}.next-col-offset-1[dir=rtl]{margin-right:4.1666666667%}.next-col-offset-2[dir=rtl]{margin-right:8.3333333333%}.next-col-offset-4[dir=rtl]{margin-right:16.6666666667%}.next-col-offset-5[dir=rtl]{margin-right:20.8333333333%}.next-col-offset-7[dir=rtl]{margin-right:29.1666666667%}.next-col-offset-8[dir=rtl]{margin-right:33.3333333333%}.next-col-offset-10[dir=rtl]{margin-right:41.6666666667%}.next-col-offset-11[dir=rtl]{margin-right:45.8333333333%}.next-col-offset-13[dir=rtl]{margin-right:54.1666666667%}.next-col-offset-14[dir=rtl]{margin-right:58.3333333333%}.next-col-offset-16[dir=rtl]{margin-right:66.6666666667%}.next-col-offset-17[dir=rtl]{margin-right:70.8333333333%}.next-col-offset-19[dir=rtl]{margin-right:79.1666666667%}.next-col-offset-20[dir=rtl]{margin-right:83.3333333333%}.next-col-offset-22[dir=rtl]{margin-right:91.6666666667%}.next-col-offset-23[dir=rtl]{margin-right:95.8333333333%}@media(min-width:320px){.next-col-xxs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xxs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xxs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xxs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xxs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xxs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xxs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xxs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xxs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xxs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xxs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xxs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xxs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xxs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xxs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xxs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xxs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xxs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xxs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xxs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xxs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xxs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xxs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xxs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:480px){.next-col-xs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:720px){.next-col-s-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-s-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-s-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-s-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-s-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-s-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-s-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-s-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-s-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-s-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-s-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-s-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-s-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-s-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-s-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-s-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-s-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-s-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-s-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-s-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-s-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-s-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-s-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-s-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:990px){.next-col-m-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-m-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-m-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-m-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-m-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-m-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-m-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-m-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-m-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-m-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-m-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-m-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-m-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-m-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-m-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-m-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-m-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-m-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-m-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-m-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-m-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-m-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-m-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-m-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1200px){.next-col-l-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-l-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-l-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-l-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-l-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-l-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-l-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-l-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-l-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-l-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-l-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-l-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-l-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-l-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-l-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-l-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-l-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-l-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-l-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-l-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-l-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-l-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-l-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-l-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1500px){.next-col-xl-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xl-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xl-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xl-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xl-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xl-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xl-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xl-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xl-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xl-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xl-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xl-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xl-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xl-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xl-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xl-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xl-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xl-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xl-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xl-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xl-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xl-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xl-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xl-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}.next-form-preview.next-form-item.next-medium .next-form-item-label{font-size:12px}.next-form-responsive-grid.next-small .next-form-item.next-left .next-form-item-label{margin-top:4px;margin-bottom:4px}.next-form-responsive-grid.next-medium .next-form-item.next-left .next-form-item-label{margin-top:8px;margin-bottom:8px}.next-form-item.has-error>.next-form-item-control>.next-form-item-help{color:#ff3000}.next-form-item.has-warning>.next-form-item-control>.next-form-item-help{color:#ff9300}.next-form-item .next-form-item-label,.next-form-item .next-form-text-align,.next-form-item p{line-height:28px}.next-form-item .next-checkbox-group,.next-form-item .next-checkbox-wrapper,.next-form-item .next-radio-group,.next-form-item .next-radio-wrapper,.next-form-item .next-rating{line-height:24px}.next-form-item .next-form-preview{font-size:12px}.next-form-item .next-form-preview.next-input-textarea>p{font-size:12px;min-height:16.8px;margin-top:5.6px}.next-form-item .next-form-item-label{font-size:12px}.next-form-item.next-small .next-checkbox-group,.next-form-item.next-small .next-checkbox-wrapper,.next-form-item.next-small .next-form-item-label,.next-form-item.next-small .next-form-text-align,.next-form-item.next-small .next-radio-group,.next-form-item.next-small .next-radio-wrapper,.next-form-item.next-small .next-rating,.next-form-item.next-small p{line-height:20px}.next-form-item-label.next-left>label[required]:after,.next-form-item-label label[required]:before{color:#ff3000} +@font-face{font-family:NextIcon;src:url(../console-ui/public/icons/icon-font.eot);src:url(../console-ui/public/icons/icon-font.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/icons/icon-font.woff2) format("woff2"),url(../console-ui/public/icons/icon-font.woff) format("woff"),url(../console-ui/public/icons/icon-font.ttf) format("truetype"),url(../console-ui/public/icons/icon-font.svg#NextIcon) format("svg");font-display:swap}.next-overlay-wrapper .next-overlay-backdrop{background-color:rgba(0,0,0,.2)}.next-loading-fusion-reactor{width:48px;height:48px}.next-loading-fusion-reactor .next-loading-dot{background:#5584ff}.next-loading-medium-fusion-reactor{width:32px;height:32px}.next-message.next-message-success.next-inline{background-color:#e4fdda;border-color:#e4fdda}.next-message.next-message-success.next-addon .next-message-symbol,.next-message.next-message-success.next-inline .next-message-symbol{color:#46bc15}.next-message.next-message-success.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-success.next-toast .next-message-symbol{color:#46bc15}.next-message.next-message-warning.next-inline{background-color:#fff3e0;border-color:#fff3e0}.next-message.next-message-warning.next-addon .next-message-symbol,.next-message.next-message-warning.next-inline .next-message-symbol{color:#ff9300}.next-message.next-message-warning.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-warning.next-toast .next-message-symbol{color:#ff9300}.next-message.next-message-error.next-addon .next-message-symbol,.next-message.next-message-error.next-inline .next-message-symbol{color:#ff3000}.next-message.next-message-error.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-error.next-toast .next-message-symbol{color:#ff3000}.next-message.next-message-notice.next-inline{background-color:#e3f2fd;border-color:#e3f2fd}.next-message.next-message-notice.next-addon .next-message-symbol,.next-message.next-message-notice.next-inline .next-message-symbol{color:#4494f9}.next-message.next-message-notice.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-notice.next-toast .next-message-symbol{color:#4494f9}.next-message.next-message-help.next-inline{background-color:#e3fff8;border-color:#e3fff8}.next-message.next-message-help.next-addon .next-message-symbol,.next-message.next-message-help.next-inline .next-message-symbol{color:#01c1b2}.next-message.next-message-help.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-help.next-toast .next-message-symbol{color:#01c1b2}.next-message.next-message-loading.next-addon .next-message-symbol,.next-message.next-message-loading.next-inline .next-message-symbol{color:#5584ff}.next-message.next-message-loading.next-toast{box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-message.next-message-loading.next-toast .next-message-symbol{color:#5584ff}.next-message.next-large .next-message-content,.next-message.next-medium .next-message-content{font-size:12px}.next-radio-wrapper .next-radio-inner{border:1px solid #c4c6cf}.next-radio-wrapper.checked .next-radio-inner{border-color:#5584ff;background:#5584ff}.next-radio-wrapper.disabled .next-radio-inner{border-color:#e6e7eb;background:#f7f8fa}.next-radio-wrapper.disabled .next-radio-inner.hovered,.next-radio-wrapper.disabled .next-radio-inner:hover{border-color:#e6e7eb}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#e6e7eb;background:#f7f8fa}.next-radio-wrapper:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper:not(.disabled):hover .next-radio-inner{border-color:#5584ff;background-color:#dee8ff}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner{background:#3e71f7}.next-radio-button>label{border:1px solid #c4c6cf}.next-radio-button>label.hovered,.next-radio-button>label:hover{border-color:#a0a2ad;background-color:#f2f3f7}.next-radio-button>label.checked{border-color:#5584ff}.next-radio-button>label.checked .next-radio-label{color:#5584ff}.next-radio-button>label.disabled{border-color:#e6e7eb;background-color:#f7f8fa}.next-radio-button>label.checked.disabled{border-color:#e6e7eb;background-color:#f2f3f7}.next-radio-button-medium>label{height:28px;line-height:28px}.next-radio-button-medium .next-radio-label{height:26px;line-height:26px;font-size:12px}.next-radio-label{font-size:12px}.next-checkbox-wrapper .next-checkbox-inner{border:1px solid #c4c6cf}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{left:4px}.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper .next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner{background-color:#5584ff}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner{background-color:#5584ff}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:16px;font-size:16px}}.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner{border-color:#5584ff;background-color:#dee8ff}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner{background-color:#3e71f7}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner,.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#e6e7eb;background:#f7f8fa}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover{border-color:#e6e7eb}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#e6e7eb;background:#f7f8fa}.next-checkbox-label{font-size:12px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-right:-16px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before{width:12px;font-size:12px}.next-menu{border:1px solid #dcdee3}.next-menu,.next-menu-item-helper{font-size:12px}.next-menu-item.next-selected .next-menu-icon-selected{color:#5584ff}.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled):hover{background-color:#f2f3f7}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected{color:#5584ff}.next-menu-item-inner{font-size:12px}.next-menu-divider{border-bottom:1px solid #e6e7eb}.next-menu .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu .next-menu-icon-selected.next-icon:before{width:12px;font-size:12px}.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-icon-arrow.next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow.next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow.next-icon:before{width:16px;font-size:16px}}.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-down.next-open:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow-down.next-open{transform:scale(.5) rotate(180deg);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow-down.next-open:before{width:16px;font-size:16px}}.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-right.next-open:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-menu .next-menu-icon-arrow-right.next-open{transform:scale(.5) rotate(-90deg);margin-left:-4px;margin-right:-4px}.next-menu .next-menu-icon-arrow-right.next-open:before{width:16px;font-size:16px}}.next-btn.next-small{padding:0 8px;height:20px}.next-btn.next-small.next-btn-loading:before{left:8px}.next-btn.next-medium{padding:0 12px;height:28px;font-size:12px}.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-first:before,.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn.next-medium.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:12px}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:12px}.next-btn.next-large{padding:0 16px}.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-alone:before,.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-first:before,.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn.next-large.next-btn-loading:before{width:16px;height:16px;font-size:16px;line-height:16px;left:16px}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:16px}.next-btn.next-btn-normal{border-color:#c4c6cf}.next-btn.next-btn-normal.active,.next-btn.next-btn-normal.hover,.next-btn.next-btn-normal:active,.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover{background:#f2f3f7;border-color:#a0a2ad}.next-btn.next-btn-primary{background:#5584ff}.next-btn.next-btn-primary.active,.next-btn.next-btn-primary.hover,.next-btn.next-btn-primary:active,.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover{background:#3e71f7}.next-btn.next-btn-secondary{border-color:#5584ff}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary.visited,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited{color:#5584ff}.next-btn.next-btn-secondary.active,.next-btn.next-btn-secondary.hover,.next-btn.next-btn-secondary:active,.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover{background:#3e71f7;border-color:#3e71f7}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal.active,.next-btn.disabled.next-btn-normal.hover,.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary.active,.next-btn.disabled.next-btn-primary.hover,.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary.active,.next-btn.disabled.next-btn-secondary.hover,.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal.active,.next-btn[disabled].next-btn-normal.hover,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary.active,.next-btn[disabled].next-btn-primary.hover,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary.active,.next-btn[disabled].next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover{background:#f7f8fa;border-color:#e6e7eb}.next-btn-warning.next-btn-primary{background:#ff3000;border-color:#ff3000}.next-btn-warning.next-btn-primary.active,.next-btn-warning.next-btn-primary.hover,.next-btn-warning.next-btn-primary:active,.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover{background:#e72b00;border-color:#e72b00}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled].active,.next-btn-warning.next-btn-primary[disabled].hover,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover{background:#f7f8fa;border-color:#dcdee3}.next-btn-warning.next-btn-normal{border-color:#ff3000}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal.visited,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited{color:#ff3000}.next-btn-warning.next-btn-normal.active,.next-btn-warning.next-btn-normal.hover,.next-btn-warning.next-btn-normal:active,.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover{background:#e72b00;border-color:#e72b00}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled].active,.next-btn-warning.next-btn-normal[disabled].hover,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover{background:#f7f8fa;border-color:#e6e7eb}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary.visited,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited{color:#5584ff}.next-btn-text.next-btn-primary.active,.next-btn-text.next-btn-primary.hover,.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover{color:#3e71f7}.next-btn-text.next-btn-normal.active,.next-btn-text.next-btn-normal.hover,.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover,.next-btn-text.next-btn-secondary.active,.next-btn-text.next-btn-secondary.hover,.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover{color:#5584ff}.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-first:before,.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn-text.next-large.next-btn-loading:before{width:16px;height:16px;font-size:16px;line-height:16px}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:16px}.next-btn-text.next-medium{font-size:12px}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn-text.next-medium.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:12px}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#e6e7eb}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#e6e7eb}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:8px;padding-right:24px}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:8px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:12px;padding-right:28px}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:12px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:16px;padding-right:36px}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:16px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before{width:16px;font-size:16px}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-right:20px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-right:16px}.next-dialog{border:1px solid #dcdee3;border-radius:3px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-dialog-body{font-size:12px}.next-dialog-close .next-dialog-close-icon.next-icon{margin-top:-6px;margin-left:-6px;width:12px;height:12px}.next-dialog-close .next-dialog-close-icon.next-icon:before{width:12px;height:12px;font-size:12px}.next-input{border:1px solid #c4c6cf}.next-input.next-small{height:20px}.next-input.next-small input{height:18px;line-height:18px \0 }.next-input.next-small .next-input-text-field{height:18px;line-height:18px}.next-input.next-small .next-icon .next-icon-remote,.next-input.next-small .next-icon:before{width:12px;font-size:12px}.next-input.next-medium{height:28px}.next-input.next-medium .next-input-inner,.next-input.next-medium .next-input-label{font-size:12px}.next-input.next-medium input{height:26px;line-height:26px \0 ;font-size:12px}.next-input.next-medium input::placeholder{font-size:12px}.next-input.next-medium .next-input-text-field{font-size:12px;height:26px;line-height:26px}.next-input.next-medium .next-icon .next-icon-remote,.next-input.next-medium .next-icon:before{width:12px;font-size:12px}.next-input.next-large .next-icon .next-icon-remote,.next-input.next-large .next-icon:before{width:16px;font-size:16px}.next-input.next-input-textarea.next-small textarea,.next-input.next-input-textarea textarea{font-size:12px}.next-input.next-focus,.next-input:hover{border-color:#a0a2ad}.next-input.next-focus{border-color:#5584ff;box-shadow:0 0 0 2px rgba(85,132,255,.2)}.next-input.next-warning,.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#ff9300}.next-input.next-warning.next-focus{box-shadow:0 0 0 2px rgba(255,147,0,.2)}.next-input.next-error,.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#ff3000}.next-input.next-error.next-focus{box-shadow:0 0 0 2px rgba(255,48,0,.2)}.next-input-control .next-input-len.next-error{color:#ff3000}.next-input-control .next-input-len.next-warning,.next-input-control .next-input-warning-icon{color:#ff9300}.next-input-control .next-input-success-icon{color:#46bc15}.next-input-control .next-input-loading-icon{color:#4494f9}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#999}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#999}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#999}.next-input.next-disabled,.next-input.next-disabled:hover{border-color:#e6e7eb;background-color:#f7f8fa}.next-input-group-text{background-color:#f2f3f7;border:1px solid #c4c6cf}.next-input-group-text.next-disabled,.next-input-group-text.next-disabled:hover{border-color:#e6e7eb;background-color:#f7f8fa}.next-form-preview.next-form-item.next-medium .next-form-item-label,.next-input-group-text.next-medium{font-size:12px}.next-form-responsive-grid.next-small .next-form-item.next-left .next-form-item-label{margin-top:4px;margin-bottom:4px}.next-form-responsive-grid.next-medium .next-form-item.next-left .next-form-item-label{margin-top:8px;margin-bottom:8px}.next-form-item.has-error>.next-form-item-control>.next-form-item-help{color:#ff3000}.next-form-item.has-warning>.next-form-item-control>.next-form-item-help{color:#ff9300}.next-form-item .next-form-item-label,.next-form-item .next-form-text-align,.next-form-item p{line-height:28px}.next-form-item .next-checkbox-group,.next-form-item .next-checkbox-wrapper,.next-form-item .next-radio-group,.next-form-item .next-radio-wrapper,.next-form-item .next-rating{line-height:24px}.next-form-item .next-form-preview{font-size:12px}.next-form-item .next-form-preview.next-input-textarea>p{font-size:12px;min-height:16.8px;margin-top:5.6px}.next-form-item .next-form-item-label{font-size:12px}.next-form-item.next-small .next-checkbox-group,.next-form-item.next-small .next-checkbox-wrapper,.next-form-item.next-small .next-form-item-label,.next-form-item.next-small .next-form-text-align,.next-form-item.next-small .next-radio-group,.next-form-item.next-small .next-radio-wrapper,.next-form-item.next-small .next-rating,.next-form-item.next-small p{line-height:20px}.next-form-item-label.next-left>label[required]:after,.next-form-item-label label[required]:before{color:#ff3000} /*! * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -57,7 +57,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */@keyframes slashStar{0%{opacity:1}to{opacity:0}}.home-page .top-section{position:relative;height:100vh}.home-page .top-section .login-panel{position:absolute;right:40px;width:480px;height:540px;top:90px;border:0}.home-page .top-section .login-panel input,.home-page .top-section .login-panel input::-webkit-input-placeholder{font-size:16px}.home-page .top-section .login-panel .login-header{width:100%;line-height:45px;font-size:32px;margin-top:58px;text-align:center}.home-page .top-section .login-panel .internal-sys-tip{width:100%;line-height:25px;font-size:20px;margin-top:25px;text-align:center;font-weight:800;color:rgba(255,0,0,.8)}.home-page .top-section .login-panel .login-form{width:360px;margin:40px auto auto}.home-page .top-section .login-panel .login-form input{height:60px}.home-page .top-section .login-panel .login-form button{width:100%;height:60px;font-size:16px;background:#4190ff 100%;color:#fff;border:0}.home-page .top-section .animation{position:absolute;width:6px;height:6px;border-radius:50%;background-color:#1be1f6}.home-page .top-section .animation1{left:15%;top:70%;animation:slashStar 2s ease-in-out .3s infinite}.home-page .top-section .animation2{left:34%;top:35%;animation:slashStar 2s ease-in-out 1.2s infinite}.home-page .top-section .animation3{left:53%;top:20%;animation:slashStar 2s ease-in-out .5s infinite}.home-page .top-section .animation4{left:72%;top:64%;animation:slashStar 2s ease-in-out .8s infinite}.home-page .top-section .animation5{left:87%;top:30%;animation:slashStar 2s ease-in-out 1.5s infinite}.home-page .top-section .vertical-middle{position:absolute;left:0;top:50%;margin-top:-47px;transform:translateY(-50%)}.home-page .top-section .product-area{width:600px;margin-left:40px}.home-page .top-section .product-logo{display:block;width:257px;height:50px;margin:0}.home-page .top-section .product-desc{opacity:.8;font-family:Avenir-Medium;font-size:24px;color:#fff;max-width:780px;margin:12px auto 30px;text-align:left;line-height:30px}.next-table{border-top:1px solid #dcdee3;border-left:1px solid #dcdee3}.next-table th{background:#ebecf0;border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table-header-resizable .next-table-resize-handler:hover:after{background:#5584ff}.next-table td{border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table.zebra tr:nth-child(2n) td{background:#f7f8fa}.next-table.zebra .next-table-cell.hovered,.next-table.zebra .next-table-row.hovered td,.next-table.zebra .next-table-row.selected td{background:#f2f3f7}.next-table-empty{color:#a0a2ad}.next-table-expanded-row .next-table td,.next-table-expanded-row .next-table th{border-right:1px solid #dcdee3}.next-table-cell.hovered,.next-table-row.hovered,.next-table-row.selected{background:#f2f3f7}.next-table-tree-placeholder{visibility:hidden}.next-table-tree-placeholder .next-icon-remote,.next-table-tree-placeholder:before{width:12px;font-size:12px;line-height:inherit}.next-table-body,.next-table-header{font-size:12px}.next-table-column-resize-proxy{border-left:2px solid #5584ff}.next-table-body{font-size:12px}.next-table-fixed{border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table-fixed .next-table-header{background:#ebecf0}.next-table-group .next-table-body table,.next-table-group .next-table-header table{border-top:1px solid #dcdee3;border-left:1px solid #dcdee3}.next-table-group .next-table-group-footer td,.next-table-group .next-table-group-header td{background:#ebecf0}.next-table-filter .next-table-filter-active,.next-table-sort .current .next-icon{color:#5584ff} + */@keyframes slashStar{0%{opacity:1}to{opacity:0}}.home-page .top-section{position:relative;height:100vh}.home-page .top-section .login-panel{position:absolute;right:40px;width:480px;height:540px;top:90px;border:0}.home-page .top-section .login-panel input,.home-page .top-section .login-panel input::-webkit-input-placeholder{font-size:16px}.home-page .top-section .login-panel .login-header{width:100%;line-height:45px;font-size:32px;margin-top:58px;text-align:center}.home-page .top-section .login-panel .internal-sys-tip{width:100%;line-height:25px;font-size:20px;margin-top:25px;text-align:center;font-weight:800;color:rgba(255,0,0,.8)}.home-page .top-section .login-panel .login-form{width:360px;margin:40px auto auto}.home-page .top-section .login-panel .login-form input{height:60px}.home-page .top-section .login-panel .login-form button{width:100%;height:60px;font-size:16px;background:#4190ff 100%;color:#fff;border:0}.home-page .top-section .animation{position:absolute;width:6px;height:6px;border-radius:50%;background-color:#1be1f6}.home-page .top-section .animation1{left:15%;top:70%;animation:slashStar 2s ease-in-out .3s infinite}.home-page .top-section .animation2{left:34%;top:35%;animation:slashStar 2s ease-in-out 1.2s infinite}.home-page .top-section .animation3{left:53%;top:20%;animation:slashStar 2s ease-in-out .5s infinite}.home-page .top-section .animation4{left:72%;top:64%;animation:slashStar 2s ease-in-out .8s infinite}.home-page .top-section .animation5{left:87%;top:30%;animation:slashStar 2s ease-in-out 1.5s infinite}.home-page .top-section .vertical-middle{position:absolute;left:0;top:50%;margin-top:-47px;transform:translateY(-50%)}.home-page .top-section .product-area{width:600px;margin-left:40px}.home-page .top-section .product-logo{display:block;width:257px;height:50px;margin:0}.home-page .top-section .product-desc{opacity:.8;font-family:Avenir-Medium;font-size:24px;color:#fff;max-width:780px;margin:12px auto 30px;text-align:left;line-height:30px}.next-table{border-top:1px solid #dcdee3;border-left:1px solid #dcdee3}.next-table th{background:#ebecf0;border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table-header-resizable .next-table-resize-handler:hover:after{background:#5584ff}.next-table td{border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table.zebra tr:nth-child(2n) td{background:#f7f8fa}.next-table.zebra .next-table-cell.hovered,.next-table.zebra .next-table-row.hovered td,.next-table.zebra .next-table-row.selected td{background:#f2f3f7}.next-table-empty{color:#a0a2ad}.next-table-expanded-row .next-table td,.next-table-expanded-row .next-table th{border-right:1px solid #dcdee3}.next-table-cell.hovered,.next-table-row.hovered,.next-table-row.selected{background:#f2f3f7}.next-table-body,.next-table-header{font-size:12px}.next-table-column-resize-proxy{border-left:2px solid #5584ff}.next-table-body{font-size:12px}.next-table-fixed{border-right:1px solid #dcdee3;border-bottom:1px solid #dcdee3}.next-table-fixed .next-table-header{background:#ebecf0}.next-table-group .next-table-body table,.next-table-group .next-table-header table{border-top:1px solid #dcdee3;border-left:1px solid #dcdee3}.next-table-group .next-table-group-footer td,.next-table-group .next-table-group-header td{background:#ebecf0}.next-table-filter .next-table-filter-active,.next-table-sort .current .next-icon{color:#5584ff} /*! * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -132,7 +132,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */.next-balloon{font-size:12px}.next-balloon-title.next-balloon-closable .next-balloon-close{transform:translateY(18px)}.next-balloon-primary{border-color:#4494f9;background-color:#e3f2fd}.next-balloon-primary .next-balloon-close{transform:translateY(16px);font-size:12px}.next-balloon-primary .next-balloon-close .next-icon{width:12px;height:12px}.next-balloon-primary .next-balloon-close .next-icon:before{width:12px;height:12px;font-size:12px}.next-balloon-primary:after{border:1px solid #4494f9;background-color:#e3f2fd}.next-balloon-normal{border-color:#dcdee3;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-balloon-normal .next-balloon-close{transform:translateY(16px);font-size:12px}.next-balloon-normal .next-balloon-close .next-icon{width:12px;height:12px}.next-balloon-normal .next-balloon-close .next-icon:before{width:12px;height:12px;font-size:12px}.next-balloon-normal:after{border:1px solid #dcdee3}.next-balloon-tooltip{font-size:12px;color:#333}.next-balloon-tooltip,.next-balloon-tooltip .next-balloon-arrow .next-balloon-arrow-content{background-color:#f2f3f7;border:1px solid #dcdee3}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover{color:#5584ff}.next-tag-default.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-default.next-tag-level-primary,[disabled].next-tag-default.next-tag-level-primary{color:#ccc;border-color:#f7f8fa;background-color:#f7f8fa}.disabled.next-tag-default.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-closable.next-tag-level-primary,[disabled].next-tag-closable.next-tag-level-primary{color:#ccc;border-color:#f7f8fa;background-color:#f7f8fa}.disabled.next-tag-closable.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-checkable.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-checkable.next-tag-level-primary,[disabled].next-tag-checkable.next-tag-level-primary{color:#ccc;border-color:#f7f8fa;background-color:#f7f8fa}.disabled.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-checkable.next-tag-level-primary.checked{border-color:#5584ff;background-color:#5584ff}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover{border-color:#3e71f7;background-color:#3e71f7}.disabled.next-tag-checkable.next-tag-level-primary.checked,[disabled].next-tag-checkable.next-tag-level-primary.checked{color:#ccc;border-color:#f7f8fa;background-color:#f7f8fa}.disabled.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,[disabled].next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn{color:#fff}.next-tag-default.next-tag-level-normal{border-color:#c4c6cf}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#a0a2ad}.disabled.next-tag-default.next-tag-level-normal,[disabled].next-tag-default.next-tag-level-normal{color:#ccc;border-color:#e6e7eb;background-color:#f7f8fa}.disabled.next-tag-default.next-tag-level-normal>.next-tag-close-btn,[disabled].next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-normal{border-color:#c4c6cf}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#a0a2ad}.disabled.next-tag-closable.next-tag-level-normal,[disabled].next-tag-closable.next-tag-level-normal{color:#ccc;border-color:#e6e7eb;background-color:transparent}.disabled.next-tag-closable.next-tag-level-normal>.next-tag-close-btn,[disabled].next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-checkable.next-tag-level-normal.checked{color:#5584ff;border-color:#5584ff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover{color:#3e71f7;border-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked{color:#5584ff;border-color:#5584ff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover{color:#3e71f7;border-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#5584ff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before{background-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#e6e7eb}.next-tag-checkable.next-tag-level-secondary.checked:disabled:after,[disabled].next-tag-checkable.next-tag-level-secondary.checked:after{color:#fff}.next-tag-checkable.next-tag-level-normal,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#c4c6cf}.disabled.next-tag-checkable.next-tag-level-normal,[disabled].next-tag-checkable.next-tag-level-normal{color:#ccc;border-color:#e6e7eb;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-normal.checked:before{background-color:#5584ff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before{background-color:#3e71f7}.next-tag-checkable.next-tag-level-normal.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-normal.checked:before{background-color:#e6e7eb}.next-tag-checkable.next-tag-level-normal.checked:disabled:after,[disabled].next-tag-checkable.next-tag-level-normal.checked:after{color:#fff}.next-tag-closable.next-tag-level-normal:before{background-color:#c4c6cf}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before{background-color:#a0a2ad}.next-tag-closable.next-tag-level-normal:disabled:before,[disabled].next-tag-closable.next-tag-level-normal:before{background-color:#e6e7eb}.next-tag-closable.next-tag-level-normal:disabled:after,[disabled].next-tag-closable.next-tag-level-normal:after{color:#fff}.next-tag-large.next-tag-closable>.next-tag-body{max-width:calc(100% - 44px)}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before{width:12px;font-size:12px}.next-tag-medium{height:28px;line-height:26px}.next-tag-medium.next-tag-closable>.next-tag-body{max-width:calc(100% - 32px)}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small{height:20px;line-height:18px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-checkable.next-tag-level-secondary.disabled,.next-tag-checkable.next-tag-level-secondary[disabled]{border-color:#e6e7eb;background-color:#f7f8fa}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#f7f8fa 10px)}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:18px;padding-top:2px;padding-bottom:2px}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:20px!important}.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-input-inner,.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-input-inner,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-select-tag-compact{line-height:18px}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:26px;padding-top:3px;padding-bottom:3px}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:28px!important}.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-input-inner,.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-input-inner,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-select-tag-compact{line-height:26px}.next-select-menu-wrapper{border:1px solid #dcdee3}.next-select-all{border-bottom:1px solid #dcdee3}.next-select-all:hover{color:#3e71f7}.next-select-all .next-menu-icon-selected.next-icon{color:#5584ff}.next-select-highlight{color:#5584ff;font-size:12px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:20px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:28px}@media screen and (-webkit-min-device-pixel-ratio:0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#f7f8fa 10px)}} + */.next-balloon{font-size:12px}.next-balloon-title.next-balloon-closable .next-balloon-close{transform:translateY(18px)}.next-balloon-primary{border-color:#4494f9;background-color:#e3f2fd}.next-balloon-primary .next-balloon-close{transform:translateY(16px);font-size:12px}.next-balloon-primary .next-balloon-close .next-icon{width:12px;height:12px}.next-balloon-primary .next-balloon-close .next-icon:before{width:12px;height:12px;font-size:12px}.next-balloon-primary:after{border:1px solid #4494f9;background-color:#e3f2fd}.next-balloon-normal{border-color:#dcdee3;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.next-balloon-normal .next-balloon-close{transform:translateY(16px);font-size:12px}.next-balloon-normal .next-balloon-close .next-icon{width:12px;height:12px}.next-balloon-normal .next-balloon-close .next-icon:before{width:12px;height:12px;font-size:12px}.next-balloon-normal:after{border:1px solid #dcdee3}.next-balloon-tooltip{font-size:12px;color:#333}.next-balloon-tooltip,.next-balloon-tooltip .next-balloon-arrow .next-balloon-arrow-content{background-color:#f2f3f7;border:1px solid #dcdee3}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover{color:#5584ff}.next-tag-default.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-default.next-tag-level-primary,[disabled].next-tag-default.next-tag-level-primary{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-closable.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-closable.next-tag-level-primary,[disabled].next-tag-closable.next-tag-level-primary{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-primary{border-color:#ebecf0;background-color:#ebecf0}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover{border-color:#e2e4e8;background-color:#e2e4e8}.disabled.next-tag-checkable.next-tag-level-primary,[disabled].next-tag-checkable.next-tag-level-primary{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-primary.checked{border-color:#5584ff;background-color:#5584ff}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover{border-color:#3e71f7;background-color:#3e71f7}.disabled.next-tag-checkable.next-tag-level-primary.checked,[disabled].next-tag-checkable.next-tag-level-primary.checked{border-color:#f7f8fa;background-color:#f7f8fa}.next-tag-default.next-tag-level-normal{border-color:#c4c6cf}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#a0a2ad}.disabled.next-tag-default.next-tag-level-normal,[disabled].next-tag-default.next-tag-level-normal{border-color:#e6e7eb;background-color:#f7f8fa}.next-tag-closable.next-tag-level-normal{border-color:#c4c6cf}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#a0a2ad}.disabled.next-tag-closable.next-tag-level-normal,[disabled].next-tag-closable.next-tag-level-normal{border-color:#e6e7eb}.next-tag-checkable.next-tag-level-normal.checked{color:#5584ff;border-color:#5584ff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover{color:#3e71f7;border-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked{color:#5584ff;border-color:#5584ff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover{color:#3e71f7;border-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#5584ff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before{background-color:#3e71f7}.next-tag-checkable.next-tag-level-secondary.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#e6e7eb}.next-tag-checkable.next-tag-level-normal,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover{border-color:#c4c6cf}.disabled.next-tag-checkable.next-tag-level-normal,[disabled].next-tag-checkable.next-tag-level-normal{border-color:#e6e7eb;background-color:#f7f8fa}.next-tag-checkable.next-tag-level-normal.checked:before{background-color:#5584ff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before{background-color:#3e71f7}.next-tag-checkable.next-tag-level-normal.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-normal.checked:before{background-color:#e6e7eb}.next-tag-closable.next-tag-level-normal:before{background-color:#c4c6cf}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before{background-color:#a0a2ad}.next-tag-closable.next-tag-level-normal:disabled:before,[disabled].next-tag-closable.next-tag-level-normal:before{background-color:#e6e7eb}.next-tag-large.next-tag-closable>.next-tag-body{max-width:calc(100% - 44px)}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before{width:12px;font-size:12px}.next-tag-medium{height:28px;line-height:26px}.next-tag-medium.next-tag-closable>.next-tag-body{max-width:calc(100% - 32px)}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small{height:20px;line-height:18px}.next-tag-checkable.next-tag-level-secondary.disabled,.next-tag-checkable.next-tag-level-secondary[disabled]{border-color:#e6e7eb;background-color:#f7f8fa}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#f7f8fa 10px)}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:18px;padding-top:2px;padding-bottom:2px}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:20px!important}.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-input-inner,.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-input-inner,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-select-tag-compact{line-height:18px}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:26px;padding-top:3px;padding-bottom:3px}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:28px!important}.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-input-inner,.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-input-inner,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-select-tag-compact{line-height:26px}.next-select-menu-wrapper{border:1px solid #dcdee3}.next-select-all{border-bottom:1px solid #dcdee3}.next-select-all:hover{color:#3e71f7}.next-select-all .next-menu-icon-selected.next-icon{color:#5584ff}.next-select-highlight{color:#5584ff;font-size:12px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:20px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:28px}@media screen and (-webkit-min-device-pixel-ratio:0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#f7f8fa 10px)}} /*! * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -177,7 +177,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */.next-tabs-tab.active .next-tabs-tab-close{color:#5584ff}.next-tabs-btn-down.disabled,.next-tabs-btn-next.disabled,.next-tabs-btn-prev.disabled,.next-tabs-tab.disabled .next-tabs-tab-close{color:#dcdee3}.next-tabs.next-medium .next-tabs-tab-inner{font-size:12px;padding:12px 16px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:16px;font-size:16px}}.next-tabs-pure>.next-tabs-bar{border-bottom:1px solid #dcdee3}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active{color:#5584ff}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.disabled{color:#dcdee3}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:before{border-bottom:2px solid #5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab{background-color:#f2f3f7}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab:hover{background-color:#ebecf0}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active{color:#5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled{background:#f7f8fa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active .next-tabs-tab-close{color:#5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled .next-tabs-tab-close{color:#dcdee3}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #dcdee3 #fff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:before{border-top:2px solid #5584ff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar:before{border-bottom:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active{border-color:#fff #dcdee3 #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:before{border-bottom:2px solid #5584ff}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-content{border-bottom:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #fff #dcdee3 #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:before{border-left:2px solid #5584ff}.next-tabs-wrapped.next-tabs-left>.next-tabs-content{border-left:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #dcdee3 #dcdee3 #fff}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:before{border-right:2px solid #5584ff}.next-tabs-wrapped.next-tabs-right>.next-tabs-content{border-right:1px solid #dcdee3}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #c4c6cf;background-color:#f2f3f7}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-right:1px solid #c4c6cf}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-right:1px solid;border-color:#5584ff}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{border-color:#e6e7eb}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:hover{border-right:1px solid;border-color:#c4c6cf;background-color:#ebecf0}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{background-color:#5584ff}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{background:#f7f8fa}.next-tabs-text>.next-tabs-bar .next-tabs-tab.active{color:#5584ff}.next-tabs-text>.next-tabs-bar .next-tabs-tab:not(:last-child):after{background-color:#dcdee3}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #c4c6cf}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-left:1px solid #c4c6cf}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-left:1px solid;border-color:#5584ff} + */.next-tabs-tab.active .next-tabs-tab-close{color:#5584ff}.next-tabs-btn-down.disabled,.next-tabs-btn-next.disabled,.next-tabs-btn-prev.disabled,.next-tabs-tab.disabled .next-tabs-tab-close{color:#dcdee3}.next-tabs.next-medium .next-tabs-tab-inner{font-size:12px;padding:12px 16px}.next-tabs-pure>.next-tabs-bar{border-bottom:1px solid #dcdee3}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active{color:#5584ff}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.disabled{color:#dcdee3}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:before{border-bottom:2px solid #5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab{background-color:#f2f3f7}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab:hover{background-color:#ebecf0}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active{color:#5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled{background:#f7f8fa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active .next-tabs-tab-close{color:#5584ff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled .next-tabs-tab-close{color:#dcdee3}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #dcdee3 #fff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:before{border-top:2px solid #5584ff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar:before{border-bottom:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active{border-color:#fff #dcdee3 #dcdee3}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:before{border-bottom:2px solid #5584ff}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-content{border-bottom:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #fff #dcdee3 #dcdee3}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:before{border-left:2px solid #5584ff}.next-tabs-wrapped.next-tabs-left>.next-tabs-content{border-left:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab{border:1px solid #dcdee3}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-color:#dcdee3 #dcdee3 #dcdee3 #fff}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:before{border-right:2px solid #5584ff}.next-tabs-wrapped.next-tabs-right>.next-tabs-content{border-right:1px solid #dcdee3}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #c4c6cf;background-color:#f2f3f7}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-right:1px solid #c4c6cf}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-color:#5584ff}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{border-color:#e6e7eb}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:hover{border-color:#c4c6cf;background-color:#ebecf0}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{background-color:#5584ff}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{background:#f7f8fa}.next-tabs-text>.next-tabs-bar .next-tabs-tab.active{color:#5584ff}.next-tabs-text>.next-tabs-bar .next-tabs-tab:not(:last-child):after{background-color:#dcdee3}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #c4c6cf}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-left:1px solid #c4c6cf}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-color:#5584ff} /*! * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -297,7 +297,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */.next-switch-loading .next-icon-loading{color:#5584ff}.next-switch-medium{width:56px;border-radius:20px}.next-switch-medium.next-switch-auto-width{min-width:56px}.next-switch-medium>.next-switch-btn{border-radius:20px}.next-switch-medium>.next-switch-children{font-size:12px}.next-switch-small,.next-switch-small>.next-switch-btn{border-radius:20px}.next-switch-on{background-color:#5584ff}.next-switch-on.hover,.next-switch-on:focus,.next-switch-on:hover{background-color:#3e71f7}.next-switch-on[disabled]{background-color:#ebecf0}.next-switch-on[disabled] .next-switch-btn{background-color:#f7f8fa}.next-switch-off,.next-switch-off.hover,.next-switch-off:focus,.next-switch-off:hover{background-color:#ebecf0;border-color:#ebecf0}.next-switch-off[disabled]{background-color:#ebecf0}.next-switch-off[disabled] .next-switch-btn{background-color:#f7f8fa}.next-switch-off[disabled]>.next-switch-children{color:#c4c6cf}.next-progress-line-underlay{background:#ebecf0}.next-progress-line-overlay-normal{background:#5584ff}.next-progress-line-overlay-success{background:#46bc15}.next-progress-line-overlay-error,.next-progress-line-overlay-started{background:#ff3000}.next-progress-line-overlay-middle{background:#ff9300}.next-progress-line-overlay-finishing{background:#46bc15}.next-progress-line.next-large .next-progress-line-overlay,.next-progress-line.next-large .next-progress-line-underlay,.next-progress-line.next-medium .next-progress-line-overlay,.next-progress-line.next-medium .next-progress-line-underlay,.next-progress-line.next-small .next-progress-line-overlay,.next-progress-line.next-small .next-progress-line-underlay{border-radius:20px}.next-progress-line.next-large .next-progress-line-text{font-size:12px}.next-progress-line-show-border .next-progress-line-underlay{border:1px solid #dcdee3}.next-progress-line-show-border.next-large .next-progress-line-overlay,.next-progress-line-show-border.next-large .next-progress-line-underlay,.next-progress-line-show-border.next-medium .next-progress-line-overlay,.next-progress-line-show-border.next-medium .next-progress-line-underlay,.next-progress-line-show-border.next-small .next-progress-line-overlay,.next-progress-line-show-border.next-small .next-progress-line-underlay{border-radius:20px}.next-progress-line-show-border.next-large .next-progress-line-text{font-size:12px}.next-progress-circle-underlay{stroke:#ebecf0}.next-progress-circle-overlay-normal{stroke:#5584ff}.next-progress-circle-overlay-success{stroke:#46bc15}.next-progress-circle-overlay-error,.next-progress-circle-overlay-started{stroke:#ff3000}.next-progress-circle-overlay-middle{stroke:#ff9300}.next-progress-circle-overlay-finishing{stroke:#46bc15}.next-upload-list[dir=rtl].next-upload-list-text .next-upload-list-item{padding:4px 8px 4px 36px}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-progress{margin-left:20px}.next-upload.next-disabled,.next-upload.next-disabled .next-upload-inner *{border-color:#e6e7eb!important}.next-upload-list-text .next-upload-list-item{background-color:#f2f3f7;padding:4px 36px 4px 8px;font-size:12px}.next-upload-list-text .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-text .next-upload-list-item .next-icon-close:before{width:12px;font-size:12px}.next-upload-list-text .next-upload-list-item:hover{background-color:#f2f3f7}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-size{color:#5584ff}.next-upload-list-text .next-upload-list-item-error-msg{color:#ff3000}.next-upload-list-image .next-upload-list-item{border:1px solid #dcdee3;font-size:12px}.next-upload-list-image .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-image .next-upload-list-item .next-icon-close:before{width:12px;font-size:12px}.next-upload-list-image .next-upload-list-item:hover{border-color:#5584ff}.next-upload-list-image .next-upload-list-item-name{margin-right:20px}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-size{color:#5584ff}.next-upload-list-image .next-upload-list-item-thumbnail{border:1px solid #dcdee3;background-color:#f2f3f7}.next-upload-list-image .next-upload-list-item-error{border-color:#ff3000!important}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress{margin-right:20px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg{margin-right:20px;color:#ff3000}.next-upload-list-card .next-upload-list-item-wrapper{border:1px solid #c4c6cf;border-radius:0;overflow:hidden}.next-upload-list-card .next-upload-list-item-uploading .next-upload-list-item-wrapper{background-color:#f7f8fa}.next-upload-list-card .next-upload-list-item .next-upload-card{display:flex;flex-direction:column;justify-content:center}.next-upload-list-card .next-upload-list-item-error .next-upload-list-item-wrapper{border-color:#ff3000}.next-upload-list-card.next-upload-ie9 .next-upload-card{display:table-cell}.next-upload-card{border:1px dashed #c4c6cf;border-radius:0}.next-upload-card .next-icon{color:#c4c6cf}.next-upload-card .next-upload-text{font-size:12px}.next-upload-card:hover{border-color:#5584ff}.next-upload-card:hover .next-icon,.next-upload-card:hover .next-upload-text{color:#5584ff}.next-upload-dragable .next-upload-drag{border:1px dashed #c4c6cf}.next-upload-dragable .next-upload-drag-over{border-color:#5584ff}.next-collapse[dir=rtl] .next-collapse-panel-title{padding:8px 28px 8px 0}.next-collapse[dir=rtl] .next-collapse-panel-icon .next-icon-remote,.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse[dir=rtl] .next-collapse-panel-icon{transform:scale(.5) rotate(180deg);margin-left:-4px;margin-right:-4px}.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:16px;font-size:16px}}.next-collapse{border:1px solid #dcdee3}.next-collapse-panel:not(:first-child){border-top:1px solid #dcdee3}.next-collapse .next-collapse-panel-icon .next-icon-remote,.next-collapse .next-collapse-panel-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse .next-collapse-panel-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-collapse .next-collapse-panel-icon:before{width:16px;font-size:16px}}.next-collapse-panel-title{background:#f2f3f7;padding:8px 0 8px 28px}.next-collapse-panel-title:hover{background:#ebecf0}.next-collapse-panel-content{font-size:12px}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded .next-icon-remote,.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded{transform:scale(.5) rotate(90deg);margin-left:-4px;margin-right:-4px}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:16px;font-size:16px}}.next-collapse-disabled,.next-collapse-panel-disabled:not(:first-child){border-color:#e6e7eb}.next-collapse-panel-disabled:hover,.next-collapse-panel-disabled>.next-collapse-panel-title{background:#f2f3f7}.next-menu-btn.next-btn-secondary.next-btn-text:hover .next-menu-btn-arrow,.next-menu-btn.next-btn-secondary .next-menu-btn-arrow,.next-menu-btn.next-btn-text.next-btn-normal:hover .next-menu-btn-arrow,.next-menu-btn.next-btn-text.next-btn-primary .next-menu-btn-arrow{color:#5584ff}.next-menu-btn.next-btn-text.next-btn-primary:hover .next-menu-btn-arrow{color:#3e71f7}.next-search-simple[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-left{border-color:#c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple[dir=rtl].next-dark:hover .next-search-left{border-color:#c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-icon{color:#999}.next-search-simple[dir=rtl].next-dark .next-search-icon:hover{color:#666}.next-search-normal[dir=rtl].next-primary .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-primary .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-secondary .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-secondary .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-normal .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-left:1px solid #5584ff}.next-search-normal.next-primary .next-search-left{border-color:#5584ff}.next-search-normal.next-primary .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-primary:hover .next-btn,.next-search-normal.next-primary:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-primary .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-primary .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-primary.next-large .next-search-btn,.next-search-normal.next-primary.next-large .next-search-left{border-width:2px;height:60px}.next-search-normal.next-primary.next-large .next-search-input{height:56px}.next-search-normal.next-primary.next-large .next-search-input input{height:56px;line-height:56px \0 }.next-search-normal.next-primary.next-large .next-select{height:56px}.next-search-normal.next-primary.next-medium .next-search-btn,.next-search-normal.next-primary.next-medium .next-search-left{border-width:2px;height:40px}.next-search-normal.next-primary.next-medium .next-search-input{height:36px}.next-search-normal.next-primary.next-medium .next-search-input input{height:36px;line-height:36px \0 }.next-search-normal.next-primary.next-medium .next-select{height:36px}.next-search-normal.next-primary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-primary .next-input{border-top-left-radius:1px;border-bottom-left-radius:1px}.next-search-normal.next-secondary .next-search-left{border-color:#c4c6cf}.next-search-normal.next-secondary .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-secondary:hover .next-btn,.next-search-normal.next-secondary:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-secondary .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-secondary .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-secondary.next-large .next-search-btn,.next-search-normal.next-secondary.next-large .next-search-left{height:60px}.next-search-normal.next-secondary.next-large .next-search-input{height:58px}.next-search-normal.next-secondary.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-secondary.next-large .next-select{height:58px}.next-search-normal.next-secondary.next-medium .next-search-btn,.next-search-normal.next-secondary.next-medium .next-search-left{height:40px}.next-search-normal.next-secondary.next-medium .next-search-input{height:38px}.next-search-normal.next-secondary.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-secondary.next-medium .next-select{height:38px}.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-normal .next-search-left{border-color:#c4c6cf}.next-search-normal.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-normal:hover .next-btn,.next-search-normal.next-normal:hover .next-search-left{border-color:#a0a2ad}.next-search-normal.next-normal .next-search-btn{background:#f7f8fa;border-color:#c4c6cf}.next-search-normal.next-normal .next-search-btn:hover{background:#ebecf0;border-color:#a0a2ad}.next-search-normal.next-normal.next-large .next-search-btn,.next-search-normal.next-normal.next-large .next-search-left{height:60px}.next-search-normal.next-normal.next-large .next-search-input{height:58px}.next-search-normal.next-normal.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-normal.next-large .next-select{height:58px}.next-search-normal.next-normal.next-medium .next-search-btn,.next-search-normal.next-normal.next-medium .next-search-left{height:40px}.next-search-normal.next-normal.next-medium .next-search-input{height:38px}.next-search-normal.next-normal.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-normal.next-medium .next-select{height:38px}.next-search-normal.next-normal.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-dark .next-search-left{border-color:#5584ff}.next-search-normal.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #5584ff}.next-search-normal.next-dark:hover .next-btn,.next-search-normal.next-dark:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-dark .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-dark .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-dark.next-large .next-search-btn,.next-search-normal.next-dark.next-large .next-search-left{height:60px}.next-search-normal.next-dark.next-large .next-search-input{height:58px}.next-search-normal.next-dark.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-dark.next-large .next-select{height:58px}.next-search-normal.next-dark.next-medium .next-search-btn,.next-search-normal.next-dark.next-medium .next-search-left{height:40px}.next-search-normal.next-dark.next-medium .next-search-input{height:38px}.next-search-normal.next-dark.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-dark.next-medium .next-select{height:38px}.next-search-normal.next-dark.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-simple.next-normal .next-search-left{border-color:#c4c6cf}.next-search-simple.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple.next-normal:hover .next-search-left{border-color:#a0a2ad}.next-search-simple.next-dark .next-search-left{border-color:#c4c6cf}.next-search-simple.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple.next-dark:hover .next-search-left{border-color:#c4c6cf}.next-search-simple.next-dark .next-search-icon{color:#999}.next-search-simple.next-dark .next-search-icon:hover{color:#666}.next-search-simple.next-dark.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-medium .next-search-icon:before{width:12px;font-size:12px}.next-search-simple .next-select.next-medium{height:26px}.next-transfer-panel{border:1px solid #dcdee3}.next-transfer-panel-header{border-bottom:1px solid #dcdee3;background-color:#f7f8fa;font-size:12px}.next-transfer-panel-item:not(.next-disabled).next-simple:hover{color:#5584ff}.next-transfer-panel-item.next-insert-before:before{border-top:1px solid #5584ff}.next-transfer-panel-item.next-insert-after:after{border-bottom:1px solid #5584ff}.next-transfer-panel-footer{border-top:1px solid #dcdee3}.next-transfer-panel-count{font-size:12px}.next-transfer-panel-move-all{font-size:12px;color:#5584ff}.next-transfer-move.next-icon{color:#c4c6cf} + */.next-switch-loading .next-icon-loading{color:#5584ff}.next-switch-medium{width:56px;border-radius:20px}.next-switch-medium.next-switch-auto-width{min-width:56px}.next-switch-medium>.next-switch-btn{border-radius:20px}.next-switch-medium>.next-switch-children{font-size:12px}.next-switch-small,.next-switch-small>.next-switch-btn{border-radius:20px}.next-switch-on{background-color:#5584ff}.next-switch-on.hover,.next-switch-on:focus,.next-switch-on:hover{background-color:#3e71f7}.next-switch-on[disabled]{background-color:#ebecf0}.next-switch-on[disabled] .next-switch-btn{background-color:#f7f8fa}.next-switch-off,.next-switch-off.hover,.next-switch-off:focus,.next-switch-off:hover{background-color:#ebecf0;border-color:#ebecf0}.next-switch-off[disabled]{background-color:#ebecf0}.next-switch-off[disabled] .next-switch-btn{background-color:#f7f8fa}.next-switch-off[disabled]>.next-switch-children{color:#c4c6cf}.next-progress-line-underlay{background:#ebecf0}.next-progress-line-overlay-normal{background:#5584ff}.next-progress-line-overlay-success{background:#46bc15}.next-progress-line-overlay-error,.next-progress-line-overlay-started{background:#ff3000}.next-progress-line-overlay-middle{background:#ff9300}.next-progress-line-overlay-finishing{background:#46bc15}.next-progress-line.next-large .next-progress-line-overlay,.next-progress-line.next-large .next-progress-line-underlay,.next-progress-line.next-medium .next-progress-line-overlay,.next-progress-line.next-medium .next-progress-line-underlay,.next-progress-line.next-small .next-progress-line-overlay,.next-progress-line.next-small .next-progress-line-underlay{border-radius:20px}.next-progress-line.next-large .next-progress-line-text{font-size:12px}.next-progress-line-show-border .next-progress-line-underlay{border:1px solid #dcdee3}.next-progress-line-show-border.next-large .next-progress-line-overlay,.next-progress-line-show-border.next-large .next-progress-line-underlay,.next-progress-line-show-border.next-medium .next-progress-line-overlay,.next-progress-line-show-border.next-medium .next-progress-line-underlay,.next-progress-line-show-border.next-small .next-progress-line-overlay,.next-progress-line-show-border.next-small .next-progress-line-underlay{border-radius:20px}.next-progress-line-show-border.next-large .next-progress-line-text{font-size:12px}.next-progress-circle-underlay{stroke:#ebecf0}.next-progress-circle-overlay-normal{stroke:#5584ff}.next-progress-circle-overlay-success{stroke:#46bc15}.next-progress-circle-overlay-error,.next-progress-circle-overlay-started{stroke:#ff3000}.next-progress-circle-overlay-middle{stroke:#ff9300}.next-progress-circle-overlay-finishing{stroke:#46bc15}.next-upload-list[dir=rtl].next-upload-list-text .next-upload-list-item{padding:4px 8px 4px 36px}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-progress{margin-left:20px}.next-upload.next-disabled,.next-upload.next-disabled .next-upload-inner *{border-color:#e6e7eb!important}.next-upload-list-text .next-upload-list-item{background-color:#f2f3f7;padding:4px 36px 4px 8px;font-size:12px}.next-upload-list-text .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-text .next-upload-list-item .next-icon-close:before{width:12px;font-size:12px}.next-upload-list-text .next-upload-list-item:hover{background-color:#f2f3f7}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-size{color:#5584ff}.next-upload-list-text .next-upload-list-item-error-msg{color:#ff3000}.next-upload-list-image .next-upload-list-item{border:1px solid #dcdee3;font-size:12px}.next-upload-list-image .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-image .next-upload-list-item .next-icon-close:before{width:12px;font-size:12px}.next-upload-list-image .next-upload-list-item:hover{border-color:#5584ff}.next-upload-list-image .next-upload-list-item-name{margin-right:20px}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-size{color:#5584ff}.next-upload-list-image .next-upload-list-item-thumbnail{border:1px solid #dcdee3;background-color:#f2f3f7}.next-upload-list-image .next-upload-list-item-error{border-color:#ff3000!important}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress{margin-right:20px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg{margin-right:20px;color:#ff3000}.next-upload-list-card .next-upload-list-item-wrapper{border:1px solid #c4c6cf}.next-upload-list-card .next-upload-list-item-uploading .next-upload-list-item-wrapper{background-color:#f7f8fa}.next-upload-list-card .next-upload-list-item-error .next-upload-list-item-wrapper{border-color:#ff3000}.next-upload-card{border:1px dashed #c4c6cf}.next-upload-card .next-icon{color:#c4c6cf}.next-upload-card .next-upload-text{font-size:12px}.next-upload-card:hover{border-color:#5584ff}.next-upload-card:hover .next-icon,.next-upload-card:hover .next-upload-text{color:#5584ff}.next-upload-dragable .next-upload-drag{border:1px dashed #c4c6cf}.next-upload-dragable .next-upload-drag-over{border-color:#5584ff}.next-collapse[dir=rtl] .next-collapse-panel-title{padding:8px 28px 8px 0}.next-collapse[dir=rtl] .next-collapse-panel-icon .next-icon-remote,.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse[dir=rtl] .next-collapse-panel-icon{transform:scale(.5) rotate(180deg);margin-left:-4px;margin-right:-4px}.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:16px;font-size:16px}}.next-collapse{border:1px solid #dcdee3}.next-collapse-panel:not(:first-child){border-top:1px solid #dcdee3}.next-collapse .next-collapse-panel-icon .next-icon-remote,.next-collapse .next-collapse-panel-icon:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse .next-collapse-panel-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-collapse .next-collapse-panel-icon:before{width:16px;font-size:16px}}.next-collapse-panel-title{background:#f2f3f7;padding:8px 0 8px 28px}.next-collapse-panel-title:hover{background:#ebecf0}.next-collapse-panel-content{font-size:12px}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded .next-icon-remote,.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:8px;font-size:8px}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded{transform:scale(.5) rotate(90deg);margin-left:-4px;margin-right:-4px}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:16px;font-size:16px}}.next-collapse-disabled,.next-collapse-panel-disabled:not(:first-child){border-color:#e6e7eb}.next-collapse-panel-disabled:hover,.next-collapse-panel-disabled>.next-collapse-panel-title{background:#f2f3f7}.next-menu-btn.next-btn-secondary.next-btn-text:hover .next-menu-btn-arrow,.next-menu-btn.next-btn-secondary .next-menu-btn-arrow,.next-menu-btn.next-btn-text.next-btn-normal:hover .next-menu-btn-arrow,.next-menu-btn.next-btn-text.next-btn-primary .next-menu-btn-arrow{color:#5584ff}.next-menu-btn.next-btn-text.next-btn-primary:hover .next-menu-btn-arrow{color:#3e71f7}.next-search-simple[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-left{border-color:#c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple[dir=rtl].next-dark:hover .next-search-left{border-color:#c4c6cf}.next-search-simple[dir=rtl].next-dark .next-search-icon{color:#999}.next-search-simple[dir=rtl].next-dark .next-search-icon:hover{color:#666}.next-search-normal[dir=rtl].next-primary .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-primary .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-secondary .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-secondary .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-normal .next-input{border-top-right-radius:1px;border-bottom-right-radius:1px}.next-search-normal[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #e6e7eb}.next-search-normal[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-left:1px solid #5584ff}.next-search-normal.next-primary .next-search-left{border-color:#5584ff}.next-search-normal.next-primary .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-primary:hover .next-btn,.next-search-normal.next-primary:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-primary .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-primary .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-primary.next-large .next-search-btn,.next-search-normal.next-primary.next-large .next-search-left{border-width:2px;height:60px}.next-search-normal.next-primary.next-large .next-search-input{height:56px}.next-search-normal.next-primary.next-large .next-search-input input{height:56px;line-height:56px \0 }.next-search-normal.next-primary.next-large .next-select{height:56px}.next-search-normal.next-primary.next-medium .next-search-btn,.next-search-normal.next-primary.next-medium .next-search-left{border-width:2px;height:40px}.next-search-normal.next-primary.next-medium .next-search-input{height:36px}.next-search-normal.next-primary.next-medium .next-search-input input{height:36px;line-height:36px \0 }.next-search-normal.next-primary.next-medium .next-select{height:36px}.next-search-normal.next-primary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-primary .next-input{border-top-left-radius:1px;border-bottom-left-radius:1px}.next-search-normal.next-secondary .next-search-left{border-color:#c4c6cf}.next-search-normal.next-secondary .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-secondary:hover .next-btn,.next-search-normal.next-secondary:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-secondary .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-secondary .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-secondary.next-large .next-search-btn,.next-search-normal.next-secondary.next-large .next-search-left{height:60px}.next-search-normal.next-secondary.next-large .next-search-input{height:58px}.next-search-normal.next-secondary.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-secondary.next-large .next-select{height:58px}.next-search-normal.next-secondary.next-medium .next-search-btn,.next-search-normal.next-secondary.next-medium .next-search-left{height:40px}.next-search-normal.next-secondary.next-medium .next-search-input{height:38px}.next-search-normal.next-secondary.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-secondary.next-medium .next-select{height:38px}.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-normal .next-search-left{border-color:#c4c6cf}.next-search-normal.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #e6e7eb}.next-search-normal.next-normal:hover .next-btn,.next-search-normal.next-normal:hover .next-search-left{border-color:#a0a2ad}.next-search-normal.next-normal .next-search-btn{background:#f7f8fa;border-color:#c4c6cf}.next-search-normal.next-normal .next-search-btn:hover{background:#ebecf0;border-color:#a0a2ad}.next-search-normal.next-normal.next-large .next-search-btn,.next-search-normal.next-normal.next-large .next-search-left{height:60px}.next-search-normal.next-normal.next-large .next-search-input{height:58px}.next-search-normal.next-normal.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-normal.next-large .next-select{height:58px}.next-search-normal.next-normal.next-medium .next-search-btn,.next-search-normal.next-normal.next-medium .next-search-left{height:40px}.next-search-normal.next-normal.next-medium .next-search-input{height:38px}.next-search-normal.next-normal.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-normal.next-medium .next-select{height:38px}.next-search-normal.next-normal.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-normal.next-dark .next-search-left{border-color:#5584ff}.next-search-normal.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #5584ff}.next-search-normal.next-dark:hover .next-btn,.next-search-normal.next-dark:hover .next-search-left{border-color:#5584ff}.next-search-normal.next-dark .next-search-btn{background:#5584ff;border-color:#5584ff}.next-search-normal.next-dark .next-search-btn:hover{background:#3e71f7;border-color:#5584ff}.next-search-normal.next-dark.next-large .next-search-btn,.next-search-normal.next-dark.next-large .next-search-left{height:60px}.next-search-normal.next-dark.next-large .next-search-input{height:58px}.next-search-normal.next-dark.next-large .next-search-input input{height:58px;line-height:58px \0 }.next-search-normal.next-dark.next-large .next-select{height:58px}.next-search-normal.next-dark.next-medium .next-search-btn,.next-search-normal.next-dark.next-medium .next-search-left{height:40px}.next-search-normal.next-dark.next-medium .next-search-input{height:38px}.next-search-normal.next-dark.next-medium .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-dark.next-medium .next-select{height:38px}.next-search-normal.next-dark.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-medium .next-search-btn .next-icon:before{width:16px;font-size:16px}.next-search-simple.next-normal .next-search-left{border-color:#c4c6cf}.next-search-simple.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple.next-normal:hover .next-search-left{border-color:#a0a2ad}.next-search-simple.next-dark .next-search-left{border-color:#c4c6cf}.next-search-simple.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #c4c6cf}.next-search-simple.next-dark:hover .next-search-left{border-color:#c4c6cf}.next-search-simple.next-dark .next-search-icon{color:#999}.next-search-simple.next-dark .next-search-icon:hover{color:#666}.next-search-simple.next-dark.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-medium .next-search-icon:before{width:12px;font-size:12px}.next-search-simple .next-select.next-medium{height:26px}.next-transfer-panel{border:1px solid #dcdee3}.next-transfer-panel-header{border-bottom:1px solid #dcdee3;background-color:#f7f8fa;font-size:12px}.next-transfer-panel-item:not(.next-disabled).next-simple:hover{color:#5584ff}.next-transfer-panel-item.next-insert-before:before{border-top:1px solid #5584ff}.next-transfer-panel-item.next-insert-after:after{border-bottom:1px solid #5584ff}.next-transfer-panel-footer{border-top:1px solid #dcdee3}.next-transfer-panel-count{font-size:12px}.next-transfer-panel-move-all{font-size:12px;color:#5584ff}.next-transfer-move.next-icon{color:#c4c6cf} /*! * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -342,7 +342,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */.next-slick-arrow.inner.disabled{background:#f7f8fa}.next-slick-dots-item button:focus,.next-slick-dots-item button:hover{background-color:hsla(0,0%,100%,.5);border-color:#fff}.next-slick-dots-item.active button{background:#5584ff} + */.next-slick-arrow.inner.disabled{background:#f7f8fa}.next-slick-dots-item button:focus,.next-slick-dots-item button:hover{background-color:hsla(0,0%,100%,.5)}.next-slick-dots-item.active button{background:#5584ff} /*! * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -477,10 +477,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */:global(#root),body,html{height:100%}:global(.mainwrapper){position:absolute!important;top:0;bottom:0;left:0;right:0}:global(.sideleft){float:left;background-color:#eaedf1;position:absolute;top:0;bottom:0;z-index:2;overflow:hidden;width:180px}:global(.sideleft .toptitle){width:100%;height:70px;line-height:70px;background:#d9dee4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700;text-indent:20px}:global(.maincontainer){position:absolute;width:auto;top:0;bottom:0;left:180px;right:0;overflow:hidden;overflow-y:auto;-o-transition:all .2s ease;-ms-transition:all .2s ease;-moz-transition:all .2s ease;-webkit-transition:all .2s ease}:global(.viewFramework-product-navbar .product-nav-list li .active){background-color:#fff!important}.next-menu .next-menu-icon-arrow-down{transform:rotate(0deg)!important}li.next-menu-item:not(.next-disabled).next-selected:focus:hover,li.next-menu-item:not(.next-disabled).next-selected:hover,li.next-menu-item:not(.next-disabled):hover{background:#e4f3fe;background:var(--nav-normal-sub-nav-hover-bg-color,#e4f3fe);color:#209bfa;color:var(--nav-normal-sub-nav-hover-text-color,#209bfa)}.next-menu.next-normal .next-menu-item.next-selected{background:#e4f3fe!important;background:var(--nav-normal-sub-nav-selected-bg-color,#e4f3fe)!important;color:#209bfa!important;color:var(--nav-normal-sub-nav-selected-text-color,#209bfa)!important}.clearfix:after{content:".";clear:both;display:block;height:0;overflow:hidden;visibility:hidden}.clearfix{zoom:1}.copy-icon{cursor:pointer;margin-left:4px;color:var(--color-link-1,#298dff)}.layouttitle{height:40px;width:200px;background-color:#09c;color:#fff;line-height:40px;text-align:center;margin:0;padding:0;font-weight:700}.linknav{height:30px;line-height:30px;text-align:center}.righttitle{height:40px;background-color:#000;width:100%;font-weight:700}.product-nav-icon{padding:15px 0 0;height:70px;margin:0}.envcontainer{padding-left:15px;margin-right:auto;margin-left:auto;max-height:450px;overflow:scroll;margin-bottom:100px;display:none;top:50px;left:230px;position:fixed;z-index:99999;width:435px;height:auto;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.envtop{height:50px;line-height:50px;position:fixed;top:0;left:320px;z-index:999;background-color:transparent;-webkit-font-smoothing:antialiased}.envcontainer-top{padding-left:15px;margin-right:auto;margin-left:auto;max-height:450px;overflow:auto;margin-bottom:100px;display:none;top:50px;left:0;position:absolute;z-index:99999;width:435px;height:auto;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.envcontainer-top .row{margin:0!important}.envcontainer-top .active{background-color:#546478}.envcontainer dl dd.active{background-color:#546478;color:#fff}.current-env{display:block;padding:0;font-size:14px;margin:0 0 5px;text-align:center}.current-env a{color:#666;text-decoration:none}.product-nav-title{height:70px;line-height:70px;margin:0;text-align:center;padding:0;font-size:14px;background:#d9dee4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.console-title{padding:16px 0}.topbar-nav-item-title{margin:0 0 10px 31px;color:#666;font-weight:700}.dl{height:100%;width:125px;overflow:auto;margin:0 15px 15px 0}.dd{height:24px;line-height:24px;overflow-x:hidden;padding-left:12px;margin-left:20px}.active{color:#fff}.dd:hover{cursor:pointer;opacity:.7;filter:70}.cm-s-xq-light span.cm-keyword{line-height:1em;font-weight:700;color:#5a5cad}.cm-s-xq-light span.cm-atom{color:#6c8cd5}.cm-s-xq-light span.cm-number{color:#164}.cm-s-xq-light span.cm-def{text-decoration:underline}.cm-s-xq-light span.cm-type,.cm-s-xq-light span.cm-variable,.cm-s-xq-light span.cm-variable-2,.cm-s-xq-light span.cm-variable-3{color:#000}.cm-s-xq-light span.cm-comment{color:#0080ff;font-style:italic}.cm-s-xq-light span.cm-string{color:red}.cm-s-xq-light span.cm-meta{color:#ff0}.cm-s-xq-light span.cm-qualifier{color:grey}.cm-s-xq-light span.cm-builtin{color:#7ea656}.cm-s-xq-light span.cm-bracket{color:#cc7}.cm-s-xq-light span.cm-tag{color:#3f7f7f}.cm-s-xq-light span.cm-attribute{color:#7f007f}.cm-s-xq-light span.cm-error{color:red}.cm-s-xq-light .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-xq-light .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important;background:#ff0}.CodeMirror{border:1px solid #eee}.CodeMirror-fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:auto;z-index:9999}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:infobackground;border:1px solid #000;border-radius:4px 4px 4px 4px;color:infotext;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:0 100%;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")}.CodeMirror-lint-mark-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:50%;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:0 0;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=")}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-multiple{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:100% 100%;width:100%;height:100%}@media(min-width:992px){.modal-lg{width:980px}}@media(min-width:768px)and (max-width:992px){.modal-lg{width:750px}}.modal-body table.narrow-table td{padding:8px 0}.add-on.form-control{margin-left:-4px;box-shadow:none;font-size:28px;line-height:32px;padding:0;vertical-align:top}.text-break{word-wrap:break-word;word-break:break-all;white-space:normal}.form-inline{margin-bottom:20px}.console-title{min-height:70px}.form-horizontal .form-group .checkbox{margin-left:0;margin-right:10px}.combox_border,.combox_select{border:1px solid #c2c2c2;width:245px}.combox_border{height:auto;display:inline-block;position:relative}.combox_input{border:0;padding-left:5px;width:85%;vertical-align:middle}.form-inline .combox_input.form-control{width:85%}.combox_button{width:12%;color:#666;text-align:center;vertical-align:middle;cursor:pointer;border-left:1px solid #c2c2c2}ul.combox_select{border-top:0;padding:0;position:absolute;left:-1px;top:20px;display:none;background:#fff;max-height:300px;overflow-y:auto}ul.combox_select li{overflow:hidden;height:30px;line-height:30px;cursor:pointer}ul.combox_select li a{display:block;line-height:28px;padding:0 8px;text-decoration:none;color:#666}ul.combox_select li a:hover{text-decoration:none;background:#f5f5f5}#combox-appanme.combox_border,#combox-appanme .combox_select{width:158px}#combox-appanme .form-control{height:30px}input.error,textarea.error{border:1px solid red}.form-inline .form-group{position:relative}label.error{margin:4px 0;color:red;font-weight:400;position:absolute;right:15px;bottom:-26px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}form.vertical-margin-lg .form-group{margin-bottom:22px}.namespacewrapper{padding:5px 15px;overflow:hidden;background-color:#efefef}.xrange-container{position:relative;border:1px solid #ccc;margin:0;padding:0}.xrange-container .cocofont,.xrange-container .iconfont{cursor:pointer}.xrange-container .label{display:flex;align-items:center;text-align:center;justify-content:space-between;cursor:pointer}.xrange-container .label.is-button{display:flex;border:1px solid #e6ebef;height:32px;padding:6px 12px;background-color:#f5f5f6}.xrange-container .label.is-button>i{font-size:13px}.xrange-container .label.is-empty{padding:0}.xrange-container .label.is-empty.is-button{padding:6px 12px}.xrange-container .label.is-empty>i{font-size:15px;margin-right:0}.xrange-container .label.is-empty>span,.xrange-container .label.is-empty b{display:none}.xrange-container .label>i{font-size:13px;text-align:center}.xrange-container .label>b{padding-top:3px}.xrange-container .label>span{min-width:100px;display:inline-flex;margin-bottom:8px}.xrange-layer{position:fixed;left:0;top:0;width:100%;height:100%;z-index:990;background-color:rgba(0,0,0,.05)}.xrange-panel{display:none;position:relative;right:1px;top:-8px;z-index:1000;border:1px solid #e6e7eb;border-radius:0;box-shadow:1px 1px 3px 0 transparent;width:111px;min-height:302px;background-color:#fff}.xrange-panel.visible{display:block}.xrange-panel .quick-list{display:flex;flex-direction:column;justify-content:space-around;box-sizing:content-box!important;align-items:center}.xrange-panel .quick-list>span{flex:0 0 auto;width:100%;line-height:20px;padding:6px 0 6px 27px;font-size:12px;-webkit-user-select:none;cursor:pointer}.xrange-panel .quick-list>span+span{margin-left:0}.xrange-panel .quick-list>span.active{background-color:#f2f3f7;color:#333;cursor:default}.xrange-panel .xrange-panel-footer{display:flex;align-items:center;justify-content:space-between;height:60px;background-color:#fff;position:absolute;top:300px;left:-539px;min-width:648px;padding:12px 108px 12px 12px}.xrange-panel .xrange-panel-footer .fn-left,.xrange-panel .xrange-panel-footer .fn-right{flex:0 0 auto}.xrange-panel .xrange-panel-footer button+button{margin-left:8px}.xrange-panel .picker-container{display:none;position:relative;margin-top:16px}.xrange-panel .picker-container .next-range-picker-panel{top:-273px!important;left:-540px!important;position:absolute!important;animation:none!important;z-index:999999;border-color:#e6ebef}.next-calendar-card .next-calendar-range-body{background:#fff!important;min-height:227px!important}.xrange-panel .picker-container+.next-range-picker{display:none}.xrange-panel .picker-container .next-date-picker-quick-tool{display:none!important}.xrange-panel.show-picker .picker-container{display:block;min-height:5px}.dingding{background:url(https://g.alicdn.com/cm-design/arms/1.1.27/styles/arms/images/dingding.png) no-repeat 0}.dingding,.wangwang{display:inline-block;padding:5px 0 5px 30px;height:24px;vertical-align:middle}.wangwang{background:url(https://g.alicdn.com/cm-design/arms/1.1.27/styles/arms/images/wangwang.png) no-repeat 0;background-size:24px}@media screen and (min-width:768px){.region-group-list{max-width:784px}}@media screen and (min-width:992px){.region-group-list{max-width:862px}}@media screen and (min-width:1200px){.region-group-list{max-width:600px}}@media screen and (min-width:1330px){.region-group-list{max-width:700px}}@media screen and (min-width:1500px){.region-group-list{max-width:1000px}}.next-switch-medium{border:1px solid transparent;width:48px!important;height:26px!important;border-radius:15px!important}.next-switch-medium>.next-switch-trigger{border:1px solid transparent;position:absolute;left:33px!important;width:24px!important;height:24px!important;border-radius:15px!important}.aliyun-advice{bottom:98px!important}.next-switch-medium>.next-switch-children{font-size:12px!important;position:absolute;height:24px!important;line-height:24px!important}.next-switch-on>.next-switch-trigger{box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#fff;border-color:transparent;position:absolute;right:0!important}.next-switch-on>.next-switch-children{left:2px!important;font-size:12px!important}.next-switch-on[disabled]>.next-switch-trigger{position:absolute;right:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#e6e7eb;border-color:transparent}.next-switch-off>.next-switch-children{right:-6px;color:#979a9c!important}.next-switch-off[disabled]>.next-switch-trigger{left:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#e6e7eb;border-color:transparent}.next-switch-off>.next-switch-trigger{left:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32);background-color:#fff;border-color:transparent}.next-switch-off,.next-switch-on{width:58px!important}.next-switch-on{position:relative}.next-menu .next-menu-icon-select{position:absolute;left:4px;top:0;color:#73777a!important}.next-table-cell-wrapper{hyphens:auto!important;word-break:break-word!important}.dash-page-container{height:100%;min-width:980px}.dash-page-container:after{content:"";display:table;clear:both}.dash-left-container{position:relative;float:left;width:77.52%;height:100%}.dash-title-show{width:100%;height:106px;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:19px;padding-top:20px;padding-bottom:20px;overflow:hidden}.dash-title-item{float:left;height:49px;width:33%;border-right:1px solid #ebecec;line-height:49px;padding-left:30px;padding-right:30px}.dash-title-word{height:19px;line-height:19px;font-size:14px;color:#73777a}.dash-title-num{height:45px;font-size:32px}.dash-title-item:last-child{border:none!important}.dash-menu-list{width:100%;height:104px;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:19px}.dash-menu-item{position:relative;float:left;width:33.33%;border-right:1px solid #eee;height:100%;padding-top:20px;padding-bottom:20px;cursor:pointer}.dash-menu-item.disabled{cursor:not-allowed;opacity:.7}.dash-menu-item:last-child{border:none}.dash-menu-item:hover{box-shadow:0 3px 6px 0 rgba(0,0,0,.12)}.dash-menu-conent-wrapper{padding-left:60px;padding-right:40px}.dash-menu-pic{position:absolute;width:32px;left:20px}.dash-menu-content-title{height:19px;line-height:19px;color:#373d41;margin-bottom:5px}.dash-menu-content-word{font-size:12px;color:#73777a}.dash-scene-wrapper{width:100%;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:20px}.dash-scene-title{position:relative;padding-left:20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0}.dash-sceneitem{width:100%;height:80px;padding-top:24px}.dash-scenitem-out{border-bottom:1px solid #eee;height:100%}.dash-sceneitem:hover{box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 4px 0 rgba(0,0,0,.12);border-bottom:1px solid #f0f0f0}.dash-sceneitem-progresswrapper{position:relative;width:256px;height:6px}.dash-sceneitem-progresswrapper.green{background-color:#e2f5cf}.dash-sceneitem-progresswrapper.red{background-color:#ffe6e5}.dash-sceneitem-progresswrapper.green .dash-sceneitem-progressinner{height:100%;background-color:#a6e22e}.dash-sceneitem-progresswrapper.red .dash-sceneitem-progressinner{height:100%;background-color:#eb4c4d}.dash-sceneitem-iconshow{position:absolute;right:0;top:5px}.dash-sceneitem:hover.dash-sceneitem-out{border:none}.dash-sceneitem:after{display:table;content:"";clear:both}.dash-sceneitem-title{float:left;height:32.8px;padding-top:5px;width:14.47%;border-right:1px solid #f0f0f0;overflow:hidden;text-overflow:ellipsis}.scene-nomore-data{position:absolute;text-align:center;left:0;right:0;color:#eee;font-size:12px}.dash-sceneitem-content{position:relative;float:left;padding-top:5px;padding-left:30px;width:85.53%}.scene-title-link{position:absolute;right:20px;top:0;font-size:10px}.dash-bottom-show{width:100%;height:42px;line-height:42px;margin-top:18px;text-align:center;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12)}.dash-right-container{float:right;height:100%;width:22.44%;padding:10px;background-color:#fff}.dash-bottom-item,.dash-vl{color:#979a9c;margin-right:10px}.dash-doc{background-color:#fff;height:178px;width:100%;margin-bottom:14px}.dash-doc-title{width:100%;height:68px;line-height:68px;padding-left:20px;padding-right:20px;border-bottom:1px solid #eee}.dash-doc-content{width:100%;padding:15px}.dash-card-contentwrappers{width:100%;height:230px;margin-bottom:14px;background-color:#fff;border:1px solid #eee;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12)}.dash-card-title{width:100%;height:39px;line-height:39px;margin:0;padding-left:24px;padding-right:24px;color:#4a4a4a;border-bottom:1px solid #eee}.dash-card-contentlist{padding:20px}.dash-card-contentitem{position:relative;text-align:left;font-size:12px;margin-bottom:10px}.next-slick-dots-item button{height:4px!important;width:35px!important;border-radius:10px!important}.next-table-row.hovered{background-color:#f5f7f9!important}.alert-success-text{color:#4a4a4a;font-size:14px;margin:10px 0}.alert-success{border-color:#e0e0e0!important}.row-bg-green{background-color:#e4fdda}.row-bg-light-green{background-color:#e3fff8}.row-bg-orange{background-color:#fff3e0}.row-bg-red{background-color:#ffece4}:root{--form-element-preview-label-color:var(--color-text1-3,#666);--form-element-preview-text-color:var(--color-text1-4,#333);--form-element-large-corner:var(--corner-1,3px);--form-element-medium-corner:var(--corner-1,3px);--form-element-small-corner:var(--corner-1,3px);--form-element-large-preview-font-size:var(--font-size-subhead,16px);--form-element-large-preview-label-font-size:var(--font-size-subhead,16px);--form-element-medium-preview-font-size:var(--font-size-body-1,14px);--form-element-medium-preview-label-font-size:var(--font-size-body-1,14px);--form-element-small-preview-font-size:var(--font-size-caption,12px);--form-element-small-preview-label-font-size:var(--font-size-caption,12px);--form-element-large-preview-height:var(--s-10,40px);--form-element-medium-preview-height:var(--s-7,28px);--form-element-small-preview-height:var(--s-5,20px);--form-element-large-font-size:var(--font-size-subhead,16px);--form-element-small-font-size:var(--font-size-caption,12px);--form-element-large-height:var(--s-10,40px);--form-element-large-icon-size:var(--icon-m,20px);--form-element-medium-icon-size:var(--icon-m,20px);--form-element-small-icon-size:var(--icon-s,16px);--form-element-medium-font-size:var(--font-size-body-2,14px);--form-element-medium-height:var(--s-8,32px);--form-element-small-height:var(--s-6,24px);--line-dotted:dotted;--line-dashed:dashed;--line-solid:solid;--line-3:3px;--line-2:2px;--line-1:1px;--line-zero:0px;--popup-global-shadow:var(--shadow-2-down,0px 4px 8px 0px rgba(0,0,0,0.12));--popup-global-corner:var(--corner-1,3px);--popup-global-border-color:var(--color-line1-2,#e6e6e6);--popup-global-border-style:var(--line-solid,solid);--popup-global-border-width:var(--line-zero,0px);--popup-local-shadow:var(--shadow-zero,none);--popup-local-corner:var(--corner-1,3px);--popup-local-border-color:var(--color-line1-2,#e6e6e6);--popup-local-border-style:var(--line-solid,solid);--popup-local-border-width:var(--line-1,1px);--popup-spacing-tb:var(--s-zero,0px);--popup-spacing-lr:var(--s-zero,0px);--mask-background:var(--color-black,#000);--mask-opacity:0.3;--s-50:200px;--s-49:196px;--s-48:192px;--s-47:188px;--s-46:184px;--s-45:180px;--s-44:176px;--s-43:172px;--s-42:168px;--s-41:164px;--s-40:160px;--s-39:156px;--s-38:152px;--s-37:148px;--s-36:144px;--s-35:140px;--s-34:136px;--s-33:132px;--s-32:128px;--s-31:124px;--s-30:120px;--s-29:116px;--s-28:112px;--s-27:108px;--s-26:104px;--s-25:100px;--s-24:96px;--s-23:92px;--s-22:88px;--s-21:84px;--s-20:80px;--s-19:76px;--s-18:72px;--s-17:68px;--s-16:64px;--s-15:60px;--s-14:56px;--s-13:52px;--s-12:48px;--s-11:44px;--s-10:40px;--s-9:36px;--s-8:32px;--s-7:28px;--s-6:24px;--s-5:20px;--s-4:16px;--s-3:12px;--s-2:8px;--s-1:4px;--s-zero:0px;--s-auto:auto;--size-base:4px;--shadow-3-left:-20px 0px 30px 0px rgba(0,0,0,0.15);--shadow-3-down:0px 20px 30px 0px rgba(0,0,0,0.15);--shadow-3-right:20px 0px 30px 0px rgba(0,0,0,0.15);--shadow-3-up:0px -20px 30px 0px rgba(0,0,0,0.15);--shadow-3:20px 20px 30px 0px rgba(0,0,0,0.15);--shadow-2-left:-4px 0px 8px 0px rgba(0,0,0,0.12);--shadow-2-down:0px 4px 8px 0px rgba(0,0,0,0.12);--shadow-2-right:4px 0px 8px 0px rgba(0,0,0,0.12);--shadow-2-up:0px -4px 8px 0px rgba(0,0,0,0.12);--shadow-2:4px 4px 8px 0px rgba(0,0,0,0.12);--shadow-1-left:-1px 0px 3px 0px rgba(0,0,0,0.12);--shadow-1-down:0px 1px 3px 0px rgba(0,0,0,0.12);--shadow-1-right:1px 0px 3px 0px rgba(0,0,0,0.12);--shadow-1-up:0px -1px 3px 0px rgba(0,0,0,0.12);--shadow-1:1px 1px 3px 0px rgba(0,0,0,0.12);--shadow-zero:none;--shadow-spread-sd3:0;--shadow-spread-sd2:0;--shadow-spread-sd1:0;--shadow-blur-sd1:3;--shadow-color-sd3:var(--color-black,#000);--shadow-color-sd2:var(--color-black,#000);--shadow-color-sd1:var(--color-black,#000);--shadow-opacity-sd2:.12;--shadow-opacity-sd1:.12;--shadow-distance-sd1y:1;--shadow-distance-sd1:1;--shadow-sides-left:"left";--shadow-sides-down:"down";--shadow-sides-right:"right";--shadow-sides-up:"up";--shadow-sides-base:"base";--shadow-blur-sd2:8;--shadow-distance-sd2y:4;--shadow-distance-sd2:4;--shadow-blur-sd3:30;--shadow-opacity-sd3:0.15;--shadow-distance-sd3y:20;--shadow-distance-sd3:20;--icon-reset:"";--icon-xxxl:var(--s-16,64px);--icon-xxl:var(--s-12,48px);--icon-xl:var(--s-8,32px);--icon-l:var(--s-6,24px);--icon-m:var(--s-5,20px);--icon-s:var(--s-4,16px);--icon-xs:var(--s-3,12px);--icon-xxs:var(--s-2,8px);--icon-font-name:"icon";--icon-content-dashboard:"";--icon-content-list:"";--icon-content-detail:"";--icon-content-form:"";--icon-font-path:"//at.alicdn.com/t/font_1533967_slipq25tezj";--icon-content-ic_yusuanguanli:"";--icon-content-ic_formbeifen:"";--icon-content-ic_form:"";--icon-content-ic_dashboard:"";--icon-content-ic_tongzhi:"";--icon-content-ic_logo:"";--icon-content-taobao:"";--icon-content-alibaba:"";--icon-content-ic_language:"";--icon-content-chart-pie:"";--icon-content-chart-bar:"";--icon-content-exit:"";--icon-content-lock:"";--icon-content-unlock:"";--icon-content-eye-close:"";--icon-content-eye:"";--icon-content-toggle-right:"";--icon-content-toggle-left:"";--icon-content-copy:"";--icon-content-atm:"";--icon-content-email:"";--icon-content-account:"";--icon-content-attachment:"";--icon-content-filter:"";--icon-content-refresh:"";--icon-content-edit:"";--icon-content-set:"";--icon-content-download:"";--icon-content-upload:"";--icon-content-ashbin:"";--icon-content-calendar:"";--icon-content-picture:"";--icon-content-ellipsis:"";--icon-content-close:"";--icon-content-search:"";--icon-content-loading:"";--icon-content-semi-select:"";--icon-content-select:"";--icon-content-ascending:"";--icon-content-descending:"";--icon-content-sorting:"";--icon-content-switch:"";--icon-content-arrow-double-right:"";--icon-content-arrow-double-left:"";--icon-content-arrow-right:"";--icon-content-arrow-left:"";--icon-content-arrow-down:"";--icon-content-arrow-up:"";--icon-content-minus:"";--icon-content-add:"";--icon-content-favorites-filling:"";--icon-content-delete-filling:"";--icon-content-success-filling:"";--icon-content-clock:"";--icon-content-help:"";--icon-content-error:"";--icon-content-prompt:"";--icon-content-warning:"";--icon-content-success:"";--icon-content-cry:"";--icon-content-smile:"";--font-weight-ultra-bold:900;--font-weight-extra-bold:800;--font-weight-3:bold;--font-weight-semi-bold:600;--font-weight-medium:500;--font-weight-2:normal;--font-weight-light:300;--font-weight-thin:200;--font-weight-1:lighter;--font-size-body-2:14px;--font-size-subhead:16px;--font-size-title:20px;--font-size-headline:24px;--font-size-display-1:36px;--font-size-display-2:48px;--font-size-display-3:56px;--font-lineheight-3:1.7;--font-lineheight-2:1.5;--font-lineheight-1:1.3;--font-family-base:Roboto,"Helvetica Neue",Helvetica,Tahoma,Arial,"PingFang SC","Microsoft YaHei";--font-size-caption:12px;--font-size-body-1:14px;--corner-zero:0;--corner-semicircle:500px;--corner-circle:50%;--corner-2:6px;--corner-1:3px;--corner-3:12px;--color-text1-4:#333;--color-text1-3:#666;--color-text1-2:#999;--color-gradient-4:linear-gradient(270deg,#ffa3a6,#f52743);--color-gradient-3:linear-gradient(270deg,#ffed75,#f5cb22);--color-gradient-2:linear-gradient(270deg,#7deeff,#03c1fd);--color-gradient-1:linear-gradient(270deg,#79e8c7,#08c29e);--color-error-2:#ffc8b2;--color-error-1:#ffece4;--color-transparent:transparent;--color-black:#000;--color-white:#fff;--color-other-1:#18263c;--color-notice-1:#e4f3fe;--color-brand1-1:#add9ff;--color-brand1-9:#1274e7;--color-fill1-6:#151515;--color-other-3:#111;--color-other-2:#222;--color-data1-9:#096dd9;--color-data1-8:#73d13d;--color-data1-7:#ffec3d;--color-data1-6:#ffc53d;--color-data1-5:#ff4d4f;--color-data1-3:#2f54eb;--color-data1-2:#209bfa;--color-data1-1:#36cfc9;--color-brand1-6:#209bfa;--color-notice-3:#298dff;--color-text1-5:#fff;--color-fill1-5:#222;--color-data1-4:#a758e2;--color-text1-1:#ccc;--color-fill1-4:#f2f2f2;--color-fill1-3:#f5f5f5;--color-fill1-2:#f9f9f9;--color-fill1-1:#fafafa;--color-line1-4:#ccc;--color-line1-3:#ddd;--color-line1-2:#e6e6e6;--color-line1-1:#eee;--color-link-3:#2580e7;--color-link-2:#4a83c5;--color-link-1:#298dff;--color-error-4:#b7321e;--color-error-3:#d23c26;--color-notice-4:#1b84e0;--color-notice-2:#add9ff;--color-success-4:#10b976;--color-success-3:#1ad78c;--color-success-2:#88ffd0;--color-success-1:#e5fff5;--color-help-4:#d69600;--color-help-3:#f1c826;--color-help-2:#ffe98f;--color-help-1:#fff9e0;--color-warning-4:#d69600;--color-warning-3:#f1c826;--color-warning-2:#ffe98f;--color-warning-1:#fff9e0;--search-normal-primary-border-width:var(--line-1,1px);--search-normal-primary-l-height:var(--s-10,40px);--search-normal-primary-m-height:var(--s-8,32px);--search-normal-primary-m-icon-size:var(--icon-xs,12px);--search-normal-secondary-l-height:var(--s-10,40px);--search-normal-secondary-m-height:var(--s-8,32px);--search-normal-secondary-m-icon-size:var(--icon-xs,12px);--search-normal-normal-l-height:var(--s-10,40px);--search-normal-normal-m-height:var(--s-8,32px);--search-normal-normal-m-icon-size:var(--icon-xs,12px);--search-normal-dark-bg-opacity:0;--search-normal-dark-l-height:var(--s-10,40px);--search-normal-dark-m-height:var(--s-8,32px);--search-normal-dark-m-icon-size:var(--icon-xs,12px);--search-simple-dark-color:var(--color-text1-3,#666);--search-simple-dark-hover-color:var(--color-text1-2,#999);--search-simple-dark-icon-text-color:var(--color-text1-3,#666);--search-simple-dark-m-icon-size:var(--icon-m,20px);--search-simple-m-icon-margin-right:var(--s-2,8px);--search-simple-dark-text-color:var(--color-white,#fff);--search-simple-dark-icon-hover-text-color:var(--color-text1-2,#999);--search-normal-corner:var(--corner-1,3px);--search-normal-primary-color:var(--color-brand1-6,#209bfa);--search-normal-primary-hover-color:var(--color-brand1-6,#209bfa);--search-normal-primary-split-color:var(--color-line1-1,#eee);--search-normal-primary-shadow:var(--shadow-zero,none);--search-normal-primary-btn-text-color:var(--color-white,#fff);--search-normal-primary-btn-hover-bg-color:var(--color-brand1-9,#1274e7);--search-normal-primary-btn-hover-text-color:var(--color-white,#fff);--search-normal-primary-btn-text-padding-left:var(--s-zero,0px);--search-normal-primary-l-icon-size:var(--icon-l,24px);--search-normal-primary-l-btn-text-size:var(--font-size-subhead,16px);--search-normal-primary-m-btn-text-size:var(--font-size-subhead,16px);--search-normal-secondary-color:var(--color-line1-3,#ddd);--search-normal-secondary-split-color:var(--color-line1-1,#eee);--search-normal-secondary-hover-color:var(--color-brand1-6,#209bfa);--search-normal-secondary-shadow:var(--shadow-zero,none);--search-normal-secondary-btn-bg-color:var(--color-brand1-6,#209bfa);--search-normal-secondary-btn-text-color:var(--color-white,#fff);--search-normal-secondary-btn-hover-bg-color:var(--color-brand1-9,#1274e7);--search-normal-secondary-btn-hover-text-color:var(--color-white,#fff);--search-normal-secondary-border-width:var(--line-1,1px);--search-normal-secondary-btn-text-padding-left:var(--s-zero,0px);--search-normal-secondary-l-icon-size:var(--icon-l,24px);--search-normal-secondary-l-btn-text-size:var(--font-size-subhead,16px);--search-normal-secondary-m-btn-text-size:var(--font-size-subhead,16px);--search-normal-normal-color:var(--color-line1-3,#ddd);--search-normal-normal-split-color:var(--color-line1-1,#eee);--search-normal-normal-hover-color:var(--color-line1-4,#ccc);--search-normal-normal-shadow:var(--shadow-zero,none);--search-normal-normal-btn-bg-color:var(--color-fill1-1,#fafafa);--search-normal-normal-btn-text-color:var(--color-text1-3,#666);--search-normal-normal-btn-hover-bg-color:var(--color-fill1-3,#f5f5f5);--search-normal-normal-btn-hover-text-color:var(--color-text1-4,#333);--search-normal-normal-border-width:var(--line-1,1px);--search-normal-normal-btn-text-padding-left:var(--s-zero,0px);--search-normal-normal-l-icon-size:var(--icon-l,24px);--search-normal-normal-l-btn-text-size:var(--font-size-subhead,16px);--search-normal-normal-m-btn-text-size:var(--font-size-subhead,16px);--search-normal-dark-color:var(--color-brand1-6,#209bfa);--search-normal-dark-hover-color:var(--color-brand1-6,#209bfa);--search-normal-dark-text-color:var(--color-white,#fff);--search-normal-dark-bg-color:var(--color-white,#fff);--search-normal-dark-shadow:var(--shadow-zero,none);--search-normal-dark-btn-text-color:var(--color-white,#fff);--search-normal-dark-btn-hover-bg-color:var(--color-brand1-9,#1274e7);--search-normal-dark-btn-hover-text-color:var(--color-white,#fff);--search-normal-dark-border-width:var(--line-1,1px);--search-normal-dark-btn-text-padding-left:var(--s-zero,0px);--search-normal-dark-l-icon-size:var(--icon-l,24px);--search-normal-dark-l-btn-text-size:var(--font-size-subhead,16px);--search-normal-dark-m-btn-text-size:var(--font-size-subhead,16px);--search-simple-corner:var(--corner-1,3px);--search-simple-l-icon-margin-right:var(--s-3,12px);--search-simple-normal-color:var(--color-line1-3,#ddd);--search-simple-normal-hover-color:var(--color-line1-4,#ccc);--search-simple-normal-split-color:var(--color-line1-3,#ddd);--search-simple-normal-shadow:var(--shadow-zero,none);--search-simple-normal-icon-text-color:var(--color-text1-2,#999);--search-simple-normal-icon-hover-text-color:var(--color-text1-3,#666);--search-simple-normal-border-width:var(--line-1,1px);--search-simple-normal-l-icon-size:var(--icon-m,20px);--search-simple-normal-m-icon-size:var(--icon-xs,12px);--search-simple-normal-btn-text-padding-left:var(--s-zero,0px);--search-simple-dark-bg-color:var(--color-white,#fff);--search-simple-dark-bg-opacity:0;--search-simple-dark-shadow:var(--shadow-zero,none);--search-simple-dark-btn-text-padding-left:var(--s-zero,0px);--search-simple-dark-split-color:var(--color-line1-3,#ddd);--search-simple-dark-border-width:var(--line-1,1px);--search-simple-dark-l-icon-size:var(--icon-m,20px);--search-search-icon-content:var(--icon-content-search,"");--switch-size-m-trigger:var(--s-6,24px);--switch-size-m-width:var(--s-12,48px);--switch-size-m-radius-container:var(--corner-3,12px);--switch-size-m-radius-trigger:var(--corner-3,12px);--switch-size-m-inner-icon:var(--s-4,16px);--switch-size-m-trigger-padding-l:var(--s-2,8px);--switch-size-m-trigger-padding-r:var(--s-2,8px);--switch-size-s-width:var(--s-11,44px);--switch-size-s-radius-container:var(--corner-3,12px);--switch-size-s-trigger:var(--s-5,20px);--switch-size-s-radius-trigger:var(--corner-3,12px);--switch-size-s-inner-icon:var(--s-3,12px);--switch-size-s-trigger-padding-l:var(--s-2,8px);--switch-size-s-trigger-padding-r:var(--s-2,8px);--switch-border-width-container:var(--line-2,2px);--switch-border-width-trigger:var(--line-1,1px);--switch-normal-on-bg-color:var(--color-brand1-6,#209bfa);--switch-hover-on-bg-color:var(--color-brand1-9,#1274e7);--switch-disabled-on-bg-color:var(--color-fill1-3,#f5f5f5);--switch-normal-on-trigger-bg-color:var(--color-white,#fff);--switch-hover-on-trigger-bg-color:var(--color-white,#fff);--switch-disabled-on-trigger-bg-color:var(--color-fill1-1,#fafafa);--switch-normal-on-color-font:var(--color-white,#fff);--switch-disabled-on-color-font:var(--color-text1-1,#ccc);--switch-disabled-on-border-color:var(--color-line1-3,#ddd);--switch-handle-on-border-color:var(--color-transparent,transparent);--switch-on-shadow:var(--shadow-1,1px 1px 3px 0px rgba(0,0,0,0.12));--switch-normal-off-bg-color:var(--color-fill1-3,#f5f5f5);--switch-hover-off-bg-color:var(--color-fill1-3,#f5f5f5);--switch-disabled-off-bg-color:var(--color-fill1-3,#f5f5f5);--switch-normal-off-trigger-bg-color:var(--color-white,#fff);--switch-hover-off-trigger-bg-color:var(--color-white,#fff);--switch-disabled-off-trigger-bg-color:var(--color-fill1-1,#fafafa);--switch-handle-disabled-border-color:transparent;--switch-normal-off-color-font:var(--color-text1-2,#999);--switch-disabled-off-color-font:var(--color-line1-3,#ddd);--switch-handle-off-border-color:var(--color-transparent,transparent);--switch-normal-off-border-color:var(--color-fill1-3,#f5f5f5);--switch-hover-off-border-color:var(--color-fill1-3,#f5f5f5);--switch-off-shadow:var(--shadow-1,1px 1px 3px 0px rgba(0,0,0,0.12));--switch-rtl-on-shadow:var(--shadow-1-left,-1px 0px 3px 0px rgba(0,0,0,0.12));--btn-size-s-height:var(--s-6,24px);--btn-size-m-height:var(--s-8,32px);--btn-size-m-icon-size:var(--icon-m,20px);--btn-size-m-icon-margin:var(--s-1,4px);--btn-size-l-icon-size:var(--icon-m,20px);--btn-size-s-padding:var(--s-4,16px);--btn-size-m-padding:var(--s-5,20px);--btn-size-l-padding:var(--s-6,24px);--btn-shadow:var(--shadow-zero,none);--btn-shadow-hover:var(--shadow-zero,none);--btn-size-s-border-width:var(--line-1,1px);--btn-size-s-font:var(--font-size-caption,12px);--btn-size-s-icon-size:var(--icon-xs,12px);--btn-size-s-icon-margin:var(--s-1,4px);--btn-size-s-icon-split-size:var(--icon-xs,12px);--btn-size-s-corner:var(--corner-1,3px);--btn-size-m-border-width:var(--line-1,1px);--btn-size-m-font:var(--font-size-body-1,14px);--btn-size-m-icon-split-size:var(--icon-xs,12px);--btn-size-m-corner:var(--corner-1,3px);--btn-size-l-height:var(--s-10,40px);--btn-size-l-border-width:var(--line-1,1px);--btn-size-l-font:var(--font-size-subhead,16px);--btn-size-l-icon-margin:var(--s-1,4px);--btn-size-l-icon-split-size:var(--icon-s,16px);--btn-size-l-corner:var(--corner-1,3px);--btn-pure-color-disabled:var(--color-text1-1,#ccc);--btn-pure-bg-disabled:var(--color-fill1-1,#fafafa);--btn-pure-border-color-disabled:var(--color-line1-1,#eee);--btn-pure-normal-color-disabled:var(--color-text1-1,#ccc);--btn-pure-normal-bg-disabled:var(--color-fill1-1,#fafafa);--btn-pure-normal-border-color-disabled:var(--color-line1-1,#eee);--btn-pure-normal-color:var(--color-text1-4,#333);--btn-pure-normal-color-hover:var(--color-text1-4,#333);--btn-pure-normal-color-active:var(--color-text1-4,#333);--btn-pure-normal-bg:var(--color-white,#fff);--btn-pure-normal-bg-hover:var(--color-fill1-2,#f9f9f9);--btn-pure-normal-bg-active:var(--color-fill1-2,#f9f9f9);--btn-pure-normal-border-color:var(--color-line1-3,#ddd);--btn-pure-normal-border-color-hover:var(--color-line1-4,#ccc);--btn-pure-normal-border-color-active:var(--color-line1-4,#ccc);--btn-pure-normal-border-style:var(--line-solid,solid);--btn-pure-secondary-color-disabled:var(--color-text1-1,#ccc);--btn-pure-secondary-bg-disabled:var(--color-fill1-1,#fafafa);--btn-pure-secondary-border-color-disabled:var(--color-line1-1,#eee);--btn-pure-secondary-color:var(--color-brand1-6,#209bfa);--btn-pure-secondary-color-hover:var(--color-white,#fff);--btn-pure-secondary-color-active:var(--color-white,#fff);--btn-pure-secondary-bg:var(--color-white,#fff);--btn-pure-secondary-bg-hover:var(--color-brand1-9,#1274e7);--btn-pure-secondary-bg-active:var(--color-brand1-9,#1274e7);--btn-pure-secondary-border-color:var(--color-brand1-6,#209bfa);--btn-pure-secondary-border-color-hover:var(--color-brand1-9,#1274e7);--btn-pure-secondary-border-color-active:var(--color-brand1-9,#1274e7);--btn-pure-secondary-border-style:var(--line-solid,solid);--btn-pure-primary-color-disabled:var(--color-text1-1,#ccc);--btn-pure-primary-bg-disabled:var(--color-fill1-1,#fafafa);--btn-pure-primary-border-color-disabled:var(--color-line1-1,#eee);--btn-pure-primary-color:var(--color-white,#fff);--btn-pure-primary-color-hover:var(--color-white,#fff);--btn-pure-primary-color-active:var(--color-white,#fff);--btn-pure-primary-bg:var(--color-brand1-6,#209bfa);--btn-pure-primary-bg-hover:var(--color-brand1-9,#1274e7);--btn-pure-primary-bg-active:var(--color-brand1-9,#1274e7);--btn-pure-primary-border-color:var(--color-transparent,transparent);--btn-pure-primary-border-color-hover:var(--color-transparent,transparent);--btn-pure-primary-border-color-active:var(--color-transparent,transparent);--btn-pure-primary-border-style:var(--line-solid,solid);--btn-ghost-border-style:var(--line-solid,solid);--btn-ghost-dark-color:var(--color-white,#fff);--btn-ghost-dark-border-color:var(--color-white,#fff);--btn-ghost-dark-color-hover:var(--color-white,#fff);--btn-ghost-dark-bg:var(--color-transparent,transparent);--btn-ghost-dark-bg-opacity:0;--btn-ghost-dark-bg-hover-rgb:var(--color-white,#fff);--btn-ghost-dark-bg-hover-opacity:.8;--btn-ghost-dark-border-color-hover:var(--color-white,#fff);--btn-ghost-dark-color-disabled-rgb:var(--color-white,#fff);--btn-ghost-dark-color-disabled-opacity:.4;--btn-ghost-dark-bg-disabled:var(--color-transparent,transparent);--btn-ghost-dark-border-color-disabled-rgb:var(--color-white,#fff);--btn-ghost-dark-border-color-disabled-opacity:.4;--btn-ghost-light-color:var(--color-text1-4,#333);--btn-ghost-light-border-color:var(--color-text1-4,#333);--btn-ghost-light-bg:var(--color-transparent,transparent);--btn-ghost-light-bg-opacity:0;--btn-ghost-light-color-hover:var(--color-text1-2,#999);--btn-ghost-light-border-color-hover:var(--color-text1-4,#333);--btn-ghost-light-bg-hover-rgb:var(--color-black,#000);--btn-ghost-light-bg-hover-opacity:.92;--btn-ghost-light-color-disabled-rgb:var(--color-black,#000);--btn-ghost-light-color-disabled-opacity:.1;--btn-ghost-light-bg-disabled:var(--color-transparent,transparent);--btn-ghost-light-border-color-disabled-rgb:var(--color-black,#000);--btn-ghost-light-border-color-disabled-opacity:.1;--btn-warning-border-style:var(--line-solid,solid);--btn-warning-primary-color:var(--color-white,#fff);--btn-warning-primary-color-hover:var(--color-white,#fff);--btn-warning-primary-color-active:var(--color-white,#fff);--btn-warning-primary-border-color:var(--color-error-3,#d23c26);--btn-warning-primary-border-color-hover:var(--color-error-4,#b7321e);--btn-warning-primary-border-color-active:var(--color-error-4,#b7321e);--btn-warning-primary-bg:var(--color-error-3,#d23c26);--btn-warning-primary-bg-hover:var(--color-error-4,#b7321e);--btn-warning-primary-bg-active:var(--color-error-4,#b7321e);--btn-warning-primary-color-disabled:var(--color-text1-1,#ccc);--btn-warning-primary-border-color-disabled:var(--color-line1-2,#e6e6e6);--btn-warning-primary-bg-disabled:var(--color-fill1-1,#fafafa);--btn-warning-normal-color:var(--color-error-3,#d23c26);--btn-warning-normal-color-hover:var(--color-white,#fff);--btn-warning-normal-color-active:var(--color-white,#fff);--btn-warning-normal-border-color:var(--color-error-3,#d23c26);--btn-warning-normal-border-color-hover:var(--color-error-4,#b7321e);--btn-warning-normal-border-color-active:var(--color-error-4,#b7321e);--btn-warning-normal-bg:var(--color-white,#fff);--btn-warning-normal-bg-hover:var(--color-error-4,#b7321e);--btn-warning-normal-bg-active:var(--color-error-4,#b7321e);--btn-warning-normal-color-disabled:var(--color-text1-1,#ccc);--btn-warning-normal-border-color-disabled:var(--color-line1-1,#eee);--btn-warning-normal-bg-disabled:var(--color-fill1-1,#fafafa);--btn-text-primary-color:var(--color-link-1,#298dff);--btn-text-primary-color-hover:var(--color-brand1-9,#1274e7);--btn-text-disabled-color:var(--color-text1-1,#ccc);--btn-text-loading-color:var(--color-text1-4,#333);--btn-text-secondary-color:var(--color-text1-3,#666);--btn-text-secondary-color-hover:var(--color-brand1-6,#209bfa);--btn-text-normal-color:var(--color-text1-4,#333);--btn-text-normal-color-hover:var(--color-brand1-6,#209bfa);--btn-text-size-s-height:var(--s-4,16px);--btn-text-size-s-font:var(--font-size-caption,12px);--btn-text-icon-size-s:var(--icon-s,16px);--btn-text-icon-s-margin:var(--s-1,4px);--btn-text-size-m-height:var(--s-5,20px);--btn-text-size-m-font:var(--font-size-body-1,14px);--btn-text-icon-size-m:var(--icon-m,20px);--btn-text-icon-m-margin:var(--s-1,4px);--btn-text-size-l-height:var(--s-6,24px);--btn-text-size-l-font:var(--font-size-body-2,14px);--btn-text-icon-size-l:var(--icon-l,24px);--btn-text-icon-l-margin:var(--s-1,4px);--tag-size-m-height:var(--s-8,32px);--tag-size-s-height:var(--s-6,24px);--tag-size-l-icon-font:var(--icon-s,16px);--tag-size-m-icon-font:var(--icon-xs,12px);--tag-size-l-tick-icon-size:var(--icon-s,16px);--tag-size-l-height:var(--s-10,40px);--tag-size-l-spacing:var(--s-4,16px);--tag-size-m-spacing:var(--s-3,12px);--tag-size-s-spacing:var(--s-2,8px);--tag-size-l-padding-lr:var(--s-4,16px);--tag-size-m-padding-lr:var(--s-3,12px);--tag-size-s-padding-lr:var(--s-2,8px);--tag-corner-radius:var(--corner-1,3px);--tag-checkable-corner-radius:var(--corner-1,3px);--tag-border-width:var(--line-1,1px);--tag-shadow:var(--shadow-zero,none);--tag-size-l-text-size:var(--font-size-subhead,16px);--tag-size-m-text-size:var(--font-size-body-2,14px);--tag-size-s-text-size:var(--font-size-caption,12px);--tag-size-s-content-min-width:var(--s-7,28px);--tag-size-m-content-min-width:var(--s-10,40px);--tag-size-l-content-min-width:var(--s-12,48px);--tag-size-s-icon-font:var(--icon-xxs,8px);--tag-size-m-tick-icon-size:var(--icon-xs,12px);--tag-size-s-tick-icon-size:var(--icon-xxs,8px);--tag-size-l-tick-icon-bg-size:var(--s-9,36px);--tag-size-m-tick-icon-bg-size:var(--s-7,28px);--tag-size-s-tick-icon-bg-size:var(--s-5,20px);--tag-normal-text-color:var(--color-text1-4,#333);--tag-fill-text-color:var(--color-text1-3,#666);--tag-closable-normal-icon-color:var(--color-white,#fff);--tag-closable-normal-icon-color-hover:var(--color-white,#fff);--tag-closable-normal-icon-color-disabled:var(--color-white,#fff);--tag-closable-normal-bg:var(--color-line1-3,#ddd);--tag-closable-normal-bg-hover:var(--color-line1-4,#ccc);--tag-closable-normal-bg-disabled:var(--color-line1-1,#eee);--tag-closable-bordered-text-color:var(--color-text1-3,#666);--tag-closable-bordered-border-color:var(--color-line1-3,#ddd);--tag-closable-bordered-bg:var(--color-transparent,transparent);--tag-closable-bordered-text-color-hover:var(--color-text1-4,#333);--tag-closable-bordered-border-color-hover:var(--color-line1-4,#ccc);--tag-closable-bordered-bg-hover:var(--color-transparent,transparent);--tag-closable-bordered-tail-color:var(--color-text1-3,#666);--tag-closable-bordered-tail-color-hover:var(--color-text1-4,#333);--tag-closable-bordered-tail-color-disabled:var(--color-text1-1,#ccc);--tag-closable-bordered-border-color-disabled:var(--color-line1-1,#eee);--tag-closable-bordered-text-color-disabled:var(--color-text1-1,#ccc);--tag-closable-bordered-bg-disabled:var(--color-transparent,transparent);--tag-fill-tail-color:var(--color-text1-3,#666);--tag-fill-border-color:var(--color-fill1-3,#f5f5f5);--tag-fill-border-color-hover:var(--color-fill1-4,#f2f2f2);--tag-fill-text-color-disabled:var(--color-text1-1,#ccc);--tag-fill-border-color-disabled:var(--color-fill1-1,#fafafa);--tag-fill-bg-color-disabled:var(--color-fill1-1,#fafafa);--tag-fill-tail-color-disabled:var(--color-text1-1,#ccc);--tag-bordered-text-color:var(--color-text1-3,#666);--tag-bordered-tail-color:var(--color-text1-3,#666);--tag-secondary-text-color:var(--color-brand1-6,#209bfa);--tag-normal-text-color-hover:var(--color-brand1-6,#209bfa);--tag-fill-text-color-hover:var(--color-text1-4,#333);--tag-fill-tail-color-hover:var(--color-text1-4,#333);--tag-bordered-text-color-hover:var(--color-text1-4,#333);--tag-bordered-tail-color-hover:var(--color-text1-4,#333);--tag-bordered-tail-color-disabled:var(--color-text1-1,#ccc);--tag-bordered-text-color-disabled:var(--color-text1-1,#ccc);--tag-bordered-border-color-disabled:var(--color-line1-1,#eee);--tag-bordered-bg-disabled:var(--color-fill1-1,#fafafa);--tag-secondary-text-color-hover:var(--color-brand1-9,#1274e7);--tag-bordered-border-color:var(--color-line1-3,#ddd);--tag-secondary-border-color:var(--color-brand1-6,#209bfa);--tag-checkable-normal-bg-selected:var(--color-brand1-6,#209bfa);--tag-checkable-secondary-bg-selected:var(--color-brand1-6,#209bfa);--tag-bordered-border-color-hover:var(--color-line1-4,#ccc);--tag-secondary-border-color-hover:var(--color-brand1-9,#1274e7);--tag-checkable-normal-bg-selected-hover:var(--color-brand1-9,#1274e7);--tag-checkable-secondary-bg-selected-hover:var(--color-brand1-9,#1274e7);--tag-fill-bg-color:var(--color-fill1-3,#f5f5f5);--tag-primary-background-color:var(--color-brand1-6,#209bfa);--tag-bordered-bg:var(--color-transparent,transparent);--tag-secondary-bg:var(--color-transparent,transparent);--tag-fill-bg-color-hover:var(--color-fill1-4,#f2f2f2);--tag-bordered-bg-hover:var(--color-transparent,transparent);--tag-secondary-bg-hover:var(--color-transparent,transparent);--tag-text-color-disabled:var(--color-text1-1,#ccc);--tag-border-color-disabled:var(--color-line1-1,#eee);--tag-checkable-fill-text-color:var(--color-text1-3,#666);--tag-checkable-fill-bg-color:var(--color-fill1-3,#f5f5f5);--tag-checkable-fill-border-color:var(--color-fill1-3,#f5f5f5);--tag-checkable-fill-text-color-hover:var(--color-text1-4,#333);--tag-checkable-fill-bg-color-hover:var(--color-fill1-4,#f2f2f2);--tag-checkable-fill-border-color-hover:var(--color-fill1-4,#f2f2f2);--tag-checkable-fill-tail-color:var(--color-text1-3,#666);--tag-checkable-fill-tail-color-hover:var(--color-text1-4,#333);--tag-checkable-fill-tail-color-disabled:var(--color-text1-1,#ccc);--tag-checkable-fill-text-color-disabled:var(--color-text1-1,#ccc);--tag-checkable-fill-border-color-disabled:var(--color-fill1-1,#fafafa);--tag-checkable-fill-bg-color-disabled:var(--color-fill1-1,#fafafa);--tag-checkable-normal-text-color:var(--color-text1-3,#666);--tag-checkable-normal-border-color:var(--color-line1-3,#ddd);--tag-checkable-normal-bg:var(--color-transparent,transparent);--tag-checkable-normal-text-color-hover:var(--color-text1-4,#333);--tag-checkable-normal-border-color-hover:var(--color-line1-3,#ddd);--tag-checkable-normal-bg-hover:var(--color-transparent,transparent);--tag-checkable-normal-text-selected-disabled:var(--color-text1-1,#ccc);--tag-checkable-normal-border-selected-disabled:var(--color-line1-1,#eee);--tag-checkable-normal-bg-selected-disabled:var(--color-fill1-1,#fafafa);--tag-checkable-normal-tick-bg-selected-disabled:var(--color-line1-1,#eee);--tag-checkable-primary-text-color:var(--color-white,#fff);--tag-checkable-primary-bg-color:var(--color-brand1-6,#209bfa);--tag-checkable-primary-border-color:var(--color-brand1-6,#209bfa);--tag-checkable-primary-text-color-disabled:var(--color-text1-1,#ccc);--tag-checkable-primary-text-color-hover:var(--color-white,#fff);--tag-checkable-primary-bg-color-hover:var(--color-brand1-9,#1274e7);--tag-checkable-primary-border-color-hover:var(--color-brand1-9,#1274e7);--tag-checkable-primary-border-color-disabled:var(--color-fill1-1,#fafafa);--tag-checkable-primary-bg-color-disabled:var(--color-fill1-1,#fafafa);--tag-checkable-primary-tail-color:var(--color-white,#fff);--tag-checkable-primary-tail-color-hover:var(--color-white,#fff);--tag-checkable-secondary-bg-selected-disabled:var(--color-line1-1,#eee);--tag-checkable-normal-icon-color-selected:var(--color-white,#fff);--tag-checkable-normal-icon-color-selected-hover:var(--color-white,#fff);--tag-checkable-normal-icon-color-selected-disabled:var(--color-white,#fff);--tag-checkable-secondary-icon-color-selected:var(--color-white,#fff);--tag-checkable-secondary-icon-color-selected-hover:var(--color-white,#fff);--tag-checkable-secondary-icon-color-selected-disabled:var(--color-white,#fff);--tag-closable-primary-fill-text-color:var(--color-text1-3,#666);--tag-closable-primary-fill-border-color:var(--color-fill1-3,#f5f5f5);--tag-closable-primary-fill-bg-color:var(--color-fill1-3,#f5f5f5);--tag-closable-primary-fill-text-color-hover:var(--color-text1-4,#333);--tag-closable-primary-fill-border-color-hover:var(--color-fill1-4,#f2f2f2);--tag-closable-primary-fill-bg-color-hover:var(--color-fill1-4,#f2f2f2);--tag-closable-primary-fill-text-color-disabled:var(--color-text1-1,#ccc);--tag-closable-primary-fill-border-color-disabled:var(--color-fill1-1,#fafafa);--tag-closable-primary-fill-bg-color-disabled:var(--color-fill1-1,#fafafa);--input-placeholder-color:var(--color-text1-1,#ccc);--input-text-color:var(--color-text1-4,#333);--input-border-color:var(--color-line1-3,#ddd);--input-label-color:var(--color-text1-3,#666);--input-hover-border-color:var(--color-line1-4,#ccc);--input-hover-bg-color:var(--color-white,#fff);--input-focus-border-color:var(--color-brand1-6,#209bfa);--input-focus-bg-color:var(--color-white,#fff);--input-focus-shadow-spread:var(--line-2,2px);--input-border-width:var(--line-1,1px);--input-bg-color:var(--color-white,#fff);--input-disabled-color:var(--color-text1-1,#ccc);--input-disabled-border-color:var(--color-line1-1,#eee);--input-disabled-bg-color:var(--color-fill1-1,#fafafa);--input-multiple-padding-lr:var(--s-2,8px);--input-multiple-padding-tb:var(--s-1,4px);--input-multiple-font-size:var(--font-size-body-1,14px);--input-multiple-corner:var(--corner-1,3px);--input-addon-bg-color:var(--color-fill1-2,#f9f9f9);--input-addon-text-color:var(--color-text1-2,#999);--input-addon-padding:var(--s-2,8px);--input-l-padding:var(--s-3,12px);--input-l-label-padding-left:var(--s-3,12px);--input-l-icon-padding-right:var(--s-2,8px);--input-m-padding:var(--s-2,8px);--input-m-label-padding-left:var(--s-2,8px);--input-m-icon-padding-right:var(--s-2,8px);--input-s-padding:var(--s-1,4px);--input-s-label-padding-left:var(--s-2,8px);--input-s-icon-padding-right:var(--s-1,4px);--input-feedback-warning-border-color:var(--color-warning-3,#f1c826);--input-feedback-warning-bg-color:var(--color-white,#fff);--input-feedback-warning-color:var(--color-warning-3,#f1c826);--input-feedback-warning-icon:var(--icon-content-warning,"");--input-feedback-success-color:var(--color-success-3,#1ad78c);--input-feedback-success-icon:var(--icon-content-success-filling,"");--input-feedback-loading-color:var(--color-notice-3,#298dff);--input-feedback-loading-icon:var(--icon-content-loading,"");--input-feedback-error-color:var(--input-text-color,#333);--input-feedback-error-border-color:var(--color-error-3,#d23c26);--input-feedback-error-bg-color:var(--color-white,#fff);--input-maxlen-error-color:var(--color-error-3,#d23c26);--input-maxlen-warning-color:var(--color-warning-3,#f1c826);--input-maxlen-color:var(--color-text1-2,#999);--input-maxlen-font-size:var(--font-size-caption,12px);--input-hint-color:var(--color-text1-2,#999);--input-hint-hover-color:var(--color-text1-3,#666);--input-feedback-clear-icon:var(--icon-content-delete-filling,"");--table-row-hover-bg:var(--color-fill1-1,#fafafa);--table-normal-border-width:var(--line-1,1px);--table-th-font-size:var(--font-size-body-1,14px);--table-th-font-weight:var(--font-weight-2,normal);--table-sort-icon-size:var(--icon-xs,12px);--table-filter-icon-size:var(--icon-xs,12px);--table-body-font-size:var(--font-size-body-1,14px);--table-empty-padding:var(--s-8,32px);--table-expanded-icon-size:var(--icon-xs,12px);--table-tree-expanded-icon-size:var(--icon-xs,12px);--table-cell-padding-top:var(--s-3,12px);--table-cell-padding-left:var(--s-4,16px);--table-header-padding-top:var(--s-3,12px);--table-header-padding-left:var(--s-4,16px);--table-header-icon-margin-left:var(--s-2,8px);--table-header-corner-top:var(--corner-zero,0);--table-header-corner-bottom:var(--corner-zero,0);--table-size-s-cell-padding-top:var(--s-2,8px);--table-size-s-cell-padding-left:var(--s-2,8px);--table-size-s-header-padding-top:var(--s-2,8px);--table-size-s-header-padding-left:var(--s-2,8px);--table-group-split:var(--s-2,8px);--table-group-header-corner-top:var(--corner-zero,0);--table-group-header-corner-bottom:var(--corner-zero,0);--table-group-footer-corner-top:var(--corner-zero,0);--table-group-footer-corner-bottom:var(--corner-zero,0);--table-normal-border-color:var(--color-line1-2,#e6e6e6);--table-normal-border-style:var(--line-solid,solid);--table-th-bg:var(--color-fill1-3,#f5f5f5);--table-th-color:var(--color-text1-4,#333);--table-sort-color:var(--color-text1-4,#333);--table-group-th-bg:var(--color-fill1-3,#f5f5f5);--table-group-th-color:var(--color-text1-4,#333);--table-row-bg:var(--color-white,#fff);--table-row-color:var(--color-text1-4,#333);--table-td-gray:var(--color-fill1-1,#fafafa);--table-td-normal:var(--color-white,#fff);--table-empty-color:var(--color-line1-4,#ccc);--table-group-footer-bg:var(--color-fill1-3,#f5f5f5);--table-group-footer-color:var(--color-text1-4,#333);--table-row-hover-color:var(--color-text1-4,#333);--table-row-selected-bg:var(--color-fill1-2,#f9f9f9);--table-row-selected-color:var(--color-text1-4,#333);--table-sort-color-current:var(--color-brand1-6,#209bfa);--table-expanded-ctrl-disabled-color:var(--color-text1-2,#999);--table-tree-fold-icon-content:var(--icon-content-arrow-right,"");--table-tree-unfold-icon-content:var(--icon-content-arrow-down,"");--table-expand-fold-icon-content:var(--icon-content-add,"");--table-expand-unfold-icon-content:var(--icon-content-minus,"");--balloon-primary-color-bg:var(--color-brand1-1,#add9ff);--balloon-primary-color-border:var(--color-brand1-6,#209bfa);--balloon-tooltip-color-bg:var(--color-text1-4,#333);--balloon-tooltip-color-border:var(--color-transparent,transparent);--balloon-tooltip-color:var(--color-fill1-1,#fafafa);--balloon-size-close:var(--icon-s,16px);--balloon-size-max-width:300px;--balloon-size-padding-right:var(--s-4,16px);--balloon-size-padding-closable-right:var(--s-10,40px);--balloon-size-padding-top:var(--s-4,16px);--balloon-size-header-margin-bottom:var(--s-2,8px);--balloon-title-font-size:var(--font-size-subhead,16px);--balloon-title-font-weight:var(--font-weight-3,bold);--balloon-content-font-size:var(--font-size-body-1,14px);--balloon-content-font-weight:var(--font-weight-2,normal);--balloon-normal-border-width:var(--line-1,1px);--balloon-primary-border-width:var(--line-1,1px);--balloon-tooltip-border-width:var(--line-1,1px);--balloon-tooltip-content-font-size:var(--font-size-body-1,14px);--balloon-tooltip-content-font-weight:var(--font-weight-2,normal);--balloon-size-close-margin-top:var(--s-3,12px);--balloon-size-close-margin-right:var(--s-3,12px);--balloon-size-arrow-size:var(--s-3,12px);--balloon-size-arrow-margin:var(--s-3,12px);--balloon-tooltip-size-padding-top:var(--s-2,8px);--balloon-tooltip-size-padding-right:var(--s-2,8px);--balloon-tooltip-size-padding-bottom:var(--s-2,8px);--balloon-tooltip-size-padding-left:var(--s-2,8px);--balloon-border-style:var(--line-solid,solid);--balloon-corner:var(--corner-1,3px);--balloon-normal-color-bg:var(--color-white,#fff);--balloon-normal-color-border:var(--color-line1-2,#e6e6e6);--balloon-normal-shadow:var(--shadow-2-down,0px 4px 8px 0px rgba(0,0,0,0.12));--balloon-normal-color:var(--color-text1-4,#333);--balloon-normal-color-close:var(--color-text1-2,#999);--balloon-normal-color-close-hover:var(--color-text1-3,#666);--balloon-primary-shadow:var(--shadow-1-down,0px 1px 3px 0px rgba(0,0,0,0.12));--balloon-primary-color:var(--color-text1-4,#333);--balloon-primary-color-close:var(--color-text1-2,#999);--balloon-primary-color-close-hover:var(--color-text1-4,#333);--balloon-tooltip-shadow:var(--shadow-zero,none);--balloon-tooltip-border-style:var(--line-solid,solid);--dialog-border-width:var(--line-1,1px);--dialog-corner:var(--corner-2,6px);--dialog-close-size:var(--icon-s,16px);--dialog-title-font-size:var(--font-size-subhead,16px);--dialog-title-font-weight:var(--font-weight-2,normal);--dialog-title-padding-top:var(--s-3,12px);--dialog-title-padding-bottom:var(--s-3,12px);--dialog-title-padding-left-right:var(--s-5,20px);--dialog-title-border-width:var(--line-zero,0px);--dialog-message-content-padding-top:var(--s-5,20px);--dialog-message-content-padding-bottom:var(--s-5,20px);--dialog-message-content-padding-left-right:var(--s-5,20px);--dialog-content-font-size:var(--font-size-body-1,14px);--dialog-content-padding-top:var(--s-5,20px);--dialog-content-padding-bottom:var(--s-5,20px);--dialog-content-padding-left-right:var(--s-5,20px);--dialog-footer-border-width:var(--line-zero,0px);--dialog-footer-padding-top:var(--s-3,12px);--dialog-footer-padding-bottom:var(--s-3,12px);--dialog-footer-padding-left-right:var(--s-5,20px);--dialog-footer-button-spacing:var(--s-1,4px);--dialog-close-top:var(--s-3,12px);--dialog-close-right:var(--s-3,12px);--dialog-close-width:var(--s-4,16px);--dialog-bg:var(--color-white,#fff);--dialog-border-color:var(--color-line1-2,#e6e6e6);--dialog-border-style:var(--line-solid,solid);--dialog-shadow:var(--shadow-2-down,0px 4px 8px 0px rgba(0,0,0,0.12));--dialog-title-color:var(--color-text1-4,#333);--dialog-title-bg-color:var(--color-transparent,transparent);--dialog-title-border-color:var(--color-transparent,transparent);--dialog-content-color:var(--color-text1-3,#666);--dialog-footer-bg-color:var(--color-transparent,transparent);--dialog-footer-border-color:var(--color-transparent,transparent);--dialog-close-color:var(--color-text1-2,#999);--dialog-close-color-hovered:var(--color-text1-4,#333);--dialog-close-bg-hovered:var(--color-transparent,transparent);--progress-circle-size-l:var(--s-33,132px);--progress-line-height-size-l:var(--s-3,12px);--progress-line-height-size-m:var(--s-2,8px);--progress-line-height-size-s:var(--s-1,4px);--progress-line-underlay-border-width:var(--line-1,1px);--progress-line-font-l:var(--font-size-body-1,14px);--progress-line-font-m:var(--font-size-caption,12px);--progress-line-font-s:var(--font-size-caption,12px);--progress-line-underlay-color:var(--color-fill1-3,#f5f5f5);--progress-line-underlay-border-color:var(--color-line1-2,#e6e6e6);--progress-line-radius-l:var(--corner-3,12px);--progress-line-radius-m:var(--corner-3,12px);--progress-line-radius-s:var(--corner-3,12px);--progress-line-font-color:var(--color-text1-4,#333);--progress-line-normal-color:var(--color-brand1-6,#209bfa);--progress-line-error-color:var(--color-error-3,#d23c26);--progress-line-success-color:var(--color-success-3,#1ad78c);--progress-line-started-color:var(--color-error-3,#d23c26);--progress-line-middle-color:var(--color-warning-3,#f1c826);--progress-line-finishing-color:var(--color-success-3,#1ad78c);--progress-circle-size-m:var(--s-29,116px);--progress-circle-size-s:var(--s-25,100px);--progress-circle-underlay-width:var(--s-2,8px);--progress-circle-overlay-width:var(--s-2,8px);--progress-circle-font-l:var(--font-size-display-1,36px);--progress-circle-font-m:var(--font-size-headline,24px);--progress-circle-font-s:var(--font-size-title,20px);--progress-circle-underlay-color:var(--color-fill1-3,#f5f5f5);--progress-circle-text-color:var(--color-text1-4,#333);--progress-circle-corner:round;--progress-circle-normal-color:var(--color-brand1-6,#209bfa);--progress-circle-error-color:var(--color-error-3,#d23c26);--progress-circle-success-color:var(--color-success-3,#1ad78c);--progress-circle-started-color:var(--color-error-3,#d23c26);--progress-circle-middle-color:var(--color-warning-3,#f1c826);--progress-circle-finishing-color:var(--color-success-3,#1ad78c);--radio-button-height-medium:var(--s-8,32px);--radio-width:var(--s-4,16px);--radio-circle-border-width:var(--line-1,1px);--radio-circle-size:var(--s-1,4px);--radio-font-margin-left:var(--s-1,4px);--radio-font-size:var(--font-size-body-1,14px);--radio-shadow:var(--shadow-zero,none);--radio-radius-size:var(--corner-circle,50%);--radio-bg-color:var(--color-white,#fff);--radio-hovered-bg-color:var(--color-brand1-1,#add9ff);--radio-checked-bg-color:var(--color-brand1-6,#209bfa);--radio-disabled-bg-color:var(--color-fill1-1,#fafafa);--radio-checked-hovered-bg-color:var(--color-brand1-9,#1274e7);--radio-checked-disabled-bg-color:var(--color-fill1-1,#fafafa);--radio-border-color:var(--color-line1-3,#ddd);--radio-hovered-border-color:var(--color-brand1-6,#209bfa);--radio-checked-border-color:var(--color-brand1-6,#209bfa);--radio-disabled-border-color:var(--color-line1-1,#eee);--radio-checked-disabled-border-color:var(--color-line1-1,#eee);--radio-checked-hovered-border-color:var(--color-transparent,transparent);--radio-checked-circle-color:var(--color-white,#fff);--radio-disabled-circle-color:var(--color-text1-1,#ccc);--radio-checked-hovered-circle-color:var(--color-white,#fff);--radio-checked-disabled-circle-color:var(--color-text1-1,#ccc);--radio-normal-font-color:var(--color-text1-4,#333);--radio-normal-font-color-disabled:var(--color-text1-1,#ccc);--radio-button-height-large:var(--s-10,40px);--radio-button-height-small:var(--s-5,20px);--radio-button-padding-large:var(--s-2,8px);--radio-button-padding-medium:var(--s-2,8px);--radio-button-padding-small:var(--s-2,8px);--radio-button-corner-large:var(--corner-1,3px);--radio-button-corner-medium:var(--corner-1,3px);--radio-button-corner-small:var(--corner-1,3px);--radio-button-font-size-large:var(--font-size-subhead,16px);--radio-button-font-size-medium:var(--font-size-body-1,14px);--radio-button-font-size-small:var(--font-size-caption,12px);--radio-button-bg-color:var(--color-white,#fff);--radio-button-bg-color-hovered:var(--color-fill1-2,#f9f9f9);--radio-button-bg-color-checked:var(--color-white,#fff);--radio-button-bg-color-disabled:var(--color-fill1-1,#fafafa);--radio-button-bg-color-checked-disabled:var(--color-fill1-2,#f9f9f9);--radio-button-border-color:var(--color-line1-3,#ddd);--radio-button-border-color-hovered:var(--color-line1-4,#ccc);--radio-button-border-color-checked:var(--color-brand1-6,#209bfa);--radio-button-border-color-disabled:var(--color-line1-1,#eee);--radio-button-border-color-checked-disabled:var(--color-line1-1,#eee);--radio-button-font-color:var(--color-text1-4,#333);--radio-button-font-color-hovered:var(--color-text1-4,#333);--radio-button-font-color-checked:var(--color-brand1-6,#209bfa);--radio-button-font-color-disabled:var(--color-text1-1,#ccc);--radio-button-font-color-checked-disabled:var(--color-text1-1,#ccc);--tab-nav-tab-icon-size-m:var(--icon-s,16px);--tab-item-padding-tb-size-m:var(--s-5,20px);--tab-nav-scroll-padding-right-m:var(--s-15,60px);--tab-nav-scroll-padding-right-s:var(--s-14,56px);--tab-nav-tab-icon-size-s:var(--icon-xs,12px);--tab-nav-close-icon-size-m:var(--icon-xs,12px);--tab-nav-close-icon-size-s:var(--icon-xxs,8px);--tab-nav-close-icon-padding-l-size-m:var(--s-2,8px);--tab-nav-close-icon-padding-l-size-s:var(--s-2,8px);--tab-nav-arrow-left-positon-right:var(--s-8,32px);--tab-nav-arrow-right-positon-right:var(--s-2,8px);--tab-nav-arrow-down-positon-right:var(--s-2,8px);--tab-item-padding-tb-size-s:var(--s-2,8px);--tab-item-padding-lr-size-m:var(--s-4,16px);--tab-item-padding-lr-size-s:var(--s-3,12px);--tab-item-text-size-m:var(--font-size-body-1,14px);--tab-item-text-size-s:var(--font-size-caption,12px);--tab-close-icon-color:var(--color-text1-3,#666);--tab-close-icon-color-hover:var(--color-text1-4,#333);--tab-close-icon-color-selected:var(--color-brand1-6,#209bfa);--tab-close-icon-color-disabled:var(--color-line1-2,#e6e6e6);--tab-item-font-weight-selected:var(--font-weight-2,normal);--tab-nav-arrow-color-normal:var(--color-text1-3,#666);--tab-nav-arrow-color-hover:var(--color-text1-4,#333);--tab-nav-arrow-color-disabled:var(--color-line1-2,#e6e6e6);--tab-pure-divider-line-width:var(--line-1,1px);--tab-pure-ink-bar-width:var(--line-2,2px);--tab-pure-ink-bar-padding-l:var(--s-zero,0px);--tab-pure-text-color-normal:var(--color-text1-3,#666);--tab-pure-bg-color:var(--color-transparent,transparent);--tab-pure-text-color-hover:var(--color-text1-4,#333);--tab-pure-text-color-selected:var(--color-brand1-6,#209bfa);--tab-pure-text-color-disabled:var(--color-line1-2,#e6e6e6);--tab-pure-ink-bar-color:var(--color-brand1-6,#209bfa);--tab-pure-divider-border-color:var(--color-line1-2,#e6e6e6);--tab-pure-divider-shadow:var(--shadow-zero,none);--tab-wrapped-border-line-style:var(--line-solid,solid);--tab-wrapped-border-line-width:var(--line-1,1px);--tab-wrapped-border-side-width:var(--line-1,1px);--tab-wrapped-tab-corner-radius:var(--corner-1,3px);--tab-wrapped-tab-margin-right:var(--s-1,4px);--tab-wrapped-tab-margin-bottom:var(--s-1,4px);--tab-wrapped-ink-bar-width:var(--line-2,2px);--tab-wrapped-ink-bar-padding-l:var(--s-zero,0px);--tab-wrapped-bar-bg-color:var(--color-transparent,transparent);--tab-wrapped-ink-bar-color:var(--color-brand1-6,#209bfa);--tab-wrapped-nav-item-border-color-active:var(--color-brand1-6,#209bfa);--tab-wrapped-border-line-color:var(--color-line1-2,#e6e6e6);--tab-wrapped-content-border-line-width:var(--line-1,1px);--tab-wrapped-content-border-line-style:var(--line-solid,solid);--tab-wrapped-content-border-line-color:var(--color-line1-2,#e6e6e6);--tab-wrapped-text-color:var(--color-text1-3,#666);--tab-wrapped-text-color-hover:var(--color-text1-4,#333);--tab-wrapped-bg-color:var(--color-fill1-2,#f9f9f9);--tab-wrapped-bg-color-hover:var(--color-fill1-3,#f5f5f5);--tab-wrapped-border-line-color-hover:var(--color-line1-3,#ddd);--tab-wrapped-text-color-selected:var(--color-brand1-6,#209bfa);--tab-wrapped-text-color-disabled:var(--color-text1-1,#ccc);--tab-wrapped-bg-color-selected:var(--color-white,#fff);--tab-wrapped-bg-color-disabled:var(--color-fill1-1,#fafafa);--tab-capsule-text-color:var(--color-text1-4,#333);--tab-capsule-text-color-hover:var(--color-text1-4,#333);--tab-capsule-text-color-selected:var(--color-white,#fff);--tab-capsule-text-color-disabled:var(--color-text1-1,#ccc);--tab-capsule-bg-color:var(--color-fill1-2,#f9f9f9);--tab-capsule-bg-color-hover:var(--color-fill1-3,#f5f5f5);--tab-capsule-bg-color-selected:var(--color-brand1-6,#209bfa);--tab-capsule-bg-color-disabled:var(--color-fill1-1,#fafafa);--tab-capsule-tab-border-line-color:var(--color-line1-3,#ddd);--tab-capsule-tab-border-line-color-hover:var(--color-line1-3,#ddd);--tab-capsule-tab-border-line-color-active:var(--color-brand1-6,#209bfa);--tab-capsule-tab-border-line-color-disabled:var(--color-line1-1,#eee);--tab-capsule-corner-radius:var(--corner-1,3px);--tab-capsule-tab-border-line-width:var(--line-1,1px);--tab-capsule-tab-border-line-style:var(--line-solid,solid);--tab-text-item-sep-width:var(--line-1,1px);--tab-text-item-sep-height:var(--s-2,8px);--tab-text-item-sep-color:var(--color-line1-2,#e6e6e6);--tab-text-text-color-normal:var(--color-text1-3,#666);--tab-text-text-color-hover:var(--color-text1-4,#333);--tab-text-text-color-selected:var(--color-brand1-6,#209bfa);--tab-text-text-color-disabled:var(--color-text1-1,#ccc);--tab-icon-dropdown-content:var(--icon-content-arrow-down,"");--tab-icon-prev-content:var(--icon-content-arrow-left,"");--tab-icon-next-content:var(--icon-content-arrow-right,"");--pagination-item-current-hover-border-color:var(--color-brand1-6,#209bfa);--pagination-item-current-hover-color:var(--color-brand1-6,#209bfa);--pagination-item-current-hover-bg:var(--color-white,#fff);--pagination-current-color:var(--color-brand1-6,#209bfa);--pagination-item-split:var(--s-1,4px);--pagination-item-padding:10px;--pagination-item-border-style:var(--line-solid,solid);--pagination-item-border-width:var(--line-1,1px);--pagination-item-corner:var(--corner-1,3px);--pagination-ellipsis-size:var(--icon-xs,12px);--pagination-ellipsis-margin:var(--s-2,8px);--pagination-current-font-size:var(--font-size-body-1,14px);--pagination-total-font-size:var(--font-size-body-1,14px);--pagination-jump-font-size:var(--font-size-body-1,14px);--pagination-input-width:var(--s-9,36px);--pagination-input-margin:var(--s-1,4px);--pagination-size-selector-title-margin-right:var(--s-1,4px);--pagination-size-selector-number-padding:var(--s-3,12px);--pagination-large-item-split:var(--s-2,8px);--pagination-large-item-padding:15px;--pagination-large-item-border-width:var(--line-1,1px);--pagination-large-item-corner:var(--corner-1,3px);--pagination-large-ellipsis-size:var(--icon-s,16px);--pagination-large-current-font-size:var(--font-size-subhead,16px);--pagination-large-total-font-size:var(--font-size-subhead,16px);--pagination-large-input-width:var(--s-12,48px);--pagination-large-jump-font-size:var(--font-size-subhead,16px);--pagination-large-size-selector-number-padding:var(--s-4,16px);--pagination-small-item-split:var(--s-1,4px);--pagination-small-item-padding:6px;--pagination-small-item-border-width:var(--line-1,1px);--pagination-small-item-corner:var(--corner-1,3px);--pagination-small-ellipsis-size:var(--icon-xs,12px);--pagination-small-current-font-size:var(--font-size-caption,12px);--pagination-small-total-font-size:var(--font-size-caption,12px);--pagination-small-input-width:var(--s-7,28px);--pagination-small-jump-font-size:var(--font-size-caption,12px);--pagination-small-size-selector-number-padding:var(--s-2,8px);--pagination-ellipsis-color:var(--color-text1-2,#999);--pagination-total-color:var(--color-text1-4,#333);--pagination-jump-color:var(--color-text1-2,#999);--pagination-size-selector-title-color:var(--color-text1-2,#999);--pagination-size-selector-filter-color:var(--color-text1-3,#666);--pagination-size-selector-filter-current-color:var(--color-brand1-6,#209bfa);--pagination-item-border-color:var(--color-line1-3,#ddd);--pagination-item-shadow:var(--shadow-zero,none);--pagination-item-color:var(--color-text1-4,#333);--pagination-item-bg:var(--color-white,#fff);--pagination-item-current-border-color:var(--color-brand1-6,#209bfa);--pagination-item-current-shadow:var(--shadow-zero,none);--pagination-item-current-color:var(--color-white,#fff);--pagination-item-current-bg:var(--color-brand1-6,#209bfa);--pagination-item-hover-border-color:var(--color-line1-4,#ccc);--pagination-item-hover-shadow:var(--shadow-zero,none);--pagination-item-hover-color:var(--color-text1-4,#333);--pagination-item-hover-bg:var(--color-fill1-2,#f9f9f9);--pagination-arrow-color:var(--color-text1-3,#666);--pagination-icon-prev-content:var(--icon-content-arrow-left,"");--pagination-icon-next-content:var(--icon-content-arrow-right,"");--pagination-icon-ellipsis-content:var(--icon-content-ellipsis,"");--pagination-item-current-hover-shadow:var(--shadow-zero,none);--pagination-arrow-hover-color:var(--color-text1-4,#333);--pagination-arrow-hover-color-noboder:var(--color-brand1-6,#209bfa);--cascader-menu-icon-expand-size:var(--icon-m,20px);--cascader-menu-border-width:var(--line-1,1px);--cascader-menu-width:var(--s-auto,auto);--cascader-menu-min-width:var(--s-25,100px);--cascader-menu-height:var(--s-48,192px);--cascader-menu-border-color:var(--color-line1-2,#e6e6e6);--cascader-menu-border-radius:var(--corner-1,3px);--cascader-menu-icon-expand-color:var(--color-text1-3,#666);--cascader-menu-icon-hover-expand-color:var(--color-text1-4,#333);--cascader-menu-item-expanded-color:var(--color-text1-4,#333);--cascader-menu-item-expanded-background-color:var(--color-fill1-2,#f9f9f9);--tree-switch-arrow-size:var(--icon-m,20px);--tree-node-padding:var(--s-1,4px);--tree-node-title-margin:var(--s-1,4px);--tree-node-title-padding:var(--s-1,4px);--tree-node-title-font-size:var(--font-size-body-1,14px);--tree-switch-size:var(--s-4,16px);--tree-switch-icon-size:var(--icon-xxs,8px);--tree-switch-border-width:var(--line-1,1px);--tree-switch-margint-right:var(--s-2,8px);--tree-line-width:var(--line-1,1px);--tree-node-normal-color:var(--color-text1-4,#333);--tree-node-normal-background:var(--color-white,#fff);--tree-node-title-border-radius:var(--corner-1,3px);--tree-switch-arrow-color:var(--color-text1-2,#999);--tree-switcher-fold-icon-content:var(--icon-content-add,"");--tree-switcher-unfold-icon-content:var(--icon-content-minus,"");--tree-switch-icon-color:var(--color-text1-3,#666);--tree-switch-bg-color:var(--color-white,#fff);--tree-switch-border-color:var(--color-line1-3,#ddd);--tree-switch-corner:var(--corner-1,3px);--tree-line-color:var(--color-line1-3,#ddd);--tree-line-style:var(--line-solid,solid);--tree-node-hover-color:var(--color-text1-4,#333);--tree-node-hover-bg-color:var(--color-fill1-2,#f9f9f9);--tree-switch-hover-arrow-color:var(--color-text1-4,#333);--tree-switch-hover-icon-color:var(--color-text1-4,#333);--tree-switch-hover-bg-color:var(--color-fill1-2,#f9f9f9);--tree-switch-hover-border-color:var(--color-line1-4,#ccc);--tree-node-selected-color:var(--color-text1-4,#333);--tree-node-selected-background:var(--color-brand1-1,#add9ff);--tree-node-disabled-color:var(--color-text1-1,#ccc);--tree-node-disabled-background:var(--color-white,#fff);--tree-fold-icon-content:var(--icon-content-arrow-down,"");--tree-unfold-icon-content:var(--icon-reset,var(--icon-reset));--menu-icon-selected-size:var(--icon-s,16px);--menu-icon-size:var(--icon-m,20px);--menu-padding-ver-padding-lr:var(--s-zero,0px);--menu-padding-ver-padding-tb:var(--s-2,8px);--menu-padding-hoz-padding-lr:var(--s-zero,0px);--menu-padding-hoz-padding-tb:var(--s-2,8px);--menu-item-padding-ver-padding-l:var(--s-5,20px);--menu-item-padding-ver-padding-r:var(--s-5,20px);--menu-item-padding-hoz-padding-lr:var(--s-5,20px);--menu-line-height:var(--s-8,32px);--menu-font-size:var(--font-size-body-1,14px);--menu-submenu-title-size:var(--font-size-body-1,14px);--menu-padding-title-horizontal:var(--s-3,12px);--menu-divider-width:var(--line-1,1px);--menu-divider-margin-ver:var(--s-2,8px);--menu-divider-margin-hoz:var(--s-3,12px);--menu-icon-selected-right:var(--s-1,4px);--menu-hoz-icon-size:var(--icon-xs,12px);--menu-icon-margin:var(--s-1,4px);--menu-shadow:var(--shadow-1-down,0px 1px 3px 0px rgba(0,0,0,0.12));--menu-color:var(--color-text1-4,#333);--menu-divider-style:var(--line-solid,solid);--menu-divider-color:var(--color-line1-1,#eee);--menu-background:var(--color-white,#fff);--menu-arrow-color:var(--color-text1-3,#666);--menu-background-selected:var(--color-white,#fff);--menu-color-selected:var(--color-text1-4,#333);--menu-icon-selected-color:var(--color-brand1-6,#209bfa);--menu-background-hover:var(--color-fill1-2,#f9f9f9);--menu-color-hover:var(--color-text1-4,#333);--menu-arrow-color-hover:var(--color-text1-4,#333);--menu-icon-selected-hover-color:var(--color-brand1-6,#209bfa);--menu-color-disabled:var(--color-text1-1,#ccc);--menu-select-icon-content:var(--icon-content-select,"");--menu-fold-icon-content:var(--icon-content-arrow-down,"");--menu-unfold-icon-content:var(--icon-reset,var(--icon-reset));--menu-popupfold-icon-content:var(--icon-content-arrow-right,"");--nav-icon-self-size:var(--icon-m,20px);--nav-primary-item-hover-bg-color:var(--color-text1-4,#333);--nav-primary-item-selected-bg-color:var(--color-text1-4,#333);--nav-primary-sub-nav-selected-bg-color:var(--color-text1-4,#333);--nav-icon-self-margin:var(--s-3,12px);--nav-primary-sub-nav-hover-bg-color:var(--color-text1-4,#333);--nav-icon-only-font-size:var(--icon-m,20px);--nav-primary-text-color:var(--color-line1-3,#ddd);--nav-primary-sub-nav-text-color:var(--color-line1-3,#ddd);--nav-primary-sub-nav-hover-text-color:var(--color-line1-3,#ddd);--nav-ver-item-padding-lr:var(--s-4,16px);--nav-ver-sub-nav-font-size:var(--font-size-body-2,14px);--nav-ver-height:var(--s-13,52px);--nav-ver-item-margin-tb:var(--s-zero,0px);--nav-ver-sub-nav-height:var(--s-13,52px);--nav-primary-bg-color:var(--color-fill1-5,#222);--nav-primary-border-color:var(--color-fill1-5,#222);--nav-primary-sub-nav-bg-color:var(--color-fill1-6,#151515);--nav-primary-item-opened-bg-color:var(--color-fill1-5,#222);--nav-normal-text-color:var(--color-text1-3,#666);--nav-normal-sub-nav-bg-color:var(--color-fill1-1,#fafafa);--nav-normal-sub-nav-text-color:var(--color-text1-3,#666);--nav-normal-item-hover-text-color:var(--color-text1-4,#333);--nav-normal-item-hover-text-style:var(--font-weight-medium,500);--nav-normal-item-hover-active-color:var(--color-notice-4,#1b84e0);--nav-normal-sub-nav-hover-text-color:var(--color-notice-3,#298dff);--nav-normal-item-opened-text-color:var(--color-text1-4,#333);--nav-normal-sub-nav-selected-bg-color:var(--color-notice-1,#e4f3fe);--nav-normal-item-selected-bg-color:var(--color-notice-1,#e4f3fe);--nav-hoz-height:var(--s-11,44px);--nav-hoz-font-size:var(--font-size-body-1,14px);--nav-hoz-item-margin-tb:var(--s-zero,0px);--nav-hoz-item-margin-lr:var(--s-zero,0px);--nav-hoz-item-padding-lr:var(--s-5,20px);--nav-hoz-item-corner:var(--corner-zero,0);--nav-hoz-item-selected-active-line:var(--line-2,2px);--nav-hoz-item-hover-active-line:var(--line-zero,0px);--nav-ver-font-size:var(--font-size-body-1,14px);--nav-ver-item-margin-lr:var(--s-zero,0px);--nav-ver-item-corner:var(--corner-zero,0);--nav-ver-item-selected-active-line:var(--line-2,2px);--nav-ver-item-hover-active-line:var(--line-zero,0px);--nav-group-height:var(--s-10,40px);--nav-group-font-size:var(--font-size-body-1,14px);--nav-primary-border-width:var(--line-zero,0px);--nav-primary-text-style:var(--font-weight-2,normal);--nav-primary-shadow:var(--shadow-2,4px 4px 8px 0px rgba(0,0,0,0.12));--nav-primary-sub-nav-text-style:var(--font-weight-2,normal);--nav-primary-group-text-color:var(--color-text1-2,#999);--nav-primary-group-text-style:var(--font-weight-2,normal);--nav-primary-item-hover-text-color:var(--color-white,#fff);--nav-primary-item-hover-text-style:var(--font-weight-2,normal);--nav-primary-item-hover-active-color:var(--color-brand1-6,#209bfa);--nav-primary-item-selected-text-color:var(--color-white,#fff);--nav-primary-item-selected-text-style:var(--font-weight-3,bold);--nav-primary-item-childselected-bg-color:var(--color-transparent,transparent);--nav-primary-item-childselected-text-color:var(--color-white,#fff);--nav-primary-item-childselected-text-style:var(--font-weight-3,bold);--nav-primary-item-selected-active-color:var(--color-brand1-6,#209bfa);--nav-primary-sub-nav-selected-text-color:var(--color-white,#fff);--nav-primary-sub-nav-active-color:var(--color-brand1-6,#209bfa);--nav-primary-item-disabled-text-color:var(--color-text1-1,#ccc);--nav-primary-item-opened-text-color:var(--color-white,#fff);--nav-secondary-bg-color:var(--color-brand1-6,#209bfa);--nav-secondary-border-width:var(--line-zero,0px);--nav-secondary-border-color:var(--color-brand1-6,#209bfa);--nav-secondary-text-color:var(--color-white,#fff);--nav-secondary-text-style:var(--font-weight-2,normal);--nav-secondary-shadow:var(--shadow-2,4px 4px 8px 0px rgba(0,0,0,0.12));--nav-secondary-sub-nav-bg-color:var(--color-brand1-6,#209bfa);--nav-secondary-sub-nav-text-color:var(--color-white,#fff);--nav-secondary-sub-nav-text-style:var(--font-weight-2,normal);--nav-secondary-group-text-color:var(--color-white,#fff);--nav-secondary-group-text-style:var(--font-weight-2,normal);--nav-secondary-item-hover-bg-color:var(--color-brand1-9,#1274e7);--nav-secondary-item-hover-text-color:var(--color-white,#fff);--nav-secondary-item-hover-text-style:var(--font-weight-2,normal);--nav-secondary-item-hover-active-color:var(--color-brand1-9,#1274e7);--nav-secondary-sub-nav-hover-bg-color:var(--color-brand1-9,#1274e7);--nav-secondary-sub-nav-hover-text-color:var(--color-white,#fff);--nav-secondary-item-selected-bg-color:var(--color-brand1-9,#1274e7);--nav-secondary-item-selected-text-color:var(--color-white,#fff);--nav-secondary-item-selected-text-style:var(--font-weight-3,bold);--nav-secondary-item-childselected-bg-color:var(--color-transparent,transparent);--nav-secondary-item-childselected-text-color:var(--color-white,#fff);--nav-secondary-item-childselected-text-style:var(--font-weight-3,bold);--nav-secondary-item-selected-active-color:var(--color-brand1-9,#1274e7);--nav-secondary-sub-nav-selected-bg-color:var(--color-brand1-9,#1274e7);--nav-secondary-sub-nav-selected-text-color:var(--color-white,#fff);--nav-secondary-sub-nav-active-color:var(--color-brand1-6,#209bfa);--nav-secondary-item-disabled-text-color:var(--color-brand1-1,#add9ff);--nav-secondary-item-opened-bg-color:var(--color-transparent,transparent);--nav-secondary-item-opened-text-color:var(--color-white,#fff);--nav-normal-bg-color:var(--color-white,#fff);--nav-normal-border-color:var(--color-line1-1,#eee);--nav-normal-text-style:var(--font-weight-2,normal);--nav-normal-border-line:var(--line-1,1px);--nav-normal-shadow:var(--shadow-2,4px 4px 8px 0px rgba(0,0,0,0.12));--nav-normal-sub-nav-text-style:var(--font-weight-2,normal);--nav-normal-group-text-color:var(--color-text1-2,#999);--nav-normal-group-text-style:var(--font-weight-2,normal);--nav-normal-item-hover-bg-color:var(--color-white,#fff);--nav-normal-sub-nav-hover-bg-color:var(--color-fill1-2,#f9f9f9);--nav-normal-item-selected-text-color:var(--color-brand1-6,#209bfa);--nav-normal-item-selected-text-style:var(--font-weight-3,bold);--nav-normal-item-childselected-bg-color:var(--color-transparent,transparent);--nav-normal-item-childselected-text-color:var(--color-brand1-6,#209bfa);--nav-normal-item-childselected-text-style:var(--font-weight-2,normal);--nav-normal-item-selected-active-color:var(--color-brand1-6,#209bfa);--nav-normal-sub-nav-selected-text-color:var(--color-brand1-6,#209bfa);--nav-normal-sub-nav-active-color:var(--color-brand1-6,#209bfa);--nav-normal-item-disabled-text-color:var(--color-text1-2,#999);--nav-normal-item-opened-bg-color:var(--color-transparent,transparent);--nav-line-bg-color:var(--color-transparent,transparent);--nav-line-border-color:var(--color-line1-2,#e6e6e6);--nav-line-text-color:var(--color-text1-4,#333);--nav-line-text-style:var(--font-weight-2,normal);--nav-line-border-line:var(--line-1,1px);--nav-line-sub-nav-bg-color:var(--color-transparent,transparent);--nav-line-sub-nav-text-color:var(--color-text1-4,#333);--nav-line-sub-nav-text-style:var(--font-weight-2,normal);--nav-line-item-hover-bg-color:var(--color-transparent,transparent);--nav-line-item-hover-text-color:var(--color-brand1-6,#209bfa);--nav-line-item-hover-text-style:var(--font-weight-2,normal);--nav-line-item-hover-active-color:var(--color-brand1-6,#209bfa);--nav-line-sub-nav-hover-bg-color:var(--color-transparent,transparent);--nav-line-sub-nav-hover-text-color:var(--color-brand1-6,#209bfa);--nav-line-item-selected-bg-color:var(--color-transparent,transparent);--nav-line-item-selected-text-color:var(--color-brand1-6,#209bfa);--nav-line-item-selected-text-style:var(--font-weight-3,bold);--nav-line-item-childselected-bg-color:var(--color-transparent,transparent);--nav-line-item-childselected-text-color:var(--color-brand1-6,#209bfa);--nav-line-item-childselected-text-style:var(--font-weight-2,normal);--nav-line-item-selected-active-color:var(--color-brand1-6,#209bfa);--nav-line-sub-nav-selected-bg-color:var(--color-transparent,transparent);--nav-line-sub-nav-selected-text-color:var(--color-brand1-6,#209bfa);--nav-line-sub-nav-active-color:var(--color-brand1-6,#209bfa);--nav-line-item-disabled-text-color:var(--color-text1-2,#999);--nav-line-item-opened-bg-color:var(--color-transparent,transparent);--nav-line-item-opened-text-color:var(--color-brand1-6,#209bfa);--nav-line-group-text-color:var(--color-text1-2,#999);--nav-line-group-text-style:var(--font-weight-2,normal);--checkbox-circle-size:var(--icon-xs,12px);--checkbox-size:var(--s-4,16px);--checkbox-border-radius:var(--corner-1,3px);--checkbox-border-width:var(--line-1,1px);--checkbox-shadow:var(--shadow-zero,none);--checkbox-border-color:var(--color-line1-3,#ddd);--checkbox-hovered-border-color:var(--color-brand1-6,#209bfa);--checkbox-checked-border-color:var(--color-transparent,transparent);--checkbox-disabled-border-color:var(--color-line1-1,#eee);--checkbox-checked-hovered-border-color:var(--color-transparent,transparent);--checkbox-checked-circle-color:var(--color-white,#fff);--checkbox-label-color:var(--color-text1-4,#333);--checkbox-disabled-label-color:var(--color-text1-1,#ccc);--checkbox-disabled-circle-color:var(--color-text1-1,#ccc);--checkbox-checked-hovered-circle-color:var(--color-white,#fff);--checkbox-bg-color:var(--color-white,#fff);--checkbox-checked-bg-color:var(--color-brand1-6,#209bfa);--checkbox-hovered-bg-color:var(--color-brand1-1,#add9ff);--checkbox-checked-hovered-bg-color:var(--color-brand1-9,#1274e7);--checkbox-disabled-bg-color:var(--color-fill1-1,#fafafa);--checkbox-font-size:var(--font-size-body-1,14px);--checkbox-margin-left:var(--s-1,4px);--checkbox-semi-select-icon-content:var(--icon-content-semi-select,"");--checkbox-select-icon-content:var(--icon-content-select,"");--collapse-icon-size:var(--icon-s,16px);--collapse-border-width:var(--line-1,1px);--collapse-border-corner:var(--corner-1,3px);--collapse-border-color:var(--color-line1-2,#e6e6e6);--collapse-panel-border-color:var(--color-line1-2,#e6e6e6);--collapse-disabled-border-color:var(--color-line1-1,#eee);--collapse-title-border-width:var(--line-1,1px);--collapse-title-height:var(--s-5,20px);--collapse-title-bg-color:var(--color-fill1-2,#f9f9f9);--collapse-title-hover-bg-color:var(--color-fill1-3,#f5f5f5);--collapse-title-disabled-bg-color:var(--color-fill1-2,#f9f9f9);--collapse-title-font-color:var(--color-text1-4,#333);--collapse-title-font-disabled-color:var(--color-text1-1,#ccc);--collapse-title-hover-font-color:var(--color-text1-4,#333);--collapse-title-font-size:var(--font-size-body-2,14px);--collapse-title-font-weight:var(--font-weight-2,normal);--collapse-title-hover-font-weight:var(--font-weight-2,normal);--collapse-title-padding-tb:var(--s-2,8px);--collapse-icon-color:var(--color-text1-4,#333);--collapse-icon-hover-color:var(--color-text1-4,#333);--collapse-icon-margin-r:var(--s-2,8px);--collapse-icon-margin-l:var(--s-3,12px);--collapse-content-bg-color:var(--color-white,#fff);--collapse-content-padding-x:var(--s-4,16px);--collapse-content-padding-y:var(--s-3,12px);--collapse-content-font-size:var(--font-size-body-1,14px);--collapse-content-color:var(--color-text1-3,#666);--collapse-fold-icon-content:var(--icon-content-arrow-right,"");--collapse-unfold-icon-content:var(--icon-reset,var(--icon-reset));--upload-text-list-close-icon-size:var(--icon-s,16px);--upload-image-list-close-icon-size:var(--icon-s,16px);--upload-disable-text-color:var(--color-text1-1,#ccc);--upload-disable-border-color:var(--color-line1-1,#eee);--upload-text-list-height:var(--s-10,40px);--upload-text-list-padding-left-right:var(--s-2,8px);--upload-text-list-font-size:var(--font-size-body-1,14px);--upload-text-list-close-icon-right:var(--s-3,12px);--upload-text-list-corner:var(--corner-zero,0);--upload-text-list-bg-color:var(--color-fill1-2,#f9f9f9);--upload-text-list-bg-color-hover:var(--color-fill1-2,#f9f9f9);--upload-text-list-bg-color-error:var(--color-error-1,#ffece4);--upload-text-list-error-text-color:var(--color-error-3,#d23c26);--upload-text-list-close-icon-color:var(--color-text1-2,#999);--upload-text-list-close-icon-color-hover:var(--color-text1-3,#666);--upload-text-list-name-font-color:var(--color-text1-4,#333);--upload-text-list-name-font-color-hover:var(--color-brand1-6,#209bfa);--upload-text-list-size-font-color:var(--color-text1-2,#999);--upload-text-list-size-font-color-hover:var(--color-brand1-6,#209bfa);--upload-text-list-progressbar-height:var(--s-2,8px);--upload-image-list-item-padding:var(--s-2,8px);--upload-image-list-item-picture-size:var(--s-12,48px);--upload-image-list-item-picture-icon-size:var(--icon-l,24px);--upload-image-list-item-picture-border-width:var(--line-1,1px);--upload-image-list-item-picture-corner:var(--corner-zero,0);--upload-image-list-item-thumbnail-font-color:var(--color-text1-1,#ccc);--upload-image-list-item-font-size:var(--font-size-body-1,14px);--upload-image-list-close-icon-right:var(--s-1,4px);--upload-image-list-item-border-width:var(--line-1,1px);--upload-image-list-item-bg-color:var(--color-white,#fff);--upload-image-list-item-uploading-bg-color:var(--color-white,#fff);--upload-image-list-item-error-bg-color:var(--color-white,#fff);--upload-image-list-close-icon-color:var(--color-text1-2,#999);--upload-image-list-close-icon-color-hover:var(--color-text1-3,#666);--upload-image-list-item-border-color:var(--color-line1-2,#e6e6e6);--upload-image-list-item-border-color-error:var(--color-error-3,#d23c26);--upload-image-list-item-border-color-hover:var(--color-brand1-6,#209bfa);--upload-image-list-item-picture-border-color:var(--color-line1-2,#e6e6e6);--upload-image-list-item-picture-background-color:var(--color-fill1-2,#f9f9f9);--upload-image-list-progressbar-height:var(--s-2,8px);--upload-card-size:var(--s-25,100px);--upload-card-margin-bottom:var(--s-4,16px);--upload-card-add-icon-size:var(--icon-l,24px);--upload-card-add-text-size:var(--font-size-body-1,14px);--upload-card-add-text-margin-top:var(--s-3,12px);--upload-card-bg-color:var(--color-white,#fff);--upload-card-border-style:var(--line-dashed,dashed);--upload-card-border-color:var(--color-line1-3,#ddd);--upload-card-hover-border-color:var(--color-brand1-6,#209bfa);--upload-card-font-color:var(--color-text1-3,#666);--upload-card-icon-color:var(--color-line1-3,#ddd);--upload-card-hover-font-color:var(--color-brand1-6,#209bfa);--upload-card-add-icon:var(--icon-content-add,"");--upload-card-list-bg-color:var(--color-transparent,transparent);--upload-card-list-uploading-bg-color:var(--color-fill1-1,#fafafa);--upload-card-list-bg-color-error:var(--color-fill1-1,#fafafa);--upload-card-list-margin-right:var(--s-3,12px);--upload-card-list-padding:var(--s-zero,0px);--upload-card-list-corner:var(--corner-zero,0);--upload-card-list-border-color:var(--color-line1-3,#ddd);--upload-card-list-border-color-error:var(--color-error-3,#d23c26);--upload-card-list-thumbnail-font-color:var(--color-text1-1,#ccc);--upload-card-list-thumbnail-font-size:var(--font-size-caption,12px);--upload-card-list-thumbnail-icon-size:var(--icon-xxl,48px);--upload-card-list-name-margin-top:var(--s-1,4px);--upload-card-list-name-font-size:var(--font-size-caption,12px);--upload-card-list-name-font-color:var(--color-text1-3,#666);--upload-card-list-progressbar-height:var(--s-2,8px);--upload-select-card-tool-bg-color:var(--color-black,#000);--upload-select-card-tool-bg-opacity:.7;--upload-drag-zone-border-color:var(--color-line1-3,#ddd);--upload-drag-zone-over-border-color:var(--color-brand1-6,#209bfa);--upload-drag-zone-corner:var(--corner-1,3px);--upload-drag-zone-font-size:var(--font-size-body-2,14px);--upload-drag-zone-icon-size:var(--s-6,24px);--upload-drag-zone-hint-font-size:var(--font-size-caption,12px);--upload-drag-zone-bg-color:var(--color-transparent,transparent);--upload-drag-zone-upload-icon:var(--icon-content-upload,"");--upload-drag-zone-upload-icon-color:var(--color-text1-3,#666);--upload-drag-zone-upload-normal-title-color:var(--color-text1-3,#666);--upload-drag-zone-upload-normal-hint-color:var(--color-text1-2,#999);--loading-large-size:var(--s-10,40px);--loading-medium-size:var(--s-6,24px);--loading-icon-size:var(--icon-xl,32px);--loading-dot-color:var(--color-brand1-6,#209bfa);--loading-large-dot-size:var(--icon-xs,12px);--loading-medium-dot-size:var(--icon-xxs,8px);--drawer-close-size:var(--icon-s,16px);--drawer-title-font-size:var(--font-size-subhead,16px);--drawer-title-padding-top:var(--s-3,12px);--drawer-title-padding-bottom:var(--s-3,12px);--drawer-title-padding-left-right:var(--s-5,20px);--drawer-title-border-width:var(--line-1,1px);--drawer-content-font-size:var(--font-size-body-1,14px);--drawer-content-padding-top:var(--s-5,20px);--drawer-content-padding-bottom:var(--s-5,20px);--drawer-content-padding-left-right:var(--s-5,20px);--drawer-close-top:var(--s-3,12px);--drawer-close-right:var(--s-3,12px);--drawer-bg:var(--color-white,#fff);--drawer-border-width:var(--line-1,1px);--drawer-border-color:var(--color-line1-2,#e6e6e6);--drawer-border-style:var(--line-solid,solid);--drawer-corner:var(--corner-1,3px);--drawer-shadow:var(--shadow-2-down,0px 4px 8px 0px rgba(0,0,0,0.12));--drawer-title-color:var(--color-text1-4,#333);--drawer-title-bg-color:var(--color-white,#fff);--drawer-title-border-color:var(--color-line1-2,#e6e6e6);--drawer-content-color:var(--color-text1-3,#666);--drawer-close-color:var(--color-text1-2,#999);--drawer-close-color-hovered:var(--color-text1-4,#333);--drawer-close-bg-hovered:var(--color-transparent,transparent);--card-border-width:var(--line-zero,0px);--card-head-main-height:var(--s-16,64px);--card-head-main-margin-top:var(--s-zero,0px);--card-padding-lr:var(--s-6,24px);--card-body-show-divider-padding-top:var(--s-5,20px);--card-body-padding-bottom:var(--s-5,20px);--card-corner:var(--corner-1,3px);--card-head-padding-bottom:var(--s-3,12px);--card-head-bottom-border-width:var(--line-1,1px);--card-head-main-margin-bottom:var(--s-zero,0px);--card-title-font-size:var(--font-size-subhead,16px);--card-title-font-weight:var(--font-weight-2,normal);--card-sub-title-font-size:var(--font-size-caption,12px);--card-title-extra-font-size:var(--font-size-body-1,14px);--card-title-bullet-width:var(--line-3,3px);--card-title-bullet-height:var(--s-4,16px);--card-title-padding-left:var(--s-2,8px);--card-sub-title-padding-left:var(--s-2,8px);--card-body-hide-divider-padding-top:var(--s-zero,0px);--card-content-font-size:var(--font-size-body-1,14px);--card-content-line-height:var(--font-lineheight-2,1.5);--card-more-btn-height:var(--s-4,16px);--card-more-btn-padding-top:var(--s-2,8px);--card-more-btn-font-size:var(--font-size-body-1,14px);--card-shadow:var(--shadow-zero,none);--card-border-style:var(--line-solid,solid);--card-border-color:var(--color-line1-2,#e6e6e6);--card-background:var(--color-white,#fff);--card-header-background:var(--color-white,#fff);--card-title-color:var(--color-text1-4,#333);--card-sub-title-color:var(--color-text1-3,#666);--card-title-extra-color:var(--color-link-1,#298dff);--card-title-bullet-color:var(--color-brand1-6,#209bfa);--card-content-color:var(--color-text1-3,#666);--card-head-bottom-border-color:var(--color-line1-1,#eee);--card-more-btn-color:var(--color-link-1,#298dff);--card-more-btn-background:var(--color-white,#fff);--breadcrumb-text-current-weight:var(--font-weight-3,bold);--breadcrumb-size-m-icon-size:var(--icon-s,16px);--breadcrumb-icon-color:var(--color-text1-2,#999);--breadcrumb-size-m-font-size:var(--font-size-caption,12px);--breadcrumb-size-ellipsis-font-size:var(--font-size-caption,12px);--breadcrumb-size-m-icon-margin:var(--s-2,8px);--breadcrumb-text-color:var(--color-text1-3,#666);--breadcrumb-text-current-color:var(--color-text1-4,#333);--breadcrumb-text-ellipsis-color:var(--color-text1-3,#666);--breadcrumb-text-keyword-color:var(--color-brand1-6,#209bfa);--breadcrumb-icon-sep-content:var(--icon-content-arrow-right,"");--breadcrumb-text-color-hover:var(--color-brand1-6,#209bfa);--breadcrumb-text-current-color-hover:var(--color-brand1-6,#209bfa);--breadcrumb-text-keyword-color-hover:var(--color-brand1-6,#209bfa);--calendar-panel-header-background:var(--color-white,#fff);--calendar-btn-arrow-size:var(--icon-s,16px);--calendar-btn-arrow-color:var(--color-text1-3,#666);--calendar-btn-date-color:var(--color-black,#000);--calendar-card-table-cell-hover-background:var(--color-notice-1,#e4f3fe);--calendar-card-table-cell-hover-border-color:var(--color-notice-1,#e4f3fe);--calendar-card-table-cell-inrange-background:var(--color-notice-1,#e4f3fe);--calendar-card-table-cell-inrange-border-color:var(--color-notice-1,#e4f3fe);--calendar-btn-arrow-color-hover:var(--color-brand1-6,#209bfa);--calendar-fullscreen-header-margin-bottom:var(--s-2,8px);--calendar-fullscreen-table-head-font-weight:var(--font-weight-3,bold);--calendar-fullscreen-table-head-font-size:var(--font-size-subhead,16px);--calendar-fullscreen-table-head-padding-r:var(--s-3,12px);--calendar-fullscreen-table-head-padding-b:var(--s-1,4px);--calendar-fullscreen-table-cell-font-size:var(--font-size-body-2,14px);--calendar-fullscreen-table-cell-boder-top-width:var(--line-2,2px);--calendar-fullscreen-table-cell-margin-tb:var(--s-zero,0px);--calendar-fullscreen-table-cell-margin-lr:var(--s-1,4px);--calendar-fullscreen-table-cell-padding-tb:var(--s-1,4px);--calendar-fullscreen-table-cell-padding-lr:var(--s-2,8px);--calendar-fullscreen-table-cell-min-height:var(--s-20,80px);--calendar-fullscreen-table-head-color:var(--color-text1-4,#333);--calendar-fullscreen-table-cell-normal-background:var(--color-white,#fff);--calendar-fullscreen-table-cell-normal-color:var(--color-text1-4,#333);--calendar-fullscreen-table-cell-normal-border-color:var(--color-line1-2,#e6e6e6);--calendar-fullscreen-table-cell-hover-background:var(--color-brand1-1,#add9ff);--calendar-fullscreen-table-cell-hover-color:var(--color-brand1-6,#209bfa);--calendar-fullscreen-table-cell-hover-border-color:var(--color-brand1-6,#209bfa);--calendar-fullscreen-table-cell-select-background:var(--color-brand1-1,#add9ff);--calendar-fullscreen-table-cell-select-color:var(--color-brand1-6,#209bfa);--calendar-fullscreen-table-cell-select-border-color:var(--color-brand1-6,#209bfa);--calendar-fullscreen-table-cell-select-font-weight:var(--font-weight-3,bold);--calendar-fullscreen-table-cell-current-background:var(--color-white,#fff);--calendar-fullscreen-table-cell-current-color:var(--color-brand1-6,#209bfa);--calendar-fullscreen-table-cell-current-border-color:var(--color-brand1-6,#209bfa);--calendar-fullscreen-table-cell-current-font-weight:var(--font-weight-3,bold);--calendar-fullscreen-table-cell-other-background:var(--color-transparent,transparent);--calendar-fullscreen-table-cell-other-color:var(--color-text1-1,#ccc);--calendar-fullscreen-table-cell-other-border-color:var(--color-transparent,transparent);--calendar-fullscreen-table-cell-disabled-background:var(--color-fill1-1,#fafafa);--calendar-fullscreen-table-cell-disabled-color:var(--color-text1-1,#ccc);--calendar-fullscreen-table-cell-disabled-border-color:var(--color-line1-1,#eee);--calendar-card-header-margin-bottom:var(--s-2,8px);--calendar-card-table-head-font-size:var(--font-size-caption,12px);--calendar-card-table-head-font-weight:var(--font-weight-2,normal);--calendar-card-table-cell-font-size:var(--font-size-caption,12px);--calendar-card-table-cell-date-border-radius:var(--corner-1,3px);--calendar-card-table-cell-date-width:var(--s-6,24px);--calendar-card-table-cell-date-height:var(--s-6,24px);--calendar-card-table-cell-month-border-radius:var(--corner-1,3px);--calendar-card-table-cell-month-width:var(--s-15,60px);--calendar-card-table-cell-month-height:var(--s-6,24px);--calendar-card-table-cell-year-border-radius:var(--corner-1,3px);--calendar-card-table-cell-year-width:var(--s-12,48px);--calendar-card-table-cell-year-height:var(--s-6,24px);--calendar-card-table-head-color:var(--color-text1-2,#999);--calendar-card-table-cell-corner:var(--corner-zero,0);--calendar-card-table-cell-normal-background:var(--color-white,#fff);--calendar-card-table-cell-normal-color:var(--color-text1-3,#666);--calendar-card-table-cell-normal-border-color:var(--color-white,#fff);--calendar-card-table-cell-hover-color:var(--color-brand1-6,#209bfa);--calendar-card-table-cell-select-background:var(--color-brand1-6,#209bfa);--calendar-card-table-cell-select-color:var(--color-white,#fff);--calendar-card-table-cell-select-border-color:var(--color-brand1-6,#209bfa);--calendar-card-table-cell-select-font-weight:var(--font-weight-3,bold);--calendar-card-table-cell-other-background:var(--color-white,#fff);--calendar-card-table-cell-other-color:var(--color-text1-1,#ccc);--calendar-card-table-cell-other-border-color:var(--color-white,#fff);--calendar-card-table-cell-disabled-background:var(--color-fill1-1,#fafafa);--calendar-card-table-cell-disabled-color:var(--color-text1-1,#ccc);--calendar-card-table-cell-disabled-border-color:var(--color-fill1-1,#fafafa);--calendar-card-table-cell-current-background:var(--color-white,#fff);--calendar-card-table-cell-current-color:var(--color-brand1-6,#209bfa);--calendar-card-table-cell-current-border-color:var(--color-transparent,transparent);--calendar-card-table-cell-current-font-weight:var(--font-weight-3,bold);--calendar-card-table-cell-inrange-color:var(--color-brand1-6,#209bfa);--calendar-panel-header-margin-bottom:var(--s-2,8px);--calendar-panel-header-height:var(--s-8,32px);--calendar-panel-header-border-bottom-width:var(--line-1,1px);--calendar-panel-header-border-bottom-color:var(--color-transparent,transparent);--calendar-btn-date-font-weight:var(--font-weight-3,bold);--calendar-btn-date-margin-lr:var(--s-1,4px);--calendar-btn-arrow-single-offset-lr:var(--s-7,28px);--calendar-btn-arrow-double-offset-lr:var(--s-2,8px);--calendar-btn-date-color-hover:var(--color-white,#fff);--calendar-btn-arrow-content-prev:var(--icon-content-arrow-left,"");--calendar-btn-arrow-content-next:var(--icon-content-arrow-right,"");--calendar-btn-arrow-content-prev-super:var(--icon-content-arrow-double-left,"");--calendar-btn-arrow-content-next-super:var(--icon-content-arrow-double-right,"");--shell-dark-navigation-ver-width:var(--s-50,200px);--shell-light-navigation-ver-width:var(--s-50,200px);--shell-brand-navigation-ver-width:var(--s-50,200px);--shell-dark-header-background:var(--color-fill1-5,#222);--shell-dark-navigation-ver-background:var(--color-fill1-5,#222);--shell-brand-header-color:var(--color-white,#fff);--shell-brand-header-background:var(--color-other-1,#18263c);--shell-brand-navigation-ver-background:var(--color-white,#fff);--shell-light-header-color:var(--color-black,#000);--shell-light-header-height:var(--s-13,52px);--shell-light-header-background:var(--color-white,#fff);--shell-light-header-shadow:var(--shadow-zero,none);--shell-light-header-divider-size:var(--line-1,1px);--shell-light-header-divider-style:var(--line-solid,solid);--shell-light-header-divider-color:var(--color-line1-1,#eee);--shell-light-header-paddingLeft:var(--s-4,16px);--shell-light-multitask-min-height:var(--s-10,40px);--shell-light-multitask-background:var(--color-white,#fff);--shell-light-multitask-shadow:var(--shadow-zero,none);--shell-light-multitask-divider-size:var(--line-1,1px);--shell-light-multitask-divider-style:var(--line-solid,solid);--shell-light-multitask-divider-color:var(--color-line1-1,#eee);--shell-light-multitask-paddingLeft:var(--s-zero,0px);--shell-light-navigation-hoz-marginLeft:var(--s-12,48px);--shell-light-navigation-ver-shadow:var(--shadow-zero,none);--shell-light-navigation-ver-paddingTop:var(--s-2,8px);--shell-light-navigation-ver-paddingBottom:var(--s-2,8px);--shell-light-navigation-ver-width-mini:var(--s-15,60px);--shell-light-navigation-ver-background:var(--color-white,#fff);--shell-light-navigation-ver-divider-size:var(--line-1,1px);--shell-light-navigation-ver-divider-style:var(--line-solid,solid);--shell-light-navigation-ver-divider-color:var(--color-line1-1,#eee);--shell-light-local-navigation-width:var(--s-42,168px);--shell-light-local-navigation-background:var(--color-fill1-4,#f2f2f2);--shell-light-local-navigation-paddingTop:var(--s-2,8px);--shell-light-local-navigation-paddingBottom:var(--s-2,8px);--shell-light-local-navigation-shadow:var(--shadow-zero,none);--shell-light-local-navigation-divider-size:var(--line-1,1px);--shell-light-local-navigation-divider-style:var(--line-solid,solid);--shell-light-local-navigation-divider-color:var(--color-line1-1,#eee);--shell-light-appbar-background:var(--color-white,#fff);--shell-light-appbar-min-height:var(--s-12,48px);--shell-light-appbar-shadow:var(--shadow-zero,none);--shell-light-appbar-paddingLeft:var(--s-6,24px);--shell-light-appbar-divider-size:var(--line-1,1px);--shell-light-appbar-divider-style:var(--line-solid,solid);--shell-light-appbar-divider-color:var(--color-line1-1,#eee);--shell-light-content-background:var(--color-fill1-3,#f5f5f5);--shell-light-content-paddingLeft:var(--s-5,20px);--shell-light-content-paddingTop:var(--s-5,20px);--shell-light-footer-min-height:var(--s-14,56px);--shell-light-footer-background:var(--color-transparent,transparent);--shell-light-footer-color:var(--color-text1-1,#ccc);--shell-light-footer-font-size:var(--font-size-body-2,14px);--shell-light-ancillary-width:var(--s-42,168px);--shell-light-ancillary-background:var(--color-white,#fff);--shell-light-ancillary-paddingTop:var(--s-2,8px);--shell-light-ancillary-paddingBottom:var(--s-2,8px);--shell-light-ancillary-shadow:var(--shadow-zero,none);--shell-light-ancillary-divider-size:var(--line-1,1px);--shell-light-ancillary-divider-style:var(--line-solid,solid);--shell-light-ancillary-divider-color:var(--color-line1-1,#eee);--shell-light-tooldock-height:var(--s-13,52px);--shell-light-tooldock-width:var(--s-13,52px);--shell-light-tooldock-background:var(--color-fill1-4,#f2f2f2);--shell-light-tooldock-paddingTop:var(--s-2,8px);--shell-light-tooldock-paddingBottom:var(--s-2,8px);--shell-light-tooldock-shadow:var(--shadow-zero,none);--shell-light-tooldock-divider-size:var(--line-1,1px);--shell-light-tooldock-divider-style:var(--line-solid,solid);--shell-light-tooldock-divider-color:var(--color-line1-1,#eee);--shell-light-tooldock-item-paddingTop:var(--s-2,8px);--shell-light-tooldock-item-color:var(--color-text1-3,#666);--shell-light-tooldock-item-color-hover:var(--color-text1-4,#333);--shell-light-tooldock-item-color-active:var(--color-text1-4,#333);--shell-light-tooldock-item-background:var(--color-transparent,transparent);--shell-light-tooldock-item-background-hover:var(--color-fill1-3,#f5f5f5);--shell-light-tooldock-item-background-active:var(--color-fill1-3,#f5f5f5);--shell-dark-header-color:var(--color-white,#fff);--shell-dark-header-height:var(--s-13,52px);--shell-dark-header-shadow:var(--shadow-1-down,0px 1px 3px 0px rgba(0,0,0,0.12));--shell-dark-header-divider-size:var(--line-1,1px);--shell-dark-header-divider-style:var(--line-solid,solid);--shell-dark-header-divider-color:#1f1f1f;--shell-dark-header-paddingLeft:var(--s-4,16px);--shell-dark-multitask-min-height:var(--s-10,40px);--shell-dark-multitask-background:var(--color-white,#fff);--shell-dark-multitask-shadow:var(--shadow-zero,none);--shell-dark-multitask-divider-size:var(--line-1,1px);--shell-dark-multitask-divider-style:var(--line-solid,solid);--shell-dark-multitask-divider-color:var(--color-line1-1,#eee);--shell-dark-multitask-paddingLeft:var(--s-zero,0px);--shell-dark-navigation-hoz-marginLeft:var(--s-12,48px);--shell-dark-navigation-ver-shadow:var(--shadow-zero,none);--shell-dark-navigation-ver-paddingTop:var(--s-2,8px);--shell-dark-navigation-ver-paddingBottom:var(--s-2,8px);--shell-dark-navigation-ver-width-mini:var(--s-15,60px);--shell-dark-navigation-ver-divider-size:var(--line-1,1px);--shell-dark-navigation-ver-divider-style:var(--line-solid,solid);--shell-dark-navigation-ver-divider-color:var(--color-line1-1,#eee);--shell-dark-local-navigation-width:var(--s-42,168px);--shell-dark-local-navigation-background:var(--color-fill1-4,#f2f2f2);--shell-dark-local-navigation-paddingTop:var(--s-2,8px);--shell-dark-local-navigation-paddingBottom:var(--s-2,8px);--shell-dark-local-navigation-shadow:var(--shadow-zero,none);--shell-dark-local-navigation-divider-size:var(--line-1,1px);--shell-dark-local-navigation-divider-style:var(--line-solid,solid);--shell-dark-local-navigation-divider-color:var(--color-line1-1,#eee);--shell-dark-appbar-background:var(--color-white,#fff);--shell-dark-appbar-min-height:var(--s-12,48px);--shell-dark-appbar-shadow:var(--shadow-zero,none);--shell-dark-appbar-paddingLeft:var(--s-6,24px);--shell-dark-appbar-divider-size:var(--line-1,1px);--shell-dark-appbar-divider-style:var(--line-solid,solid);--shell-dark-appbar-divider-color:var(--color-line1-1,#eee);--shell-dark-content-background:var(--color-fill1-3,#f5f5f5);--shell-dark-content-paddingLeft:var(--s-5,20px);--shell-dark-content-paddingTop:var(--s-5,20px);--shell-dark-footer-min-height:var(--s-14,56px);--shell-dark-footer-background:var(--color-transparent,transparent);--shell-dark-footer-color:var(--color-text1-1,#ccc);--shell-dark-footer-font-size:var(--font-size-body-2,14px);--shell-dark-ancillary-width:var(--s-42,168px);--shell-dark-ancillary-background:var(--color-white,#fff);--shell-dark-ancillary-paddingTop:var(--s-2,8px);--shell-dark-ancillary-paddingBottom:var(--s-2,8px);--shell-dark-ancillary-shadow:var(--shadow-zero,none);--shell-dark-ancillary-divider-size:var(--line-1,1px);--shell-dark-ancillary-divider-style:var(--line-solid,solid);--shell-dark-ancillary-divider-color:var(--color-line1-1,#eee);--shell-dark-tooldock-height:var(--s-13,52px);--shell-dark-tooldock-width:var(--s-13,52px);--shell-dark-tooldock-background:var(--color-fill1-4,#f2f2f2);--shell-dark-tooldock-paddingTop:var(--s-2,8px);--shell-dark-tooldock-paddingBottom:var(--s-2,8px);--shell-dark-tooldock-shadow:var(--shadow-zero,none);--shell-dark-tooldock-divider-size:var(--line-1,1px);--shell-dark-tooldock-divider-style:var(--line-solid,solid);--shell-dark-tooldock-divider-color:var(--color-line1-1,#eee);--shell-dark-tooldock-item-paddingTop:var(--s-2,8px);--shell-dark-tooldock-item-color:var(--color-text1-3,#666);--shell-dark-tooldock-item-color-hover:var(--color-text1-4,#333);--shell-dark-tooldock-item-color-active:var(--color-text1-4,#333);--shell-dark-tooldock-item-background:var(--color-transparent,transparent);--shell-dark-tooldock-item-background-hover:var(--color-fill1-3,#f5f5f5);--shell-dark-tooldock-item-background-active:var(--color-fill1-3,#f5f5f5);--shell-brand-header-height:var(--s-13,52px);--shell-brand-header-shadow:var(--shadow-1-down,0px 1px 3px 0px rgba(0,0,0,0.12));--shell-brand-header-divider-size:var(--line-1,1px);--shell-brand-header-divider-style:var(--line-solid,solid);--shell-brand-header-divider-color:var(--color-line1-1,#eee);--shell-brand-header-paddingLeft:var(--s-4,16px);--shell-brand-multitask-min-height:var(--s-10,40px);--shell-brand-multitask-background:var(--color-white,#fff);--shell-brand-multitask-shadow:var(--shadow-zero,none);--shell-brand-multitask-divider-size:var(--line-1,1px);--shell-brand-multitask-divider-style:var(--line-solid,solid);--shell-brand-multitask-divider-color:var(--color-line1-1,#eee);--shell-brand-multitask-paddingLeft:var(--s-zero,0px);--shell-brand-navigation-hoz-marginLeft:var(--s-12,48px);--shell-brand-navigation-ver-shadow:var(--shadow-zero,none);--shell-brand-navigation-ver-paddingTop:var(--s-2,8px);--shell-brand-navigation-ver-paddingBottom:var(--s-2,8px);--shell-brand-navigation-ver-width-mini:var(--s-15,60px);--shell-brand-navigation-ver-divider-size:var(--line-1,1px);--shell-brand-navigation-ver-divider-style:var(--line-solid,solid);--shell-brand-navigation-ver-divider-color:var(--color-line1-1,#eee);--shell-brand-local-navigation-width:var(--s-42,168px);--shell-brand-local-navigation-background:var(--color-fill1-4,#f2f2f2);--shell-brand-local-navigation-paddingTop:var(--s-2,8px);--shell-brand-local-navigation-paddingBottom:var(--s-2,8px);--shell-brand-local-navigation-shadow:var(--shadow-zero,none);--shell-brand-local-navigation-divider-size:var(--line-1,1px);--shell-brand-local-navigation-divider-style:var(--line-solid,solid);--shell-brand-local-navigation-divider-color:var(--color-line1-1,#eee);--shell-brand-appbar-background:var(--color-white,#fff);--shell-brand-appbar-min-height:var(--s-12,48px);--shell-brand-appbar-shadow:var(--shadow-zero,none);--shell-brand-appbar-paddingLeft:var(--s-6,24px);--shell-brand-appbar-divider-size:var(--line-1,1px);--shell-brand-appbar-divider-style:var(--line-solid,solid);--shell-brand-appbar-divider-color:var(--color-line1-1,#eee);--shell-brand-content-background:var(--color-fill1-3,#f5f5f5);--shell-brand-content-paddingLeft:var(--s-5,20px);--shell-brand-content-paddingTop:var(--s-5,20px);--shell-brand-footer-min-height:var(--s-14,56px);--shell-brand-footer-background:var(--color-transparent,transparent);--shell-brand-footer-color:var(--color-text1-1,#ccc);--shell-brand-footer-font-size:var(--font-size-body-2,14px);--shell-brand-ancillary-width:var(--s-42,168px);--shell-brand-ancillary-background:var(--color-white,#fff);--shell-brand-ancillary-paddingTop:var(--s-2,8px);--shell-brand-ancillary-paddingBottom:var(--s-2,8px);--shell-brand-ancillary-shadow:var(--shadow-zero,none);--shell-brand-ancillary-divider-size:var(--line-1,1px);--shell-brand-ancillary-divider-style:var(--line-solid,solid);--shell-brand-ancillary-divider-color:var(--color-line1-1,#eee);--shell-brand-tooldock-height:var(--s-13,52px);--shell-brand-tooldock-width:var(--s-13,52px);--shell-brand-tooldock-background:var(--color-fill1-4,#f2f2f2);--shell-brand-tooldock-paddingTop:var(--s-2,8px);--shell-brand-tooldock-paddingBottom:var(--s-2,8px);--shell-brand-tooldock-shadow:var(--shadow-zero,none);--shell-brand-tooldock-divider-size:var(--line-1,1px);--shell-brand-tooldock-divider-style:var(--line-solid,solid);--shell-brand-tooldock-divider-color:var(--color-line1-1,#eee);--shell-brand-tooldock-item-paddingTop:var(--s-2,8px);--shell-brand-tooldock-item-color:var(--color-text1-3,#666);--shell-brand-tooldock-item-color-hover:var(--color-text1-4,#333);--shell-brand-tooldock-item-color-active:var(--color-text1-4,#333);--shell-brand-tooldock-item-background:var(--color-transparent,transparent);--shell-brand-tooldock-item-background-hover:var(--color-fill1-3,#f5f5f5);--shell-brand-tooldock-item-background-active:var(--color-fill1-3,#f5f5f5);--form-label-color:var(--color-text1-3,#666);--form-label-padding-r:var(--s-3,12px);--form-item-m-margin-b:var(--s-4,16px);--form-item-l-margin-b:var(--s-5,20px);--form-item-s-margin-b:var(--s-3,12px);--form-inline-l-item-margin-r:var(--s-6,24px);--form-inline-m-item-margin-r:var(--s-5,20px);--form-inline-s-item-margin-r:var(--s-4,16px);--form-help-margin-top:var(--s-1,4px);--form-help-font-size:var(--font-size-caption,12px);--form-help-color:var(--color-text1-2,#999);--form-error-color:var(--color-error-3,#d23c26);--form-warning-color:var(--color-warning-3,#f1c826);--form-top-label-margin-b:2px;--cascader-select:"cascader-select";--timeline-item-node-size:var(--s-4,16px);--timeline-item-custom-node-size:var(--s-10,40px);--timeline-item-custom-node-font-size:var(--font-size-caption,12px);--timeline-item-node-padding:var(--s-1,4px);--timeline-item-dot-size:var(--s-2,8px);--timeline-item-icon-size:var(--icon-xs,12px);--timeline-item-tail-size:var(--line-1,1px);--timeline-item-left-content-width:var(--s-20,80px);--timeline-item-content-margin-left:var(--s-3,12px);--timeline-item-body-margin-top:var(--s-1,4px);--timeline-item-title-font-size:var(--font-size-body-1,14px);--timeline-item-title-font-weight:var(--font-weight-3,bold);--timeline-item-title-margin-top:var(--s-1,4px);--timeline-item-time-margin-top:var(--s-1,4px);--timeline-item-time-margin-bottom:var(--s-3,12px);--timeline-item-body-font-size:var(--font-size-caption,12px);--timeline-item-left-body-font-size:var(--font-size-caption,12px);--timeline-item-time-font-size:var(--font-size-caption,12px);--timeline-item-folder-font-size:var(--font-size-caption,12px);--timeline-item-folder-margin-top:var(--s-1,4px);--timeline-item-folder-margin-bottom:var(--s-1,4px);--timeline-item-title-color:var(--color-text1-4,#333);--timeline-item-body-color:var(--color-text1-3,#666);--timeline-item-left-body-color:var(--color-text1-2,#999);--timeline-item-time-color:var(--color-text1-2,#999);--timeline-item-tail-color:var(--color-line1-2,#e6e6e6);--timeline-item-done-dot-size:var(--s-2,8px);--timeline-item-done-background:var(--color-line1-3,#ddd);--timeline-item-done-color:var(--color-white,#fff);--timeline-item-process-dot-size:var(--s-2,8px);--timeline-item-process-background:var(--color-brand1-6,#209bfa);--timeline-item-process-color:var(--color-white,#fff);--timeline-item-success-dot-size:var(--s-2,8px);--timeline-item-success-background:var(--color-success-3,#1ad78c);--timeline-item-success-color:var(--color-white,#fff);--timeline-item-error-dot-size:var(--s-2,8px);--timeline-item-error-background:var(--color-error-3,#d23c26);--timeline-item-error-color:var(--color-white,#fff);--menu-btn-disabled-icon-color:var(--color-text1-1,#ccc);--menu-btn-ghost-light-disabled-icon-color:var(--btn-ghost-light-color-disabled,rgba(0,0,0,0.1));--menu-btn-ghost-dark-disabled-icon-color:var(--btn-ghost-dark-color-disabled,hsla(0,0%,100%,0.4));--menu-btn-pure-text-normal-icon-color:var(--color-text1-2,#999);--menu-btn-pure-text-primary-icon-color:var(--color-white,#fff);--menu-btn-pure-text-secondary-icon-color:var(--color-brand1-6,#209bfa);--menu-btn-text-text-normal-icon-color:var(--color-text1-4,#333);--menu-btn-text-text-primary-icon-color:var(--color-link-1,#298dff);--menu-btn-ghost-light-icon-color:var(--color-text1-4,#333);--menu-btn-ghost-dark-icon-color:var(--color-white,#fff);--menu-btn-fold-icon-content:var(--icon-content-arrow-down,"");--menu-btn-unfold-icon-content:var(--icon-reset,var(--icon-reset));--range-size-m-track-height:var(--s-1,4px);--range-size-m-scale-height:var(--s-3,12px);--range-size-m-scale-item-border-width:var(--line-1,1px);--range-size-m-slider-hw:var(--s-4,16px);--range-size-slider-border-style:var(--line-solid,solid);--range-size-slider-border-width:var(--line-1,1px);--range-size-m-mark-top:30px;--range-size-m-mark-font-size:var(--font-size-body-1,14px);--range-size-m-mark-font-weight:var(--font-weight-2,normal);--range-size-m-mark-font-lineheight:20px;--range-size-m-track-radius:var(--corner-zero,0);--range-size-m-scale-radius:var(--corner-zero,0);--range-size-m-slider-shadow-moving:var(--shadow-2,4px 4px 8px 0px rgba(0,0,0,0.12));--range-normal-unselected-color:var(--color-line1-3,#ddd);--range-normal-selected-color:var(--color-brand1-6,#209bfa);--range-normal-slider-bg-color:var(--color-white,#fff);--range-normal-mark-color:var(--color-text1-2,#999);--range-normal-mark-selected-color:var(--color-text1-4,#333);--range-normal-unselected-color-hover:var(--color-line1-3,#ddd);--range-normal-selected-color-hover:var(--color-brand1-6,#209bfa);--range-normal-slider-bg-color-hover:var(--color-white,#fff);--range-size-m-slider-shadow:var(--shadow-1,1px 1px 3px 0px rgba(0,0,0,0.12));--range-size-m-slider-shadow-hover:var(--shadow-3,20px 20px 30px 0px rgba(0,0,0,0.15));--range-normal-mark-color-hover:var(--color-text1-2,#999);--range-normal-mark-selected-color-hover:var(--color-text1-4,#333);--range-normal-slider-border-color-hover:var(--color-transparent,transparent);--range-normal-unselected-color-disabled:var(--color-line1-3,#ddd);--range-normal-selected-color-disabled:var(--color-line1-4,#ccc);--range-normal-slider-bg-color-disabled:var(--color-line1-1,#eee);--range-normal-slider-border-color:var(--color-line1-3,#ddd);--range-normal-slider-border-color-disabled:var(--color-line1-1,#eee);--range-normal-mark-color-disabled:var(--color-text1-1,#ccc);--range-normal-mark-selected-color-disabled:var(--color-text1-2,#999);--rating-small-text-margin-left:var(--s-2,8px);--rating-small-icon-size:var(--icon-xs,12px);--rating-small-font-size:var(--font-size-caption,12px);--rating-medium-text-margin-left:var(--s-3,12px);--rating-medium-icon-size:var(--icon-s,16px);--rating-medium-font-size:var(--font-size-body-1,14px);--rating-large-text-margin-left:var(--s-4,16px);--rating-large-icon-size:var(--icon-m,20px);--rating-large-font-size:var(--font-size-subhead,16px);--rating-normal-underlay-color:var(--color-fill1-4,#f2f2f2);--rating-normal-overlay-color:var(--color-brand1-6,#209bfa);--rating-normal-overlay-hover-color:var(--color-brand1-6,#209bfa);--rating-grade-low-overlay-color:var(--color-text1-3,#666);--rating-grade-low-overlay-hover-color:var(--color-text1-2,#999);--rating-grade-high-overlay-color:var(--color-brand1-6,#209bfa);--rating-grade-high-overlay-hover-color:var(--color-brand1-6,#209bfa);--rating-grade-icon-content:var(--icon-content-favorites-filling,"");--split-btn-trigger-normal-icon-color:var(--color-text1-2,#999);--split-btn-fold-icon-content:var(--icon-content-arrow-down,"");--split-btn-unfold-icon-content:var(--icon-reset,var(--icon-reset));--paragraph-text-color:var(--color-text1-4,#333);--paragraph-s-font-size:var(--font-size-body-1,14px);--paragraph-m-font-size:var(--font-size-body-2,14px);--paragraph-s-line-height:var(--font-lineheight-2,1.5);--paragraph-l-line-height:var(--font-lineheight-3,1.7);--typography-text-color:var(--color-text1-4,#333);--typography-text-strong-font-weight:var(--font-weight-semi-bold,600);--typography-text-code-corner:var(--corner-1,3px);--typography-text-mark-color:var(--color-text1-4,#333);--typography-text-mark-background:var(--color-warning-2,#ffe98f);--typography-text-code-color:var(--color-text1-4,#333);--typography-text-code-background:var(--color-fill1-2,#f9f9f9);--typography-text-code-border-color:var(--color-line1-1,#eee);--typography-paragraph-font-size:var(--font-size-body-2,14px);--typography-paragraph-line-height:var(--font-lineheight-2,1.5);--typography-title-h1-font-size:var(--font-size-headline,24px);--typography-title-h2-font-size:var(--font-size-title,20px);--typography-title-h3-font-size:var(--font-size-subhead,16px);--typography-title-h4-font-size:var(--font-size-subhead,16px);--typography-title-h5-font-size:var(--font-size-body-2,14px);--typography-title-h6-font-size:var(--font-size-body-1,14px);--typography-title-font-weight:var(--font-weight-semi-bold,600);--badge-size-dot-width:var(--s-2,8px);--badge-size-list-margin:var(--s-zero,0px);--badge-size-count-config-height:var(--s-4,16px);--badge-size-count-padding-lr:var(--s-1,4px);--badge-size-custom-padding-lr:var(--s-1,4px);--badge-size-count-font:var(--font-size-caption,12px);--badge-color-bg:var(--color-error-3,#d23c26);--badge-size-count-border-radius:var(--s-2,8px);--badge-dot-color-bg:var(--color-error-3,#d23c26);--badge-size-dot-border-radius:var(--s-2,8px);--badge-size-custom-border-radius:var(--corner-1,3px);--select-color:var(--color-text1-4,#333);--select-hint-color:var(--color-text1-2,#999);--select-highlight-color:var(--color-brand1-6,#209bfa);--select-highlight-font:var(--font-size-body-1,14px);--select-l-lineheight:var(--s-6,24px);--select-m-lineheight:var(--s-5,20px);--select-s-lineheight:14px;--select-fold-icon-content:var(--icon-content-arrow-down,"");--select-unfold-icon-content:var(--icon-reset,var(--icon-reset));--message-size-l-padding:var(--s-4,16px);--message-size-l-border-width:var(--line-2,2px);--message-size-l-title-content-padding-left:var(--s-3,12px);--message-size-l-title-content-padding-right:var(--s-5,20px);--message-size-l-title-font:var(--font-size-title,20px);--message-size-l-content-margin-top:var(--s-2,8px);--message-size-l-content-font:var(--font-size-body-1,14px);--message-size-l-close-top:var(--s-4,16px);--message-size-l-close-right:var(--s-4,16px);--message-size-l-icon:var(--icon-l,24px);--message-size-m-padding:var(--s-3,12px);--message-size-m-border-width:var(--line-1,1px);--message-size-m-title-content-padding-left:var(--s-2,8px);--message-size-m-title-content-padding-right:var(--s-5,20px);--message-size-m-title-font:var(--font-size-subhead,16px);--message-size-m-content-margin-top:var(--s-2,8px);--message-size-m-content-font:var(--font-size-body-1,14px);--message-size-m-close-top:var(--s-3,12px);--message-size-m-close-right:var(--s-3,12px);--message-size-m-icon:var(--icon-s,16px);--message-close-icon-size:var(--icon-xs,12px);--message-size-l-border-radius:var(--corner-1,3px);--message-size-m-border-radius:var(--corner-1,3px);--message-size-l-border-radius-toast:var(--corner-1,3px);--message-size-m-border-radius-toast:var(--corner-1,3px);--message-border-style:var(--line-solid,solid);--message-border-style-toast:var(--line-solid,solid);--message-shadow-toast:var(--shadow-2-down,0px 4px 8px 0px rgba(0,0,0,0.12));--message-success-color-bg-inline:var(--color-success-1,#e5fff5);--message-success-color-bg-addon:var(--color-transparent,transparent);--message-success-color-bg-toast:var(--color-white,#fff);--message-success-color-border-inline:var(--color-success-1,#e5fff5);--message-success-color-border-toast:var(--color-white,#fff);--message-success-color-title-inline:var(--color-text1-4,#333);--message-success-color-title-addon:var(--color-text1-4,#333);--message-success-color-title-toast:var(--color-text1-4,#333);--message-success-color-content-inline:var(--color-text1-3,#666);--message-success-color-content-addon:var(--color-text1-3,#666);--message-success-color-content-toast:var(--color-text1-3,#666);--message-success-color-icon-inline:var(--color-success-3,#1ad78c);--message-success-color-icon-addon:var(--color-success-3,#1ad78c);--message-success-color-icon-toast:var(--color-success-3,#1ad78c);--message-error-color-bg-inline:var(--color-error-1,#ffece4);--message-error-color-bg-addon:var(--color-transparent,transparent);--message-error-color-bg-toast:var(--color-white,#fff);--message-error-color-border-inline:var(--color-error-1,#ffece4);--message-error-color-border-toast:var(--color-white,#fff);--message-error-color-title-inline:var(--color-text1-4,#333);--message-error-color-title-addon:var(--color-text1-4,#333);--message-error-color-title-toast:var(--color-text1-4,#333);--message-error-color-content-inline:var(--color-text1-3,#666);--message-error-color-content-addon:var(--color-text1-3,#666);--message-error-color-content-toast:var(--color-text1-3,#666);--message-error-color-icon-inline:var(--color-error-3,#d23c26);--message-error-color-icon-addon:var(--color-error-3,#d23c26);--message-error-color-icon-toast:var(--color-error-3,#d23c26);--message-warning-color-bg-inline:var(--color-warning-1,#fff9e0);--message-warning-color-bg-addon:var(--color-transparent,transparent);--message-warning-color-bg-toast:var(--color-white,#fff);--message-warning-color-border-inline:var(--color-warning-1,#fff9e0);--message-warning-color-border-toast:var(--color-white,#fff);--message-warning-color-title-inline:var(--color-text1-4,#333);--message-warning-color-title-addon:var(--color-text1-4,#333);--message-warning-color-title-toast:var(--color-text1-4,#333);--message-warning-color-content-inline:var(--color-text1-3,#666);--message-warning-color-content-addon:var(--color-text1-3,#666);--message-warning-color-content-toast:var(--color-text1-3,#666);--message-warning-color-icon-inline:var(--color-warning-3,#f1c826);--message-warning-color-icon-addon:var(--color-warning-3,#f1c826);--message-warning-color-icon-toast:var(--color-warning-3,#f1c826);--message-notice-color-bg-inline:var(--color-notice-1,#e4f3fe);--message-notice-color-bg-addon:var(--color-transparent,transparent);--message-notice-color-bg-toast:var(--color-white,#fff);--message-notice-color-border-inline:var(--color-notice-1,#e4f3fe);--message-notice-color-border-toast:var(--color-white,#fff);--message-notice-color-title-inline:var(--color-text1-4,#333);--message-notice-color-title-addon:var(--color-text1-4,#333);--message-notice-color-title-toast:var(--color-text1-4,#333);--message-notice-color-content-inline:var(--color-text1-3,#666);--message-notice-color-content-addon:var(--color-text1-3,#666);--message-notice-color-content-toast:var(--color-text1-3,#666);--message-notice-color-icon-inline:var(--color-notice-3,#298dff);--message-notice-color-icon-addon:var(--color-notice-3,#298dff);--message-notice-color-icon-toast:var(--color-notice-3,#298dff);--message-help-color-bg-inline:var(--color-help-1,#fff9e0);--message-help-color-bg-addon:var(--color-transparent,transparent);--message-help-color-bg-toast:var(--color-white,#fff);--message-help-color-border-inline:var(--color-help-1,#fff9e0);--message-help-color-border-toast:var(--color-white,#fff);--message-help-color-title-inline:var(--color-text1-4,#333);--message-help-color-title-addon:var(--color-text1-4,#333);--message-help-color-title-toast:var(--color-text1-4,#333);--message-help-color-content-inline:var(--color-text1-3,#666);--message-help-color-content-addon:var(--color-text1-3,#666);--message-help-color-content-toast:var(--color-text1-3,#666);--message-help-color-icon-inline:var(--color-help-3,#f1c826);--message-help-color-icon-addon:var(--color-help-3,#f1c826);--message-help-color-icon-toast:var(--color-help-3,#f1c826);--message-loading-color-bg-inline:var(--color-white,#fff);--message-loading-color-bg-addon:var(--color-transparent,transparent);--message-loading-color-bg-toast:var(--color-white,#fff);--message-loading-color-border-inline:var(--color-white,#fff);--message-loading-color-border-toast:var(--color-white,#fff);--message-loading-color-title-inline:var(--color-text1-4,#333);--message-loading-color-title-addon:var(--color-text1-4,#333);--message-loading-color-title-toast:var(--color-text1-4,#333);--message-loading-color-content-inline:var(--color-text1-3,#666);--message-loading-color-content-addon:var(--color-text1-3,#666);--message-loading-color-content-toast:var(--color-text1-3,#666);--message-loading-color-icon-inline:var(--color-brand1-6,#209bfa);--message-loading-color-icon-addon:var(--color-brand1-6,#209bfa);--message-loading-color-icon-toast:var(--color-brand1-6,#209bfa);--message-close-icon-color:var(--color-text1-2,#999);--message-hover-close-icon-color:var(--color-text1-3,#666);--message-success-icon-content:var(--icon-content-success,"");--message-warning-icon-content:var(--icon-content-warning,"");--message-error-icon-content:var(--icon-content-error,"");--message-notice-icon-content:var(--icon-content-prompt,"");--message-help-icon-content:var(--icon-content-help,"");--message-loading-icon-content:var(--icon-content-loading,"");--number-picker-normal-up-icon:var(--icon-content-arrow-up,"");--number-picker-normal-down-icon:var(--icon-content-arrow-down,"");--number-picker-normal-s-button-width:var(--s-5,20px);--number-picker-normal-m-button-width:var(--s-5,20px);--number-picker-normal-l-button-width:var(--s-5,20px);--number-picker-normal-m-input-width:var(--s-20,80px);--number-picker-normal-l-input-width:var(--s-20,80px);--number-picker-normal-s-button-icon-size:var(--icon-xxs,8px);--number-picker-normal-m-button-icon-size:var(--icon-xxs,8px);--number-picker-normal-l-button-icon-size:var(--icon-xxs,8px);--number-picker-inline-add-icon:var(--icon-content-add,"");--number-picker-inline-minus-icon:var(--icon-content-minus,"");--number-picker-inline-s-button-icon-size:var(--icon-xs,12px);--number-picker-inline-s-button-margin:2px;--number-picker-inline-s-button-corner:var(--corner-1,3px);--number-picker-inline-m-button-icon-size:var(--icon-xs,12px);--number-picker-inline-m-button-margin:2px;--number-picker-inline-m-button-corner:var(--corner-1,3px);--number-picker-inline-m-input-width:var(--s-25,100px);--number-picker-inline-l-button-icon-size:var(--icon-xs,12px);--number-picker-inline-l-button-margin:2px;--number-picker-inline-l-button-corner:var(--corner-1,3px);--number-picker-inline-l-input-width:var(--s-32,128px);--divider-hoz-size:var(--line-1,1px);--divider-hoz-color:var(--color-line1-2,#e6e6e6);--divider-hoz-text-center-paddingLeft:var(--s-4,16px);--divider-hoz-text-left-paddingLeft:var(--s-4,16px);--divider-hoz-text-marginTop:var(--s-4,16px);--divider-hoz-marginTop:var(--s-4,16px);--divider-hoz-text-size:var(--font-size-subhead,16px);--divider-hoz-text-weight:var(--font-weight-2,normal);--divider-hoz-text-color:var(--color-text1-4,#333);--divider-ver-size:var(--line-1,1px);--divider-ver-color:var(--color-line1-2,#e6e6e6);--divider-ver-marginLeft:var(--s-2,8px);--transfer-operation-margin-left-right:var(--s-5,20px);--transfer-operation-margin-gutter:var(--s-2,8px);--transfer-operation-icon-size:var(--icon-xs,12px);--transfer-panel-border-width:var(--line-1,1px);--transfer-panel-header-padding-top-bottom:var(--s-2,8px);--transfer-panel-header-padding-left-right:var(--s-5,20px);--transfer-panel-header-text-size:var(--font-size-body-1,14px);--transfer-panel-search-margin-top:var(--s-2,8px);--transfer-panel-search-margin-left-right:var(--s-1,4px);--transfer-panel-search-margin-bottom:var(--s-zero,0px);--transfer-panel-list-width:var(--s-45,180px);--transfer-panel-list-height:var(--s-40,160px);--transfer-panel-footer-padding-top-bottom:var(--s-2,8px);--transfer-panel-footer-padding-left-right:var(--s-5,20px);--transfer-simple-move-icon:var(--icon-content-switch,"");--transfer-simple-move-icon-color:var(--color-line1-3,#ddd);--transfer-panel-border-color:var(--color-line1-2,#e6e6e6);--transfer-panel-border-corner:var(--corner-1,3px);--transfer-panel-background-color:var(--color-white,#fff);--transfer-panel-header-text-color:var(--color-text1-4,#333);--transfer-panel-header-background-color:var(--color-fill1-1,#fafafa);--transfer-panel-search-icon-color:var(--color-text1-2,#999);--transfer-panel-footer-text-color:var(--color-text1-4,#333);--transfer-panel-footer-background-color:var(--color-white,#fff);--transfer-simple-panel-footer-text-color:var(--color-brand1-6,#209bfa);--transfer-simple-panel-item-hover-text-color:var(--color-brand1-6,#209bfa);--transfer-panel-footer-shadow:var(--shadow-zero,none);--tree-select-padding-vertical:var(--s-2,8px);--tree-select-padding-horizontal:var(--s-5,20px);--tree-select-background:var(--color-white,#fff);--time-picker-panel-width:var(--s-50,200px);--time-picker-panel-background:var(--color-white,#fff);--time-picker-menu-border-width:var(--line-1,1px);--time-picker-menu-title-font-size:var(--font-size-caption,12px);--time-picker-menu-item-font-size:var(--font-size-caption,12px);--time-picker-menu-title-height:var(--s-7,28px);--time-picker-menu-item-height:var(--s-7,28px);--time-picker-menu-border-color:var(--color-line1-3,#ddd);--time-picker-menu-title-color:var(--color-text1-2,#999);--time-picker-menu-title-background:var(--color-white,#fff);--time-pikcer-menu-title-font-weight:var(--font-weight-2,normal);--time-picker-menu-item-color:var(--color-text1-3,#666);--time-picker-menu-item-color-hover:var(--color-text1-4,#333);--time-picker-menu-item-color-selected:var(--color-text1-3,#666);--time-picker-menu-item-color-disabled:var(--color-text1-1,#ccc);--time-picker-menu-item-background:var(--color-white,#fff);--time-picker-menu-item-background-hover:var(--color-fill1-2,#f9f9f9);--time-picker-menu-item-background-selected:var(--color-fill1-2,#f9f9f9);--time-picker-menu-item-background-disabled:var(--color-white,#fff);--time-picker-menu-item-font-weight-selected:var(--font-weight-3,bold);--time-picker-clock-icon:var(--icon-content-clock,"");--slick-dots-position-bottom:var(--s-3,12px);--slick-dots-position-right:var(--s-5,20px);--slick-dots-width:var(--s-2,8px);--slick-dots-height:var(--s-2,8px);--slick-dots-margin-lr:var(--s-1,4px);--slick-dots-margin-tb:var(--s-zero,0px);--slick-arrow-width-m:var(--s-7,28px);--slick-arrow-width-l:var(--s-12,48px);--slick-arrow-height-m:var(--s-14,56px);--slick-arrow-height-l:var(--s-24,96px);--slick-ver-arrow-width-m:var(--s-14,56px);--slick-ver-arrow-width-l:var(--s-24,96px);--slick-ver-arrow-height-m:var(--s-7,28px);--slick-ver-arrow-height-l:var(--s-12,48px);--slick-arrow-icon-m:var(--icon-m,20px);--slick-arrow-icon-l:var(--icon-xl,32px);--slick-arrow-position-lr-m:var(--s-1,4px);--slick-arrow-position-lr-l:var(--s-2,8px);--slick-ver-arrow-position-tb-m:var(--s-1,4px);--slick-ver-arrow-position-tb-l:var(--s-4,16px);--slick-track-padding-lr:var(--s-6,24px);--slick-ver-track-padding-tb:var(--s-6,24px);--slick-dots-background-color-normal:var(--color-black,#000);--slick-dots-background-color-hover:var(--color-black,#000);--slick-dots-background-color-selected:var(--color-brand1-6,#209bfa);--slick-dots-background-opacity-normal:.32;--slick-dots-background-opacity-hover:.32;--slick-dots-background-opacity-selected:1;--slick-dots-border-width:var(--line-zero,0px);--slick-dots-border-radius:var(--corner-circle,50%);--slick-dots-border-color-normal:var(--color-white,#fff);--slick-dots-border-color-hover:var(--color-white,#fff);--slick-dots-border-color-selected:var(--color-white,#fff);--slick-dots-border-opacity-normal:1;--slick-dots-border-opacity-hover:1;--slick-dots-border-opacity-selected:1;--slick-arrow-icon-color-normal:var(--color-white,#fff);--slick-arrow-icon-color-normal-outer:var(--color-text1-3,#666);--slick-arrow-icon-color-hover:var(--color-white,#fff);--slick-arrow-icon-color-hover-outer:var(--color-text1-4,#333);--slick-arrow-icon-color-disabled:var(--color-text1-1,#ccc);--slick-arrow-icon-color-disabled-outer:var(--color-text1-1,#ccc);--slick-arrow-bg-color-normal:var(--color-black,#000);--slick-arrow-bg-color-hover:var(--color-black,#000);--slick-arrow-bg-color-disabled:var(--color-fill1-1,#fafafa);--slick-arrow-bg-opacity-normal:.2;--slick-arrow-bg-opacity-hover:.4;--slick-arrow-bg-opacity-disabled:.5;--slick-arrow-bg-color-normal-outer:var(--color-transparent,transparent);--slick-arrow-bg-color-hover-outer:var(--color-transparent,transparent);--slick-arrow-bg-color-disabled-outer:var(--color-transparent,transparent);--slick-arrow-bg-opacity-normal-outer:.32;--slick-arrow-bg-opacity-hover-outer:.32;--slick-arrow-bg-opacity-disabled-outer:.32;--slick-arrow-corner-radius-outer:var(--s-zero,0px);--step-arrow-item-height:var(--s-8,32px);--step-arrow-item-title-size:var(--font-size-body-2,14px);--step-arrow-item-title-weight:var(--font-weight-3,bold);--step-arrow-item-wait-background:var(--color-fill1-3,#f5f5f5);--step-arrow-item-title-wait-color:var(--color-text1-2,#999);--step-arrow-item-process-background:var(--color-brand1-6,#209bfa);--step-arrow-item-title-process-color:var(--color-white,#fff);--step-arrow-item-finish-background:var(--color-brand1-1,#add9ff);--step-arrow-item-title-finish-color:var(--color-brand1-6,#209bfa);--step-arrow-item-disabled-background:var(--color-fill1-1,#fafafa);--step-arrow-item-title-disabled-color:var(--color-text1-1,#ccc);--step-circle-item-node-padding:var(--s-2,8px);--step-circle-item-node-border-width:var(--line-1,1px);--step-circle-item-node-icon-size:var(--icon-xs,12px);--step-circle-item-node-font-size:var(--font-size-caption,12px);--step-circle-item-node-corner:var(--corner-circle,50%);--step-circle-item-tail-size:var(--line-1,1px);--step-circle-item-title-margin-top:var(--s-2,8px);--step-circle-item-content-margin-top:var(--s-1,4px);--step-circle-item-content-font-size:var(--font-size-caption,12px);--step-circle-item-body-width:var(--s-25,100px);--step-circle-item-title-size:var(--font-size-body-2,14px);--step-circle-item-title-weight:var(--font-weight-3,bold);--step-circle-item-node-wait-size:var(--s-8,32px);--step-circle-item-node-process-size:var(--s-8,32px);--step-circle-item-node-finish-size:var(--s-8,32px);--step-circle-item-node-disabled-size:var(--s-8,32px);--step-circle-item-tail-wait-color:var(--color-line1-3,#ddd);--step-circle-item-tail-process-color:var(--color-line1-3,#ddd);--step-circle-item-tail-finish-color:var(--color-brand1-6,#209bfa);--step-circle-item-tail-disabled-color:var(--color-line1-1,#eee);--step-circle-item-node-wait-font-weight:var(--font-weight-2,normal);--step-circle-item-node-process-font-weight:var(--font-weight-2,normal);--step-circle-item-node-disabled-font-weight:var(--font-weight-2,normal);--step-circle-item-node-finish-font-weight:var(--font-weight-2,normal);--step-circle-item-title-wait-color:var(--color-text1-3,#666);--step-circle-item-title-process-color:var(--color-text1-4,#333);--step-circle-item-title-finish-color:var(--color-text1-3,#666);--step-circle-item-title-disabled-color:var(--color-text1-1,#ccc);--step-circle-item-node-wait-border-color:var(--color-line1-4,#ccc);--step-circle-item-node-wait-background:var(--color-white,#fff);--step-circle-item-node-wait-color:var(--color-text1-3,#666);--step-circle-item-node-process-border-color:var(--color-brand1-6,#209bfa);--step-circle-item-node-process-background:var(--color-brand1-6,#209bfa);--step-circle-item-node-process-color:var(--color-white,#fff);--step-circle-item-node-process-percent-color:var(--color-brand1-6,#209bfa);--step-circle-item-node-process-percent-size:var(--font-size-body-1,14px);--step-circle-item-node-finish-border-color:var(--color-brand1-6,#209bfa);--step-circle-item-node-finish-background:var(--color-white,#fff);--step-circle-item-node-finish-color:var(--color-brand1-6,#209bfa);--step-circle-item-node-disabled-border-color:var(--color-line1-1,#eee);--step-circle-item-node-disabled-background:var(--color-white,#fff);--step-circle-item-node-disabled-color:var(--color-text1-1,#ccc);--step-circle-vertical-item-node-padding:var(--s-2,8px);--step-circle-vertical-item-body-margin-left:var(--s-4,16px);--step-circle-vertical-item-title-margin-top:var(--s-2,8px);--step-circle-vertical-item-content-margin-top:var(--s-1,4px);--step-circle-item-content-color:var(--color-text1-3,#666);--step-circle-item-tail-bg-color:var(--color-line1-1,#eee);--step-circle-vertical-item-tail-size:var(--line-1,1px);--step-dot-item-dot-padding:var(--s-2,8px);--step-dot-item-dot-icon-size:var(--icon-xs,12px);--step-dot-item-dot-border-width:var(--line-1,1px);--step-dot-item-body-width:var(--s-25,100px);--step-dot-item-content-margin-top:var(--s-1,4px);--step-dot-item-dot-corner:var(--corner-circle,50%);--step-dot-item-title-size:var(--font-size-body-1,14px);--step-dot-item-title-weight:var(--font-weight-3,bold);--step-dot-item-title-margin-top:var(--s-2,8px);--step-dot-item-tail-size:var(--line-1,1px);--step-dot-item-dot-wait-size:var(--s-3,12px);--step-dot-item-dot-process-size:var(--s-3,12px);--step-dot-item-dot-finish-size:var(--s-3,12px);--step-dot-item-dot-disabled-size:var(--s-3,12px);--step-dot-item-tail-wait-color:var(--color-line1-3,#ddd);--step-dot-item-tail-process-color:var(--color-line1-3,#ddd);--step-dot-item-tail-finish-color:var(--color-brand1-6,#209bfa);--step-dot-item-tail-disabled-color:var(--color-line1-1,#eee);--step-dot-item-title-wait-color:var(--color-text1-3,#666);--step-dot-item-title-process-color:var(--color-text1-4,#333);--step-dot-item-title-finish-color:var(--color-text1-3,#666);--step-dot-item-title-disabled-color:var(--color-text1-1,#ccc);--step-dot-item-node-wait-border-color:var(--color-line1-4,#ccc);--step-dot-item-node-wait-background:var(--color-white,#fff);--step-dot-item-node-wait-color:var(--color-text1-2,#999);--step-dot-item-node-process-border-color:var(--color-brand1-6,#209bfa);--step-dot-item-node-process-background:var(--color-brand1-6,#209bfa);--step-dot-item-node-process-color:var(--color-brand1-6,#209bfa);--step-dot-item-node-finish-border-color:var(--color-brand1-6,#209bfa);--step-dot-item-node-finish-background:var(--color-white,#fff);--step-dot-item-node-finish-color:var(--color-brand1-6,#209bfa);--step-dot-item-node-disabled-border-color:var(--color-line1-2,#e6e6e6);--step-dot-item-node-disabled-background:var(--color-white,#fff);--step-dot-item-node-disabled-color:var(--color-line1-1,#eee);--step-dot-vertical-item-node-padding:var(--s-2,8px);--step-dot-vertical-item-body-margin-left:var(--s-4,16px);--step-dot-vertical-item-title-margin-top:var(--s-zero,0px);--step-dot-vertical-item-content-margin-top:var(--s-2,8px);--step-dot-item-content-font-size:var(--font-size-caption,12px);--step-dot-item-content-color:var(--color-text1-3,#666);--step-dot-item-tail-bg-color:var(--color-line1-1,#eee);--step-dot-vertical-item-tail-size:var(--line-1,1px);--list-size-s-title-font-size:var(--font-size-subhead,16px);--list-size-s-title-font-weight:var(--font-weight-3,bold);--list-size-s-item-padding-lr:var(--s-zero,0px);--list-size-s-item-padding-tb:var(--s-2,8px);--list-size-s-item-media-margin:var(--s-2,8px);--list-size-s-item-content-font-size:var(--font-size-body-1,14px);--list-size-s-item-content-line-height:var(--font-lineheight-1,1.3);--list-size-s-item-title-font-weight:var(--font-weight-2,normal);--list-size-s-item-title-font-size:var(--font-size-body-2,14px);--list-size-s-item-title-line-height:var(--font-lineheight-2,1.5);--list-size-m-title-font-size:var(--font-size-title,20px);--list-size-m-title-font-weight:var(--font-weight-3,bold);--list-size-m-item-padding-lr:var(--s-zero,0px);--list-size-m-item-padding-tb:var(--s-4,16px);--list-size-m-item-media-margin:var(--s-2,8px);--list-size-m-item-content-font-size:var(--font-size-body-2,14px);--list-size-m-item-content-line-height:var(--font-lineheight-2,1.5);--list-size-m-item-title-font-size:var(--font-size-subhead,16px);--list-size-m-item-title-line-height:var(--font-lineheight-2,1.5);--list-size-m-item-title-font-weight:var(--font-weight-2,normal);--list-divider-color:var(--color-line1-2,#e6e6e6);--list-title-color:var(--color-text1-4,#333);--list-content-color:var(--color-text1-3,#666);--list-extra-color:var(--color-text1-2,#999);--avatar-size-large:var(--s-13,52px);--avatar-size-medium:var(--s-10,40px);--avatar-size-small:var(--s-7,28px);--avatar-border-radius:var(--corner-1,3px);--date-picker-panel-footer-padding-lr:var(--s-5,20px);--date-picker-panel-footer-padding-tb:var(--s-2,8px);--date-picker-panel-background:var(--color-white,#fff);--date-picker-panel-time-panel-separator-color:var(--color-line1-2,#e6e6e6);--date-picker-calendar-icon:var(--icon-content-calendar,"");--line-0:var(--line-zero);--shadow-0:var(--shadow-zero);--corner-right-angle:var(--corner-zero);--s-0:var(--s-zero)} -/*! - * @alifd/theme-design-pro@0.8.0 (https://fusion.design) - * @alifd/next@1.25.24 (https://fusion.design) - * Copyright 2018-present Alibaba Group, - * Licensed under MIT (https://github.com/alibaba-fusion/next/blob/master/LICENSE) - */.next-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;top:0;margin:-1px}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}ol,ul{list-style:none;margin:0;padding:0}li{margin-left:0}hr{border:solid #e6e6e6;border-width:1px 0 0;border:0 var(--line-solid,solid) var(--color-line1-2,#e6e6e6);border-top:var(--line-1,1px) var(--line-solid,solid) var(--color-line1-2,#e6e6e6)}a{text-decoration:none}a:link{color:#298dff;color:var(--color-link-1,#298dff)}a:visited{color:#4a83c5;color:var(--color-link-2,#4a83c5)}a:active,a:hover{color:#2580e7;color:var(--color-link-3,#2580e7)}a:active{text-decoration:underline}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-thin.ttf) format("truetype");font-weight:200;font-display:swap}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-light.ttf) format("truetype");font-weight:300;font-display:swap}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-regular.ttf) format("truetype");font-weight:400;font-display:swap}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-medium.ttf) format("truetype");font-weight:500;font-display:swap}@font-face{font-family:Roboto;src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.eot);src:url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.eot#iefix) format("embedded-opentype"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.woff2) format("woff2"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.woff) format("woff"),url(//i.alicdn.com/artascope-font/20160419204543/font/roboto-bold.ttf) format("truetype");font-weight:700;font-display:swap}html{font-size:100%}body{font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571;color:#333;color:var(--color-text1-4,#333)}button,input,optgroup,select,textarea{font-family:inherit}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{margin-bottom:12px;margin-bottom:calc(var(--font-size-headline, 24px)*0.5);font-size:24px;font-size:var(--font-size-headline,24px);line-height:36px}h1,h2{font-weight:500;font-weight:var(--font-weight-medium,500)}h2{margin-bottom:10px;margin-bottom:calc(var(--font-size-title, 20px)*0.5);font-size:20px;font-size:var(--font-size-title,20px);line-height:30px}h3,h4{margin-bottom:8px;margin-bottom:calc(var(--font-size-subhead, 16px)*0.5);font-size:16px;font-size:var(--font-size-subhead,16px)}h3,h4,h5{font-weight:400;font-weight:var(--font-weight-2,normal);line-height:24px}h5{margin-bottom:7px;margin-bottom:calc(var(--font-size-body-1, 14px)*0.5);font-size:14px;font-size:var(--font-size-body-2,14px)}h6{margin-bottom:7px;margin-bottom:calc(var(--font-size-body-2, 14px)*0.5);font-weight:500;font-weight:var(--font-weight-medium,500)}h6,p{font-size:14px;font-size:var(--font-size-body-1,14px);line-height:20px}p{margin-bottom:7px;margin-bottom:calc(var(--font-size-body-1, 14px)*0.5);font-weight:400;font-weight:var(--font-weight-2,normal)}strong{font-weight:500}small{font-size:75%}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-ms-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-ms-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-ms-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-ms-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-ms-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-ms-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-ms-transform:translateY(-24px);transform:translateY(-24px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-ms-transform:translateY(-24px);transform:translateY(-24px)}}@-webkit-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-ms-transform:translateY(-8px);transform:translateY(-8px)}}@keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-ms-transform:translateY(-8px);transform:translateY(-8px)}}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-webkit-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-ms-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-ms-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-ms-transform:scale(.8);transform:scale(.8)}}@keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-ms-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-webkit-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-ms-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-ms-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInDown,.fadeInLeft{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInRight,.fadeInUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOut,.fadeOutDown{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft,.fadeOutRight{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideInDown,.slideInUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft,.slideInRight{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutRight,.slideOutUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.slideOutDown,.slideOutLeft{-webkit-backface-visibility:hidden;backface-visibility:hidden}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.zoomIn,.zoomOut{-webkit-backface-visibility:hidden;backface-visibility:hidden}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInDown{-webkit-animation-name:expandInDown;animation-name:expandInDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInDown,.expandOutUp{-webkit-backface-visibility:hidden;backface-visibility:hidden}.expandOutUp{-webkit-animation-name:expandOutUp;animation-name:expandOutUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInUp{-webkit-animation-name:expandInUp;animation-name:expandInUp;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.expandInUp,.expandOutDown{-webkit-backface-visibility:hidden;backface-visibility:hidden}.expandOutDown{-webkit-animation-name:expandOutDown;animation-name:expandOutDown;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInDownSmall{-webkit-animation-name:fadeInDownSmall;animation-name:fadeInDownSmall;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.fadeInDownSmall,.fadeOutUpSmall{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fadeOutUpSmall{-webkit-animation-name:fadeOutUpSmall;animation-name:fadeOutUpSmall;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.zoomInBig{-webkit-animation-name:zoomInBig;animation-name:zoomInBig;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.zoomInBig,.zoomOutBig{-webkit-backface-visibility:hidden;backface-visibility:hidden}.zoomOutBig{-webkit-animation-name:zoomOutBig;animation-name:zoomOutBig;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;backface-visibility:hidden}.expand-enter{overflow:hidden}.expand-enter-active{-webkit-transition:all .3s ease-out;transition:all .3s ease-out}.expand-enter-active>*{-webkit-animation-name:expandInWithFade;animation-name:expandInWithFade;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;backface-visibility:hidden}.expand-leave{overflow:hidden}.expand-leave-active{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.expand-leave-active>*{-webkit-animation-name:expandOutWithFade;animation-name:expandOutWithFade;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;backface-visibility:hidden}.next-icon[dir=rtl]:before{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}@font-face{font-family:NextIcon;src:url(//at.alicdn.com/t/font_1533967_slipq25tezj.eot);src:url(//at.alicdn.com/t/font_1533967_slipq25tezj.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_1533967_slipq25tezj.woff2) format("woff2"),url(//at.alicdn.com/t/font_1533967_slipq25tezj.woff) format("woff"),url(//at.alicdn.com/t/font_1533967_slipq25tezj.ttf) format("truetype"),url(//at.alicdn.com/t/font_1533967_slipq25tezj.svg#NextIcon) format("svg");font-display:swap}.next-icon{display:inline-block;font-family:NextIcon;font-style:normal;font-weight:400;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.next-icon:before{display:inline-block;vertical-align:middle;text-align:center}.next-icon-smile:before{content:"";content:var(--icon-content-smile,"\e65f")}.next-icon-cry:before{content:"";content:var(--icon-content-cry,"\e65d")}.next-icon-success:before{content:"";content:var(--icon-content-success,"\e60a")}.next-icon-warning:before{content:"";content:var(--icon-content-warning,"\e60b")}.next-icon-prompt:before{content:"";content:var(--icon-content-prompt,"\e60c")}.next-icon-error:before{content:"";content:var(--icon-content-error,"\e60d")}.next-icon-help:before{content:"";content:var(--icon-content-help,"\e673")}.next-icon-clock:before{content:"";content:var(--icon-content-clock,"\e621")}.next-icon-success-filling:before{content:"";content:var(--icon-content-success-filling,"\e63a")}.next-icon-delete-filling:before{content:"";content:var(--icon-content-delete-filling,"\e623")}.next-icon-favorites-filling:before{content:"";content:var(--icon-content-favorites-filling,"\e60e")}.next-icon-add:before{content:"";content:var(--icon-content-add,"\e655")}.next-icon-minus:before{content:"";content:var(--icon-content-minus,"\e601")}.next-icon-arrow-up:before{content:"";content:var(--icon-content-arrow-up,"\e625")}.next-icon-arrow-down:before{content:"";content:var(--icon-content-arrow-down,"\e63d")}.next-icon-arrow-left:before{content:"";content:var(--icon-content-arrow-left,"\e61d")}.next-icon-arrow-right:before{content:"";content:var(--icon-content-arrow-right,"\e619")}.next-icon-arrow-double-left:before{content:"";content:var(--icon-content-arrow-double-left,"\e659")}.next-icon-arrow-double-right:before{content:"";content:var(--icon-content-arrow-double-right,"\e65e")}.next-icon-switch:before{content:"";content:var(--icon-content-switch,"\e6b3")}.next-icon-sorting:before{content:"";content:var(--icon-content-sorting,"\e634")}.next-icon-descending:before{content:"";content:var(--icon-content-descending,"\e61f")}.next-icon-ascending:before{content:"";content:var(--icon-content-ascending,"\e61e")}.next-icon-select:before{content:"";content:var(--icon-content-select,"\e632")}.next-icon-semi-select:before{content:"";content:var(--icon-content-semi-select,"\e633")}.next-icon-search:before{content:"";content:var(--icon-content-search,"\e656")}.next-icon-close:before{content:"";content:var(--icon-content-close,"\e626")}.next-icon-ellipsis:before{content:"";content:var(--icon-content-ellipsis,"\e654")}.next-icon-picture:before{content:"";content:var(--icon-content-picture,"\e631")}.next-icon-calendar:before{content:"";content:var(--icon-content-calendar,"\e607")}.next-icon-ashbin:before{content:"";content:var(--icon-content-ashbin,"\e639")}.next-icon-upload:before{content:"";content:var(--icon-content-upload,"\e7ee")}.next-icon-download:before{content:"";content:var(--icon-content-download,"\e628")}.next-icon-set:before{content:"";content:var(--icon-content-set,"\e683")}.next-icon-edit:before{content:"";content:var(--icon-content-edit,"\e63b")}.next-icon-refresh:before{content:"";content:var(--icon-content-refresh,"\e677")}.next-icon-filter:before{content:"";content:var(--icon-content-filter,"\e627")}.next-icon-attachment:before{content:"";content:var(--icon-content-attachment,"\e665")}.next-icon-account:before{content:"";content:var(--icon-content-account,"\e608")}.next-icon-email:before{content:"";content:var(--icon-content-email,"\e605")}.next-icon-atm:before{content:"";content:var(--icon-content-atm,"\e606")}.next-icon-loading:before{content:"";content:var(--icon-content-loading,"\e646");-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}.next-icon-eye:before{content:"";content:var(--icon-content-eye,"\e611")}.next-icon-copy:before{content:"";content:var(--icon-content-copy,"\e60f")}.next-icon-toggle-left:before{content:"";content:var(--icon-content-toggle-left,"\e602")}.next-icon-toggle-right:before{content:"";content:var(--icon-content-toggle-right,"\e603")}.next-icon-eye-close:before{content:"";content:var(--icon-content-eye-close,"\e600")}.next-icon-unlock:before{content:"";content:var(--icon-content-unlock,"\e615")}.next-icon-lock:before{content:"";content:var(--icon-content-lock,"\e617")}.next-icon-exit:before{content:"";content:var(--icon-content-exit,"\e616")}.next-icon-chart-bar:before{content:"";content:var(--icon-content-chart-bar,"\e612")}.next-icon-chart-pie:before{content:"";content:var(--icon-content-chart-pie,"\e613")}.next-icon-form:before{content:"";content:var(--icon-content-form,"\e7fb")}.next-icon-detail:before{content:"";content:var(--icon-content-detail,"\e7f8")}.next-icon-list:before{content:"";content:var(--icon-content-list,"\e7f9")}.next-icon-dashboard:before{content:"";content:var(--icon-content-dashboard,"\e7fa")}@-webkit-keyframes loadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.next-icon.next-xxs .next-icon-remote,.next-icon.next-xxs:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-icon.next-xxs{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-icon.next-xxs:before{width:16px;font-size:16px}}.next-icon.next-xs .next-icon-remote,.next-icon.next-xs:before{width:12px;font-size:12px;line-height:inherit}.next-icon.next-small .next-icon-remote,.next-icon.next-small:before{width:16px;font-size:16px;line-height:inherit}.next-icon.next-medium .next-icon-remote,.next-icon.next-medium:before{width:20px;font-size:20px;line-height:inherit}.next-icon.next-large .next-icon-remote,.next-icon.next-large:before{width:24px;font-size:24px;line-height:inherit}.next-icon.next-xl .next-icon-remote,.next-icon.next-xl:before{width:32px;font-size:32px;line-height:inherit}.next-icon.next-xxl .next-icon-remote,.next-icon.next-xxl:before{width:48px;font-size:48px;line-height:inherit}.next-icon.next-xxxl .next-icon-remote,.next-icon.next-xxxl:before{width:64px;font-size:64px;line-height:inherit}.next-icon.next-inherit .next-icon-remote,.next-icon.next-inherit:before{width:inherit;font-size:inherit;line-height:inherit}.next-icon .next-icon-remote,.next-icon.next-inherit .next-icon-remote{width:1em;height:1em;vertical-align:middle;fill:currentColor}.next-overlay-wrapper .next-overlay-inner{z-index:1001}.next-overlay-wrapper .next-overlay-backdrop{position:fixed;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.3);-webkit-transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1);opacity:0}.next-overlay-wrapper.opened .next-overlay-backdrop{opacity:1}.next-loading-fusion-reactor[dir=rtl]{-webkit-animation-name:nextVectorRouteRTL;animation-name:nextVectorRouteRTL}@-webkit-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-ms-transform:rotate(-1turn);transform:rotate(-1turn)}}.next-loading{position:relative}.next-loading.next-open{pointer-events:none}.next-loading .next-loading-component{opacity:.7;-webkit-filter:blur(1px);filter:blur(1px);-webkit-filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";position:relative;pointer-events:none}.next-loading-masker{position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;opacity:.2;background:#fff}.next-loading-inline{display:inline-block}.next-loading-tip{display:block;position:absolute;top:50%;left:50%;z-index:4;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center}.next-loading-tip-fullscreen{top:inherit;left:inherit;-webkit-transform:inherit;-ms-transform:inherit;transform:inherit}.next-loading-tip-placeholder{display:none}.next-loading-right-tip .next-loading-indicator{display:inline-block}.next-loading-right-tip .next-loading-tip-content{position:absolute;display:block;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-loading-right-tip .next-loading-tip-placeholder{display:inline-block;visibility:hidden;margin-left:1em}.next-loading-fusion-reactor{display:inline-block;width:40px;width:var(--loading-large-size,40px);height:40px;height:var(--loading-large-size,40px);position:relative;margin:0;-webkit-animation-duration:5.6s;animation-duration:5.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:nextVectorRoute;animation-name:nextVectorRoute}.next-loading-fusion-reactor .next-loading-dot{position:absolute;margin:auto;width:12px;width:var(--loading-large-dot-size,12px);height:12px;height:var(--loading-large-dot-size,12px);border-radius:50%;background:#209bfa;background:var(--loading-dot-color,#209bfa);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.4s;animation-duration:1.4s}.next-loading-fusion-reactor .next-loading-dot:first-child{top:0;bottom:0;left:0;-webkit-animation-name:nextVectorDotsX;animation-name:nextVectorDotsX}.next-loading-fusion-reactor .next-loading-dot:nth-child(2){left:0;right:0;top:0;opacity:.8;-webkit-animation-name:nextVectorDotsY;animation-name:nextVectorDotsY}.next-loading-fusion-reactor .next-loading-dot:nth-child(3){top:0;bottom:0;right:0;opacity:.6;-webkit-animation-name:nextVectorDotsXR;animation-name:nextVectorDotsXR}.next-loading-fusion-reactor .next-loading-dot:nth-child(4){left:0;right:0;bottom:0;opacity:.2;-webkit-animation-name:nextVectorDotsYR;animation-name:nextVectorDotsYR}.next-loading-medium-fusion-reactor{width:24px;width:var(--loading-medium-size,24px);height:24px;height:var(--loading-medium-size,24px)}.next-loading-medium-fusion-reactor .next-loading-dot{width:8px;width:var(--loading-medium-dot-size,8px);height:8px;height:var(--loading-medium-dot-size,8px)}.next-loading-medium-fusion-reactor .next-loading-dot:first-child{-webkit-animation-name:nextVectorDotsX-medium;animation-name:nextVectorDotsX-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(2){-webkit-animation-name:nextVectorDotsY-medium;animation-name:nextVectorDotsY-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(3){-webkit-animation-name:nextVectorDotsXR-medium;animation-name:nextVectorDotsXR-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(4){-webkit-animation-name:nextVectorDotsYR-medium;animation-name:nextVectorDotsYR-medium}@-webkit-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;bottom:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{bottom:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;bottom:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{bottom:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@-webkit-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;top:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{top:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;top:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{top:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@-webkit-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;left:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{left:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;left:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{left:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@-webkit-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;right:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{right:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;right:calc(var(--loading-large-size, 40px)/2 - var(--loading-large-dot-size, 12px)*1.2/2);width:14.4px;width:calc(var(--loading-large-dot-size, 12px)*1.2);height:14.4px;height:calc(var(--loading-large-dot-size, 12px)*1.2)}90%{right:0;height:12px;height:var(--loading-large-dot-size,12px);width:12px;width:var(--loading-large-dot-size,12px)}}@-webkit-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;bottom:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{bottom:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;bottom:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{bottom:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@-webkit-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;top:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{top:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;top:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{top:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@-webkit-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;left:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{left:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;left:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{left:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@-webkit-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;right:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{right:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}@keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;right:calc(var(--loading-medium-size, 24px)/2 - var(--loading-medium-dot-size, 8px)*1.2/2);width:9.6px;width:calc(var(--loading-medium-dot-size, 8px)*1.2);height:9.6px;height:calc(var(--loading-medium-dot-size, 8px)*1.2)}90%{right:0;height:8px;height:var(--loading-medium-dot-size,8px);width:8px;width:var(--loading-medium-dot-size,8px)}}.next-radio-button-large[dir=rtl]>label:first-child{margin-left:-1px;border-top-right-radius:3px;border-top-right-radius:var(--radio-button-corner-large,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--radio-button-corner-large,3px);border-top-left-radius:0;border-bottom-left-radius:0}.next-radio-button-large[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-top-left-radius:var(--radio-button-corner-large,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--radio-button-corner-large,3px)}.next-radio-button-large[dir=rtl] .next-radio-label{height:38px;height:calc(var(--radio-button-height-large, 40px) - 2px);line-height:38px;line-height:calc(var(--radio-button-height-large, 40px) - 2px);font-size:16px;font-size:var(--radio-button-font-size-large,16px)}.next-radio-button-medium[dir=rtl]>label:first-child{margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:3px;border-top-right-radius:var(--radio-button-corner-medium,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--radio-button-corner-medium,3px)}.next-radio-button-medium[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-top-left-radius:var(--radio-button-corner-medium,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--radio-button-corner-medium,3px)}.next-radio-button-small[dir=rtl]>label:first-child{margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:3px;border-top-right-radius:var(--radio-button-corner-small,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--radio-button-corner-small,3px)}.next-radio-button-small[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-top-left-radius:var(--radio-button-corner-small,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--radio-button-corner-small,3px)}.next-radio-wrapper[dir=rtl] .next-radio-label{margin-left:0;margin-right:4px}.next-radio-group[dir=rtl] .next-radio-label{margin-right:4px;margin-left:16px}.next-radio-button[dir=rtl]>label .next-radio-label{margin:0}.next-radio-wrapper{outline:0;display:inline-block}.next-radio-wrapper .next-radio{display:inline-block;vertical-align:middle;position:relative;line-height:1}.next-radio-wrapper .next-radio,.next-radio-wrapper .next-radio *,.next-radio-wrapper .next-radio :after,.next-radio-wrapper .next-radio :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-radio-wrapper .next-radio input[type=radio]{opacity:0;position:absolute;vertical-align:middle;top:0;left:0;width:16px;width:var(--radio-width,16px);height:16px;height:var(--radio-width,16px);margin:0;cursor:pointer}.next-radio-wrapper .next-radio-inner{display:block;width:16px;width:var(--radio-width,16px);height:16px;height:var(--radio-width,16px);background:#fff;background:var(--radio-bg-color,#fff);border-radius:50%;border-radius:var(--radio-radius-size,50%);border:1px solid #ddd;border:var(--radio-circle-border-width,1px) solid var(--radio-border-color,#ddd);-webkit-transition:all .1s linear;transition:all .1s linear;-webkit-box-shadow:none;-webkit-box-shadow:var(--radio-shadow,none);box-shadow:none;box-shadow:var(--radio-shadow,none)}.next-radio-wrapper .next-radio-inner:after{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);position:absolute;border-radius:50%;border-radius:var(--radio-radius-size,50%);top:50%;margin-top:-2px;margin-top:calc(0px - var(--radio-circle-size, 4px)/2);left:50%;margin-left:-2px;margin-left:calc(0px - var(--radio-circle-size, 4px)/2);background:#fff;content:"";-webkit-transition:all .1s linear;transition:all .1s linear}.next-radio-wrapper.checked .next-radio-inner{border-color:#209bfa;border-color:var(--radio-checked-border-color,#209bfa);background:#209bfa;background:var(--radio-checked-bg-color,#209bfa)}.next-radio-wrapper.checked .next-radio-inner:after{width:4px;width:var(--radio-circle-size,4px);height:4px;height:var(--radio-circle-size,4px);font-weight:700;background:#fff;background:var(--radio-checked-circle-color,#fff);-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-radio-wrapper.checked.hovered .next-radio-inner,.next-radio-wrapper.checked:hover .next-radio-inner{border-color:transparent;border-color:var(--radio-checked-hovered-border-color,transparent)}.next-radio-wrapper.disabled input[type=radio]{cursor:not-allowed}.next-radio-wrapper.disabled .next-radio-inner{border-color:#eee;border-color:var(--radio-disabled-border-color,#eee);background:#fafafa;background:var(--radio-disabled-bg-color,#fafafa)}.next-radio-wrapper.disabled .next-radio-inner:after{background:#ccc;background:var(--radio-disabled-circle-color,#ccc)}.next-radio-wrapper.disabled .next-radio-inner.hovered,.next-radio-wrapper.disabled .next-radio-inner:hover{border-color:#eee;border-color:var(--radio-disabled-border-color,#eee)}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#eee;border-color:var(--radio-checked-disabled-border-color,#eee);background:#fafafa;background:var(--radio-checked-disabled-bg-color,#fafafa)}.next-radio-wrapper.disabled.checked .next-radio-inner:after{background:#ccc;background:var(--radio-checked-disabled-circle-color,#ccc)}.next-radio-wrapper.disabled .next-radio-label{color:#ccc;color:var(--radio-normal-font-color-disabled,#ccc)}.next-radio-wrapper:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper:not(.disabled):hover .next-radio-inner{border-color:#209bfa;border-color:var(--radio-hovered-border-color,#209bfa);background-color:#add9ff;background-color:var(--radio-hovered-bg-color,#add9ff)}.next-radio-wrapper:not(.disabled).hovered .next-radio-label,.next-radio-wrapper:not(.disabled):hover .next-radio-label{cursor:pointer}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner{border-color:transparent;border-color:var(--radio-checked-hovered-border-color,transparent);background:#1274e7;background:var(--radio-checked-hovered-bg-color,#1274e7)}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner:after,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner:after{background:#fff;background:var(--radio-checked-hovered-circle-color,#fff)}.next-radio-button .next-radio,.next-radio-button input[type=radio]{width:0;height:0}.next-radio-button>label{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;z-index:1;margin:0 0 0 -1px;border:1px solid #ddd;border:1px solid var(--radio-button-border-color,#ddd);background-color:#fff;background-color:var(--radio-button-bg-color,#fff);-webkit-transition:all .1s linear;transition:all .1s linear;vertical-align:middle}.next-radio-button>label .next-radio-label{display:block;color:#333;color:var(--radio-button-font-color,#333);margin:0;-webkit-transition:all .1s linear;transition:all .1s linear}.next-radio-button>label.hovered,.next-radio-button>label:hover{z-index:10;border-color:#ccc;border-color:var(--radio-button-border-color-hovered,#ccc);background-color:#f9f9f9;background-color:var(--radio-button-bg-color-hovered,#f9f9f9)}.next-radio-button>label.hovered .next-radio-label,.next-radio-button>label:hover .next-radio-label{color:#333;color:var(--radio-button-font-color-hovered,#333)}.next-radio-button>label.checked{z-index:11;border-color:#209bfa;border-color:var(--radio-button-border-color-checked,#209bfa);background-color:#fff;background-color:var(--radio-button-bg-color-checked,#fff)}.next-radio-button>label.checked .next-radio-label{color:#209bfa;color:var(--radio-button-font-color-checked,#209bfa)}.next-radio-button>label.disabled{z-index:0;cursor:not-allowed;border-color:#eee;border-color:var(--radio-button-border-color-disabled,#eee);background-color:#fafafa;background-color:var(--radio-button-bg-color-disabled,#fafafa)}.next-radio-button>label.disabled .next-radio-label{color:#ccc;color:var(--radio-button-font-color-disabled,#ccc)}.next-radio-button>label.checked.disabled{z-index:0;border-color:#eee;border-color:var(--radio-button-border-color-checked-disabled,#eee);background-color:#f9f9f9;background-color:var(--radio-button-bg-color-checked-disabled,#f9f9f9)}.next-radio-button>label.checked.disabled .next-radio-label{color:#ccc;color:var(--radio-button-font-color-checked-disabled,#ccc)}.next-radio-button-large>label{padding:0 8px;padding:0 var(--radio-button-padding-large,8px);height:40px;height:var(--radio-button-height-large,40px);line-height:40px;line-height:var(--radio-button-height-large,40px)}.next-radio-button-large>label:first-child{margin-left:0;border-top-left-radius:3px;border-top-left-radius:var(--radio-button-corner-large,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--radio-button-corner-large,3px)}.next-radio-button-large>label:last-child{border-top-right-radius:3px;border-top-right-radius:var(--radio-button-corner-large,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--radio-button-corner-large,3px)}.next-radio-button-large .next-radio-label{height:38px;height:calc(var(--radio-button-height-large, 40px) - 2px);line-height:38px;line-height:calc(var(--radio-button-height-large, 40px) - 2px);font-size:16px;font-size:var(--radio-button-font-size-large,16px)}.next-radio-button-medium>label{padding:0 8px;padding:0 var(--radio-button-padding-medium,8px);height:32px;height:var(--radio-button-height-medium,32px);line-height:32px;line-height:var(--radio-button-height-medium,32px)}.next-radio-button-medium>label:first-child{margin-left:0;border-top-left-radius:3px;border-top-left-radius:var(--radio-button-corner-medium,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--radio-button-corner-medium,3px)}.next-radio-button-medium>label:last-child{border-top-right-radius:3px;border-top-right-radius:var(--radio-button-corner-medium,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--radio-button-corner-medium,3px)}.next-radio-button-medium .next-radio-label{height:30px;height:calc(var(--radio-button-height-medium, 32px) - 2px);line-height:30px;line-height:calc(var(--radio-button-height-medium, 32px) - 2px);font-size:14px;font-size:var(--radio-button-font-size-medium,14px)}.next-radio-button-small>label{padding:0 8px;padding:0 var(--radio-button-padding-small,8px);height:20px;height:var(--radio-button-height-small,20px);line-height:20px;line-height:var(--radio-button-height-small,20px)}.next-radio-button-small>label:first-child{margin-left:0;border-top-left-radius:3px;border-top-left-radius:var(--radio-button-corner-small,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--radio-button-corner-small,3px)}.next-radio-button-small>label:last-child{border-top-right-radius:3px;border-top-right-radius:var(--radio-button-corner-small,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--radio-button-corner-small,3px)}.next-radio-button-small .next-radio-label{height:18px;height:calc(var(--radio-button-height-small, 20px) - 2px);line-height:18px;line-height:calc(var(--radio-button-height-small, 20px) - 2px);font-size:12px;font-size:var(--radio-button-font-size-small,12px)}.next-radio-single-input input[type=radio]{opacity:0;position:absolute;top:0;left:0;margin:0}.next-radio-group{display:inline-block}.next-radio-group .next-radio-wrapper{margin-right:12px}.next-radio-group .next-radio-wrapper:last-child{margin-right:0}.next-radio-group .next-radio-label{color:#333;color:var(--radio-normal-font-color,#333)}.next-radio-group.disabled .next-radio-label{color:#ccc;color:var(--radio-normal-font-color-disabled,#ccc)}.next-radio-group.next-radio-button .next-radio-wrapper{margin-right:0}.next-radio-group-ver .next-radio-wrapper{display:block;margin-bottom:8px}.next-radio-label{margin:0 0 0 4px;margin-left:var(--radio-font-margin-left,4px);margin-right:4px;margin-right:var(--radio-font-margin-left,4px);font-size:14px;font-size:var(--radio-font-size,14px);vertical-align:middle;line-height:1;color:#333;color:var(--radio-normal-font-color,#333)}@-moz-document url-prefix(){.next-radio{margin-top:-1px}@supports(-webkit-animation:calc(0s)) or (animation:calc(0s)){.next-radio{margin-top:-3px}}}.next-badge{position:relative;display:inline-block;vertical-align:middle;line-height:1}.next-badge,.next-badge *,.next-badge :after,.next-badge :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-badge .next-badge-count{color:#fff;background:#d23c26;background:var(--badge-color-bg,#d23c26);text-align:center;white-space:nowrap;border-radius:8px;border-radius:var(--badge-size-count-border-radius,8px);position:absolute;width:auto;height:16px;height:var(--badge-size-count-config-height,16px);min-width:16px;min-width:var(--badge-size-count-config-height,16px);padding:0 4px;padding:0 var(--badge-size-count-padding-lr,4px) 0 var(--badge-size-count-padding-lr,4px);font-size:12px;font-size:var(--badge-size-count-font,12px);line-height:16px;line-height:var(--badge-size-count-config-height,16px);-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);top:-.5em}.next-badge .next-badge-count a,.next-badge .next-badge-count a:hover{color:#fff}.next-badge .next-badge-dot{color:#fff;background:#d23c26;background:var(--badge-dot-color-bg,#d23c26);text-align:center;white-space:nowrap;border-radius:8px;border-radius:var(--badge-size-dot-border-radius,8px);position:absolute;width:8px;width:var(--badge-size-dot-width,8px);height:8px;height:var(--badge-size-dot-width,8px);min-width:8px;min-width:var(--badge-size-dot-width,8px);padding:0;font-size:1px;line-height:1;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);top:-.5em}.next-badge .next-badge-dot a,.next-badge .next-badge-dot a:hover{color:#fff}.next-badge .next-badge-custom{line-height:1.166667;white-space:nowrap;font-size:12px;font-size:var(--font-size-caption,12px);padding-left:4px;padding-left:var(--badge-size-custom-padding-lr,4px);padding-right:4px;padding-right:var(--badge-size-custom-padding-lr,4px);border-radius:3px;border-radius:var(--badge-size-custom-border-radius,3px);-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.next-badge .next-badge-custom>*{line-height:1}.next-badge .next-badge-custom>.next-icon:before,.next-badge .next-badge-custom>i:before{font-size:inherit;width:auto;vertical-align:top}.next-badge .next-badge-scroll-number{position:absolute;top:-4px;z-index:10;overflow:hidden;-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}.next-badge-scroll-number-only{position:relative;display:inline-block;transition:transform .1s linear,-webkit-transform .1s linear;min-width:8px;min-width:var(--badge-size-dot-width,8px)}.next-badge-scroll-number-only span{display:block;height:16px;height:var(--badge-size-count-config-height,16px);line-height:16px;line-height:var(--badge-size-count-config-height,16px);font-size:12px;font-size:var(--badge-size-count-font,12px)}.next-badge-not-a-wrapper .next-badge-count,.next-badge-not-a-wrapper .next-badge-custom,.next-badge-not-a-wrapper .next-badge-dot{position:relative;display:block;top:auto;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.next-badge-list-wrapper{margin-left:0}.next-badge-list-wrapper li{margin-bottom:0;margin-bottom:var(--badge-size-list-margin,0);list-style:none}.next-badge[dir=rtl] .next-badge-custom{padding-right:4px;padding-right:var(--badge-size-custom-padding-lr,4px);padding-left:4px;padding-left:var(--badge-size-custom-padding-lr,4px)}.next-badge[dir=rtl] .next-badge-scroll-number{left:0;-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}.next-balloon{position:absolute;top:0;max-width:300px;max-width:var(--balloon-size-max-width,300px);border-style:solid;border-style:var(--balloon-border-style,solid);border-radius:3px;border-radius:var(--balloon-corner,3px);font-size:14px;font-size:var(--balloon-content-font-size,14px);font-weight:400;font-weight:var(--balloon-content-font-weight,normal);word-wrap:break-all;word-wrap:break-word;z-index:0}.next-balloon,.next-balloon *,.next-balloon :after,.next-balloon :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-balloon:focus,.next-balloon :focus{outline:0}.next-balloon-title{margin-bottom:8px;margin-bottom:var(--balloon-size-header-margin-bottom,8px);font-size:16px;font-size:var(--balloon-title-font-size,16px);font-weight:700;font-weight:var(--balloon-title-font-weight,bold)}.next-balloon-title.next-balloon-closable{padding:0 40px 0 0;padding:0 var(--balloon-size-padding-closable-right,40px) 0 0}.next-balloon-title.next-balloon-closable .next-balloon-close{top:-1px;-webkit-transform:translateY(16px);-webkit-transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-title-font-size, 16px)/2 - var(--balloon-size-close, 16px)/2));-ms-transform:translateY(16px);-ms-transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-title-font-size, 16px)/2 - var(--balloon-size-close, 16px)/2));transform:translateY(16px);transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-title-font-size, 16px)/2 - var(--balloon-size-close, 16px)/2));right:16px;right:var(--balloon-size-padding-right,16px)}.next-balloon-primary{color:#333;color:var(--balloon-primary-color,#333);border-color:#209bfa;border-color:var(--balloon-primary-color-border,#209bfa);background-color:#add9ff;background-color:var(--balloon-primary-color-bg,#add9ff);-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--balloon-primary-shadow,0 1px 3px 0 rgba(0,0,0,.12));box-shadow:0 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--balloon-primary-shadow,0 1px 3px 0 rgba(0,0,0,.12));border-width:1px;border-width:var(--balloon-primary-border-width,1px)}.next-balloon-primary .next-balloon-close{position:absolute;top:-1px;-webkit-transform:translateY(15px);-webkit-transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-content-font-size, 14px)/2 - var(--balloon-size-close, 16px)/2));-ms-transform:translateY(15px);-ms-transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-content-font-size, 14px)/2 - var(--balloon-size-close, 16px)/2));transform:translateY(15px);transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-content-font-size, 14px)/2 - var(--balloon-size-close, 16px)/2));right:12px;right:var(--balloon-size-close-margin-right,12px);font-size:16px;font-size:var(--balloon-size-close,16px);cursor:pointer;color:#999;color:var(--balloon-primary-color-close,#999)}.next-balloon-primary .next-balloon-close .next-icon,.next-balloon-primary .next-balloon-close .next-icon:before{width:16px;width:var(--balloon-size-close,16px);height:16px;height:var(--balloon-size-close,16px);line-height:1em}.next-balloon-primary .next-balloon-close .next-icon:before{font-size:16px;font-size:var(--balloon-size-close,16px)}.next-balloon-primary .next-balloon-close :hover{color:#333;color:var(--balloon-primary-color-close-hover,#333)}.next-balloon-primary:after{position:absolute;width:12px;width:var(--balloon-size-arrow-size,12px);height:12px;height:var(--balloon-size-arrow-size,12px);content:"";-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-sizing:content-box!important;box-sizing:content-box!important;border:1px solid #209bfa;border:var(--balloon-primary-border-width,1px) var(--balloon-border-style,solid) var(--balloon-primary-color-border,#209bfa);background-color:#add9ff;background-color:var(--balloon-primary-color-bg,#add9ff);z-index:-1}.next-balloon-primary.next-balloon-top:after{top:-7px;top:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));left:calc(50% - 7px);left:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-right:after{top:calc(50% - 7px);top:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));right:-7px;right:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-left:none;border-bottom:none}.next-balloon-primary.next-balloon-bottom:after{bottom:-7px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));left:calc(50% - 7px);left:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-top:none;border-left:none}.next-balloon-primary.next-balloon-left:after{top:calc(50% - 7px);top:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px))}.next-balloon-primary.next-balloon-left-top:after,.next-balloon-primary.next-balloon-left:after{left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-top:none;border-right:none}.next-balloon-primary.next-balloon-left-top:after{top:12px;top:var(--balloon-size-arrow-margin,12px)}.next-balloon-primary.next-balloon-left-bottom:after{bottom:12px;bottom:var(--balloon-size-arrow-margin,12px);left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-top:none;border-right:none}.next-balloon-primary.next-balloon-right-top:after{top:12px;top:var(--balloon-size-arrow-margin,12px)}.next-balloon-primary.next-balloon-right-bottom:after,.next-balloon-primary.next-balloon-right-top:after{right:-7px;right:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-bottom:none;border-left:none}.next-balloon-primary.next-balloon-right-bottom:after{bottom:12px;bottom:var(--balloon-size-arrow-margin,12px)}.next-balloon-primary.next-balloon-top-left:after{left:12px;left:var(--balloon-size-arrow-margin,12px)}.next-balloon-primary.next-balloon-top-left:after,.next-balloon-primary.next-balloon-top-right:after{top:-7px;top:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-top-right:after{right:12px;right:var(--balloon-size-arrow-margin,12px)}.next-balloon-primary.next-balloon-bottom-left:after{left:12px;left:var(--balloon-size-arrow-margin,12px)}.next-balloon-primary.next-balloon-bottom-left:after,.next-balloon-primary.next-balloon-bottom-right:after{bottom:-7px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));border-top:none;border-left:none}.next-balloon-primary.next-balloon-bottom-right:after{right:12px;right:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal{color:#333;color:var(--balloon-normal-color,#333);border-color:#e6e6e6;border-color:var(--balloon-normal-color-border,#e6e6e6);background-color:#fff;background-color:var(--balloon-normal-color-bg,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--balloon-normal-shadow,0 4px 8px 0 rgba(0,0,0,.12));box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:var(--balloon-normal-shadow,0 4px 8px 0 rgba(0,0,0,.12));border-width:1px;border-width:var(--balloon-normal-border-width,1px)}.next-balloon-normal .next-balloon-close{position:absolute;top:-1px;-webkit-transform:translateY(15px);-webkit-transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-content-font-size, 14px)/2 - var(--balloon-size-close, 16px)/2));-ms-transform:translateY(15px);-ms-transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-content-font-size, 14px)/2 - var(--balloon-size-close, 16px)/2));transform:translateY(15px);transform:translateY(calc(var(--balloon-size-padding-top, 16px) + var(--balloon-content-font-size, 14px)/2 - var(--balloon-size-close, 16px)/2));right:12px;right:var(--balloon-size-close-margin-right,12px);font-size:16px;font-size:var(--balloon-size-close,16px);cursor:pointer;color:#999;color:var(--balloon-normal-color-close,#999)}.next-balloon-normal .next-balloon-close .next-icon,.next-balloon-normal .next-balloon-close .next-icon:before{width:16px;width:var(--balloon-size-close,16px);height:16px;height:var(--balloon-size-close,16px);line-height:1em}.next-balloon-normal .next-balloon-close .next-icon:before{font-size:16px;font-size:var(--balloon-size-close,16px)}.next-balloon-normal .next-balloon-close :hover{color:#666;color:var(--balloon-normal-color-close-hover,#666)}.next-balloon-normal:after{position:absolute;width:12px;width:var(--balloon-size-arrow-size,12px);height:12px;height:var(--balloon-size-arrow-size,12px);content:"";-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-sizing:content-box!important;box-sizing:content-box!important;border:1px solid #e6e6e6;border:var(--balloon-normal-border-width,1px) var(--balloon-border-style,solid) var(--balloon-normal-color-border,#e6e6e6);background-color:#fff;background-color:var(--balloon-normal-color-bg,#fff);z-index:-1}.next-balloon-normal.next-balloon-top:after{top:-7px;top:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));left:calc(50% - 7px);left:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-right:after{top:calc(50% - 7px);top:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));right:-7px;right:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-left:none;border-bottom:none}.next-balloon-normal.next-balloon-bottom:after{bottom:-7px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));left:calc(50% - 7px);left:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-top:none;border-left:none}.next-balloon-normal.next-balloon-left:after{top:calc(50% - 7px);top:calc(50% - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px))}.next-balloon-normal.next-balloon-left-top:after,.next-balloon-normal.next-balloon-left:after{left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-top:none;border-right:none}.next-balloon-normal.next-balloon-left-top:after{top:12px;top:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal.next-balloon-left-bottom:after{bottom:12px;bottom:var(--balloon-size-arrow-margin,12px);left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-top:none;border-right:none}.next-balloon-normal.next-balloon-right-top:after{top:12px;top:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal.next-balloon-right-bottom:after,.next-balloon-normal.next-balloon-right-top:after{right:-7px;right:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-bottom:none;border-left:none}.next-balloon-normal.next-balloon-right-bottom:after{bottom:12px;bottom:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal.next-balloon-top-left:after{left:12px;left:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal.next-balloon-top-left:after,.next-balloon-normal.next-balloon-top-right:after{top:-7px;top:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-top-right:after{right:12px;right:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal.next-balloon-bottom-left:after{left:12px;left:var(--balloon-size-arrow-margin,12px)}.next-balloon-normal.next-balloon-bottom-left:after,.next-balloon-normal.next-balloon-bottom-right:after{bottom:-7px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));border-top:none;border-left:none}.next-balloon-normal.next-balloon-bottom-right:after{right:12px;right:var(--balloon-size-arrow-margin,12px)}.next-balloon.visible{display:block}.next-balloon.hidden{display:none}.next-balloon-medium{padding:16px;padding:var(--balloon-size-padding-top,16px) var(--balloon-size-padding-right,16px) var(--balloon-size-padding-top,16px) var(--balloon-size-padding-right,16px)}.next-balloon-closable{padding:16px 40px 16px 16px;padding:var(--balloon-size-padding-top,16px) var(--balloon-size-padding-closable-right,40px) var(--balloon-size-padding-top,16px) var(--balloon-size-padding-right,16px)}.next-balloon-tooltip{position:absolute;top:0;max-width:300px;max-width:var(--balloon-size-max-width,300px);border-radius:3px;border-radius:var(--balloon-corner,3px);font-size:14px;font-size:var(--balloon-tooltip-content-font-size,14px);font-weight:400;font-weight:var(--balloon-tooltip-content-font-weight,normal);z-index:0;word-wrap:break-all;word-wrap:break-word;color:#fafafa;color:var(--balloon-tooltip-color,#fafafa);background-color:#333;background-color:var(--balloon-tooltip-color-bg,#333);-webkit-box-shadow:none;-webkit-box-shadow:var(--balloon-tooltip-shadow,none);box-shadow:none;box-shadow:var(--balloon-tooltip-shadow,none);border:1px solid transparent;border:var(--balloon-tooltip-border-width,1px) var(--balloon-tooltip-border-style,solid) var(--balloon-tooltip-color-border,transparent)}.next-balloon-tooltip,.next-balloon-tooltip *,.next-balloon-tooltip :after,.next-balloon-tooltip :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-balloon-tooltip .next-balloon-arrow{position:absolute;display:block;width:24px;width:calc(var(--balloon-size-arrow-size, 12px)*2);height:24px;height:calc(var(--balloon-size-arrow-size, 12px)*2);overflow:hidden;background:0 0;pointer-events:none}.next-balloon-tooltip .next-balloon-arrow .next-balloon-arrow-content{content:"";position:absolute;top:0;right:0;bottom:0;left:0;display:block;width:12px;width:var(--balloon-size-arrow-size,12px);height:12px;height:var(--balloon-size-arrow-size,12px);margin:auto;background-color:#333;background-color:var(--balloon-tooltip-color-bg,#333);border:1px solid transparent;border:var(--balloon-tooltip-border-width,1px) var(--balloon-tooltip-border-style,solid) var(--balloon-tooltip-color-border,transparent);pointer-events:auto}.next-balloon-tooltip-top .next-balloon-arrow{top:-24px;top:calc(0px - var(--balloon-size-arrow-size, 12px)*2);left:calc(50% - 12px);left:calc(50% - var(--balloon-size-arrow-size, 12px))}.next-balloon-tooltip-top .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateY(12px) rotate(45deg);-webkit-transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateY(12px) rotate(45deg);-ms-transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateY(12px) rotate(45deg);transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip-right .next-balloon-arrow{top:calc(50% - 12px);top:calc(50% - var(--balloon-size-arrow-size, 12px));right:-24px;right:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-right .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(-12px) rotate(45deg);-webkit-transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);-ms-transform:translateX(-12px) rotate(45deg);-ms-transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);transform:translateX(-12px) rotate(45deg);transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg)}.next-balloon-tooltip-bottom .next-balloon-arrow{left:calc(50% - 12px);left:calc(50% - var(--balloon-size-arrow-size, 12px));bottom:-24px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-bottom .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateY(-12px) rotate(45deg);-webkit-transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);-ms-transform:translateY(-12px) rotate(45deg);-ms-transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);transform:translateY(-12px) rotate(45deg);transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg)}.next-balloon-tooltip-left .next-balloon-arrow{top:calc(50% - 12px);top:calc(50% - var(--balloon-size-arrow-size, 12px));left:-24px;left:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-left .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(12px) rotate(45deg);-webkit-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateX(12px) rotate(45deg);-ms-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateX(12px) rotate(45deg);transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip-left-top .next-balloon-arrow{top:6px;top:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);left:-24px;left:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-left-top .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(12px) rotate(45deg);-webkit-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateX(12px) rotate(45deg);-ms-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateX(12px) rotate(45deg);transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip-left-bottom .next-balloon-arrow{bottom:6px;bottom:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);left:-24px;left:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-left-bottom .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(12px) rotate(45deg);-webkit-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateX(12px) rotate(45deg);-ms-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateX(12px) rotate(45deg);transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip-right-top .next-balloon-arrow{top:6px;top:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);right:-24px;right:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-right-top .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(-12px) rotate(45deg);-webkit-transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);-ms-transform:translateX(-12px) rotate(45deg);-ms-transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);transform:translateX(-12px) rotate(45deg);transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg)}.next-balloon-tooltip-right-bottom .next-balloon-arrow{bottom:6px;bottom:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);right:-24px;right:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-right-bottom .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(-12px) rotate(45deg);-webkit-transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);-ms-transform:translateX(-12px) rotate(45deg);-ms-transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);transform:translateX(-12px) rotate(45deg);transform:translateX(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg)}.next-balloon-tooltip-top-left .next-balloon-arrow{left:6px;left:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);top:-24px;top:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-top-left .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateY(12px) rotate(45deg);-webkit-transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateY(12px) rotate(45deg);-ms-transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateY(12px) rotate(45deg);transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip-top-right .next-balloon-arrow{right:6px;right:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);top:-24px;top:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-top-right .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateY(12px) rotate(45deg);-webkit-transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateY(12px) rotate(45deg);-ms-transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateY(12px) rotate(45deg);transform:translateY(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip-bottom-left .next-balloon-arrow{left:6px;left:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);bottom:-24px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-bottom-left .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateY(-12px) rotate(45deg);-webkit-transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);-ms-transform:translateY(-12px) rotate(45deg);-ms-transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);transform:translateY(-12px) rotate(45deg);transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg)}.next-balloon-tooltip-bottom-right .next-balloon-arrow{right:6px;right:calc(var(--balloon-size-arrow-margin, 12px) - var(--balloon-size-arrow-size, 12px)/2);bottom:-24px;bottom:calc(0px - var(--balloon-size-arrow-size, 12px)*2)}.next-balloon-tooltip-bottom-right .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateY(-12px) rotate(45deg);-webkit-transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);-ms-transform:translateY(-12px) rotate(45deg);-ms-transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg);transform:translateY(-12px) rotate(45deg);transform:translateY(calc(0px - var(--balloon-size-arrow-size, 12px))) rotate(45deg)}.next-balloon-tooltip.visible{display:block}.next-balloon-tooltip.hidden{display:none}.next-balloon-tooltip-medium{padding:8px;padding:var(--balloon-tooltip-size-padding-top,8px) var(--balloon-tooltip-size-padding-right,8px) var(--balloon-tooltip-size-padding-bottom,8px) var(--balloon-tooltip-size-padding-left,8px)}.next-balloon[dir=rtl].next-balloon-primary .next-balloon-close{left:12px;left:var(--balloon-size-close-margin-right,12px);right:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right:after{left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));right:auto;border-right:none;border-top:none;border-left:inherit;border-bottom:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left-bottom:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left-top:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left:after{right:-7px;right:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));left:auto;border-left:none;border-bottom:none;border-right:inherit;border-top:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right-bottom:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right-top:after{left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-primary-border-width, 1px));right:auto;border-right:none;border-top:none;border-bottom:inherit;border-left:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-top-left:after{right:12px;right:var(--balloon-size-arrow-margin,12px);left:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-top-right:after{right:auto;left:12px;left:var(--balloon-size-arrow-margin,12px)}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-bottom-left:after{right:12px;right:var(--balloon-size-arrow-margin,12px);left:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-bottom-right:after{left:12px;left:var(--balloon-size-arrow-margin,12px);right:auto}.next-balloon[dir=rtl].next-balloon-normal .next-balloon-close{left:12px;left:var(--balloon-size-close-margin-right,12px);right:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right:after{left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));right:auto;border-right:none;border-top:none;border-left:inherit;border-bottom:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left-bottom:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left-top:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left:after{right:-7px;right:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));left:auto;border-left:none;border-bottom:none;border-right:inherit;border-top:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right-bottom:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right-top:after{left:-7px;left:calc(0px - var(--balloon-size-arrow-size, 12px)/2 - var(--balloon-normal-border-width, 1px));right:auto;border-right:none;border-top:none;border-bottom:inherit;border-left:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-top-left:after{right:12px;right:var(--balloon-size-arrow-margin,12px);left:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-top-right:after{right:auto;left:12px;left:var(--balloon-size-arrow-margin,12px)}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-bottom-left:after{right:12px;right:var(--balloon-size-arrow-margin,12px);left:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-bottom-right:after{left:12px;left:var(--balloon-size-arrow-margin,12px);right:auto}.next-balloon[dir=rtl].next-balloon-closable{padding:16px 16px 16px 40px;padding:var(--balloon-size-padding-top,16px) var(--balloon-size-padding-right,16px) var(--balloon-size-padding-top,16px) var(--balloon-size-padding-closable-right,40px)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right .next-balloon-arrow{left:-24px;left:calc(0px - var(--balloon-size-arrow-size, 12px)*2);right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(12px) rotate(45deg);-webkit-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateX(12px) rotate(45deg);-ms-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateX(12px) rotate(45deg);transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left .next-balloon-arrow{right:-24px;right:calc(0px - var(--balloon-size-arrow-size, 12px)*2);left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(-12px) rotate(45deg);-ms-transform:translateX(-12px) rotate(45deg);transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-top .next-balloon-arrow{right:-24px;right:calc(0px - var(--balloon-size-arrow-size, 12px)*2);left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-top .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(-12px) rotate(45deg);-ms-transform:translateX(-12px) rotate(45deg);transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-bottom .next-balloon-arrow{right:-24px;right:calc(0px - var(--balloon-size-arrow-size, 12px)*2);left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-bottom .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(-12px) rotate(45deg);-ms-transform:translateX(-12px) rotate(45deg);transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-top .next-balloon-arrow{left:-24px;left:calc(0px - var(--balloon-size-arrow-size, 12px)*2);right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-top .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(12px) rotate(45deg);-webkit-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateX(12px) rotate(45deg);-ms-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateX(12px) rotate(45deg);transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-bottom .next-balloon-arrow{left:-24px;left:calc(0px - var(--balloon-size-arrow-size, 12px)*2);right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-bottom .next-balloon-arrow .next-balloon-arrow-content{-webkit-transform:translateX(12px) rotate(45deg);-webkit-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);-ms-transform:translateX(12px) rotate(45deg);-ms-transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg);transform:translateX(12px) rotate(45deg);transform:translateX(var(--balloon-size-arrow-size,12px)) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-top-left .next-balloon-arrow{right:10px;right:calc(var(--balloon-size-arrow-margin, 12px) - 2px);left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-top-right .next-balloon-arrow{left:10px;left:calc(var(--balloon-size-arrow-margin, 12px) - 2px);right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-bottom-left .next-balloon-arrow{right:10px;right:calc(var(--balloon-size-arrow-margin, 12px) - 2px);left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-bottom-right .next-balloon-arrow{left:10px;left:calc(var(--balloon-size-arrow-margin, 12px) - 2px);right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-medium{padding:8px;padding:var(--balloon-tooltip-size-padding-top,8px) var(--balloon-tooltip-size-padding-left,8px) var(--balloon-tooltip-size-padding-bottom,8px) var(--balloon-tooltip-size-padding-right,8px)}.next-menu[dir=rtl] .next-menu-item-helper{float:left}.next-menu[dir=rtl] .next-menu-item .next-checkbox,.next-menu[dir=rtl] .next-menu-item .next-radio{margin-left:4px;margin-right:0}.next-menu[dir=rtl] .next-menu-hoz-right{float:left}.next-menu[dir=rtl] .next-menu-hoz-icon-arrow.next-icon{left:6px;right:auto}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-left:0;margin-right:-18px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon.next-menu-icon-right{right:auto;left:4px}.next-menu[dir=rtl] .next-menu-icon-arrow.next-icon{left:10px;right:auto}.next-menu{position:relative;min-width:100px;margin:0;list-style:none;border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none);background:#fff;background:var(--menu-background,#fff);line-height:32px;line-height:var(--menu-line-height,32px);font-size:14px;font-size:var(--menu-font-size,14px);-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease}.next-menu,.next-menu *,.next-menu :after,.next-menu :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-menu:focus,.next-menu :focus{outline:0}.next-menu-spacing-lr{padding:0;padding:0 var(--popup-spacing-lr,0)}.next-menu-spacing-lr.next-menu-outside>.next-menu{height:100%;overflow-y:auto}.next-menu-spacing-tb{padding:0;padding:var(--popup-spacing-tb,0) 0}.next-menu.next-ver{padding:8px 0;padding:var(--menu-padding-ver-padding-tb,8px) var(--menu-padding-ver-padding-lr,0)}.next-menu.next-ver .next-menu-item{padding:0 20px;padding:0 var(--menu-item-padding-ver-padding-r,20px) 0 var(--menu-item-padding-ver-padding-l,20px)}.next-menu.next-hoz{padding:8px 0;padding:var(--menu-padding-hoz-padding-tb,8px) var(--menu-padding-hoz-padding-lr,0)}.next-menu.next-hoz .next-menu-item{padding:0 20px;padding:0 var(--menu-item-padding-hoz-padding-lr,20px)}.next-menu-embeddable,.next-menu-embeddable .next-menu-item.next-disabled,.next-menu-embeddable .next-menu-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-menu-embeddable{-webkit-box-shadow:none;box-shadow:none}.next-menu-embeddable .next-menu-item-inner{height:100%}.next-menu-content{position:relative}.next-menu-content,.next-menu-sub-menu{padding:0;margin:0;list-style:none}.next-menu-sub-menu.next-expand-enter{overflow:hidden}.next-menu-sub-menu.next-expand-enter-active{-webkit-transition:height .3s ease;transition:height .3s ease}.next-menu-sub-menu.next-expand-leave{overflow:hidden}.next-menu-sub-menu.next-expand-leave-active{-webkit-transition:height .3s ease;transition:height .3s ease}.next-menu-item{position:relative;-webkit-transition:background .1s linear;transition:background .1s linear;color:#333;color:var(--menu-color,#333);cursor:pointer}.next-menu-item-helper{float:right;color:#999;color:var(--color-text1-2,#999);font-style:normal;font-size:14px;font-size:var(--menu-font-size,14px)}.next-menu-item .next-checkbox,.next-menu-item .next-radio{margin-right:4px}.next-menu-item.next-selected{color:#333;color:var(--menu-color-selected,#333);background-color:#fff;background-color:var(--menu-background-selected,#fff)}.next-menu-item.next-selected .next-menu-icon-arrow{color:#666;color:var(--menu-arrow-color,#666)}.next-menu-item.next-selected .next-menu-icon-selected{color:#209bfa}.next-menu-item.next-disabled,.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;color:var(--menu-color-disabled,#ccc);background-color:#fff;background-color:var(--menu-background,#fff);cursor:not-allowed}.next-menu-item.next-disabled .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-icon-selected,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc;color:var(--menu-color-disabled,#ccc)}.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled):hover{color:#333;color:var(--menu-color-hover,#333);background-color:#f9f9f9;background-color:var(--menu-background-hover,#f9f9f9)}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled):hover .next-menu-icon-arrow{color:#333;color:var(--menu-arrow-color-hover,#333)}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected{color:#209bfa}.next-menu-item-inner{height:32px;height:var(--menu-line-height,32px);font-size:14px;font-size:var(--menu-font-size,14px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.next-menu-item .next-menu-item-text{vertical-align:middle}.next-menu-item .next-menu-item-text>a{display:inline-block;text-decoration:none;color:#333;color:var(--menu-color,#333)}.next-menu-item .next-menu-item-text>a:before{position:absolute;background-color:transparent;top:0;left:0;bottom:0;right:0;content:""}.next-menu.next-hoz{padding:0}.next-menu.next-hoz.next-menu-nowrap{overflow:hidden;white-space:nowrap}.next-menu.next-hoz.next-menu-nowrap .next-menu-more{text-align:center}.next-menu.next-hoz .next-menu-content>.next-menu-item,.next-menu.next-hoz>.next-menu-item,.next-menu.next-hoz>.next-menu-sub-menu-wrapper{display:inline-block;vertical-align:top}.next-menu.next-hoz .next-menu-content,.next-menu.next-hoz .next-menu-footer,.next-menu.next-hoz .next-menu-header{display:inline-block}.next-menu-hoz-right{float:right}.next-menu-group-label{padding:0 12px;padding:0 var(--menu-padding-title-horizontal,12px);color:#999;color:var(--color-text1-2,#999)}.next-menu-divider{margin:8px 12px;margin:var(--menu-divider-margin-ver,8px) var(--menu-divider-margin-hoz,12px);border-bottom:1px solid #eee;border-bottom:var(--menu-divider-width,1px) var(--menu-divider-style,solid) var(--menu-divider-color,#eee)}.next-menu .next-menu-icon-selected.next-icon{position:absolute;top:0;margin-left:-16px;margin-left:calc(4px - var(--menu-item-padding-ver-padding-l, 20px))}.next-menu .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu .next-menu-icon-selected.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-menu .next-menu-icon-selected.next-icon.next-menu-icon-right{right:4px}.next-menu .next-menu-symbol-icon-selected.next-menu-icon-selected:before{content:"";content:var(--menu-select-icon-content,"\e632")}.next-menu .next-menu-icon-arrow.next-icon{position:absolute;top:0;right:10px;color:#666;color:var(--menu-arrow-color,#666);-webkit-transition:all .1s linear;transition:all .1s linear}.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-icon-arrow.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-icon-arrow-down:before{content:"";content:var(--menu-fold-icon-content,"\e63d")}.next-menu .next-menu-icon-arrow-down.next-open{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-down.next-open:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-symbol-popupfold:before{content:"";content:var(--menu-popupfold-icon-content,"\e619")}.next-menu .next-menu-icon-arrow-right.next-open{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-right.next-open:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon{position:absolute;top:0;right:6px;color:#666;color:var(--menu-arrow-color,#666);-webkit-transition:all .1s linear;transition:all .1s linear}.next-menu .next-menu-hoz-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-hoz-icon-arrow.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon:before{content:"";content:var(--menu-fold-icon-content,"\e63d")}.next-menu-unfold-icon:before{content:"";content:var(--menu-unfold-icon-content,"")}.next-menu .next-menu-hoz-icon-arrow.next-open{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.next-menu .next-menu-hoz-icon-arrow.next-open .next-icon-remote,.next-menu .next-menu-hoz-icon-arrow.next-open:before{width:12px;font-size:12px;line-height:inherit}.next-menu.next-context{line-height:24px}.next-menu.next-context .next-menu-item-inner{height:24px}.next-breadcrumb{display:block;margin:0;padding:0;white-space:nowrap;height:16px;line-height:16px}.next-breadcrumb .next-breadcrumb-item{display:inline-block}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-text{display:inline-block;text-decoration:none;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:all .1s linear;transition:all .1s linear}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-text>b{font-weight:400}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-separator{display:inline-block;vertical-align:top}.next-breadcrumb .next-breadcrumb-text{height:16px;min-width:16px;font-size:12px;font-size:var(--breadcrumb-size-m-font-size,12px);line-height:16px}.next-breadcrumb .next-breadcrumb-separator{height:16px;margin:0 8px;font-size:16px;line-height:16px}.next-breadcrumb .next-breadcrumb-separator .next-icon:before{display:block}.next-breadcrumb .next-breadcrumb-separator .next-icon .next-icon-remote,.next-breadcrumb .next-breadcrumb-separator .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-breadcrumb .next-breadcrumb-text-ellipsis{font-size:12px;font-size:var(--breadcrumb-size-ellipsis-font-size,12px)}.next-breadcrumb .next-breadcrumb-text{color:#666;color:var(--breadcrumb-text-color,#666)}.next-breadcrumb .next-breadcrumb-text>b{color:#209bfa;color:var(--breadcrumb-text-keyword-color,#209bfa)}.next-breadcrumb .next-breadcrumb-text>a{color:#666;color:var(--breadcrumb-text-color,#666);text-decoration:none;text-align:center}.next-breadcrumb .next-breadcrumb-text.activated,.next-breadcrumb .next-breadcrumb-text.activated>a{color:#333;color:var(--breadcrumb-text-current-color,#333);font-weight:700;font-weight:var(--breadcrumb-text-current-weight,bold)}.next-breadcrumb .next-breadcrumb-text-ellipsis{color:#666;color:var(--breadcrumb-text-ellipsis-color,#666);cursor:default}.next-breadcrumb .next-breadcrumb-text-ellipsis-clickable{color:#666;color:var(--breadcrumb-text-ellipsis-color,#666);cursor:pointer}.next-breadcrumb .next-breadcrumb-separator{color:#999;color:var(--breadcrumb-icon-color,#999)}.next-breadcrumb .next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover>a{color:#209bfa;color:var(--breadcrumb-text-color-hover,#209bfa)}.next-breadcrumb a.next-breadcrumb-text.activated:hover>a{color:#209bfa;color:var(--breadcrumb-text-current-color-hover,#209bfa)}.next-breadcrumb a.next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover{color:#209bfa;color:var(--breadcrumb-text-color-hover,#209bfa)}.next-breadcrumb a.next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover>b{color:#209bfa;color:var(--breadcrumb-text-keyword-color-hover,#209bfa)}.next-breadcrumb a.next-breadcrumb-text.activated:hover{color:#209bfa;color:var(--breadcrumb-text-current-color-hover,#209bfa);font-weight:700;font-weight:var(--breadcrumb-text-current-weight,bold)}.next-breadcrumb-icon-sep:before{content:""}.next-breadcrumb-dropdown-wrapper{padding:4px 0}.next-btn,.next-btn *,.next-btn :after,.next-btn :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-btn::-moz-focus-inner{border:0;padding:0}.next-btn,.next-btn:active,.next-btn:focus,.next-btn:hover{outline:0}@keyframes loadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.next-btn{position:relative;display:inline-block;-webkit-box-shadow:none;-webkit-box-shadow:var(--btn-shadow,none);box-shadow:none;box-shadow:var(--btn-shadow,none);text-decoration:none;text-align:center;text-transform:none;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;transition:all .1s linear;line-height:1;cursor:pointer}.next-btn:after{text-align:center;position:absolute;opacity:0;visibility:hidden;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.next-btn:before{content:"";height:100%;width:0}.next-btn .next-icon,.next-btn:before{display:inline-block;vertical-align:middle}.next-btn .next-icon{font-size:0}.next-btn>.next-btn-helper,.next-btn>div,.next-btn>span{display:inline-block;vertical-align:middle}.next-btn>.next-btn-helper{text-decoration:inherit}.next-btn.hover,.next-btn:hover{-webkit-box-shadow:none;box-shadow:none}.next-btn.next-small{border-radius:3px;border-radius:var(--btn-size-s-corner,3px);padding:0 16px;padding:0 var(--btn-size-s-padding,16px);height:24px;height:var(--btn-size-s-height,24px);font-size:12px;font-size:var(--btn-size-s-font,12px);border-width:1px;border-width:var(--btn-size-s-border-width,1px)}.next-btn.next-small>.next-btn-icon.next-icon-first{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-last{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-alone{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-btn.next-small>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-alone:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:16px;left:var(--btn-size-s-padding,16px);top:50%;text-align:center;margin-right:4px}.next-btn.next-small.next-btn-loading>.next-icon{display:none}.next-btn.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;-webkit-transition:all .1s linear;transition:all .1s linear}.next-btn.next-medium{border-radius:3px;border-radius:var(--btn-size-m-corner,3px);padding:0 20px;padding:0 var(--btn-size-m-padding,20px);height:32px;height:var(--btn-size-m-height,32px);font-size:14px;font-size:var(--btn-size-m-font,14px);border-width:1px;border-width:var(--btn-size-m-border-width,1px)}.next-btn.next-medium>.next-btn-icon.next-icon-first{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-last{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-alone{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:20px;left:var(--btn-size-m-padding,20px);top:50%;text-align:center;margin-right:4px}.next-btn.next-medium.next-btn-loading>.next-icon{display:none}.next-btn.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;-webkit-transition:all .1s linear;transition:all .1s linear}.next-btn.next-large{border-radius:3px;border-radius:var(--btn-size-l-corner,3px);padding:0 24px;padding:0 var(--btn-size-l-padding,24px);height:40px;height:var(--btn-size-l-height,40px);font-size:16px;font-size:var(--btn-size-l-font,16px);border-width:1px;border-width:var(--btn-size-l-border-width,1px)}.next-btn.next-large>.next-btn-icon.next-icon-first{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-last{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-alone{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:24px;left:var(--btn-size-l-padding,24px);top:50%;text-align:center;margin-right:4px}.next-btn.next-large.next-btn-loading>.next-icon{display:none}.next-btn.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;-webkit-transition:all .1s linear;transition:all .1s linear}.next-btn.next-btn-normal{border-style:solid;border-style:var(--btn-pure-normal-border-style,solid);background:#fff;background:var(--btn-pure-normal-bg,#fff);border-color:#ddd;border-color:var(--btn-pure-normal-border-color,#ddd)}.next-btn.next-btn-normal,.next-btn.next-btn-normal.visited,.next-btn.next-btn-normal:link,.next-btn.next-btn-normal:visited{color:#333;color:var(--btn-pure-normal-color,#333)}.next-btn.next-btn-normal.hover,.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover{color:#333;color:var(--btn-pure-normal-color-hover,#333);background:#f9f9f9;background:var(--btn-pure-normal-bg-hover,#f9f9f9);border-color:#ccc;border-color:var(--btn-pure-normal-border-color-hover,#ccc);text-decoration:none}.next-btn.next-btn-normal.active,.next-btn.next-btn-normal:active{color:#333;color:var(--btn-pure-normal-color-active,#333);background:#f9f9f9;background:var(--btn-pure-normal-bg-active,#f9f9f9);border-color:#ccc;border-color:var(--btn-pure-normal-border-color-active,#ccc);text-decoration:none}.next-btn.next-btn-primary{border-style:solid;border-style:var(--btn-pure-primary-border-style,solid);background:#209bfa;background:var(--btn-pure-primary-bg,#209bfa);border-color:transparent;border-color:var(--btn-pure-primary-border-color,transparent)}.next-btn.next-btn-primary,.next-btn.next-btn-primary.visited,.next-btn.next-btn-primary:link,.next-btn.next-btn-primary:visited{color:#fff;color:var(--btn-pure-primary-color,#fff)}.next-btn.next-btn-primary.hover,.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover{color:#fff;color:var(--btn-pure-primary-color-hover,#fff);background:#1274e7;background:var(--btn-pure-primary-bg-hover,#1274e7);border-color:transparent;border-color:var(--btn-pure-primary-border-color-hover,transparent);text-decoration:none}.next-btn.next-btn-primary.active,.next-btn.next-btn-primary:active{color:#fff;color:var(--btn-pure-primary-color-active,#fff);background:#1274e7;background:var(--btn-pure-primary-bg-active,#1274e7);border-color:transparent;border-color:var(--btn-pure-primary-border-color-active,transparent);text-decoration:none}.next-btn.next-btn-secondary{border-style:solid;border-style:var(--btn-pure-secondary-border-style,solid);background:#fff;background:var(--btn-pure-secondary-bg,#fff);border-color:#209bfa;border-color:var(--btn-pure-secondary-border-color,#209bfa)}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary.visited,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited{color:#209bfa;color:var(--btn-pure-secondary-color,#209bfa)}.next-btn.next-btn-secondary.hover,.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover{color:#fff;color:var(--btn-pure-secondary-color-hover,#fff);background:#1274e7;background:var(--btn-pure-secondary-bg-hover,#1274e7);border-color:#1274e7;border-color:var(--btn-pure-secondary-border-color-hover,#1274e7);text-decoration:none}.next-btn.next-btn-secondary.active,.next-btn.next-btn-secondary:active{color:#fff;color:var(--btn-pure-secondary-color-active,#fff);background:#1274e7;background:var(--btn-pure-secondary-bg-active,#1274e7);border-color:#1274e7;border-color:var(--btn-pure-secondary-border-color-active,#1274e7);text-decoration:none}.next-btn.disabled,.next-btn[disabled]{cursor:not-allowed}.next-btn.disabled.next-btn-normal,.next-btn[disabled].next-btn-normal{background:#fafafa;background:var(--btn-pure-normal-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-pure-normal-border-color-disabled,#eee)}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal.visited,.next-btn.disabled.next-btn-normal:link,.next-btn.disabled.next-btn-normal:visited,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal.visited,.next-btn[disabled].next-btn-normal:link,.next-btn[disabled].next-btn-normal:visited{color:#ccc;color:var(--btn-pure-normal-color-disabled,#ccc)}.next-btn.disabled.next-btn-normal.active,.next-btn.disabled.next-btn-normal.hover,.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn[disabled].next-btn-normal.active,.next-btn[disabled].next-btn-normal.hover,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover{color:#ccc;color:var(--btn-pure-normal-color-disabled,#ccc);background:#fafafa;background:var(--btn-pure-normal-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-pure-normal-border-color-disabled,#eee);text-decoration:none}.next-btn.disabled.next-btn-primary,.next-btn[disabled].next-btn-primary{background:#fafafa;background:var(--btn-pure-primary-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-pure-primary-border-color-disabled,#eee)}.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary.visited,.next-btn.disabled.next-btn-primary:link,.next-btn.disabled.next-btn-primary:visited,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary.visited,.next-btn[disabled].next-btn-primary:link,.next-btn[disabled].next-btn-primary:visited{color:#ccc;color:var(--btn-pure-primary-color-disabled,#ccc)}.next-btn.disabled.next-btn-primary.active,.next-btn.disabled.next-btn-primary.hover,.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn[disabled].next-btn-primary.active,.next-btn[disabled].next-btn-primary.hover,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover{color:#ccc;color:var(--btn-pure-primary-color-disabled,#ccc);background:#fafafa;background:var(--btn-pure-primary-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-pure-primary-border-color-disabled,#eee);text-decoration:none}.next-btn.disabled.next-btn-secondary,.next-btn[disabled].next-btn-secondary{background:#fafafa;background:var(--btn-pure-secondary-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-pure-secondary-border-color-disabled,#eee)}.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary.visited,.next-btn.disabled.next-btn-secondary:link,.next-btn.disabled.next-btn-secondary:visited,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary.visited,.next-btn[disabled].next-btn-secondary:link,.next-btn[disabled].next-btn-secondary:visited{color:#ccc;color:var(--btn-pure-secondary-color-disabled,#ccc)}.next-btn.disabled.next-btn-secondary.active,.next-btn.disabled.next-btn-secondary.hover,.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn[disabled].next-btn-secondary.active,.next-btn[disabled].next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover{color:#ccc;color:var(--btn-pure-secondary-color-disabled,#ccc);background:#fafafa;background:var(--btn-pure-secondary-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-pure-secondary-border-color-disabled,#eee);text-decoration:none}.next-btn-warning{border-style:solid;border-style:var(--btn-warning-border-style,solid)}.next-btn-warning.next-btn-primary{background:#d23c26;background:var(--btn-warning-primary-bg,#d23c26);border-color:#d23c26;border-color:var(--btn-warning-primary-border-color,#d23c26)}.next-btn-warning.next-btn-primary,.next-btn-warning.next-btn-primary.visited,.next-btn-warning.next-btn-primary:link,.next-btn-warning.next-btn-primary:visited{color:#fff;color:var(--btn-warning-primary-color,#fff)}.next-btn-warning.next-btn-primary.hover,.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover{color:#fff;color:var(--btn-warning-primary-color-hover,#fff);background:#b7321e;background:var(--btn-warning-primary-bg-hover,#b7321e);border-color:#b7321e;border-color:var(--btn-warning-primary-border-color-hover,#b7321e);text-decoration:none}.next-btn-warning.next-btn-primary.active,.next-btn-warning.next-btn-primary:active{color:#fff;color:var(--btn-warning-primary-color-active,#fff);background:#b7321e;background:var(--btn-warning-primary-bg-active,#b7321e);border-color:#b7321e;border-color:var(--btn-warning-primary-border-color-active,#b7321e);text-decoration:none}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary[disabled]{background:#fafafa;background:var(--btn-warning-primary-bg-disabled,#fafafa);border-color:#e6e6e6;border-color:var(--btn-warning-primary-border-color-disabled,#e6e6e6)}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled.visited,.next-btn-warning.next-btn-primary.disabled:link,.next-btn-warning.next-btn-primary.disabled:visited,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled].visited,.next-btn-warning.next-btn-primary[disabled]:link,.next-btn-warning.next-btn-primary[disabled]:visited{color:#ccc;color:var(--btn-warning-primary-color-disabled,#ccc)}.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary[disabled].active,.next-btn-warning.next-btn-primary[disabled].hover,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover{color:#ccc;color:var(--btn-warning-primary-color-disabled,#ccc);background:#fafafa;background:var(--btn-warning-primary-bg-disabled,#fafafa);border-color:#e6e6e6;border-color:var(--btn-warning-primary-border-color-disabled,#e6e6e6);text-decoration:none}.next-btn-warning.next-btn-normal{background:#fff;background:var(--btn-warning-normal-bg,#fff);border-color:#d23c26;border-color:var(--btn-warning-normal-border-color,#d23c26)}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal.visited,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited{color:#d23c26;color:var(--btn-warning-normal-color,#d23c26)}.next-btn-warning.next-btn-normal.hover,.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover{color:#fff;color:var(--btn-warning-normal-color-hover,#fff);background:#b7321e;background:var(--btn-warning-normal-bg-hover,#b7321e);border-color:#b7321e;border-color:var(--btn-warning-normal-border-color-hover,#b7321e);text-decoration:none}.next-btn-warning.next-btn-normal.active,.next-btn-warning.next-btn-normal:active{color:#fff;color:var(--btn-warning-normal-color-active,#fff);background:#b7321e;background:var(--btn-warning-normal-bg-active,#b7321e);border-color:#b7321e;border-color:var(--btn-warning-normal-border-color-active,#b7321e);text-decoration:none}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal[disabled]{background:#fafafa;background:var(--btn-warning-normal-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-warning-normal-border-color-disabled,#eee)}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled.visited,.next-btn-warning.next-btn-normal.disabled:link,.next-btn-warning.next-btn-normal.disabled:visited,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled].visited,.next-btn-warning.next-btn-normal[disabled]:link,.next-btn-warning.next-btn-normal[disabled]:visited{color:#ccc;color:var(--btn-warning-normal-color-disabled,#ccc)}.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal[disabled].active,.next-btn-warning.next-btn-normal[disabled].hover,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover{color:#ccc;color:var(--btn-warning-normal-color-disabled,#ccc);background:#fafafa;background:var(--btn-warning-normal-bg-disabled,#fafafa);border-color:#eee;border-color:var(--btn-warning-normal-border-color-disabled,#eee);text-decoration:none}.next-btn-text{border-radius:0;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.next-btn-text,.next-btn-text.hover,.next-btn-text:hover{-webkit-box-shadow:none;box-shadow:none}.next-btn-text.next-btn-primary{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary.visited,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited{color:#298dff;color:var(--btn-text-primary-color,#298dff)}.next-btn-text.next-btn-primary.active,.next-btn-text.next-btn-primary.hover,.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover{color:#1274e7;color:var(--btn-text-primary-color-hover,#1274e7);background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary.disabled.visited,.next-btn-text.next-btn-primary.disabled:link,.next-btn-text.next-btn-primary.disabled:visited,.next-btn-text.next-btn-primary[disabled],.next-btn-text.next-btn-primary[disabled].visited,.next-btn-text.next-btn-primary[disabled]:link,.next-btn-text.next-btn-primary[disabled]:visited{color:#ccc;color:var(--btn-text-disabled-color,#ccc)}.next-btn-text.next-btn-primary.disabled.active,.next-btn-text.next-btn-primary.disabled.hover,.next-btn-text.next-btn-primary.disabled:active,.next-btn-text.next-btn-primary.disabled:focus,.next-btn-text.next-btn-primary.disabled:hover,.next-btn-text.next-btn-primary[disabled].active,.next-btn-text.next-btn-primary[disabled].hover,.next-btn-text.next-btn-primary[disabled]:active,.next-btn-text.next-btn-primary[disabled]:focus,.next-btn-text.next-btn-primary[disabled]:hover{color:#ccc;color:var(--btn-text-disabled-color,#ccc);background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary,.next-btn-text.next-btn-secondary.visited,.next-btn-text.next-btn-secondary:link,.next-btn-text.next-btn-secondary:visited{color:#666;color:var(--btn-text-secondary-color,#666)}.next-btn-text.next-btn-secondary.active,.next-btn-text.next-btn-secondary.hover,.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover{color:#209bfa;color:var(--btn-text-secondary-color-hover,#209bfa);background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary.disabled.visited,.next-btn-text.next-btn-secondary.disabled:link,.next-btn-text.next-btn-secondary.disabled:visited,.next-btn-text.next-btn-secondary[disabled],.next-btn-text.next-btn-secondary[disabled].visited,.next-btn-text.next-btn-secondary[disabled]:link,.next-btn-text.next-btn-secondary[disabled]:visited{color:#ccc;color:var(--btn-text-disabled-color,#ccc)}.next-btn-text.next-btn-secondary.disabled.active,.next-btn-text.next-btn-secondary.disabled.hover,.next-btn-text.next-btn-secondary.disabled:active,.next-btn-text.next-btn-secondary.disabled:focus,.next-btn-text.next-btn-secondary.disabled:hover,.next-btn-text.next-btn-secondary[disabled].active,.next-btn-text.next-btn-secondary[disabled].hover,.next-btn-text.next-btn-secondary[disabled]:active,.next-btn-text.next-btn-secondary[disabled]:focus,.next-btn-text.next-btn-secondary[disabled]:hover{color:#ccc;color:var(--btn-text-disabled-color,#ccc);background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal,.next-btn-text.next-btn-normal.visited,.next-btn-text.next-btn-normal:link,.next-btn-text.next-btn-normal:visited{color:#333;color:var(--btn-text-normal-color,#333)}.next-btn-text.next-btn-normal.active,.next-btn-text.next-btn-normal.hover,.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover{color:#209bfa;color:var(--btn-text-normal-color-hover,#209bfa);background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal.disabled.visited,.next-btn-text.next-btn-normal.disabled:link,.next-btn-text.next-btn-normal.disabled:visited,.next-btn-text.next-btn-normal[disabled],.next-btn-text.next-btn-normal[disabled].visited,.next-btn-text.next-btn-normal[disabled]:link,.next-btn-text.next-btn-normal[disabled]:visited{color:#ccc;color:var(--btn-text-disabled-color,#ccc)}.next-btn-text.next-btn-normal.disabled.active,.next-btn-text.next-btn-normal.disabled.hover,.next-btn-text.next-btn-normal.disabled:active,.next-btn-text.next-btn-normal.disabled:focus,.next-btn-text.next-btn-normal.disabled:hover,.next-btn-text.next-btn-normal[disabled].active,.next-btn-text.next-btn-normal[disabled].hover,.next-btn-text.next-btn-normal[disabled]:active,.next-btn-text.next-btn-normal[disabled]:focus,.next-btn-text.next-btn-normal[disabled]:hover{color:#ccc;color:var(--btn-text-disabled-color,#ccc);background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-large{border-radius:0;padding:0;height:24px;height:var(--btn-text-size-l-height,24px);font-size:14px;font-size:var(--btn-text-size-l-font,14px);border-width:0}.next-btn-text.next-large>.next-btn-icon.next-icon-first{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-last{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-alone{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-large.next-btn-loading>.next-icon{display:none}.next-btn-text.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;-webkit-transition:all .1s linear;transition:all .1s linear}.next-btn-text.next-medium{border-radius:0;padding:0;height:20px;height:var(--btn-text-size-m-height,20px);font-size:14px;font-size:var(--btn-text-size-m-font,14px);border-width:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-first{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-last{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-medium.next-btn-loading>.next-icon{display:none}.next-btn-text.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;-webkit-transition:all .1s linear;transition:all .1s linear}.next-btn-text.next-small{border-radius:0;padding:0;height:16px;height:var(--btn-text-size-s-height,16px);font-size:12px;font-size:var(--btn-text-size-s-font,12px);border-width:0}.next-btn-text.next-small>.next-btn-icon.next-icon-first{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-last{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-alone{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.next-btn-text.next-small>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-alone:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-small.next-btn-loading>.next-icon{display:none}.next-btn-text.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;-webkit-transition:all .1s linear;transition:all .1s linear}.next-btn-text.next-btn-loading{background:transparent;border-color:transparent}.next-btn-text.next-btn-loading,.next-btn-text.next-btn-loading.visited,.next-btn-text.next-btn-loading:link,.next-btn-text.next-btn-loading:visited{color:#333;color:var(--btn-text-loading-color,#333)}.next-btn-text.next-btn-loading.active,.next-btn-text.next-btn-loading.hover,.next-btn-text.next-btn-loading:active,.next-btn-text.next-btn-loading:focus,.next-btn-text.next-btn-loading:hover{color:#333;color:var(--btn-text-loading-color,#333);background:transparent;border-color:transparent;text-decoration:none}.next-btn-loading{pointer-events:none}.next-btn-loading:before{font-family:NextIcon;content:"";content:var(--icon-content-loading,"\e646");opacity:1;visibility:visible;-webkit-animation:loadingCircle 2s linear infinite;animation:loadingCircle 2s linear infinite}.next-btn-loading:after{content:"";display:inline-block;position:static;height:100%;width:0;vertical-align:middle}.next-btn-custom-loading{pointer-events:none}.next-btn-ghost{-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--btn-ghost-border-style,solid)}.next-btn-ghost.next-btn-dark{background:transparent;border-color:#fff;border-color:var(--btn-ghost-dark-border-color,#fff)}.next-btn-ghost.next-btn-dark,.next-btn-ghost.next-btn-dark.visited,.next-btn-ghost.next-btn-dark:link,.next-btn-ghost.next-btn-dark:visited{color:#fff;color:var(--btn-ghost-dark-color,#fff)}.next-btn-ghost.next-btn-dark.active,.next-btn-ghost.next-btn-dark.hover,.next-btn-ghost.next-btn-dark:active,.next-btn-ghost.next-btn-dark:focus,.next-btn-ghost.next-btn-dark:hover{color:#fff;color:var(--btn-ghost-dark-color-hover,#fff);background:hsla(0,0%,100%,.8);border-color:#fff;border-color:var(--btn-ghost-dark-border-color-hover,#fff);text-decoration:none}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark[disabled]{background:transparent;background:var(--btn-ghost-dark-bg-disabled,transparent);border-color:hsla(0,0%,100%,.4)}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark.disabled.visited,.next-btn-ghost.next-btn-dark.disabled:link,.next-btn-ghost.next-btn-dark.disabled:visited,.next-btn-ghost.next-btn-dark[disabled],.next-btn-ghost.next-btn-dark[disabled].visited,.next-btn-ghost.next-btn-dark[disabled]:link,.next-btn-ghost.next-btn-dark[disabled]:visited{color:hsla(0,0%,100%,.4)}.next-btn-ghost.next-btn-dark.disabled.active,.next-btn-ghost.next-btn-dark.disabled.hover,.next-btn-ghost.next-btn-dark.disabled:active,.next-btn-ghost.next-btn-dark.disabled:focus,.next-btn-ghost.next-btn-dark.disabled:hover,.next-btn-ghost.next-btn-dark[disabled].active,.next-btn-ghost.next-btn-dark[disabled].hover,.next-btn-ghost.next-btn-dark[disabled]:active,.next-btn-ghost.next-btn-dark[disabled]:focus,.next-btn-ghost.next-btn-dark[disabled]:hover{color:hsla(0,0%,100%,.4);background:transparent;background:var(--btn-ghost-dark-bg-disabled,transparent);border-color:hsla(0,0%,100%,.4);text-decoration:none}.next-btn-ghost.next-btn-light{background:transparent;border-color:#333;border-color:var(--btn-ghost-light-border-color,#333)}.next-btn-ghost.next-btn-light,.next-btn-ghost.next-btn-light.visited,.next-btn-ghost.next-btn-light:link,.next-btn-ghost.next-btn-light:visited{color:#333;color:var(--btn-ghost-light-color,#333)}.next-btn-ghost.next-btn-light.active,.next-btn-ghost.next-btn-light.hover,.next-btn-ghost.next-btn-light:active,.next-btn-ghost.next-btn-light:focus,.next-btn-ghost.next-btn-light:hover{color:#999;color:var(--btn-ghost-light-color-hover,#999);background:rgba(0,0,0,.92);border-color:#333;border-color:var(--btn-ghost-light-border-color-hover,#333);text-decoration:none}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light[disabled]{background:transparent;background:var(--btn-ghost-light-bg-disabled,transparent);border-color:rgba(0,0,0,.1)}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light.disabled.visited,.next-btn-ghost.next-btn-light.disabled:link,.next-btn-ghost.next-btn-light.disabled:visited,.next-btn-ghost.next-btn-light[disabled],.next-btn-ghost.next-btn-light[disabled].visited,.next-btn-ghost.next-btn-light[disabled]:link,.next-btn-ghost.next-btn-light[disabled]:visited{color:rgba(0,0,0,.1)}.next-btn-ghost.next-btn-light.disabled.active,.next-btn-ghost.next-btn-light.disabled.hover,.next-btn-ghost.next-btn-light.disabled:active,.next-btn-ghost.next-btn-light.disabled:focus,.next-btn-ghost.next-btn-light.disabled:hover,.next-btn-ghost.next-btn-light[disabled].active,.next-btn-ghost.next-btn-light[disabled].hover,.next-btn-ghost.next-btn-light[disabled]:active,.next-btn-ghost.next-btn-light[disabled]:focus,.next-btn-ghost.next-btn-light[disabled]:hover{color:rgba(0,0,0,.1);background:transparent;background:var(--btn-ghost-light-bg-disabled,transparent);border-color:rgba(0,0,0,.1);text-decoration:none}.next-btn-group{position:relative;display:inline-block;vertical-align:middle}.next-btn-group>.next-btn{position:relative;float:left;-webkit-box-shadow:none;box-shadow:none}.next-btn-group>.next-btn.active,.next-btn-group>.next-btn:active,.next-btn-group>.next-btn:focus,.next-btn-group>.next-btn:hover{z-index:1}.next-btn-group>.next-btn.disabled,.next-btn-group>.next-btn[disabled]{z-index:0}.next-btn-group .next-btn.next-btn{margin:0 0 0 -1px}.next-btn-group .next-btn:not(:first-child):not(:last-child){border-radius:0}.next-btn-group>.next-btn:first-child{margin:0}.next-btn-group>.next-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group>.next-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group>.next-btn-primary:not(:first-child){border-left-color:hsla(0,0%,100%,.2)}.next-btn-group>.next-btn-primary:not(:first-child):hover{border-left-color:transparent}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#eee;border-left-color:var(--color-line1-1,#eee)}.next-btn-group[dir=rtl]>.next-btn{float:right}.next-btn-group[dir=rtl] .next-btn.next-btn{margin:0 -1px 0 0}.next-btn-group[dir=rtl]>.next-btn:first-child:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group[dir=rtl]>.next-btn:last-child:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child){border-right-color:hsla(0,0%,100%,.2)}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child):hover{border-right-color:transparent}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#eee;border-right-color:var(--color-line1-1,#eee)}.next-btn.next-small[dir=rtl]{border-radius:3px;border-radius:var(--btn-size-s-corner,3px)}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:16px;padding-left:var(--btn-size-s-padding,16px);padding-right:32px;padding-right:calc(var(--btn-size-s-padding, 16px) + 16px)}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:16px;right:var(--btn-size-s-padding,16px);top:50%;margin-right:0;margin-left:4px}.next-btn.next-medium[dir=rtl]{border-radius:3px;border-radius:var(--btn-size-m-corner,3px)}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:20px;padding-left:var(--btn-size-m-padding,20px);padding-right:44px;padding-right:calc(var(--btn-size-m-padding, 20px) + 24px)}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:20px;right:var(--btn-size-m-padding,20px);top:50%;margin-right:0;margin-left:4px}.next-btn.next-large[dir=rtl]{border-radius:3px;border-radius:var(--btn-size-l-corner,3px)}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:24px;padding-left:var(--btn-size-l-padding,24px);padding-right:48px;padding-right:calc(var(--btn-size-l-padding, 24px) + 24px)}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:24px;right:var(--btn-size-l-padding,24px);top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-large{border-radius:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-left:0;padding-right:24px}.next-btn-text[dir=rtl].next-large.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-medium{border-radius:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-left:0;padding-right:24px}.next-btn-text[dir=rtl].next-medium.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-small{border-radius:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small.next-btn-loading{padding-left:0;padding-right:16px}.next-btn-text[dir=rtl].next-small.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-input{vertical-align:middle;display:inline-table;border-collapse:separate;font-size:0;line-height:1;width:200px;border-spacing:0;-webkit-transition:all .1s linear;transition:all .1s linear;border:1px solid #ddd;border:var(--input-border-width,1px) solid var(--input-border-color,#ddd);background-color:#fff;background-color:var(--input-bg-color,#fff)}.next-input,.next-input *,.next-input :after,.next-input :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-input input{height:100%}.next-input input[type=reset],.next-input input[type=submit]{-webkit-appearance:button;cursor:pointer}.next-input input::-moz-focus-inner{border:0;padding:0}.next-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #fff inset;-webkit-box-shadow:0 0 0 1000px var(--input-bg-color,#fff) inset;border-radius:3px;border-radius:var(--form-element-large-corner,3px)}.next-input input[type=password]::-ms-reveal{display:none}.next-input textarea{resize:none}.next-input input,.next-input textarea{width:100%;border:none;outline:none;padding:0;margin:0;font-weight:400;vertical-align:middle;background-color:transparent;color:#333;color:var(--input-text-color,#333)}.next-input input::-ms-clear,.next-input textarea::-ms-clear{display:none}.next-input.next-small{height:24px;height:var(--form-element-small-height,24px);border-radius:3px;border-radius:var(--form-element-small-corner,3px)}.next-input.next-small .next-input-label{padding-left:8px;padding-left:var(--input-s-label-padding-left,8px)}.next-input.next-small .next-input-inner,.next-input.next-small .next-input-label{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-input.next-small .next-input-control,.next-input.next-small .next-input-inner-text{padding-right:4px;padding-right:var(--input-s-icon-padding-right,4px)}.next-input.next-small input{height:22px;height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2);line-height:22px \0 ;line-height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2) \0 ;padding:0 4px;padding:0 var(--input-s-padding,4px);font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-input.next-small input::-webkit-input-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-input.next-small input::-moz-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-input.next-small input::-ms-input-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-input.next-small input::placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-input.next-small .next-input-text-field{padding:0 4px;padding:0 var(--input-s-padding,4px);font-size:12px;font-size:var(--form-element-small-font-size,12px);height:22px;height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2);line-height:22px;line-height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2)}.next-input.next-small .next-icon .next-icon-remote,.next-input.next-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-input.next-small .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-small-corner,3px) var(--form-element-small-corner,3px) 0}.next-input.next-medium{height:32px;height:var(--form-element-medium-height,32px);border-radius:3px;border-radius:var(--form-element-medium-corner,3px)}.next-input.next-medium .next-input-label{padding-left:8px;padding-left:var(--input-m-label-padding-left,8px)}.next-input.next-medium .next-input-inner,.next-input.next-medium .next-input-label{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-medium .next-input-control,.next-input.next-medium .next-input-inner-text{padding-right:8px;padding-right:var(--input-m-icon-padding-right,8px)}.next-input.next-medium input{height:30px;height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2);line-height:30px \0 ;line-height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2) \0 ;padding:0 8px;padding:0 var(--input-m-padding,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-medium input::-webkit-input-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-medium input::-moz-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-medium input::-ms-input-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-medium input::placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-medium .next-input-text-field{padding:0 8px;padding:0 var(--input-m-padding,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px);height:30px;height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2);line-height:30px;line-height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2)}.next-input.next-medium .next-icon .next-icon-remote,.next-input.next-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-input.next-medium .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-medium-corner,3px) var(--form-element-medium-corner,3px) 0}.next-input.next-large{height:40px;height:var(--form-element-large-height,40px);border-radius:3px;border-radius:var(--form-element-large-corner,3px)}.next-input.next-large .next-input-label{padding-left:12px;padding-left:var(--input-l-label-padding-left,12px)}.next-input.next-large .next-input-inner,.next-input.next-large .next-input-label{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-large .next-input-control,.next-input.next-large .next-input-inner-text{padding-right:8px;padding-right:var(--input-l-icon-padding-right,8px)}.next-input.next-large input{height:38px;height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2);line-height:38px \0 ;line-height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2) \0 ;padding:0 12px;padding:0 var(--input-l-padding,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-large input::-webkit-input-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-large input::-moz-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-large input::-ms-input-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-large input::placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-large .next-input-text-field{padding:0 12px;padding:0 var(--input-l-padding,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px);height:38px;height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2);line-height:38px;line-height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2)}.next-input.next-large .next-icon .next-icon-remote,.next-input.next-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-input.next-large .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-large-corner,3px) var(--form-element-large-corner,3px) 0}.next-input.next-input-textarea{height:auto;border-radius:3px;border-radius:var(--input-multiple-corner,3px);font-size:0}.next-input.next-input-textarea textarea{color:#333;color:var(--input-text-color,#333);padding:4px 8px;padding:var(--input-multiple-padding-tb,4px) var(--input-multiple-padding-lr,8px);font-size:14px;font-size:var(--input-multiple-font-size,14px);border-radius:3px;border-radius:var(--input-multiple-corner,3px)}.next-input.next-input-textarea.next-small textarea{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-input.next-input-textarea.next-large textarea{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-input.next-input-textarea .next-input-control{display:block;width:auto;border-radius:3px;border-radius:var(--input-multiple-corner,3px)}.next-input.next-input-textarea .next-input-len{padding:0 8px 4px;padding:0 var(--input-l-icon-padding-right,8px) 4px;display:block;text-align:right;width:auto}.next-input-hint-wrap{color:#999;color:var(--input-hint-color,#999);position:relative}.next-input-hint-wrap .next-input-clear{opacity:0;z-index:1;position:absolute}.next-input-hint-wrap .next-input-hint{opacity:1}.next-input .next-icon-eye-close:hover,.next-input .next-icon-eye:hover,.next-input .next-input-clear-icon:hover{cursor:pointer;color:#666;color:var(--input-hint-hover-color,#666)}.next-input .next-input-hover-show{opacity:0}.next-input.next-focus,.next-input:hover{border-color:#ccc;border-color:var(--input-hover-border-color,#ccc);background-color:#fff;background-color:var(--input-hover-bg-color,#fff)}.next-input.next-focus .next-input-clear,.next-input:hover .next-input-clear{opacity:1}.next-input.next-focus .next-input-clear+.next-input-hint,.next-input:hover .next-input-clear+.next-input-hint{opacity:0}.next-input.next-focus .next-input-hover-show,.next-input .next-input-clear:focus,.next-input:hover .next-input-hover-show{opacity:1}.next-input .next-input-clear:focus+.next-input-hint{opacity:0}.next-input.next-focus{border-color:#209bfa;border-color:var(--input-focus-border-color,#209bfa);background-color:#fff;background-color:var(--input-focus-bg-color,#fff);-webkit-box-shadow:0 0 0 2px rgba(32,155,250,.2);box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-input.next-warning{background-color:#fff;background-color:var(--input-feedback-warning-bg-color,#fff)}.next-input.next-warning,.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#f1c826;border-color:var(--input-feedback-warning-border-color,#f1c826)}.next-input.next-warning.next-focus{-webkit-box-shadow:0 0 0 2px rgba(241,200,38,.2);box-shadow:0 0 0 2px rgba(241,200,38,.2)}.next-input.next-error{border-color:#d23c26;border-color:var(--input-feedback-error-border-color,#d23c26);background-color:#fff;background-color:var(--input-feedback-error-bg-color,#fff)}.next-input.next-error input,.next-input.next-error textarea{color:#333;color:var(--input-feedback-error-color,#333)}.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#d23c26;border-color:var(--input-feedback-error-border-color,#d23c26)}.next-input.next-error.next-focus{-webkit-box-shadow:0 0 0 2px rgba(210,60,38,.2);box-shadow:0 0 0 2px rgba(210,60,38,.2)}.next-input.next-hidden{display:none}.next-input.next-noborder{border:none;-webkit-box-shadow:none;box-shadow:none}.next-input-control .next-input-len{font-size:12px;font-size:var(--input-maxlen-font-size,12px);line-height:12px;line-height:var(--input-maxlen-font-size,12px);color:#999;color:var(--input-maxlen-color,#999);display:table-cell;width:1px;vertical-align:bottom}.next-input-control .next-input-len.next-error{color:#d23c26;color:var(--input-maxlen-error-color,#d23c26)}.next-input-control .next-input-len.next-warning{color:#f1c826;color:var(--input-maxlen-warning-color,#f1c826)}.next-input-control>*{display:table-cell;width:1%;top:0}.next-input-control>:not(:last-child){padding-right:4px}.next-input-control .next-icon{-webkit-transition:all .1s linear;transition:all .1s linear;color:#999;color:var(--input-hint-color,#999)}.next-input-control .next-input-warning-icon{color:#f1c826;color:var(--input-feedback-warning-color,#f1c826)}.next-input-control .next-input-warning-icon:before{content:"";content:var(--input-feedback-warning-icon,"\e60b")}.next-input-control .next-input-success-icon{color:#1ad78c;color:var(--input-feedback-success-color,#1ad78c)}.next-input-control .next-input-success-icon:before{content:"";content:var(--input-feedback-success-icon,"\e63a")}.next-input-control .next-input-loading-icon{color:#298dff;color:var(--input-feedback-loading-color,#298dff)}.next-input-control .next-input-loading-icon:before{content:"";content:var(--input-feedback-loading-icon,"\e646");-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}.next-input-control .next-input-clear-icon:before{content:"";content:var(--input-feedback-clear-icon,"\e623")}.next-input-inner-text,.next-input-label{color:#666;color:var(--input-label-color,#666)}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#ccc;color:var(--input-placeholder-color,#ccc);opacity:1}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#ccc;color:var(--input-placeholder-color,#ccc)}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#ccc;color:var(--input-placeholder-color,#ccc)}.next-input.next-disabled{color:#ccc;color:var(--input-disabled-color,#ccc);cursor:not-allowed}.next-input.next-disabled,.next-input.next-disabled:hover{border-color:#eee;border-color:var(--input-disabled-border-color,#eee);background-color:#fafafa;background-color:var(--input-disabled-bg-color,#fafafa)}.next-input.next-disabled input,.next-input.next-disabled textarea{-webkit-text-fill-color:#ccc;-webkit-text-fill-color:var(--input-disabled-color,#ccc);color:#ccc;color:var(--input-disabled-color,#ccc)}.next-input.next-disabled input::-moz-placeholder,.next-input.next-disabled textarea::-moz-placeholder{color:#ccc;color:var(--input-disabled-color,#ccc);opacity:1}.next-input.next-disabled input:-ms-input-placeholder,.next-input.next-disabled textarea:-ms-input-placeholder{color:#ccc;color:var(--input-disabled-color,#ccc)}.next-input.next-disabled input::-webkit-input-placeholder,.next-input.next-disabled textarea::-webkit-input-placeholder{color:#ccc;color:var(--input-disabled-color,#ccc)}.next-input.next-disabled .next-input-hint-wrap,.next-input.next-disabled .next-input-inner-text,.next-input.next-disabled .next-input-label,.next-input.next-disabled .next-input-len{color:#ccc;color:var(--input-disabled-color,#ccc)}.next-input.next-disabled .next-input-hint-wrap .next-input-clear{opacity:0}.next-input.next-disabled .next-input-hint-wrap .next-input-hint{opacity:1}.next-input.next-disabled .next-input-hint-wrap .next-input-clear-icon:hover{cursor:not-allowed;color:#ccc;color:var(--input-disabled-color,#ccc)}.next-input.next-disabled .next-icon{color:#ccc;color:var(--input-disabled-color,#ccc)}.next-input-control,.next-input-inner,.next-input-label{display:table-cell;width:1px;vertical-align:middle;line-height:1;background-color:transparent;white-space:nowrap}.next-input-group{display:inline-table;border-collapse:separate;border-spacing:0;line-height:0;width:100%}.next-input-group,.next-input-group *,.next-input-group :after,.next-input-group :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-input-group-auto-width{width:100%;border-radius:0!important}.next-input-group>.next-input{border-radius:0}.next-input-group>.next-input.next-focus{position:relative;z-index:1}.next-input-group>.next-input:first-child.next-small{border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-small-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-small-corner,3px)!important}.next-input-group>.next-input:first-child.next-medium{border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-medium-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-medium-corner,3px)!important}.next-input-group>.next-input:first-child.next-large{border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-large-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-large-corner,3px)!important}.next-input-group>.next-input:last-child.next-small{border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-small-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-small-corner,3px)!important}.next-input-group>.next-input:last-child.next-medium{border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-medium-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-medium-corner,3px)!important}.next-input-group>.next-input:last-child.next-large{border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-large-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-large-corner,3px)!important}.next-input-group-addon{width:1px;display:table-cell;vertical-align:middle;white-space:nowrap}.next-input-group-addon:first-child,.next-input-group-addon:first-child>*{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*{margin-right:-1px;margin-right:calc(0px - var(--input-border-width, 1px))}.next-input-group-addon:first-child>.next-focus{position:relative;z-index:1}.next-input-group-addon:first-child>*>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*>.next-input.next-focus{position:relative;z-index:1}.next-input-group-addon:last-child,.next-input-group-addon:last-child>*{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-addon:last-child>*{margin-left:-1px;margin-left:calc(0px - var(--input-border-width, 1px))}.next-input-group-addon:last-child>*>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-text{color:#999;color:var(--input-addon-text-color,#999);background-color:#f9f9f9;background-color:var(--input-addon-bg-color,#f9f9f9);text-align:center;border:1px solid #ddd;border:var(--input-border-width,1px) solid var(--input-border-color,#ddd);padding:0 8px;padding:0 var(--input-addon-padding,8px)}.next-input-group-text:first-child{border-right-width:0}.next-input-group-text:last-child{border-left-width:0}.next-input-group-text.next-disabled{color:#ccc;color:var(--input-disabled-color,#ccc);cursor:not-allowed}.next-input-group-text.next-disabled,.next-input-group-text.next-disabled:hover{border-color:#eee;border-color:var(--input-disabled-border-color,#eee);background-color:#fafafa;background-color:var(--input-disabled-bg-color,#fafafa)}.next-input-group-text.next-small{font-size:12px;font-size:var(--form-element-small-font-size,12px);border-radius:3px;border-radius:var(--form-element-small-corner,3px)}.next-input-group-text.next-medium{font-size:14px;font-size:var(--form-element-medium-font-size,14px);border-radius:3px;border-radius:var(--form-element-medium-corner,3px)}.next-input-group-text.next-large{font-size:16px;font-size:var(--form-element-large-font-size,16px);border-radius:3px;border-radius:var(--form-element-large-corner,3px)}.next-input[dir=rtl].next-small .next-input-label{padding-left:0;padding-right:8px;padding-right:var(--input-s-label-padding-left,8px)}.next-input[dir=rtl].next-small .next-input-control{padding-right:0;padding-left:4px;padding-left:var(--input-s-icon-padding-right,4px)}.next-input[dir=rtl].next-medium .next-input-label{padding-left:0;padding-right:8px;padding-right:var(--input-m-label-padding-left,8px)}.next-input[dir=rtl].next-medium .next-input-control{padding-right:0;padding-left:8px;padding-left:var(--input-m-icon-padding-right,8px)}.next-input[dir=rtl].next-large .next-input-label{padding-left:0;padding-right:12px;padding-right:var(--input-l-label-padding-left,12px)}.next-input[dir=rtl].next-large .next-input-control{padding-right:0;padding-left:8px;padding-left:var(--input-l-icon-padding-right,8px)}.next-input[dir=rtl].next-input-textarea .next-input-len{text-align:left}.next-input[dir=rtl] .next-input-control>:not(:last-child){padding-left:4px;padding-right:0}.next-input-group[dir=rtl]>.next-input:first-child.next-small{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-small-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-small-corner,3px)!important}.next-input-group[dir=rtl]>.next-input:first-child.next-medium{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-medium-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-medium-corner,3px)!important}.next-input-group[dir=rtl]>.next-input:first-child.next-large{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-large-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-large-corner,3px)!important}.next-input-group[dir=rtl]>.next-input:last-child.next-small{border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-small-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-small-corner,3px)!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.next-input-group[dir=rtl]>.next-input:last-child.next-medium{border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-medium-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-medium-corner,3px)!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.next-input-group[dir=rtl]>.next-input:last-child.next-large{border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-large-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-large-corner,3px)!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-small{border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-small-corner,3px)!important;border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-small-corner,3px)!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-medium{border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-medium-corner,3px)!important;border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-medium-corner,3px)!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-large{border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--form-element-large-corner,3px)!important;border-top-right-radius:3px!important;border-top-right-radius:var(--form-element-large-corner,3px)!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child>*{margin-left:-1px;margin-left:calc(0px - var(--input-border-width, 1px));border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-small{border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-small-corner,3px)!important;border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-small-corner,3px)!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-medium{border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-medium-corner,3px)!important;border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-medium-corner,3px)!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-large{border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--form-element-large-corner,3px)!important;border-top-left-radius:3px!important;border-top-left-radius:var(--form-element-large-corner,3px)!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child>*{margin-right:-1px;margin-right:calc(0px - var(--input-border-width, 1px));border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-text:first-child{border-right-width:1px;border-right-width:var(--input-border-width,1px);border-left:0}.next-input-group[dir=rtl] .next-input-group-text:last-child{border-left-width:1px;border-left-width:var(--input-border-width,1px);border-right:0}.next-calendar,.next-calendar *,.next-calendar :after,.next-calendar :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-calendar table{border-collapse:collapse;border-spacing:0}.next-calendar td,.next-calendar th{padding:0}@-webkit-keyframes cellZoomIn{0%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes cellZoomIn{0%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes cellHover{0%{opacity:0}to{opacity:1}}@keyframes cellHover{0%{opacity:0}to{opacity:1}}@-webkit-keyframes enterToLeft{0%{-webkit-transform:translate(-40%);transform:translate(-40%);opacity:0}50%{opacity:.6}to{opacity:1;-webkit-transform:translate(0);transform:translate(0)}}@keyframes enterToLeft{0%{-webkit-transform:translate(-40%);transform:translate(-40%);opacity:0}50%{opacity:.6}to{opacity:1;-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes enterToRight{0%{-webkit-transform:translate(40%);transform:translate(40%);opacity:0}50%{opacity:.6}to{opacity:1;-webkit-transform:translate(0);transform:translate(0)}}@keyframes enterToRight{0%{-webkit-transform:translate(40%);transform:translate(40%);opacity:0}50%{opacity:.6}to{opacity:1;-webkit-transform:translate(0);transform:translate(0)}}.next-calendar-card .next-calendar-header,.next-calendar-fullscreen .next-calendar-header{text-align:right}.next-calendar-card .next-calendar-header .next-select,.next-calendar-fullscreen .next-calendar-header .next-select{margin-right:4px;vertical-align:top}.next-calendar-card .next-calendar-header .next-menu,.next-calendar-fullscreen .next-calendar-header .next-menu{text-align:left}.next-calendar-fullscreen .next-calendar-header{margin-bottom:8px;margin-bottom:var(--calendar-fullscreen-header-margin-bottom,8px)}.next-calendar-card .next-calendar-header{margin-bottom:8px;margin-bottom:var(--calendar-card-header-margin-bottom,8px)}.next-calendar-panel-header{position:relative;background:#fff;background:var(--calendar-panel-header-background,#fff);margin-bottom:8px;margin-bottom:var(--calendar-panel-header-margin-bottom,8px);border-bottom:1px solid transparent;border-bottom:var(--calendar-panel-header-border-bottom-width,1px) solid var(--calendar-panel-header-border-bottom-color,transparent)}.next-calendar-panel-header-full,.next-calendar-panel-header-left,.next-calendar-panel-header-right{height:32px;height:var(--calendar-panel-header-height,32px);line-height:32px;line-height:var(--calendar-panel-header-height,32px)}.next-calendar-panel-header-full .next-calendar-btn,.next-calendar-panel-header-left .next-calendar-btn,.next-calendar-panel-header-right .next-calendar-btn{vertical-align:top;font-weight:700;font-weight:var(--calendar-btn-date-font-weight,bold);margin:0 4px;margin:0 var(--calendar-btn-date-margin-lr,4px);background:transparent;border-color:transparent}.next-calendar-panel-header-full .next-calendar-btn,.next-calendar-panel-header-full .next-calendar-btn.visited,.next-calendar-panel-header-full .next-calendar-btn:link,.next-calendar-panel-header-full .next-calendar-btn:visited,.next-calendar-panel-header-left .next-calendar-btn,.next-calendar-panel-header-left .next-calendar-btn.visited,.next-calendar-panel-header-left .next-calendar-btn:link,.next-calendar-panel-header-left .next-calendar-btn:visited,.next-calendar-panel-header-right .next-calendar-btn,.next-calendar-panel-header-right .next-calendar-btn.visited,.next-calendar-panel-header-right .next-calendar-btn:link,.next-calendar-panel-header-right .next-calendar-btn:visited{color:#000;color:var(--calendar-btn-date-color,#000)}.next-calendar-panel-header-full .next-calendar-btn.active,.next-calendar-panel-header-full .next-calendar-btn.hover,.next-calendar-panel-header-full .next-calendar-btn:active,.next-calendar-panel-header-full .next-calendar-btn:focus,.next-calendar-panel-header-full .next-calendar-btn:hover,.next-calendar-panel-header-left .next-calendar-btn.active,.next-calendar-panel-header-left .next-calendar-btn.hover,.next-calendar-panel-header-left .next-calendar-btn:active,.next-calendar-panel-header-left .next-calendar-btn:focus,.next-calendar-panel-header-left .next-calendar-btn:hover,.next-calendar-panel-header-right .next-calendar-btn.active,.next-calendar-panel-header-right .next-calendar-btn.hover,.next-calendar-panel-header-right .next-calendar-btn:active,.next-calendar-panel-header-right .next-calendar-btn:focus,.next-calendar-panel-header-right .next-calendar-btn:hover{color:#fff;color:var(--calendar-btn-date-color-hover,#fff);background:transparent;border-color:transparent;text-decoration:none}.next-calendar-panel-header-left,.next-calendar-panel-header-right{display:inline-block;width:50%;text-align:center}.next-calendar-panel-header-full{width:100%;text-align:center}.next-calendar-panel-menu{max-height:210px;overflow:auto;text-align:left}.next-calendar-btn{cursor:pointer;padding:0;margin:0;border:0;background:transparent;outline:none;height:100%}.next-calendar-btn>.next-icon.next-icon .next-icon-remote,.next-calendar-btn>.next-icon.next-icon:before{width:16px;width:var(--calendar-btn-arrow-size,16px);font-size:16px;font-size:var(--calendar-btn-arrow-size,16px);line-height:inherit}.next-calendar-btn .next-icon{margin-left:4px}.next-calendar-btn-next-decade,.next-calendar-btn-next-month,.next-calendar-btn-next-year,.next-calendar-btn-prev-decade,.next-calendar-btn-prev-month,.next-calendar-btn-prev-year{position:absolute;top:0;background:transparent;border-color:transparent}.next-calendar-btn-next-decade,.next-calendar-btn-next-decade.visited,.next-calendar-btn-next-decade:link,.next-calendar-btn-next-decade:visited,.next-calendar-btn-next-month,.next-calendar-btn-next-month.visited,.next-calendar-btn-next-month:link,.next-calendar-btn-next-month:visited,.next-calendar-btn-next-year,.next-calendar-btn-next-year.visited,.next-calendar-btn-next-year:link,.next-calendar-btn-next-year:visited,.next-calendar-btn-prev-decade,.next-calendar-btn-prev-decade.visited,.next-calendar-btn-prev-decade:link,.next-calendar-btn-prev-decade:visited,.next-calendar-btn-prev-month,.next-calendar-btn-prev-month.visited,.next-calendar-btn-prev-month:link,.next-calendar-btn-prev-month:visited,.next-calendar-btn-prev-year,.next-calendar-btn-prev-year.visited,.next-calendar-btn-prev-year:link,.next-calendar-btn-prev-year:visited{color:#666;color:var(--calendar-btn-arrow-color,#666)}.next-calendar-btn-next-decade.active,.next-calendar-btn-next-decade.hover,.next-calendar-btn-next-decade:active,.next-calendar-btn-next-decade:focus,.next-calendar-btn-next-decade:hover,.next-calendar-btn-next-month.active,.next-calendar-btn-next-month.hover,.next-calendar-btn-next-month:active,.next-calendar-btn-next-month:focus,.next-calendar-btn-next-month:hover,.next-calendar-btn-next-year.active,.next-calendar-btn-next-year.hover,.next-calendar-btn-next-year:active,.next-calendar-btn-next-year:focus,.next-calendar-btn-next-year:hover,.next-calendar-btn-prev-decade.active,.next-calendar-btn-prev-decade.hover,.next-calendar-btn-prev-decade:active,.next-calendar-btn-prev-decade:focus,.next-calendar-btn-prev-decade:hover,.next-calendar-btn-prev-month.active,.next-calendar-btn-prev-month.hover,.next-calendar-btn-prev-month:active,.next-calendar-btn-prev-month:focus,.next-calendar-btn-prev-month:hover,.next-calendar-btn-prev-year.active,.next-calendar-btn-prev-year.hover,.next-calendar-btn-prev-year:active,.next-calendar-btn-prev-year:focus,.next-calendar-btn-prev-year:hover{color:#209bfa;color:var(--calendar-btn-arrow-color-hover,#209bfa);background:transparent;border-color:transparent;text-decoration:none}.next-calendar-btn-prev-decade,.next-calendar-btn-prev-year{left:8px;left:var(--calendar-btn-arrow-double-offset-lr,8px)}.next-calendar-btn-prev-month{left:28px;left:var(--calendar-btn-arrow-single-offset-lr,28px)}.next-calendar-btn-next-month{right:28px;right:var(--calendar-btn-arrow-single-offset-lr,28px)}.next-calendar-btn-next-decade,.next-calendar-btn-next-year{right:8px;right:var(--calendar-btn-arrow-double-offset-lr,8px)}.next-calendar-fullscreen .next-calendar-th{text-align:right;color:#333;color:var(--calendar-fullscreen-table-head-color,#333);font-size:16px;font-size:var(--calendar-fullscreen-table-head-font-size,16px);font-weight:700;font-weight:var(--calendar-fullscreen-table-head-font-weight,bold);padding-right:12px;padding-right:var(--calendar-fullscreen-table-head-padding-r,12px);padding-bottom:4px;padding-bottom:var(--calendar-fullscreen-table-head-padding-b,4px)}.next-calendar-fullscreen .next-calendar-cell{font-size:14px;font-size:var(--calendar-fullscreen-table-cell-font-size,14px)}.next-calendar-fullscreen .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell.next-selected .next-calendar-month{font-weight:700;font-weight:var(--calendar-fullscreen-table-cell-select-font-weight,bold);background:#add9ff;background:var(--calendar-fullscreen-table-cell-select-background,#add9ff);color:#209bfa;color:var(--calendar-fullscreen-table-cell-select-color,#209bfa);border-color:#209bfa;border-color:var(--calendar-fullscreen-table-cell-select-border-color,#209bfa)}.next-calendar-fullscreen .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell.next-disabled .next-calendar-month{cursor:not-allowed;background:#fafafa;background:var(--calendar-fullscreen-table-cell-disabled-background,#fafafa);color:#ccc;color:var(--calendar-fullscreen-table-cell-disabled-color,#ccc);border-color:#eee;border-color:var(--calendar-fullscreen-table-cell-disabled-border-color,#eee)}.next-calendar-fullscreen .next-calendar-date,.next-calendar-fullscreen .next-calendar-month{text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 4px;margin:var(--calendar-fullscreen-table-cell-margin-tb,0) var(--calendar-fullscreen-table-cell-margin-lr,4px);padding:4px 8px;padding:var(--calendar-fullscreen-table-cell-padding-tb,4px) var(--calendar-fullscreen-table-cell-padding-lr,8px);min-height:80px;min-height:var(--calendar-fullscreen-table-cell-min-height,80px);border-top:2px solid;border-top:var(--calendar-fullscreen-table-cell-boder-top-width,2px) var(--line-solid,solid);-webkit-transition:background .1s linear;transition:background .1s linear;background:#fff;background:var(--calendar-fullscreen-table-cell-normal-background,#fff);color:#333;color:var(--calendar-fullscreen-table-cell-normal-color,#333);border-color:#e6e6e6;border-color:var(--calendar-fullscreen-table-cell-normal-border-color,#e6e6e6)}.next-calendar-fullscreen .next-calendar-date:hover,.next-calendar-fullscreen .next-calendar-month:hover{background:#add9ff;background:var(--calendar-fullscreen-table-cell-hover-background,#add9ff);color:#209bfa;color:var(--calendar-fullscreen-table-cell-hover-color,#209bfa);border-color:#209bfa;border-color:var(--calendar-fullscreen-table-cell-hover-border-color,#209bfa)}.next-calendar-fullscreen .next-calendar-cell-next-month .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell-prev-month .next-calendar-date{background:transparent;background:var(--calendar-fullscreen-table-cell-other-background,transparent);color:#ccc;color:var(--calendar-fullscreen-table-cell-other-color,#ccc);border-color:transparent;border-color:var(--calendar-fullscreen-table-cell-other-border-color,transparent)}.next-calendar-fullscreen .next-calendar-cell-current .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell-current .next-calendar-month{font-weight:700;font-weight:var(--calendar-fullscreen-table-cell-current-font-weight,bold);background:#fff;background:var(--calendar-fullscreen-table-cell-current-background,#fff);color:#209bfa;color:var(--calendar-fullscreen-table-cell-current-color,#209bfa);border-color:#209bfa;border-color:var(--calendar-fullscreen-table-cell-current-border-color,#209bfa)}.next-calendar-card .next-calendar-th,.next-calendar-panel .next-calendar-th,.next-calendar-range .next-calendar-th{text-align:center;color:#999;color:var(--calendar-card-table-head-color,#999);font-size:12px;font-size:var(--calendar-card-table-head-font-size,12px);font-weight:400;font-weight:var(--calendar-card-table-head-font-weight,normal)}.next-calendar-card .next-calendar-cell,.next-calendar-panel .next-calendar-cell,.next-calendar-range .next-calendar-cell{text-align:center;font-size:12px;font-size:var(--calendar-card-table-cell-font-size,12px)}.next-calendar-card .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-card .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-card .next-calendar-cell.next-selected .next-calendar-year,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-year,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-year{-webkit-animation:cellZoomIn .4s cubic-bezier(.23,1,.32,1);animation:cellZoomIn .4s cubic-bezier(.23,1,.32,1);font-weight:700;font-weight:var(--calendar-card-table-cell-select-font-weight,bold);background:#209bfa;background:var(--calendar-card-table-cell-select-background,#209bfa);color:#fff;color:var(--calendar-card-table-cell-select-color,#fff);border-color:#209bfa;border-color:var(--calendar-card-table-cell-select-border-color,#209bfa)}.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-year,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-year,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-year{cursor:not-allowed;background:#fafafa;background:var(--calendar-card-table-cell-disabled-background,#fafafa);color:#ccc;color:var(--calendar-card-table-cell-disabled-color,#ccc);border-color:#fafafa;border-color:var(--calendar-card-table-cell-disabled-border-color,#fafafa)}.next-calendar-card .next-calendar-cell.next-inrange .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-inrange .next-calendar-date,.next-calendar-range .next-calendar-cell.next-inrange .next-calendar-date{background:#e4f3fe;background:var(--calendar-card-table-cell-inrange-background,#e4f3fe);color:#209bfa;color:var(--calendar-card-table-cell-inrange-color,#209bfa);border-color:#e4f3fe;border-color:var(--calendar-card-table-cell-inrange-border-color,#e4f3fe)}.next-calendar-card .next-calendar-date,.next-calendar-card .next-calendar-month,.next-calendar-card .next-calendar-year,.next-calendar-panel .next-calendar-date,.next-calendar-panel .next-calendar-month,.next-calendar-panel .next-calendar-year,.next-calendar-range .next-calendar-date,.next-calendar-range .next-calendar-month,.next-calendar-range .next-calendar-year{text-align:center;border:1px solid;border:var(--line-1,1px) var(--line-solid,solid);background:#fff;background:var(--calendar-card-table-cell-normal-background,#fff);color:#666;color:var(--calendar-card-table-cell-normal-color,#666);border-color:#fff;border-color:var(--calendar-card-table-cell-normal-border-color,#fff)}.next-calendar-card .next-calendar-date:hover,.next-calendar-card .next-calendar-month:hover,.next-calendar-card .next-calendar-year:hover,.next-calendar-panel .next-calendar-date:hover,.next-calendar-panel .next-calendar-month:hover,.next-calendar-panel .next-calendar-year:hover,.next-calendar-range .next-calendar-date:hover,.next-calendar-range .next-calendar-month:hover,.next-calendar-range .next-calendar-year:hover{cursor:pointer;background:#e4f3fe;background:var(--calendar-card-table-cell-hover-background,#e4f3fe);color:#209bfa;color:var(--calendar-card-table-cell-hover-color,#209bfa);border-color:#e4f3fe;border-color:var(--calendar-card-table-cell-hover-border-color,#e4f3fe)}.next-calendar-card .next-calendar-date,.next-calendar-panel .next-calendar-date,.next-calendar-range .next-calendar-date{width:24px;width:var(--calendar-card-table-cell-date-width,24px);height:24px;height:var(--calendar-card-table-cell-date-height,24px);line-height:22px;line-height:calc(var(--calendar-card-table-cell-date-height, 24px) - 2px);margin:4px auto;border-radius:3px;border-radius:var(--calendar-card-table-cell-date-border-radius,3px)}.next-calendar-card .next-calendar-month,.next-calendar-panel .next-calendar-month,.next-calendar-range .next-calendar-month{width:60px;width:var(--calendar-card-table-cell-month-width,60px);height:24px;height:var(--calendar-card-table-cell-month-height,24px);line-height:22px;line-height:calc(var(--calendar-card-table-cell-month-height, 24px) - 2px);margin:8px auto;border-radius:3px;border-radius:var(--calendar-card-table-cell-month-border-radius,3px)}.next-calendar-card .next-calendar-year,.next-calendar-panel .next-calendar-year,.next-calendar-range .next-calendar-year{width:48px;width:var(--calendar-card-table-cell-year-width,48px);height:24px;height:var(--calendar-card-table-cell-year-height,24px);line-height:22px;line-height:calc(var(--calendar-card-table-cell-year-height, 24px) - 2px);margin:8px auto;border-radius:3px;border-radius:var(--calendar-card-table-cell-year-border-radius,3px)}.next-calendar-card .next-calendar-cell-next-month .next-calendar-date,.next-calendar-card .next-calendar-cell-prev-month .next-calendar-date,.next-calendar-panel .next-calendar-cell-next-month .next-calendar-date,.next-calendar-panel .next-calendar-cell-prev-month .next-calendar-date,.next-calendar-range .next-calendar-cell-next-month .next-calendar-date,.next-calendar-range .next-calendar-cell-prev-month .next-calendar-date{background:#fff;background:var(--calendar-card-table-cell-other-background,#fff);color:#ccc;color:var(--calendar-card-table-cell-other-color,#ccc);border-color:#fff;border-color:var(--calendar-card-table-cell-other-border-color,#fff)}.next-calendar-card .next-calendar-cell-current .next-calendar-date,.next-calendar-card .next-calendar-cell-current .next-calendar-month,.next-calendar-card .next-calendar-cell-current .next-calendar-year,.next-calendar-panel .next-calendar-cell-current .next-calendar-date,.next-calendar-panel .next-calendar-cell-current .next-calendar-month,.next-calendar-panel .next-calendar-cell-current .next-calendar-year,.next-calendar-range .next-calendar-cell-current .next-calendar-date,.next-calendar-range .next-calendar-cell-current .next-calendar-month,.next-calendar-range .next-calendar-cell-current .next-calendar-year{font-weight:700;font-weight:var(--calendar-card-table-cell-current-font-weight,bold);background:#fff;background:var(--calendar-card-table-cell-current-background,#fff);color:#209bfa;color:var(--calendar-card-table-cell-current-color,#209bfa);border-color:transparent;border-color:var(--calendar-card-table-cell-current-border-color,transparent)}.next-calendar-panel.next-calendar-week .next-calendar-tbody tr{cursor:pointer}.next-calendar-panel.next-calendar-week .next-calendar-tbody tr:hover .next-calendar-cell .next-calendar-date{background:#e4f3fe;background:var(--calendar-card-table-cell-hover-background,#e4f3fe);color:#209bfa;color:var(--calendar-card-table-cell-hover-color,#209bfa);border-color:#e4f3fe;border-color:var(--calendar-card-table-cell-hover-border-color,#e4f3fe)}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-cell.next-selected .next-calendar-date{font-weight:400;background:transparent;border-color:transparent}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date{position:relative;color:#209bfa;color:var(--calendar-card-table-cell-inrange-color,#209bfa)}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date:before{content:"";position:absolute;left:-1px;left:calc(0px - var(--line-1, 1px));top:-1px;top:calc(0px - var(--line-1, 1px));bottom:-1px;bottom:calc(0px - var(--line-1, 1px));right:-1px;right:calc(0px - var(--line-1, 1px));border:1px solid;border:var(--line-1,1px) var(--line-solid,solid);background:#e4f3fe;background:var(--calendar-card-table-cell-inrange-background,#e4f3fe);border-color:#e4f3fe;border-color:var(--calendar-card-table-cell-inrange-border-color,#e4f3fe);border-radius:3px;border-radius:var(--calendar-card-table-cell-date-border-radius,3px)}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date>span{position:relative}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-end,.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-start{color:#fff;color:var(--calendar-card-table-cell-select-color,#fff)}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-end:before,.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-start:before{background:#209bfa;background:var(--calendar-card-table-cell-select-background,#209bfa);border-color:#209bfa;border-color:var(--calendar-card-table-cell-select-border-color,#209bfa)}.next-calendar[dir=rtl] .next-calendar-header{text-align:left}.next-calendar[dir=rtl] .next-calendar-header .next-select{margin-right:0;margin-left:4px}.next-calendar[dir=rtl] .next-calendar-header .next-menu{text-align:right}.next-calendar[dir=rtl] .next-calendar-btn-prev-decade,.next-calendar[dir=rtl] .next-calendar-btn-prev-year{left:auto;right:8px;right:var(--calendar-btn-arrow-double-offset-lr,8px)}.next-calendar[dir=rtl] .next-calendar-btn-prev-month{left:auto;right:28px;right:var(--calendar-btn-arrow-single-offset-lr,28px)}.next-calendar[dir=rtl] .next-calendar-btn-next-month{right:auto;left:28px;left:var(--calendar-btn-arrow-single-offset-lr,28px)}.next-calendar[dir=rtl] .next-calendar-btn-next-decade,.next-calendar[dir=rtl] .next-calendar-btn-next-year{right:auto;left:8px;left:var(--calendar-btn-arrow-double-offset-lr,8px)}.next-calendar-fullscreen[dir=rtl] .next-calendar-th{text-align:left;padding-left:12px;padding-left:var(--calendar-fullscreen-table-head-padding-r,12px);padding-right:0}.next-calendar-fullscreen[dir=rtl] .next-calendar-date,.next-calendar-fullscreen[dir=rtl] .next-calendar-month{text-align:left}.next-calendar-range[dir=rtl] .next-calendar-body-left,.next-calendar-range[dir=rtl] .next-calendar-body-right{float:right}.next-calendar-range[dir=rtl] .next-calendar-body-left{padding-right:0;padding-left:8px}.next-calendar-range[dir=rtl] .next-calendar-body-right{padding-left:0;padding-right:8px}.next-calendar-table{width:100%;table-layout:fixed}.next-calendar-range .next-calendar-body-left,.next-calendar-range .next-calendar-body-right{float:left;width:50%}.next-calendar-range .next-calendar-body-left{padding-right:8px}.next-calendar-range .next-calendar-body-right{padding-left:8px}.next-calendar-range .next-calendar-body:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-calendar-symbol-prev:before{content:"";content:var(--calendar-btn-arrow-content-prev,"\e61d")}.next-calendar-symbol-next:before{content:"";content:var(--calendar-btn-arrow-content-next,"\e619")}.next-calendar-symbol-prev-super:before{content:"";content:var(--calendar-btn-arrow-content-prev-super,"\e659")}.next-calendar-symbol-next-super:before{content:"";content:var(--calendar-btn-arrow-content-next-super,"\e65e")}.next-card,.next-card:after,.next-card:before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-card[dir=rtl] .next-card-extra{left:0;right:auto}.next-card[dir=rtl] .next-card-title:before{right:0;left:auto}.next-card[dir=rtl] .next-card-subtitle{float:left;padding-right:8px;padding-right:var(--card-sub-title-padding-left,8px);padding-left:0}.next-card[dir=rtl] .next-card-head-show-bullet .next-card-title{padding-left:0;padding-right:8px;padding-right:var(--card-title-padding-left,8px)}.next-card,.next-card *,.next-card :after,.next-card :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-card{min-width:100px;border:0 solid #e6e6e6;border:var(--card-border-width,0) var(--card-border-style,solid) var(--card-border-color,#e6e6e6);border-radius:3px;border-radius:var(--card-corner,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--card-shadow,none);box-shadow:none;box-shadow:var(--card-shadow,none);background:#fff;background:var(--card-background,#fff);overflow:hidden}.next-card-noborder{border:0}.next-card-head{background:#fff;background:var(--card-header-background,#fff);padding-left:24px;padding-left:var(--card-padding-lr,24px);padding-right:24px;padding-right:var(--card-padding-lr,24px)}.next-card-head-show-bullet .next-card-title{padding-left:8px;padding-left:var(--card-title-padding-left,8px)}.next-card-head-show-bullet .next-card-title:before{content:"";display:inline-block;height:16px;height:var(--card-title-bullet-height,16px);width:3px;width:var(--card-title-bullet-width,3px);background:#209bfa;background:var(--card-title-bullet-color,#209bfa);position:absolute;left:0;top:calc(50% - 8px);top:calc(50% - var(--card-title-bullet-height, 16px)/2)}.next-card-head-main{position:relative;margin-top:0;margin-top:var(--card-head-main-margin-top,0);margin-bottom:0;margin-bottom:var(--card-head-main-margin-bottom,0);height:64px;height:var(--card-head-main-height,64px);line-height:64px;line-height:var(--card-head-main-height,64px)}.next-card-title{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:80%;height:100%;color:#333;color:var(--card-title-color,#333);font-size:16px;font-size:var(--card-title-font-size,16px);font-weight:400;font-weight:var(--card-title-font-weight,normal)}.next-card-subtitle{font-size:12px;font-size:var(--card-sub-title-font-size,12px);color:#666;color:var(--card-sub-title-color,#666);padding-left:8px;padding-left:var(--card-sub-title-padding-left,8px)}.next-card-extra{position:absolute;right:0;top:0;height:100%;font-size:14px;font-size:var(--card-title-extra-font-size,14px);color:#298dff;color:var(--card-title-extra-color,#298dff)}.next-card-body{padding-bottom:20px;padding-bottom:var(--card-body-padding-bottom,20px);padding-left:24px;padding-left:var(--card-padding-lr,24px);padding-right:24px;padding-right:var(--card-padding-lr,24px)}.next-card-show-divider .next-card-head-main{border-bottom:1px solid #eee;border-bottom:var(--card-head-bottom-border-width,1px) var(--card-border-style,solid) var(--card-head-bottom-border-color,#eee)}.next-card-show-divider .next-card-body{padding-top:20px;padding-top:var(--card-body-show-divider-padding-top,20px)}.next-card-hide-divider .next-card-body{padding-top:0;padding-top:var(--card-body-hide-divider-padding-top,0)}.next-card—free{padding:0}.next-card-content{overflow:hidden;-webkit-transition:all .3s ease;transition:all .3s ease;position:relative}.next-card-footer .next-icon{-webkit-transition:all .1s linear;transition:all .1s linear}.next-card-footer .next-icon.next-icon-arrow-down.expand{-webkit-transform-origin:50% 47%;-ms-transform-origin:50% 47%;transform-origin:50% 47%;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.next-card-header{background:#fff;background:var(--card-header-background,#fff);padding:0 24px;padding:0 var(--card-padding-lr,24px);margin-bottom:20px;margin-bottom:var(--card-body-show-divider-padding-top,20px);margin-top:20px;margin-top:var(--card-body-padding-bottom,20px)}.next-card-media,.next-card-media>*{display:block;background-size:cover;background-repeat:no-repeat;background-position:50%;-o-object-fit:cover;object-fit:cover;width:100%}.next-card-header-titles{overflow:hidden}.next-card-header-extra{float:right;text-align:right}.next-card-header-extra .next--btn{margin-left:12px;vertical-align:middle}.next-card-header-title{color:#333;color:var(--card-title-color,#333);font-size:16px;font-size:var(--card-title-font-size,16px);font-weight:400;font-weight:var(--card-title-font-weight,normal);line-height:1.5}.next-card-header-subtitle{font-size:12px;font-size:var(--card-sub-title-font-size,12px);color:#666;color:var(--card-sub-title-color,#666)}.next-card-actions{display:block;padding:20px 24px;padding:var(--card-body-show-divider-padding-top,20px) var(--card-padding-lr,24px) var(--card-body-padding-bottom,20px)}.next-card-actions .next-btn:not(:last-child){margin-right:12px;vertical-align:middle}.next-card-divider{border-style:none;width:100%;margin:0;position:relative;overflow:visible}.next-card-divider:before{content:"";display:block;border-bottom:1px solid #eee;border-bottom:var(--card-head-bottom-border-width,1px) var(--card-border-style,solid) var(--card-head-bottom-border-color,#eee)}.next-card-divider--inset{padding:0 24px;padding:0 var(--card-padding-lr,24px)}.next-card-content-container{margin-top:20px;margin-top:var(--card-body-show-divider-padding-top,20px);padding-bottom:20px;padding-bottom:var(--card-body-padding-bottom,20px);padding-left:24px;padding-left:var(--card-padding-lr,24px);padding-right:24px;padding-right:var(--card-padding-lr,24px);font-size:14px;font-size:var(--card-content-font-size,14px);line-height:1.5;line-height:var(--card-content-line-height,1.5);color:#666;color:var(--card-content-color,#666)}.next-cascader{display:inline-block;overflow:auto;border:1px solid #e6e6e6;border:var(--cascader-menu-border-width,1px) var(--line-solid,solid) var(--cascader-menu-border-color,#e6e6e6);border-radius:3px;border-radius:var(--cascader-menu-border-radius,3px)}.next-cascader,.next-cascader *,.next-cascader :after,.next-cascader :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-cascader-inner:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-cascader-menu-wrapper{float:left;overflow:auto;width:auto;width:var(--cascader-menu-width,auto);min-width:100px;min-width:var(--cascader-menu-min-width,100px);height:192px;height:var(--cascader-menu-height,192px);overflow-x:hidden;overflow-y:auto}.next-cascader-menu-wrapper+.next-cascader-menu-wrapper{border-left:1px solid #e6e6e6;border-left:var(--cascader-menu-border-width,1px) var(--line-solid,solid) var(--cascader-menu-border-color,#e6e6e6)}.next-cascader-menu{position:relative;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;min-width:auto;min-height:100%}.next-cascader-menu.next-has-right-border{border-right:1px solid #e6e6e6;border-right:var(--cascader-menu-border-width,1px) var(--line-solid,solid) var(--cascader-menu-border-color,#e6e6e6)}.next-cascader-menu-item.next-expanded{color:#333;color:var(--cascader-menu-item-expanded-color,#333);background-color:#f9f9f9;background-color:var(--cascader-menu-item-expanded-background-color,#f9f9f9)}.next-cascader-menu-icon-right{position:absolute;top:0;right:10px;color:#666;color:var(--cascader-menu-icon-expand-color,#666)}.next-cascader-menu-icon-right:hover{color:#333;color:var(--cascader-menu-icon-hover-expand-color,#333)}.next-cascader-menu-icon-expand.next-icon .next-icon-remote,.next-cascader-menu-icon-expand.next-icon:before{width:20px;width:var(--cascader-menu-icon-expand-size,20px);font-size:20px;font-size:var(--cascader-menu-icon-expand-size,20px);line-height:inherit}.next-cascader-menu-icon-loading.next-icon .next-icon-remote,.next-cascader-menu-icon-loading.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-cascader-menu-item.next-expanded .next-cascader-menu-icon-right{color:#333;color:var(--cascader-menu-icon-hover-expand-color,#333)}.next-cascader-menu-item.next-expanded .next-cascader-menu-icon-loading{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-cascader-filtered-list{height:192px;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;overflow:auto}.next-cascader-filtered-list .next-menu-item-inner{overflow:visible}.next-cascader-filtered-item em{color:#209bfa;color:var(--color-brand1-6,#209bfa);font-style:normal}.next-cascader[dir=rtl] .next-cascader-menu-wrapper{float:right;border-left:none;border-right:1px solid #e6e6e6;border-right:var(--cascader-menu-border-width,1px) var(--line-solid,solid) var(--cascader-menu-border-color,#e6e6e6)}.next-cascader[dir=rtl] .next-cascader-menu-wrapper:first-child{border-right:none}.next-cascader[dir=rtl] .next-cascader-menu.next-has-right-border{border-right:none;border-left:1px solid #e6e6e6;border-left:var(--cascader-menu-border-width,1px) var(--line-solid,solid) var(--cascader-menu-border-color,#e6e6e6)}.next-cascader[dir=rtl] .next-cascader-menu-icon-right{right:auto;left:10px}.next-cascader-select,.next-cascader-select *,.next-cascader-select-dropdown,.next-cascader-select :after,.next-cascader-select :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-cascader-select-dropdown{border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none)}.next-cascader-select-dropdown *,.next-cascader-select-dropdown :after,.next-cascader-select-dropdown :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-cascader-select-dropdown .next-cascader{display:block;border:none;-webkit-box-shadow:none;box-shadow:none}.next-cascader-select-not-found{padding:0;border:none;-webkit-box-shadow:none;box-shadow:none;overflow:auto;color:#999;color:var(--color-text1-2,#999)}.next-cascader-select-not-found .next-menu-item:hover{color:#999;color:var(--color-text1-2,#999);background:#fff;cursor:default}.next-checkbox-wrapper[dir=rtl]{margin-right:8px;margin-left:0}.next-checkbox-wrapper[dir=rtl]:first-child{margin-right:0}.next-checkbox-wrapper[dir=rtl]>.next-checkbox-label{margin-right:4px;margin-right:var(--checkbox-margin-left,4px);margin-left:0}.next-checkbox-wrapper{display:inline-block}.next-checkbox-wrapper,.next-checkbox-wrapper *,.next-checkbox-wrapper :after,.next-checkbox-wrapper :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-checkbox-wrapper .next-checkbox{display:inline-block;position:relative;line-height:1;vertical-align:middle}.next-checkbox-wrapper input[type=checkbox]{opacity:0;position:absolute;top:0;left:0;width:16px;width:var(--checkbox-size,16px);height:16px;height:var(--checkbox-size,16px);margin:0;cursor:pointer}.next-checkbox-wrapper .next-checkbox-inner{display:block;width:16px;width:var(--checkbox-size,16px);height:16px;height:var(--checkbox-size,16px);background:#fff;background:var(--checkbox-bg-color,#fff);border-radius:3px;border-radius:var(--checkbox-border-radius,3px);border:1px solid #ddd;border:var(--checkbox-border-width,1px) solid var(--checkbox-border-color,#ddd);-webkit-transition:all .1s linear;transition:all .1s linear;text-align:left;-webkit-box-shadow:none;-webkit-box-shadow:var(--checkbox-shadow,none);box-shadow:none;box-shadow:var(--checkbox-shadow,none)}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);position:absolute;top:0;opacity:0;line-height:16px;line-height:var(--checkbox-size,16px);-webkit-transition:all .1s linear;transition:all .1s linear;color:#fff;color:var(--checkbox-checked-circle-color,#fff);left:2px;left:calc(var(--checkbox-size, 16px)/2 - var(--checkbox-circle-size, 12px)/2);margin-top:1px;margin-left:0}.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:12px;width:var(--checkbox-circle-size,12px);font-size:12px;font-size:var(--checkbox-circle-size,12px);line-height:inherit}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{vertical-align:top;margin-top:0}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-select-icon:before{content:"";content:var(--checkbox-select-icon-content,"\e632")}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-semi-select-icon:before{content:"";content:var(--checkbox-semi-select-icon-content,"\e633")}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner{border-color:transparent;border-color:var(--checkbox-checked-border-color,transparent);background-color:#209bfa;background-color:var(--checkbox-checked-bg-color,#209bfa)}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner:hover{border-color:transparent;border-color:var(--checkbox-checked-border-color,transparent)}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);margin-left:0}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:12px;width:var(--checkbox-circle-size,12px);font-size:12px;font-size:var(--checkbox-circle-size,12px);line-height:inherit}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner{border-color:transparent;border-color:var(--checkbox-checked-border-color,transparent);background-color:#209bfa;background-color:var(--checkbox-checked-bg-color,#209bfa)}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner:hover{border-color:transparent;border-color:var(--checkbox-checked-border-color,transparent)}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1);margin-left:0}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:12px;width:var(--checkbox-circle-size,12px);font-size:12px;font-size:var(--checkbox-circle-size,12px);line-height:inherit}.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner{border-color:#209bfa;border-color:var(--checkbox-hovered-border-color,#209bfa);background-color:#add9ff;background-color:var(--checkbox-hovered-bg-color,#add9ff)}.next-checkbox-wrapper.focused .next-checkbox-label,.next-checkbox-wrapper.hovered .next-checkbox-label,.next-checkbox-wrapper:not(.disabled):hover .next-checkbox-label{cursor:pointer}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner{border-color:transparent;border-color:var(--checkbox-checked-hovered-border-color,transparent);background-color:#1274e7;background-color:var(--checkbox-checked-hovered-bg-color,#1274e7)}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon{color:#fff;color:var(--checkbox-checked-hovered-circle-color,#fff);opacity:1}.next-checkbox-wrapper.disabled input[type=checkbox]{cursor:not-allowed}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner,.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#eee;border-color:var(--checkbox-disabled-border-color,#eee);background:#fafafa;background:var(--checkbox-disabled-bg-color,#fafafa)}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover{border-color:#eee;border-color:var(--checkbox-disabled-border-color,#eee)}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner>.next-icon{color:#ccc;color:var(--checkbox-disabled-circle-color,#ccc);opacity:1}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#eee;border-color:var(--checkbox-disabled-border-color,#eee);background:#fafafa;background:var(--checkbox-disabled-bg-color,#fafafa)}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner>.next-icon{color:#ccc;color:var(--checkbox-disabled-circle-color,#ccc);opacity:1}.next-checkbox-wrapper.disabled .next-checkbox-label{color:#ccc;color:var(--checkbox-disabled-label-color,#ccc);cursor:not-allowed}.next-checkbox-group .next-checkbox-wrapper{display:inline-block;margin-right:12px}.next-checkbox-group .next-checkbox-wrapper:last-child{margin-right:0}.next-checkbox-group-ver .next-checkbox-wrapper{display:block;margin-left:0;margin-right:0;margin-bottom:8px}.next-checkbox-label{font-size:14px;font-size:var(--checkbox-font-size,14px);color:#333;color:var(--checkbox-label-color,#333);vertical-align:middle;margin:0 0 0 4px;margin-left:var(--checkbox-margin-left,4px);margin-right:4px;margin-right:var(--checkbox-margin-left,4px);line-height:1}.next-collapse[dir=rtl] .next-collapse-panel-title{padding:8px 36px 8px 0;padding:var(--collapse-title-padding-tb,8px) 36px var(--collapse-title-padding-tb,8px) 0}.next-collapse[dir=rtl] .next-collapse-panel-icon{left:inherit;right:12px;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);margin-left:0;margin-right:0}.next-collapse[dir=rtl] .next-collapse-panel-icon .next-icon-remote,.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:16px;font-size:16px;line-height:inherit}.next-collapse{border:1px solid #e6e6e6;border:var(--collapse-border-width,1px) solid var(--collapse-border-color,#e6e6e6);border-radius:3px;border-radius:var(--collapse-border-corner,3px)}.next-collapse,.next-collapse *,.next-collapse :after,.next-collapse :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-collapse:focus,.next-collapse :focus{outline:0}.next-collapse-panel:not(:first-child){border-top:1px solid #e6e6e6;border-top:var(--collapse-title-border-width,1px) solid var(--collapse-panel-border-color,#e6e6e6)}.next-collapse .next-collapse-panel-icon{position:absolute;color:#333;color:var(--collapse-icon-color,#333);-webkit-transition:-webkit-transform .1s linear;transition:-webkit-transform .1s linear;transition:transform .1s linear;transition:transform .1s linear,-webkit-transform .1s linear;left:12px;margin-top:-2px;margin-left:0;margin-right:0}.next-collapse .next-collapse-panel-icon .next-icon-remote,.next-collapse .next-collapse-panel-icon:before{width:16px;font-size:16px;line-height:inherit}.next-collapse-panel-title{position:relative;line-height:1.5;line-height:var(--font-lineheight-2,1.5);background:#f9f9f9;background:var(--collapse-title-bg-color,#f9f9f9);font-size:14px;font-size:var(--collapse-title-font-size,14px);font-weight:400;font-weight:var(--collapse-title-font-weight,normal);color:#333;color:var(--collapse-title-font-color,#333);cursor:pointer;padding:8px 0 8px 36px;padding:var(--collapse-title-padding-tb,8px) 0 var(--collapse-title-padding-tb,8px) 36px;-webkit-transition:background .1s linear;transition:background .1s linear}.next-collapse-panel-title:hover{background:#f5f5f5;background:var(--collapse-title-hover-bg-color,#f5f5f5);color:#333;color:var(--collapse-title-hover-font-color,#333);font-weight:400;font-weight:var(--collapse-title-hover-font-weight,normal)}.next-collapse-panel-title:hover .next-collapse-panel-icon{color:#333;color:var(--collapse-icon-hover-color,#333)}.next-collapse-panel-content{height:0;line-height:1.5;line-height:var(--font-lineheight-2,1.5);padding:0 16px;padding:0 var(--collapse-content-padding-x,16px);background:#fff;background:var(--collapse-content-bg-color,#fff);font-size:14px;font-size:var(--collapse-content-font-size,14px);color:#666;color:var(--collapse-content-color,#666);-webkit-transition:all .3s ease;transition:all .3s ease;opacity:0}.next-collapse-panel-expanded>.next-collapse-panel-content{display:block;padding:12px 16px;padding:var(--collapse-content-padding-y,12px) var(--collapse-content-padding-x,16px);height:auto;opacity:1}.next-collapse .next-collapse-unfold-icon:before{content:"";content:var(--collapse-unfold-icon-content,"")}.next-collapse-panel-hidden>.next-collapse-panel-content{overflow:hidden}.next-collapse .next-collapse-panel-icon:before{content:"";content:var(--collapse-fold-icon-content,"\e619")}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);margin-left:0;margin-right:0}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded .next-icon-remote,.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:16px;font-size:16px;line-height:inherit}.next-collapse-disabled,.next-collapse-panel-disabled:not(:first-child){border-color:#eee;border-color:var(--collapse-disabled-border-color,#eee)}.next-collapse-panel-disabled>.next-collapse-panel-title{cursor:not-allowed;background:#f9f9f9;background:var(--collapse-title-disabled-bg-color,#f9f9f9)}.next-collapse-panel-disabled .next-collapse-panel-icon,.next-collapse-panel-disabled>.next-collapse-panel-title{color:#ccc;color:var(--collapse-title-font-disabled-color,#ccc)}.next-collapse-panel-disabled .next-collapse-panel-title:hover{font-weight:400;font-weight:var(--collapse-title-font-weight,normal)}.next-collapse-panel-disabled .next-collapse-panel-title:hover .next-collapse-panel-icon,.next-collapse-panel-disabled:hover{color:#ccc;color:var(--collapse-title-font-disabled-color,#ccc)}.next-collapse-panel-disabled:hover{background:#f9f9f9;background:var(--collapse-title-disabled-bg-color,#f9f9f9)}.next-time-picker-menu{float:left;text-align:center}.next-time-picker-menu:not(:last-child){border-right:1px solid #ddd;border-right:var(--time-picker-menu-border-width,1px) var(--line-solid,solid) var(--time-picker-menu-border-color,#ddd)}.next-time-picker-menu-title{cursor:default;height:28px;height:var(--time-picker-menu-title-height,28px);line-height:28px;line-height:var(--time-picker-menu-title-height,28px);font-size:12px;font-size:var(--time-picker-menu-title-font-size,12px);font-weight:400;font-weight:var(--time-pikcer-menu-title-font-weight,normal);color:#999;color:var(--time-picker-menu-title-color,#999);background:#fff;background:var(--time-picker-menu-title-background,#fff)}.next-time-picker-menu ul{position:relative;overflow-y:auto;list-style:none;margin:0;padding:0;font-size:12px;font-size:var(--time-picker-menu-item-font-size,12px);height:196px;height:calc(var(--time-picker-menu-item-height, 28px)*7)}.next-time-picker-menu-item{cursor:pointer;height:28px;height:var(--time-picker-menu-item-height,28px);line-height:28px;line-height:var(--time-picker-menu-item-height,28px);-webkit-transition:background .1s linear;transition:background .1s linear;color:#666;color:var(--time-picker-menu-item-color,#666);background:#fff;background:var(--time-picker-menu-item-background,#fff);outline:none}.next-time-picker-menu-item:hover{color:#333;color:var(--time-picker-menu-item-color-hover,#333);background:#f9f9f9;background:var(--time-picker-menu-item-background-hover,#f9f9f9)}.next-time-picker-menu-item.next-selected{font-weight:700;font-weight:var(--time-picker-menu-item-font-weight-selected,bold);color:#666;color:var(--time-picker-menu-item-color-selected,#666);background:#f9f9f9;background:var(--time-picker-menu-item-background-selected,#f9f9f9)}.next-time-picker-menu-item.next-disabled{cursor:not-allowed;color:#ccc;color:var(--time-picker-menu-item-color-disabled,#ccc);background:#fff;background:var(--time-picker-menu-item-background-disabled,#fff)}.next-time-picker-panel,.next-time-picker-panel *,.next-time-picker-panel :after,.next-time-picker-panel :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-time-picker-panel:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-time-picker-panel-header{border-bottom:1px solid #e6e6e6;border-bottom:var(--line-1,1px) var(--line-solid,solid) var(--popup-local-border-color,#e6e6e6)}.next-time-picker-panel-input.next-input{width:100%;padding:6px;border-color:transparent;vertical-align:middle}.next-time-picker-panel-col-3 .next-time-picker-menu{width:33.33333%}.next-time-picker-panel-col-2 .next-time-picker-menu{width:50%}.next-time-picker-panel-col-1 .next-time-picker-menu{width:100%}.next-time-picker-body[dir=rtl] .next-time-picker-menu{float:right}.next-time-picker-body[dir=rtl] .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd;border-left:var(--time-picker-menu-border-width,1px) var(--line-solid,solid) var(--time-picker-menu-border-color,#ddd)}.next-time-picker{display:inline-block;width:200px}.next-time-picker,.next-time-picker *,.next-time-picker :after,.next-time-picker :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-time-picker-trigger .next-input{width:100%}.next-time-picker-body{overflow:hidden;width:200px;width:var(--time-picker-panel-width,200px);border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);background:#fff;background:var(--time-picker-panel-background,#fff);-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none)}.next-time-picker-symbol-clock-icon:before{content:"";content:var(--time-picker-clock-icon,"\e621")}.next-range-picker-panel-input-separator,.next-range-picker-trigger-separator{cursor:default;display:inline-block;text-align:center;color:#ccc;color:var(--color-text1-1,#ccc);width:16px;font-size:12px;font-size:var(--font-size-caption,12px);vertical-align:middle}.next-date-picker,.next-month-picker,.next-week-picker,.next-year-picker{display:inline-block;width:200px}.next-date-picker-input,.next-month-picker-input,.next-week-picker-input,.next-year-picker-input{width:100%}.next-date-picker-body,.next-month-picker-body,.next-week-picker-body,.next-year-picker-body{width:288px}.next-date-picker-panel-input.next-input,.next-month-picker-panel-input.next-input,.next-week-picker-panel-input.next-input,.next-year-picker-panel-input.next-input{width:100%;background:transparent}.next-date-picker-body.next-date-picker-body-show-time .next-date-picker-panel-input.next-input{width:49%}.next-date-picker-body.next-date-picker-body-show-time .next-date-picker-panel-input.next-input:first-child{margin-right:2%}.next-range-picker{display:inline-block;width:336px}.next-range-picker-input{width:100%}.next-range-picker-trigger{border:1px solid #ddd;border:var(--input-border-width,1px) solid var(--input-border-color,#ddd);background-color:#fff;background-color:var(--input-bg-color,#fff)}.next-range-picker-trigger:hover{border-color:#ccc;border-color:var(--input-hover-border-color,#ccc);background-color:#fff;background-color:var(--input-hover-bg-color,#fff)}.next-range-picker-trigger.next-error{border-color:#d23c26;border-color:var(--input-feedback-error-border-color,#d23c26)}.next-range-picker-trigger-input.next-input{height:auto;width:calc(50% - 8px)}.next-range-picker.next-disabled .next-range-picker-trigger{color:#ccc;color:var(--input-disabled-color,#ccc);cursor:not-allowed}.next-range-picker.next-disabled .next-range-picker-trigger,.next-range-picker.next-disabled .next-range-picker-trigger:hover{border-color:#eee;border-color:var(--input-disabled-border-color,#eee);background-color:#fafafa;background-color:var(--input-disabled-bg-color,#fafafa)}.next-range-picker.next-large .next-range-picker-panel-input,.next-range-picker.next-large .next-range-picker-trigger{border-radius:3px;border-radius:var(--form-element-large-corner,3px)}.next-range-picker.next-medium .next-range-picker-panel-input,.next-range-picker.next-medium .next-range-picker-trigger{border-radius:3px;border-radius:var(--form-element-medium-corner,3px)}.next-range-picker.next-small .next-range-picker-panel-input,.next-range-picker.next-small .next-range-picker-trigger{border-radius:3px;border-radius:var(--form-element-small-corner,3px)}.next-range-picker-body{width:600px}.next-range-picker-panel-input-end-date.next-input,.next-range-picker-panel-input-start-date.next-input{width:calc(50% - 8px)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-date,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-time,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-date,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-time{width:calc(25% - 8px)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-date{margin-right:8px}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-time{margin-left:8px}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-end,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-start{width:50%;float:left}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-start{border-right:1px solid #e6e6e6;border-right:var(--line-1,1px) var(--line-solid,solid) var(--date-picker-panel-time-panel-separator-color,#e6e6e6)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-end{border-left:1px solid #e6e6e6;border-left:var(--line-1,1px) var(--line-solid,solid) var(--date-picker-panel-time-panel-separator-color,#e6e6e6)}.next-date-picker-body[dir=rtl] .next-date-picker-panel-footer{text-align:left}.next-date-picker-body[dir=rtl] .next-date-picker-panel-footer>.next-btn:not(:last-child){margin-right:0;margin-left:16px}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-date-picker-panel-input.next-input:first-child{margin-left:2%;margin-right:0}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-time-picker-menu{float:right}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd;border-left:var(--time-picker-menu-border-width,1px) var(--line-solid,solid) var(--time-picker-menu-border-color,#ddd)}.next-range-picker-body[dir=rtl] .next-range-picker-panel-input{text-align:right}.next-range-picker-body[dir=rtl] .next-date-picker-panel-footer{text-align:left}.next-range-picker-body[dir=rtl] .next-date-picker-panel-footer>.next-btn:not(:last-child){margin-right:0;margin-left:16px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-input-start-date{margin-right:0;margin-left:8px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-input-end-time{margin-left:0;margin-right:8px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-end,.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-start{float:right}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-start{border-right:none;border-left:1px solid #e6e6e6;border-left:var(--line-1,1px) var(--line-solid,solid) var(--date-picker-panel-time-panel-separator-color,#e6e6e6)}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-end{border-left:none;border-right:1px solid #e6e6e6;border-right:var(--line-1,1px) var(--line-solid,solid) var(--date-picker-panel-time-panel-separator-color,#e6e6e6)}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-time-picker-menu{float:right}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd;border-left:var(--time-picker-menu-border-width,1px) var(--line-solid,solid) var(--time-picker-menu-border-color,#ddd)}.next-date-picker,.next-date-picker *,.next-date-picker :after,.next-date-picker :before,.next-month-picker,.next-month-picker *,.next-month-picker :after,.next-month-picker :before,.next-range-picker,.next-range-picker *,.next-range-picker :after,.next-range-picker :before,.next-week-picker,.next-week-picker *,.next-week-picker :after,.next-week-picker :before,.next-year-picker,.next-year-picker *,.next-year-picker :after,.next-year-picker :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-date-picker-body,.next-month-picker-body,.next-range-picker-body,.next-week-picker-body,.next-year-picker-body{border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none);background:#fff;background:var(--date-picker-panel-background,#fff)}.next-date-picker-panel-header,.next-month-picker-panel-header,.next-range-picker-panel-header,.next-week-picker-panel-header,.next-year-picker-panel-header{padding:6px;text-align:center}.next-date-picker-panel-time,.next-month-picker-panel-time,.next-range-picker-panel-time,.next-week-picker-panel-time,.next-year-picker-panel-time{border-top:1px solid #e6e6e6;border-top:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6)}.next-date-picker-panel-footer,.next-month-picker-panel-footer,.next-range-picker-panel-footer,.next-week-picker-panel-footer,.next-year-picker-panel-footer{text-align:right;padding:8px 20px;padding:var(--date-picker-panel-footer-padding-tb,8px) var(--date-picker-panel-footer-padding-lr,20px);border-top:1px solid #e6e6e6;border-top:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6)}.next-date-picker-panel-footer>.next-btn:not(:last-child),.next-date-picker-panel-tools>.next-btn:not(:last-child),.next-month-picker-panel-footer>.next-btn:not(:last-child),.next-month-picker-panel-tools>.next-btn:not(:last-child),.next-range-picker-panel-footer>.next-btn:not(:last-child),.next-range-picker-panel-tools>.next-btn:not(:last-child),.next-week-picker-panel-footer>.next-btn:not(:last-child),.next-week-picker-panel-tools>.next-btn:not(:last-child),.next-year-picker-panel-footer>.next-btn:not(:last-child),.next-year-picker-panel-tools>.next-btn:not(:last-child){margin-right:16px}.next-date-picker-panel-tools,.next-month-picker-panel-tools,.next-range-picker-panel-tools,.next-week-picker-panel-tools,.next-year-picker-panel-tools{float:left}.next-date-picker .next-calendar-panel-header,.next-month-picker .next-calendar-panel-header,.next-range-picker .next-calendar-panel-header,.next-week-picker .next-calendar-panel-header,.next-year-picker .next-calendar-panel-header{margin-left:-1px;margin-left:calc(0px - var(--popup-local-border-width, 1px));margin-right:-1px;margin-right:calc(0px - var(--popup-local-border-width, 1px))}.next-date-picker .next-input input,.next-month-picker .next-input input,.next-range-picker .next-input input,.next-week-picker .next-input input,.next-year-picker .next-input input{vertical-align:baseline}.next-date-picker-symbol-calendar-icon:before,.next-month-picker-symbol-calendar-icon:before,.next-range-picker-symbol-calendar-icon:before,.next-week-picker-symbol-calendar-icon:before,.next-year-picker-symbol-calendar-icon:before{content:"";content:var(--date-picker-calendar-icon,"\e607")}.next-range-picker-panel-body .next-calendar{display:inline-block;width:50%}.next-message{position:relative;display:block;vertical-align:baseline;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.next-message,.next-message *,.next-message :after,.next-message :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-message:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-message .next-message-close{color:#999;color:var(--message-close-icon-color,#999);font-size:0;position:absolute;cursor:pointer}.next-message .next-message-close .next-icon-close{width:12px;height:12px;line-height:1em}.next-message .next-message-close .next-icon-close:before{width:12px;height:12px;font-size:12px;line-height:1em}.next-message .next-message-close:hover{color:#666;color:var(--message-hover-close-icon-color,#666)}.next-message.next-message-success.next-inline{background-color:#e5fff5;background-color:var(--message-success-color-bg-inline,#e5fff5);border-color:#e5fff5;border-color:var(--message-success-color-border-inline,#e5fff5);-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style,solid)}.next-message.next-message-success.next-inline .next-message-title{color:#333;color:var(--message-success-color-title-inline,#333)}.next-message.next-message-success.next-inline .next-message-content{color:#666;color:var(--message-success-color-content-inline,#666)}.next-message.next-message-success.next-inline .next-message-symbol{color:#1ad78c;color:var(--message-success-color-icon-inline,#1ad78c)}.next-message.next-message-success.next-inline .next-message-symbol-icon:before{content:"";content:var(--message-success-icon-content,"\e60a")}.next-message.next-message-success.next-addon{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-success.next-addon .next-message-title{color:#333;color:var(--message-success-color-title-addon,#333)}.next-message.next-message-success.next-addon .next-message-content{color:#666;color:var(--message-success-color-content-addon,#666)}.next-message.next-message-success.next-addon .next-message-symbol{color:#1ad78c;color:var(--message-success-color-icon-addon,#1ad78c)}.next-message.next-message-success.next-addon .next-message-symbol-icon:before{content:"";content:var(--message-success-icon-content,"\e60a")}.next-message.next-message-success.next-toast{background-color:#fff;background-color:var(--message-success-color-bg-toast,#fff);border-color:#fff;border-color:var(--message-success-color-border-toast,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-success.next-toast .next-message-title{color:#333;color:var(--message-success-color-title-toast,#333)}.next-message.next-message-success.next-toast .next-message-content{color:#666;color:var(--message-success-color-content-toast,#666)}.next-message.next-message-success.next-toast .next-message-symbol{color:#1ad78c;color:var(--message-success-color-icon-toast,#1ad78c)}.next-message.next-message-success.next-toast .next-message-symbol-icon:before{content:"";content:var(--message-success-icon-content,"\e60a")}.next-message.next-message-warning.next-inline{background-color:#fff9e0;background-color:var(--message-warning-color-bg-inline,#fff9e0);border-color:#fff9e0;border-color:var(--message-warning-color-border-inline,#fff9e0);-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style,solid)}.next-message.next-message-warning.next-inline .next-message-title{color:#333;color:var(--message-warning-color-title-inline,#333)}.next-message.next-message-warning.next-inline .next-message-content{color:#666;color:var(--message-warning-color-content-inline,#666)}.next-message.next-message-warning.next-inline .next-message-symbol{color:#f1c826;color:var(--message-warning-color-icon-inline,#f1c826)}.next-message.next-message-warning.next-inline .next-message-symbol-icon:before{content:"";content:var(--message-warning-icon-content,"\e60b")}.next-message.next-message-warning.next-addon{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-warning.next-addon .next-message-title{color:#333;color:var(--message-warning-color-title-addon,#333)}.next-message.next-message-warning.next-addon .next-message-content{color:#666;color:var(--message-warning-color-content-addon,#666)}.next-message.next-message-warning.next-addon .next-message-symbol{color:#f1c826;color:var(--message-warning-color-icon-addon,#f1c826)}.next-message.next-message-warning.next-addon .next-message-symbol-icon:before{content:"";content:var(--message-warning-icon-content,"\e60b")}.next-message.next-message-warning.next-toast{background-color:#fff;background-color:var(--message-warning-color-bg-toast,#fff);border-color:#fff;border-color:var(--message-warning-color-border-toast,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-warning.next-toast .next-message-title{color:#333;color:var(--message-warning-color-title-toast,#333)}.next-message.next-message-warning.next-toast .next-message-content{color:#666;color:var(--message-warning-color-content-toast,#666)}.next-message.next-message-warning.next-toast .next-message-symbol{color:#f1c826;color:var(--message-warning-color-icon-toast,#f1c826)}.next-message.next-message-warning.next-toast .next-message-symbol-icon:before{content:"";content:var(--message-warning-icon-content,"\e60b")}.next-message.next-message-error.next-inline{background-color:#ffece4;background-color:var(--message-error-color-bg-inline,#ffece4);border-color:#ffece4;border-color:var(--message-error-color-border-inline,#ffece4);-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style,solid)}.next-message.next-message-error.next-inline .next-message-title{color:#333;color:var(--message-error-color-title-inline,#333)}.next-message.next-message-error.next-inline .next-message-content{color:#666;color:var(--message-error-color-content-inline,#666)}.next-message.next-message-error.next-inline .next-message-symbol{color:#d23c26;color:var(--message-error-color-icon-inline,#d23c26)}.next-message.next-message-error.next-inline .next-message-symbol-icon:before{content:"";content:var(--message-error-icon-content,"\e60d")}.next-message.next-message-error.next-addon{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-error.next-addon .next-message-title{color:#333;color:var(--message-error-color-title-addon,#333)}.next-message.next-message-error.next-addon .next-message-content{color:#666;color:var(--message-error-color-content-addon,#666)}.next-message.next-message-error.next-addon .next-message-symbol{color:#d23c26;color:var(--message-error-color-icon-addon,#d23c26)}.next-message.next-message-error.next-addon .next-message-symbol-icon:before{content:"";content:var(--message-error-icon-content,"\e60d")}.next-message.next-message-error.next-toast{background-color:#fff;background-color:var(--message-error-color-bg-toast,#fff);border-color:#fff;border-color:var(--message-error-color-border-toast,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-error.next-toast .next-message-title{color:#333;color:var(--message-error-color-title-toast,#333)}.next-message.next-message-error.next-toast .next-message-content{color:#666;color:var(--message-error-color-content-toast,#666)}.next-message.next-message-error.next-toast .next-message-symbol{color:#d23c26;color:var(--message-error-color-icon-toast,#d23c26)}.next-message.next-message-error.next-toast .next-message-symbol-icon:before{content:"";content:var(--message-error-icon-content,"\e60d")}.next-message.next-message-notice.next-inline{background-color:#e4f3fe;background-color:var(--message-notice-color-bg-inline,#e4f3fe);border-color:#e4f3fe;border-color:var(--message-notice-color-border-inline,#e4f3fe);-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style,solid)}.next-message.next-message-notice.next-inline .next-message-title{color:#333;color:var(--message-notice-color-title-inline,#333)}.next-message.next-message-notice.next-inline .next-message-content{color:#666;color:var(--message-notice-color-content-inline,#666)}.next-message.next-message-notice.next-inline .next-message-symbol{color:#298dff;color:var(--message-notice-color-icon-inline,#298dff)}.next-message.next-message-notice.next-inline .next-message-symbol-icon:before{content:"";content:var(--message-notice-icon-content,"\e60c")}.next-message.next-message-notice.next-addon{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-notice.next-addon .next-message-title{color:#333;color:var(--message-notice-color-title-addon,#333)}.next-message.next-message-notice.next-addon .next-message-content{color:#666;color:var(--message-notice-color-content-addon,#666)}.next-message.next-message-notice.next-addon .next-message-symbol{color:#298dff;color:var(--message-notice-color-icon-addon,#298dff)}.next-message.next-message-notice.next-addon .next-message-symbol-icon:before{content:"";content:var(--message-notice-icon-content,"\e60c")}.next-message.next-message-notice.next-toast{background-color:#fff;background-color:var(--message-notice-color-bg-toast,#fff);border-color:#fff;border-color:var(--message-notice-color-border-toast,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-notice.next-toast .next-message-title{color:#333;color:var(--message-notice-color-title-toast,#333)}.next-message.next-message-notice.next-toast .next-message-content{color:#666;color:var(--message-notice-color-content-toast,#666)}.next-message.next-message-notice.next-toast .next-message-symbol{color:#298dff;color:var(--message-notice-color-icon-toast,#298dff)}.next-message.next-message-notice.next-toast .next-message-symbol-icon:before{content:"";content:var(--message-notice-icon-content,"\e60c")}.next-message.next-message-help.next-inline{background-color:#fff9e0;background-color:var(--message-help-color-bg-inline,#fff9e0);border-color:#fff9e0;border-color:var(--message-help-color-border-inline,#fff9e0);-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style,solid)}.next-message.next-message-help.next-inline .next-message-title{color:#333;color:var(--message-help-color-title-inline,#333)}.next-message.next-message-help.next-inline .next-message-content{color:#666;color:var(--message-help-color-content-inline,#666)}.next-message.next-message-help.next-inline .next-message-symbol{color:#f1c826;color:var(--message-help-color-icon-inline,#f1c826)}.next-message.next-message-help.next-inline .next-message-symbol-icon:before{content:"";content:var(--message-help-icon-content,"\e673")}.next-message.next-message-help.next-addon{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-help.next-addon .next-message-title{color:#333;color:var(--message-help-color-title-addon,#333)}.next-message.next-message-help.next-addon .next-message-content{color:#666;color:var(--message-help-color-content-addon,#666)}.next-message.next-message-help.next-addon .next-message-symbol{color:#f1c826;color:var(--message-help-color-icon-addon,#f1c826)}.next-message.next-message-help.next-addon .next-message-symbol-icon:before{content:"";content:var(--message-help-icon-content,"\e673")}.next-message.next-message-help.next-toast{background-color:#fff;background-color:var(--message-help-color-bg-toast,#fff);border-color:#fff;border-color:var(--message-help-color-border-toast,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-help.next-toast .next-message-title{color:#333;color:var(--message-help-color-title-toast,#333)}.next-message.next-message-help.next-toast .next-message-content{color:#666;color:var(--message-help-color-content-toast,#666)}.next-message.next-message-help.next-toast .next-message-symbol{color:#f1c826;color:var(--message-help-color-icon-toast,#f1c826)}.next-message.next-message-help.next-toast .next-message-symbol-icon:before{content:"";content:var(--message-help-icon-content,"\e673")}.next-message.next-message-loading.next-inline{background-color:#fff;background-color:var(--message-loading-color-bg-inline,#fff);border-color:#fff;border-color:var(--message-loading-color-border-inline,#fff);-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style,solid)}.next-message.next-message-loading.next-inline .next-message-title{color:#333;color:var(--message-loading-color-title-inline,#333)}.next-message.next-message-loading.next-inline .next-message-content{color:#666;color:var(--message-loading-color-content-inline,#666)}.next-message.next-message-loading.next-inline .next-message-symbol{color:#209bfa;color:var(--message-loading-color-icon-inline,#209bfa)}.next-message.next-message-loading.next-inline .next-message-symbol-icon:before{content:"";content:var(--message-loading-icon-content,"\e646");-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}.next-message.next-message-loading.next-addon{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-loading.next-addon .next-message-title{color:#333;color:var(--message-loading-color-title-addon,#333)}.next-message.next-message-loading.next-addon .next-message-content{color:#666;color:var(--message-loading-color-content-addon,#666)}.next-message.next-message-loading.next-addon .next-message-symbol{color:#209bfa;color:var(--message-loading-color-icon-addon,#209bfa)}.next-message.next-message-loading.next-addon .next-message-symbol-icon:before{content:"";content:var(--message-loading-icon-content,"\e646");-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}.next-message.next-message-loading.next-toast{background-color:#fff;background-color:var(--message-loading-color-bg-toast,#fff);border-color:#fff;border-color:var(--message-loading-color-border-toast,#fff);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid;border-style:var(--message-border-style-toast,solid)}.next-message.next-message-loading.next-toast .next-message-title{color:#333;color:var(--message-loading-color-title-toast,#333)}.next-message.next-message-loading.next-toast .next-message-content{color:#666;color:var(--message-loading-color-content-toast,#666)}.next-message.next-message-loading.next-toast .next-message-symbol{color:#209bfa;color:var(--message-loading-color-icon-toast,#209bfa)}.next-message.next-message-loading.next-toast .next-message-symbol-icon:before{content:"";content:var(--message-loading-icon-content,"\e646");-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}.next-message.next-medium{border-width:1px;border-width:var(--message-size-m-border-width,1px);padding:12px;padding:var(--message-size-m-padding,12px)}.next-message.next-medium .next-message-symbol{float:left;line-height:16px;line-height:var(--message-size-m-icon,16px)}.next-message.next-medium .next-message-symbol .next-icon-remote,.next-message.next-medium .next-message-symbol:before{width:16px;width:var(--message-size-m-icon,16px);font-size:16px;font-size:var(--message-size-m-icon,16px);line-height:inherit}.next-message.next-medium .next-message-title{font-size:16px;font-size:var(--message-size-m-title-font,16px);line-height:16px;line-height:var(--message-size-m-title-font,16px)}.next-message.next-medium .next-message-content,.next-message.next-medium .next-message-title{padding:0 20px 0 24px;padding:0 var(--message-size-m-title-content-padding-right,20px) 0 calc(var(--message-size-m-title-content-padding-left, 8px) + var(--message-size-m-icon, 16px))}.next-message.next-medium .next-message-content{margin-top:8px;margin-top:var(--message-size-m-content-margin-top,8px);font-size:14px;font-size:var(--message-size-m-content-font,14px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-message.next-medium .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-medium.next-only-content .next-message-content,.next-message.next-medium.next-title-content .next-message-title{line-height:16px;line-height:var(--message-size-m-icon,16px)}.next-message.next-medium .next-message-close{top:12px;top:var(--message-size-m-close-top,12px);right:12px;right:var(--message-size-m-close-right,12px)}.next-message.next-medium.next-inline{border-radius:3px;border-radius:var(--message-size-m-border-radius,3px)}.next-message.next-medium.next-toast{border-radius:3px;border-radius:var(--message-size-m-border-radius-toast,3px)}.next-message.next-large{border-width:2px;border-width:var(--message-size-l-border-width,2px);padding:16px;padding:var(--message-size-l-padding,16px)}.next-message.next-large .next-message-symbol{float:left;line-height:24px;line-height:var(--message-size-l-icon,24px)}.next-message.next-large .next-message-symbol .next-icon-remote,.next-message.next-large .next-message-symbol:before{width:24px;width:var(--message-size-l-icon,24px);font-size:24px;font-size:var(--message-size-l-icon,24px);line-height:inherit}.next-message.next-large .next-message-title{font-size:20px;font-size:var(--message-size-l-title-font,20px);line-height:20px;line-height:var(--message-size-l-title-font,20px)}.next-message.next-large .next-message-content,.next-message.next-large .next-message-title{padding:0 20px 0 36px;padding:0 var(--message-size-l-title-content-padding-right,20px) 0 calc(var(--message-size-l-title-content-padding-left, 12px) + var(--message-size-l-icon, 24px))}.next-message.next-large .next-message-content{margin-top:8px;margin-top:var(--message-size-l-content-margin-top,8px);font-size:14px;font-size:var(--message-size-l-content-font,14px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-message.next-large .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-large.next-only-content .next-message-content,.next-message.next-large.next-title-content .next-message-title{line-height:24px;line-height:var(--message-size-l-icon,24px)}.next-message.next-large .next-message-close{top:16px;top:var(--message-size-l-close-top,16px);right:16px;right:var(--message-size-l-close-right,16px)}.next-message.next-large.next-inline{border-radius:3px;border-radius:var(--message-size-l-border-radius,3px)}.next-message.next-large.next-toast{border-radius:3px;border-radius:var(--message-size-l-border-radius-toast,3px)}.next-message[dir=rtl] .next-message-symbol{float:right}.next-message[dir=rtl].next-medium .next-message-title{padding:0 24px 0 20px;padding:0 calc(var(--message-size-m-title-content-padding-left, 8px) + var(--message-size-m-icon, 16px)) 0 var(--message-size-m-title-content-padding-right,20px)}.next-message[dir=rtl].next-medium .next-message-close{left:12px;left:var(--message-size-m-close-right,12px);right:auto}.next-message[dir=rtl].next-large .next-message-title{padding:0 36px 0 20px;padding:0 calc(var(--message-size-l-title-content-padding-left, 12px) + var(--message-size-l-icon, 24px)) 0 var(--message-size-l-title-content-padding-right,20px)}.next-message[dir=rtl].next-large .next-message-close{left:16px;left:var(--message-size-l-close-right,16px);right:auto}.next-message-wrapper-v2{margin:0;padding:0;position:fixed;left:0;z-index:1001;width:100%;pointer-events:none}.next-message-list{padding:8px;text-align:center}.next-message-list .next-message{display:inline-block;pointer-events:all}.next-message-fade-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-play-state:paused;animation-play-state:paused;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease;animation-timing-function:ease}.next-message-fade-leave.next-message-fade-leave-active{-webkit-animation-name:MessageFadeOut;animation-name:MessageFadeOut;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes MessageFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}@keyframes MessageFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.next-dialog[dir=rtl],.next-dialog[dir=rtl] .next-dialog-footer.next-align-left{text-align:right}.next-dialog[dir=rtl] .next-dialog-footer.next-align-center{text-align:center}.next-dialog[dir=rtl] .next-dialog-footer.next-align-right{text-align:left}.next-dialog[dir=rtl] .next-dialog-btn+.next-dialog-btn{margin-right:4px;margin-left:0}.next-dialog[dir=rtl] .next-dialog-close{left:12px;left:var(--dialog-close-right,12px);right:auto}.next-dialog{position:fixed;z-index:1001;background:#fff;background:var(--dialog-bg,#fff);border:1px solid #e6e6e6;border:var(--dialog-border-width,1px) var(--dialog-border-style,solid) var(--dialog-border-color,#e6e6e6);border-radius:6px;border-radius:var(--dialog-corner,6px);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--dialog-shadow,0 4px 8px 0 rgba(0,0,0,.12));box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:var(--dialog-shadow,0 4px 8px 0 rgba(0,0,0,.12));text-align:left;overflow:hidden;max-width:90%}.next-dialog,.next-dialog *,.next-dialog :after,.next-dialog :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-dialog-header{padding:12px 20px;padding:var(--dialog-title-padding-top,12px) var(--dialog-title-padding-left-right,20px) var(--dialog-title-padding-bottom,12px) var(--dialog-title-padding-left-right,20px);border-bottom:0 solid transparent;border-bottom:var(--dialog-title-border-width,0) var(--line-solid,solid) var(--dialog-title-border-color,transparent);font-size:16px;font-size:var(--dialog-title-font-size,16px);font-weight:400;font-weight:var(--dialog-title-font-weight,normal);background:transparent;background:var(--dialog-title-bg-color,transparent);color:#333;color:var(--dialog-title-color,#333)}.next-dialog-body{padding:20px;padding:var(--dialog-content-padding-top,20px) var(--dialog-content-padding-left-right,20px) var(--dialog-content-padding-bottom,20px) var(--dialog-content-padding-left-right,20px);font-size:14px;font-size:var(--dialog-content-font-size,14px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--dialog-content-color,#666)}.next-dialog-footer{padding:12px 20px;padding:var(--dialog-footer-padding-top,12px) var(--dialog-footer-padding-left-right,20px) var(--dialog-footer-padding-bottom,12px) var(--dialog-footer-padding-left-right,20px);border-top:0 solid transparent;border-top:var(--dialog-footer-border-width,0) var(--line-solid,solid) var(--dialog-footer-border-color,transparent);background:transparent;background:var(--dialog-footer-bg-color,transparent)}.next-dialog-footer.next-align-left{text-align:left}.next-dialog-footer.next-align-center{text-align:center}.next-dialog-footer.next-align-right{text-align:right}.next-dialog-footer-fixed-height{position:absolute;width:100%;bottom:0}.next-dialog-btn+.next-dialog-btn{margin-left:4px;margin-left:var(--dialog-footer-button-spacing,4px)}.next-dialog-close{position:absolute;top:12px;top:var(--dialog-close-top,12px);right:12px;right:var(--dialog-close-right,12px);width:16px;width:var(--dialog-close-width,16px);cursor:pointer}.next-dialog-close,.next-dialog-close:link,.next-dialog-close:visited{height:16px;height:var(--dialog-close-width,16px);color:#999;color:var(--dialog-close-color,#999)}.next-dialog-close:hover{background:transparent;background:var(--dialog-close-bg-hovered,transparent);color:#333;color:var(--dialog-close-color-hovered,#333)}.next-dialog-close .next-dialog-close-icon.next-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-top:calc(0px - var(--dialog-close-size, 16px)/2);margin-left:-8px;margin-left:calc(0px - var(--dialog-close-size, 16px)/2);width:16px;width:var(--dialog-close-size,16px);height:16px;height:var(--dialog-close-size,16px);line-height:1em}.next-dialog-close .next-dialog-close-icon.next-icon:before{width:16px;width:var(--dialog-close-size,16px);height:16px;height:var(--dialog-close-size,16px);font-size:16px;font-size:var(--dialog-close-size,16px);line-height:1em}.next-dialog-container{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1001;padding:40px;overflow:auto;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box}.next-dialog-container:before{display:inline-block;vertical-align:middle;width:0;height:100%;content:""}.next-dialog-container .next-dialog{display:inline-block;position:relative;vertical-align:middle}.next-dialog-quick .next-dialog-body{padding:20px;padding:var(--dialog-message-content-padding-top,20px) var(--dialog-message-content-padding-left-right,20px) var(--dialog-message-content-padding-bottom,20px) var(--dialog-message-content-padding-left-right,20px)}.next-dialog .next-dialog-message.next-message{min-width:300px;padding:0}.next-dialog-wrapper{position:fixed;top:0;left:0;bottom:0;right:0;overflow:auto}.next-dialog-inner-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;top:100px;pointer-events:none;padding-bottom:24px}.next-dialog-v2{pointer-events:auto;margin:0 auto}.next-dialog-v2 .next-dialog-header{word-break:break-word}.next-dialog-v2 .next-dialog-body,.next-dialog-v2 .next-dialog-header{padding-right:40px;padding-right:calc(var(--dialog-close-right, 12px)*2 + var(--dialog-close-width, 16px))}.next-dialog-v2 .next-dialog-header+.next-dialog-body{padding:20px;padding:var(--dialog-content-padding-top,20px) var(--dialog-content-padding-left-right,20px) var(--dialog-content-padding-bottom,20px) var(--dialog-content-padding-left-right,20px)}.next-dialog.next-dialog-v2{position:relative}.next-dialog-centered{text-align:center}.next-dialog-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.next-dialog-centered .next-dialog-v2{margin:40px 0;display:inline-block;text-align:left;vertical-align:middle}.next-drawer{position:fixed;z-index:1001;background:#fff;background:var(--drawer-bg,#fff);border:1px solid #e6e6e6;border:var(--drawer-border-width,1px) var(--drawer-border-style,solid) var(--drawer-border-color,#e6e6e6);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--drawer-shadow,0 4px 8px 0 rgba(0,0,0,.12));box-shadow:0 4px 8px 0 rgba(0,0,0,.12);box-shadow:var(--drawer-shadow,0 4px 8px 0 rgba(0,0,0,.12));overflow:auto;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.next-drawer,.next-drawer *,.next-drawer :after,.next-drawer :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-drawer-left,.next-drawer-right{height:100%;max-width:80%;width:240px}.next-drawer-bottom,.next-drawer-top{width:100%}.next-drawer-header{padding:12px 20px;padding:var(--drawer-title-padding-top,12px) var(--drawer-title-padding-left-right,20px) var(--drawer-title-padding-bottom,12px) var(--drawer-title-padding-left-right,20px);border-bottom:1px solid #e6e6e6;border-bottom:var(--drawer-title-border-width,1px) var(--line-solid,solid) var(--drawer-title-border-color,#e6e6e6);font-size:16px;font-size:var(--drawer-title-font-size,16px);background:#fff;background:var(--drawer-title-bg-color,#fff);color:#333;color:var(--drawer-title-color,#333)}.next-drawer-no-title{padding:0;border-bottom:0}.next-drawer-body{padding:20px;padding:var(--drawer-content-padding-top,20px) var(--drawer-content-padding-left-right,20px) var(--drawer-content-padding-bottom,20px) var(--drawer-content-padding-left-right,20px);font-size:14px;font-size:var(--drawer-content-font-size,14px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--drawer-content-color,#666)}.next-drawer-close{position:absolute;top:12px;top:var(--drawer-close-top,12px);right:12px;right:var(--drawer-close-right,12px);width:16px;cursor:pointer}.next-drawer-close,.next-drawer-close:link,.next-drawer-close:visited{height:16px;color:#999;color:var(--drawer-close-color,#999)}.next-drawer-close:hover{background:transparent;background:var(--drawer-close-bg-hovered,transparent);color:#333;color:var(--drawer-close-color-hovered,#333)}.next-drawer-close .next-drawer-close-icon.next-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-top:calc(0px - var(--drawer-close-size, 16px)/2);margin-left:-8px;margin-left:calc(0px - var(--drawer-close-size, 16px)/2);width:16px;width:var(--drawer-close-size,16px);height:16px;height:var(--drawer-close-size,16px);line-height:1em}.next-drawer-close .next-drawer-close-icon.next-icon:before{width:16px;width:var(--drawer-close-size,16px);height:16px;height:var(--drawer-close-size,16px);font-size:16px;font-size:var(--drawer-close-size,16px);line-height:1em}.next-row{display:-webkit-box;display:-ms-flexbox;display:flex}.next-row,.next-row *,.next-row :after,.next-row :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-row.next-row-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}@media(min-width:320px){.next-row.next-row-fixed{width:320px}}@media(min-width:480px){.next-row.next-row-fixed{width:480px}}@media(min-width:720px){.next-row.next-row-fixed{width:720px}}@media(min-width:990px){.next-row.next-row-fixed{width:990px}}@media(min-width:1200px){.next-row.next-row-fixed{width:1200px}}@media(min-width:1500px){.next-row.next-row-fixed{width:1500px}}.next-row.next-row-fixed-xxs{width:320px}.next-row.next-row-fixed-xs{width:480px}.next-row.next-row-fixed-s{width:720px}.next-row.next-row-fixed-m{width:990px}.next-row.next-row-fixed-l{width:1200px}.next-row.next-row-fixed-xl{width:1500px}.next-row.next-row-justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.next-row.next-row-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.next-row.next-row-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.next-row.next-row-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.next-row.next-row-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.next-row.next-row-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.next-row.next-row-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.next-row.next-row-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.next-row.next-row-align-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.next-row.next-row-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.next-col{-webkit-box-flex:1;-ms-flex:1;flex:1}.next-col.next-col-top{-ms-flex-item-align:start;align-self:flex-start}.next-col.next-col-bottom{-ms-flex-item-align:end;align-self:flex-end}.next-col.next-col-center{-ms-flex-item-align:center;align-self:center}@media (min-width:0\0)and (min-resolution:0.001dpcm){.next-row{display:table;width:100%}.next-col{display:table-cell;vertical-align:top}}.next-col-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}@media(min-width:320px){.next-col-xxs-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-xxs-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-xxs-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xxs-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-xxs-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-xxs-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-xxs-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-xxs-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-xxs-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xxs-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-xxs-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-xxs-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-xxs-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-xxs-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-xxs-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xxs-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-xxs-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-xxs-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-xxs-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-xxs-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-xxs-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xxs-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-xxs-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-xxs-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-xs-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-xs-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xs-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-xs-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-xs-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-xs-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-xs-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-xs-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xs-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-xs-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-xs-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-xs-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-xs-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-xs-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xs-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-xs-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-xs-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-xs-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-xs-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-xs-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xs-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-xs-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-xs-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-s-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-s-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-s-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-s-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-s-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-s-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-s-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-s-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-s-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-s-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-s-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-s-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-s-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-s-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-s-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-s-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-s-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-s-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-s-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-s-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-s-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-s-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-s-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-m-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-m-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-m-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-m-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-m-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-m-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-m-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-m-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-m-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-m-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-m-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-m-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-m-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-m-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-m-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-m-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-m-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-m-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-m-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-m-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-m-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-m-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-m-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-l-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-l-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-l-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-l-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-l-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-l-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-l-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-l-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-l-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-l-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-l-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-l-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-l-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-l-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-l-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-l-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-l-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-l-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-l-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-l-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-l-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-l-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-l-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 4.16667%;flex:0 0 4.16667%;width:4.16667%;max-width:4.16667%}.next-col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;width:8.33333%;max-width:8.33333%}.next-col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;width:16.66667%;max-width:16.66667%}.next-col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 20.83333%;flex:0 0 20.83333%;width:20.83333%;max-width:20.83333%}.next-col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;width:25%;max-width:25%}.next-col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 29.16667%;flex:0 0 29.16667%;width:29.16667%;max-width:29.16667%}.next-col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;width:33.33333%;max-width:33.33333%}.next-col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;width:41.66667%;max-width:41.66667%}.next-col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 45.83333%;flex:0 0 45.83333%;width:45.83333%;max-width:45.83333%}.next-col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;width:50%;max-width:50%}.next-col-xl-13{-webkit-box-flex:0;-ms-flex:0 0 54.16667%;flex:0 0 54.16667%;width:54.16667%;max-width:54.16667%}.next-col-xl-14{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;width:58.33333%;max-width:58.33333%}.next-col-xl-15{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xl-16{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;width:66.66667%;max-width:66.66667%}.next-col-xl-17{-webkit-box-flex:0;-ms-flex:0 0 70.83333%;flex:0 0 70.83333%;width:70.83333%;max-width:70.83333%}.next-col-xl-18{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;width:75%;max-width:75%}.next-col-xl-19{-webkit-box-flex:0;-ms-flex:0 0 79.16667%;flex:0 0 79.16667%;width:79.16667%;max-width:79.16667%}.next-col-xl-20{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;width:83.33333%;max-width:83.33333%}.next-col-xl-21{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xl-22{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;width:91.66667%;max-width:91.66667%}.next-col-xl-23{-webkit-box-flex:0;-ms-flex:0 0 95.83333%;flex:0 0 95.83333%;width:95.83333%;max-width:95.83333%}.next-col-xl-24{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}.next-col-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}@media(min-width:320px){.next-col-xxs-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-xxs-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-xxs-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-xxs-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-xxs-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-xs-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-xs-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-xs-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-xs-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-s-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-s-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-s-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-s-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-m-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-m-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-m-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-m-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-l-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-l-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-l-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-l-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1p5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;max-width:20%}.next-col-xl-2p5{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;width:40%;max-width:40%}.next-col-xl-3p5{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;width:60%;max-width:60%}.next-col-xl-4p5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;width:80%;max-width:80%}.next-col-xl-5p5{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;width:100%;max-width:100%}}.next-col-fixed-1{-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;width:20px;max-width:20px}.next-col-fixed-2{-webkit-box-flex:0;-ms-flex:0 0 40px;flex:0 0 40px;width:40px;max-width:40px}.next-col-fixed-3{-webkit-box-flex:0;-ms-flex:0 0 60px;flex:0 0 60px;width:60px;max-width:60px}.next-col-fixed-4{-webkit-box-flex:0;-ms-flex:0 0 80px;flex:0 0 80px;width:80px;max-width:80px}.next-col-fixed-5{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;width:100px;max-width:100px}.next-col-fixed-6{-webkit-box-flex:0;-ms-flex:0 0 120px;flex:0 0 120px;width:120px;max-width:120px}.next-col-fixed-7{-webkit-box-flex:0;-ms-flex:0 0 140px;flex:0 0 140px;width:140px;max-width:140px}.next-col-fixed-8{-webkit-box-flex:0;-ms-flex:0 0 160px;flex:0 0 160px;width:160px;max-width:160px}.next-col-fixed-9{-webkit-box-flex:0;-ms-flex:0 0 180px;flex:0 0 180px;width:180px;max-width:180px}.next-col-fixed-10{-webkit-box-flex:0;-ms-flex:0 0 200px;flex:0 0 200px;width:200px;max-width:200px}.next-col-fixed-11{-webkit-box-flex:0;-ms-flex:0 0 220px;flex:0 0 220px;width:220px;max-width:220px}.next-col-fixed-12{-webkit-box-flex:0;-ms-flex:0 0 240px;flex:0 0 240px;width:240px;max-width:240px}.next-col-fixed-13{-webkit-box-flex:0;-ms-flex:0 0 260px;flex:0 0 260px;width:260px;max-width:260px}.next-col-fixed-14{-webkit-box-flex:0;-ms-flex:0 0 280px;flex:0 0 280px;width:280px;max-width:280px}.next-col-fixed-15{-webkit-box-flex:0;-ms-flex:0 0 300px;flex:0 0 300px;width:300px;max-width:300px}.next-col-fixed-16{-webkit-box-flex:0;-ms-flex:0 0 320px;flex:0 0 320px;width:320px;max-width:320px}.next-col-fixed-17{-webkit-box-flex:0;-ms-flex:0 0 340px;flex:0 0 340px;width:340px;max-width:340px}.next-col-fixed-18{-webkit-box-flex:0;-ms-flex:0 0 360px;flex:0 0 360px;width:360px;max-width:360px}.next-col-fixed-19{-webkit-box-flex:0;-ms-flex:0 0 380px;flex:0 0 380px;width:380px;max-width:380px}.next-col-fixed-20{-webkit-box-flex:0;-ms-flex:0 0 400px;flex:0 0 400px;width:400px;max-width:400px}.next-col-fixed-21{-webkit-box-flex:0;-ms-flex:0 0 420px;flex:0 0 420px;width:420px;max-width:420px}.next-col-fixed-22{-webkit-box-flex:0;-ms-flex:0 0 440px;flex:0 0 440px;width:440px;max-width:440px}.next-col-fixed-23{-webkit-box-flex:0;-ms-flex:0 0 460px;flex:0 0 460px;width:460px;max-width:460px}.next-col-fixed-24{-webkit-box-flex:0;-ms-flex:0 0 480px;flex:0 0 480px;width:480px;max-width:480px}.next-col-fixed-25{-webkit-box-flex:0;-ms-flex:0 0 500px;flex:0 0 500px;width:500px;max-width:500px}.next-col-fixed-26{-webkit-box-flex:0;-ms-flex:0 0 520px;flex:0 0 520px;width:520px;max-width:520px}.next-col-fixed-27{-webkit-box-flex:0;-ms-flex:0 0 540px;flex:0 0 540px;width:540px;max-width:540px}.next-col-fixed-28{-webkit-box-flex:0;-ms-flex:0 0 560px;flex:0 0 560px;width:560px;max-width:560px}.next-col-fixed-29{-webkit-box-flex:0;-ms-flex:0 0 580px;flex:0 0 580px;width:580px;max-width:580px}.next-col-fixed-30{-webkit-box-flex:0;-ms-flex:0 0 600px;flex:0 0 600px;width:600px;max-width:600px}.next-col-offset-1{margin-left:4.16667%}.next-col-offset-2{margin-left:8.33333%}.next-col-offset-3{margin-left:12.5%}.next-col-offset-4{margin-left:16.66667%}.next-col-offset-5{margin-left:20.83333%}.next-col-offset-6{margin-left:25%}.next-col-offset-7{margin-left:29.16667%}.next-col-offset-8{margin-left:33.33333%}.next-col-offset-9{margin-left:37.5%}.next-col-offset-10{margin-left:41.66667%}.next-col-offset-11{margin-left:45.83333%}.next-col-offset-12{margin-left:50%}.next-col-offset-13{margin-left:54.16667%}.next-col-offset-14{margin-left:58.33333%}.next-col-offset-15{margin-left:62.5%}.next-col-offset-16{margin-left:66.66667%}.next-col-offset-17{margin-left:70.83333%}.next-col-offset-18{margin-left:75%}.next-col-offset-19{margin-left:79.16667%}.next-col-offset-20{margin-left:83.33333%}.next-col-offset-21{margin-left:87.5%}.next-col-offset-22{margin-left:91.66667%}.next-col-offset-23{margin-left:95.83333%}.next-col-offset-24{margin-left:100%}@media(min-width:320px){.next-col-xxs-offset-1{margin-left:4.16667%}.next-col-xxs-offset-2{margin-left:8.33333%}.next-col-xxs-offset-3{margin-left:12.5%}.next-col-xxs-offset-4{margin-left:16.66667%}.next-col-xxs-offset-5{margin-left:20.83333%}.next-col-xxs-offset-6{margin-left:25%}.next-col-xxs-offset-7{margin-left:29.16667%}.next-col-xxs-offset-8{margin-left:33.33333%}.next-col-xxs-offset-9{margin-left:37.5%}.next-col-xxs-offset-10{margin-left:41.66667%}.next-col-xxs-offset-11{margin-left:45.83333%}.next-col-xxs-offset-12{margin-left:50%}.next-col-xxs-offset-13{margin-left:54.16667%}.next-col-xxs-offset-14{margin-left:58.33333%}.next-col-xxs-offset-15{margin-left:62.5%}.next-col-xxs-offset-16{margin-left:66.66667%}.next-col-xxs-offset-17{margin-left:70.83333%}.next-col-xxs-offset-18{margin-left:75%}.next-col-xxs-offset-19{margin-left:79.16667%}.next-col-xxs-offset-20{margin-left:83.33333%}.next-col-xxs-offset-21{margin-left:87.5%}.next-col-xxs-offset-22{margin-left:91.66667%}.next-col-xxs-offset-23{margin-left:95.83333%}.next-col-xxs-offset-24{margin-left:100%}}@media(min-width:480px){.next-col-xs-offset-1{margin-left:4.16667%}.next-col-xs-offset-2{margin-left:8.33333%}.next-col-xs-offset-3{margin-left:12.5%}.next-col-xs-offset-4{margin-left:16.66667%}.next-col-xs-offset-5{margin-left:20.83333%}.next-col-xs-offset-6{margin-left:25%}.next-col-xs-offset-7{margin-left:29.16667%}.next-col-xs-offset-8{margin-left:33.33333%}.next-col-xs-offset-9{margin-left:37.5%}.next-col-xs-offset-10{margin-left:41.66667%}.next-col-xs-offset-11{margin-left:45.83333%}.next-col-xs-offset-12{margin-left:50%}.next-col-xs-offset-13{margin-left:54.16667%}.next-col-xs-offset-14{margin-left:58.33333%}.next-col-xs-offset-15{margin-left:62.5%}.next-col-xs-offset-16{margin-left:66.66667%}.next-col-xs-offset-17{margin-left:70.83333%}.next-col-xs-offset-18{margin-left:75%}.next-col-xs-offset-19{margin-left:79.16667%}.next-col-xs-offset-20{margin-left:83.33333%}.next-col-xs-offset-21{margin-left:87.5%}.next-col-xs-offset-22{margin-left:91.66667%}.next-col-xs-offset-23{margin-left:95.83333%}.next-col-xs-offset-24{margin-left:100%}}@media(min-width:720px){.next-col-s-offset-1{margin-left:4.16667%}.next-col-s-offset-2{margin-left:8.33333%}.next-col-s-offset-3{margin-left:12.5%}.next-col-s-offset-4{margin-left:16.66667%}.next-col-s-offset-5{margin-left:20.83333%}.next-col-s-offset-6{margin-left:25%}.next-col-s-offset-7{margin-left:29.16667%}.next-col-s-offset-8{margin-left:33.33333%}.next-col-s-offset-9{margin-left:37.5%}.next-col-s-offset-10{margin-left:41.66667%}.next-col-s-offset-11{margin-left:45.83333%}.next-col-s-offset-12{margin-left:50%}.next-col-s-offset-13{margin-left:54.16667%}.next-col-s-offset-14{margin-left:58.33333%}.next-col-s-offset-15{margin-left:62.5%}.next-col-s-offset-16{margin-left:66.66667%}.next-col-s-offset-17{margin-left:70.83333%}.next-col-s-offset-18{margin-left:75%}.next-col-s-offset-19{margin-left:79.16667%}.next-col-s-offset-20{margin-left:83.33333%}.next-col-s-offset-21{margin-left:87.5%}.next-col-s-offset-22{margin-left:91.66667%}.next-col-s-offset-23{margin-left:95.83333%}.next-col-s-offset-24{margin-left:100%}}@media(min-width:990px){.next-col-m-offset-1{margin-left:4.16667%}.next-col-m-offset-2{margin-left:8.33333%}.next-col-m-offset-3{margin-left:12.5%}.next-col-m-offset-4{margin-left:16.66667%}.next-col-m-offset-5{margin-left:20.83333%}.next-col-m-offset-6{margin-left:25%}.next-col-m-offset-7{margin-left:29.16667%}.next-col-m-offset-8{margin-left:33.33333%}.next-col-m-offset-9{margin-left:37.5%}.next-col-m-offset-10{margin-left:41.66667%}.next-col-m-offset-11{margin-left:45.83333%}.next-col-m-offset-12{margin-left:50%}.next-col-m-offset-13{margin-left:54.16667%}.next-col-m-offset-14{margin-left:58.33333%}.next-col-m-offset-15{margin-left:62.5%}.next-col-m-offset-16{margin-left:66.66667%}.next-col-m-offset-17{margin-left:70.83333%}.next-col-m-offset-18{margin-left:75%}.next-col-m-offset-19{margin-left:79.16667%}.next-col-m-offset-20{margin-left:83.33333%}.next-col-m-offset-21{margin-left:87.5%}.next-col-m-offset-22{margin-left:91.66667%}.next-col-m-offset-23{margin-left:95.83333%}.next-col-m-offset-24{margin-left:100%}}@media(min-width:1200px){.next-col-l-offset-1{margin-left:4.16667%}.next-col-l-offset-2{margin-left:8.33333%}.next-col-l-offset-3{margin-left:12.5%}.next-col-l-offset-4{margin-left:16.66667%}.next-col-l-offset-5{margin-left:20.83333%}.next-col-l-offset-6{margin-left:25%}.next-col-l-offset-7{margin-left:29.16667%}.next-col-l-offset-8{margin-left:33.33333%}.next-col-l-offset-9{margin-left:37.5%}.next-col-l-offset-10{margin-left:41.66667%}.next-col-l-offset-11{margin-left:45.83333%}.next-col-l-offset-12{margin-left:50%}.next-col-l-offset-13{margin-left:54.16667%}.next-col-l-offset-14{margin-left:58.33333%}.next-col-l-offset-15{margin-left:62.5%}.next-col-l-offset-16{margin-left:66.66667%}.next-col-l-offset-17{margin-left:70.83333%}.next-col-l-offset-18{margin-left:75%}.next-col-l-offset-19{margin-left:79.16667%}.next-col-l-offset-20{margin-left:83.33333%}.next-col-l-offset-21{margin-left:87.5%}.next-col-l-offset-22{margin-left:91.66667%}.next-col-l-offset-23{margin-left:95.83333%}.next-col-l-offset-24{margin-left:100%}}@media(min-width:1500px){.next-col-xl-offset-1{margin-left:4.16667%}.next-col-xl-offset-2{margin-left:8.33333%}.next-col-xl-offset-3{margin-left:12.5%}.next-col-xl-offset-4{margin-left:16.66667%}.next-col-xl-offset-5{margin-left:20.83333%}.next-col-xl-offset-6{margin-left:25%}.next-col-xl-offset-7{margin-left:29.16667%}.next-col-xl-offset-8{margin-left:33.33333%}.next-col-xl-offset-9{margin-left:37.5%}.next-col-xl-offset-10{margin-left:41.66667%}.next-col-xl-offset-11{margin-left:45.83333%}.next-col-xl-offset-12{margin-left:50%}.next-col-xl-offset-13{margin-left:54.16667%}.next-col-xl-offset-14{margin-left:58.33333%}.next-col-xl-offset-15{margin-left:62.5%}.next-col-xl-offset-16{margin-left:66.66667%}.next-col-xl-offset-17{margin-left:70.83333%}.next-col-xl-offset-18{margin-left:75%}.next-col-xl-offset-19{margin-left:79.16667%}.next-col-xl-offset-20{margin-left:83.33333%}.next-col-xl-offset-21{margin-left:87.5%}.next-col-xl-offset-22{margin-left:91.66667%}.next-col-xl-offset-23{margin-left:95.83333%}.next-col-xl-offset-24{margin-left:100%}}.next-col-offset-fixed-1{margin-left:20px}.next-col-offset-fixed-2{margin-left:40px}.next-col-offset-fixed-3{margin-left:60px}.next-col-offset-fixed-4{margin-left:80px}.next-col-offset-fixed-5{margin-left:100px}.next-col-offset-fixed-6{margin-left:120px}.next-col-offset-fixed-7{margin-left:140px}.next-col-offset-fixed-8{margin-left:160px}.next-col-offset-fixed-9{margin-left:180px}.next-col-offset-fixed-10{margin-left:200px}.next-col-offset-fixed-11{margin-left:220px}.next-col-offset-fixed-12{margin-left:240px}.next-col-offset-fixed-13{margin-left:260px}.next-col-offset-fixed-14{margin-left:280px}.next-col-offset-fixed-15{margin-left:300px}.next-col-offset-fixed-16{margin-left:320px}.next-col-offset-fixed-17{margin-left:340px}.next-col-offset-fixed-18{margin-left:360px}.next-col-offset-fixed-19{margin-left:380px}.next-col-offset-fixed-20{margin-left:400px}.next-col-offset-fixed-21{margin-left:420px}.next-col-offset-fixed-22{margin-left:440px}.next-col-offset-fixed-23{margin-left:460px}.next-col-offset-fixed-24{margin-left:480px}.next-col-offset-fixed-25{margin-left:500px}.next-col-offset-fixed-26{margin-left:520px}.next-col-offset-fixed-27{margin-left:540px}.next-col-offset-fixed-28{margin-left:560px}.next-col-offset-fixed-29{margin-left:580px}.next-col-offset-fixed-30{margin-left:600px}.next-col-offset-fixed-xxs-1{margin-left:20px}.next-col-offset-fixed-xxs-2{margin-left:40px}.next-col-offset-fixed-xxs-3{margin-left:60px}.next-col-offset-fixed-xxs-4{margin-left:80px}.next-col-offset-fixed-xxs-5{margin-left:100px}.next-col-offset-fixed-xxs-6{margin-left:120px}.next-col-offset-fixed-xxs-7{margin-left:140px}.next-col-offset-fixed-xxs-8{margin-left:160px}.next-col-offset-fixed-xxs-9{margin-left:180px}.next-col-offset-fixed-xxs-10{margin-left:200px}.next-col-offset-fixed-xxs-11{margin-left:220px}.next-col-offset-fixed-xxs-12{margin-left:240px}.next-col-offset-fixed-xxs-13{margin-left:260px}.next-col-offset-fixed-xxs-14{margin-left:280px}.next-col-offset-fixed-xxs-15{margin-left:300px}.next-col-offset-fixed-xxs-16{margin-left:320px}.next-col-offset-fixed-xxs-17{margin-left:340px}.next-col-offset-fixed-xxs-18{margin-left:360px}.next-col-offset-fixed-xxs-19{margin-left:380px}.next-col-offset-fixed-xxs-20{margin-left:400px}.next-col-offset-fixed-xxs-21{margin-left:420px}.next-col-offset-fixed-xxs-22{margin-left:440px}.next-col-offset-fixed-xxs-23{margin-left:460px}.next-col-offset-fixed-xxs-24{margin-left:480px}.next-col-offset-fixed-xxs-25{margin-left:500px}.next-col-offset-fixed-xxs-26{margin-left:520px}.next-col-offset-fixed-xxs-27{margin-left:540px}.next-col-offset-fixed-xxs-28{margin-left:560px}.next-col-offset-fixed-xxs-29{margin-left:580px}.next-col-offset-fixed-xxs-30{margin-left:600px}.next-col-offset-fixed-xs-1{margin-left:20px}.next-col-offset-fixed-xs-2{margin-left:40px}.next-col-offset-fixed-xs-3{margin-left:60px}.next-col-offset-fixed-xs-4{margin-left:80px}.next-col-offset-fixed-xs-5{margin-left:100px}.next-col-offset-fixed-xs-6{margin-left:120px}.next-col-offset-fixed-xs-7{margin-left:140px}.next-col-offset-fixed-xs-8{margin-left:160px}.next-col-offset-fixed-xs-9{margin-left:180px}.next-col-offset-fixed-xs-10{margin-left:200px}.next-col-offset-fixed-xs-11{margin-left:220px}.next-col-offset-fixed-xs-12{margin-left:240px}.next-col-offset-fixed-xs-13{margin-left:260px}.next-col-offset-fixed-xs-14{margin-left:280px}.next-col-offset-fixed-xs-15{margin-left:300px}.next-col-offset-fixed-xs-16{margin-left:320px}.next-col-offset-fixed-xs-17{margin-left:340px}.next-col-offset-fixed-xs-18{margin-left:360px}.next-col-offset-fixed-xs-19{margin-left:380px}.next-col-offset-fixed-xs-20{margin-left:400px}.next-col-offset-fixed-xs-21{margin-left:420px}.next-col-offset-fixed-xs-22{margin-left:440px}.next-col-offset-fixed-xs-23{margin-left:460px}.next-col-offset-fixed-xs-24{margin-left:480px}.next-col-offset-fixed-xs-25{margin-left:500px}.next-col-offset-fixed-xs-26{margin-left:520px}.next-col-offset-fixed-xs-27{margin-left:540px}.next-col-offset-fixed-xs-28{margin-left:560px}.next-col-offset-fixed-xs-29{margin-left:580px}.next-col-offset-fixed-xs-30{margin-left:600px}.next-col-offset-fixed-s-1{margin-left:20px}.next-col-offset-fixed-s-2{margin-left:40px}.next-col-offset-fixed-s-3{margin-left:60px}.next-col-offset-fixed-s-4{margin-left:80px}.next-col-offset-fixed-s-5{margin-left:100px}.next-col-offset-fixed-s-6{margin-left:120px}.next-col-offset-fixed-s-7{margin-left:140px}.next-col-offset-fixed-s-8{margin-left:160px}.next-col-offset-fixed-s-9{margin-left:180px}.next-col-offset-fixed-s-10{margin-left:200px}.next-col-offset-fixed-s-11{margin-left:220px}.next-col-offset-fixed-s-12{margin-left:240px}.next-col-offset-fixed-s-13{margin-left:260px}.next-col-offset-fixed-s-14{margin-left:280px}.next-col-offset-fixed-s-15{margin-left:300px}.next-col-offset-fixed-s-16{margin-left:320px}.next-col-offset-fixed-s-17{margin-left:340px}.next-col-offset-fixed-s-18{margin-left:360px}.next-col-offset-fixed-s-19{margin-left:380px}.next-col-offset-fixed-s-20{margin-left:400px}.next-col-offset-fixed-s-21{margin-left:420px}.next-col-offset-fixed-s-22{margin-left:440px}.next-col-offset-fixed-s-23{margin-left:460px}.next-col-offset-fixed-s-24{margin-left:480px}.next-col-offset-fixed-s-25{margin-left:500px}.next-col-offset-fixed-s-26{margin-left:520px}.next-col-offset-fixed-s-27{margin-left:540px}.next-col-offset-fixed-s-28{margin-left:560px}.next-col-offset-fixed-s-29{margin-left:580px}.next-col-offset-fixed-s-30{margin-left:600px}.next-col-offset-fixed-m-1{margin-left:20px}.next-col-offset-fixed-m-2{margin-left:40px}.next-col-offset-fixed-m-3{margin-left:60px}.next-col-offset-fixed-m-4{margin-left:80px}.next-col-offset-fixed-m-5{margin-left:100px}.next-col-offset-fixed-m-6{margin-left:120px}.next-col-offset-fixed-m-7{margin-left:140px}.next-col-offset-fixed-m-8{margin-left:160px}.next-col-offset-fixed-m-9{margin-left:180px}.next-col-offset-fixed-m-10{margin-left:200px}.next-col-offset-fixed-m-11{margin-left:220px}.next-col-offset-fixed-m-12{margin-left:240px}.next-col-offset-fixed-m-13{margin-left:260px}.next-col-offset-fixed-m-14{margin-left:280px}.next-col-offset-fixed-m-15{margin-left:300px}.next-col-offset-fixed-m-16{margin-left:320px}.next-col-offset-fixed-m-17{margin-left:340px}.next-col-offset-fixed-m-18{margin-left:360px}.next-col-offset-fixed-m-19{margin-left:380px}.next-col-offset-fixed-m-20{margin-left:400px}.next-col-offset-fixed-m-21{margin-left:420px}.next-col-offset-fixed-m-22{margin-left:440px}.next-col-offset-fixed-m-23{margin-left:460px}.next-col-offset-fixed-m-24{margin-left:480px}.next-col-offset-fixed-m-25{margin-left:500px}.next-col-offset-fixed-m-26{margin-left:520px}.next-col-offset-fixed-m-27{margin-left:540px}.next-col-offset-fixed-m-28{margin-left:560px}.next-col-offset-fixed-m-29{margin-left:580px}.next-col-offset-fixed-m-30{margin-left:600px}.next-col-offset-fixed-l-1{margin-left:20px}.next-col-offset-fixed-l-2{margin-left:40px}.next-col-offset-fixed-l-3{margin-left:60px}.next-col-offset-fixed-l-4{margin-left:80px}.next-col-offset-fixed-l-5{margin-left:100px}.next-col-offset-fixed-l-6{margin-left:120px}.next-col-offset-fixed-l-7{margin-left:140px}.next-col-offset-fixed-l-8{margin-left:160px}.next-col-offset-fixed-l-9{margin-left:180px}.next-col-offset-fixed-l-10{margin-left:200px}.next-col-offset-fixed-l-11{margin-left:220px}.next-col-offset-fixed-l-12{margin-left:240px}.next-col-offset-fixed-l-13{margin-left:260px}.next-col-offset-fixed-l-14{margin-left:280px}.next-col-offset-fixed-l-15{margin-left:300px}.next-col-offset-fixed-l-16{margin-left:320px}.next-col-offset-fixed-l-17{margin-left:340px}.next-col-offset-fixed-l-18{margin-left:360px}.next-col-offset-fixed-l-19{margin-left:380px}.next-col-offset-fixed-l-20{margin-left:400px}.next-col-offset-fixed-l-21{margin-left:420px}.next-col-offset-fixed-l-22{margin-left:440px}.next-col-offset-fixed-l-23{margin-left:460px}.next-col-offset-fixed-l-24{margin-left:480px}.next-col-offset-fixed-l-25{margin-left:500px}.next-col-offset-fixed-l-26{margin-left:520px}.next-col-offset-fixed-l-27{margin-left:540px}.next-col-offset-fixed-l-28{margin-left:560px}.next-col-offset-fixed-l-29{margin-left:580px}.next-col-offset-fixed-l-30{margin-left:600px}.next-col-offset-fixed-xl-1{margin-left:20px}.next-col-offset-fixed-xl-2{margin-left:40px}.next-col-offset-fixed-xl-3{margin-left:60px}.next-col-offset-fixed-xl-4{margin-left:80px}.next-col-offset-fixed-xl-5{margin-left:100px}.next-col-offset-fixed-xl-6{margin-left:120px}.next-col-offset-fixed-xl-7{margin-left:140px}.next-col-offset-fixed-xl-8{margin-left:160px}.next-col-offset-fixed-xl-9{margin-left:180px}.next-col-offset-fixed-xl-10{margin-left:200px}.next-col-offset-fixed-xl-11{margin-left:220px}.next-col-offset-fixed-xl-12{margin-left:240px}.next-col-offset-fixed-xl-13{margin-left:260px}.next-col-offset-fixed-xl-14{margin-left:280px}.next-col-offset-fixed-xl-15{margin-left:300px}.next-col-offset-fixed-xl-16{margin-left:320px}.next-col-offset-fixed-xl-17{margin-left:340px}.next-col-offset-fixed-xl-18{margin-left:360px}.next-col-offset-fixed-xl-19{margin-left:380px}.next-col-offset-fixed-xl-20{margin-left:400px}.next-col-offset-fixed-xl-21{margin-left:420px}.next-col-offset-fixed-xl-22{margin-left:440px}.next-col-offset-fixed-xl-23{margin-left:460px}.next-col-offset-fixed-xl-24{margin-left:480px}.next-col-offset-fixed-xl-25{margin-left:500px}.next-col-offset-fixed-xl-26{margin-left:520px}.next-col-offset-fixed-xl-27{margin-left:540px}.next-col-offset-fixed-xl-28{margin-left:560px}.next-col-offset-fixed-xl-29{margin-left:580px}.next-col-offset-fixed-xl-30{margin-left:600px}.next-col.next-col-hidden{display:none}@media(min-width:320px)and (max-width:479px){.next-col.next-col-xxs-hidden{display:none}}@media(min-width:480px)and (max-width:719px){.next-col.next-col-xs-hidden{display:none}}@media(min-width:720px)and (max-width:989px){.next-col.next-col-s-hidden{display:none}}@media(min-width:990px)and (max-width:1199px){.next-col.next-col-m-hidden{display:none}}@media(min-width:1200px)and (max-width:1499px){.next-col.next-col-l-hidden{display:none}}@media(min-width:1500px){.next-col.next-col-xl-hidden{display:none}}.next-row.next-row-hidden{display:none}@media(min-width:320px)and (max-width:479px){.next-row.next-row-xxs-hidden{display:none}}@media(min-width:480px)and (max-width:719px){.next-row.next-row-xs-hidden{display:none}}@media(min-width:720px)and (max-width:989px){.next-row.next-row-s-hidden{display:none}}@media(min-width:990px)and (max-width:1199px){.next-row.next-row-m-hidden{display:none}}@media(min-width:1200px)and (max-width:1499px){.next-row.next-row-l-hidden{display:none}}@media(min-width:1500px){.next-row.next-row-xl-hidden{display:none}}.next-col-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}@media(min-width:320px){.next-col-xxs-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-xxs-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-xxs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xxs-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-xxs-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-xxs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xxs-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-xxs-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-xxs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xxs-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-xxs-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-xxs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xxs-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-xxs-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-xxs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xxs-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-xxs-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-xxs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xxs-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-xxs-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-xxs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xxs-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-xxs-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-xxs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:480px){.next-col-xs-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-xs-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-xs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xs-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-xs-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-xs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xs-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-xs-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-xs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xs-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-xs-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-xs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xs-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-xs-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-xs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xs-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-xs-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-xs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xs-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-xs-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-xs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xs-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-xs-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-xs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:720px){.next-col-s-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-s-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-s-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-s-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-s-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-s-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-s-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-s-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-s-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-s-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-s-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-s-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-s-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-s-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-s-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-s-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-s-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-s-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-s-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-s-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-s-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-s-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-s-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-s-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:990px){.next-col-m-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-m-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-m-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-m-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-m-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-m-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-m-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-m-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-m-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-m-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-m-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-m-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-m-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-m-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-m-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-m-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-m-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-m-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-m-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-m-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-m-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-m-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-m-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-m-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1200px){.next-col-l-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-l-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-l-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-l-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-l-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-l-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-l-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-l-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-l-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-l-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-l-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-l-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-l-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-l-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-l-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-l-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-l-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-l-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-l-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-l-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-l-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-l-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-l-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-l-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1500px){.next-col-xl-offset-1[dir=rtl]{margin-right:4.16667%;margin-left:auto}.next-col-xl-offset-2[dir=rtl]{margin-right:8.33333%;margin-left:auto}.next-col-xl-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xl-offset-4[dir=rtl]{margin-right:16.66667%;margin-left:auto}.next-col-xl-offset-5[dir=rtl]{margin-right:20.83333%;margin-left:auto}.next-col-xl-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xl-offset-7[dir=rtl]{margin-right:29.16667%;margin-left:auto}.next-col-xl-offset-8[dir=rtl]{margin-right:33.33333%;margin-left:auto}.next-col-xl-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xl-offset-10[dir=rtl]{margin-right:41.66667%;margin-left:auto}.next-col-xl-offset-11[dir=rtl]{margin-right:45.83333%;margin-left:auto}.next-col-xl-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xl-offset-13[dir=rtl]{margin-right:54.16667%;margin-left:auto}.next-col-xl-offset-14[dir=rtl]{margin-right:58.33333%;margin-left:auto}.next-col-xl-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xl-offset-16[dir=rtl]{margin-right:66.66667%;margin-left:auto}.next-col-xl-offset-17[dir=rtl]{margin-right:70.83333%;margin-left:auto}.next-col-xl-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xl-offset-19[dir=rtl]{margin-right:79.16667%;margin-left:auto}.next-col-xl-offset-20[dir=rtl]{margin-right:83.33333%;margin-left:auto}.next-col-xl-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xl-offset-22[dir=rtl]{margin-right:91.66667%;margin-left:auto}.next-col-xl-offset-23[dir=rtl]{margin-right:95.83333%;margin-left:auto}.next-col-xl-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}.next-col-offset-fixed-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xxs-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xxs-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xxs-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xxs-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xxs-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xxs-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xxs-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xxs-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xxs-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xxs-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xxs-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xxs-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xxs-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xxs-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xxs-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xxs-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xxs-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xxs-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xxs-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xxs-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xxs-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xxs-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xxs-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xxs-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xxs-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xxs-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xxs-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xxs-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xxs-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xxs-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xs-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xs-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xs-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xs-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xs-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xs-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xs-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xs-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xs-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xs-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xs-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xs-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xs-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xs-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xs-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xs-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xs-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xs-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xs-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xs-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xs-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xs-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xs-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xs-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xs-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xs-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xs-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xs-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xs-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xs-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-s-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-s-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-s-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-s-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-s-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-s-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-s-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-s-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-s-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-s-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-s-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-s-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-s-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-s-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-s-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-s-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-s-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-s-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-s-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-s-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-s-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-s-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-s-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-s-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-s-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-s-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-s-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-s-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-s-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-s-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-m-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-m-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-m-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-m-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-m-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-m-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-m-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-m-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-m-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-m-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-m-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-m-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-m-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-m-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-m-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-m-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-m-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-m-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-m-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-m-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-m-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-m-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-m-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-m-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-m-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-m-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-m-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-m-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-m-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-m-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-l-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-l-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-l-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-l-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-l-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-l-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-l-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-l-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-l-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-l-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-l-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-l-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-l-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-l-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-l-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-l-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-l-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-l-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-l-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-l-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-l-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-l-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-l-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-l-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-l-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-l-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-l-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-l-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-l-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-l-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xl-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xl-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xl-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xl-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xl-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xl-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xl-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xl-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xl-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xl-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xl-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xl-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xl-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xl-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xl-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xl-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xl-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xl-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xl-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xl-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xl-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xl-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xl-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xl-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xl-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xl-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xl-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xl-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xl-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xl-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-responsive-grid{display:grid}.next-responsive-grid,.next-responsive-grid *,.next-responsive-grid :after,.next-responsive-grid :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-responsive-grid-ie{display:block}.next-form,.next-form *,.next-form :after,.next-form :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-form-preview.next-form-item .next-form-item-label{color:#666;color:var(--form-element-preview-label-color,#666)}.next-form-preview.next-form-item .next-form-preview{color:#333;color:var(--form-element-preview-text-color,#333)}.next-form-preview.next-form-item.next-medium .next-form-item-label{font-size:14px;font-size:var(--form-element-medium-preview-label-font-size,14px);line-height:28px;line-height:var(--form-element-medium-preview-height,28px)}.next-form-preview.next-form-item.next-small .next-form-item-label{font-size:12px;font-size:var(--form-element-small-preview-label-font-size,12px);line-height:20px;line-height:var(--form-element-small-preview-height,20px)}.next-form-preview.next-form-item.next-large .next-form-item-label{font-size:16px;font-size:var(--form-element-large-preview-label-font-size,16px);line-height:40px;line-height:var(--form-element-large-preview-height,40px)}.next-form-responsive-grid .next-form-item-control{-webkit-box-flex:1;-ms-flex:1;flex:1}.next-form-responsive-grid .next-form-item{margin-bottom:0}.next-form-responsive-grid .next-form-item.next-left{display:-webkit-box;display:-ms-flexbox;display:flex}.next-form-responsive-grid.next-small .next-responsive-grid{gap:16px;gap:var(--form-inline-s-item-margin-r,16px)}.next-form-responsive-grid.next-small .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:6px;margin-top:calc(var(--form-element-small-height, 24px)/2 - var(--form-element-small-font-size, 12px)/2);margin-bottom:6px;margin-bottom:calc(var(--form-element-small-height, 24px)/2 - var(--form-element-small-font-size, 12px)/2)}.next-form-responsive-grid.next-medium .next-responsive-grid{gap:20px;gap:var(--form-inline-m-item-margin-r,20px)}.next-form-responsive-grid.next-medium .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:9px;margin-top:calc(var(--form-element-medium-height, 32px)/2 - var(--form-element-medium-font-size, 14px)/2);margin-bottom:9px;margin-bottom:calc(var(--form-element-medium-height, 32px)/2 - var(--form-element-medium-font-size, 14px)/2)}.next-form-responsive-grid.next-large .next-responsive-grid{gap:24px;gap:var(--form-inline-l-item-margin-r,24px)}.next-form-responsive-grid.next-large .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:12px;margin-top:calc(var(--form-element-large-height, 40px)/2 - var(--form-element-large-font-size, 16px)/2);margin-bottom:12px;margin-bottom:calc(var(--form-element-large-height, 40px)/2 - var(--form-element-large-font-size, 16px)/2)}.next-form-item{margin-bottom:16px;margin-bottom:var(--form-item-m-margin-b,16px)}.next-form-item.has-error>.next-form-item-control>.next-form-item-help{color:#d23c26;color:var(--form-error-color,#d23c26)}.next-form-item.has-warning>.next-form-item-control>.next-form-item-help{color:#f1c826;color:var(--form-warning-color,#f1c826)}.next-form-item .next-form-item-label,.next-form-item .next-form-text-align,.next-form-item p{line-height:32px;line-height:var(--form-element-medium-height,32px)}.next-form-item .next-form-text-align,.next-form-item p{margin:0}.next-form-item .next-checkbox-group,.next-form-item .next-checkbox-wrapper,.next-form-item .next-radio-group,.next-form-item .next-radio-wrapper,.next-form-item .next-rating{line-height:28px;line-height:calc(var(--form-element-medium-height, 32px) - 4px)}.next-form-item .next-form-preview{font-size:14px;font-size:var(--form-element-medium-preview-font-size,14px);line-height:28px;line-height:var(--form-element-medium-preview-height,28px)}.next-form-item .next-form-preview.next-input-textarea>p{font-size:14px;font-size:var(--form-element-medium-preview-font-size,14px);text-align:justify;min-height:19.6px;min-height:calc(var(--form-element-medium-preview-font-size, 14px)*1.4);line-height:1.4;margin-top:4.2px;margin-top:calc(var(--form-element-medium-preview-height, 28px)/2 - var(--form-element-medium-preview-font-size, 14px)*1.4/2)}.next-form-item .next-form-item-label{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-form-item .next-form-item-label>label{display:inline-block;line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-form-item.next-large{margin-bottom:20px;margin-bottom:var(--form-item-l-margin-b,20px)}.next-form-item.next-large .next-form-item-label,.next-form-item.next-large .next-form-text-align,.next-form-item.next-large p{line-height:40px;line-height:var(--form-element-large-height,40px)}.next-form-item.next-large .next-checkbox-group,.next-form-item.next-large .next-checkbox-wrapper,.next-form-item.next-large .next-radio-group,.next-form-item.next-large .next-radio-wrapper,.next-form-item.next-large .next-rating{line-height:39px;line-height:calc(var(--form-element-large-height, 40px) - 1px)}.next-form-item.next-large .next-form-preview{font-size:16px;font-size:var(--form-element-large-preview-font-size,16px);line-height:40px;line-height:var(--form-element-large-preview-height,40px)}.next-form-item.next-large .next-form-preview.next-input-textarea>p{font-size:16px;font-size:var(--form-element-large-preview-font-size,16px);text-align:justify;min-height:22.4px;min-height:calc(var(--form-element-large-preview-font-size, 16px)*1.4);line-height:1.4;margin-top:8.8px;margin-top:calc(var(--form-element-large-preview-height, 40px)/2 - var(--form-element-large-preview-font-size, 16px)*1.4/2)}.next-form-item.next-large .next-switch{margin-top:7px;margin-top:calc(var(--form-element-large-height, 40px)/2 - 13px)}.next-form-item.next-large .next-form-item-label{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-form-item.next-small{margin-bottom:12px;margin-bottom:var(--form-item-s-margin-b,12px)}.next-form-item.next-small .next-checkbox-group,.next-form-item.next-small .next-checkbox-wrapper,.next-form-item.next-small .next-form-item-label,.next-form-item.next-small .next-form-text-align,.next-form-item.next-small .next-radio-group,.next-form-item.next-small .next-radio-wrapper,.next-form-item.next-small .next-rating,.next-form-item.next-small p{line-height:24px;line-height:var(--form-element-small-height,24px)}.next-form-item.next-small .next-form-preview{font-size:12px;font-size:var(--form-element-small-preview-font-size,12px);line-height:20px;line-height:var(--form-element-small-preview-height,20px)}.next-form-item.next-small .next-form-preview.next-input-textarea>p{font-size:12px;font-size:var(--form-element-small-preview-font-size,12px);text-align:justify;min-height:16.8px;min-height:calc(var(--form-element-small-preview-font-size, 12px)*1.4);line-height:1.4;margin-top:1.6px;margin-top:calc(var(--form-element-small-preview-height, 20px)/2 - var(--form-element-small-preview-font-size, 12px)*1.4/2)}.next-form-item.next-small .next-form-item-label{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-form-item.next-top>.next-form-item-label{margin-bottom:2px;margin-bottom:var(--form-top-label-margin-b,2px)}.next-form-item.next-inset .next-form-item-label{padding-right:0;padding-left:0;line-height:inherit}.next-form-item-control .next-form-text-align{margin:0}.next-form-item-control>.next-input,.next-form-item-control>.next-input-group,.next-form-item-fullwidth .next-form-item-control>.next-date-picker,.next-form-item-fullwidth .next-form-item-control>.next-input,.next-form-item-fullwidth .next-form-item-control>.next-input-group,.next-form-item-fullwidth .next-form-item-control>.next-month-picker,.next-form-item-fullwidth .next-form-item-control>.next-range-picker,.next-form-item-fullwidth .next-form-item-control>.next-select,.next-form-item-fullwidth .next-form-item-control>.next-time-picker,.next-form-item-fullwidth .next-form-item-control>.next-year-picker{width:100%}.next-form-item-fullwidth .next-form-item-control>.next-date-picker2 .next-date-picker2-input input{width:inherit}.next-form-item-label{display:inline-block;vertical-align:top;color:#666;color:var(--form-label-color,#666);text-align:right;padding-right:12px;padding-right:var(--form-label-padding-r,12px)}.next-form-item-label label[required]:before{margin-right:4px;content:"*";color:#d23c26;color:var(--form-error-color,#d23c26)}.next-form-item-label.has-colon label:after{content:":";position:relative;top:-.5px;margin:0 0 0 2px}.next-form-item-label.next-left{text-align:left}.next-form-item-label.next-left>label[required]:before{display:none}.next-form-item-label.next-left>label[required]:after{margin-left:4px;content:"*";color:#d23c26;color:var(--form-error-color,#d23c26)}.next-form-item-help{margin-top:4px;margin-top:var(--form-help-margin-top,4px);font-size:12px;font-size:var(--form-help-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#999;color:var(--form-help-color,#999)}.next-form.next-inline .next-form-item{display:inline-block;vertical-align:top}.next-form.next-inline .next-form-item.next-left .next-form-item-control{display:inline-block;vertical-align:top;line-height:0}.next-form.next-inline .next-form-item:not(:last-child){margin-right:20px;margin-right:var(--form-inline-m-item-margin-r,20px)}.next-form.next-inline .next-form-item.next-large:not(:last-child){margin-right:24px;margin-right:var(--form-inline-l-item-margin-r,24px)}.next-form.next-inline .next-form-item.next-small:not(:last-child){margin-right:16px;margin-right:var(--form-inline-s-item-margin-r,16px)}@media screen and (min-width:0\0)and (min-resolution:0.001dpcm){.next-form-item.next-left>.next-form-item-label,.next-form.next-inline .next-form-item.next-left .next-form-item-control{display:table-cell}}.next-form[dir=rtl] .next-form-item-label{text-align:left;padding-left:12px;padding-left:var(--form-label-padding-r,12px);padding-right:0}.next-form[dir=rtl].next-inline .next-form-item:not(:last-child){margin-left:20px;margin-left:var(--form-inline-m-item-margin-r,20px);margin-right:0}.next-form[dir=rtl].next-inline .next-form-item.next-large:not(:last-child){margin-left:24px;margin-left:var(--form-inline-l-item-margin-r,24px);margin-right:0}.next-form[dir=rtl].next-inline .next-form-item.next-small:not(:last-child){margin-left:16px;margin-left:var(--form-inline-s-item-margin-r,16px);margin-right:0}.next-avatar{position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#f2f2f2;background:var(--color-fill1-4,#f2f2f2);width:40px;width:var(--avatar-size-medium,40px);height:40px;height:var(--avatar-size-medium,40px);line-height:40px;line-height:var(--avatar-size-medium,40px);border-radius:50%}.next-avatar-image{background:transparent}.next-avatar-string{position:absolute;left:50%;-webkit-transform-origin:0 center;-ms-transform-origin:0 center;transform-origin:0 center}.next-avatar-large{width:52px;width:var(--avatar-size-large,52px);height:52px;height:var(--avatar-size-large,52px);line-height:52px;line-height:var(--avatar-size-large,52px);border-radius:50%}.next-avatar-large-string{position:absolute;left:50%;-webkit-transform-origin:0 center;-ms-transform-origin:0 center;transform-origin:0 center}.next-avatar-small{width:28px;width:var(--avatar-size-small,28px);height:28px;height:var(--avatar-size-small,28px);line-height:28px;line-height:var(--avatar-size-small,28px);border-radius:50%}.next-avatar-small-string{position:absolute;left:50%;-webkit-transform-origin:0 center;-ms-transform-origin:0 center;transform-origin:0 center}.next-avatar-square{border-radius:3px;border-radius:var(--avatar-border-radius,3px)}.next-avatar>img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.next-select{display:inline-block;position:relative;font-size:0;vertical-align:middle}.next-select,.next-select *,.next-select :after,.next-select :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-select-trigger{min-width:100px;outline:0;-webkit-transition:all .1s linear;transition:all .1s linear}.next-select-trigger .next-input-label{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.next-select-trigger .next-select-values{display:block;width:100%;-webkit-box-flex:1;-ms-flex:1 1 0px;flex:1 1 0;overflow:hidden}.next-select-trigger .next-select-values>em{font-style:inherit}.next-select-trigger .next-select-values input{padding-left:0;padding-right:0}.next-select-trigger .next-input-control{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.next-select-trigger .next-input-control>*{display:inline-block;width:auto}.next-select-trigger .next-input-control>.next-select-arrow{padding-right:0}.next-select-trigger .next-input.next-disabled em{color:#ccc;color:var(--input-disabled-color,#ccc)}.next-select-trigger .next-input.next-disabled .next-select-arrow{cursor:not-allowed}.next-select-trigger .next-select-clear{display:none}.next-select-trigger.next-has-clear:hover .next-select-clear{display:inline-block}.next-select-trigger.next-has-clear:hover .next-select-arrow{display:none}.next-select .next-select-inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;min-width:100px;outline:0;color:#333;color:var(--select-color,#333)}.next-select .next-select-inner .next-tag{line-height:1;margin-right:4px;margin-bottom:3px;padding-left:0;padding-right:0}.next-select .next-select-inner .next-input-inner{width:auto}.next-select-trigger-search{position:relative;display:inline-block;vertical-align:top;overflow:hidden;width:100%;max-width:100%}.next-select-trigger-search>input,.next-select-trigger-search>span{display:block;font-size:inherit;font-family:inherit;letter-spacing:inherit;white-space:nowrap;overflow:hidden}.next-select-trigger-search input{position:absolute;background-color:transparent;width:100%;height:100%!important;z-index:1;left:0;border:0;outline:0;margin:0;padding:0;cursor:inherit}.next-select-trigger-search>span{position:relative;visibility:hidden;white-space:pre;max-width:100%;z-index:-1}.next-select-single.next-no-search{cursor:pointer}.next-select-single.next-has-search.next-active .next-select-values>em{display:none}.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search,.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search{width:1px;opacity:0;filter:alpha(opacity=0)}.next-select-single .next-select-values{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.next-select-single .next-select-values>em{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.next-select-multiple .next-select-compact{position:relative;white-space:nowrap}.next-select-multiple .next-select-compact .next-select-trigger-search{width:auto}.next-select-multiple .next-select-compact .next-select-tag-compact{position:absolute;top:0;right:0;z-index:1;padding:0 4px 0 16px;color:#333;color:var(--input-text-color,#333);background:linear-gradient(90deg,transparent,#fff 10px);background:linear-gradient(90deg,transparent,var(--input-bg-color,#fff) 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#fafafa 10px);background:linear-gradient(90deg,transparent,var(--input-disabled-bg-color,#fafafa) 10px)}.next-select-multiple .next-select-values,.next-select-tag .next-select-values{margin-bottom:-3px;height:auto!important}.next-select-multiple .next-select-trigger-search,.next-select-tag .next-select-trigger-search{margin-bottom:3px}.next-select-multiple .next-tag+.next-select-trigger-search,.next-select-tag .next-tag+.next-select-trigger-search{width:auto;min-width:1px}.next-select-multiple .next-input,.next-select-tag .next-input{height:auto;-webkit-box-align:start;-ms-flex-align:start;align-items:start}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:22px;min-height:calc(var(--form-element-small-height, 24px) - 2px);padding-top:4px;padding-top:calc(var(--form-element-small-height, 24px)/2 - var(--select-s-lineheight, 14px)/2 - 1px);padding-bottom:4px;padding-bottom:calc(var(--form-element-small-height, 24px)/2 - var(--select-s-lineheight, 14px)/2 - 1px);line-height:14px;line-height:var(--select-s-lineheight,14px)}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:24px!important;height:var(--form-element-small-height,24px)!important}.next-select-multiple.next-small .next-tag,.next-select-tag.next-small .next-tag{border:0;padding-top:0;padding-top:calc(var(--select-s-lineheight, 14px)/2 - 7px);padding-bottom:0;padding-bottom:calc(var(--select-s-lineheight, 14px)/2 - 7px);height:14px;height:var(--select-s-lineheight,14px)}.next-select-multiple.next-small .next-tag .next-tag-body,.next-select-multiple.next-small .next-tag .next-tag-close-btn,.next-select-tag.next-small .next-tag .next-tag-body,.next-select-tag.next-small .next-tag .next-tag-close-btn{line-height:14px;line-height:calc(var(--select-s-lineheight, 14px) - var(--select-s-lineheight, 14px)/2*2 + 14px)}.next-select-multiple.next-small .next-tag-body,.next-select-tag.next-small .next-tag-body{line-height:14px;line-height:var(--select-s-lineheight,14px)}.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-input-inner,.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-input-inner,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-select-tag-compact{line-height:22px;line-height:calc(var(--form-element-small-height, 24px) - 2px)}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:30px;min-height:calc(var(--form-element-medium-height, 32px) - 2px);padding-top:5px;padding-top:calc(var(--form-element-medium-height, 32px)/2 - var(--select-m-lineheight, 20px)/2 - 1px);padding-bottom:5px;padding-bottom:calc(var(--form-element-medium-height, 32px)/2 - var(--select-m-lineheight, 20px)/2 - 1px);line-height:20px;line-height:var(--select-m-lineheight,20px)}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:32px!important;height:var(--form-element-medium-height,32px)!important}.next-select-multiple.next-medium .next-tag,.next-select-tag.next-medium .next-tag{padding-top:1px;padding-top:calc(var(--select-m-lineheight, 20px)/2 - 9px);padding-bottom:1px;padding-bottom:calc(var(--select-m-lineheight, 20px)/2 - 9px);height:20px;height:var(--select-m-lineheight,20px)}.next-select-multiple.next-medium .next-tag .next-tag-body,.next-select-multiple.next-medium .next-tag .next-tag-close-btn,.next-select-tag.next-medium .next-tag .next-tag-body,.next-select-tag.next-medium .next-tag .next-tag-close-btn{line-height:18px;line-height:calc(var(--select-m-lineheight, 20px) - var(--select-m-lineheight, 20px)/2*2 + 18px)}.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-input-inner,.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-input-inner,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-select-tag-compact{line-height:30px;line-height:calc(var(--form-element-medium-height, 32px) - 2px)}.next-select-multiple.next-large .next-select-values,.next-select-tag.next-large .next-select-values{min-height:38px;min-height:calc(var(--form-element-large-height, 40px) - 2px);padding-top:7px;padding-top:calc(var(--form-element-large-height, 40px)/2 - var(--select-l-lineheight, 24px)/2 - 1px);padding-bottom:7px;padding-bottom:calc(var(--form-element-large-height, 40px)/2 - var(--select-l-lineheight, 24px)/2 - 1px);line-height:24px;line-height:var(--select-l-lineheight,24px)}.next-select-multiple.next-large .next-select-values-compact,.next-select-tag.next-large .next-select-values-compact{height:40px!important;height:var(--form-element-large-height,40px)!important}.next-select-multiple.next-large .next-tag,.next-select-tag.next-large .next-tag{padding-top:3px;padding-top:calc(var(--select-l-lineheight, 24px)/2 - 9px);padding-bottom:3px;padding-bottom:calc(var(--select-l-lineheight, 24px)/2 - 9px);height:24px;height:var(--select-l-lineheight,24px)}.next-select-multiple.next-large .next-tag .next-tag-body,.next-select-multiple.next-large .next-tag .next-tag-close-btn,.next-select-tag.next-large .next-tag .next-tag-body,.next-select-tag.next-large .next-tag .next-tag-close-btn{line-height:18px;line-height:calc(var(--select-l-lineheight, 24px) - var(--select-l-lineheight, 24px)/2*2 + 18px)}.next-select-multiple.next-large .next-input-control,.next-select-multiple.next-large .next-input-inner,.next-select-multiple.next-large .next-input-label,.next-select-multiple.next-large .next-select-tag-compact,.next-select-tag.next-large .next-input-control,.next-select-tag.next-large .next-input-inner,.next-select-tag.next-large .next-input-label,.next-select-tag.next-large .next-select-tag-compact{line-height:38px;line-height:calc(var(--form-element-large-height, 40px) - 2px)}.next-select-auto-complete{width:160px}.next-select-auto-complete .next-input{width:100%}.next-select-auto-complete .next-input .next-input-hint-wrap{padding-right:1px}.next-select-auto-complete .next-input .next-select-arrow{padding-left:0}.next-select.next-active .next-select-arrow .next-icon-arrow-down{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.next-select .next-select-unfold-icon:before{content:"";content:var(--select-unfold-icon-content,"")}.next-select-symbol-fold:before{content:"";content:var(--select-fold-icon-content,"\e63d")}.next-select-arrow{cursor:pointer;width:auto!important;text-align:center;-webkit-transition:all .1s linear;transition:all .1s linear}.next-select-popup-wrap{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease}.next-select-popup-wrap,.next-select-spacing-tb{padding:0;padding:var(--popup-spacing-tb,0) 0}.next-select-menu-wrapper{max-height:260px;overflow:auto;border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none)}.next-select-menu-wrapper .next-select-menu{max-height:none;border:none}.next-select-menu{max-height:260px;overflow:auto}.next-select-menu .next-select-menu-empty-content{padding-left:8px;padding-right:8px;color:#999;color:var(--select-hint-color,#999)}.next-select-menu.next-select-auto-complete-menu.next-select-menu-empty{display:none}.next-select-menu .next-menu-item-text .next-icon{vertical-align:middle}.next-select-all{display:block;cursor:pointer;padding:0 8px;margin:0 12px 8px;border-bottom:1px solid #e6e6e6;border-bottom:1px solid var(--color-line1-2,#e6e6e6)}.next-select-all:hover{color:#2580e7;color:var(--color-link-3,#2580e7)}.next-select-all .next-menu-icon-selected.next-icon{display:inline-block!important;top:auto;color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-select-highlight{color:#209bfa;color:var(--select-highlight-color,#209bfa);font-size:14px;font-size:var(--select-highlight-font,14px)}.next-select-in-ie.next-select-trigger .next-select-values{overflow:visible}.next-select-in-ie.next-select-trigger .next-input-control,.next-select-in-ie.next-select-trigger .next-input-label{width:1px}.next-select-in-ie.next-select-trigger .next-input-control>*{display:table-cell;width:1%}.next-select-in-ie.next-select-trigger .next-select-arrow{display:table-cell}.next-select-in-ie.next-select-trigger .next-select-clear{display:none}.next-select-in-ie.next-select-trigger.next-select-multiple .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-tag .next-select-inner{vertical-align:top}.next-select-in-ie.next-select-trigger .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-single .next-select-values{display:inline-table}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:24px;line-height:var(--form-element-small-height,24px)}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:32px;line-height:var(--form-element-medium-height,32px)}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-large .next-select-values{line-height:40px;line-height:var(--form-element-large-height,40px)}.next-select-in-ie.next-select-trigger .next-select-trigger-search>span{max-width:100px}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values{position:relative}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values>em{position:absolute;display:inline-block;height:100%;line-height:1;vertical-align:middle;overflow:hidden;left:4px;right:0;top:30%}.next-select-in-ie.next-select-trigger.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search,.next-select-in-ie.next-select-trigger.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search{filter:alpha(opacity=0);font-size:0}.next-select-in-ie.next-select-trigger.next-no-search .next-select-trigger-search input{color:inherit}@media screen and (-webkit-min-device-pixel-ratio:0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 10px);background:linear-gradient(90deg,hsla(0,0%,100%,0),var(--input-bg-color,#fff) 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fafafa 10px);background:linear-gradient(90deg,hsla(0,0%,100%,0),var(--input-disabled-bg-color,#fafafa) 10px)}}.next-select.next-select-multiple[dir=rtl] .next-select-compact .next-select-tag-compact{left:0;right:auto;padding:0 16px 0 4px;background:linear-gradient(270deg,hsla(0,0%,100%,0),#fff 10px);background:linear-gradient(270deg,hsla(0,0%,100%,0),var(--input-bg-color,#fff) 10px)}.next-list-header{border-bottom:1px solid #e6e6e6;border-bottom:var(--line-1,1px) solid var(--list-divider-color,#e6e6e6);color:#333;color:var(--list-title-color,#333)}.next-list-footer{border-top:1px solid #e6e6e6;border-top:var(--line-1,1px) solid var(--list-divider-color,#e6e6e6);color:#666;color:var(--list-content-color,#666)}.next-list-loading.next-loading{display:block}.next-list-empty{font-size:14px;font-size:var(--font-size-body-1,14px);color:#ccc;color:var(--color-line1-4,#ccc);padding:32px 0;text-align:center}.next-list-items{margin:0;padding:0;list-style:none}.next-list-item{display:table;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;color:#666;color:var(--list-content-color,#666)}.next-list-item-extra,.next-list-item-media{display:table-cell;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;min-width:1px;-ms-flex-negative:0;flex-shrink:0;vertical-align:top}.next-list-item-extra{color:#999;color:var(--list-extra-color,#999)}.next-list-item-content{display:table-cell;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;vertical-align:middle}.next-list-item-title{color:#333;color:var(--list-title-color,#333)}.next-list-medium .next-list-header{font-size:20px;font-size:var(--list-size-m-title-font-size,20px);font-weight:700;font-weight:var(--list-size-m-title-font-weight,bold)}.next-list-medium .next-list-footer,.next-list-medium .next-list-header{padding:16px 0;padding:var(--list-size-m-item-padding-tb,16px) var(--list-size-m-item-padding-lr,0)}.next-list-medium .next-list-item-media{padding-right:8px;padding-right:var(--list-size-m-item-media-margin,8px)}.next-list-medium .next-list-item-extra{padding-left:8px;padding-left:var(--list-size-m-item-media-margin,8px)}.next-list-medium .next-list-item{font-size:14px;font-size:var(--list-size-m-item-content-font-size,14px);line-height:1.5;line-height:var(--list-size-m-item-content-line-height,1.5);padding:16px 0;padding:var(--list-size-m-item-padding-tb,16px) var(--list-size-m-item-padding-lr,0)}.next-list-medium .next-list-item-title{font-weight:400;font-weight:var(--list-size-m-item-title-font-weight,normal);font-size:16px;font-size:var(--list-size-m-item-title-font-size,16px);line-height:1.5;line-height:var(--list-size-m-item-title-line-height,1.5)}.next-list-small .next-list-header{font-size:16px;font-size:var(--list-size-s-title-font-size,16px);font-weight:700;font-weight:var(--list-size-s-title-font-weight,bold)}.next-list-small .next-list-footer,.next-list-small .next-list-header{padding:8px 0;padding:var(--list-size-s-item-padding-tb,8px) var(--list-size-s-item-padding-lr,0)}.next-list-small .next-list-item-media{padding-right:8px;padding-right:var(--list-size-s-item-media-margin,8px)}.next-list-small .next-list-item-extra{padding-left:8px;padding-left:var(--list-size-s-item-media-margin,8px)}.next-list-small .next-list-item{font-size:14px;font-size:var(--list-size-s-item-content-font-size,14px);font-weight:400;font-weight:var(--list-size-s-item-title-font-weight,normal);line-height:1.3;line-height:var(--list-size-s-item-content-line-height,1.3);padding:8px 0;padding:var(--list-size-s-item-padding-tb,8px) var(--list-size-s-item-padding-lr,0)}.next-list-small .next-list-item-title{font-size:14px;font-size:var(--list-size-s-item-title-font-size,14px);line-height:1.5;line-height:var(--list-size-s-item-title-line-height,1.5)}.next-list-divider .next-list-item{border-bottom:1px solid #e6e6e6;border-bottom:var(--line-1,1px) solid var(--list-divider-color,#e6e6e6)}.next-list-divider .next-list-item:last-child{border-bottom:none}.next-list[dir=rtl] .next-list-item-media{padding-left:8px;padding-left:var(--list-size-m-item-media-margin,8px);padding-right:0}.next-list[dir=rtl] .next-list-item-extra{padding-right:8px;padding-right:var(--list-size-m-item-media-margin,8px);padding-left:0}.next-list[dir=rtl] .next-list-small .next-list-item-media{padding-left:8px;padding-left:var(--list-size-s-item-media-margin,8px);padding-right:0}.next-list[dir=rtl] .next-list-small .next-list-item-extra{padding-right:8px;padding-right:var(--list-size-s-item-media-margin,8px);padding-left:0}.next-menu-btn{display:inline-block;-webkit-box-shadow:none;box-shadow:none}.next-menu-btn-spacing-tb{padding:0;padding:var(--popup-spacing-tb,0) 0}.next-menu-btn .next-icon{-webkit-transition:-webkit-transform .1s linear;transition:-webkit-transform .1s linear;transition:transform .1s linear;transition:transform .1s linear,-webkit-transform .1s linear}.next-menu-btn .next-menu-btn-arrow:before{content:"";content:var(--menu-btn-fold-icon-content,"\e63d")}.next-menu-btn.next-expand .next-menu-btn-arrow{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.next-menu-btn-symbol-unfold:before{content:"";content:var(--menu-btn-unfold-icon-content,"")}.next-menu-btn.next-btn-normal .next-menu-btn-arrow{color:#999;color:var(--menu-btn-pure-text-normal-icon-color,#999)}.next-menu-btn.next-btn-normal:hover .next-menu-btn-arrow{color:#333;color:var(--btn-pure-normal-color-hover,#333)}.next-menu-btn.next-btn-secondary .next-menu-btn-arrow{color:#209bfa;color:var(--menu-btn-pure-text-secondary-icon-color,#209bfa)}.next-menu-btn.next-btn-secondary:hover .next-menu-btn-arrow{color:#fff;color:var(--btn-pure-secondary-color-hover,#fff)}.next-menu-btn.next-btn-secondary.next-btn-text:hover .next-menu-btn-arrow{color:#209bfa;color:var(--btn-text-secondary-color-hover,#209bfa)}.next-menu-btn.next-btn-primary .next-menu-btn-arrow{color:#fff;color:var(--menu-btn-pure-text-primary-icon-color,#fff)}.next-menu-btn.next-btn-primary:hover .next-menu-btn-arrow{color:#fff;color:var(--btn-pure-primary-color-hover,#fff)}.next-menu-btn.next-btn-text.next-btn-normal .next-menu-btn-arrow{color:#333;color:var(--menu-btn-text-text-normal-icon-color,#333)}.next-menu-btn.next-btn-text.next-btn-normal:hover .next-menu-btn-arrow{color:#209bfa;color:var(--btn-text-normal-color-hover,#209bfa)}.next-menu-btn.next-btn-text.next-btn-primary .next-menu-btn-arrow{color:#298dff;color:var(--menu-btn-text-text-primary-icon-color,#298dff)}.next-menu-btn.next-btn-text.next-btn-primary:hover .next-menu-btn-arrow{color:#1274e7;color:var(--btn-text-primary-color-hover,#1274e7)}.next-menu-btn.next-btn-ghost.next-btn-light .next-menu-btn-arrow{color:#333;color:var(--menu-btn-ghost-light-icon-color,#333)}.next-menu-btn.next-btn-ghost.next-btn-light:hover .next-menu-btn-arrow{color:#999;color:var(--btn-ghost-light-color-hover,#999)}.next-menu-btn.next-btn-ghost.next-btn-dark .next-menu-btn-arrow{color:#fff;color:var(--menu-btn-ghost-dark-icon-color,#fff)}.next-menu-btn.next-btn-ghost.next-btn-dark:hover .next-menu-btn-arrow{color:#fff;color:var(--btn-ghost-dark-color-hover,#fff)}.next-menu-btn.disabled .next-menu-btn-arrow,.next-menu-btn.next-btn-text.disabled .next-menu-btn-arrow,.next-menu-btn.next-btn-text[disabled] .next-menu-btn-arrow,.next-menu-btn[disabled] .next-menu-btn-arrow{color:#ccc;color:var(--menu-btn-disabled-icon-color,#ccc)}.next-menu-btn[disabled].next-btn-ghost.next-btn-dark .next-menu-btn-arrow{color:hsla(0,0%,100%,.4);color:var(--menu-btn-ghost-dark-disabled-icon-color,hsla(0,0%,100%,.4))}.next-menu-btn[disabled].next-btn-ghost.next-btn-light .next-menu-btn-arrow{color:rgba(0,0,0,.1);color:var(--menu-btn-ghost-light-disabled-icon-color,rgba(0,0,0,.1))}.next-nav{min-width:auto;border-radius:0}.next-nav,.next-nav *,.next-nav :after,.next-nav :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-nav-icon.next-icon{margin-right:12px;font-weight:inherit}.next-nav-icon.next-icon .next-icon-remote,.next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav-group-label{height:40px;height:var(--nav-group-height,40px);line-height:40px;line-height:var(--nav-group-height,40px);font-size:14px;font-size:var(--nav-group-font-size,14px)}.next-nav-item .next-menu-item-text>span,.next-nav-item .next-nav-group-label>span{opacity:1;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.next-nav-item .next-menu-item-text>a{text-decoration:none;color:inherit}.next-nav-item.next-focused .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-focused .next-menu-icon-arrow.next-icon,.next-nav-item .next-menu-hoz-icon-arrow.next-icon,.next-nav-item .next-menu-icon-arrow.next-icon,.next-nav-item.next-opened .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-opened .next-menu-icon-arrow.next-icon,.next-nav-item.next-selected .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-selected .next-menu-icon-arrow.next-icon,.next-nav-item:hover .next-menu-hoz-icon-arrow.next-icon,.next-nav-item:hover .next-menu-icon-arrow.next-icon{color:inherit;top:0;-webkit-transform-origin:center 50%;-ms-transform-origin:center 50%;transform-origin:center 50%}.next-nav.next-active .next-nav-item:before{position:absolute;-webkit-transition:all .3s ease;transition:all .3s ease;content:""}.next-nav.next-hoz{padding:0;height:44px;height:calc(var(--nav-hoz-height, 44px) + var(--nav-hoz-item-margin-tb, 0px)*2);line-height:42px;line-height:calc(var(--nav-hoz-height, 44px) - var(--popup-local-border-width, 1px)*2);font-size:14px;font-size:var(--nav-hoz-font-size,14px)}.next-nav.next-hoz .next-menu-item.next-nav-item{margin-left:0;margin-left:var(--nav-hoz-item-margin-lr,0);margin-right:0;margin-right:var(--nav-hoz-item-margin-lr,0);padding:0 20px;padding:0 var(--nav-hoz-item-padding-lr,20px);border-radius:0;border-radius:var(--nav-hoz-item-corner,0)}.next-nav.next-hoz .next-menu-item,.next-nav.next-hoz .next-menu-sub-menu-wrapper>.next-menu-item{margin-top:0;margin-top:var(--nav-hoz-item-margin-tb,0);margin-bottom:0;margin-bottom:var(--nav-hoz-item-margin-tb,0)}.next-nav.next-hoz .next-menu-item-inner{height:42px;height:calc(var(--nav-hoz-height, 44px) - var(--popup-local-border-width, 1px)*2);font-size:14px;font-size:var(--nav-hoz-font-size,14px)}.next-nav.next-hoz .next-nav-group-label .next-menu-item-inner{height:40px;height:var(--nav-group-height,40px);line-height:40px;line-height:var(--nav-group-height,40px);font-size:14px;font-size:var(--nav-group-font-size,14px)}.next-nav.next-hoz .next-menu-header{float:left}.next-nav.next-hoz .next-menu-footer,.next-nav.next-hoz .next-menu-header{height:42px;height:calc(var(--nav-hoz-height, 44px) - var(--popup-local-border-width, 1px)*2)}.next-nav.next-hoz .next-menu-footer{float:right}.next-nav.next-hoz .next-nav-item:before{width:0;left:50%;height:2px;height:var(--nav-hoz-item-selected-active-line,2px)}.next-nav.next-hoz .next-nav-item:hover:before{height:0;height:var(--nav-hoz-item-hover-active-line,0)}.next-nav.next-hoz.next-top .next-nav-item:before{top:-1px;top:calc(0px - var(--popup-local-border-width, 1px))}.next-nav.next-hoz.next-bottom .next-nav-item:before{bottom:-1px;bottom:calc(0px - var(--popup-local-border-width, 1px))}.next-nav.next-hoz .next-selected.next-nav-item:before{width:100%;left:0;height:2px;height:var(--nav-hoz-item-selected-active-line,2px)}.next-nav.next-ver{padding:0;-webkit-transition:width .3s ease;transition:width .3s ease;line-height:52px;line-height:var(--nav-ver-height,52px);font-size:14px;font-size:var(--nav-ver-font-size,14px)}.next-nav.next-ver .next-menu-item.next-nav-item{margin-left:0;margin-left:var(--nav-ver-item-margin-lr,0);margin-right:0;margin-right:var(--nav-ver-item-margin-lr,0);padding:0 16px;padding:0 var(--nav-ver-item-padding-lr,16px);border-radius:0;border-radius:var(--nav-ver-item-corner,0)}.next-nav.next-ver .next-menu-item:not(:first-child),.next-nav.next-ver .next-menu-sub-menu-wrapper:not(:first-child)>.next-menu-item{margin-top:0;margin-top:var(--nav-ver-item-margin-tb,0)}.next-nav.next-ver .next-menu-item:not(:last-child),.next-nav.next-ver .next-menu-sub-menu-wrapper:not(:last-child)>.next-menu-item{margin-bottom:0;margin-bottom:var(--nav-ver-item-margin-tb,0)}.next-nav.next-ver .next-menu-item-inner{height:52px;height:var(--nav-ver-height,52px);font-size:14px;font-size:var(--nav-ver-font-size,14px)}.next-nav.next-ver .next-nav-group-label .next-menu-item-inner{height:40px;height:var(--nav-group-height,40px);line-height:40px;line-height:var(--nav-group-height,40px);font-size:14px;font-size:var(--nav-group-font-size,14px)}.next-nav.next-ver>.next-menu-item:first-child,.next-nav.next-ver>.next-menu-sub-menu-wrapper:first-child>.next-menu-item{margin-top:0;margin-top:var(--nav-ver-item-margin-tb,0)}.next-nav.next-ver>.next-menu-item:last-child,.next-nav.next-ver>.next-menu-sub-menu-wrapper:last-child>.next-menu-item{margin-bottom:0;margin-bottom:var(--nav-ver-item-margin-tb,0)}.next-nav.next-ver .next-menu-sub-menu{line-height:52px;line-height:var(--nav-ver-sub-nav-height,52px)}.next-nav.next-ver .next-menu-sub-menu .next-menu-item-inner{height:52px;height:var(--nav-ver-sub-nav-height,52px);font-size:14px;font-size:var(--nav-ver-sub-nav-font-size,14px)}.next-nav.next-ver .next-nav-item:before{height:0;top:50%;width:2px;width:var(--nav-ver-item-selected-active-line,2px)}.next-nav.next-ver .next-nav-item:hover:before{width:0;width:var(--nav-ver-item-hover-active-line,0)}.next-nav.next-ver.next-left .next-nav-item:before,.next-nav.next-ver.next-top .next-nav-item:before{left:-1px;left:calc(0px - var(--popup-local-border-width, 1px))}.next-nav.next-ver.next-bottom .next-nav-item:before,.next-nav.next-ver.next-right .next-nav-item:before{right:-1px;right:calc(0px - var(--popup-local-border-width, 1px))}.next-nav.next-ver .next-selected.next-nav-item:before{height:100%;top:0;width:2px;width:var(--nav-ver-item-selected-active-line,2px)}.next-nav.next-primary{border-width:0;border-width:var(--nav-primary-border-width,0);background:#222;background:var(--nav-primary-bg-color,#222);border-color:#222;border-color:var(--nav-primary-border-color,#222);color:#ddd;color:var(--nav-primary-text-color,#ddd);font-weight:400;font-weight:var(--nav-primary-text-style,normal);-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--nav-primary-shadow,4px 4px 8px 0 rgba(0,0,0,.12));box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);box-shadow:var(--nav-primary-shadow,4px 4px 8px 0 rgba(0,0,0,.12))}.next-nav.next-primary.next-hoz{line-height:var(--nav-hoz-height,44px);line-height:44px;line-height:calc(var(--nav-hoz-height, 44px) - var(--nav-primary-border-width, 0px)*2)}.next-nav.next-primary.next-hoz .next-menu-footer,.next-nav.next-primary.next-hoz .next-menu-header,.next-nav.next-primary.next-hoz .next-menu-item-inner{line-height:44px;line-height:var(--nav-hoz-height,44px);height:44px;height:calc(var(--nav-hoz-height, 44px) - var(--nav-primary-border-width, 0px)*2)}.next-nav.next-primary.next-hoz.next-top .next-nav-item:before{top:0;top:calc(0px - var(--nav-primary-border-width, 0px))}.next-nav.next-primary.next-hoz.next-bottom .next-nav-item:before{bottom:0;bottom:calc(0px - var(--nav-primary-border-width, 0px))}.next-nav.next-primary.next-ver.next-left .next-nav-item:before{left:0;left:calc(0px - var(--nav-primary-border-width, 0px))}.next-nav.next-primary.next-ver.next-right .next-nav-item:before{right:0;right:calc(0px - var(--nav-primary-border-width, 0px))}.next-nav.next-primary .next-nav-item.next-menu-item{background:#222;background:var(--nav-primary-bg-color,#222);color:#ddd;color:var(--nav-primary-text-color,#ddd)}.next-nav.next-primary .next-nav-item.next-menu-item.next-focused,.next-nav.next-primary .next-nav-item.next-menu-item:hover{background:#333;background:var(--nav-primary-item-hover-bg-color,#333);color:#fff;color:var(--nav-primary-item-hover-text-color,#fff);font-weight:400;font-weight:var(--nav-primary-item-hover-text-style,normal)}.next-nav.next-primary .next-nav-item.next-menu-item.next-selected{background:#333;background:var(--nav-primary-item-selected-bg-color,#333);color:#fff;color:var(--nav-primary-item-selected-text-color,#fff);font-weight:700;font-weight:var(--nav-primary-item-selected-text-style,bold)}.next-nav.next-primary .next-nav-item.next-menu-item.next-opened{background:#222;background:var(--nav-primary-item-opened-bg-color,#222);color:#fff;color:var(--nav-primary-item-opened-text-color,#fff)}.next-nav.next-primary .next-nav-item.next-menu-item.next-child-selected{font-weight:700;font-weight:var(--nav-primary-item-childselected-text-style,bold);background:transparent;background:var(--nav-primary-item-childselected-bg-color,transparent);color:#fff;color:var(--nav-primary-item-childselected-text-color,#fff)}.next-nav.next-primary .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#fff;color:var(--nav-primary-item-opened-text-color,#fff)}.next-nav.next-primary .next-nav-item.next-menu-item.next-child-selected.next-nav-popup{color:#fff;color:var(--nav-primary-item-childselected-text-color,#fff)}.next-nav.next-primary .next-nav-item.next-menu-item:before{background:#209bfa;background:var(--nav-primary-item-selected-active-color,#209bfa)}.next-nav.next-primary .next-nav-item.next-menu-item:hover:before{background:#209bfa;background:var(--nav-primary-item-hover-active-color,#209bfa)}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-opened{background:#222;background:var(--nav-primary-item-opened-bg-color,#222);color:#fff;color:var(--nav-primary-item-opened-text-color,#fff)}.next-nav.next-primary .next-nav-group-label{color:#999;color:var(--nav-primary-group-text-color,#999);font-weight:400;font-weight:var(--nav-primary-group-text-style,normal)}.next-nav.next-primary .next-menu-sub-menu .next-menu-item{background:#151515;background:var(--nav-primary-sub-nav-bg-color,#151515);color:#ddd;color:var(--nav-primary-sub-nav-text-color,#ddd);font-weight:400;font-weight:var(--nav-primary-sub-nav-text-style,normal)}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-primary .next-menu-sub-menu .next-menu-item:hover{background:#333;background:var(--nav-primary-sub-nav-hover-bg-color,#333);color:#ddd;color:var(--nav-primary-sub-nav-hover-text-color,#ddd)}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-selected{background:#333;background:var(--nav-primary-sub-nav-selected-bg-color,#333);color:#fff;color:var(--nav-primary-sub-nav-selected-text-color,#fff)}.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;color:var(--nav-primary-item-disabled-text-color,#ccc);cursor:not-allowed}.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc;color:var(--nav-primary-item-disabled-text-color,#ccc)}.next-nav.next-secondary{border-width:0;border-width:var(--nav-secondary-border-width,0);background:#209bfa;background:var(--nav-secondary-bg-color,#209bfa);border-color:#209bfa;border-color:var(--nav-secondary-border-color,#209bfa);color:#fff;color:var(--nav-secondary-text-color,#fff);font-weight:400;font-weight:var(--nav-secondary-text-style,normal);-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--nav-secondary-shadow,4px 4px 8px 0 rgba(0,0,0,.12));box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);box-shadow:var(--nav-secondary-shadow,4px 4px 8px 0 rgba(0,0,0,.12))}.next-nav.next-secondary.next-hoz{line-height:var(--nav-hoz-height,44px);line-height:44px;line-height:calc(var(--nav-hoz-height, 44px) - var(--nav-secondary-border-width, 0px)*2)}.next-nav.next-secondary.next-hoz .next-menu-footer,.next-nav.next-secondary.next-hoz .next-menu-header,.next-nav.next-secondary.next-hoz .next-menu-item-inner{line-height:44px;line-height:var(--nav-hoz-height,44px);height:44px;height:calc(var(--nav-hoz-height, 44px) - var(--nav-secondary-border-width, 0px)*2)}.next-nav.next-secondary.next-hoz.next-top .next-nav-item:before{top:0;top:calc(0px - var(--nav-secondary-border-width, 0px))}.next-nav.next-secondary.next-hoz.next-bottom .next-nav-item:before{bottom:0;bottom:calc(0px - var(--nav-secondary-border-width, 0px))}.next-nav.next-secondary.next-ver.next-left .next-nav-item:before{left:0;left:calc(0px - var(--nav-secondary-border-width, 0px))}.next-nav.next-secondary.next-ver.next-right .next-nav-item:before{right:0;right:calc(0px - var(--nav-secondary-border-width, 0px))}.next-nav.next-secondary .next-nav-item.next-menu-item{background:#209bfa;background:var(--nav-secondary-bg-color,#209bfa);color:#fff;color:var(--nav-secondary-text-color,#fff)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-focused,.next-nav.next-secondary .next-nav-item.next-menu-item:hover{background:#1274e7;background:var(--nav-secondary-item-hover-bg-color,#1274e7);color:#fff;color:var(--nav-secondary-item-hover-text-color,#fff);font-weight:400;font-weight:var(--nav-secondary-item-hover-text-style,normal)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-selected{background:#1274e7;background:var(--nav-secondary-item-selected-bg-color,#1274e7);color:#fff;color:var(--nav-secondary-item-selected-text-color,#fff);font-weight:700;font-weight:var(--nav-secondary-item-selected-text-style,bold)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-opened{background:transparent;background:var(--nav-secondary-item-opened-bg-color,transparent);color:#fff;color:var(--nav-secondary-item-opened-text-color,#fff)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-child-selected{font-weight:700;font-weight:var(--nav-secondary-item-childselected-text-style,bold);background:transparent;background:var(--nav-secondary-item-childselected-bg-color,transparent);color:#fff;color:var(--nav-secondary-item-childselected-text-color,#fff)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#fff;color:var(--nav-secondary-item-opened-text-color,#fff)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-child-selected.next-nav-popup{color:#fff;color:var(--nav-secondary-item-childselected-text-color,#fff)}.next-nav.next-secondary .next-nav-item.next-menu-item:before{background:#1274e7;background:var(--nav-secondary-item-selected-active-color,#1274e7)}.next-nav.next-secondary .next-nav-item.next-menu-item:hover:before{background:#1274e7;background:var(--nav-secondary-item-hover-active-color,#1274e7)}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;background:var(--nav-secondary-item-opened-bg-color,transparent);color:#fff;color:var(--nav-secondary-item-opened-text-color,#fff)}.next-nav.next-secondary .next-nav-group-label{color:#fff;color:var(--nav-secondary-group-text-color,#fff);font-weight:400;font-weight:var(--nav-secondary-group-text-style,normal)}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item{background:#209bfa;background:var(--nav-secondary-sub-nav-bg-color,#209bfa);color:#fff;color:var(--nav-secondary-sub-nav-text-color,#fff);font-weight:400;font-weight:var(--nav-secondary-sub-nav-text-style,normal)}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-secondary .next-menu-sub-menu .next-menu-item:hover{background:#1274e7;background:var(--nav-secondary-sub-nav-hover-bg-color,#1274e7);color:#fff;color:var(--nav-secondary-sub-nav-hover-text-color,#fff)}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-selected{background:#1274e7;background:var(--nav-secondary-sub-nav-selected-bg-color,#1274e7);color:#fff;color:var(--nav-secondary-sub-nav-selected-text-color,#fff)}.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#add9ff;color:var(--nav-secondary-item-disabled-text-color,#add9ff);cursor:not-allowed}.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#add9ff;color:var(--nav-secondary-item-disabled-text-color,#add9ff)}.next-nav.next-normal{border-color:#eee;border-color:var(--nav-normal-border-color,#eee);font-weight:400;font-weight:var(--nav-normal-text-style,normal);-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--nav-normal-shadow,4px 4px 8px 0 rgba(0,0,0,.12));box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);box-shadow:var(--nav-normal-shadow,4px 4px 8px 0 rgba(0,0,0,.12))}.next-nav.next-normal,.next-nav.next-normal .next-nav-item.next-menu-item{background:#fff;background:var(--nav-normal-bg-color,#fff);color:#666;color:var(--nav-normal-text-color,#666)}.next-nav.next-normal .next-nav-item.next-menu-item.next-focused,.next-nav.next-normal .next-nav-item.next-menu-item:hover{background:#fff;background:var(--nav-normal-item-hover-bg-color,#fff);color:#333;color:var(--nav-normal-item-hover-text-color,#333);font-weight:500;font-weight:var(--nav-normal-item-hover-text-style,500)}.next-nav.next-normal .next-nav-item.next-menu-item.next-selected{background:#e4f3fe;background:var(--nav-normal-item-selected-bg-color,#e4f3fe);color:#209bfa;color:var(--nav-normal-item-selected-text-color,#209bfa);font-weight:700;font-weight:var(--nav-normal-item-selected-text-style,bold)}.next-nav.next-normal .next-nav-item.next-menu-item.next-opened{background:transparent;background:var(--nav-normal-item-opened-bg-color,transparent);color:#333;color:var(--nav-normal-item-opened-text-color,#333)}.next-nav.next-normal .next-nav-item.next-menu-item.next-child-selected{font-weight:400;font-weight:var(--nav-normal-item-childselected-text-style,normal);background:transparent;background:var(--nav-normal-item-childselected-bg-color,transparent);color:#209bfa;color:var(--nav-normal-item-childselected-text-color,#209bfa)}.next-nav.next-normal .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#333;color:var(--nav-normal-item-opened-text-color,#333)}.next-nav.next-normal .next-nav-item.next-menu-item.next-child-selected.next-nav-popup{color:#209bfa;color:var(--nav-normal-item-childselected-text-color,#209bfa)}.next-nav.next-normal .next-nav-item.next-menu-item:before{background:#209bfa;background:var(--nav-normal-item-selected-active-color,#209bfa)}.next-nav.next-normal .next-nav-item.next-menu-item:hover:before{background:#1b84e0;background:var(--nav-normal-item-hover-active-color,#1b84e0)}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;background:var(--nav-normal-item-opened-bg-color,transparent);color:#333;color:var(--nav-normal-item-opened-text-color,#333)}.next-nav.next-normal .next-nav-group-label{color:#999;color:var(--nav-normal-group-text-color,#999);font-weight:400;font-weight:var(--nav-normal-group-text-style,normal)}.next-nav.next-normal .next-menu-sub-menu .next-menu-item{background:#fafafa;background:var(--nav-normal-sub-nav-bg-color,#fafafa);color:#666;color:var(--nav-normal-sub-nav-text-color,#666);font-weight:400;font-weight:var(--nav-normal-sub-nav-text-style,normal)}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-normal .next-menu-sub-menu .next-menu-item:hover{background:#f9f9f9;background:var(--nav-normal-sub-nav-hover-bg-color,#f9f9f9);color:#298dff;color:var(--nav-normal-sub-nav-hover-text-color,#298dff)}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-selected{background:#e4f3fe;background:var(--nav-normal-sub-nav-selected-bg-color,#e4f3fe);color:#209bfa;color:var(--nav-normal-sub-nav-selected-text-color,#209bfa)}.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#999;color:var(--nav-normal-item-disabled-text-color,#999);cursor:not-allowed}.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#999;color:var(--nav-normal-item-disabled-text-color,#999)}.next-nav.next-line{background:transparent;background:var(--nav-line-bg-color,transparent);border-color:#e6e6e6;border-color:var(--nav-line-border-color,#e6e6e6);color:#333;color:var(--nav-line-text-color,#333);font-weight:400;font-weight:var(--nav-line-text-style,normal);-webkit-box-shadow:none;box-shadow:none}.next-nav.next-line.next-hoz{border-right-color:transparent;border-right-color:var(--nav-line-bg-color,transparent)}.next-nav.next-line.next-hoz,.next-nav.next-line.next-ver{border-top-color:transparent;border-top-color:var(--nav-line-bg-color,transparent);border-left-color:transparent;border-left-color:var(--nav-line-bg-color,transparent)}.next-nav.next-line.next-ver{border-bottom-color:transparent;border-bottom-color:var(--nav-line-bg-color,transparent)}.next-nav.next-line .next-nav-item.next-menu-item{background:transparent;background:var(--nav-line-bg-color,transparent);color:#333;color:var(--nav-line-text-color,#333)}.next-nav.next-line .next-nav-item.next-menu-item.next-focused,.next-nav.next-line .next-nav-item.next-menu-item:hover{background:transparent;background:var(--nav-line-item-hover-bg-color,transparent);color:#209bfa;color:var(--nav-line-item-hover-text-color,#209bfa);font-weight:400;font-weight:var(--nav-line-item-hover-text-style,normal)}.next-nav.next-line .next-nav-item.next-menu-item.next-selected{background:transparent;background:var(--nav-line-item-selected-bg-color,transparent);color:#209bfa;color:var(--nav-line-item-selected-text-color,#209bfa);font-weight:700;font-weight:var(--nav-line-item-selected-text-style,bold)}.next-nav.next-line .next-nav-item.next-menu-item.next-opened{background:transparent;background:var(--nav-line-item-opened-bg-color,transparent);color:#209bfa;color:var(--nav-line-item-opened-text-color,#209bfa)}.next-nav.next-line .next-nav-item.next-menu-item.next-child-selected{font-weight:400;font-weight:var(--nav-line-item-childselected-text-style,normal);background:transparent;background:var(--nav-line-item-childselected-bg-color,transparent);color:#209bfa;color:var(--nav-line-item-childselected-text-color,#209bfa)}.next-nav.next-line .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#209bfa;color:var(--nav-line-item-opened-text-color,#209bfa)}.next-nav.next-line .next-nav-item.next-menu-item.next-child-selected.next-nav-popup{color:#209bfa;color:var(--nav-line-item-childselected-text-color,#209bfa)}.next-nav.next-line .next-nav-item.next-menu-item:before{background:#209bfa;background:var(--nav-line-item-selected-active-color,#209bfa)}.next-nav.next-line .next-nav-item.next-menu-item:hover:before{background:#209bfa;background:var(--nav-line-item-hover-active-color,#209bfa)}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;background:var(--nav-line-item-opened-bg-color,transparent);color:#209bfa;color:var(--nav-line-item-opened-text-color,#209bfa)}.next-nav.next-line .next-nav-group-label{color:#999;color:var(--nav-line-group-text-color,#999);font-weight:400;font-weight:var(--nav-line-group-text-style,normal)}.next-nav.next-line .next-menu-sub-menu .next-menu-item{background:transparent;background:var(--nav-line-sub-nav-bg-color,transparent);color:#333;color:var(--nav-line-sub-nav-text-color,#333);font-weight:400;font-weight:var(--nav-line-sub-nav-text-style,normal)}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-line .next-menu-sub-menu .next-menu-item:hover{background:transparent;background:var(--nav-line-sub-nav-hover-bg-color,transparent);color:#209bfa;color:var(--nav-line-sub-nav-hover-text-color,#209bfa)}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-selected{background:transparent;background:var(--nav-line-sub-nav-selected-bg-color,transparent);color:#209bfa;color:var(--nav-line-sub-nav-selected-text-color,#209bfa)}.next-nav.next-line .next-nav-item.next-menu-item.next-disabled,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#999;color:var(--nav-line-item-disabled-text-color,#999);cursor:not-allowed}.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#999;color:var(--nav-line-item-disabled-text-color,#999)}.next-nav.next-icon-only.next-custom-icon-only-width{text-align:center}.next-nav.next-icon-only .next-menu-item-inner{text-overflow:clip}.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon{margin-left:2px;margin-left:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px) - var(--popup-local-border-width, 1px));margin-right:2px;margin-right:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px) - var(--popup-local-border-width, 1px))}.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon{margin-left:3px;margin-left:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px) - var(--nav-primary-border-width, 0px));margin-right:3px;margin-right:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px) - var(--nav-primary-border-width, 0px))}.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon{margin-left:3px;margin-left:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px) - var(--nav-secondary-border-width, 0px));margin-right:3px;margin-right:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px) - var(--nav-secondary-border-width, 0px))}.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon{margin-left:3px;margin-left:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px));margin-right:3px;margin-right:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px));-webkit-transition:all .1s linear;transition:all .1s linear;-webkit-transform-origin:center 50%;-ms-transform-origin:center 50%;transform-origin:center 50%}.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon .next-icon-remote,.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);margin-left:3px;margin-left:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px));margin-right:3px;margin-right:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px))}.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down .next-icon-remote,.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-nav.next-icon-only .next-nav-item.next-selected .next-nav-icon.next-icon{-webkit-animation:pulse .3s cubic-bezier(.23,1,.32,1);animation:pulse .3s cubic-bezier(.23,1,.32,1)}.next-nav.next-icon-only .next-menu-hoz-icon-arrow,.next-nav.next-icon-only .next-menu-icon-arrow{display:none}.next-nav-embeddable.next-normal,.next-nav-embeddable.next-primary,.next-nav-embeddable.next-secondary{height:100%;background:transparent;-webkit-box-shadow:none;box-shadow:none;border:none}.next-nav-embeddable.next-normal .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-normal .next-nav-item.next-menu-item,.next-nav-embeddable.next-primary .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-primary .next-nav-item.next-menu-item,.next-nav-embeddable.next-secondary .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-secondary .next-nav-item.next-menu-item{background:transparent}.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon{margin-left:3px;margin-left:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px));margin-right:3px;margin-right:calc(29px - var(--nav-icon-only-font-size, 20px)/2 - var(--nav-ver-item-padding-lr, 16px))}.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon:before,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon:before,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-nav-embeddable.next-nav.next-hoz .next-menu-item-inner,.next-nav-embeddable.next-nav.next-hoz .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-nav.next-hoz .next-nav-item.next-menu-item{height:100%}.next-nav-embeddable,.next-nav-embeddable .next-nav-item.next-disabled,.next-nav-embeddable .next-nav-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-nav[dir=rtl] .next-nav-icon.next-icon{margin-left:12px;margin-right:0}.next-nav[dir=rtl] .next-nav-icon.next-icon .next-icon-remote,.next-nav[dir=rtl] .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav[dir=rtl].next-hoz .next-menu-header{float:right}.next-nav[dir=rtl].next-hoz .next-menu-footer{float:left}.next-nav[dir=rtl].next-hoz .next-nav-item:before{width:0;left:50%}.next-nav[dir=rtl].next-hoz .next-selected.next-nav-item:before{width:100%;left:auto;right:0}.next-nav[dir=rtl].next-ver.next-left .next-nav-item:before{right:0;right:-1px;right:calc(0px - var(--popup-local-border-width, 1px));left:auto}.next-nav[dir=rtl].next-ver.next-right .next-nav-item:before{left:0;left:-1px;left:calc(0px - var(--popup-local-border-width, 1px));right:auto}.next-nav[dir=rtl].next-primary.next-ver.next-left .next-nav-item:before{right:0;right:calc(0px - var(--nav-primary-border-width, 0px));left:auto}.next-nav[dir=rtl].next-primary.next-ver.next-right .next-nav-item:before{left:0;left:calc(0px - var(--nav-primary-border-width, 0px));right:auto}.next-nav[dir=rtl].next-secondary.next-ver.next-left .next-nav-item:before{right:0;right:calc(0px - var(--nav-secondary-border-width, 0px));left:auto}.next-nav[dir=rtl].next-secondary.next-ver.next-right .next-nav-item:before{left:0;left:calc(0px - var(--nav-secondary-border-width, 0px));right:auto}.next-nav[dir=rtl] .next-nav.next-line.next-ver{border-top-color:transparent;border-top-color:var(--nav-line-bg-color,transparent);border-right-color:transparent;border-right-color:var(--nav-line-bg-color,transparent);border-left-color:transparent;border-bottom-color:transparent;border-bottom-color:var(--nav-line-bg-color,transparent)}.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down{margin-left:0;margin-right:-1px;margin-right:calc(9px - var(--nav-icon-only-font-size, 20px)/2)}.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon:before,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon:before,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down:before{width:20px;width:var(--nav-icon-only-font-size,20px);font-size:20px;font-size:var(--nav-icon-only-font-size,20px);line-height:inherit}.next-number-picker{display:inline-block}.next-number-picker,.next-number-picker *,.next-number-picker :after,.next-number-picker :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-number-picker .next-btn{padding:0!important;line-height:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.next-number-picker-normal .next-input{width:100%}.next-number-picker-normal .next-input .next-input-control{padding-right:0;height:100%}.next-number-picker-normal:not(.next-number-picker-no-trigger) .next-input input{padding-right:2px}.next-number-picker-normal .next-btn{display:block}.next-number-picker-normal .next-btn:hover{z-index:1}.next-number-picker-normal .next-btn:first-child{border-right:none;border-top:none;height:50%;border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.next-number-picker-normal .next-btn:last-child{border-right:none;border-bottom:none;margin-top:-1px;height:calc(50% + 1px);border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0}.next-number-picker-normal .next-number-picker-handler{-webkit-transition:opacity .1s linear;transition:opacity .1s linear;height:100%;display:block}.next-number-picker-normal:not(.next-number-picker-show-trigger) .next-number-picker-handler{opacity:0}.next-number-picker-normal.hover .next-number-picker-handler,.next-number-picker-normal:hover .next-number-picker-handler{opacity:1}.next-number-picker-normal .next-input.next-disabled .next-number-picker-handler{opacity:0}.next-number-picker-normal .next-number-picker-up-icon:before{content:"";content:var(--number-picker-normal-up-icon,"\e625")}.next-number-picker-normal .next-number-picker-down-icon:before{content:"";content:var(--number-picker-normal-down-icon,"\e63d")}.next-number-picker-normal.next-small{width:68px}.next-number-picker-normal.next-small .next-btn{width:20px;width:var(--number-picker-normal-s-button-width,20px)}.next-number-picker-normal.next-small .next-btn:first-child{border-top-right-radius:3px;border-top-right-radius:var(--form-element-small-corner,3px)}.next-number-picker-normal.next-small .next-btn:last-child{border-bottom-right-radius:3px;border-bottom-right-radius:var(--form-element-small-corner,3px)}.next-number-picker-normal.next-small .next-icon .next-icon-remote,.next-number-picker-normal.next-small .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-small .next-icon{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-small .next-icon:before{width:16px;font-size:16px}}.next-number-picker-normal.next-medium{width:80px;width:var(--number-picker-normal-m-input-width,80px)}.next-number-picker-normal.next-medium .next-btn{width:20px;width:var(--number-picker-normal-m-button-width,20px)}.next-number-picker-normal.next-medium .next-btn:first-child{border-top-right-radius:3px;border-top-right-radius:var(--form-element-medium-corner,3px)}.next-number-picker-normal.next-medium .next-btn:last-child{border-bottom-right-radius:3px;border-bottom-right-radius:var(--form-element-medium-corner,3px)}.next-number-picker-normal.next-medium .next-icon .next-icon-remote,.next-number-picker-normal.next-medium .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-medium .next-icon{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-medium .next-icon:before{width:16px;font-size:16px}}.next-number-picker-normal.next-large{width:80px;width:var(--number-picker-normal-l-input-width,80px)}.next-number-picker-normal.next-large .next-btn{width:20px;width:var(--number-picker-normal-l-button-width,20px)}.next-number-picker-normal.next-large .next-btn:first-child{border-top-right-radius:3px;border-top-right-radius:var(--form-element-large-corner,3px)}.next-number-picker-normal.next-large .next-btn:last-child{border-bottom-right-radius:3px;border-bottom-right-radius:var(--form-element-large-corner,3px)}.next-number-picker-normal.next-large .next-icon .next-icon-remote,.next-number-picker-normal.next-large .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-large .next-icon{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-large .next-icon:before{width:16px;font-size:16px}}.next-number-picker-inline input{text-align:center}.next-number-picker-inline .next-input input{padding:0}.next-number-picker-inline .next-number-picker-add-icon:before{content:"";content:var(--number-picker-inline-add-icon,"\e655")}.next-number-picker-inline .next-number-picker-minus-icon:before{content:"";content:var(--number-picker-inline-minus-icon,"\e601")}.next-number-picker-inline.next-small{width:68px;min-width:72px;min-width:calc(var(--form-element-small-height, 24px)*3)}.next-number-picker-inline.next-small .next-icon .next-icon-remote,.next-number-picker-inline.next-small .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-small .next-btn{height:24px;height:var(--form-element-small-height,24px)}.next-number-picker-inline.next-small .next-before .next-btn{margin-right:2px;margin-right:var(--number-picker-inline-s-button-margin,2px);border-top-left-radius:3px;border-top-left-radius:var(--number-picker-inline-s-button-corner,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--number-picker-inline-s-button-corner,3px)}.next-number-picker-inline.next-small .next-after .next-btn{margin-left:2px;margin-left:var(--number-picker-inline-s-button-margin,2px);border-top-right-radius:3px;border-top-right-radius:var(--number-picker-inline-s-button-corner,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--number-picker-inline-s-button-corner,3px)}.next-number-picker-inline.next-medium{width:100px;width:var(--number-picker-inline-m-input-width,100px);min-width:96px;min-width:calc(var(--form-element-medium-height, 32px)*3)}.next-number-picker-inline.next-medium .next-icon .next-icon-remote,.next-number-picker-inline.next-medium .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-medium .next-btn{height:32px;height:var(--form-element-medium-height,32px)}.next-number-picker-inline.next-medium .next-before .next-btn{margin-right:2px;margin-right:var(--number-picker-inline-m-button-margin,2px);border-top-left-radius:3px;border-top-left-radius:var(--number-picker-inline-m-button-corner,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--number-picker-inline-m-button-corner,3px)}.next-number-picker-inline.next-medium .next-after .next-btn{margin-left:2px;margin-left:var(--number-picker-inline-m-button-margin,2px);border-top-right-radius:3px;border-top-right-radius:var(--number-picker-inline-m-button-corner,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--number-picker-inline-m-button-corner,3px)}.next-number-picker-inline.next-large{width:128px;width:var(--number-picker-inline-l-input-width,128px);min-width:120px;min-width:calc(var(--form-element-large-height, 40px)*3)}.next-number-picker-inline.next-large .next-icon .next-icon-remote,.next-number-picker-inline.next-large .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-large .next-btn{height:40px;height:var(--form-element-large-height,40px)}.next-number-picker-inline.next-large .next-before .next-btn{margin-right:2px;margin-right:var(--number-picker-inline-l-button-margin,2px);border-top-left-radius:3px;border-top-left-radius:var(--number-picker-inline-l-button-corner,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--number-picker-inline-l-button-corner,3px)}.next-number-picker-inline.next-large .next-after .next-btn{margin-left:2px;margin-left:var(--number-picker-inline-l-button-margin,2px);border-top-right-radius:3px;border-top-right-radius:var(--number-picker-inline-l-button-corner,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--number-picker-inline-l-button-corner,3px)}.next-number-picker-inline .next-btn.next-small{width:24px;width:var(--form-element-small-height,24px)}.next-number-picker-inline .next-btn.next-medium{width:32px;width:var(--form-element-medium-height,32px)}.next-number-picker-inline .next-btn.next-large{width:40px;width:var(--form-element-large-height,40px)}@-moz-document url-prefix(){.next-number-picker-normal.next-small .next-number-picker-handler{height:22px;height:calc(var(--form-element-small-height, 24px) - 2px)}.next-number-picker-normal.next-medium .next-number-picker-handler{height:30px;height:calc(var(--form-element-medium-height, 32px) - 2px)}.next-number-picker-normal.next-large .next-number-picker-handler{height:38px;height:calc(var(--form-element-large-height, 40px) - 2px)}}.next-number-picker-normal[dir=rtl] .next-btn:first-child{border-right:1px solid #ddd;border-right:1px solid var(--color-line1-3,#ddd);border-left:0;border-top-right-radius:0}.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-small{border-top-left-radius:3px;border-top-left-radius:var(--form-element-small-corner,3px)}.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-medium{border-top-left-radius:3px;border-top-left-radius:var(--form-element-medium-corner,3px)}.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-large{border-top-left-radius:3px;border-top-left-radius:var(--form-element-large-corner,3px)}.next-number-picker-normal[dir=rtl] .next-btn:last-child{border-right:1px solid #ddd;border-right:1px solid var(--color-line1-3,#ddd);border-left:0;border-bottom-right-radius:0}.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-small{border-bottom-left-radius:3px;border-bottom-left-radius:var(--form-element-small-corner,3px)}.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-medium{border-bottom-left-radius:3px;border-bottom-left-radius:var(--form-element-medium-corner,3px)}.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-large{border-bottom-left-radius:3px;border-bottom-left-radius:var(--form-element-large-corner,3px)}.next-number-picker-normal[dir=rtl] .next-input .next-input-control{padding-left:0}.next-number-picker-inline[dir=rtl] .next-before .next-btn{margin-right:0}.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-small{margin-left:2px;margin-left:var(--number-picker-inline-s-button-margin,2px);border-top-right-radius:3px!important;border-top-right-radius:var(--number-picker-inline-s-button-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--number-picker-inline-s-button-corner,3px)!important}.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-medium{margin-left:2px;margin-left:var(--number-picker-inline-m-button-margin,2px);border-top-right-radius:3px!important;border-top-right-radius:var(--number-picker-inline-m-button-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--number-picker-inline-m-button-corner,3px)!important}.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-large{margin-left:2px;margin-left:var(--number-picker-inline-l-button-margin,2px);border-top-right-radius:3px!important;border-top-right-radius:var(--number-picker-inline-l-button-corner,3px)!important;border-bottom-right-radius:3px!important;border-bottom-right-radius:var(--number-picker-inline-l-button-corner,3px)!important}.next-number-picker-inline[dir=rtl] .next-after .next-btn{margin-left:0}.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-small{margin-right:2px;margin-right:var(--number-picker-inline-s-button-margin,2px);border-top-left-radius:3px!important;border-top-left-radius:var(--number-picker-inline-s-button-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--number-picker-inline-s-button-corner,3px)!important}.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-medium{margin-right:2px;margin-right:var(--number-picker-inline-m-button-margin,2px);border-top-left-radius:3px!important;border-top-left-radius:var(--number-picker-inline-m-button-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--number-picker-inline-m-button-corner,3px)!important}.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-large{margin-right:2px;margin-right:var(--number-picker-inline-l-button-margin,2px);border-top-left-radius:3px!important;border-top-left-radius:var(--number-picker-inline-l-button-corner,3px)!important;border-bottom-left-radius:3px!important;border-bottom-left-radius:var(--number-picker-inline-l-button-corner,3px)!important}.next-pagination[dir=rtl] .next-pagination-total{margin-right:0;margin-left:16px}.next-pagination[dir=rtl] .next-pagination-jump-go{margin-left:0;margin-right:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-title{margin-right:0;margin-left:4px;margin-left:var(--pagination-size-selector-title-margin-right,4px)}.next-pagination[dir=rtl] .next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:none;border-right:1px solid #e6e6e6;border-right:var(--line-1,1px) solid var(--color-line1-2,#e6e6e6)}.next-pagination[dir=rtl] .next-pagination-pages+.next-pagination-size-selector,.next-pagination[dir=rtl] .next-pagination-size-selector+.next-pagination-pages{margin-left:0;margin-right:40px}.next-pagination[dir=rtl].next-start .next-pagination-pages{float:left}.next-pagination[dir=rtl].next-end .next-pagination-pages,.next-pagination[dir=rtl].next-start .next-pagination-size-selector{float:right}.next-pagination[dir=rtl].next-end .next-pagination-size-selector{float:left}.next-pagination[dir=rtl].next-small .next-pagination-list{margin:0 4px;margin:0 var(--pagination-small-item-split,4px)}.next-pagination[dir=rtl].next-small .next-pagination-total{line-height:24px;line-height:var(--form-element-small-height,24px);vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-item{padding:0 6px;border-width:1px;border-width:var(--pagination-small-item-border-width,1px);border-radius:3px;border-radius:var(--pagination-small-item-corner,3px)}.next-pagination[dir=rtl].next-small .next-pagination-item+.next-pagination-item{margin:0 4px 0 0;margin:0 var(--pagination-small-item-split,4px) 0 0}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis{height:24px;height:var(--form-element-small-height,24px);line-height:24px;line-height:var(--form-element-small-height,24px);margin-left:8px;margin-left:var(--pagination-ellipsis-margin,8px);margin-right:8px;margin-right:var(--pagination-ellipsis-margin,8px)}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-small .next-pagination-ellipsis:before{width:12px;width:var(--pagination-small-ellipsis-size,12px);font-size:12px;font-size:var(--pagination-small-ellipsis-size,12px);line-height:inherit}.next-pagination[dir=rtl].next-small .next-pagination-display{font-size:12px;font-size:var(--pagination-small-total-font-size,12px)}.next-pagination[dir=rtl].next-small .next-pagination-display em{font-size:12px;font-size:var(--pagination-small-current-font-size,12px)}.next-pagination[dir=rtl].next-small .next-pagination-jump-text{font-size:12px;font-size:var(--pagination-small-jump-font-size,12px)}.next-pagination[dir=rtl].next-small .next-pagination-jump-input{width:28px;width:var(--pagination-small-input-width,28px)}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-title{height:24px;height:var(--form-element-small-height,24px);line-height:24px;line-height:var(--form-element-small-height,24px);font-size:12px;font-size:var(--pagination-small-jump-font-size,12px);vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-btn{padding:0 8px;padding:0 var(--pagination-small-size-selector-number-padding,8px)}.next-pagination[dir=rtl].next-small .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item.next-prev:not([disabled]) i{color:#666;color:var(--pagination-arrow-color,#666)}.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333;color:var(--pagination-arrow-hover-color,#333)}.next-pagination[dir=rtl].next-medium .next-pagination-list{margin:0 4px;margin:0 var(--pagination-item-split,4px)}.next-pagination[dir=rtl].next-medium .next-pagination-total{line-height:32px;line-height:var(--form-element-medium-height,32px);vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-item{padding:0 10px;border-width:1px;border-width:var(--pagination-item-border-width,1px);border-radius:3px;border-radius:var(--pagination-item-corner,3px)}.next-pagination[dir=rtl].next-medium .next-pagination-item+.next-pagination-item{margin:0 4px 0 0;margin:0 var(--pagination-item-split,4px) 0 0}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis{height:32px;height:var(--form-element-medium-height,32px);line-height:32px;line-height:var(--form-element-medium-height,32px);margin-left:8px;margin-left:var(--pagination-ellipsis-margin,8px);margin-right:8px;margin-right:var(--pagination-ellipsis-margin,8px)}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis:before{width:12px;width:var(--pagination-ellipsis-size,12px);font-size:12px;font-size:var(--pagination-ellipsis-size,12px);line-height:inherit}.next-pagination[dir=rtl].next-medium .next-pagination-display{font-size:14px;font-size:var(--pagination-total-font-size,14px)}.next-pagination[dir=rtl].next-medium .next-pagination-display em{font-size:14px;font-size:var(--pagination-current-font-size,14px)}.next-pagination[dir=rtl].next-medium .next-pagination-jump-text{font-size:14px;font-size:var(--pagination-jump-font-size,14px)}.next-pagination[dir=rtl].next-medium .next-pagination-jump-input{width:36px;width:var(--pagination-input-width,36px)}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-title{height:32px;height:var(--form-element-medium-height,32px);line-height:32px;line-height:var(--form-element-medium-height,32px);font-size:14px;font-size:var(--pagination-jump-font-size,14px);vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-btn{padding:0 12px;padding:0 var(--pagination-size-selector-number-padding,12px)}.next-pagination[dir=rtl].next-medium .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item.next-prev:not([disabled]) i{color:#666;color:var(--pagination-arrow-color,#666)}.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333;color:var(--pagination-arrow-hover-color,#333)}.next-pagination[dir=rtl].next-large .next-pagination-list{margin:0 8px;margin:0 var(--pagination-large-item-split,8px)}.next-pagination[dir=rtl].next-large .next-pagination-total{line-height:40px;line-height:var(--form-element-large-height,40px);vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-item{padding:0 15px;border-width:1px;border-width:var(--pagination-large-item-border-width,1px);border-radius:3px;border-radius:var(--pagination-large-item-corner,3px)}.next-pagination[dir=rtl].next-large .next-pagination-item+.next-pagination-item{margin:0 8px 0 0;margin:0 var(--pagination-large-item-split,8px) 0 0}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis{height:40px;height:var(--form-element-large-height,40px);line-height:40px;line-height:var(--form-element-large-height,40px);margin-left:8px;margin-left:var(--pagination-ellipsis-margin,8px);margin-right:8px;margin-right:var(--pagination-ellipsis-margin,8px)}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-large .next-pagination-ellipsis:before{width:16px;width:var(--pagination-large-ellipsis-size,16px);font-size:16px;font-size:var(--pagination-large-ellipsis-size,16px);line-height:inherit}.next-pagination[dir=rtl].next-large .next-pagination-display{font-size:16px;font-size:var(--pagination-large-total-font-size,16px)}.next-pagination[dir=rtl].next-large .next-pagination-display em{font-size:16px;font-size:var(--pagination-large-current-font-size,16px)}.next-pagination[dir=rtl].next-large .next-pagination-jump-text{font-size:16px;font-size:var(--pagination-large-jump-font-size,16px)}.next-pagination[dir=rtl].next-large .next-pagination-jump-input{width:48px;width:var(--pagination-large-input-width,48px)}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-title{height:40px;height:var(--form-element-large-height,40px);line-height:40px;line-height:var(--form-element-large-height,40px);font-size:16px;font-size:var(--pagination-large-jump-font-size,16px);vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-btn{padding:0 16px;padding:0 var(--pagination-large-size-selector-number-padding,16px)}.next-pagination[dir=rtl].next-large .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item.next-prev:not([disabled]) i{color:#666;color:var(--pagination-arrow-color,#666)}.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333;color:var(--pagination-arrow-hover-color,#333)}.next-pagination{font-size:0}.next-pagination,.next-pagination *,.next-pagination :after,.next-pagination :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-pagination:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-pagination-total{display:inline-block;font-size:14px;font-size:var(--font-size-body-2,14px);margin-right:16px}.next-pagination-pages{display:inline-block}.next-pagination-list{display:inline-block;vertical-align:top}.next-pagination .next-pagination-item:not([disabled]){display:inline-block;border-style:solid;border-style:var(--pagination-item-border-style,solid);border-color:#ddd;border-color:var(--pagination-item-border-color,#ddd);background:#fff;background:var(--pagination-item-bg,#fff);color:#333;color:var(--pagination-item-color,#333);-webkit-box-shadow:none;-webkit-box-shadow:var(--pagination-item-shadow,none);box-shadow:none;box-shadow:var(--pagination-item-shadow,none)}.next-pagination .next-pagination-item{-webkit-transition:none;transition:none}.next-pagination .next-pagination-item.next-current{border-color:#209bfa;border-color:var(--pagination-item-current-border-color,#209bfa);background:#209bfa;background:var(--pagination-item-current-bg,#209bfa);color:#fff;color:var(--pagination-item-current-color,#fff);-webkit-box-shadow:none;-webkit-box-shadow:var(--pagination-item-current-shadow,none);box-shadow:none;box-shadow:var(--pagination-item-current-shadow,none)}.next-pagination .next-pagination-item.next-current:focus,.next-pagination .next-pagination-item.next-current:hover{border-color:#209bfa;border-color:var(--pagination-item-current-hover-border-color,#209bfa);background:#fff;background:var(--pagination-item-current-hover-bg,#fff);color:#209bfa;color:var(--pagination-item-current-hover-color,#209bfa);-webkit-box-shadow:none;-webkit-box-shadow:var(--pagination-item-current-hover-shadow,none);box-shadow:none;box-shadow:var(--pagination-item-current-hover-shadow,none)}.next-pagination-ellipsis{display:inline-block;color:#999;color:var(--pagination-ellipsis-color,#999);vertical-align:top}.next-pagination-display{display:inline-block;margin:0 16px;color:#333;color:var(--pagination-total-color,#333);vertical-align:middle}.next-pagination-display em{font-style:normal;color:#209bfa;color:var(--pagination-current-color,#209bfa)}.next-pagination-jump-text{display:inline-block;vertical-align:middle;color:#999;color:var(--pagination-jump-color,#999)}.next-pagination-jump-input{margin:0 4px;margin:0 var(--pagination-input-margin,4px);vertical-align:top}.next-pagination-jump-go{margin-left:4px;vertical-align:top}.next-pagination-size-selector{display:inline-block;position:relative}.next-pagination-size-selector-title{margin-right:4px;margin-right:var(--pagination-size-selector-title-margin-right,4px);color:#999;color:var(--pagination-size-selector-title-color,#999)}.next-pagination-size-selector-filter{display:inline-block;vertical-align:middle}.next-pagination-size-selector-dropdown{vertical-align:top;min-width:64px}.next-pagination-size-selector-dropdown .next-select-inner,.next-pagination-size-selector-popup{min-width:64px}.next-pagination-size-selector-btn.next-btn-text{height:auto;line-height:normal;color:#666;color:var(--pagination-size-selector-filter-color,#666);border-radius:0}.next-pagination-size-selector-btn.next-btn-text.next-current{color:#209bfa;color:var(--pagination-size-selector-filter-current-color,#209bfa)}.next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:1px solid #e6e6e6;border-left:var(--line-1,1px) solid var(--color-line1-2,#e6e6e6)}.next-pagination-pages+.next-pagination-size-selector,.next-pagination-size-selector+.next-pagination-pages{margin-left:40px}.next-pagination.next-hide{display:none}.next-pagination.next-start .next-pagination-pages{float:right}.next-pagination.next-end .next-pagination-pages,.next-pagination.next-start .next-pagination-size-selector{float:left}.next-pagination.next-end .next-pagination-size-selector{float:right}.next-pagination.next-small .next-pagination-list{margin:0 4px;margin:0 var(--pagination-small-item-split,4px)}.next-pagination.next-small .next-pagination-total{line-height:24px;line-height:var(--form-element-small-height,24px);vertical-align:middle}.next-pagination.next-small .next-pagination-item{padding:0 6px;padding:0 var(--pagination-small-item-padding,6px);border-width:1px;border-width:var(--pagination-small-item-border-width,1px);border-radius:3px;border-radius:var(--pagination-small-item-corner,3px)}.next-pagination.next-small .next-pagination-item+.next-pagination-item{margin:0 0 0 4px;margin:0 0 0 var(--pagination-small-item-split,4px)}.next-pagination.next-small .next-pagination-ellipsis{height:24px;height:var(--form-element-small-height,24px);line-height:24px;line-height:var(--form-element-small-height,24px);margin-left:8px;margin-left:var(--pagination-ellipsis-margin,8px);margin-right:8px;margin-right:var(--pagination-ellipsis-margin,8px)}.next-pagination.next-small .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-small .next-pagination-ellipsis:before{width:12px;width:var(--pagination-small-ellipsis-size,12px);font-size:12px;font-size:var(--pagination-small-ellipsis-size,12px);line-height:inherit}.next-pagination.next-small .next-pagination-display{font-size:12px;font-size:var(--pagination-small-total-font-size,12px)}.next-pagination.next-small .next-pagination-display em{font-size:12px;font-size:var(--pagination-small-current-font-size,12px)}.next-pagination.next-small .next-pagination-jump-text{font-size:12px;font-size:var(--pagination-small-jump-font-size,12px)}.next-pagination.next-small .next-pagination-jump-input{width:28px;width:var(--pagination-small-input-width,28px)}.next-pagination.next-small .next-pagination-size-selector-title{height:24px;height:var(--form-element-small-height,24px);line-height:24px;line-height:var(--form-element-small-height,24px);font-size:12px;font-size:var(--pagination-small-jump-font-size,12px);vertical-align:middle}.next-pagination.next-small .next-pagination-size-selector-btn{padding:0 8px;padding:0 var(--pagination-small-size-selector-number-padding,8px)}.next-pagination.next-small .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-small .next-pagination-item.next-prev:not([disabled]) i{color:#666;color:var(--pagination-arrow-color,#666)}.next-pagination.next-small .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-small .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333;color:var(--pagination-arrow-hover-color,#333)}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-no-border .next-pagination-item.next-next,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.next-pagination.next-small.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-small.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa;color:var(--pagination-arrow-hover-color-noboder,#209bfa)}.next-pagination.next-small.next-no-border .next-pagination-display{margin:0 8px}.next-pagination.next-small.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-small.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-medium .next-pagination-list{margin:0 4px;margin:0 var(--pagination-item-split,4px)}.next-pagination.next-medium .next-pagination-total{line-height:32px;line-height:var(--form-element-medium-height,32px);vertical-align:middle}.next-pagination.next-medium .next-pagination-item{padding:0 10px;padding:0 var(--pagination-item-padding,10px);border-width:1px;border-width:var(--pagination-item-border-width,1px);border-radius:3px;border-radius:var(--pagination-item-corner,3px)}.next-pagination.next-medium .next-pagination-item+.next-pagination-item{margin:0 0 0 4px;margin:0 0 0 var(--pagination-item-split,4px)}.next-pagination.next-medium .next-pagination-ellipsis{height:32px;height:var(--form-element-medium-height,32px);line-height:32px;line-height:var(--form-element-medium-height,32px);margin-left:8px;margin-left:var(--pagination-ellipsis-margin,8px);margin-right:8px;margin-right:var(--pagination-ellipsis-margin,8px)}.next-pagination.next-medium .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-medium .next-pagination-ellipsis:before{width:12px;width:var(--pagination-ellipsis-size,12px);font-size:12px;font-size:var(--pagination-ellipsis-size,12px);line-height:inherit}.next-pagination.next-medium .next-pagination-display{font-size:14px;font-size:var(--pagination-total-font-size,14px)}.next-pagination.next-medium .next-pagination-display em{font-size:14px;font-size:var(--pagination-current-font-size,14px)}.next-pagination.next-medium .next-pagination-jump-text{font-size:14px;font-size:var(--pagination-jump-font-size,14px)}.next-pagination.next-medium .next-pagination-jump-input{width:36px;width:var(--pagination-input-width,36px)}.next-pagination.next-medium .next-pagination-size-selector-title{height:32px;height:var(--form-element-medium-height,32px);line-height:32px;line-height:var(--form-element-medium-height,32px);font-size:14px;font-size:var(--pagination-jump-font-size,14px);vertical-align:middle}.next-pagination.next-medium .next-pagination-size-selector-btn{padding:0 12px;padding:0 var(--pagination-size-selector-number-padding,12px)}.next-pagination.next-medium .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-medium .next-pagination-item.next-prev:not([disabled]) i{color:#666;color:var(--pagination-arrow-color,#666)}.next-pagination.next-medium .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-medium .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333;color:var(--pagination-arrow-hover-color,#333)}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa;color:var(--pagination-arrow-hover-color-noboder,#209bfa)}.next-pagination.next-medium.next-no-border .next-pagination-display{margin:0 12px}.next-pagination.next-medium.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-medium.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-large .next-pagination-list{margin:0 8px;margin:0 var(--pagination-large-item-split,8px)}.next-pagination.next-large .next-pagination-total{line-height:40px;line-height:var(--form-element-large-height,40px);vertical-align:middle}.next-pagination.next-large .next-pagination-item{padding:0 15px;padding:0 var(--pagination-large-item-padding,15px);border-width:1px;border-width:var(--pagination-large-item-border-width,1px);border-radius:3px;border-radius:var(--pagination-large-item-corner,3px)}.next-pagination.next-large .next-pagination-item+.next-pagination-item{margin:0 0 0 8px;margin:0 0 0 var(--pagination-large-item-split,8px)}.next-pagination.next-large .next-pagination-ellipsis{height:40px;height:var(--form-element-large-height,40px);line-height:40px;line-height:var(--form-element-large-height,40px);margin-left:8px;margin-left:var(--pagination-ellipsis-margin,8px);margin-right:8px;margin-right:var(--pagination-ellipsis-margin,8px)}.next-pagination.next-large .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-large .next-pagination-ellipsis:before{width:16px;width:var(--pagination-large-ellipsis-size,16px);font-size:16px;font-size:var(--pagination-large-ellipsis-size,16px);line-height:inherit}.next-pagination.next-large .next-pagination-display{font-size:16px;font-size:var(--pagination-large-total-font-size,16px)}.next-pagination.next-large .next-pagination-display em{font-size:16px;font-size:var(--pagination-large-current-font-size,16px)}.next-pagination.next-large .next-pagination-jump-text{font-size:16px;font-size:var(--pagination-large-jump-font-size,16px)}.next-pagination.next-large .next-pagination-jump-input{width:48px;width:var(--pagination-large-input-width,48px)}.next-pagination.next-large .next-pagination-size-selector-title{height:40px;height:var(--form-element-large-height,40px);line-height:40px;line-height:var(--form-element-large-height,40px);font-size:16px;font-size:var(--pagination-large-jump-font-size,16px);vertical-align:middle}.next-pagination.next-large .next-pagination-size-selector-btn{padding:0 16px;padding:0 var(--pagination-large-size-selector-number-padding,16px)}.next-pagination.next-large .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-large .next-pagination-item.next-prev:not([disabled]) i{color:#666;color:var(--pagination-arrow-color,#666)}.next-pagination.next-large .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-large .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333;color:var(--pagination-arrow-hover-color,#333)}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-no-border .next-pagination-item.next-next,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.next-pagination.next-large.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-large.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa;color:var(--pagination-arrow-hover-color-noboder,#209bfa)}.next-pagination.next-large.next-no-border .next-pagination-display{margin:0 16px}.next-pagination.next-large.next-mini .next-pagination-item.next-prev{margin-right:8px}.next-pagination.next-large.next-mini .next-pagination-item.next-next{margin-left:8px}.next-pagination-icon-prev:before{content:"";content:var(--pagination-icon-prev-content,"\e61d")}.next-pagination-icon-next:before{content:"";content:var(--pagination-icon-next-content,"\e619")}.next-pagination-icon-ellipsis:before{content:"";content:var(--pagination-icon-ellipsis-content,"\e654")}.next-paragraph{color:#333;color:var(--paragraph-text-color,#333)}.next-paragraph-short{line-height:1.5;line-height:var(--paragraph-s-line-height,1.5)}.next-paragraph-long{line-height:1.7;line-height:var(--paragraph-l-line-height,1.7)}.next-paragraph-small{font-size:14px;font-size:var(--paragraph-s-font-size,14px)}.next-paragraph-medium{font-size:14px;font-size:var(--paragraph-m-font-size,14px)}.next-progress-circle[dir=rtl] .next-progress-circle-container{-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.next-progress-line[dir=rtl] .next-progress-line-overlay{left:auto;right:0}.next-progress-line,.next-progress-line *,.next-progress-line :after,.next-progress-line :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-progress-line{width:100%;display:inline-block;position:relative}.next-progress-line-container{display:inline-block;width:100%;vertical-align:middle}.next-progress-line-underlay{position:relative;overflow:hidden;width:100%;background:#f5f5f5;background:var(--progress-line-underlay-color,#f5f5f5)}.next-progress-line-overlay{position:absolute;left:0;top:0;-webkit-transition:all .3s ease;transition:all .3s ease}.next-progress-line-overlay-normal{background:#209bfa;background:var(--progress-line-normal-color,#209bfa)}.next-progress-line-overlay-success{background:#1ad78c;background:var(--progress-line-success-color,#1ad78c)}.next-progress-line-overlay-error{background:#d23c26;background:var(--progress-line-error-color,#d23c26)}.next-progress-line-overlay-started{background:#d23c26;background:var(--progress-line-started-color,#d23c26)}.next-progress-line-overlay-middle{background:#f1c826;background:var(--progress-line-middle-color,#f1c826)}.next-progress-line-overlay-finishing{background:#1ad78c;background:var(--progress-line-finishing-color,#1ad78c)}.next-progress-line.next-small .next-progress-line-overlay,.next-progress-line.next-small .next-progress-line-underlay{border-radius:12px;border-radius:var(--progress-line-radius-s,12px);height:4px;height:var(--progress-line-height-size-s,4px)}.next-progress-line.next-small .next-progress-line-overlay{top:50%;margin-top:-2px;margin-top:calc(0px - var(--progress-line-height-size-s, 4px)/2)}.next-progress-line.next-small .next-progress-line-text{font-size:12px;font-size:var(--progress-line-font-s,12px);line-height:4px;line-height:var(--progress-line-height-size-s,4px)}.next-progress-line.next-medium .next-progress-line-overlay,.next-progress-line.next-medium .next-progress-line-underlay{border-radius:12px;border-radius:var(--progress-line-radius-m,12px);height:8px;height:var(--progress-line-height-size-m,8px)}.next-progress-line.next-medium .next-progress-line-overlay{top:50%;margin-top:-4px;margin-top:calc(0px - var(--progress-line-height-size-m, 8px)/2)}.next-progress-line.next-medium .next-progress-line-text{font-size:12px;font-size:var(--progress-line-font-m,12px);line-height:8px;line-height:var(--progress-line-height-size-m,8px)}.next-progress-line.next-large .next-progress-line-overlay,.next-progress-line.next-large .next-progress-line-underlay{border-radius:12px;border-radius:var(--progress-line-radius-l,12px);height:12px;height:var(--progress-line-height-size-l,12px)}.next-progress-line.next-large .next-progress-line-overlay{top:50%;margin-top:-6px;margin-top:calc(0px - var(--progress-line-height-size-l, 12px)/2)}.next-progress-line.next-large .next-progress-line-text{font-size:14px;font-size:var(--progress-line-font-l,14px);line-height:12px;line-height:var(--progress-line-height-size-l,12px)}.next-progress-line-show-info .next-progress-line-container{padding-right:60px;margin-right:-60px}.next-progress-line-show-info .next-progress-line-text{width:50px;text-align:left;margin-left:10px;vertical-align:middle;display:inline-block;color:#333;color:var(--progress-line-font-color,#333)}.next-progress-line-show-border .next-progress-line-underlay{border:1px solid #e6e6e6;border:var(--progress-line-underlay-border-width,1px) solid var(--progress-line-underlay-border-color,#e6e6e6)}.next-progress-line-show-border.next-small .next-progress-line-underlay{border-radius:12px;border-radius:var(--progress-line-radius-s,12px);height:6px;height:calc(var(--progress-line-height-size-s, 4px) + var(--progress-line-underlay-border-width, 1px)*2)}.next-progress-line-show-border.next-small .next-progress-line-overlay{height:4px;height:var(--progress-line-height-size-s,4px);border-radius:12px;border-radius:var(--progress-line-radius-s,12px);top:50%;margin-top:-2px;margin-top:calc(0px - var(--progress-line-height-size-s, 4px)/2)}.next-progress-line-show-border.next-small .next-progress-line-text{font-size:12px;font-size:var(--progress-line-font-s,12px);line-height:6px;line-height:calc(var(--progress-line-height-size-s, 4px) + var(--progress-line-underlay-border-width, 1px)*2)}.next-progress-line-show-border.next-medium .next-progress-line-underlay{border-radius:12px;border-radius:var(--progress-line-radius-m,12px);height:10px;height:calc(var(--progress-line-height-size-m, 8px) + var(--progress-line-underlay-border-width, 1px)*2)}.next-progress-line-show-border.next-medium .next-progress-line-overlay{height:8px;height:var(--progress-line-height-size-m,8px);border-radius:12px;border-radius:var(--progress-line-radius-m,12px);top:50%;margin-top:-4px;margin-top:calc(0px - var(--progress-line-height-size-m, 8px)/2)}.next-progress-line-show-border.next-medium .next-progress-line-text{font-size:12px;font-size:var(--progress-line-font-m,12px);line-height:10px;line-height:calc(var(--progress-line-height-size-m, 8px) + var(--progress-line-underlay-border-width, 1px)*2)}.next-progress-line-show-border.next-large .next-progress-line-underlay{border-radius:12px;border-radius:var(--progress-line-radius-l,12px);height:14px;height:calc(var(--progress-line-height-size-l, 12px) + var(--progress-line-underlay-border-width, 1px)*2)}.next-progress-line-show-border.next-large .next-progress-line-overlay{height:12px;height:var(--progress-line-height-size-l,12px);border-radius:12px;border-radius:var(--progress-line-radius-l,12px);top:50%;margin-top:-6px;margin-top:calc(0px - var(--progress-line-height-size-l, 12px)/2)}.next-progress-line-show-border.next-large .next-progress-line-text{font-size:14px;font-size:var(--progress-line-font-l,14px);line-height:14px;line-height:calc(var(--progress-line-height-size-l, 12px) + var(--progress-line-underlay-border-width, 1px)*2)}.next-progress-circle,.next-progress-circle *,.next-progress-circle :after,.next-progress-circle :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-progress-circle{position:relative;display:inline-block}.next-progress-circle-underlay{stroke-width:8px;stroke-width:var(--progress-circle-underlay-width,8px);stroke:#f5f5f5;stroke:var(--progress-circle-underlay-color,#f5f5f5)}.next-progress-circle-overlay{-webkit-transition:all .3s ease;transition:all .3s ease;stroke-linecap:round;stroke-linecap:var(--progress-circle-corner,round);stroke-width:8px;stroke-width:var(--progress-circle-overlay-width,8px)}.next-progress-circle-overlay-normal{stroke:#209bfa;stroke:var(--progress-circle-normal-color,#209bfa)}.next-progress-circle-overlay-success{stroke:#1ad78c;stroke:var(--progress-circle-success-color,#1ad78c)}.next-progress-circle-overlay-error{stroke:#d23c26;stroke:var(--progress-circle-error-color,#d23c26)}.next-progress-circle-overlay-started{stroke:#d23c26;stroke:var(--progress-circle-started-color,#d23c26)}.next-progress-circle-overlay-middle{stroke:#f1c826;stroke:var(--progress-circle-middle-color,#f1c826)}.next-progress-circle-overlay-finishing{stroke:#1ad78c;stroke:var(--progress-circle-finishing-color,#1ad78c)}.next-progress-circle.next-small{width:100px;width:var(--progress-circle-size-s,100px);height:100px;height:var(--progress-circle-size-s,100px);font-size:20px;font-size:var(--progress-circle-font-s,20px)}.next-progress-circle.next-medium{width:116px;width:var(--progress-circle-size-m,116px);height:116px;height:var(--progress-circle-size-m,116px);font-size:24px;font-size:var(--progress-circle-font-m,24px)}.next-progress-circle.next-large{width:132px;width:var(--progress-circle-size-l,132px);height:132px;height:var(--progress-circle-size-l,132px);font-size:36px;font-size:var(--progress-circle-font-l,36px)}.next-progress-circle-text{display:block;position:absolute;width:100%;top:50%;left:0;text-align:center;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease;color:#333;color:var(--progress-circle-text-color,#333)}.next-range{width:100%;font-family:inherit;font-weight:400;font-size:inherit;line-height:inherit;vertical-align:baseline;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;cursor:pointer}.next-range,.next-range *,.next-range :after,.next-range :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-range .next-range-inner{position:relative}.next-range .next-range-inner:only-child{margin-top:auto;margin-bottom:auto}.next-range .next-range-track{width:100%}.next-range .next-range-selected,.next-range .next-range-track{position:absolute;top:50%;border-radius:0;border-radius:var(--range-size-m-track-radius,0)}.next-range .next-range-selected{width:0;left:0}.next-range .next-range-scale{position:relative;width:100%;height:12px;height:var(--range-size-m-scale-height,12px)}.next-range .next-range-scale .next-range-scale-item{position:absolute;left:0;width:2px;border:1px solid;border:var(--range-size-m-scale-item-border-width,1px) solid;border-radius:0;border-radius:var(--range-size-m-scale-radius,0)}.next-range .next-range-scale .next-range-scale-item:last-child{margin-left:-2px;margin-left:calc(0px - var(--range-size-m-scale-item-border-width, 1px)*2)}.next-range .next-range-slider{position:absolute;top:50%;left:0;border-radius:50%}.next-range .next-range-slider-inner{position:absolute;top:50%;left:50%;border:1px solid #ddd;border:var(--range-size-slider-border-width,1px) var(--range-size-slider-border-style,solid) var(--range-normal-slider-border-color,#ddd);border-radius:50%;-webkit-transition:border-color .1s linear,-webkit-transform .1s linear;transition:border-color .1s linear,-webkit-transform .1s linear;transition:transform .1s linear,border-color .1s linear;transition:transform .1s linear,border-color .1s linear,-webkit-transform .1s linear}.next-range .next-range-frag.next-range-active .next-range-slider .next-range-slider-inner,.next-range .next-range-slider.next-range-slider-moving .next-range-slider-inner{border:2px solid #209bfa;border:var(--line-2,2px) var(--line-solid,solid) var(--range-normal-selected-color,#209bfa);-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.next-range .next-range-mark{position:relative;cursor:auto}.next-range .next-range-mark .next-range-mark-text{position:absolute;left:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);padding-left:2px;text-align:center}.next-range .next-range-frag{position:absolute;top:0}.next-range .next-range-frag .next-range-slider{left:0}.next-range .next-range-frag .next-range-slider:nth-child(2){left:100%}.next-range .next-range-frag .next-range-selected{width:100%}.next-range.disabled{cursor:not-allowed}.next-range.disabled .next-range-mark{cursor:auto}.next-range .next-range-track{background:#ddd;background:var(--range-normal-unselected-color,#ddd)}.next-range .next-range-track:hover{background:#ddd;background:var(--range-normal-unselected-color-hover,#ddd)}.next-range .next-range-selected{background:#209bfa;background:var(--range-normal-selected-color,#209bfa)}.next-range .next-range-selected:hover{background:#209bfa;background:var(--range-normal-selected-color-hover,#209bfa)}.next-range .next-range-scale .next-range-scale-item{border-color:#ddd;border-color:var(--range-normal-unselected-color,#ddd);background:#ddd;background:var(--range-normal-unselected-color,#ddd)}.next-range .next-range-scale .next-range-scale-item:hover{border-color:#ddd;border-color:var(--range-normal-unselected-color-hover,#ddd)}.next-range .next-range-scale .next-range-scale-item.activated{border-color:#209bfa;border-color:var(--range-normal-selected-color,#209bfa);background:#209bfa;background:var(--range-normal-selected-color,#209bfa)}.next-range .next-range-scale .next-range-scale-item.activated:hover{border-color:#209bfa;border-color:var(--range-normal-selected-color-hover,#209bfa)}.next-range .next-range-slider-inner{background:#fff;background:var(--range-normal-slider-bg-color,#fff);border-color:#ddd;border-color:var(--range-normal-slider-border-color,#ddd)}.next-range .next-range-slider-inner:hover{background:#fff;background:var(--range-normal-slider-bg-color-hover,#fff);-webkit-box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.next-range .next-range-mark .next-range-mark-text{color:#999;color:var(--range-normal-mark-color,#999)}.next-range .next-range-mark .next-range-mark-text:hover{color:#999;color:var(--range-normal-mark-color-hover,#999)}.next-range .next-range-mark .next-range-mark-text.activated{color:#333;color:var(--range-normal-mark-selected-color,#333)}.next-range .next-range-mark .next-range-mark-text.activated:hover{color:#333;color:var(--range-normal-mark-selected-color-hover,#333)}.next-range.disabled .next-range-track{background:#ddd;background:var(--range-normal-unselected-color-disabled,#ddd)}.next-range.disabled .next-range-selected{background:#ccc;background:var(--range-normal-selected-color-disabled,#ccc)}.next-range.disabled .next-range-scale-item{border-color:#ddd;border-color:var(--range-normal-unselected-color-disabled,#ddd)}.next-range.disabled .next-range-scale-item.activated{border-color:#ccc;border-color:var(--range-normal-selected-color-disabled,#ccc)}.next-range.disabled .next-range-slider-inner{background:#eee;background:var(--range-normal-slider-bg-color-disabled,#eee);border-color:#eee;border-color:var(--range-normal-slider-border-color-disabled,#eee);-webkit-transform:none;-ms-transform:none;transform:none;-webkit-box-shadow:none;box-shadow:none}.next-range.disabled .next-range-mark-text{color:#ccc;color:var(--range-normal-mark-color-disabled,#ccc)}.next-range.disabled .next-range-mark-text.activated{color:#999;color:var(--range-normal-mark-selected-color-disabled,#999)}.next-range .next-range-selected,.next-range .next-range-track{height:4px;height:var(--range-size-m-track-height,4px);margin-top:-2px;margin-top:calc(0px - var(--range-size-m-track-height, 4px)/2)}.next-range .next-range-frag{margin-top:4px;margin-top:calc(var(--range-size-m-scale-height, 12px)/2 - var(--range-size-m-track-height, 4px)/2);height:4px;height:var(--range-size-m-track-height,4px)}.next-range .next-range-slider{-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--range-size-m-slider-shadow,1px 1px 3px 0 rgba(0,0,0,.12));box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--range-size-m-slider-shadow,1px 1px 3px 0 rgba(0,0,0,.12))}.next-range .next-range-slider,.next-range .next-range-slider-inner{height:16px;height:var(--range-size-m-slider-hw,16px);width:16px;width:var(--range-size-m-slider-hw,16px);margin-top:-8px;margin-top:calc(0px - var(--range-size-m-slider-hw, 16px)/2);margin-left:-8px;margin-left:calc(0px - var(--range-size-m-slider-hw, 16px)/2)}.next-range .next-range-mark{display:block}.next-range .next-range-mark .next-range-mark-text{font-size:14px;font-size:var(--range-size-m-mark-font-size,14px);font-weight:400;font-weight:var(--range-size-m-mark-font-weight,normal);line-height:20px;line-height:var(--range-size-m-mark-font-lineheight,20px);height:20px;height:var(--range-size-m-mark-font-lineheight,20px)}.next-range .next-range-mark.next-range-mark-below{height:30px;height:var(--range-size-m-mark-top,30px)}.next-range .next-range-mark.next-range-mark-below .next-range-mark-text{bottom:0}.next-range .next-range-mark.next-range-mark-above{height:30px;height:var(--range-size-m-mark-top,30px)}.next-range .next-range-scale .next-range-scale-item{height:12px;height:var(--range-size-m-scale-height,12px)}.next-range.simulation-hover>.next-range-slider-inner{background:#fff;background:var(--range-normal-slider-bg-color-hover,#fff);-webkit-box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.next-range.simulation-hover .next-range-selected{background:#209bfa;background:var(--range-normal-selected-color-hover,#209bfa)}.next-range.simulation-hover .next-range-track{background:#ddd;background:var(--range-normal-unselected-color-hover,#ddd)}.next-range.simulation-hover .next-range-scale-item{border-color:#ddd;border-color:var(--range-normal-unselected-color-hover,#ddd)}.next-range.simulation-hover .next-range-scale-item.activated{border-color:#209bfa;border-color:var(--range-normal-selected-color-hover,#209bfa)}.next-range.simulation-click>.next-range-slider-inner{border:2px solid #209bfa;border:2px solid var(--range-normal-selected-color,#209bfa);-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.next-range[dir=rtl] .next-range-mark{position:relative;cursor:auto}.next-range[dir=rtl] .next-range-mark .next-range-mark-text{position:absolute;right:0;-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);padding-right:2px;text-align:center}.next-rating[dir=rtl] .next-rating-overlay{right:0;left:auto}.next-rating[dir=rtl] .next-rating-overlay .next-rating-icon,.next-rating[dir=rtl] .next-rating-underlay .next-rating-icon{margin-right:4px;margin-left:0}.next-rating[dir=rtl] .next-rating-overlay .next-rating-icon:last-child,.next-rating[dir=rtl] .next-rating-underlay .next-rating-icon:last-child{margin-left:4px}.next-rating{vertical-align:top;display:inline-block;position:relative}.next-rating:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-rating-base,.next-rating-text{float:left}.next-rating-base-disabled,.next-rating-base-disabled .next-rating-overlay .next-rating-icon,.next-rating-base-disabled .next-rating-underlay .next-rating-icon{cursor:not-allowed}.next-rating-symbol-icon:before{content:"";content:var(--rating-grade-icon-content,"\e60e")}.next-rating-underlay{white-space:nowrap;overflow:hidden}.next-rating-underlay .next-icon{color:#f2f2f2;color:var(--rating-normal-underlay-color,#f2f2f2)}.next-rating-stroke-mode .next-rating-underlay .next-icon{color:transparent;-webkit-text-stroke:1px #209bfa;-webkit-text-stroke:1px var(--rating-normal-overlay-color,#209bfa)}.next-rating-overlay{white-space:nowrap;overflow:hidden;position:absolute;width:0;top:0;left:0}.next-rating-overlay .next-icon{color:#209bfa;color:var(--rating-normal-overlay-color,#209bfa)}.next-rating-overlay .next-rating-icon,.next-rating-underlay .next-rating-icon{cursor:pointer;margin-left:4px}.next-rating-overlay .next-rating-icon:last-child,.next-rating-underlay .next-rating-icon:last-child{margin-right:4px}.next-rating-overlay .next-icon,.next-rating-underlay .next-icon{-webkit-transition:all .1s linear;transition:all .1s linear}.next-rating-overlay .next-icon.hover,.next-rating-underlay .next-icon.hover{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}.next-rating-overlay .next-icon.clicked,.next-rating-underlay .next-icon.clicked{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}.next-rating-info{position:absolute;top:calc(100% + 4px);left:0;border:1px solid #f2f2f2;border:1px solid var(--color-fill1-4,#f2f2f2);background:#fff;padding:4px 8px 3px;font-size:12px;white-space:nowrap}.next-rating-info:after{position:absolute;content:"";width:4px;height:4px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);border-left:1px solid #f2f2f2;border-top:1px solid #f2f2f2;border:1px solid var(--color-fill1-4,#f2f2f2);background:#fff;border-bottom:1px solid transparent;border-right:1px solid transparent;top:-3px;left:4px}.next-rating.hover,.next-rating:focus .next-rating-base:not(.next-rating-base-disabled){outline:none}.next-rating.hover .next-rating-overlay .next-icon,.next-rating:focus .next-rating-base:not(.next-rating-base-disabled) .next-rating-overlay .next-icon{color:#209bfa;color:var(--rating-normal-overlay-hover-color,#209bfa)}.next-rating-grade-low.hover .next-rating-overlay .next-icon,.next-rating-grade-low .next-rating-overlay .next-icon{color:#666;color:var(--rating-grade-low-overlay-color,#666)}.next-rating-grade-high .next-rating-overlay .next-icon{color:#209bfa;color:var(--rating-grade-high-overlay-color,#209bfa)}.next-rating-grade-high.hover .next-rating-overlay .next-icon{color:#209bfa;color:var(--rating-grade-high-overlay-hover-color,#209bfa)}.next-rating-small{font-size:12px;font-size:var(--rating-small-font-size,12px)}.next-rating-small .next-icon .next-icon-remote,.next-rating-small .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-rating-small .next-rating-text{margin-left:8px;margin-left:var(--rating-small-text-margin-left,8px)}.next-rating-medium{font-size:14px;font-size:var(--rating-medium-font-size,14px)}.next-rating-medium .next-icon .next-icon-remote,.next-rating-medium .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-rating-medium .next-rating-text{margin-left:12px;margin-left:var(--rating-medium-text-margin-left,12px)}.next-rating-large{font-size:16px;font-size:var(--rating-large-font-size,16px)}.next-rating-large .next-icon .next-icon-remote,.next-rating-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-rating-large .next-rating-text{margin-left:16px;margin-left:var(--rating-large-text-margin-left,16px)}.next-search-simple[dir=rtl].next-large .next-search-icon{margin-left:12px;margin-right:0}.next-search-simple[dir=rtl].next-medium .next-search-icon{margin-left:8px;margin-right:0}.next-search-simple[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #ddd;border-left:1px solid var(--search-simple-normal-split-color,#ddd);border-right:none}.next-search-simple[dir=rtl].next-dark .next-search-left{border-color:#666;border-color:var(--search-simple-dark-color,#666)}.next-search-simple[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-right:1px solid #ddd;border-right:1px solid var(--search-simple-dark-split-color,#ddd)}.next-search-simple[dir=rtl].next-dark:hover .next-search-left{border-color:#999;border-color:var(--search-simple-dark-hover-color,#999)}.next-search-simple[dir=rtl].next-dark .next-search-icon{color:#666;color:var(--search-simple-dark-icon-text-color,#666)}.next-search-simple[dir=rtl].next-dark .next-search-icon:hover{color:#999;color:var(--search-simple-dark-icon-hover-text-color,#999)}.next-search-normal[dir=rtl] .next-search-left{border-left:none;border-top-right-radius:3px;border-top-right-radius:var(--search-normal-corner,3px);border-bottom-right-radius:3px;border-bottom-right-radius:var(--search-normal-corner,3px);border-top-left-radius:0;border-bottom-left-radius:0}.next-search-normal[dir=rtl] .next-search-btn.next-btn{border-radius:3px 0 0 3px!important;border-radius:var(--search-normal-corner,3px) 0 0 var(--search-normal-corner,3px)!important}.next-search-normal[dir=rtl] .next-input{border-radius:0 3px 3px 0;border-radius:0 var(--search-normal-corner,3px) var(--search-normal-corner,3px) 0}.next-search-normal[dir=rtl].next-primary .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-top-right-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px));border-bottom-right-radius:2px;border-bottom-right-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px))}.next-search-normal[dir=rtl].next-primary .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-left:1px solid var(--search-normal-primary-split-color,#eee);border-right:none}.next-search-normal[dir=rtl].next-secondary .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-top-right-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px));border-bottom-right-radius:2px;border-bottom-right-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px))}.next-search-normal[dir=rtl].next-secondary .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-left:1px solid var(--search-normal-secondary-split-color,#eee);border-right:none}.next-search-normal[dir=rtl].next-normal .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-top-right-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px));border-bottom-right-radius:2px;border-bottom-right-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px))}.next-search-normal[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-left:1px solid var(--search-normal-normal-split-color,#eee);border-right:none}.next-search-normal[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-left:1px solid #209bfa;border-left:1px solid var(--search-normal-dark-color,#209bfa);border-right:none}.next-search{width:100%;display:inline-block}.next-search,.next-search *,.next-search :after,.next-search :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-search .next-input,.next-search .next-select{border:none;-webkit-box-shadow:none;box-shadow:none}.next-search .next-select .next-input,.next-search .next-select .next-input .next-input-text-field{height:auto}.next-search .next-search-left{border-style:solid;-webkit-transition:all .1s linear;transition:all .1s linear}.next-search .next-search-left-addon .next-input,.next-search .next-search-left-addon .next-select-trigger-search{min-height:100%;border-bottom-right-radius:0;border-top-right-radius:0}.next-search .next-search-left-addon .next-select-values{line-height:1}.next-search .next-search-left-addon.next-input-group-addon .next-select{margin:0}.next-search .next-search-left-addon+.next-search-input .next-input{border-bottom-left-radius:0;border-top-left-radius:0}.next-search .next-search-input{width:100%}.next-search .next-search-btn{-webkit-box-shadow:none;box-shadow:none}.next-search .next-search-symbol-icon:before{content:"";content:var(--search-search-icon-content,"\e656")}.next-search-normal{width:600px}.next-search-normal .next-search-left{border-top-left-radius:3px;border-top-left-radius:var(--search-normal-corner,3px);border-bottom-left-radius:3px;border-bottom-left-radius:var(--search-normal-corner,3px)}.next-search-normal .next-input{border-radius:3px 0 0 3px;border-radius:var(--search-normal-corner,3px) 0 0 var(--search-normal-corner,3px)}.next-search-normal .next-btn{border-radius:0 3px 3px 0;border-radius:0 var(--search-normal-corner,3px) var(--search-normal-corner,3px) 0}.next-search-normal.next-primary .next-search-left{border-color:#209bfa;border-color:var(--search-normal-primary-color,#209bfa)}.next-search-normal.next-primary .next-search-left .next-search-left-addon{border-right:1px solid #eee;border-right:1px solid var(--search-normal-primary-split-color,#eee)}.next-search-normal.next-primary:hover .next-btn,.next-search-normal.next-primary:hover .next-search-left{border-color:#209bfa;border-color:var(--search-normal-primary-hover-color,#209bfa)}.next-search-normal.next-primary .next-search-btn{background:#209bfa;background:var(--search-normal-primary-color,#209bfa);border-color:#209bfa;border-color:var(--search-normal-primary-color,#209bfa);color:#fff;color:var(--search-normal-primary-btn-text-color,#fff)}.next-search-normal.next-primary .next-search-btn:hover{background:#1274e7;background:var(--search-normal-primary-btn-hover-bg-color,#1274e7);border-color:#209bfa;border-color:var(--search-normal-primary-hover-color,#209bfa);color:#fff;color:var(--search-normal-primary-btn-hover-text-color,#fff)}.next-search-normal.next-primary .next-search-btn .next-icon{color:#fff;color:var(--search-normal-primary-btn-text-color,#fff)}.next-search-normal.next-primary .next-search-btn .next-icon:hover{color:#fff;color:var(--search-normal-primary-btn-hover-text-color,#fff)}.next-search-normal.next-primary.next-large{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-primary-shadow,none);box-shadow:none;box-shadow:var(--search-normal-primary-shadow,none)}.next-search-normal.next-primary.next-large .next-search-btn,.next-search-normal.next-primary.next-large .next-search-left{border-width:1px;border-width:var(--search-normal-primary-border-width,1px);height:40px;height:var(--search-normal-primary-l-height,40px)}.next-search-normal.next-primary.next-large .next-search-input{height:38px;height:calc(var(--search-normal-primary-l-height, 40px) - var(--search-normal-primary-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-primary.next-large .next-search-input input{line-height:38px \0 ;line-height:calc(var(--search-normal-primary-l-height, 40px) - var(--search-normal-primary-border-width, 1px)*2) \0 }.next-search-normal.next-primary.next-large .next-search-input input,.next-search-normal.next-primary.next-large .next-select{height:38px;height:calc(var(--search-normal-primary-l-height, 40px) - var(--search-normal-primary-border-width, 1px)*2)}.next-search-normal.next-primary.next-large .next-search-btn{font-size:16px;font-size:var(--search-normal-primary-l-btn-text-size,16px)}.next-search-normal.next-primary.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-primary.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-primary-btn-text-padding-left,0)}.next-search-normal.next-primary.next-medium{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-primary-shadow,none);box-shadow:none;box-shadow:var(--search-normal-primary-shadow,none)}.next-search-normal.next-primary.next-medium .next-search-btn,.next-search-normal.next-primary.next-medium .next-search-left{border-width:1px;border-width:var(--search-normal-primary-border-width,1px);height:32px;height:var(--search-normal-primary-m-height,32px)}.next-search-normal.next-primary.next-medium .next-search-input{height:30px;height:calc(var(--search-normal-primary-m-height, 32px) - var(--search-normal-primary-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-primary.next-medium .next-search-input input{line-height:30px \0 ;line-height:calc(var(--search-normal-primary-m-height, 32px) - var(--search-normal-primary-border-width, 1px)*2) \0 }.next-search-normal.next-primary.next-medium .next-search-input input,.next-search-normal.next-primary.next-medium .next-select{height:30px;height:calc(var(--search-normal-primary-m-height, 32px) - var(--search-normal-primary-border-width, 1px)*2)}.next-search-normal.next-primary.next-medium .next-search-btn{font-size:16px;font-size:var(--search-normal-primary-m-btn-text-size,16px)}.next-search-normal.next-primary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-primary.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-primary-btn-text-padding-left,0)}.next-search-normal.next-primary .next-input{border-top-left-radius:2px;border-top-left-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px));border-bottom-left-radius:2px;border-bottom-left-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-primary-border-width, 1px))}.next-search-normal.next-secondary .next-search-left{border-color:#ddd;border-color:var(--search-normal-secondary-color,#ddd)}.next-search-normal.next-secondary .next-search-left .next-search-left-addon{border-right:1px solid #eee;border-right:1px solid var(--search-normal-secondary-split-color,#eee)}.next-search-normal.next-secondary:hover .next-btn,.next-search-normal.next-secondary:hover .next-search-left{border-color:#209bfa;border-color:var(--search-normal-secondary-hover-color,#209bfa)}.next-search-normal.next-secondary .next-search-btn{background:#209bfa;background:var(--search-normal-secondary-btn-bg-color,#209bfa);border-color:#209bfa;border-color:var(--search-normal-secondary-btn-bg-color,#209bfa);color:#fff;color:var(--search-normal-secondary-btn-text-color,#fff)}.next-search-normal.next-secondary .next-search-btn:hover{background:#1274e7;background:var(--search-normal-secondary-btn-hover-bg-color,#1274e7);border-color:#209bfa;border-color:var(--search-normal-secondary-hover-color,#209bfa);color:#fff;color:var(--search-normal-secondary-btn-hover-text-color,#fff)}.next-search-normal.next-secondary .next-search-btn .next-icon{color:#fff;color:var(--search-normal-secondary-btn-text-color,#fff)}.next-search-normal.next-secondary .next-search-btn .next-icon:hover{color:#fff;color:var(--search-normal-secondary-btn-hover-text-color,#fff)}.next-search-normal.next-secondary.next-large{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-secondary-shadow,none);box-shadow:none;box-shadow:var(--search-normal-secondary-shadow,none)}.next-search-normal.next-secondary.next-large .next-search-btn,.next-search-normal.next-secondary.next-large .next-search-left{border-width:1px;border-width:var(--search-normal-secondary-border-width,1px);height:40px;height:var(--search-normal-secondary-l-height,40px)}.next-search-normal.next-secondary.next-large .next-search-input{height:38px;height:calc(var(--search-normal-secondary-l-height, 40px) - var(--search-normal-secondary-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-secondary.next-large .next-search-input input{line-height:38px \0 ;line-height:calc(var(--search-normal-secondary-l-height, 40px) - var(--search-normal-secondary-border-width, 1px)*2) \0 }.next-search-normal.next-secondary.next-large .next-search-input input,.next-search-normal.next-secondary.next-large .next-select{height:38px;height:calc(var(--search-normal-secondary-l-height, 40px) - var(--search-normal-secondary-border-width, 1px)*2)}.next-search-normal.next-secondary.next-large .next-search-btn{font-size:16px;font-size:var(--search-normal-secondary-l-btn-text-size,16px)}.next-search-normal.next-secondary.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-secondary.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-secondary-btn-text-padding-left,0)}.next-search-normal.next-secondary.next-medium{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-secondary-shadow,none);box-shadow:none;box-shadow:var(--search-normal-secondary-shadow,none)}.next-search-normal.next-secondary.next-medium .next-search-btn,.next-search-normal.next-secondary.next-medium .next-search-left{border-width:1px;border-width:var(--search-normal-secondary-border-width,1px);height:32px;height:var(--search-normal-secondary-m-height,32px)}.next-search-normal.next-secondary.next-medium .next-search-input{height:30px;height:calc(var(--search-normal-secondary-m-height, 32px) - var(--search-normal-secondary-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-secondary.next-medium .next-search-input input{line-height:30px \0 ;line-height:calc(var(--search-normal-secondary-m-height, 32px) - var(--search-normal-secondary-border-width, 1px)*2) \0 }.next-search-normal.next-secondary.next-medium .next-search-input input,.next-search-normal.next-secondary.next-medium .next-select{height:30px;height:calc(var(--search-normal-secondary-m-height, 32px) - var(--search-normal-secondary-border-width, 1px)*2)}.next-search-normal.next-secondary.next-medium .next-search-btn{font-size:16px;font-size:var(--search-normal-secondary-m-btn-text-size,16px)}.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-secondary.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-secondary-btn-text-padding-left,0)}.next-search-normal.next-secondary .next-input{border-top-left-radius:2px;border-top-left-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-secondary-border-width, 1px));border-bottom-left-radius:2px;border-bottom-left-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-secondary-border-width, 1px))}.next-search-normal.next-normal .next-search-left{border-color:#ddd;border-color:var(--search-normal-normal-color,#ddd)}.next-search-normal.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #eee;border-right:1px solid var(--search-normal-normal-split-color,#eee)}.next-search-normal.next-normal:hover .next-btn,.next-search-normal.next-normal:hover .next-search-left{border-color:#ccc;border-color:var(--search-normal-normal-hover-color,#ccc)}.next-search-normal.next-normal .next-search-btn{background:#fafafa;background:var(--search-normal-normal-btn-bg-color,#fafafa);border-color:#ddd;border-color:var(--search-normal-normal-color,#ddd);color:#666;color:var(--search-normal-normal-btn-text-color,#666)}.next-search-normal.next-normal .next-search-btn:hover{background:#f5f5f5;background:var(--search-normal-normal-btn-hover-bg-color,#f5f5f5);border-color:#ccc;border-color:var(--search-normal-normal-hover-color,#ccc);color:#333;color:var(--search-normal-normal-btn-hover-text-color,#333)}.next-search-normal.next-normal .next-search-btn .next-icon{color:#666;color:var(--search-normal-normal-btn-text-color,#666)}.next-search-normal.next-normal .next-search-btn .next-icon:hover{color:#333;color:var(--search-normal-normal-btn-hover-text-color,#333)}.next-search-normal.next-normal.next-large{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-normal-shadow,none);box-shadow:none;box-shadow:var(--search-normal-normal-shadow,none)}.next-search-normal.next-normal.next-large .next-search-btn,.next-search-normal.next-normal.next-large .next-search-left{border-width:1px;border-width:var(--search-normal-normal-border-width,1px);height:40px;height:var(--search-normal-normal-l-height,40px)}.next-search-normal.next-normal.next-large .next-search-input{height:38px;height:calc(var(--search-normal-normal-l-height, 40px) - var(--search-normal-normal-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-normal.next-large .next-search-input input{line-height:38px \0 ;line-height:calc(var(--search-normal-normal-l-height, 40px) - var(--search-normal-normal-border-width, 1px)*2) \0 }.next-search-normal.next-normal.next-large .next-search-input input,.next-search-normal.next-normal.next-large .next-select{height:38px;height:calc(var(--search-normal-normal-l-height, 40px) - var(--search-normal-normal-border-width, 1px)*2)}.next-search-normal.next-normal.next-large .next-search-btn{font-size:16px;font-size:var(--search-normal-normal-l-btn-text-size,16px)}.next-search-normal.next-normal.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-normal.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-normal-btn-text-padding-left,0)}.next-search-normal.next-normal.next-medium{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-normal-shadow,none);box-shadow:none;box-shadow:var(--search-normal-normal-shadow,none)}.next-search-normal.next-normal.next-medium .next-search-btn,.next-search-normal.next-normal.next-medium .next-search-left{border-width:1px;border-width:var(--search-normal-normal-border-width,1px);height:32px;height:var(--search-normal-normal-m-height,32px)}.next-search-normal.next-normal.next-medium .next-search-input{height:30px;height:calc(var(--search-normal-normal-m-height, 32px) - var(--search-normal-normal-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-normal.next-medium .next-search-input input{line-height:30px \0 ;line-height:calc(var(--search-normal-normal-m-height, 32px) - var(--search-normal-normal-border-width, 1px)*2) \0 }.next-search-normal.next-normal.next-medium .next-search-input input,.next-search-normal.next-normal.next-medium .next-select{height:30px;height:calc(var(--search-normal-normal-m-height, 32px) - var(--search-normal-normal-border-width, 1px)*2)}.next-search-normal.next-normal.next-medium .next-search-btn{font-size:16px;font-size:var(--search-normal-normal-m-btn-text-size,16px)}.next-search-normal.next-normal.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-normal.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-normal-btn-text-padding-left,0)}.next-search-normal.next-normal .next-input{border-top-left-radius:2px;border-top-left-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-normal-border-width, 1px));border-bottom-left-radius:2px;border-bottom-left-radius:calc(var(--search-normal-corner, 3px) - var(--search-normal-normal-border-width, 1px))}.next-search-normal.next-dark .next-search-left{border-color:#209bfa;border-color:var(--search-normal-dark-color,#209bfa)}.next-search-normal.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #209bfa;border-right:1px solid var(--search-normal-dark-color,#209bfa)}.next-search-normal.next-dark:hover .next-btn,.next-search-normal.next-dark:hover .next-search-left{border-color:#209bfa;border-color:var(--search-normal-dark-hover-color,#209bfa)}.next-search-normal.next-dark .next-search-btn{background:#209bfa;background:var(--search-normal-dark-color,#209bfa);border-color:#209bfa;border-color:var(--search-normal-dark-color,#209bfa);color:#fff;color:var(--search-normal-dark-btn-text-color,#fff)}.next-search-normal.next-dark .next-search-btn:hover{background:#1274e7;background:var(--search-normal-dark-btn-hover-bg-color,#1274e7);border-color:#209bfa;border-color:var(--search-normal-dark-hover-color,#209bfa);color:#fff;color:var(--search-normal-dark-btn-hover-text-color,#fff)}.next-search-normal.next-dark .next-search-btn .next-icon{color:#fff;color:var(--search-normal-dark-btn-text-color,#fff)}.next-search-normal.next-dark .next-search-btn .next-icon:hover{color:#fff;color:var(--search-normal-dark-btn-hover-text-color,#fff)}.next-search-normal.next-dark .next-select-inner,.next-search-normal.next-dark input{color:#fff;color:var(--search-normal-dark-text-color,#fff)}.next-search-normal.next-dark .next-input,.next-search-normal.next-dark .next-select{background:hsla(0,0%,100%,0)}.next-search-normal.next-dark.next-large{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-dark-shadow,none);box-shadow:none;box-shadow:var(--search-normal-dark-shadow,none)}.next-search-normal.next-dark.next-large .next-search-btn,.next-search-normal.next-dark.next-large .next-search-left{border-width:1px;border-width:var(--search-normal-dark-border-width,1px);height:40px;height:var(--search-normal-dark-l-height,40px)}.next-search-normal.next-dark.next-large .next-search-input{height:38px;height:calc(var(--search-normal-dark-l-height, 40px) - var(--search-normal-dark-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-dark.next-large .next-search-input input{line-height:38px \0 ;line-height:calc(var(--search-normal-dark-l-height, 40px) - var(--search-normal-dark-border-width, 1px)*2) \0 }.next-search-normal.next-dark.next-large .next-search-input input,.next-search-normal.next-dark.next-large .next-select{height:38px;height:calc(var(--search-normal-dark-l-height, 40px) - var(--search-normal-dark-border-width, 1px)*2)}.next-search-normal.next-dark.next-large .next-search-btn{font-size:16px;font-size:var(--search-normal-dark-l-btn-text-size,16px)}.next-search-normal.next-dark.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-dark.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-dark-btn-text-padding-left,0)}.next-search-normal.next-dark.next-medium{-webkit-box-shadow:none;-webkit-box-shadow:var(--search-normal-dark-shadow,none);box-shadow:none;box-shadow:var(--search-normal-dark-shadow,none)}.next-search-normal.next-dark.next-medium .next-search-btn,.next-search-normal.next-dark.next-medium .next-search-left{border-width:1px;border-width:var(--search-normal-dark-border-width,1px);height:32px;height:var(--search-normal-dark-m-height,32px)}.next-search-normal.next-dark.next-medium .next-search-input{height:30px;height:calc(var(--search-normal-dark-m-height, 32px) - var(--search-normal-dark-border-width, 1px)*2);overflow-y:hidden}.next-search-normal.next-dark.next-medium .next-search-input input{line-height:30px \0 ;line-height:calc(var(--search-normal-dark-m-height, 32px) - var(--search-normal-dark-border-width, 1px)*2) \0 }.next-search-normal.next-dark.next-medium .next-search-input input,.next-search-normal.next-dark.next-medium .next-select{height:30px;height:calc(var(--search-normal-dark-m-height, 32px) - var(--search-normal-dark-border-width, 1px)*2)}.next-search-normal.next-dark.next-medium .next-search-btn{font-size:16px;font-size:var(--search-normal-dark-m-btn-text-size,16px)}.next-search-normal.next-dark.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-dark.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0;padding-left:var(--search-normal-dark-btn-text-padding-left,0)}.next-search-normal:not([dir=rtl]) .next-search-left{border-right:none}.next-search-simple{width:300px;-webkit-box-shadow:none;-webkit-box-shadow:var(--search-simple-normal-shadow,none);box-shadow:none;box-shadow:var(--search-simple-normal-shadow,none);border-radius:3px;border-radius:var(--search-simple-corner,3px)}.next-search-simple .next-search-icon{cursor:pointer;-webkit-transition:all .1s linear;transition:all .1s linear}.next-search-simple .next-input,.next-search-simple .next-search-left{border-radius:3px;border-radius:var(--search-simple-corner,3px)}.next-search-simple.next-large .next-search-icon{margin-right:12px}.next-search-simple.next-medium .next-search-icon{margin-right:8px}.next-search-simple.next-normal .next-search-left{border-color:#ddd;border-color:var(--search-simple-normal-color,#ddd)}.next-search-simple.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #ddd;border-right:1px solid var(--search-simple-normal-split-color,#ddd)}.next-search-simple.next-normal:hover .next-search-left{border-color:#ccc;border-color:var(--search-simple-normal-hover-color,#ccc)}.next-search-simple.next-normal .next-search-icon{color:#999;color:var(--search-simple-normal-icon-text-color,#999)}.next-search-simple.next-normal .next-search-icon:hover{color:#666;color:var(--search-simple-normal-icon-hover-text-color,#666)}.next-search-simple.next-normal .next-search-left{border-width:1px;border-width:var(--search-simple-normal-border-width,1px)}.next-search-simple.next-normal.next-large .next-search-icon .next-icon-remote,.next-search-simple.next-normal.next-large .next-search-icon:before{width:20px;font-size:20px;line-height:inherit}.next-search-simple.next-normal.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-normal.next-medium .next-search-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-simple.next-dark .next-search-left{border-color:#666;border-color:var(--search-simple-dark-color,#666)}.next-search-simple.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #ddd;border-right:1px solid var(--search-simple-dark-split-color,#ddd)}.next-search-simple.next-dark:hover .next-search-left{border-color:#999;border-color:var(--search-simple-dark-hover-color,#999)}.next-search-simple.next-dark .next-search-icon{color:#666;color:var(--search-simple-dark-icon-text-color,#666)}.next-search-simple.next-dark .next-search-icon:hover{color:#999;color:var(--search-simple-dark-icon-hover-text-color,#999)}.next-search-simple.next-dark .next-select-inner,.next-search-simple.next-dark input{color:#fff;color:var(--search-simple-dark-text-color,#fff)}.next-search-simple.next-dark .next-input,.next-search-simple.next-dark .next-select{background:hsla(0,0%,100%,0)}.next-search-simple.next-dark .next-search-left{border-width:1px;border-width:var(--search-simple-dark-border-width,1px)}.next-search-simple.next-dark.next-large .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-large .next-search-icon:before,.next-search-simple.next-dark.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-medium .next-search-icon:before{width:20px;font-size:20px;line-height:inherit}.next-search-simple .next-select.next-large{height:38px;height:calc(var(--form-element-large-height, 40px) - 2px)}.next-search-simple .next-select.next-medium{height:30px;height:calc(var(--form-element-medium-height, 32px) - 2px)}.next-slick{position:relative;display:block;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:rgba(0,0,0,0)}.next-slick,.next-slick *,.next-slick :after,.next-slick :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-slick-initialized .next-slick-slide{display:block}.next-slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0;-webkit-transform:translateZ(0);transform:translateZ(0)}.next-slick-list:focus{outline:none}.next-slick-list.dragging{cursor:pointer;cursor:hand}.next-slick-track{position:relative;top:0;left:0;display:block;-webkit-transform:translateZ(0);transform:translateZ(0)}.next-slick-slide{float:left;height:100%;min-height:1px;outline:0;-webkit-transition:all .1s linear;transition:all .1s linear}.next-slick[dir=rtl] .next-slick-slide{float:right}.next-slick-slide img{display:block}.next-slick-arrow{display:block;position:absolute;cursor:pointer;text-align:center;-webkit-transition:all .1s linear;transition:all .1s linear}.next-slick-arrow.inner{color:#fff;color:var(--slick-arrow-icon-color-normal,#fff);background:#000;background:var(--slick-arrow-bg-color-normal,#000);opacity:.2;opacity:var(--slick-arrow-bg-opacity-normal,.2);padding:0;border:none}.next-slick-arrow.inner:focus,.next-slick-arrow.inner:hover{color:#fff;color:var(--slick-arrow-icon-color-hover,#fff);background:#000;background:var(--slick-arrow-bg-color-hover,#000);opacity:.4;opacity:var(--slick-arrow-bg-opacity-hover,.4)}.next-slick-arrow.inner.disabled{color:#ccc;color:var(--slick-arrow-icon-color-disabled,#ccc);background:#fafafa;background:var(--slick-arrow-bg-color-disabled,#fafafa);opacity:.5;opacity:var(--slick-arrow-bg-opacity-disabled,.5)}.next-slick-arrow.outer{color:#666;color:var(--slick-arrow-icon-color-normal-outer,#666);background:transparent;background:var(--slick-arrow-bg-color-normal-outer,transparent);opacity:.32;opacity:var(--slick-arrow-bg-opacity-normal-outer,.32);padding:0;border:none;border-radius:0;border-radius:var(--slick-arrow-corner-radius-outer,0)}.next-slick-arrow.outer:focus,.next-slick-arrow.outer:hover{color:#333;color:var(--slick-arrow-icon-color-hover-outer,#333);background:transparent;background:var(--slick-arrow-bg-color-hover-outer,transparent);opacity:.32;opacity:var(--slick-arrow-bg-opacity-hover-outer,.32)}.next-slick-arrow.outer.disabled{color:#ccc;color:var(--slick-arrow-icon-color-disabled-outer,#ccc);background:transparent;background:var(--slick-arrow-bg-color-disabled-outer,transparent);opacity:.32;opacity:var(--slick-arrow-bg-opacity-disabled-outer,.32)}.next-slick-arrow.disabled{cursor:not-allowed}.next-slick-dots{display:block;position:absolute;margin:0;padding:0}.next-slick-dots-item{position:relative;display:inline-block;cursor:pointer}.next-slick-dots-item button{cursor:pointer;border:0 solid #fff;border-width:var(--slick-dots-border-width,0);outline:none;padding:0;height:8px;height:var(--slick-dots-height,8px);width:8px;width:var(--slick-dots-width,8px);border-radius:50%;border-radius:var(--slick-dots-border-radius,50%);background:rgba(0,0,0,.32)}.next-slick-dots-item button:hover{background-color:rgba(0,0,0,.32);border-color:#fff}.next-slick-dots-item button:focus,.next-slick-dots-item button:hover{background:hsla(0,0%,100%,.5)}.next-slick-dots-item.active button{background:#209bfa;border-color:#fff;-webkit-animation:zoom .3s cubic-bezier(.86,0,.07,1);animation:zoom .3s cubic-bezier(.86,0,.07,1)}.next-slick-dots.hoz{width:100%;bottom:12px;bottom:var(--slick-dots-position-bottom,12px);left:0;text-align:center}.next-slick-dots.hoz .next-slick-dots-item{margin:0 4px;margin:0 var(--slick-dots-margin-lr,4px)}.next-slick-dots.ver{width:16px;width:calc(var(--slick-dots-width, 8px) + 8px);top:0;right:20px;right:var(--slick-dots-position-right,20px);bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.next-slick-dots.ver .next-slick-dots-item{margin:0;margin:var(--slick-dots-margin-tb,0) 0}.next-slick.next-slick-hoz.next-slick-outer{padding:0 24px;padding:0 var(--slick-track-padding-lr,24px)}.next-slick.next-slick-hoz .next-slick-arrow.medium{width:28px;width:var(--slick-arrow-width-m,28px);height:56px;height:var(--slick-arrow-height-m,56px);line-height:56px;line-height:var(--slick-arrow-height-m,56px)}.next-slick.next-slick-hoz .next-slick-arrow.medium .next-icon .next-icon-remote,.next-slick.next-slick-hoz .next-slick-arrow.medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner{top:calc(50% - 28px);top:calc(50% - var(--slick-arrow-height-m, 56px)/2)}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner.next-slick-prev{left:0}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner.next-slick-next{right:0}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer{top:calc(50% - 28px);top:calc(50% - var(--slick-arrow-height-m, 56px)/2)}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer.next-slick-prev{left:-4px;left:calc(0px - var(--slick-arrow-position-lr-m, 4px))}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer.next-slick-next{right:-4px;right:calc(0px - var(--slick-arrow-position-lr-m, 4px))}.next-slick.next-slick-hoz .next-slick-arrow.large{width:48px;width:var(--slick-arrow-width-l,48px);height:96px;height:var(--slick-arrow-height-l,96px);line-height:96px;line-height:var(--slick-arrow-height-l,96px)}.next-slick.next-slick-hoz .next-slick-arrow.large .next-icon .next-icon-remote,.next-slick.next-slick-hoz .next-slick-arrow.large .next-icon:before{width:32px;font-size:32px;line-height:inherit}.next-slick.next-slick-hoz .next-slick-arrow.large.inner{top:calc(50% - 48px);top:calc(50% - var(--slick-arrow-height-l, 96px)/2)}.next-slick.next-slick-hoz .next-slick-arrow.large.inner.next-slick-prev{left:0}.next-slick.next-slick-hoz .next-slick-arrow.large.inner.next-slick-next{right:0}.next-slick.next-slick-hoz .next-slick-arrow.large.outer{top:calc(50% - 48px);top:calc(50% - var(--slick-arrow-height-l, 96px)/2)}.next-slick.next-slick-hoz .next-slick-arrow.large.outer.next-slick-prev{left:-8px;left:calc(0px - var(--slick-arrow-position-lr-l, 8px))}.next-slick.next-slick-hoz .next-slick-arrow.large.outer.next-slick-next{right:-8px;right:calc(0px - var(--slick-arrow-position-lr-l, 8px))}.next-slick.next-slick-ver.next-slick-outer{padding:24px 0;padding:var(--slick-ver-track-padding-tb,24px) 0}.next-slick.next-slick-ver .next-slick-slide{display:block;height:auto}.next-slick.next-slick-ver .next-slick-arrow.medium{width:56px;width:var(--slick-ver-arrow-width-m,56px);height:28px;height:var(--slick-ver-arrow-height-m,28px);line-height:28px;line-height:var(--slick-ver-arrow-height-m,28px)}.next-slick.next-slick-ver .next-slick-arrow.medium .next-icon .next-icon-remote,.next-slick.next-slick-ver .next-slick-arrow.medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-slick.next-slick-ver .next-slick-arrow.medium.inner{left:calc(50% - 28px);left:calc(50% - var(--slick-ver-arrow-width-m, 56px)/2)}.next-slick.next-slick-ver .next-slick-arrow.medium.inner.next-slick-prev{top:0}.next-slick.next-slick-ver .next-slick-arrow.medium.inner.next-slick-next{bottom:0}.next-slick.next-slick-ver .next-slick-arrow.medium.outer{left:calc(50% - 28px);left:calc(50% - var(--slick-ver-arrow-width-m, 56px)/2)}.next-slick.next-slick-ver .next-slick-arrow.medium.outer.next-slick-prev{top:-4px;top:calc(0px - var(--slick-ver-arrow-position-tb-m, 4px))}.next-slick.next-slick-ver .next-slick-arrow.medium.outer.next-slick-next{bottom:-4px;bottom:calc(0px - var(--slick-ver-arrow-position-tb-m, 4px))}.next-slick.next-slick-ver .next-slick-arrow.large{width:96px;width:var(--slick-ver-arrow-width-l,96px);height:48px;height:var(--slick-ver-arrow-height-l,48px);line-height:48px;line-height:var(--slick-ver-arrow-height-l,48px)}.next-slick.next-slick-ver .next-slick-arrow.large .next-icon .next-icon-remote,.next-slick.next-slick-ver .next-slick-arrow.large .next-icon:before{width:32px;font-size:32px;line-height:inherit}.next-slick.next-slick-ver .next-slick-arrow.large.inner{left:calc(50% - 48px);left:calc(50% - var(--slick-ver-arrow-width-l, 96px)/2)}.next-slick.next-slick-ver .next-slick-arrow.large.inner.next-slick-prev{top:0}.next-slick.next-slick-ver .next-slick-arrow.large.inner.next-slick-next{bottom:0}.next-slick.next-slick-ver .next-slick-arrow.large.outer{left:calc(50% - 48px);left:calc(50% - var(--slick-ver-arrow-width-l, 96px)/2)}.next-slick.next-slick-ver .next-slick-arrow.large.outer.next-slick-prev{top:-16px;top:calc(0px - var(--slick-ver-arrow-position-tb-l, 16px))}.next-slick.next-slick-ver .next-slick-arrow.large.outer.next-slick-next{bottom:-16px;bottom:calc(0px - var(--slick-ver-arrow-position-tb-l, 16px))}.next-split-btn{display:inline-block;position:relative}.next-split-btn-spacing-tb{padding:0;padding:var(--popup-spacing-tb,0) 0}.next-split-btn-trigger .next-icon{-webkit-transition:-webkit-transform .1s linear;transition:-webkit-transform .1s linear;transition:transform .1s linear;transition:transform .1s linear,-webkit-transform .1s linear}.next-split-btn-trigger.next-expand .next-split-btn-symbol-fold{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.next-split-btn-trigger.next-btn-normal:not(:disabled):not(.disabled) .next-icon{color:#999;color:var(--split-btn-trigger-normal-icon-color,#999)}.next-split-btn-trigger.next-small{padding-left:4px;padding-right:4px}.next-split-btn-trigger.next-medium{padding-left:8px;padding-right:8px}.next-split-btn-symbol-fold:before{content:"";content:var(--split-btn-fold-icon-content,"\e63d")}.next-split-btn-symbol-unfold:before{content:"";content:var(--split-btn-unfold-icon-content,"")}.next-step,.next-step *,.next-step:after,.next-step :after,.next-step:before,.next-step :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-step{width:100%;position:relative;border:none}.next-step-item{position:relative;vertical-align:middle;outline:0;height:100%}.next-step-item-body{outline:0}.next-step-item-node{-webkit-transition:all .1s linear;transition:all .1s linear}.next-step-item-node.clicked{-webkit-transform:scale3d(.8,.8,.8);transform:scale3d(.8,.8,.8)}.next-step-horizontal{overflow:hidden}.next-step-horizontal>.next-step-item{display:inline-block;text-align:left}.next-step-vertical>.next-step-item{display:block;text-align:center}.next-step-arrow{display:-webkit-box;display:-ms-flexbox;display:flex}.next-step-arrow .next-step-item{-webkit-box-flex:1;-ms-flex:1;flex:1;height:32px;height:var(--step-arrow-item-height,32px);line-height:32px;line-height:var(--step-arrow-item-height,32px);margin-left:16px;margin-left:calc(var(--step-arrow-item-height, 32px)/2);margin-right:4px;margin-right:calc(var(--step-arrow-item-height, 32px)/8)}.next-step-arrow .next-step-item:before{content:"";position:absolute;left:-16px;left:calc(0px - var(--step-arrow-item-height, 32px)/2);top:0;z-index:1;border:16px solid transparent;border:calc(var(--step-arrow-item-height, 32px)/2) solid transparent}.next-step-arrow .next-step-item:after{content:"";position:absolute;right:-16px;right:calc(0px - var(--step-arrow-item-height, 32px)/2);top:0;z-index:1;border-top:16px solid transparent;border-top:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-bottom:16px solid transparent;border-bottom:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-left:16px solid transparent;border-left:calc(var(--step-arrow-item-height, 32px)/2) solid transparent}.next-step-arrow .next-step-item .next-step-item-container{min-width:100px;height:32px;height:var(--step-arrow-item-height,32px);cursor:pointer}.next-step-arrow .next-step-item .next-step-item-container .next-step-item-title{height:32px;height:var(--step-arrow-item-height,32px);line-height:32px;line-height:var(--step-arrow-item-height,32px);font-weight:700;font-weight:var(--step-arrow-item-title-weight,bold);font-size:14px;font-size:var(--step-arrow-item-title-size,14px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.next-step-arrow>.next-step-item-wait{background:#f5f5f5;background:var(--step-arrow-item-wait-background,#f5f5f5)}.next-step-arrow>.next-step-item-wait .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-wait .next-step-item-tail-underlay{background:#ccc;background:var(--color-text1-1,#ccc)}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#f5f5f5;background:var(--step-arrow-item-wait-background,#f5f5f5);border-color:#000}.next-step-arrow>.next-step-item-wait .next-step-item-content,.next-step-arrow>.next-step-item-wait .next-step-item-title{color:#999;color:var(--step-arrow-item-title-wait-color,#999);word-break:break-word}.next-step-arrow>.next-step-item-wait .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-arrow>.next-step-item-wait .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(32px - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-wait:before{border:16px solid #f5f5f5;border-left:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow>.next-step-item-wait:after{border-left-color:#f5f5f5;border-left-color:var(--step-arrow-item-wait-background,#f5f5f5)}.next-step-arrow>.next-step-item-process{background:#209bfa;background:var(--step-arrow-item-process-background,#209bfa)}.next-step-arrow>.next-step-item-process .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-process .next-step-item-tail-underlay{background:#ccc;background:var(--color-text1-1,#ccc)}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;background:var(--step-arrow-item-process-background,#209bfa);border-color:#000}.next-step-arrow>.next-step-item-process .next-step-item-content,.next-step-arrow>.next-step-item-process .next-step-item-title{color:#fff;color:var(--step-arrow-item-title-process-color,#fff);word-break:break-word}.next-step-arrow>.next-step-item-process .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-arrow>.next-step-item-process .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-process .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(32px - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-process:before{border:16px solid #209bfa;border-left:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow>.next-step-item-process:after{border-left-color:#209bfa;border-left-color:var(--step-arrow-item-process-background,#209bfa)}.next-step-arrow>.next-step-item-finish{background:#add9ff;background:var(--step-arrow-item-finish-background,#add9ff)}.next-step-arrow>.next-step-item-finish .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-finish .next-step-item-tail-underlay{background:#ccc;background:var(--color-text1-1,#ccc)}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#add9ff;background:var(--step-arrow-item-finish-background,#add9ff);border-color:#000}.next-step-arrow>.next-step-item-finish .next-step-item-content,.next-step-arrow>.next-step-item-finish .next-step-item-title{color:#209bfa;color:var(--step-arrow-item-title-finish-color,#209bfa);word-break:break-word}.next-step-arrow>.next-step-item-finish .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-arrow>.next-step-item-finish .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(32px - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-finish:before{border:16px solid #add9ff;border-left:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow>.next-step-item-finish:after{border-left-color:#add9ff;border-left-color:var(--step-arrow-item-finish-background,#add9ff)}.next-step-arrow .next-step-item-disabled{cursor:not-allowed;background:#fafafa;background:var(--step-arrow-item-disabled-background,#fafafa)}.next-step-arrow .next-step-item-disabled .next-step-item-tail-overlay{background:#000}.next-step-arrow .next-step-item-disabled .next-step-item-tail-underlay{background:#ccc;background:var(--color-text1-1,#ccc)}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fafafa;background:var(--step-arrow-item-disabled-background,#fafafa);border-color:#000}.next-step-arrow .next-step-item-disabled .next-step-item-content,.next-step-arrow .next-step-item-disabled .next-step-item-title{color:#ccc;color:var(--step-arrow-item-title-disabled-color,#ccc);word-break:break-word}.next-step-arrow .next-step-item-disabled .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-arrow .next-step-item-disabled .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(32px - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow .next-step-item-disabled:before{border:16px solid #fafafa;border-left:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow .next-step-item-disabled:after{border-left-color:#fafafa;border-left-color:var(--step-arrow-item-disabled-background,#fafafa)}.next-step-arrow .next-step-item-disabled .next-step-item-container{cursor:not-allowed}.next-step-arrow .next-step-item-read-only,.next-step-arrow .next-step-item-read-only .next-step-item-container{cursor:default}.next-step-arrow .next-step-item-first{margin-left:0}.next-step-arrow .next-step-item-first:before{border:16px solid transparent;border:calc(var(--step-arrow-item-height, 32px)/2) solid transparent}.next-step-arrow .next-step-item-last{margin-right:0}.next-step-arrow .next-step-item-last:after{border:16px solid transparent;border:calc(var(--step-arrow-item-height, 32px)/2) solid transparent}.next-step-circle .next-step-item-container{display:inline-block;vertical-align:middle;position:relative;padding:0 8px;padding:0 var(--step-circle-item-node-padding,8px)}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-text{color:#209bfa;color:var(--step-circle-item-node-process-percent-color,#209bfa);font-size:14px;font-size:var(--step-circle-item-node-process-percent-size,14px)}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-underlay{stroke:#ccc;stroke:var(--step-circle-item-node-wait-border-color,#ccc);stroke-width:3px;stroke-width:calc(var(--step-circle-item-node-border-width, 1px)*3)}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-overlay-normal{stroke:#209bfa;stroke:var(--step-circle-item-node-finish-border-color,#209bfa);stroke-width:3px;stroke-width:calc(var(--step-circle-item-node-border-width, 1px)*3)}.next-step-circle .next-step-item-container .next-step-item-node-placeholder{display:inline-block}.next-step-circle>.next-step-item-wait .next-step-item-tail-overlay{background:#ddd;background:var(--step-circle-item-tail-wait-color,#ddd)}.next-step-circle>.next-step-item-wait .next-step-item-tail-underlay{background:#eee;background:var(--step-circle-item-tail-bg-color,#eee)}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px)}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#666;color:var(--step-circle-item-node-wait-color,#666)}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#fff;background:var(--step-circle-item-node-wait-background,#fff);border-color:#ccc;border-color:var(--step-circle-item-node-wait-border-color,#ccc)}.next-step-circle>.next-step-item-wait .next-step-item-content,.next-step-circle>.next-step-item-wait .next-step-item-title{color:#666;color:var(--step-circle-item-title-wait-color,#666);word-break:break-word}.next-step-circle>.next-step-item-wait .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle>.next-step-item-wait .next-step-item-node-placeholder{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);position:relative}.next-step-circle>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-wait .next-step-item-node-circle{display:block;width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle>.next-step-item-process .next-step-item-tail-overlay{background:#ddd;background:var(--step-circle-item-tail-process-color,#ddd)}.next-step-circle>.next-step-item-process .next-step-item-tail-underlay{background:#eee;background:var(--step-circle-item-tail-bg-color,#eee)}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px)}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#fff;color:var(--step-circle-item-node-process-color,#fff)}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;background:var(--step-circle-item-node-process-background,#209bfa);border-color:#209bfa;border-color:var(--step-circle-item-node-process-border-color,#209bfa)}.next-step-circle>.next-step-item-process .next-step-item-content,.next-step-circle>.next-step-item-process .next-step-item-title{color:#333;color:var(--step-circle-item-title-process-color,#333);word-break:break-word}.next-step-circle>.next-step-item-process .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle>.next-step-item-process .next-step-item-node-placeholder{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);position:relative}.next-step-circle>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-process .next-step-item-node-circle{display:block;width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle>.next-step-item-finish .next-step-item-tail-overlay{background:#209bfa;background:var(--step-circle-item-tail-finish-color,#209bfa)}.next-step-circle>.next-step-item-finish .next-step-item-tail-underlay{background:#eee;background:var(--step-circle-item-tail-bg-color,#eee)}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px)}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#209bfa;color:var(--step-circle-item-node-finish-color,#209bfa)}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#fff;background:var(--step-circle-item-node-finish-background,#fff);border-color:#209bfa;border-color:var(--step-circle-item-node-finish-border-color,#209bfa)}.next-step-circle>.next-step-item-finish .next-step-item-content,.next-step-circle>.next-step-item-finish .next-step-item-title{color:#666;color:var(--step-circle-item-title-finish-color,#666);word-break:break-word}.next-step-circle>.next-step-item-finish .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle>.next-step-item-finish .next-step-item-node-placeholder{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);position:relative}.next-step-circle>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-finish .next-step-item-node-circle{display:block;width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle .next-step-item-disabled .next-step-item-tail-overlay{background:#eee;background:var(--step-circle-item-tail-disabled-color,#eee)}.next-step-circle .next-step-item-disabled .next-step-item-tail-underlay{background:#eee;background:var(--step-circle-item-tail-bg-color,#eee)}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px)}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#ccc;color:var(--step-circle-item-node-disabled-color,#ccc)}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fff;background:var(--step-circle-item-node-disabled-background,#fff);border-color:#eee;border-color:var(--step-circle-item-node-disabled-border-color,#eee)}.next-step-circle .next-step-item-disabled .next-step-item-content,.next-step-circle .next-step-item-disabled .next-step-item-title{color:#ccc;color:var(--step-circle-item-title-disabled-color,#ccc);word-break:break-word}.next-step-circle .next-step-item-disabled .next-step-item-content{font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle .next-step-item-disabled .next-step-item-node-placeholder{width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);position:relative}.next-step-circle .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle .next-step-item-disabled .next-step-item-node-circle{display:block;width:32px;width:var(--step-circle-item-node-process-size,32px);height:32px;height:var(--step-circle-item-node-process-size,32px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:30px;line-height:calc(var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle .next-step-item-disabled .next-step-item-node,.next-step-circle .next-step-item-disabled .next-step-item-node-placeholder{cursor:not-allowed}.next-step-circle .next-step-item-read-only .next-step-item-node,.next-step-circle .next-step-item-read-only .next-step-item-node-placeholder{cursor:default}.next-step-circle .next-step-item-last .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal{text-align:center;white-space:nowrap}.next-step-circle.next-step-horizontal>.next-step-item .next-step-item-content,.next-step-circle.next-step-horizontal>.next-step-item .next-step-item-title{white-space:normal}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-circle-item-tail-size,1px);position:relative}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-circle-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body{width:100px;width:var(--step-circle-item-body-width,100px);left:-26px;left:calc(0px - var(--step-circle-item-body-width, 100px)/2 + var(--step-circle-item-node-process-size, 32px)/2 + var(--step-circle-item-node-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-circle-item-title-size,14px);line-height:18px;line-height:calc(var(--step-circle-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-circle-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-circle-item-title-weight,bold)}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-item-content-margin-top,4px)}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-circle-item-tail-size,1px);position:relative}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-circle-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body{width:100px;width:var(--step-circle-item-body-width,100px);left:-26px;left:calc(0px - var(--step-circle-item-body-width, 100px)/2 + var(--step-circle-item-node-process-size, 32px)/2 + var(--step-circle-item-node-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-circle-item-title-size,14px);line-height:18px;line-height:calc(var(--step-circle-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-circle-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-circle-item-title-weight,bold)}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-item-content-margin-top,4px)}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-circle-item-tail-size,1px);position:relative}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-circle-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body{width:100px;width:var(--step-circle-item-body-width,100px);left:-26px;left:calc(0px - var(--step-circle-item-body-width, 100px)/2 + var(--step-circle-item-node-process-size, 32px)/2 + var(--step-circle-item-node-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-circle-item-title-size,14px);line-height:18px;line-height:calc(var(--step-circle-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-circle-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-circle-item-title-weight,bold)}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-item-content-margin-top,4px)}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-circle-item-tail-size,1px);position:relative}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-circle-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body{width:100px;width:var(--step-circle-item-body-width,100px);left:-26px;left:calc(0px - var(--step-circle-item-body-width, 100px)/2 + var(--step-circle-item-node-process-size, 32px)/2 + var(--step-circle-item-node-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-circle-item-title-size,14px);line-height:18px;line-height:calc(var(--step-circle-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-circle-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-circle-item-title-weight,bold)}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-item-content-margin-top,4px)}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item{vertical-align:unset}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;max-width:var(--step-circle-item-body-width,100px);overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;padding-right:var(--step-circle-item-node-padding,8px);margin-top:9px;margin-top:calc(var(--step-circle-item-node-process-size, 32px)/2 - var(--step-circle-item-title-size, 14px)/2)}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-tail{width:calc(100% - 148px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2 - var(--step-circle-item-body-width, 100px));position:absolute;right:0;margin-top:-1px;margin-top:calc(0px - var(--step-circle-vertical-item-tail-size, 1px))}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;max-width:var(--step-circle-item-body-width,100px);overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;padding-right:var(--step-circle-item-node-padding,8px);margin-top:9px;margin-top:calc(var(--step-circle-item-node-process-size, 32px)/2 - var(--step-circle-item-title-size, 14px)/2)}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-tail{width:calc(100% - 148px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2 - var(--step-circle-item-body-width, 100px));position:absolute;right:0;margin-top:-1px;margin-top:calc(0px - var(--step-circle-vertical-item-tail-size, 1px))}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;max-width:var(--step-circle-item-body-width,100px);overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;padding-right:var(--step-circle-item-node-padding,8px);margin-top:9px;margin-top:calc(var(--step-circle-item-node-process-size, 32px)/2 - var(--step-circle-item-title-size, 14px)/2)}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-tail{width:calc(100% - 148px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2 - var(--step-circle-item-body-width, 100px));position:absolute;right:0;margin-top:-1px;margin-top:calc(0px - var(--step-circle-vertical-item-tail-size, 1px))}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;max-width:var(--step-circle-item-body-width,100px);overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;padding-right:var(--step-circle-item-node-padding,8px);margin-top:9px;margin-top:calc(var(--step-circle-item-node-process-size, 32px)/2 - var(--step-circle-item-title-size, 14px)/2)}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-tail{width:calc(100% - 148px);width:calc(100% - var(--step-circle-item-node-process-size, 32px) - var(--step-circle-item-node-padding, 8px)*2 - var(--step-circle-item-body-width, 100px));position:absolute;right:0;margin-top:-1px;margin-top:calc(0px - var(--step-circle-vertical-item-tail-size, 1px))}.next-step-circle.next-step-vertical{font-size:0;display:table-cell;vertical-align:middle;position:relative}.next-step-circle.next-step-vertical .next-step-item-container{padding:0}.next-step-circle.next-step-vertical>.next-step-item:last-child .next-step-item-tail{display:block;visibility:hidden}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail{width:1px;width:var(--step-circle-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-circle-item-node-padding,8px) auto}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px);position:relative}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px)}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body{position:absolute;top:0;left:16px;left:calc(var(--step-circle-item-node-process-size, 32px)/2);margin-left:8px;margin-left:var(--step-circle-item-node-padding,8px)}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{margin-top:8px;margin-top:var(--step-circle-vertical-item-title-margin-top,8px);text-align:left;font-weight:700;font-weight:var(--step-circle-item-title-weight,bold);font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-vertical-item-content-margin-top,4px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail{width:1px;width:var(--step-circle-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-circle-item-node-padding,8px) auto}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px);position:relative}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px)}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body{position:absolute;top:0;left:16px;left:calc(var(--step-circle-item-node-process-size, 32px)/2);margin-left:8px;margin-left:var(--step-circle-item-node-padding,8px)}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{margin-top:8px;margin-top:var(--step-circle-vertical-item-title-margin-top,8px);text-align:left;font-weight:700;font-weight:var(--step-circle-item-title-weight,bold);font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-vertical-item-content-margin-top,4px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail{width:1px;width:var(--step-circle-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-circle-item-node-padding,8px) auto}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px);position:relative}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px)}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body{position:absolute;top:0;left:16px;left:calc(var(--step-circle-item-node-process-size, 32px)/2);margin-left:8px;margin-left:var(--step-circle-item-node-padding,8px)}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{margin-top:8px;margin-top:var(--step-circle-vertical-item-title-margin-top,8px);text-align:left;font-weight:700;font-weight:var(--step-circle-item-title-weight,bold);font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-vertical-item-content-margin-top,4px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail{width:1px;width:var(--step-circle-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-circle-item-node-padding,8px) auto}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px);position:relative}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-circle-vertical-item-tail-size,1px)}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body{position:absolute;top:0;left:16px;left:calc(var(--step-circle-item-node-process-size, 32px)/2);margin-left:8px;margin-left:var(--step-circle-item-node-padding,8px)}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{margin-top:8px;margin-top:var(--step-circle-vertical-item-title-margin-top,8px);text-align:left;font-weight:700;font-weight:var(--step-circle-item-title-weight,bold);font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-circle-vertical-item-content-margin-top,4px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot .next-step-item-container{display:inline-block;vertical-align:middle;position:relative;padding:0 8px;padding:0 var(--step-dot-item-dot-padding,8px);margin-top:-1px;margin-bottom:-1px}.next-step-dot .next-step-item-container .next-step-item-node-placeholder{display:inline-block}.next-step-dot .next-step-item-container .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot .next-step-item-container .next-step-item-node .next-icon .next-icon-remote,.next-step-dot .next-step-item-container .next-step-item-node .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-wait .next-step-item-tail-overlay{background:#ddd;background:var(--step-dot-item-tail-wait-color,#ddd)}.next-step-dot>.next-step-item-wait .next-step-item-tail-underlay{background:#eee;background:var(--step-dot-item-tail-bg-color,#eee)}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px)}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#999;color:var(--step-dot-item-node-wait-color,#999)}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#fff;background:var(--step-dot-item-node-wait-background,#fff);border-color:#ccc;border-color:var(--step-dot-item-node-wait-border-color,#ccc)}.next-step-dot>.next-step-item-wait .next-step-item-content,.next-step-dot>.next-step-item-wait .next-step-item-title{color:#666;color:var(--step-dot-item-title-wait-color,#666);word-break:break-word}.next-step-dot>.next-step-item-wait .next-step-item-content{font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot>.next-step-item-wait .next-step-item-node-placeholder{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);position:relative}.next-step-dot>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-wait .next-step-item-node-circle{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-wait .next-step-item-content,.next-step-dot>.next-step-item-wait .next-step-item-node-dot{font-size:12px;font-size:var(--step-dot-item-content-font-size,12px)}.next-step-dot>.next-step-item-wait .next-step-item-node-dot{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-dot-item-dot-border-width,1px) solid;border-radius:50%;border-radius:var(--step-dot-item-dot-corner,50%);-webkit-transition:background-color .3s ease,border-color .3s ease;transition:background-color .3s ease,border-color .3s ease}.next-step-dot>.next-step-item-process .next-step-item-tail-overlay{background:#ddd;background:var(--step-dot-item-tail-process-color,#ddd)}.next-step-dot>.next-step-item-process .next-step-item-tail-underlay{background:#eee;background:var(--step-dot-item-tail-bg-color,#eee)}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px)}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#209bfa;color:var(--step-dot-item-node-process-color,#209bfa)}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;background:var(--step-dot-item-node-process-background,#209bfa);border-color:#209bfa;border-color:var(--step-dot-item-node-process-border-color,#209bfa)}.next-step-dot>.next-step-item-process .next-step-item-content,.next-step-dot>.next-step-item-process .next-step-item-title{color:#333;color:var(--step-dot-item-title-process-color,#333);word-break:break-word}.next-step-dot>.next-step-item-process .next-step-item-content{font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot>.next-step-item-process .next-step-item-node-placeholder{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);position:relative}.next-step-dot>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-process .next-step-item-node-circle{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-process .next-step-item-content,.next-step-dot>.next-step-item-process .next-step-item-node-dot{font-size:12px;font-size:var(--step-dot-item-content-font-size,12px)}.next-step-dot>.next-step-item-process .next-step-item-node-dot{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-dot-item-dot-border-width,1px) solid;border-radius:50%;border-radius:var(--step-dot-item-dot-corner,50%);-webkit-transition:background-color .3s ease,border-color .3s ease;transition:background-color .3s ease,border-color .3s ease}.next-step-dot>.next-step-item-finish .next-step-item-tail-overlay{background:#209bfa;background:var(--step-dot-item-tail-finish-color,#209bfa)}.next-step-dot>.next-step-item-finish .next-step-item-tail-underlay{background:#eee;background:var(--step-dot-item-tail-bg-color,#eee)}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px)}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#209bfa;color:var(--step-dot-item-node-finish-color,#209bfa)}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#fff;background:var(--step-dot-item-node-finish-background,#fff);border-color:#209bfa;border-color:var(--step-dot-item-node-finish-border-color,#209bfa)}.next-step-dot>.next-step-item-finish .next-step-item-content,.next-step-dot>.next-step-item-finish .next-step-item-title{color:#666;color:var(--step-dot-item-title-finish-color,#666);word-break:break-word}.next-step-dot>.next-step-item-finish .next-step-item-content{font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot>.next-step-item-finish .next-step-item-node-placeholder{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);position:relative}.next-step-dot>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-finish .next-step-item-node-circle{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-finish .next-step-item-content,.next-step-dot>.next-step-item-finish .next-step-item-node-dot{font-size:12px;font-size:var(--step-dot-item-content-font-size,12px)}.next-step-dot>.next-step-item-finish .next-step-item-node-dot{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-dot-item-dot-border-width,1px) solid;border-radius:50%;border-radius:var(--step-dot-item-dot-corner,50%);-webkit-transition:background-color .3s ease,border-color .3s ease;transition:background-color .3s ease,border-color .3s ease}.next-step-dot .next-step-item-disabled .next-step-item-tail-overlay{background:#eee;background:var(--step-dot-item-tail-disabled-color,#eee)}.next-step-dot .next-step-item-disabled .next-step-item-tail-underlay{background:#eee;background:var(--step-dot-item-tail-bg-color,#eee)}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px)}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#eee;color:var(--step-dot-item-node-disabled-color,#eee)}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fff;background:var(--step-dot-item-node-disabled-background,#fff);border-color:#e6e6e6;border-color:var(--step-dot-item-node-disabled-border-color,#e6e6e6)}.next-step-dot .next-step-item-disabled .next-step-item-content,.next-step-dot .next-step-item-disabled .next-step-item-title{color:#ccc;color:var(--step-dot-item-title-disabled-color,#ccc);word-break:break-word}.next-step-dot .next-step-item-disabled .next-step-item-content{font-size:var(--step-circle-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot .next-step-item-disabled .next-step-item-node-placeholder{width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);position:relative}.next-step-dot .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot .next-step-item-disabled .next-step-item-node-circle{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);font-size:12px;font-size:var(--step-circle-item-node-font-size,12px);font-weight:400;font-weight:var(--font-weight-2,normal);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-circle-item-node-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-circle-item-node-border-width,1px) solid;border-radius:50%;border-radius:var(--step-circle-item-node-corner,50%);-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon{-webkit-animation:zoomIn .3s linear;animation:zoomIn .3s linear}.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot .next-step-item-disabled .next-step-item-content,.next-step-dot .next-step-item-disabled .next-step-item-node-dot{font-size:12px;font-size:var(--step-dot-item-content-font-size,12px)}.next-step-dot .next-step-item-disabled .next-step-item-node-dot{display:block;width:12px;width:var(--step-dot-item-dot-process-size,12px);height:12px;height:var(--step-dot-item-dot-process-size,12px);line-height:10px;line-height:calc(var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-border-width, 1px)*2);text-align:center;border:1px solid;border:var(--step-dot-item-dot-border-width,1px) solid;border-radius:50%;border-radius:var(--step-dot-item-dot-corner,50%);-webkit-transition:background-color .3s ease,border-color .3s ease;transition:background-color .3s ease,border-color .3s ease}.next-step-dot .next-step-item-disabled .next-step-item-node,.next-step-dot .next-step-item-disabled .next-step-item-node-placeholder{cursor:not-allowed}.next-step-dot .next-step-item-read-only .next-step-item-node,.next-step-dot .next-step-item-read-only .next-step-item-node-placeholder{cursor:default}.next-step-dot .next-step-item-last .next-step-item-tail{display:none}.next-step-dot.next-step-horizontal{text-align:center;white-space:nowrap}.next-step-dot.next-step-horizontal>.next-step-item .next-step-item-content,.next-step-dot.next-step-horizontal>.next-step-item .next-step-item-title{white-space:normal}.next-step-dot.next-step-horizontal .next-step-item-node .next-icon{vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);width:calc(100% - var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-padding, 8px)*2);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-dot-item-tail-size,1px);position:relative}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-dot-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body{width:100px;width:var(--step-dot-item-body-width,100px);left:-36px;left:calc(0px - var(--step-dot-item-body-width, 100px)/2 + var(--step-dot-item-dot-process-size, 12px)/2 + var(--step-dot-item-dot-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-dot-item-title-size,14px);line-height:18px;line-height:calc(var(--step-dot-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-dot-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold)}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-dot-item-content-margin-top,4px)}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);width:calc(100% - var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-padding, 8px)*2);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-dot-item-tail-size,1px);position:relative}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-dot-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body{width:100px;width:var(--step-dot-item-body-width,100px);left:-36px;left:calc(0px - var(--step-dot-item-body-width, 100px)/2 + var(--step-dot-item-dot-process-size, 12px)/2 + var(--step-dot-item-dot-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-dot-item-title-size,14px);line-height:18px;line-height:calc(var(--step-dot-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-dot-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold)}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-dot-item-content-margin-top,4px)}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);width:calc(100% - var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-padding, 8px)*2);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-dot-item-tail-size,1px);position:relative}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-dot-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body{width:100px;width:var(--step-dot-item-body-width,100px);left:-36px;left:calc(0px - var(--step-dot-item-body-width, 100px)/2 + var(--step-dot-item-dot-process-size, 12px)/2 + var(--step-dot-item-dot-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-dot-item-title-size,14px);line-height:18px;line-height:calc(var(--step-dot-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-dot-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold)}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-dot-item-content-margin-top,4px)}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);width:calc(100% - var(--step-dot-item-dot-process-size, 12px) - var(--step-dot-item-dot-padding, 8px)*2);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;height:var(--step-dot-item-tail-size,1px);position:relative}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;height:var(--step-dot-item-tail-size,1px);-webkit-transition:all .1s linear;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body{width:100px;width:var(--step-dot-item-body-width,100px);left:-36px;left:calc(0px - var(--step-dot-item-body-width, 100px)/2 + var(--step-dot-item-dot-process-size, 12px)/2 + var(--step-dot-item-dot-padding, 8px)*2/2);text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{font-size:14px;font-size:var(--step-dot-item-title-size,14px);line-height:18px;line-height:calc(var(--step-dot-item-title-size, 14px) + 4px);margin-top:8px;margin-top:var(--step-dot-item-title-margin-top,8px);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold)}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px;margin-top:var(--step-dot-item-content-margin-top,4px)}.next-step-dot.next-step-vertical{padding:0 0 0 4px;font-size:0;display:table-cell;position:relative}.next-step-dot.next-step-vertical .next-step-item-container{padding:0}.next-step-dot.next-step-vertical>.next-step-item:last-child .next-step-item-tail{display:block;visibility:hidden}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail{width:1px;width:var(--step-dot-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-dot-item-dot-padding,8px) auto}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px);position:relative}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px)}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body{position:absolute;top:0;left:6px;left:calc(var(--step-dot-item-dot-process-size, 12px)/2);margin-left:8px;margin-left:var(--step-dot-item-dot-padding,8px)}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{margin-top:0;margin-top:var(--step-dot-vertical-item-title-margin-top,0);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold);text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:8px;margin-top:var(--step-dot-vertical-item-content-margin-top,8px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-dot-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail{width:1px;width:var(--step-dot-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-dot-item-dot-padding,8px) auto}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px);position:relative}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px)}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body{position:absolute;top:0;left:6px;left:calc(var(--step-dot-item-dot-process-size, 12px)/2);margin-left:8px;margin-left:var(--step-dot-item-dot-padding,8px)}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{margin-top:0;margin-top:var(--step-dot-vertical-item-title-margin-top,0);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold);text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:8px;margin-top:var(--step-dot-vertical-item-content-margin-top,8px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-dot-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail{width:1px;width:var(--step-dot-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-dot-item-dot-padding,8px) auto}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px);position:relative}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px)}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body{position:absolute;top:0;left:6px;left:calc(var(--step-dot-item-dot-process-size, 12px)/2);margin-left:8px;margin-left:var(--step-dot-item-dot-padding,8px)}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{margin-top:0;margin-top:var(--step-dot-vertical-item-title-margin-top,0);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold);text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:8px;margin-top:var(--step-dot-vertical-item-content-margin-top,8px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-dot-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail{width:1px;width:var(--step-dot-vertical-item-tail-size,1px);height:0;margin:8px auto;margin:var(--step-dot-item-dot-padding,8px) auto}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px);position:relative}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px;width:var(--step-dot-vertical-item-tail-size,1px)}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body{position:absolute;top:0;left:6px;left:calc(var(--step-dot-item-dot-process-size, 12px)/2);margin-left:8px;margin-left:var(--step-dot-item-dot-padding,8px)}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{margin-top:0;margin-top:var(--step-dot-vertical-item-title-margin-top,0);font-weight:700;font-weight:var(--step-dot-item-title-weight,bold);text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:8px;margin-top:var(--step-dot-vertical-item-content-margin-top,8px);min-height:8px;text-align:left;font-size:12px;font-size:var(--step-dot-item-content-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5)}.next-step-horizontal[dir=rtl]>.next-step-item{text-align:right}.next-step-arrow[dir=rtl] .next-step-item{height:32px;height:var(--step-arrow-item-height,32px);line-height:32px;line-height:var(--step-arrow-item-height,32px);margin-left:4px;margin-left:calc(var(--step-arrow-item-height, 32px)/8);margin-right:16px;margin-right:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow[dir=rtl] .next-step-item:before{right:-16px;right:calc(0px - var(--step-arrow-item-height, 32px)/2);left:auto;border:16px solid transparent;border:calc(var(--step-arrow-item-height, 32px)/2) solid transparent}.next-step-arrow[dir=rtl] .next-step-item:after{left:-32px;left:calc(0px - var(--step-arrow-item-height, 32px)/2*2);right:auto;border-top:16px solid transparent;border-top:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-bottom:16px solid transparent;border-bottom:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-right:16px solid transparent;border-right:calc(var(--step-arrow-item-height, 32px)/2) solid transparent}.next-step-arrow[dir=rtl]>.next-step-item-wait{background:#f5f5f5;background:var(--step-arrow-item-wait-background,#f5f5f5)}.next-step-arrow[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-wait:before{border:16px solid #f5f5f5;border-right:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow[dir=rtl]>.next-step-item-wait:after{border-right-color:#f5f5f5;border-right-color:var(--step-arrow-item-wait-background,#f5f5f5);border-left-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-process{background:#209bfa;background:var(--step-arrow-item-process-background,#209bfa)}.next-step-arrow[dir=rtl]>.next-step-item-process .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-process:before{border:16px solid #209bfa;border-right:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow[dir=rtl]>.next-step-item-process:after{border-right-color:#209bfa;border-right-color:var(--step-arrow-item-process-background,#209bfa);border-left-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-finish{background:#add9ff;background:var(--step-arrow-item-finish-background,#add9ff)}.next-step-arrow[dir=rtl]>.next-step-item-finish .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-finish:before{border:16px solid #add9ff;border-right:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow[dir=rtl]>.next-step-item-finish:after{border-right-color:#add9ff;border-right-color:var(--step-arrow-item-finish-background,#add9ff);border-left-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-disabled{background:#fafafa;background:var(--step-arrow-item-disabled-background,#fafafa)}.next-step-arrow[dir=rtl] .next-step-item-disabled .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl] .next-step-item-disabled:before{border:16px solid #fafafa;border-right:calc(var(--step-arrow-item-height, 32px)/2) solid transparent;border-style:solid;border-width:calc(var(--step-arrow-item-height, 32px)/2)}.next-step-arrow[dir=rtl] .next-step-item-disabled:after{border-right-color:#fafafa;border-right-color:var(--step-arrow-item-disabled-background,#fafafa);border-left-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-first{margin-right:0}.next-step-arrow[dir=rtl] .next-step-item-last{margin-left:0}.next-step-circle[dir=rtl] .next-step-item-disabled .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-finish .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-process .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-disabled>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-finish>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-process>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-wait>.next-step-item-body{right:-26px;right:calc(0px - var(--step-circle-item-body-width, 100px)/2 + var(--step-circle-item-node-process-size, 32px)/2 + var(--step-circle-item-node-padding, 8px)*2/2);left:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body .next-step-item-title{padding-left:8px;padding-left:var(--step-circle-item-node-padding,8px);padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body .next-step-item-title{padding-left:8px;padding-left:var(--step-circle-item-node-padding,8px);padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body .next-step-item-title{padding-left:8px;padding-left:var(--step-circle-item-node-padding,8px);padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body .next-step-item-title{padding-left:8px;padding-left:var(--step-circle-item-node-padding,8px);padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body{right:16px;right:calc(var(--step-circle-item-node-process-size, 32px)/2);left:auto;margin-right:8px;margin-right:var(--step-circle-item-node-padding,8px);margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body{right:16px;right:calc(var(--step-circle-item-node-process-size, 32px)/2);left:auto;margin-right:8px;margin-right:var(--step-circle-item-node-padding,8px);margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body{right:16px;right:calc(var(--step-circle-item-node-process-size, 32px)/2);left:auto;margin-right:8px;margin-right:var(--step-circle-item-node-padding,8px);margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body{right:16px;right:calc(var(--step-circle-item-node-process-size, 32px)/2);left:auto;margin-right:8px;margin-right:var(--step-circle-item-node-padding,8px);margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl] .next-step-item-disabled .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-finish .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-process .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-disabled>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-finish>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-process>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-wait>.next-step-item-body{right:-36px;right:calc(0px - var(--step-dot-item-body-width, 100px)/2 + var(--step-dot-item-dot-process-size, 12px)/2 + var(--step-dot-item-dot-padding, 8px)*2/2);left:auto}.next-step-dot[dir=rtl].next-step-vertical{padding:0 4px 0 0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body{right:6px;right:calc(var(--step-dot-item-dot-process-size, 12px)/2);left:auto;margin-right:8px;margin-right:var(--step-dot-item-dot-padding,8px);margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body{right:6px;right:calc(var(--step-dot-item-dot-process-size, 12px)/2);left:auto;margin-right:8px;margin-right:var(--step-dot-item-dot-padding,8px);margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body{right:6px;right:calc(var(--step-dot-item-dot-process-size, 12px)/2);left:auto;margin-right:8px;margin-right:var(--step-dot-item-dot-padding,8px);margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body{right:6px;right:calc(var(--step-dot-item-dot-process-size, 12px)/2);left:auto;margin-right:8px;margin-right:var(--step-dot-item-dot-padding,8px);margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;font-size:var(--font-size-body-1,14px);line-height:1.28571}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{text-align:right}.next-switch:after[dir=rtl]{content:" ";-webkit-transition:all .1s linear;transition:all .1s linear;-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}.next-switch-medium[dir=rtl]:after,.next-switch-small[dir=rtl]:after{right:100%;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.next-switch-on[dir=rtl]>.next-switch-children{color:#fff;color:var(--switch-normal-on-color-font,#fff)}.next-switch-on[disabled][dir=rtl]:after{left:0;right:100%;-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12))}.next-switch-off[dir=rtl]:after{right:0;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);-webkit-box-shadow:-1px 0 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--switch-rtl-on-shadow,-1px 0 3px 0 rgba(0,0,0,.12));box-shadow:-1px 0 3px 0 rgba(0,0,0,.12);box-shadow:var(--switch-rtl-on-shadow,-1px 0 3px 0 rgba(0,0,0,.12))}.next-switch-off.next-switch-small[dir=rtl]>.next-switch-children,.next-switch-off[dir=rtl]>.next-switch-children{right:auto}.next-switch{outline:none;text-align:left;cursor:pointer;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-transition:background .1s cubic-bezier(.4,0,.2,1),border-color .1s cubic-bezier(.4,0,.2,1);transition:background .1s cubic-bezier(.4,0,.2,1),border-color .1s cubic-bezier(.4,0,.2,1)}.next-switch,.next-switch *,.next-switch :after,.next-switch :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-switch-btn{-webkit-transition:all .15s cubic-bezier(.4,0,.2,1);transition:all .15s cubic-bezier(.4,0,.2,1);-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}.next-switch:after{content:""}.next-switch-loading{pointer-events:none}.next-switch-loading .next-icon-loading{color:#209bfa;color:var(--color-brand1-6,#209bfa);text-align:center;-webkit-transform:translate(-1px,-1px);-webkit-transform:translate(calc(0px - var(--switch-border-width-trigger, 1px)),calc(0px - var(--switch-border-width-trigger, 1px)));-ms-transform:translate(-1px,-1px);-ms-transform:translate(calc(0px - var(--switch-border-width-trigger, 1px)),calc(0px - var(--switch-border-width-trigger, 1px)));transform:translate(-1px,-1px);transform:translate(calc(0px - var(--switch-border-width-trigger, 1px)),calc(0px - var(--switch-border-width-trigger, 1px)))}.next-switch-loading .next-icon-loading.next-switch-inner-icon:before{vertical-align:top}.next-switch-medium{position:relative;display:inline-block;border:2px solid transparent;border:var(--switch-border-width-container,2px) solid transparent;width:48px;width:var(--switch-size-m-width,48px);height:28px;height:calc(var(--switch-size-m-trigger, 24px) + var(--switch-border-width-container, 2px)*2);border-radius:12px;border-radius:var(--switch-size-m-radius-container,12px)}.next-switch-medium:not([disabled]):active .next-switch-btn{width:31.2px;width:calc(var(--switch-size-m-trigger, 24px)*1.3)}.next-switch-medium.next-switch-on:not([disabled]):active .next-switch-btn{left:calc(100% - 31.2px);left:calc(100% - var(--switch-size-m-trigger, 24px)*1.3)}.next-switch-medium.next-switch-auto-width{min-width:48px;min-width:var(--switch-size-m-width,48px);width:auto;overflow:initial}.next-switch-medium:after{content:""}.next-switch-medium>.next-switch-btn{border:1px solid transparent;border:var(--switch-border-width-trigger,1px) solid transparent;position:absolute;left:calc(100% - 24px);left:calc(100% - var(--switch-size-m-trigger, 24px));width:24px;width:var(--switch-size-m-trigger,24px);height:24px;height:var(--switch-size-m-trigger,24px);border-radius:12px;border-radius:var(--switch-size-m-radius-trigger,12px);-webkit-box-sizing:border-box;box-sizing:border-box}.next-switch-medium>.next-switch-children{height:24px;height:var(--switch-size-m-trigger,24px);line-height:24px;line-height:var(--switch-size-m-trigger,24px);font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-switch-medium.next-switch.next-switch-on>.next-switch-children{margin:0 32px 0 8px;margin:0 calc(var(--switch-size-m-trigger, 24px) + var(--switch-size-m-trigger-padding-r, 8px)) 0 var(--switch-size-m-trigger-padding-l,8px)}.next-switch-medium.next-switch.next-switch-off>.next-switch-children{margin:0 8px 0 32px;margin:0 var(--switch-size-m-trigger-padding-r,8px) 0 calc(var(--switch-size-m-trigger, 24px) + var(--switch-size-m-trigger-padding-l, 8px))}.next-switch-medium.next-switch-loading .next-icon-loading{line-height:24px;line-height:var(--switch-size-m-trigger,24px);height:24px;height:var(--switch-size-m-trigger,24px);width:24px;width:var(--switch-size-m-trigger,24px)}.next-switch-medium.next-switch-loading .next-icon-loading .next-icon-remote,.next-switch-medium.next-switch-loading .next-icon-loading:before{width:16px;width:var(--switch-size-m-inner-icon,16px);font-size:16px;font-size:var(--switch-size-m-inner-icon,16px);line-height:inherit}.next-switch-small{position:relative;display:inline-block;border:2px solid transparent;border:var(--switch-border-width-container,2px) solid transparent;width:44px;width:var(--switch-size-s-width,44px);height:24px;height:calc(var(--switch-size-s-trigger, 20px) + var(--switch-border-width-container, 2px)*2);border-radius:12px;border-radius:var(--switch-size-s-radius-container,12px)}.next-switch-small:not([disabled]):active .next-switch-btn{width:26px;width:calc(var(--switch-size-s-trigger, 20px)*1.3)}.next-switch-small.next-switch-on:not([disabled]):active .next-switch-btn{left:calc(100% - 26px);left:calc(100% - var(--switch-size-s-trigger, 20px)*1.3)}.next-switch-small.next-switch-auto-width{min-width:44px;min-width:var(--switch-size-s-width,44px);width:auto;overflow:initial}.next-switch-small:after{content:""}.next-switch-small>.next-switch-btn{border:1px solid transparent;border:var(--switch-border-width-trigger,1px) solid transparent;position:absolute;left:calc(100% - 20px);left:calc(100% - var(--switch-size-s-trigger, 20px));width:20px;width:var(--switch-size-s-trigger,20px);height:20px;height:var(--switch-size-s-trigger,20px);border-radius:12px;border-radius:var(--switch-size-s-radius-trigger,12px);-webkit-box-sizing:border-box;box-sizing:border-box}.next-switch-small>.next-switch-children{height:20px;height:var(--switch-size-s-trigger,20px);line-height:20px;line-height:var(--switch-size-s-trigger,20px);font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-switch-small.next-switch.next-switch-on>.next-switch-children{margin:0 28px 0 8px;margin:0 calc(var(--switch-size-s-trigger, 20px) + var(--switch-size-s-trigger-padding-r, 8px)) 0 var(--switch-size-s-trigger-padding-l,8px)}.next-switch-small.next-switch.next-switch-off>.next-switch-children{margin:0 8px 0 28px;margin:0 var(--switch-size-s-trigger-padding-r,8px) 0 calc(var(--switch-size-s-trigger, 20px) + var(--switch-size-s-trigger-padding-l, 8px))}.next-switch-small.next-switch-loading .next-icon-loading{line-height:20px;line-height:var(--switch-size-s-trigger,20px);height:20px;height:var(--switch-size-s-trigger,20px);width:20px;width:var(--switch-size-s-trigger,20px)}.next-switch-small.next-switch-loading .next-icon-loading .next-icon-remote,.next-switch-small.next-switch-loading .next-icon-loading:before{width:12px;width:var(--switch-size-s-inner-icon,12px);font-size:12px;font-size:var(--switch-size-s-inner-icon,12px);line-height:inherit}.next-switch-on{background-color:#209bfa;background-color:var(--switch-normal-on-bg-color,#209bfa)}.next-switch-on .next-switch-btn{-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));background-color:#fff;background-color:var(--switch-normal-on-trigger-bg-color,#fff);border-color:transparent;border-color:var(--switch-handle-on-border-color,transparent)}.next-switch-on>.next-switch-children{color:#fff;color:var(--switch-normal-on-color-font,#fff)}.next-switch-on.hover,.next-switch-on:focus,.next-switch-on:hover{background-color:#1274e7;background-color:var(--switch-hover-on-bg-color,#1274e7)}.next-switch-on.hover .next-switch-btn,.next-switch-on:focus .next-switch-btn,.next-switch-on:hover .next-switch-btn{background-color:#fff;background-color:var(--switch-hover-on-trigger-bg-color,#fff)}.next-switch-on[disabled]{background-color:#f5f5f5;background-color:var(--switch-disabled-on-bg-color,#f5f5f5);cursor:not-allowed}.next-switch-on[disabled] .next-switch-btn{right:0;-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));background-color:#fafafa;background-color:var(--switch-disabled-on-trigger-bg-color,#fafafa);border-color:transparent;border-color:var(--switch-handle-disabled-border-color,transparent)}.next-switch-on[disabled]>.next-switch-children{color:#ccc;color:var(--switch-disabled-on-color-font,#ccc)}.next-switch-off{background-color:#f5f5f5;background-color:var(--switch-normal-off-bg-color,#f5f5f5);border-color:#f5f5f5;border-color:var(--switch-normal-off-border-color,#f5f5f5)}.next-switch-off.hover,.next-switch-off:focus,.next-switch-off:hover{background-color:#f5f5f5;background-color:var(--switch-hover-off-bg-color,#f5f5f5);border-color:#f5f5f5;border-color:var(--switch-hover-off-border-color,#f5f5f5)}.next-switch-off .next-switch-btn{left:0;-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--switch-on-shadow,1px 1px 3px 0 rgba(0,0,0,.12));background-color:#fff;background-color:var(--switch-normal-off-trigger-bg-color,#fff);border-color:transparent;border-color:var(--switch-handle-off-border-color,transparent)}.next-switch-off.hover .next-switch-btn,.next-switch-off:focus .next-switch-btn,.next-switch-off:hover .next-switch-btn{background-color:#fff;background-color:var(--switch-hover-off-trigger-bg-color,#fff)}.next-switch-off>.next-switch-children{color:#999;color:var(--switch-normal-off-color-font,#999)}.next-switch-off[disabled]{background-color:#f5f5f5;background-color:var(--switch-disabled-off-bg-color,#f5f5f5);cursor:not-allowed}.next-switch-off[disabled] .next-switch-btn{-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--switch-off-shadow,1px 1px 3px 0 rgba(0,0,0,.12));box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--switch-off-shadow,1px 1px 3px 0 rgba(0,0,0,.12));background-color:#fafafa;background-color:var(--switch-disabled-off-trigger-bg-color,#fafafa);border-color:transparent;border-color:var(--switch-handle-disabled-border-color,transparent)}.next-switch-off[disabled]>.next-switch-children{color:#ddd;color:var(--switch-disabled-off-color-font,#ddd)}.next-tabs{width:100%}.next-tabs,.next-tabs *,.next-tabs :after,.next-tabs :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-tabs-bar{outline:none}.next-tabs-bar-popup{overflow-y:auto;max-height:480px}.next-tabs-nav-container{position:relative}.next-tabs-nav-container:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-tabs-nav-wrap{overflow:hidden}.next-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.next-tabs-scrollable .next-tabs-nav-scroll{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}.next-tabs-scrollable .next-tabs-nav-scroll::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;-webkit-appearance:none;opacity:0!important}.next-tabs-nav{display:inline-block;position:relative;-webkit-transition:all .3s ease;transition:all .3s ease;list-style:none;padding:0;margin:0}.next-tabs-nav-appear,.next-tabs-nav-enter{-webkit-animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.next-tabs-nav-leave{-webkit-animation:fadeOutLeft .2s cubic-bezier(.78,.14,.15,.86);animation:fadeOutLeft .2s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.next-tabs-nav.next-disable-animation .next-tabs-tab:before{-webkit-transition:none;transition:none}.next-tabs-tab{display:inline-block;position:relative;-webkit-transition:all .1s linear;transition:all .1s linear}.next-tabs-tab-inner{position:relative;cursor:pointer;text-decoration:none}.next-tabs-tab:before{content:"";position:absolute;-webkit-transition:all .3s ease;transition:all .3s ease}.next-tabs-tab.active{font-weight:400;font-weight:var(--tab-item-font-weight-selected,normal)}.next-tabs-tab .next-tabs-tab-close{color:#666;color:var(--tab-close-icon-color,#666)}.next-tabs-tab .next-tabs-tab-close:hover{color:#333;color:var(--tab-close-icon-color-hover,#333)}.next-tabs-tab .next-tabs-tab-close:focus{outline:none}.next-tabs-tab.active .next-tabs-tab-close{color:#209bfa;color:var(--tab-close-icon-color-selected,#209bfa)}.next-tabs-tab.disabled .next-tabs-tab-close{color:#e6e6e6;color:var(--tab-close-icon-color-disabled,#e6e6e6)}.next-tabs-tab:focus{outline:none}.next-tabs-tabpane{visibility:hidden;opacity:0}.next-tabs-tabpane.active{visibility:visible;opacity:1;height:auto}.next-tabs-tabpane.hidden{overflow:hidden;height:0!important;margin:0!important;padding:0!important;border:0!important}.next-tabs-btn-down,.next-tabs-btn-next,.next-tabs-btn-prev{position:absolute;top:0;cursor:pointer;padding:0;border:0;outline:none;height:100%;background:transparent;border-color:transparent}.next-tabs-btn-down,.next-tabs-btn-down.visited,.next-tabs-btn-down:link,.next-tabs-btn-down:visited,.next-tabs-btn-next,.next-tabs-btn-next.visited,.next-tabs-btn-next:link,.next-tabs-btn-next:visited,.next-tabs-btn-prev,.next-tabs-btn-prev.visited,.next-tabs-btn-prev:link,.next-tabs-btn-prev:visited{color:#666;color:var(--tab-nav-arrow-color-normal,#666)}.next-tabs-btn-down.active,.next-tabs-btn-down.hover,.next-tabs-btn-down:active,.next-tabs-btn-down:focus,.next-tabs-btn-down:hover,.next-tabs-btn-next.active,.next-tabs-btn-next.hover,.next-tabs-btn-next:active,.next-tabs-btn-next:focus,.next-tabs-btn-next:hover,.next-tabs-btn-prev.active,.next-tabs-btn-prev.hover,.next-tabs-btn-prev:active,.next-tabs-btn-prev:focus,.next-tabs-btn-prev:hover{color:#333;color:var(--tab-nav-arrow-color-hover,#333);background:transparent;border-color:transparent;text-decoration:none}.next-tabs-btn-down.disabled,.next-tabs-btn-next.disabled,.next-tabs-btn-prev.disabled{cursor:not-allowed;color:#e6e6e6;color:var(--tab-nav-arrow-color-disabled,#e6e6e6)}.next-tabs-btn-next{right:8px;right:var(--tab-nav-arrow-right-positon-right,8px)}.next-tabs-btn-prev{right:32px;right:var(--tab-nav-arrow-left-positon-right,32px)}.next-tabs-btn-down{right:8px;right:var(--tab-nav-arrow-down-positon-right,8px)}.next-tabs .next-tab-icon-dropdown:before{content:"";content:var(--tab-icon-dropdown-content,"\e63d")}.next-tabs .next-tab-icon-prev:before{content:"";content:var(--tab-icon-prev-content,"\e61d")}.next-tabs .next-tab-icon-next:before{content:"";content:var(--tab-icon-next-content,"\e619")}.next-tabs-content{overflow:hidden}.next-tabs-vertical>.next-tabs-bar .next-tabs-nav{width:100%}.next-tabs-vertical>.next-tabs-bar .next-tabs-tab{display:block}.next-tabs.next-medium .next-tabs-nav-container-scrolling{padding-right:60px;padding-right:var(--tab-nav-scroll-padding-right-m,60px)}.next-tabs.next-medium .next-tabs-tab-inner{font-size:14px;font-size:var(--tab-item-text-size-m,14px);padding:20px 16px;padding:var(--tab-item-padding-tb-size-m,20px) var(--tab-item-padding-lr-size-m,16px)}.next-tabs.next-medium .next-tabs-tab-inner .next-icon{line-height:1}.next-tabs.next-medium .next-tabs-tab-inner .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-tab-inner .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close{margin-left:8px;margin-left:var(--tab-nav-close-icon-padding-l-size-m,8px)}.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close .next-icon-remote,.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close:before{width:12px;font-size:12px;line-height:inherit}.next-tabs.next-medium .next-tabs-btn-down .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-down .next-icon:before,.next-tabs.next-medium .next-tabs-btn-next .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-next .next-icon:before,.next-tabs.next-medium .next-tabs-btn-prev .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-prev .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tabs.next-small .next-tabs-nav-container-scrolling{padding-right:56px;padding-right:var(--tab-nav-scroll-padding-right-s,56px)}.next-tabs.next-small .next-tabs-tab-inner{font-size:12px;font-size:var(--tab-item-text-size-s,12px);padding:8px 12px;padding:var(--tab-item-padding-tb-size-s,8px) var(--tab-item-padding-lr-size-s,12px)}.next-tabs.next-small .next-tabs-tab-inner .next-icon{line-height:1}.next-tabs.next-small .next-tabs-tab-inner .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-tab-inner .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{margin-left:8px;margin-left:var(--tab-nav-close-icon-padding-l-size-s,8px)}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close .next-icon-remote,.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:16px;font-size:16px}}.next-tabs.next-small .next-tabs-btn-down .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-down .next-icon:before,.next-tabs.next-small .next-tabs-btn-next .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-next .next-icon:before,.next-tabs.next-small .next-tabs-btn-prev .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-prev .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tabs-pure>.next-tabs-bar{border-bottom:1px solid #e6e6e6;border-bottom:var(--line-solid,solid) var(--tab-pure-divider-line-width,1px) var(--tab-pure-divider-border-color,#e6e6e6);background-color:transparent;background-color:var(--tab-pure-bg-color,transparent)}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container{margin-bottom:-1px;margin-bottom:calc(0px - var(--tab-pure-divider-line-width, 1px));-webkit-box-shadow:none;-webkit-box-shadow:var(--tab-pure-divider-shadow,none);box-shadow:none;box-shadow:var(--tab-pure-divider-shadow,none)}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab{color:#666;color:var(--tab-pure-text-color-normal,#666);background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:hover{cursor:pointer;color:#333;color:var(--tab-pure-text-color-hover,#333);background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active{z-index:1;color:#209bfa;color:var(--tab-pure-text-color-selected,#209bfa);background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#e6e6e6;color:var(--tab-pure-text-color-disabled,#e6e6e6);background:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:before{border-radius:0;width:0;border-bottom:2px solid #209bfa;border-bottom:var(--tab-pure-ink-bar-width,2px) solid var(--tab-pure-ink-bar-color,#209bfa);left:50%;bottom:0}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active:before{width:100%;width:calc(100% - var(--tab-pure-ink-bar-padding-l, 0px)*2);left:0;left:calc(var(--tab-pure-ink-bar-padding-l, 0px))}.next-tabs-wrapped>.next-tabs-bar{background:transparent;background:var(--tab-wrapped-bar-bg-color,transparent)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab{color:#666;color:var(--tab-wrapped-text-color,#666);background-color:#f9f9f9;background-color:var(--tab-wrapped-bg-color,#f9f9f9)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab:hover{cursor:pointer;color:#333;color:var(--tab-wrapped-text-color-hover,#333);background-color:#f5f5f5;background-color:var(--tab-wrapped-bg-color-hover,#f5f5f5)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#209bfa;color:var(--tab-wrapped-text-color-selected,#209bfa);background-color:#fff;background-color:var(--tab-wrapped-bg-color-selected,#fff)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;color:var(--tab-wrapped-text-color-disabled,#ccc);background:#fafafa;background:var(--tab-wrapped-bg-color-disabled,#fafafa)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close{color:#666;color:var(--tab-close-icon-color,#666)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close:hover{color:#333;color:var(--tab-close-icon-color-hover,#333)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close:focus{outline:none}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active .next-tabs-tab-close{color:#209bfa;color:var(--tab-close-icon-color-selected,#209bfa)}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled .next-tabs-tab-close{color:#e6e6e6;color:var(--tab-close-icon-color-disabled,#e6e6e6)}.next-tabs-wrapped:after,.next-tabs-wrapped:before{content:"";display:table}.next-tabs-wrapped:after{clear:both}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar,.next-tabs-wrapped>.next-tabs-content{position:relative}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab{margin-right:4px;margin-right:var(--tab-wrapped-tab-margin-right,4px);border:1px solid #e6e6e6;border:var(--tab-wrapped-border-line-style,solid) var(--tab-wrapped-border-line-width,1px) var(--tab-wrapped-border-line-color,#e6e6e6);border-radius:3px 3px 0 0;border-radius:var(--tab-wrapped-tab-corner-radius,3px) var(--tab-wrapped-tab-corner-radius,3px) 0 0;border-width:1px;border-width:var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-line-width,1px)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd;border-color:var(--tab-wrapped-border-line-color-hover,#ddd)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #e6e6e6 #fff;border-color:var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-bg-color-selected,#fff)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;border-radius:var(--tab-wrapped-tab-corner-radius,3px);width:0;border-top:2px solid #209bfa;border-top:var(--tab-wrapped-ink-bar-width,2px) solid var(--tab-wrapped-ink-bar-color,#209bfa);left:50%;top:-1px;top:calc(0px - var(--tab-wrapped-border-line-width, 1px))}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active:before{width:calc(100% - 6px);width:calc(100% - var(--tab-wrapped-tab-corner-radius, 3px)*2 - var(--tab-wrapped-ink-bar-padding-l, 0px)*2);left:3px;left:calc(var(--tab-wrapped-tab-corner-radius, 3px) + var(--tab-wrapped-ink-bar-padding-l, 0px))}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-width:1px;border-width:var(--tab-wrapped-border-line-width,1px)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar:before{content:"";position:absolute;top:100%;width:100%;height:0;border-bottom:1px solid #e6e6e6;border-bottom:var(--tab-wrapped-content-border-line-width,1px) var(--tab-wrapped-content-border-line-style,solid) var(--tab-wrapped-border-line-color,#e6e6e6);-webkit-transform:translateY(-1px);-webkit-transform:translateY(calc(0px - var(--tab-wrapped-content-border-line-width, 1px)));-ms-transform:translateY(-1px);-ms-transform:translateY(calc(0px - var(--tab-wrapped-content-border-line-width, 1px)));transform:translateY(-1px);transform:translateY(calc(0px - var(--tab-wrapped-content-border-line-width, 1px)));display:block}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar{position:relative}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab{margin-right:4px;margin-right:var(--tab-wrapped-tab-margin-right,4px);border:1px solid #e6e6e6;border:var(--tab-wrapped-border-line-style,solid) var(--tab-wrapped-border-line-width,1px) var(--tab-wrapped-border-line-color,#e6e6e6);border-radius:0 0 3px 3px;border-radius:0 0 var(--tab-wrapped-tab-corner-radius,3px) var(--tab-wrapped-tab-corner-radius,3px)}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd;border-color:var(--tab-wrapped-border-line-color-hover,#ddd)}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active{border-color:#fff #e6e6e6 #e6e6e6;border-color:var(--tab-wrapped-bg-color-selected,#fff) var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-border-line-color,#e6e6e6)}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;border-radius:var(--tab-wrapped-tab-corner-radius,3px);width:0;border-bottom:2px solid #209bfa;border-bottom:var(--tab-wrapped-ink-bar-width,2px) solid var(--tab-wrapped-ink-bar-color,#209bfa);left:50%;bottom:-1px;bottom:calc(0px - var(--tab-wrapped-border-line-width, 1px))}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active:before{width:calc(100% - 6px);width:calc(100% - var(--tab-wrapped-tab-corner-radius, 3px)*2 - var(--tab-wrapped-ink-bar-padding-l, 0px)*2);left:3px;left:calc(var(--tab-wrapped-tab-corner-radius, 3px) + var(--tab-wrapped-ink-bar-padding-l, 0px))}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-content{top:1px;top:var(--tab-wrapped-border-line-width,1px);border-bottom:1px solid #e6e6e6;border-bottom:var(--tab-wrapped-content-border-line-width,1px) var(--tab-wrapped-content-border-line-style,solid) var(--tab-wrapped-border-line-color,#e6e6e6)}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar{float:left}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab{float:none;margin-bottom:4px;margin-bottom:var(--tab-wrapped-tab-margin-bottom,4px);border:1px solid #e6e6e6;border:var(--tab-wrapped-border-line-style,solid) var(--tab-wrapped-border-line-width,1px) var(--tab-wrapped-border-line-color,#e6e6e6);border-radius:3px 0 0 3px;border-radius:var(--tab-wrapped-tab-corner-radius,3px) 0 0 var(--tab-wrapped-tab-corner-radius,3px);border-width:1px;border-width:var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-line-width,1px) var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-side-width,1px)}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd;border-color:var(--tab-wrapped-border-line-color-hover,#ddd)}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #fff #e6e6e6 #e6e6e6;border-color:var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-bg-color-selected,#fff) var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-border-line-color,#e6e6e6)}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;border-radius:var(--tab-wrapped-tab-corner-radius,3px);height:0;border-left:2px solid #209bfa;border-left:var(--tab-wrapped-ink-bar-width,2px) solid var(--tab-wrapped-ink-bar-color,#209bfa);top:50%;left:-1px;left:calc(0px - var(--tab-wrapped-border-line-width, 1px))}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active:before{height:calc(100% - 6px);height:calc(100% - var(--tab-wrapped-tab-corner-radius, 3px)*2);top:3px;top:var(--tab-wrapped-tab-corner-radius,3px)}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-width:1px;border-width:var(--tab-wrapped-border-line-width,1px)}.next-tabs-wrapped.next-tabs-left>.next-tabs-content{right:1px;right:var(--tab-wrapped-border-line-width,1px);border-left:1px solid #e6e6e6;border-left:var(--tab-wrapped-content-border-line-width,1px) var(--tab-wrapped-content-border-line-style,solid) var(--tab-wrapped-border-line-color,#e6e6e6)}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar{float:right}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab{float:none;margin-bottom:4px;margin-bottom:var(--tab-wrapped-tab-margin-bottom,4px);border:1px solid #e6e6e6;border:var(--tab-wrapped-border-line-style,solid) var(--tab-wrapped-border-line-width,1px) var(--tab-wrapped-border-line-color,#e6e6e6);border-radius:0 3px 3px 0;border-radius:0 var(--tab-wrapped-tab-corner-radius,3px) var(--tab-wrapped-tab-corner-radius,3px) 0;border-width:1px;border-width:var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-side-width,1px) var(--tab-wrapped-border-line-width,1px)}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd;border-color:var(--tab-wrapped-border-line-color-hover,#ddd)}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #e6e6e6 #e6e6e6 #fff;border-color:var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-border-line-color,#e6e6e6) var(--tab-wrapped-bg-color-selected,#fff)}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;border-radius:var(--tab-wrapped-tab-corner-radius,3px);height:0;border-right:2px solid #209bfa;border-right:var(--tab-wrapped-ink-bar-width,2px) solid var(--tab-wrapped-ink-bar-color,#209bfa);top:50%;right:-1px;right:calc(0px - var(--tab-wrapped-border-line-width, 1px))}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active:before{height:calc(100% - 6px);height:calc(100% - var(--tab-wrapped-tab-corner-radius, 3px)*2);top:3px;top:var(--tab-wrapped-tab-corner-radius,3px)}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-width:1px;border-width:var(--tab-wrapped-border-line-width,1px)}.next-tabs-wrapped.next-tabs-right>.next-tabs-content{right:-1px;right:calc(0px - var(--tab-wrapped-border-line-width, 1px));border-right:1px solid #e6e6e6;border-right:var(--tab-wrapped-content-border-line-width,1px) var(--tab-wrapped-content-border-line-style,solid) var(--tab-wrapped-border-line-color,#e6e6e6)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab{-webkit-transition:background-color .1s linear;transition:background-color .1s linear;border:1px solid #ddd;border:var(--tab-capsule-tab-border-line-width,1px) var(--tab-capsule-tab-border-line-style,solid) var(--tab-capsule-tab-border-line-color,#ddd);border-right-color:transparent;margin-right:-1px;margin-right:calc(0px - var(--tab-capsule-tab-border-line-width, 1px));color:#333;color:var(--tab-capsule-text-color,#333);background-color:#f9f9f9;background-color:var(--tab-capsule-bg-color,#f9f9f9)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:first-child{border-radius:3px 0 0 3px;border-radius:var(--tab-capsule-corner-radius,3px) 0 0 var(--tab-capsule-corner-radius,3px)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-radius:0 3px 3px 0;border-radius:0 var(--tab-capsule-corner-radius,3px) var(--tab-capsule-corner-radius,3px) 0}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active,.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-right:1px solid #ddd;border-right:var(--tab-capsule-tab-border-line-width,1px) var(--tab-capsule-tab-border-line-style,solid) var(--tab-capsule-tab-border-line-color,#ddd)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-color:#209bfa;border-color:var(--tab-capsule-tab-border-line-color-active,#209bfa)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{border-color:#eee;border-color:var(--tab-capsule-tab-border-line-color-disabled,#eee)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:hover{z-index:2;border-right:1px solid #ddd;border-right:var(--tab-capsule-tab-border-line-width,1px) var(--tab-capsule-tab-border-line-style,solid) var(--tab-capsule-tab-border-line-color,#ddd);border-color:#ddd;border-color:var(--tab-capsule-tab-border-line-color-hover,#ddd);cursor:pointer;color:#333;color:var(--tab-capsule-text-color-hover,#333);background-color:#f5f5f5;background-color:var(--tab-capsule-bg-color-hover,#f5f5f5)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#fff;color:var(--tab-capsule-text-color-selected,#fff);background-color:#209bfa;background-color:var(--tab-capsule-bg-color-selected,#209bfa)}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;color:var(--tab-capsule-text-color-disabled,#ccc);background:#fafafa;background:var(--tab-capsule-bg-color-disabled,#fafafa)}.next-tabs-text>.next-tabs-bar .next-tabs-tab{color:#666;color:var(--tab-text-text-color-normal,#666);background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab:hover{cursor:pointer;color:#333;color:var(--tab-text-text-color-hover,#333);background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#209bfa;color:var(--tab-text-text-color-selected,#209bfa);background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;color:var(--tab-text-text-color-disabled,#ccc);background:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab:not(:last-child):after{content:"";position:absolute;right:0;top:calc(50% - 4px);top:calc(50% - var(--tab-text-item-sep-height, 8px)/2);width:1px;width:var(--tab-text-item-sep-width,1px);height:8px;height:var(--tab-text-item-sep-height,8px);background-color:#e6e6e6;background-color:var(--tab-text-item-sep-color,#e6e6e6)}.next-tabs-pure>.next-tabs-bar{position:relative}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-tabs-capsule>.next-tabs-bar{position:relative}.next-tabs-capsule>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-tabs-text>.next-tabs-bar{position:relative}.next-tabs-text>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-tabs[dir=rtl].next-medium .next-tabs-nav-container-scrolling{padding-left:60px;padding-left:var(--tab-nav-scroll-padding-right-m,60px);padding-right:0}.next-tabs[dir=rtl].next-medium .next-tabs-tab-close{padding-right:8px;padding-right:var(--tab-nav-close-icon-padding-l-size-m,8px);padding-left:0}.next-tabs[dir=rtl].next-small .next-tabs-nav-container-scrolling{padding-left:56px;padding-left:var(--tab-nav-scroll-padding-right-s,56px);padding-right:0}.next-tabs[dir=rtl].next-small .next-tabs-tab-close{padding-right:8px;padding-right:var(--tab-nav-close-icon-padding-l-size-s,8px);padding-left:0}.next-tabs[dir=rtl].next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-nav-extra,.next-tabs[dir=rtl].next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-nav-extra,.next-tabs[dir=rtl]>.next-tabs-bar .next-tabs-nav-extra{right:auto;left:0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border-top:1px solid #ddd;border-bottom:1px solid #ddd;border-right:1px solid #ddd;border:var(--tab-capsule-tab-border-line-width,1px) var(--tab-capsule-tab-border-line-style,solid) var(--tab-capsule-tab-border-line-color,#ddd);border-left:0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:first-child{border-left:0;border-radius:0 3px 3px 0;border-radius:0 var(--tab-capsule-corner-radius,3px) var(--tab-capsule-corner-radius,3px) 0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-radius:3px 0 0 3px;border-radius:var(--tab-capsule-corner-radius,3px) 0 0 var(--tab-capsule-corner-radius,3px)}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active,.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-left:1px solid #ddd;border-left:var(--tab-capsule-tab-border-line-width,1px) var(--tab-capsule-tab-border-line-style,solid) var(--tab-capsule-tab-border-line-color,#ddd)}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{margin-left:-1px;margin-left:calc(0px - var(--tab-capsule-tab-border-line-width, 1px));margin-right:auto;border-color:#209bfa;border-color:var(--tab-capsule-tab-border-line-color-active,#209bfa)}.next-tabs[dir=rtl] .next-tabs-btn-next{left:8px;left:var(--tab-nav-arrow-right-positon-right,8px);right:auto}.next-tabs[dir=rtl] .next-tabs-btn-prev{left:32px;left:var(--tab-nav-arrow-left-positon-right,32px);right:auto}.next-tabs[dir=rtl] .next-tabs-btn-down{left:8px;left:var(--tab-nav-arrow-down-positon-right,8px);right:auto}.next-tabs-text[dir=rtl]>.next-tabs-bar .next-tabs-tab:not(:last-child):after{content:"";position:absolute;left:0;right:auto}@-webkit-keyframes fadeInRightForTag{0%{opacity:0;-webkit-transform:rotate(45deg) translateX(20px);transform:rotate(45deg) translateX(20px)}to{opacity:1;-webkit-transform:rotate(45deg) translateX(0);transform:rotate(45deg) translateX(0)}}@keyframes fadeInRightForTag{0%{opacity:0;-webkit-transform:rotate(45deg) translateX(20px);transform:rotate(45deg) translateX(20px)}to{opacity:1;-webkit-transform:rotate(45deg) translateX(0);transform:rotate(45deg) translateX(0)}}.next-tag>.next-tag-body{overflow:hidden;text-overflow:ellipsis}.next-tag-checkable.next-tag-level-secondary{color:#333;color:var(--tag-normal-text-color,#333);border-color:transparent;background-color:transparent}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover{color:#209bfa;color:var(--tag-normal-text-color-hover,#209bfa)}.next-tag-default.next-tag-level-primary{color:#666;color:var(--tag-fill-text-color,#666);border-color:#f5f5f5;border-color:var(--tag-fill-border-color,#f5f5f5);background-color:#f5f5f5;background-color:var(--tag-fill-bg-color,#f5f5f5)}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;color:var(--tag-fill-text-color-hover,#333);border-color:#f2f2f2;border-color:var(--tag-fill-border-color-hover,#f2f2f2);background-color:#f2f2f2;background-color:var(--tag-fill-bg-color-hover,#f2f2f2)}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333;color:var(--tag-fill-tail-color-hover,#333)}.disabled.next-tag-default.next-tag-level-primary,.next-tag-default.next-tag-level-primary[disabled]{color:#ccc;color:var(--tag-fill-text-color-disabled,#ccc);border-color:#fafafa;border-color:var(--tag-fill-border-color-disabled,#fafafa);background-color:#fafafa;background-color:var(--tag-fill-bg-color-disabled,#fafafa)}.disabled.next-tag-default.next-tag-level-primary>.next-tag-close-btn,.next-tag-default.next-tag-level-primary[disabled]>.next-tag-close-btn{color:#ccc;color:var(--tag-fill-tail-color-disabled,#ccc)}.next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#666;color:var(--tag-fill-tail-color,#666)}.next-tag-closable.next-tag-level-primary{color:#666;color:var(--tag-closable-primary-fill-text-color,#666);border-color:#f5f5f5;border-color:var(--tag-closable-primary-fill-border-color,#f5f5f5);background-color:#f5f5f5;background-color:var(--tag-closable-primary-fill-bg-color,#f5f5f5)}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;color:var(--tag-closable-primary-fill-text-color-hover,#333);border-color:#f2f2f2;border-color:var(--tag-closable-primary-fill-border-color-hover,#f2f2f2);background-color:#f2f2f2;background-color:var(--tag-closable-primary-fill-bg-color-hover,#f2f2f2)}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333;color:var(--tag-fill-tail-color-hover,#333)}.disabled.next-tag-closable.next-tag-level-primary,.next-tag-closable.next-tag-level-primary[disabled]{color:#ccc;color:var(--tag-closable-primary-fill-text-color-disabled,#ccc);border-color:#fafafa;border-color:var(--tag-closable-primary-fill-border-color-disabled,#fafafa);background-color:#fafafa;background-color:var(--tag-closable-primary-fill-bg-color-disabled,#fafafa)}.disabled.next-tag-closable.next-tag-level-primary>.next-tag-close-btn,.next-tag-closable.next-tag-level-primary[disabled]>.next-tag-close-btn{color:#ccc;color:var(--tag-fill-tail-color-disabled,#ccc)}.next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#666;color:var(--tag-fill-tail-color,#666)}.next-tag-checkable.next-tag-level-primary{color:#666;color:var(--tag-checkable-fill-text-color,#666);border-color:#f5f5f5;border-color:var(--tag-checkable-fill-border-color,#f5f5f5);background-color:#f5f5f5;background-color:var(--tag-checkable-fill-bg-color,#f5f5f5)}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;color:var(--tag-checkable-fill-text-color-hover,#333);border-color:#f2f2f2;border-color:var(--tag-checkable-fill-border-color-hover,#f2f2f2);background-color:#f2f2f2;background-color:var(--tag-checkable-fill-bg-color-hover,#f2f2f2)}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333;color:var(--tag-checkable-fill-tail-color-hover,#333)}.disabled.next-tag-checkable.next-tag-level-primary,.next-tag-checkable.next-tag-level-primary[disabled]{color:#ccc;color:var(--tag-checkable-fill-text-color-disabled,#ccc);border-color:#fafafa;border-color:var(--tag-checkable-fill-border-color-disabled,#fafafa);background-color:#fafafa;background-color:var(--tag-checkable-fill-bg-color-disabled,#fafafa)}.disabled.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary[disabled]>.next-tag-close-btn{color:#ccc;color:var(--tag-checkable-fill-tail-color-disabled,#ccc)}.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#666;color:var(--tag-checkable-fill-tail-color,#666)}.next-tag-checkable.next-tag-level-primary.checked{color:#fff;color:var(--tag-checkable-primary-text-color,#fff);border-color:#209bfa;border-color:var(--tag-checkable-primary-border-color,#209bfa);background-color:#209bfa;background-color:var(--tag-checkable-primary-bg-color,#209bfa)}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover{color:#fff;color:var(--tag-checkable-primary-text-color-hover,#fff);border-color:#1274e7;border-color:var(--tag-checkable-primary-border-color-hover,#1274e7);background-color:#1274e7;background-color:var(--tag-checkable-primary-bg-color-hover,#1274e7)}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#fff;color:var(--tag-checkable-primary-tail-color-hover,#fff)}.disabled.next-tag-checkable.next-tag-level-primary.checked,.next-tag-checkable.next-tag-level-primary.checked[disabled]{color:#ccc;color:var(--tag-checkable-primary-text-color-disabled,#ccc);border-color:#fafafa;border-color:var(--tag-checkable-primary-border-color-disabled,#fafafa);background-color:#fafafa;background-color:var(--tag-checkable-primary-bg-color-disabled,#fafafa)}.disabled.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked[disabled]>.next-tag-close-btn{color:#fff;color:var(--tag-checkable-primary-tail-color,#fff)}.next-tag-default.next-tag-level-normal{color:#666;color:var(--tag-bordered-text-color,#666);border-color:#ddd;border-color:var(--tag-bordered-border-color,#ddd);background-color:transparent;background-color:var(--tag-bordered-bg,transparent)}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;color:var(--tag-bordered-text-color-hover,#333);border-color:#ccc;border-color:var(--tag-bordered-border-color-hover,#ccc);background-color:transparent;background-color:var(--tag-bordered-bg-hover,transparent)}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333;color:var(--tag-bordered-tail-color-hover,#333)}.disabled.next-tag-default.next-tag-level-normal,.next-tag-default.next-tag-level-normal[disabled]{color:#ccc;color:var(--tag-bordered-text-color-disabled,#ccc);border-color:#eee;border-color:var(--tag-bordered-border-color-disabled,#eee);background-color:#fafafa;background-color:var(--tag-bordered-bg-disabled,#fafafa)}.disabled.next-tag-default.next-tag-level-normal>.next-tag-close-btn,.next-tag-default.next-tag-level-normal[disabled]>.next-tag-close-btn{color:#ccc;color:var(--tag-bordered-tail-color-disabled,#ccc)}.next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#666;color:var(--tag-bordered-tail-color,#666)}.next-tag-closable.next-tag-level-normal{color:#666;color:var(--tag-closable-bordered-text-color,#666);border-color:#ddd;border-color:var(--tag-closable-bordered-border-color,#ddd);background-color:transparent;background-color:var(--tag-closable-bordered-bg,transparent)}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;color:var(--tag-closable-bordered-text-color-hover,#333);border-color:#ccc;border-color:var(--tag-closable-bordered-border-color-hover,#ccc);background-color:transparent;background-color:var(--tag-closable-bordered-bg-hover,transparent)}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333;color:var(--tag-closable-bordered-tail-color-hover,#333)}.disabled.next-tag-closable.next-tag-level-normal,.next-tag-closable.next-tag-level-normal[disabled]{color:#ccc;color:var(--tag-closable-bordered-text-color-disabled,#ccc);border-color:#eee;border-color:var(--tag-closable-bordered-border-color-disabled,#eee);background-color:transparent;background-color:var(--tag-closable-bordered-bg-disabled,transparent)}.disabled.next-tag-closable.next-tag-level-normal>.next-tag-close-btn,.next-tag-closable.next-tag-level-normal[disabled]>.next-tag-close-btn{color:#ccc;color:var(--tag-closable-bordered-tail-color-disabled,#ccc)}.next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#666;color:var(--tag-closable-bordered-tail-color,#666)}.next-tag-checkable.next-tag-level-normal.checked{color:#209bfa;color:var(--tag-secondary-text-color,#209bfa);border-color:#209bfa;border-color:var(--tag-secondary-border-color,#209bfa);background-color:transparent;background-color:var(--tag-secondary-bg,transparent)}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover{color:#1274e7;color:var(--tag-secondary-text-color-hover,#1274e7);border-color:#1274e7;border-color:var(--tag-secondary-border-color-hover,#1274e7);background-color:transparent;background-color:var(--tag-secondary-bg-hover,transparent)}.next-tag-checkable.next-tag-level-secondary.checked{color:#209bfa;color:var(--tag-secondary-text-color,#209bfa);border-color:#209bfa;border-color:var(--tag-secondary-border-color,#209bfa);background-color:transparent;background-color:var(--tag-secondary-bg,transparent)}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover{color:#1274e7;color:var(--tag-secondary-text-color-hover,#1274e7);border-color:#1274e7;border-color:var(--tag-secondary-border-color-hover,#1274e7);background-color:transparent;background-color:var(--tag-secondary-bg-hover,transparent)}.next-tag-checkable.next-tag-level-secondary.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;background-color:var(--tag-checkable-secondary-bg-selected,#209bfa);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.next-tag-checkable.next-tag-level-secondary.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"";content:var(--icon-content-select,"\e632");-webkit-transform:scale(.6);-ms-transform:scale(.6);transform:scale(.6);color:#fff;color:var(--tag-checkable-secondary-icon-color-selected,#fff)}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before{background-color:#1274e7;background-color:var(--tag-checkable-secondary-bg-selected-hover,#1274e7)}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:after,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:after{color:#fff;color:var(--tag-checkable-secondary-icon-color-selected-hover,#fff)}.next-tag-checkable.next-tag-level-secondary.checked:disabled:before,.next-tag-checkable.next-tag-level-secondary.checked[disabled]:before{background-color:#eee;background-color:var(--tag-checkable-secondary-bg-selected-disabled,#eee)}.next-tag-checkable.next-tag-level-secondary.checked:disabled:after,.next-tag-checkable.next-tag-level-secondary.checked[disabled]:after{color:#fff;color:var(--tag-checkable-secondary-icon-color-selected-disabled,#fff)}.next-tag-checkable.next-tag-level-normal{color:#666;color:var(--tag-checkable-normal-text-color,#666);border-color:#ddd;border-color:var(--tag-checkable-normal-border-color,#ddd);background-color:transparent;background-color:var(--tag-checkable-normal-bg,transparent)}.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;color:var(--tag-checkable-normal-text-color-hover,#333);border-color:#ddd;border-color:var(--tag-checkable-normal-border-color-hover,#ddd);background-color:transparent;background-color:var(--tag-checkable-normal-bg-hover,transparent)}.disabled.next-tag-checkable.next-tag-level-normal,.next-tag-checkable.next-tag-level-normal[disabled]{color:#ccc;color:var(--tag-checkable-normal-text-selected-disabled,#ccc);border-color:#eee;border-color:var(--tag-checkable-normal-border-selected-disabled,#eee);background-color:#fafafa;background-color:var(--tag-checkable-normal-bg-selected-disabled,#fafafa)}.next-tag-checkable.next-tag-level-normal.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;background-color:var(--tag-checkable-normal-bg-selected,#209bfa);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.next-tag-checkable.next-tag-level-normal.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"";content:var(--icon-content-select,"\e632");-webkit-transform:scale(.6);-ms-transform:scale(.6);transform:scale(.6);color:#fff;color:var(--tag-checkable-normal-icon-color-selected,#fff)}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before{background-color:#1274e7;background-color:var(--tag-checkable-normal-bg-selected-hover,#1274e7)}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:after,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:after{color:#fff;color:var(--tag-checkable-normal-icon-color-selected-hover,#fff)}.next-tag-checkable.next-tag-level-normal.checked:disabled:before,.next-tag-checkable.next-tag-level-normal.checked[disabled]:before{background-color:#eee;background-color:var(--tag-checkable-normal-tick-bg-selected-disabled,#eee)}.next-tag-checkable.next-tag-level-normal.checked:disabled:after,.next-tag-checkable.next-tag-level-normal.checked[disabled]:after{color:#fff;color:var(--tag-checkable-normal-icon-color-selected-disabled,#fff)}.next-tag-closable.next-tag-level-normal:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#ddd;background-color:var(--tag-closable-normal-bg,#ddd);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.next-tag-closable.next-tag-level-normal:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"";content:var(--icon-content-close,"\e626");-webkit-transform:scale(.6);-ms-transform:scale(.6);transform:scale(.6);color:#fff;color:var(--tag-closable-normal-icon-color,#fff)}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before{background-color:#ccc;background-color:var(--tag-closable-normal-bg-hover,#ccc)}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:after,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:after{color:#fff;color:var(--tag-closable-normal-icon-color-hover,#fff)}.next-tag-closable.next-tag-level-normal:disabled:before,.next-tag-closable.next-tag-level-normal[disabled]:before{background-color:#eee;background-color:var(--tag-closable-normal-bg-disabled,#eee)}.next-tag-closable.next-tag-level-normal:disabled:after,.next-tag-closable.next-tag-level-normal[disabled]:after{color:#fff;color:var(--tag-closable-normal-icon-color-disabled,#fff)}.next-tag-group .next-tag-large,.next-tag-group .next-tag-medium{margin-right:8px;margin-bottom:8px}.next-tag-group .next-tag-small{margin-right:4px;margin-bottom:4px}.next-tag{display:inline-block;max-width:100%;vertical-align:middle;border-width:1px;border-width:var(--tag-border-width,1px);border-radius:3px;border-radius:var(--tag-corner-radius,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--tag-shadow,none);box-shadow:none;box-shadow:var(--tag-shadow,none);border-style:solid;overflow:hidden;white-space:nowrap;-webkit-transition:all .1s linear;transition:all .1s linear;font-size:0;outline:0}.next-tag,.next-tag *,.next-tag :after,.next-tag :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-tag>.next-tag-body{position:relative;display:inline-block;height:100%;text-align:center;vertical-align:middle;max-width:100%;cursor:default}.next-tag>.next-tag-body>a{text-decoration:none;color:inherit}.next-tag>.next-tag-body>a:before{content:" ";position:absolute;display:block;top:0;left:0;right:0;bottom:0}.next-tag>.next-tag-body .next-icon{line-height:1;vertical-align:baseline}.next-tag>.next-tag-body .next-icon:before{font-size:inherit}.next-tag.next-tag-body-pointer{cursor:pointer}.next-tag.disabled,.next-tag[disabled]{cursor:not-allowed;pointer-events:none}.next-tag-blue{background-color:#4494f9;border-color:#4494f9;color:#fff}.next-tag-blue-inverse{background-color:rgba(68,148,249,.25);border-color:#4494f9;color:#4494f9}.next-tag-green{background-color:#46bc15;border-color:#46bc15;color:#fff}.next-tag-green-inverse{background-color:rgba(70,188,21,.25);border-color:#46bc15;color:#46bc15}.next-tag-orange{background-color:#ff9300;border-color:#ff9300;color:#fff}.next-tag-orange-inverse{background-color:rgba(255,147,0,.25);border-color:#ff9300;color:#ff9300}.next-tag-red{background-color:#ff3000;border-color:#ff3000;color:#fff}.next-tag-red-inverse{background-color:rgba(255,48,0,.25);border-color:#ff3000;color:#ff3000}.next-tag-turquoise{background-color:#01c1b2;border-color:#01c1b2;color:#fff}.next-tag-turquoise-inverse{background-color:rgba(1,193,178,.25);border-color:#01c1b2;color:#01c1b2}.next-tag-yellow{background-color:#fccc12;border-color:#fccc12;color:#fff}.next-tag-yellow-inverse{background-color:rgba(252,204,18,.25);border-color:#fccc12;color:#fccc12}.next-tag-large{height:40px;height:var(--tag-size-l-height,40px);padding:0;line-height:38px;line-height:calc(var(--tag-size-l-height, 40px) - var(--tag-border-width, 1px)*2);font-size:0}.next-tag-large>.next-tag-body{font-size:16px;font-size:var(--tag-size-l-text-size,16px);padding:0 16px;padding:0 var(--tag-size-l-padding-lr,16px);min-width:48px;min-width:var(--tag-size-l-content-min-width,48px)}.next-tag-large.next-tag-closable>.next-tag-body{padding:0 0 0 16px;padding:0 0 0 var(--tag-size-l-padding-lr,16px);max-width:calc(100% - 48px);max-width:calc(100% - var(--tag-size-l-spacing, 16px) - var(--tag-size-l-icon-font, 16px) - var(--tag-size-l-padding-lr, 16px))}.next-tag-large[dir=rtl].next-tag-closable>.next-tag-body{padding:0 16px 0 0;padding:0 var(--tag-size-l-padding-lr,16px) 0 0}.next-tag-large.next-tag-closable>.next-tag-close-btn{margin-left:16px;margin-left:var(--tag-size-l-spacing,16px);padding-right:16px;padding-right:var(--tag-size-l-padding-lr,16px)}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;width:var(--tag-size-l-icon-font,16px);font-size:16px;font-size:var(--tag-size-l-icon-font,16px);line-height:inherit}.next-tag-large[dir=rtl]>.next-tag-close-btn{margin-right:16px;margin-right:var(--tag-size-l-spacing,16px);margin-left:0;padding-right:0;padding-left:16px;padding-left:var(--tag-size-l-padding-lr,16px)}.next-tag-medium{height:32px;height:var(--tag-size-m-height,32px);padding:0;line-height:30px;line-height:calc(var(--tag-size-m-height, 32px) - var(--tag-border-width, 1px)*2);font-size:0}.next-tag-medium>.next-tag-body{font-size:14px;font-size:var(--tag-size-m-text-size,14px);padding:0 12px;padding:0 var(--tag-size-m-padding-lr,12px);min-width:40px;min-width:var(--tag-size-m-content-min-width,40px)}.next-tag-medium.next-tag-closable>.next-tag-body{padding:0 0 0 12px;padding:0 0 0 var(--tag-size-m-padding-lr,12px);max-width:calc(100% - 36px);max-width:calc(100% - var(--tag-size-m-spacing, 12px) - var(--tag-size-m-icon-font, 12px) - var(--tag-size-m-padding-lr, 12px))}.next-tag-medium[dir=rtl].next-tag-closable>.next-tag-body{padding:0 12px 0 0;padding:0 var(--tag-size-m-padding-lr,12px) 0 0}.next-tag-medium.next-tag-closable>.next-tag-close-btn{margin-left:12px;margin-left:var(--tag-size-m-spacing,12px);padding-right:12px;padding-right:var(--tag-size-m-padding-lr,12px)}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:12px;width:var(--tag-size-m-icon-font,12px);font-size:12px;font-size:var(--tag-size-m-icon-font,12px);line-height:inherit}.next-tag-medium[dir=rtl]>.next-tag-close-btn{margin-right:12px;margin-right:var(--tag-size-m-spacing,12px);margin-left:0;padding-right:0;padding-left:12px;padding-left:var(--tag-size-m-padding-lr,12px)}.next-tag-small{height:24px;height:var(--tag-size-s-height,24px);padding:0;line-height:22px;line-height:calc(var(--tag-size-s-height, 24px) - var(--tag-border-width, 1px)*2);font-size:0}.next-tag-small>.next-tag-body{font-size:12px;font-size:var(--tag-size-s-text-size,12px);padding:0 8px;padding:0 var(--tag-size-s-padding-lr,8px);min-width:28px;min-width:var(--tag-size-s-content-min-width,28px)}.next-tag-small.next-tag-closable>.next-tag-body{padding:0 0 0 8px;padding:0 0 0 var(--tag-size-s-padding-lr,8px);max-width:calc(100% - 24px);max-width:calc(100% - var(--tag-size-s-spacing, 8px) - var(--tag-size-s-icon-font, 8px) - var(--tag-size-s-padding-lr, 8px))}.next-tag-small[dir=rtl].next-tag-closable>.next-tag-body{padding:0 8px 0 0;padding:0 var(--tag-size-s-padding-lr,8px) 0 0}.next-tag-small.next-tag-closable>.next-tag-close-btn{margin-left:8px;margin-left:var(--tag-size-s-spacing,8px);padding-right:8px;padding-right:var(--tag-size-s-padding-lr,8px)}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:8px;width:var(--tag-size-s-icon-font,8px);font-size:8px;font-size:var(--tag-size-s-icon-font,8px);line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-4px;margin-left:calc(-8px + var(--tag-size-s-icon-font, 8px)/2);margin-right:-4px;margin-right:calc(-8px + var(--tag-size-s-icon-font, 8px)/2)}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small[dir=rtl]>.next-tag-close-btn{margin-right:8px;margin-right:var(--tag-size-s-spacing,8px);margin-left:0;padding-right:0;padding-left:8px;padding-left:var(--tag-size-s-padding-lr,8px)}.next-tag-default{cursor:default}.next-tag-closable{position:relative}.next-tag-closable>.next-tag-close-btn{display:inline-block;vertical-align:middle;height:100%;text-align:center;cursor:pointer}.next-tag-checkable{cursor:pointer;position:relative;border-radius:3px;border-radius:var(--tag-corner-radius,3px)}.next-tag-checkable.checked:before{-webkit-animation:fadeInRightForTag .4s cubic-bezier(.78,.14,.15,.86);animation:fadeInRightForTag .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.checked:after{-webkit-animation:zoomIn .4s cubic-bezier(.78,.14,.15,.86);animation:zoomIn .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):before{right:-10px;right:calc(0px - var(--tag-size-s-tick-icon-bg-size, 20px)/2);bottom:-10px;bottom:calc(0px - var(--tag-size-s-tick-icon-bg-size, 20px)/2);width:20px;width:var(--tag-size-s-tick-icon-bg-size,20px);height:20px;height:var(--tag-size-s-tick-icon-bg-size,20px)}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):after{font-size:8px;line-height:8px;right:0;bottom:0}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):before{right:-14px;right:calc(0px - var(--tag-size-m-tick-icon-bg-size, 28px)/2);bottom:-14px;bottom:calc(0px - var(--tag-size-m-tick-icon-bg-size, 28px)/2);width:28px;width:var(--tag-size-m-tick-icon-bg-size,28px);height:28px;height:var(--tag-size-m-tick-icon-bg-size,28px)}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):after{font-size:12px;line-height:12px;right:0;bottom:0}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):before{right:-18px;right:calc(0px - var(--tag-size-l-tick-icon-bg-size, 36px)/2);bottom:-18px;bottom:calc(0px - var(--tag-size-l-tick-icon-bg-size, 36px)/2);width:36px;width:var(--tag-size-l-tick-icon-bg-size,36px);height:36px;height:var(--tag-size-l-tick-icon-bg-size,36px)}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):after{font-size:16px;line-height:16px;right:0;bottom:0}.next-tag-checkable.next-tag-level-secondary.disabled,.next-tag-checkable.next-tag-level-secondary[disabled]{color:#ccc;color:var(--tag-text-color-disabled,#ccc);border-color:#eee;border-color:var(--tag-border-color-disabled,#eee);background-color:#fafafa;background-color:var(--tag-fill-bg-color-disabled,#fafafa)}.next-tag-zoom-appear,.next-tag-zoom-enter{-webkit-animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.next-tag-zoom-leave{-webkit-animation:zoomOut .3s ease-in;animation:zoomOut .3s ease-in;-webkit-animation-fill-mode:both;animation-fill-mode:both}.next-timeline,.next-timeline *,.next-timeline:after,.next-timeline :after,.next-timeline:before,.next-timeline :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-timeline ul{margin:0;padding:0;list-style:none}.next-timeline p{margin:0}.next-timeline-hide{display:none}.next-timeline[dir=rtl] .next-timeline-item-folder{padding-left:0;padding-right:28px;padding-right:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline[dir=rtl] .next-timeline-item-dot-tail{left:auto;right:8px;right:calc(var(--timeline-item-node-size, 16px)/2);border-left:none;border-right:1px dotted #e6e6e6;border-right:var(--timeline-item-tail-size,1px) dotted var(--timeline-item-tail-color,#e6e6e6)}.next-timeline[dir=rtl] .next-timeline-item-has-left-content.next-timeline-item-folder{margin-left:0;margin-right:80px;margin-right:var(--timeline-item-left-content-width,80px)}.next-timeline[dir=rtl] .next-timeline-item-done{position:relative}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-right:-12px;margin-right:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-done-dot-size,8px);height:8px;height:var(--timeline-item-done-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-done-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-done-dot-size, 8px)/2)}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:auto;right:8px;right:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content{display:inline-block;margin-right:28px;margin-right:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:left;padding-left:12px;padding-left:var(--timeline-item-content-margin-left,12px);padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-right:var(--timeline-item-left-content-width,80px);margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-right:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-dot{background:#ddd;background:var(--timeline-item-done-background,#ddd)}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-icon{background:#ddd;background:var(--timeline-item-done-background,#ddd);color:#fff;color:var(--timeline-item-done-color,#fff)}.next-timeline[dir=rtl] .next-timeline-item-process{position:relative}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-right:-12px;margin-right:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-process-dot-size,8px);height:8px;height:var(--timeline-item-process-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-process-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-process-dot-size, 8px)/2)}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:auto;right:8px;right:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content{display:inline-block;margin-right:28px;margin-right:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:left;padding-left:12px;padding-left:var(--timeline-item-content-margin-left,12px);padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-right:var(--timeline-item-left-content-width,80px);margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-right:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-dot,.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-icon{background:#209bfa;background:var(--timeline-item-process-background,#209bfa)}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-icon{color:#fff;color:var(--timeline-item-process-color,#fff)}.next-timeline[dir=rtl] .next-timeline-item-success{position:relative}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-right:-12px;margin-right:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-success-dot-size,8px);height:8px;height:var(--timeline-item-success-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-success-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-success-dot-size, 8px)/2)}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:auto;right:8px;right:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content{display:inline-block;margin-right:28px;margin-right:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:left;padding-left:12px;padding-left:var(--timeline-item-content-margin-left,12px);padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-right:var(--timeline-item-left-content-width,80px);margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-right:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-dot,.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-icon{background:#1ad78c;background:var(--timeline-item-success-background,#1ad78c)}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-icon{color:#fff;color:var(--timeline-item-success-color,#fff)}.next-timeline[dir=rtl] .next-timeline-item-error{position:relative}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-right:-12px;margin-right:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-error-dot-size,8px);height:8px;height:var(--timeline-item-error-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-error-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-error-dot-size, 8px)/2)}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:auto;right:8px;right:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content{display:inline-block;margin-right:28px;margin-right:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:left;padding-left:12px;padding-left:var(--timeline-item-content-margin-left,12px);padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-right:var(--timeline-item-left-content-width,80px);margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-right:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-dot,.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-icon{background:#d23c26;background:var(--timeline-item-error-background,#d23c26)}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-icon{color:#fff;color:var(--timeline-item-error-color,#fff)}.next-timeline{margin:0;padding:0;list-style:none}.next-timeline>li{outline:0}.next-timeline-item-folder{padding-left:28px;padding-left:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));padding-top:4px;padding-top:var(--timeline-item-folder-margin-top,4px);padding-bottom:4px;padding-bottom:var(--timeline-item-folder-margin-bottom,4px);font-size:12px;font-size:var(--timeline-item-folder-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);position:relative}.next-timeline-item-dot-tail{position:absolute;top:0;left:8px;left:calc(var(--timeline-item-node-size, 16px)/2);height:100%;border:0;border-left:var(--timeline-item-tail-size,1px) dotted var(--timeline-item-tail-color,#e6e6e6)}.next-timeline-item-dot-tail-solid{border-style:solid}.next-timeline-item-has-left-content.next-timeline-item-folder{margin-left:80px;margin-left:var(--timeline-item-left-content-width,80px)}.next-timeline-item-done{position:relative}.next-timeline-item-done .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:left}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-left:-12px;margin-left:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);line-height:1}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-done-dot-size,8px);height:8px;height:var(--timeline-item-done-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-done-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-done-dot-size, 8px)/2)}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:8px;left:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-done .next-timeline-item-content{display:inline-block;margin-left:28px;margin-left:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:left}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:left}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:left}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:right;padding-right:12px;padding-right:var(--timeline-item-content-margin-left,12px)}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px;margin-left:var(--timeline-item-left-content-width,80px)}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px;margin-left:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-done .next-timeline-item-dot,.next-timeline-item-done .next-timeline-item-icon{background:#ddd;background:var(--timeline-item-done-background,#ddd)}.next-timeline-item-done .next-timeline-item-icon{color:#fff;color:var(--timeline-item-done-color,#fff)}.next-timeline-item-process{position:relative}.next-timeline-item-process .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:left}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-left:-12px;margin-left:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);line-height:1}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-process-dot-size,8px);height:8px;height:var(--timeline-item-process-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-process-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-process-dot-size, 8px)/2)}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:8px;left:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-process .next-timeline-item-content{display:inline-block;margin-left:28px;margin-left:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:left}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:left}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:left}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:right;padding-right:12px;padding-right:var(--timeline-item-content-margin-left,12px)}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px;margin-left:var(--timeline-item-left-content-width,80px)}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px;margin-left:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-process .next-timeline-item-dot,.next-timeline-item-process .next-timeline-item-icon{background:#209bfa;background:var(--timeline-item-process-background,#209bfa)}.next-timeline-item-process .next-timeline-item-icon{color:#fff;color:var(--timeline-item-process-color,#fff)}.next-timeline-item-success{position:relative}.next-timeline-item-success .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:left}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-left:-12px;margin-left:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);line-height:1}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-success-dot-size,8px);height:8px;height:var(--timeline-item-success-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-success-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-success-dot-size, 8px)/2)}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:8px;left:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-success .next-timeline-item-content{display:inline-block;margin-left:28px;margin-left:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:left}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:left}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:left}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:right;padding-right:12px;padding-right:var(--timeline-item-content-margin-left,12px)}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px;margin-left:var(--timeline-item-left-content-width,80px)}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px;margin-left:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-success .next-timeline-item-dot,.next-timeline-item-success .next-timeline-item-icon{background:#1ad78c;background:var(--timeline-item-success-background,#1ad78c)}.next-timeline-item-success .next-timeline-item-icon{color:#fff;color:var(--timeline-item-success-color,#fff)}.next-timeline-item-error{position:relative}.next-timeline-item-error .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;width:var(--timeline-item-node-size,16px);height:24px;height:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);padding:4px 0;padding:var(--timeline-item-node-padding,4px) 0;text-align:center;float:left}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;width:var(--timeline-item-custom-node-size,40px);height:auto;font-size:12px;font-size:var(--timeline-item-custom-node-font-size,12px);word-break:break-all;margin-left:-12px;margin-left:calc(0px - var(--timeline-item-custom-node-size, 40px)/2 + var(--timeline-item-node-size, 16px)/2);line-height:1}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;width:var(--timeline-item-error-dot-size,8px);height:8px;height:var(--timeline-item-error-dot-size,8px);border-radius:100%;top:50%;margin-top:-4px;margin-top:calc(0px - var(--timeline-item-error-dot-size, 8px)/2);left:50%;margin-left:-4px;margin-left:calc(0px - var(--timeline-item-error-dot-size, 8px)/2)}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);height:calc(100% - var(--timeline-item-node-size, 16px) - var(--timeline-item-node-padding, 4px)*2);top:24px;top:calc(var(--timeline-item-node-size, 16px) + var(--timeline-item-node-padding, 4px)*2);left:8px;left:calc(var(--timeline-item-node-size, 16px)/2)}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;width:var(--timeline-item-tail-size,1px);position:relative;background:#e6e6e6;background:var(--timeline-item-tail-color,#e6e6e6);-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-error .next-timeline-item-content{display:inline-block;margin-left:28px;margin-left:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin:4px 0 0;margin-top:var(--timeline-item-title-margin-top,4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:left}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;margin-top:var(--timeline-item-body-margin-top,4px);font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:left}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:left}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;width:var(--timeline-item-left-content-width,80px);display:inline-block;font-size:12px;font-size:var(--timeline-item-left-body-font-size,12px);color:#999;color:var(--timeline-item-left-body-color,#999);line-height:1.5;line-height:var(--font-lineheight-2,1.5);margin-top:4px;margin-top:var(--timeline-item-title-margin-top,4px);text-align:right;padding-right:12px;padding-right:var(--timeline-item-content-margin-left,12px)}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px;margin-left:var(--timeline-item-left-content-width,80px)}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px;margin-left:calc(var(--timeline-item-left-content-width, 80px) + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline-item-error .next-timeline-item-dot,.next-timeline-item-error .next-timeline-item-icon{background:#d23c26;background:var(--timeline-item-error-background,#d23c26)}.next-timeline-item-error .next-timeline-item-icon{color:#fff;color:var(--timeline-item-error-color,#fff)}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-left-content,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content{width:50%;padding-right:12px;padding-right:var(--timeline-item-content-margin-left,12px)}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-timeline,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-timeline{margin-left:50%}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-content,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content{margin-left:calc(50% + 28px);margin-left:calc(50% + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline.next-alternate .next-timeline-item-folder{margin-left:50%}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-title{margin:4px 0 0;font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-body{margin:4px 0 0;font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content{display:inline-block;position:relative}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content .next-timeline-item-title{margin-top:0}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content{margin-left:28px;margin-left:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));position:absolute}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content .next-timeline-item-body{margin-top:4px;color:#999;color:var(--timeline-item-left-body-color,#999)}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-left-content,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-left-content{width:50%;padding-left:12px;padding-left:var(--timeline-item-content-margin-left,12px)}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-timeline,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-timeline{margin-right:50%}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-content,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content{width:50%;margin-right:calc(50% + 28px);margin-right:calc(50% + var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px))}.next-timeline[dir=rtl].next-alternate .next-timeline-item-folder{margin-right:50%}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-title{margin:0;font-size:14px;font-size:var(--timeline-item-title-font-size,14px);font-weight:700;font-weight:var(--timeline-item-title-font-weight,bold);line-height:1.5;line-height:var(--font-lineheight-2,1.5);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;color:var(--timeline-item-title-color,#333);text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-body{margin:0;font-size:12px;font-size:var(--timeline-item-body-font-size,12px);line-height:1.5;line-height:var(--font-lineheight-2,1.5);color:#666;color:var(--timeline-item-body-color,#666);text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-time{margin:4px 0 0;margin-top:var(--timeline-item-time-margin-top,4px);margin-bottom:12px;margin-bottom:var(--timeline-item-time-margin-bottom,12px);font-size:12px;font-size:var(--timeline-item-time-font-size,12px);color:#999;color:var(--timeline-item-time-color,#999);text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-left-content{display:inline-block;position:relative}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content{margin-right:28px;margin-right:calc(var(--timeline-item-content-margin-left, 12px) + var(--timeline-item-node-size, 16px));position:absolute}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content .next-timeline-item-body{text-align:right}.next-timeline-item-last .next-timeline-item-tail{display:none}.next-timeline-item-has-left-content{min-height:48px}.next-timeline-item-folder.next-timeline-item-has-left-content{min-height:auto}.next-transfer{display:inline-block}.next-transfer,.next-transfer *,.next-transfer :after,.next-transfer :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-transfer-panel{display:inline-block;border:1px solid #e6e6e6;border:var(--transfer-panel-border-width,1px) var(--line-solid,solid) var(--transfer-panel-border-color,#e6e6e6);border-radius:3px;border-radius:var(--transfer-panel-border-corner,3px);background-color:#fff;background-color:var(--transfer-panel-background-color,#fff);vertical-align:middle}.next-transfer-panel-header{padding:8px 20px;padding:var(--transfer-panel-header-padding-top-bottom,8px) var(--transfer-panel-header-padding-left-right,20px);border-bottom:1px solid #e6e6e6;border-bottom:var(--transfer-panel-border-width,1px) var(--line-solid,solid) var(--transfer-panel-border-color,#e6e6e6);background-color:#fafafa;background-color:var(--transfer-panel-header-background-color,#fafafa);color:#333;color:var(--transfer-panel-header-text-color,#333);font-size:14px;font-size:var(--transfer-panel-header-text-size,14px)}.next-transfer-panel-search{padding:0 4px;padding:0 var(--transfer-panel-search-margin-left-right,4px);margin-top:8px;margin-top:var(--transfer-panel-search-margin-top,8px);margin-bottom:0;margin-bottom:var(--transfer-panel-search-margin-bottom,0);width:180px;width:var(--transfer-panel-list-width,180px)}.next-transfer .next-transfer-panel-list{width:180px;width:var(--transfer-panel-list-width,180px);height:160px;height:var(--transfer-panel-list-height,160px);padding:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-radius:0;overflow-y:auto}.next-transfer-panel-not-found-container{display:table;width:100%;height:100%}.next-transfer-panel-not-found{display:table-cell;vertical-align:middle;text-align:center;color:#999;color:var(--color-text1-2,#999);font-size:14px;font-size:var(--font-size-body-2,14px)}.next-transfer-panel-item.next-focused{-webkit-transition:background-color .1s linear;transition:background-color .1s linear}.next-transfer-panel-item:not(.next-disabled).next-simple:hover{color:#209bfa;color:var(--transfer-simple-panel-item-hover-text-color,#209bfa)}.next-transfer-panel-item.next-insert-before:before{position:absolute;top:0;left:0;content:"";width:100%;border-top:1px solid #209bfa;border-top:var(--line-1,1px) solid var(--color-brand1-6,#209bfa)}.next-transfer-panel-item.next-insert-after:after{position:absolute;left:0;bottom:0;content:"";width:100%;border-bottom:1px solid #209bfa;border-bottom:var(--line-1,1px) solid var(--color-brand1-6,#209bfa)}.next-transfer-panel-footer{position:relative;padding:8px 20px;padding:var(--transfer-panel-footer-padding-top-bottom,8px) var(--transfer-panel-footer-padding-left-right,20px);border-top:1px solid #e6e6e6;border-top:var(--transfer-panel-border-width,1px) var(--line-solid,solid) var(--transfer-panel-border-color,#e6e6e6);background-color:#fff;background-color:var(--transfer-panel-footer-background-color,#fff);font-size:0;-webkit-box-shadow:none;-webkit-box-shadow:var(--transfer-panel-footer-shadow,none);box-shadow:none;box-shadow:var(--transfer-panel-footer-shadow,none)}.next-transfer-panel-count{margin-left:4px;font-size:14px;font-size:var(--font-size-body-1,14px);vertical-align:middle;color:#333;color:var(--transfer-panel-footer-text-color,#333)}.next-transfer-panel-move-all{font-size:14px;font-size:var(--font-size-body-1,14px);color:#209bfa;color:var(--transfer-simple-panel-footer-text-color,#209bfa);cursor:pointer}.next-transfer-panel-move-all.next-disabled{color:#ccc;color:var(--color-text1-1,#ccc);cursor:not-allowed}.next-transfer-operations{display:inline-block;vertical-align:middle;margin:0 20px;margin:0 var(--transfer-operation-margin-left-right,20px)}.next-transfer-move.next-icon{color:#ddd;color:var(--transfer-simple-move-icon-color,#ddd)}.next-transfer-move.next-icon:before{content:"";content:var(--transfer-simple-move-icon,"\e6b3")}.next-transfer-operation.next-btn{display:block}.next-transfer-operation.next-btn+.next-transfer-operation.next-btn{margin-top:8px;margin-top:var(--transfer-operation-margin-gutter,8px)}.next-transfer-operation.next-btn .next-icon .next-icon-remote,.next-transfer-operation.next-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tree,.next-tree *,.next-tree :after,.next-tree :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-tree,.next-tree-child-tree{margin:0;padding:0;list-style:none}.next-tree-node{white-space:nowrap}.next-tree-node-inner{font-size:0;outline:none}.next-tree-node-label-wrapper{display:inline-block;margin:0 4px;margin:0 var(--tree-node-title-margin,4px);vertical-align:middle}.next-tree-node-label{height:20px;line-height:20px;padding:0 4px;padding:0 var(--tree-node-title-padding,4px);border-radius:3px;border-radius:var(--tree-node-title-border-radius,3px);font-size:14px;font-size:var(--tree-node-title-font-size,14px)}.next-tree-node-label .next-icon{font-size:16px;font-size:calc(var(--tree-node-title-font-size, 14px) + 2px)}.next-tree-node-label .next-icon:before{font-size:14px;font-size:var(--tree-node-title-font-size,14px);width:14px;width:var(--tree-node-title-font-size,14px);margin-right:.5em}.next-tree-node-input.next-input{margin:0 4px;margin:0 var(--tree-node-title-margin,4px)}.next-tree-node-indent-unit{display:inline-block;width:24px;vertical-align:middle;position:relative}.next-tree-node-indent-unit.next-line:before{content:"";position:absolute;display:inline-block;border-left:1px solid #ddd;border-left:var(--tree-line-width,1px) var(--tree-line-style,solid) var(--tree-line-color,#ddd);height:28px;height:calc(var(--tree-node-padding, 4px) + var(--line-2, 2px)*2 + 20px);left:7.5px;left:calc(var(--tree-switch-size, 16px)/2 - var(--tree-line-width, 1px)/2)}.next-tree-switcher{position:relative;display:inline-block;vertical-align:middle;margin-right:8px;margin-right:var(--tree-switch-margint-right,8px)}.next-tree .next-tree-unfold-icon:before{content:"";content:var(--tree-unfold-icon-content,"")}.next-tree-switcher.next-noline{width:20px;width:var(--tree-switch-arrow-size,20px);height:20px;height:var(--tree-switch-arrow-size,20px);line-height:20px;line-height:var(--tree-switch-arrow-size,20px);cursor:pointer}.next-tree-switcher.next-noline .next-tree-switcher-icon{-webkit-transition:-webkit-transform .1s linear;transition:-webkit-transform .1s linear;transition:transform .1s linear;transition:transform .1s linear,-webkit-transform .1s linear;color:#999;color:var(--tree-switch-arrow-color,#999)}.next-tree-switcher.next-noline .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-noline .next-tree-switcher-icon:before{width:20px;width:var(--tree-switch-arrow-size,20px);font-size:20px;font-size:var(--tree-switch-arrow-size,20px);line-height:inherit}.next-tree-switcher.next-noline .next-tree-fold-icon:before{content:"";content:var(--tree-fold-icon-content,"\e63d")}.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon:before{width:20px;width:var(--tree-switch-arrow-size,20px);font-size:20px;font-size:var(--tree-switch-arrow-size,20px);line-height:inherit}.next-tree-switcher.next-noline:not(.next-disabled):hover .next-tree-switcher-icon{color:#333;color:var(--tree-switch-hover-arrow-color,#333)}.next-tree-switcher.next-noline.next-disabled{cursor:not-allowed}.next-tree-switcher.next-noline.next-disabled .next-tree-switcher-icon{color:#ccc;color:var(--tree-node-disabled-color,#ccc)}.next-tree-switcher.next-noop-noline{width:20px;width:var(--tree-switch-arrow-size,20px);height:20px;height:var(--tree-switch-arrow-size,20px)}.next-tree-switcher.next-line{width:16px;width:var(--tree-switch-size,16px);height:16px;height:var(--tree-switch-size,16px);line-height:14px;line-height:calc(var(--tree-switch-size, 16px) - var(--tree-switch-border-width, 1px)*2);border:1px solid #ddd;border:var(--tree-switch-border-width,1px) var(--line-solid,solid) var(--tree-switch-border-color,#ddd);border-radius:3px;border-radius:var(--tree-switch-corner,3px);background-color:#fff;background-color:var(--tree-switch-bg-color,#fff);cursor:pointer}.next-tree-switcher.next-line .next-tree-switcher-icon{margin-left:3px;margin-left:calc(var(--tree-switch-size, 16px)/2 - 4px - var(--tree-switch-border-width, 1px)*2/2);color:#666;color:var(--tree-switch-icon-color,#666)}.next-tree-switcher.next-line .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-line .next-tree-switcher-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tree-switcher.next-line .next-tree-switcher-icon{-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5);margin-left:-1px;margin-left:calc(var(--tree-switch-size, 16px)/2 - 8px - var(--tree-switch-border-width, 1px)*2/2);margin-right:-4px}.next-tree-switcher.next-line .next-tree-switcher-icon:before{width:16px;font-size:16px}}.next-tree-switcher.next-line .next-tree-switcher-fold-icon:before{content:"";content:var(--tree-switcher-fold-icon-content,"\e655")}.next-tree-switcher.next-line .next-tree-switcher-unfold-icon:before{content:"";content:var(--tree-switcher-unfold-icon-content,"\e601")}.next-tree-switcher.next-line:not(.next-disabled):hover{border-color:#ccc;border-color:var(--tree-switch-hover-border-color,#ccc);background-color:#f9f9f9;background-color:var(--tree-switch-hover-bg-color,#f9f9f9)}.next-tree-switcher.next-line:not(.next-disabled):hover .next-tree-switcher-icon{color:#333;color:var(--tree-switch-hover-icon-color,#333)}.next-tree-switcher.next-line.next-disabled{border-color:#eee;border-color:var(--color-line1-1,#eee);background-color:#fff;cursor:not-allowed}.next-tree-switcher.next-line.next-disabled .next-tree-switcher-icon{color:#ccc;color:var(--tree-node-disabled-color,#ccc)}.next-tree-switcher.next-noop-line{width:16px;width:var(--tree-switch-size,16px);height:16px;height:var(--tree-switch-size,16px)}.next-tree-switcher.next-noop-line-noroot{height:0;border-left:1px solid #ddd;border-left:var(--tree-switch-border-width,1px) var(--line-solid,solid) var(--tree-line-color,#ddd);border-bottom:1px solid #ddd;border-bottom:var(--tree-line-width,1px) var(--tree-line-style,solid) var(--tree-line-color,#ddd)}.next-tree-switcher.next-noop-line-noroot .next-tree-right-angle{bottom:-1px;bottom:calc(0px - var(--tree-line-width, 1px))}.next-tree-switcher.next-loading.next-loading-noline{width:20px;width:var(--tree-switch-arrow-size,20px);height:20px;height:var(--tree-switch-arrow-size,20px);line-height:20px;line-height:var(--tree-switch-arrow-size,20px)}.next-tree-switcher.next-loading.next-loading-line{width:16px;width:var(--tree-switch-size,16px);height:16px;height:var(--tree-switch-size,16px);line-height:14px;line-height:calc(var(--tree-switch-size, 16px) - var(--tree-switch-border-width, 1px)*2);border:1px solid transparent;border:var(--tree-switch-border-width,1px) var(--line-solid,solid) transparent}.next-tree-switcher.next-loading .next-tree-switcher-icon{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-tree-switcher.next-loading .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-loading .next-tree-switcher-icon:before{width:20px;width:var(--tree-switch-arrow-size,20px);font-size:20px;font-size:var(--tree-switch-arrow-size,20px);line-height:inherit}.next-tree-right-angle{position:absolute;bottom:6.5px;bottom:calc(var(--tree-switch-size, 16px)/2 - var(--tree-switch-border-width, 1px)*2/2 - var(--tree-line-width, 1px)/2);left:-17.5px;left:calc(-24px + var(--tree-switch-size, 16px)/2 - var(--tree-line-width, 1px)/2 - var(--tree-switch-border-width, 1px));display:block;width:16.5px;width:calc(24px - var(--tree-switch-size, 16px)/2 + var(--tree-line-width, 1px)/2);height:22px;height:calc(20px + var(--tree-node-padding, 4px) - var(--tree-line-width, 1px)*2);border-left:1px solid #ddd;border-left:var(--tree-line-width,1px) var(--tree-line-style,solid) var(--tree-line-color,#ddd);border-bottom:1px solid #ddd;border-bottom:var(--tree-line-width,1px) var(--tree-line-style,solid) var(--tree-line-color,#ddd)}.next-tree.next-label-block .next-tree-node-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;outline:none}.next-tree.next-label-block .next-tree-node-label-wrapper{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.next-tree.next-node-indent .next-tree-node .next-tree-node{margin-left:24px}.next-tree.next-node-indent .next-tree-node-inner{padding-top:2px;padding-top:calc(var(--tree-node-padding, 4px)/2);padding-bottom:2px;padding-bottom:calc(var(--tree-node-padding, 4px)/2)}.next-tree.next-node-indent .next-tree-node-inner:focus .next-tree-node-label{color:#333;color:var(--tree-node-hover-color,#333);background-color:#f9f9f9;background-color:var(--tree-node-hover-bg-color,#f9f9f9)}.next-tree.next-node-indent .next-tree-node-label-wrapper{border-top:2px solid transparent;border-top:var(--line-2,2px) solid transparent;border-bottom:2px solid transparent;border-bottom:var(--line-2,2px) solid transparent}.next-tree.next-node-indent .next-tree-node-label{-webkit-transition:color .1s linear,background-color .1s linear;transition:color .1s linear,background-color .1s linear;cursor:default;color:#333;color:var(--tree-node-normal-color,#333);background-color:#fff;background-color:var(--tree-node-normal-background,#fff)}.next-tree.next-node-indent .next-tree-node-label-selectable{cursor:pointer}.next-tree.next-node-indent .next-tree-node-label:hover{color:#333;color:var(--tree-node-hover-color,#333);background-color:#f9f9f9;background-color:var(--tree-node-hover-bg-color,#f9f9f9)}.next-tree.next-node-indent .next-tree-node-inner.next-selected .next-tree-node-label{color:#333;color:var(--tree-node-selected-color,#333);background-color:#add9ff;background-color:var(--tree-node-selected-background,#add9ff)}.next-tree.next-node-indent .next-tree-node-inner.next-disabled .next-tree-node-label,.next-tree.next-node-indent .next-tree-node-inner.next-disabled .next-tree-node-label:hover{color:#ccc;color:var(--tree-node-disabled-color,#ccc);background-color:#fff;background-color:var(--tree-node-disabled-background,#fff);cursor:not-allowed}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over .next-tree-node-label{background-color:#209bfa;background-color:var(--color-brand1-6,#209bfa);color:#fff;opacity:.8}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over-gap-top .next-tree-node-label-wrapper{border-top-color:#209bfa;border-top-color:var(--color-brand1-6,#209bfa)}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over-gap-bottom .next-tree-node-label-wrapper{border-bottom-color:#209bfa;border-bottom-color:var(--color-brand1-6,#209bfa)}.next-tree.next-node-block .next-tree-node-inner{padding-top:4px;padding-top:var(--tree-node-padding,4px);padding-bottom:4px;padding-bottom:var(--tree-node-padding,4px);-webkit-transition:color .1s linear,background-color .1s linear;transition:color .1s linear,background-color .1s linear;cursor:pointer;color:#333;color:var(--tree-node-normal-color,#333);background-color:#fff;background-color:var(--tree-node-normal-background,#fff)}.next-tree.next-node-block .next-tree-node-inner:focus,.next-tree.next-node-block .next-tree-node-inner:hover{color:#333;color:var(--tree-node-hover-color,#333);background-color:#f9f9f9;background-color:var(--tree-node-hover-bg-color,#f9f9f9)}.next-tree.next-node-block .next-tree-node-inner.next-selected{color:#333;color:var(--tree-node-selected-color,#333);background-color:#add9ff;background-color:var(--tree-node-selected-background,#add9ff)}.next-tree.next-node-block .next-tree-node-inner.next-disabled,.next-tree.next-node-block .next-tree-node-inner.next-disabled:hover{color:#ccc;color:var(--tree-node-disabled-color,#ccc);background-color:#fff;background-color:var(--tree-node-disabled-background,#fff);cursor:not-allowed}.next-tree.next-show-line .next-tree-node .next-tree-node:not(:last-child){margin-left:7.5px;margin-left:calc(var(--tree-switch-size, 16px)/2 - var(--tree-line-width, 1px)/2);border-left:1px solid #ddd;border-left:var(--tree-line-width,1px) var(--tree-line-style,solid) var(--tree-line-color,#ddd);padding-left:15.5px;padding-left:calc(24px - var(--tree-line-width, 1px) - var(--tree-switch-size, 16px)/2 + var(--tree-line-width, 1px)/2)}.next-tree-node.next-filtered>.next-tree-node-inner .next-tree-node-label,.next-tree-node.next-filtered>.next-tree-node-inner .next-tree-node-label:hover{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-tree[dir=rtl] .next-tree-switcher{margin-left:8px;margin-left:var(--tree-switch-margint-right,8px);margin-right:0}.next-tree[dir=rtl] .next-tree-switcher.next-noop-line-noroot{border-left:none;border-right:1px solid #ddd;border-right:var(--tree-switch-border-width,1px) var(--line-solid,solid) var(--tree-line-color,#ddd)}.next-tree[dir=rtl] .next-tree-right-angle{left:auto;right:-17.5px;right:calc(-24px + var(--tree-switch-size, 16px)/2 - var(--tree-line-width, 1px)/2 - var(--tree-switch-border-width, 1px))}.next-tree[dir=rtl].next-show-line .next-tree-node .next-tree-node:not(:last-child),.next-tree[dir=rtl] .next-tree-right-angle{border-left:none;border-right:1px solid #ddd;border-right:var(--tree-line-width,1px) var(--tree-line-style,solid) var(--tree-line-color,#ddd)}.next-tree[dir=rtl].next-show-line .next-tree-node .next-tree-node:not(:last-child){margin-left:0;margin-right:7.5px;margin-right:calc(var(--tree-switch-size, 16px)/2 - var(--tree-line-width, 1px)/2);padding-left:0;padding-right:15.5px;padding-right:calc(24px - var(--tree-line-width, 1px) - var(--tree-switch-size, 16px)/2 + var(--tree-line-width, 1px)/2)}.next-tree[dir=rtl].next-node-indent .next-tree-node .next-tree-node{margin-left:0;margin-right:24px}.next-tree-select,.next-tree-select *,.next-tree-select :after,.next-tree-select :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-tree-select-dropdown{background:#fff;background:var(--tree-select-background,#fff);border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none);max-height:260px;overflow:auto}.next-tree-select-dropdown>.next-tree,.next-tree-select-dropdown>.next-tree-select-not-found,.next-tree-select-dropdown>.next-virtual-tree-container{padding:8px 20px;padding:var(--tree-select-padding-vertical,8px) var(--tree-select-padding-horizontal,20px)}.next-tree-select-not-found{font-size:14px;font-size:var(--font-size-body-1,14px);color:#999;color:var(--color-text1-2,#999)}.next-upload-list[dir=rtl].next-upload-list-text .next-upload-list-item{padding:4px 8px;padding:4px var(--upload-text-list-padding-left-right,8px);padding-left:40px;padding-left:calc(var(--upload-text-list-close-icon-right, 12px)*2 + 16px)}.next-upload-list[dir=rtl].next-upload-list-text .next-icon{left:12px;left:var(--upload-text-list-close-icon-right,12px);right:auto}.next-upload-list[dir=rtl].next-upload-list-image .next-icon-close{float:left;margin-left:4px;margin-left:var(--upload-image-list-close-icon-right,4px);margin-right:0}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-thumbnail{float:right;margin-left:8px;margin-right:0}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-progress{margin-right:56px;margin-right:calc(var(--upload-image-list-item-picture-size, 48px) + 8px);margin-left:24px;margin-left:calc(16px + var(--upload-image-list-close-icon-right, 4px)*2)}.next-upload,.next-upload *,.next-upload :after,.next-upload :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-upload-inner{outline:0;display:inline-block}.next-upload-inner.next-hidden{display:none}.next-upload-list{overflow:hidden}.next-upload-list,.next-upload-list *,.next-upload-list :after,.next-upload-list :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-upload-list-item{position:relative}.next-upload-list-item.next-hidden{display:none}.next-upload-list-item-name{text-decoration:none}.next-upload.next-disabled{border-color:#eee!important;border-color:var(--color-line1-1,#eee)!important;color:#ccc!important;color:var(--color-text1-1,#ccc)!important}.next-upload.next-disabled .next-icon-close{cursor:not-allowed!important}.next-upload.next-disabled .next-upload-inner *{color:#ccc!important;color:var(--color-text1-1,#ccc)!important;border-color:#eee!important;border-color:var(--color-line1-1,#eee)!important;cursor:not-allowed!important}.next-upload-list-text .next-upload-list-item{background-color:#f9f9f9;background-color:var(--upload-text-list-bg-color,#f9f9f9);padding:4px 8px;padding:4px var(--upload-text-list-padding-left-right,8px);padding-right:40px;padding-right:calc(var(--upload-text-list-close-icon-right, 12px)*2 + 16px);height:40px;height:var(--upload-text-list-height,40px);line-height:32px;line-height:calc(var(--upload-text-list-height, 40px) - 8px);font-size:14px;font-size:var(--upload-text-list-font-size,14px);overflow:hidden;-webkit-transition:all .1s linear;transition:all .1s linear;border-radius:0;border-radius:var(--upload-text-list-corner,0)}.next-upload-list-text .next-upload-list-item:not(:last-child){margin-bottom:4px}.next-upload-list-text .next-upload-list-item-op{position:absolute;top:0;right:12px;right:var(--upload-text-list-close-icon-right,12px)}.next-upload-list-text .next-upload-list-item .next-icon-close{color:#999;color:var(--upload-text-list-close-icon-color,#999);cursor:pointer;text-align:center;-webkit-transition:all .1s linear;transition:all .1s linear;line-height:40px;line-height:var(--upload-text-list-height,40px)}.next-upload-list-text .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-text .next-upload-list-item .next-icon-close:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-text .next-upload-list-item:hover{background-color:#f9f9f9;background-color:var(--upload-text-list-bg-color-hover,#f9f9f9)}.next-upload-list-text .next-upload-list-item:hover .next-icon{color:#666;color:var(--upload-text-list-close-icon-color-hover,#666)}.next-upload-list-text .next-upload-list-item-name-wrap{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-right:4px}.next-upload-list-text .next-upload-list-item-name{color:#333;color:var(--upload-text-list-name-font-color,#333);-webkit-transition:all .1s linear;transition:all .1s linear}.next-upload-list-text .next-upload-list-item-size{color:#999;color:var(--upload-text-list-size-font-color,#999);margin-left:8px}.next-upload-list-text .next-upload-list-item-uploading{line-height:16px;line-height:calc(var(--upload-text-list-height, 40px)/2 - 4px)}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress{line-height:0;padding-top:4px;padding-top:calc(var(--upload-text-list-height, 40px)/2/2 - 2px - var(--upload-text-list-progressbar-height, 8px)/2);padding-bottom:4px;padding-bottom:calc(var(--upload-text-list-height, 40px)/2/2 - 2px - var(--upload-text-list-progressbar-height, 8px)/2)}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-underlay{height:8px;height:var(--upload-text-list-progressbar-height,8px)}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-overlay{height:8px;height:var(--upload-text-list-progressbar-height,8px);margin-top:-4px;margin-top:calc(0px - var(--upload-text-list-progressbar-height, 8px)/2)}.next-upload-list-text .next-upload-list-item-done{line-height:32px;line-height:calc(var(--upload-text-list-height, 40px) - 8px)}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-name{color:#209bfa;color:var(--upload-text-list-name-font-color-hover,#209bfa)}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-size{color:#209bfa;color:var(--upload-text-list-size-font-color-hover,#209bfa)}.next-upload-list-text .next-upload-list-item-error{background-color:#ffece4!important;background-color:var(--upload-text-list-bg-color-error,#ffece4)!important}.next-upload-list-text .next-upload-list-item-error.next-upload-list-item-error-with-msg{line-height:16px;line-height:calc(var(--upload-text-list-height, 40px)/2 - 4px)}.next-upload-list-text .next-upload-list-item-error-msg{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:#d23c26;color:var(--upload-text-list-error-text-color,#d23c26)}.next-upload-list-image .next-upload-list-item{-webkit-box-sizing:content-box;box-sizing:content-box;border:1px solid #e6e6e6;border:var(--upload-image-list-item-border-width,1px) solid var(--upload-image-list-item-border-color,#e6e6e6);background-color:#fff;background-color:var(--upload-image-list-item-bg-color,#fff);padding:8px;padding:var(--upload-image-list-item-padding,8px);height:48px;height:var(--upload-image-list-item-picture-size,48px);line-height:48px;line-height:var(--upload-image-list-item-picture-size,48px);font-size:14px;font-size:var(--upload-image-list-item-font-size,14px);-webkit-transition:all .1s linear;transition:all .1s linear;overflow:hidden;border-radius:0;border-radius:var(--upload-card-list-corner,0)}.next-upload-list-image .next-upload-list-item:not(:last-child){margin-bottom:4px}.next-upload-list-image .next-upload-list-item:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-upload-list-image .next-upload-list-item-op{float:right;margin-right:4px}.next-upload-list-image .next-upload-list-item .next-icon-close{cursor:pointer;color:#999;color:var(--upload-image-list-close-icon-color,#999);text-align:center}.next-upload-list-image .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-image .next-upload-list-item .next-icon-close:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-image .next-upload-list-item:hover{border-color:#209bfa;border-color:var(--upload-image-list-item-border-color-hover,#209bfa)}.next-upload-list-image .next-upload-list-item:hover .next-icon-close{color:#666;color:var(--upload-image-list-close-icon-color-hover,#666)}.next-upload-list-image .next-upload-list-item-name{display:block;color:#333;color:var(--upload-text-list-name-font-color,#333);margin-left:56px;margin-left:calc(var(--upload-image-list-item-picture-size, 48px) + var(--upload-image-list-item-padding, 8px));margin-right:24px;margin-right:calc(16px + var(--upload-image-list-close-icon-right, 4px)*2);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;-webkit-transition:all .1s linear;transition:all .1s linear}.next-upload-list-image .next-upload-list-item-size{color:#999;color:var(--upload-text-list-size-font-color,#999);margin-left:8px}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-name{color:#209bfa;color:var(--upload-text-list-name-font-color-hover,#209bfa)}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-size{color:#209bfa;color:var(--upload-text-list-size-font-color-hover,#209bfa)}.next-upload-list-image .next-upload-list-item-thumbnail{float:left;width:48px;width:var(--upload-image-list-item-picture-size,48px);height:48px;height:var(--upload-image-list-item-picture-size,48px);color:#ccc;color:var(--upload-image-list-item-thumbnail-font-color,#ccc);border:1px solid #e6e6e6;border:var(--upload-image-list-item-picture-border-width,1px) solid var(--upload-image-list-item-picture-border-color,#e6e6e6);border-radius:0;border-radius:var(--upload-image-list-item-picture-corner,0);background-color:#f9f9f9;background-color:var(--upload-image-list-item-picture-background-color,#f9f9f9);margin-right:8px;vertical-align:middle;text-align:center;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.next-upload-list-image .next-upload-list-item-thumbnail img{width:100%;height:100%}.next-upload-list-image .next-upload-list-item-thumbnail .next-icon{display:block;margin:0;line-height:48px;line-height:var(--upload-image-list-item-picture-size,48px)}.next-upload-list-image .next-upload-list-item-thumbnail .next-icon .next-icon-remote,.next-upload-list-image .next-upload-list-item-thumbnail .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-upload-list-image .next-upload-list-item-error{border-color:#d23c26!important;border-color:var(--upload-image-list-item-border-color-error,#d23c26)!important;background-color:#fff;background-color:var(--upload-image-list-item-error-bg-color,#fff)}.next-upload-list-image .next-upload-list-item-uploading{background-color:#fff;background-color:var(--upload-image-list-item-uploading-bg-color,#fff)}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-name{height:24px;height:calc(var(--upload-image-list-item-picture-size, 48px)/2);line-height:24px;line-height:calc(var(--upload-image-list-item-picture-size, 48px)/2)}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress{margin-left:56px;margin-left:calc(var(--upload-image-list-item-picture-size, 48px) + 8px);margin-right:24px;margin-right:calc(16px + var(--upload-image-list-close-icon-right, 4px)*2);line-height:0;padding-top:8px;padding-top:calc(var(--upload-image-list-item-picture-size, 48px)/2/2 - var(--upload-image-list-progressbar-height, 8px)/2);padding-bottom:8px;padding-bottom:calc(var(--upload-image-list-item-picture-size, 48px)/2/2 - var(--upload-image-list-progressbar-height, 8px)/2)}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-underlay{height:8px;height:var(--upload-image-list-progressbar-height,8px)}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-overlay{height:8px;height:var(--upload-image-list-progressbar-height,8px);margin-top:-4px;margin-top:calc(0px - var(--upload-image-list-progressbar-height, 8px)/2)}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg,.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-name{height:24px;height:calc(var(--upload-image-list-item-picture-size, 48px)/2);line-height:24px;line-height:calc(var(--upload-image-list-item-picture-size, 48px)/2)}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg{margin-left:56px;margin-left:calc(var(--upload-image-list-item-picture-size, 48px) + 8px);margin-right:24px;margin-right:calc(16px + var(--upload-image-list-close-icon-right, 4px)*2);color:#d23c26;color:var(--upload-text-list-error-text-color,#d23c26);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.next-upload-list-card{display:inline-block}.next-upload-list-card .next-upload-list-item{vertical-align:middle;float:left}.next-upload-list-card .next-upload-list-item:not(:last-child){margin-right:12px;margin-right:var(--upload-card-list-margin-right,12px)}.next-upload-list-card .next-upload-list-item-wrapper{position:relative;border:1px solid #ddd;border:1px solid var(--upload-card-list-border-color,#ddd);width:100px;width:var(--upload-card-size,100px);height:100px;height:var(--upload-card-size,100px);padding:0;padding:var(--upload-card-list-padding,0);background-color:transparent;background-color:var(--upload-card-list-bg-color,transparent)}.next-upload-list-card .next-upload-list-item-thumbnail{text-align:center;width:100%;height:100%;color:#ccc;color:var(--upload-card-list-thumbnail-font-color,#ccc);font-size:12px;font-size:var(--upload-card-list-thumbnail-font-size,12px)}.next-upload-list-card .next-upload-list-item-thumbnail img{max-width:100%;max-height:100%;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.next-upload-list-card .next-upload-list-item-thumbnail img:focus{outline:0}.next-upload-list-card .next-upload-list-item-thumbnail .next-icon{width:100%}.next-upload-list-card .next-upload-list-item-thumbnail .next-icon .next-icon-remote,.next-upload-list-card .next-upload-list-item-thumbnail .next-icon:before{width:48px;font-size:48px;line-height:inherit}.next-upload-list-card .next-upload-list-item-handler{margin-top:13px;margin-top:calc(var(--upload-card-size, 100px)/2 - 37px)}.next-upload-list-card .next-upload-list-item-handler .next-icon-cry{margin-top:10px}.next-upload-list-card .next-upload-list-item-name{display:block;width:100px;width:var(--upload-card-size,100px);text-align:center;margin-top:4px;margin-top:var(--upload-card-list-name-margin-top,4px);font-size:12px;font-size:var(--upload-card-list-name-font-size,12px);color:#666;color:var(--upload-card-list-name-font-color,#666);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.next-upload-list-card .next-upload-list-item-progress{position:absolute;font-size:0;bottom:0;left:0;width:100%}.next-upload-list-card .next-upload-list-item-progress .next-progress-line-underlay{border-radius:0;height:8px;height:var(--upload-card-list-progressbar-height,8px)}.next-upload-list-card .next-upload-list-item-progress .next-progress-line-overlay{border-radius:0;height:8px;height:var(--upload-card-list-progressbar-height,8px);margin-top:-4px;margin-top:calc(0px - var(--upload-card-list-progressbar-height, 8px)/2)}.next-upload-list-card .next-upload-list-item-uploading .next-upload-list-item-wrapper{background-color:#fafafa;background-color:var(--upload-card-list-uploading-bg-color,#fafafa)}.next-upload-list-card .next-upload-list-item:hover .next-upload-tool{opacity:.8}.next-upload-list-card .next-upload-list-item .next-upload-tool{position:absolute;z-index:1;background-color:rgba(0,0,0,.7);background-color:rgba(0,0,0,var(--upload-select-card-tool-bg-opacity,.7));-webkit-transition:all .1s linear;transition:all .1s linear;opacity:0;width:100%;height:28px;left:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex}.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon{line-height:28px;color:#fff;cursor:pointer}.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon .next-icon-remote,.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-card .next-upload-list-item .next-upload-tool-item{width:100%;text-align:center}.next-upload-list-card .next-upload-list-item .next-upload-tool-item:not(:last-child){border-right:1px solid #fff}.next-upload-list-card .next-upload-list-item .next-upload-tool-reupload{display:inline-block}.next-upload-list-card .next-upload-list-item-error .next-upload-list-item-wrapper{border-color:#d23c26;border-color:var(--upload-card-list-border-color-error,#d23c26)}.next-upload-list-card.next-upload-ie9 .next-upload-tool{display:table}.next-upload-list-card.next-upload-ie9 .next-upload-tool-item{display:table-cell;width:1%}.next-upload-card{border:1px dashed #ddd;border:1px var(--upload-card-border-style,dashed) var(--upload-card-border-color,#ddd);width:100px;width:var(--upload-card-size,100px);height:100px;height:var(--upload-card-size,100px);background-color:#fff;background-color:var(--upload-card-bg-color,#fff);text-align:center;cursor:pointer;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;display:table-cell;vertical-align:middle}.next-upload-card .next-icon{color:#ddd;color:var(--upload-card-icon-color,#ddd)}.next-upload-card .next-icon .next-icon-remote,.next-upload-card .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-upload-card .next-upload-add-icon:before{content:"";content:var(--upload-card-add-icon,"\e655")}.next-upload-card .next-upload-text{font-size:14px;font-size:var(--upload-card-add-text-size,14px);margin-top:12px;margin-top:var(--upload-card-add-text-margin-top,12px);color:#666;color:var(--upload-card-font-color,#666);outline:none}.next-upload-card:hover{border-color:#209bfa;border-color:var(--upload-card-hover-border-color,#209bfa)}.next-upload-card:hover .next-icon,.next-upload-card:hover .next-upload-text{color:#209bfa;color:var(--upload-card-hover-font-color,#209bfa)}.next-upload-dragable .next-upload-inner{display:block}.next-upload-dragable .next-upload-drag{border:1px dashed #ddd;border:1px dashed var(--upload-drag-zone-border-color,#ddd);-webkit-transition:border-color .1s linear;transition:border-color .1s linear;cursor:pointer;border-radius:3px;border-radius:var(--upload-drag-zone-corner,3px);background-color:transparent;background-color:var(--upload-drag-zone-bg-color,transparent);text-align:center;margin-bottom:4px}.next-upload-dragable .next-upload-drag-icon{margin:20px 0 0;color:#666;color:var(--upload-drag-zone-upload-icon-color,#666)}.next-upload-dragable .next-upload-drag-icon .next-upload-drag-upload-icon:before{content:"";content:var(--upload-drag-zone-upload-icon,"\e7ee");font-size:24px}.next-upload-dragable .next-upload-drag-text{margin:12px 0 0;font-size:14px;font-size:var(--upload-drag-zone-font-size,14px);color:#666;color:var(--upload-drag-zone-upload-normal-title-color,#666)}.next-upload-dragable .next-upload-drag-hint{margin:4px 0 20px;font-size:12px;font-size:var(--upload-drag-zone-hint-font-size,12px);color:#999;color:var(--upload-drag-zone-upload-normal-hint-color,#999)}.next-upload-dragable .next-upload-drag-over{border-color:#209bfa;border-color:var(--upload-drag-zone-over-border-color,#209bfa)}.next-shell{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-transition:all .2s ease;transition:all .2s ease}.next-shell,.next-shell *,.next-shell :after,.next-shell :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-shell-content-wrapper{overflow:auto}.next-shell-header{width:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;z-index:9}.next-shell-header,.next-shell-header .dock-trigger,.next-shell-header .nav-trigger{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.next-shell-header .dock-trigger,.next-shell-header .nav-trigger{outline:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;cursor:pointer;width:32px;height:32px}.next-shell-header .nav-trigger{margin-right:10px}.next-shell-header .dock-trigger{margin-left:10px}.next-shell-header.next-shell-fixed-header{position:sticky;top:0}.next-shell-header .next-shell-navigation{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.next-shell-header .next-shell-action,.next-shell-header .next-shell-branding,.next-shell-header .next-shell-navigation{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.next-shell-sub-main{-ms-flex:1 1;flex:1 1;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;outline:0}.next-shell-main,.next-shell-sub-main{-webkit-box-flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;height:100%;overflow:auto}.next-shell-main{-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;position:relative;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all .2s ease;transition:all .2s ease}.next-shell-main .next-shell-content{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.next-shell-main .next-shell-content-inner{margin:0 auto}.next-shell-main .next-shell-footer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.next-shell-main .next-shell-footer,.next-shell .next-aside-navigation,.next-shell .next-aside-tooldock{display:-webkit-box;display:-ms-flexbox;display:flex}.next-shell .next-aside-navigation.fixed,.next-shell .next-aside-tooldock.fixed{position:fixed;top:0;bottom:0;z-index:1}.next-shell .next-aside-navigation.fixed{left:0}.next-shell .next-aside-tooldock.fixed{right:0}.next-shell-aside{-webkit-transition:all .2s ease;transition:all .2s ease}.next-shell-aside .aside-trigger{cursor:pointer;outline:0;position:absolute;right:0;top:50%;width:20px;height:48px;display:-webkit-box;display:-ms-flexbox;display:flex;border:1px solid #ddd;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.next-shell-aside .local-nav-trigger{outline:0;border-left:none;-webkit-transform:translate(100%,-50%);-ms-transform:translate(100%,-50%);transform:translate(100%,-50%);right:0}.next-shell-aside .ancillary-trigger{outline:0;-webkit-transform:translate(-100%,-50%);-ms-transform:translate(-100%,-50%);transform:translate(-100%,-50%);border-right:0;left:1px}.next-shell-aside.next-aside-ancillary,.next-shell-aside.next-aside-localnavigation{position:relative}.next-shell-aside.next-shell-navigation{justify-self:flex-start;-webkit-transition:all .2s ease;transition:all .2s ease}.next-shell-aside.next-shell-navigation,.next-shell-aside.next-shell-tooldock{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.next-shell-aside.next-shell-tooldock{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.next-shell-aside .next-shell-tooldockitem{width:100%;text-align:center}.next-shell-aside .next-shell-localnavigation{position:relative}.next-shell-aside .next-shell-ancillary,.next-shell-aside .next-shell-localnavigation{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;justify-self:flex-start;-webkit-transition:all .2s ease;transition:all .2s ease}.next-shell-light .next-shell-header .dock-trigger,.next-shell-light .next-shell-header .nav-trigger{background:#fff;background:var(--shell-light-header-background,#fff)}.next-shell-light .next-shell-aside .local-nav-trigger{background:#f2f2f2;background:var(--shell-light-local-navigation-background,#f2f2f2)}.next-shell-light .next-shell-aside .ancillary-trigger{background:#fff;background:var(--shell-light-ancillary-background,#fff)}.next-shell-light .next-shell-header{color:#000;color:var(--shell-light-header-color,#000);height:52px;height:var(--shell-light-header-height,52px);background:#fff;background:var(--shell-light-header-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-light-header-divider-size,1px) var(--shell-light-header-divider-style,solid) var(--shell-light-header-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-header-shadow,none);box-shadow:none;box-shadow:var(--shell-light-header-shadow,none);padding:0 16px;padding:0 var(--shell-light-header-paddingLeft,16px)}.next-shell-light .next-shell-header .next-shell-navigation{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;height:52px;height:var(--shell-light-header-height,52px);line-height:52px;line-height:var(--shell-light-header-height,52px);margin:0 48px;margin:0 var(--shell-light-navigation-hoz-marginLeft,48px)}.next-shell-light .next-shell-task-header{width:100%;min-height:40px;min-height:var(--shell-light-multitask-min-height,40px);background:#fff;background:var(--shell-light-multitask-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-light-multitask-divider-size,1px) var(--shell-light-multitask-divider-style,solid) var(--shell-light-multitask-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-multitask-shadow,none);box-shadow:none;box-shadow:var(--shell-light-multitask-shadow,none);padding:0;padding:0 var(--shell-light-multitask-paddingLeft,0);overflow:auto}.next-shell-light .next-shell-main{background:#f5f5f5;background:var(--shell-light-content-background,#f5f5f5)}.next-shell-light .next-shell-main .next-shell-appbar{min-height:48px;min-height:var(--shell-light-appbar-min-height,48px);background:#fff;background:var(--shell-light-appbar-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-light-appbar-divider-size,1px) var(--shell-light-appbar-divider-style,solid) var(--shell-light-appbar-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-appbar-shadow,none);box-shadow:none;box-shadow:var(--shell-light-appbar-shadow,none);padding:0 24px;padding:0 var(--shell-light-appbar-paddingLeft,24px)}.next-shell-light .next-shell-main .next-shell-content{padding:20px;padding:var(--shell-light-content-paddingTop,20px) var(--shell-light-content-paddingLeft,20px)}.next-shell-light .next-shell-main .next-shell-footer{background:transparent;background:var(--shell-light-footer-background,transparent);min-height:56px;min-height:var(--shell-light-footer-min-height,56px);color:#ccc;color:var(--shell-light-footer-color,#ccc);font-size:14px;font-size:var(--shell-light-footer-font-size,14px)}.next-shell-light .next-shell-aside.next-shell-navigation{width:200px;width:var(--shell-light-navigation-ver-width,200px);background:#fff;background:var(--shell-light-navigation-ver-background,#fff);border-right:1px solid #eee;border-right:var(--shell-light-navigation-ver-divider-size,1px) var(--shell-light-navigation-ver-divider-style,solid) var(--shell-light-navigation-ver-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-navigation-ver-shadow,none);box-shadow:none;box-shadow:var(--shell-light-navigation-ver-shadow,none);padding:8px 0;padding:var(--shell-light-navigation-ver-paddingTop,8px) 0 var(--shell-light-navigation-ver-paddingBottom,8px)}.next-shell-light .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px;width:var(--shell-light-navigation-ver-width-mini,60px)}.next-shell-light .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-light .next-shell-aside.next-shell-tooldock{width:52px;width:var(--shell-light-tooldock-width,52px);background:#f2f2f2;background:var(--shell-light-tooldock-background,#f2f2f2);border-left:1px solid #eee;border-left:var(--shell-light-tooldock-divider-size,1px) var(--shell-light-tooldock-divider-style,solid) var(--shell-light-tooldock-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-tooldock-shadow,none);box-shadow:none;box-shadow:var(--shell-light-tooldock-shadow,none);padding:8px 0;padding:var(--shell-light-tooldock-paddingTop,8px) 0 var(--shell-light-tooldock-paddingBottom,8px)}.next-shell-light .next-shell-aside .next-shell-tooldockitem{padding:8px 0;padding:var(--shell-light-tooldock-item-paddingTop,8px) 0;color:#666;color:var(--shell-light-tooldock-item-color,#666);background:transparent;background:var(--shell-light-tooldock-item-background,transparent)}.next-shell-light .next-shell-aside .next-shell-tooldockitem:hover{color:#333;color:var(--shell-light-tooldock-item-color-hover,#333);background:#f5f5f5;background:var(--shell-light-tooldock-item-background-hover,#f5f5f5)}.next-shell-light .next-shell-aside .next-shell-localnavigation{width:168px;width:var(--shell-light-local-navigation-width,168px);background:#f2f2f2;background:var(--shell-light-local-navigation-background,#f2f2f2);border-right:1px solid #eee;border-right:var(--shell-light-local-navigation-divider-size,1px) var(--shell-light-local-navigation-divider-style,solid) var(--shell-light-local-navigation-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-local-navigation-shadow,none);box-shadow:none;box-shadow:var(--shell-light-local-navigation-shadow,none);padding:8px 0;padding:var(--shell-light-local-navigation-paddingTop,8px) 0 var(--shell-light-local-navigation-paddingBottom,8px)}.next-shell-light .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-light .next-shell-aside .next-shell-ancillary{width:168px;width:var(--shell-light-ancillary-width,168px);background:#fff;background:var(--shell-light-ancillary-background,#fff);border-left:1px solid #eee;border-left:var(--shell-light-ancillary-divider-size,1px) var(--shell-light-ancillary-divider-style,solid) var(--shell-light-ancillary-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-light-ancillary-shadow,none);box-shadow:none;box-shadow:var(--shell-light-ancillary-shadow,none);padding:8px 0;padding:var(--shell-light-ancillary-paddingTop,8px) 0 var(--shell-light-ancillary-paddingBottom,8px)}.next-shell-light .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-dark .next-shell-header .dock-trigger,.next-shell-dark .next-shell-header .nav-trigger{background:#222;background:var(--shell-dark-header-background,#222)}.next-shell-dark .next-shell-aside .local-nav-trigger{background:#f2f2f2;background:var(--shell-dark-local-navigation-background,#f2f2f2)}.next-shell-dark .next-shell-aside .ancillary-trigger{background:#fff;background:var(--shell-dark-ancillary-background,#fff)}.next-shell-dark .next-shell-header{color:#fff;color:var(--shell-dark-header-color,#fff);height:52px;height:var(--shell-dark-header-height,52px);background:#222;background:var(--shell-dark-header-background,#222);border-bottom:1px solid #1f1f1f;border-bottom:var(--shell-dark-header-divider-size,1px) var(--shell-dark-header-divider-style,solid) var(--shell-dark-header-divider-color,#1f1f1f);-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--shell-dark-header-shadow,0 1px 3px 0 rgba(0,0,0,.12));box-shadow:0 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--shell-dark-header-shadow,0 1px 3px 0 rgba(0,0,0,.12));padding:0 16px;padding:0 var(--shell-dark-header-paddingLeft,16px)}.next-shell-dark .next-shell-header .next-shell-navigation{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;height:52px;height:var(--shell-dark-header-height,52px);line-height:52px;line-height:var(--shell-dark-header-height,52px);margin:0 48px;margin:0 var(--shell-dark-navigation-hoz-marginLeft,48px)}.next-shell-dark .next-shell-task-header{width:100%;min-height:40px;min-height:var(--shell-dark-multitask-min-height,40px);background:#fff;background:var(--shell-dark-multitask-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-dark-multitask-divider-size,1px) var(--shell-dark-multitask-divider-style,solid) var(--shell-dark-multitask-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-dark-multitask-shadow,none);box-shadow:none;box-shadow:var(--shell-dark-multitask-shadow,none);padding:0;padding:0 var(--shell-dark-multitask-paddingLeft,0);overflow:auto}.next-shell-dark .next-shell-main{background:#f5f5f5;background:var(--shell-dark-content-background,#f5f5f5)}.next-shell-dark .next-shell-main .next-shell-appbar{min-height:48px;min-height:var(--shell-dark-appbar-min-height,48px);background:#fff;background:var(--shell-dark-appbar-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-dark-appbar-divider-size,1px) var(--shell-dark-appbar-divider-style,solid) var(--shell-dark-appbar-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-dark-appbar-shadow,none);box-shadow:none;box-shadow:var(--shell-dark-appbar-shadow,none);padding:0 24px;padding:0 var(--shell-dark-appbar-paddingLeft,24px)}.next-shell-dark .next-shell-main .next-shell-content{padding:20px;padding:var(--shell-dark-content-paddingTop,20px) var(--shell-dark-content-paddingLeft,20px)}.next-shell-dark .next-shell-main .next-shell-footer{background:transparent;background:var(--shell-dark-footer-background,transparent);min-height:56px;min-height:var(--shell-dark-footer-min-height,56px);color:#ccc;color:var(--shell-dark-footer-color,#ccc);font-size:14px;font-size:var(--shell-dark-footer-font-size,14px)}.next-shell-dark .next-shell-aside.next-shell-navigation{width:200px;width:var(--shell-dark-navigation-ver-width,200px);background:#222;background:var(--shell-dark-navigation-ver-background,#222);border-right:1px solid #eee;border-right:var(--shell-dark-navigation-ver-divider-size,1px) var(--shell-dark-navigation-ver-divider-style,solid) var(--shell-dark-navigation-ver-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-dark-navigation-ver-shadow,none);box-shadow:none;box-shadow:var(--shell-dark-navigation-ver-shadow,none);padding:8px 0;padding:var(--shell-dark-navigation-ver-paddingTop,8px) 0 var(--shell-dark-navigation-ver-paddingBottom,8px)}.next-shell-dark .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px;width:var(--shell-dark-navigation-ver-width-mini,60px)}.next-shell-dark .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-dark .next-shell-aside.next-shell-tooldock{width:52px;width:var(--shell-dark-tooldock-width,52px);background:#f2f2f2;background:var(--shell-dark-tooldock-background,#f2f2f2);border-left:1px solid #eee;border-left:var(--shell-dark-tooldock-divider-size,1px) var(--shell-dark-tooldock-divider-style,solid) var(--shell-dark-tooldock-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-dark-tooldock-shadow,none);box-shadow:none;box-shadow:var(--shell-dark-tooldock-shadow,none);padding:8px 0;padding:var(--shell-dark-tooldock-paddingTop,8px) 0 var(--shell-dark-tooldock-paddingBottom,8px)}.next-shell-dark .next-shell-aside .next-shell-tooldockitem{padding:8px 0;padding:var(--shell-dark-tooldock-item-paddingTop,8px) 0;color:#666;color:var(--shell-dark-tooldock-item-color,#666);background:transparent;background:var(--shell-dark-tooldock-item-background,transparent)}.next-shell-dark .next-shell-aside .next-shell-tooldockitem:hover{color:#333;color:var(--shell-dark-tooldock-item-color-hover,#333);background:#f5f5f5;background:var(--shell-dark-tooldock-item-background-hover,#f5f5f5)}.next-shell-dark .next-shell-aside .next-shell-localnavigation{width:168px;width:var(--shell-dark-local-navigation-width,168px);background:#f2f2f2;background:var(--shell-dark-local-navigation-background,#f2f2f2);border-right:1px solid #eee;border-right:var(--shell-dark-local-navigation-divider-size,1px) var(--shell-dark-local-navigation-divider-style,solid) var(--shell-dark-local-navigation-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-dark-local-navigation-shadow,none);box-shadow:none;box-shadow:var(--shell-dark-local-navigation-shadow,none);padding:8px 0;padding:var(--shell-dark-local-navigation-paddingTop,8px) 0 var(--shell-dark-local-navigation-paddingBottom,8px)}.next-shell-dark .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-dark .next-shell-aside .next-shell-ancillary{width:168px;width:var(--shell-dark-ancillary-width,168px);background:#fff;background:var(--shell-dark-ancillary-background,#fff);border-left:1px solid #eee;border-left:var(--shell-dark-ancillary-divider-size,1px) var(--shell-dark-ancillary-divider-style,solid) var(--shell-dark-ancillary-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-dark-ancillary-shadow,none);box-shadow:none;box-shadow:var(--shell-dark-ancillary-shadow,none);padding:8px 0;padding:var(--shell-dark-ancillary-paddingTop,8px) 0 var(--shell-dark-ancillary-paddingBottom,8px)}.next-shell-dark .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-brand .next-shell-header .dock-trigger,.next-shell-brand .next-shell-header .nav-trigger{background:#18263c;background:var(--shell-brand-header-background,#18263c)}.next-shell-brand .next-shell-aside .local-nav-trigger{background:#f2f2f2;background:var(--shell-brand-local-navigation-background,#f2f2f2)}.next-shell-brand .next-shell-aside .ancillary-trigger{background:#fff;background:var(--shell-brand-ancillary-background,#fff)}.next-shell-brand .next-shell-header{color:#fff;color:var(--shell-brand-header-color,#fff);height:52px;height:var(--shell-brand-header-height,52px);background:#18263c;background:var(--shell-brand-header-background,#18263c);border-bottom:1px solid #eee;border-bottom:var(--shell-brand-header-divider-size,1px) var(--shell-brand-header-divider-style,solid) var(--shell-brand-header-divider-color,#eee);-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.12);-webkit-box-shadow:var(--shell-brand-header-shadow,0 1px 3px 0 rgba(0,0,0,.12));box-shadow:0 1px 3px 0 rgba(0,0,0,.12);box-shadow:var(--shell-brand-header-shadow,0 1px 3px 0 rgba(0,0,0,.12));padding:0 16px;padding:0 var(--shell-brand-header-paddingLeft,16px)}.next-shell-brand .next-shell-header .next-shell-navigation{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;height:52px;height:var(--shell-brand-header-height,52px);line-height:52px;line-height:var(--shell-brand-header-height,52px);margin:0 48px;margin:0 var(--shell-brand-navigation-hoz-marginLeft,48px)}.next-shell-brand .next-shell-task-header{width:100%;min-height:40px;min-height:var(--shell-brand-multitask-min-height,40px);background:#fff;background:var(--shell-brand-multitask-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-brand-multitask-divider-size,1px) var(--shell-brand-multitask-divider-style,solid) var(--shell-brand-multitask-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-brand-multitask-shadow,none);box-shadow:none;box-shadow:var(--shell-brand-multitask-shadow,none);padding:0;padding:0 var(--shell-brand-multitask-paddingLeft,0);overflow:auto}.next-shell-brand .next-shell-main{background:#f5f5f5;background:var(--shell-brand-content-background,#f5f5f5)}.next-shell-brand .next-shell-main .next-shell-appbar{min-height:48px;min-height:var(--shell-brand-appbar-min-height,48px);background:#fff;background:var(--shell-brand-appbar-background,#fff);border-bottom:1px solid #eee;border-bottom:var(--shell-brand-appbar-divider-size,1px) var(--shell-brand-appbar-divider-style,solid) var(--shell-brand-appbar-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-brand-appbar-shadow,none);box-shadow:none;box-shadow:var(--shell-brand-appbar-shadow,none);padding:0 24px;padding:0 var(--shell-brand-appbar-paddingLeft,24px)}.next-shell-brand .next-shell-main .next-shell-content{padding:20px;padding:var(--shell-brand-content-paddingTop,20px) var(--shell-brand-content-paddingLeft,20px)}.next-shell-brand .next-shell-main .next-shell-footer{background:transparent;background:var(--shell-brand-footer-background,transparent);min-height:56px;min-height:var(--shell-brand-footer-min-height,56px);color:#ccc;color:var(--shell-brand-footer-color,#ccc);font-size:14px;font-size:var(--shell-brand-footer-font-size,14px)}.next-shell-brand .next-shell-aside.next-shell-navigation{width:200px;width:var(--shell-brand-navigation-ver-width,200px);background:#fff;background:var(--shell-brand-navigation-ver-background,#fff);border-right:1px solid #eee;border-right:var(--shell-brand-navigation-ver-divider-size,1px) var(--shell-brand-navigation-ver-divider-style,solid) var(--shell-brand-navigation-ver-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-brand-navigation-ver-shadow,none);box-shadow:none;box-shadow:var(--shell-brand-navigation-ver-shadow,none);padding:8px 0;padding:var(--shell-brand-navigation-ver-paddingTop,8px) 0 var(--shell-brand-navigation-ver-paddingBottom,8px)}.next-shell-brand .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px;width:var(--shell-brand-navigation-ver-width-mini,60px)}.next-shell-brand .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-brand .next-shell-aside.next-shell-tooldock{width:52px;width:var(--shell-brand-tooldock-width,52px);background:#f2f2f2;background:var(--shell-brand-tooldock-background,#f2f2f2);border-left:1px solid #eee;border-left:var(--shell-brand-tooldock-divider-size,1px) var(--shell-brand-tooldock-divider-style,solid) var(--shell-brand-tooldock-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-brand-tooldock-shadow,none);box-shadow:none;box-shadow:var(--shell-brand-tooldock-shadow,none);padding:8px 0;padding:var(--shell-brand-tooldock-paddingTop,8px) 0 var(--shell-brand-tooldock-paddingBottom,8px)}.next-shell-brand .next-shell-aside .next-shell-tooldockitem{padding:8px 0;padding:var(--shell-brand-tooldock-item-paddingTop,8px) 0;color:#666;color:var(--shell-brand-tooldock-item-color,#666);background:transparent;background:var(--shell-brand-tooldock-item-background,transparent)}.next-shell-brand .next-shell-aside .next-shell-tooldockitem:hover{color:#333;color:var(--shell-brand-tooldock-item-color-hover,#333);background:#f5f5f5;background:var(--shell-brand-tooldock-item-background-hover,#f5f5f5)}.next-shell-brand .next-shell-aside .next-shell-localnavigation{width:168px;width:var(--shell-brand-local-navigation-width,168px);background:#f2f2f2;background:var(--shell-brand-local-navigation-background,#f2f2f2);border-right:1px solid #eee;border-right:var(--shell-brand-local-navigation-divider-size,1px) var(--shell-brand-local-navigation-divider-style,solid) var(--shell-brand-local-navigation-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-brand-local-navigation-shadow,none);box-shadow:none;box-shadow:var(--shell-brand-local-navigation-shadow,none);padding:8px 0;padding:var(--shell-brand-local-navigation-paddingTop,8px) 0 var(--shell-brand-local-navigation-paddingBottom,8px)}.next-shell-brand .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-brand .next-shell-aside .next-shell-ancillary{width:168px;width:var(--shell-brand-ancillary-width,168px);background:#fff;background:var(--shell-brand-ancillary-background,#fff);border-left:1px solid #eee;border-left:var(--shell-brand-ancillary-divider-size,1px) var(--shell-brand-ancillary-divider-style,solid) var(--shell-brand-ancillary-divider-color,#eee);-webkit-box-shadow:none;-webkit-box-shadow:var(--shell-brand-ancillary-shadow,none);box-shadow:none;box-shadow:var(--shell-brand-ancillary-shadow,none);padding:8px 0;padding:var(--shell-brand-ancillary-paddingTop,8px) 0 var(--shell-brand-ancillary-paddingBottom,8px)}.next-shell-brand .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-header .next-shell-navigation.next-shell-nav-left{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.next-shell-header .next-shell-navigation.next-shell-nav-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.next-shell-header .next-shell-navigation.next-shell-nav-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.next-shell.next-shell-phone .next-aside-navigation{width:100%}.next-shell.next-shell-phone .next-aside-navigation.next-shell-collapse{width:0}.next-shell.next-shell-phone .next-shell-header .next-shell-navigation{display:none}.next-shell.next-shell-phone .next-shell-navigation{width:100%;height:100%;-webkit-transition:height .2s ease;transition:height .2s ease}.next-shell.next-shell-phone .next-shell-navigation.next-shell-collapse{padding:0;height:0;-webkit-transition:height .2s ease;transition:height .2s ease}.next-shell.next-shell-phone .next-shell-tooldock{height:52px;height:var(--shell-dark-tooldock-height,52px);left:0;right:0;position:absolute;width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.next-shell.next-shell-phone .next-shell-tooldock.next-shell-collapse{display:none;height:0;padding:0;-webkit-transition:all .2s ease;transition:all .2s ease}.next-shell.next-shell-phone .next-shell-aside.next-aside-ancillary,.next-shell.next-shell-tablet .next-shell-aside.next-aside-ancillary{width:0}.next-shell.next-shell-phone .next-shell-ancillary,.next-shell.next-shell-tablet .next-shell-ancillary{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.next-shell.next-shell-phone .next-shell-aside.next-aside-localnavigation,.next-shell.next-shell-tablet .next-shell-aside.next-aside-localnavigation{width:0}.next-notification{width:384px;position:fixed;z-index:1010;padding:0;margin:0}.next-notification .next-message{margin-bottom:16px;overflow:hidden}.next-notification-fade-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-play-state:paused;animation-play-state:paused;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease;animation-timing-function:ease}.next-notification-fade-leave.next-notification-fade-leave-active{-webkit-animation-name:NotificationFadeOut;animation-name:NotificationFadeOut;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.next-typography{color:#333;color:var(--typography-text-color,#333)}.next-typography-title{font-weight:600;font-weight:var(--typography-title-font-weight,600);margin-bottom:.5em}.next-typography+.next-typography-title{margin-top:1.2em}.next-typography-paragraph{color:#333;color:var(--typography-text-color,#333);margin-bottom:1em;font-size:14px;font-size:var(--typography-paragraph-font-size,14px);line-height:1.5;line-height:var(--typography-paragraph-line-height,1.5)}.next-typography mark{padding:0;background:#ffe98f;background:var(--typography-text-mark-background,#ffe98f);color:#333;color:var(--typography-text-mark-color,#333)}.next-typography strong{font-weight:600;font-weight:var(--typography-text-strong-font-weight,600)}.next-typography code{background-color:#f9f9f9;background-color:var(--typography-text-code-background,#f9f9f9);color:#333;color:var(--typography-text-code-color,#333);border:1px solid #eee;border:1px solid var(--typography-text-code-border-color,#eee);margin:0 .2em;padding:.2em .4em .1em;font-size:85%;border-radius:3px;border-radius:var(--typography-text-code-corner,3px)}.next-typography ol,.next-typography ul{margin:0 0 1em;padding:0}.next-typography li{list-style-type:circle;margin:0 0 0 20px;padding:0 0 0 4px}.next-typography a{text-decoration:none}.next-typography a:link{color:#298dff;color:var(--color-link-1,#298dff)}.next-typography a:visited{color:#4a83c5;color:var(--color-link-2,#4a83c5)}.next-typography a:active,.next-typography a:hover{color:#2580e7;color:var(--color-link-3,#2580e7)}.next-typography a:active{text-decoration:underline}h1.next-typography-title{font-size:24px;font-size:var(--typography-title-h1-font-size,24px)}h2.next-typography-title{font-size:20px;font-size:var(--typography-title-h2-font-size,20px)}h3.next-typography-title{font-size:16px;font-size:var(--typography-title-h3-font-size,16px)}h4.next-typography-title{font-size:16px;font-size:var(--typography-title-h4-font-size,16px)}h5.next-typography-title{font-size:14px;font-size:var(--typography-title-h5-font-size,14px)}h6.next-typography-title{font-size:14px;font-size:var(--typography-title-h6-font-size,14px)}.next-divider{margin:0;padding:0;font-size:14px;line-height:1.5;list-style:none;font-variant:tabular-nums;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum";background:#e6e6e6;background:var(--divider-hoz-color,#e6e6e6);border-collapse:separate}.next-divider,.next-divider *,.next-divider :after,.next-divider :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-divider-hoz{display:block;clear:both;width:100%;min-width:100%;height:1px;height:var(--divider-hoz-size,1px);margin:16px 0;margin:var(--divider-hoz-marginTop,16px) 0}.next-divider-ver{position:relative;top:-.06em;display:inline-block;width:1px;width:var(--divider-ver-size,1px);background:#e6e6e6;background:var(--divider-ver-color,#e6e6e6);height:.9em;margin:0 8px;margin:0 var(--divider-ver-marginLeft,8px);vertical-align:middle}.next-divider-hoz.next-divider-with-text-center,.next-divider-hoz.next-divider-with-text-left,.next-divider-hoz.next-divider-with-text-right{display:table;margin:16px 0;margin:var(--divider-hoz-text-marginTop,16px) 0;color:#333;color:var(--divider-hoz-text-color,#333);font-weight:400;font-weight:var(--divider-hoz-text-weight,normal);font-size:16px;font-size:var(--divider-hoz-text-size,16px);white-space:nowrap;text-align:center;background:transparent}.next-divider-hoz.next-divider-with-text-center:after,.next-divider-hoz.next-divider-with-text-center:before,.next-divider-hoz.next-divider-with-text-left:after,.next-divider-hoz.next-divider-with-text-left:before,.next-divider-hoz.next-divider-with-text-right:after,.next-divider-hoz.next-divider-with-text-right:before{top:50%;display:table-cell;width:50%;border-top:1px solid #e6e6e6;border-top:var(--divider-hoz-size,1px) solid var(--divider-hoz-color,#e6e6e6);-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);content:""}.next-divider-hoz.next-divider-with-text-center.next-divider-dashed,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed{border-top:0}.next-divider-hoz.next-divider-with-text-center.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-center.next-divider-dashed:before,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed:before,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed:before{border-style:dashed none none}.next-divider-hoz.next-divider-with-text-left .next-divider-inner-text,.next-divider-hoz.next-divider-with-text-right .next-divider-inner-text{display:inline-block;padding:0 16px;padding:0 var(--divider-hoz-text-left-paddingLeft,16px)}.next-divider-hoz.next-divider-with-text-left:before{top:50%;width:5%}.next-divider-hoz.next-divider-with-text-left:after,.next-divider-hoz.next-divider-with-text-right:before{top:50%;width:95%}.next-divider-hoz.next-divider-with-text-right:after{top:50%;width:5%}.next-divider-inner-text{display:inline-block;padding:0 16px;padding:0 var(--divider-hoz-text-center-paddingLeft,16px)}.next-divider-dashed{background:none;border:0 dashed #e6e6e6;border-color:var(--divider-hoz-color,#e6e6e6);border-top:var(--divider-hoz-size,1px) dashed var(--divider-hoz-color,#e6e6e6)}.next-divider-dashed.next-divider-ver{border-width:0 0 0 1px;border-left-width:var(--divider-ver-size,1px);border-bottom-width:0;border-right-width:0;border-top-width:0}.next-box{display:-webkit-box;display:-ms-flexbox;display:flex}.next-box,.next-box *,.next-box :after,.next-box :before,.next-table{-webkit-box-sizing:border-box;box-sizing:border-box}.next-table{position:relative;border-top-left-radius:0;border-top-left-radius:var(--table-header-corner-top,0);border-top-right-radius:0;border-top-right-radius:var(--table-header-corner-top,0);border-bottom-left-radius:0;border-bottom-left-radius:var(--table-header-corner-bottom,0);border-bottom-right-radius:0;border-bottom-right-radius:var(--table-header-corner-bottom,0);border-top:1px solid #e6e6e6;border-top:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);border-left:1px solid #e6e6e6;border-left:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6)}.next-table *,.next-table :after,.next-table :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-table .next-table-header tr:first-child th:first-child{border-top-left-radius:0;border-top-left-radius:var(--table-header-corner-top,0)}.next-table .next-table-header tr:first-child th:last-child{border-top-right-radius:0;border-top-right-radius:var(--table-header-corner-top,0)}.next-table .next-table-header tr:last-child th:first-child{border-bottom-left-radius:0;border-bottom-left-radius:var(--table-header-corner-bottom,0)}.next-table .next-table-header tr:last-child th:last-child{border-bottom-right-radius:0;border-bottom-right-radius:var(--table-header-corner-bottom,0)}.next-table.next-table-layout-fixed{overflow:auto}.next-table.next-table-layout-fixed table{table-layout:fixed}.next-table.next-table-layout-auto table{table-layout:auto}.next-table.next-table-small th .next-table-cell-wrapper{padding:8px;padding:var(--table-size-s-header-padding-top,8px) var(--table-size-s-header-padding-left,8px)}.next-table.next-table-small td .next-table-cell-wrapper{padding:8px;padding:var(--table-size-s-cell-padding-top,8px) var(--table-size-s-cell-padding-left,8px)}.next-table.next-table-small .next-table-prerow .next-table-cell-wrapper{padding:8px}.next-table table{border-collapse:separate;border-spacing:0;width:100%;background:#fff;background:var(--table-row-bg,#fff);border-top-left-radius:0;border-top-left-radius:var(--table-header-corner-top,0);border-top-right-radius:0;border-top-right-radius:var(--table-header-corner-top,0);border-bottom-left-radius:0;border-bottom-left-radius:var(--table-header-corner-bottom,0);border-bottom-right-radius:0;border-bottom-right-radius:var(--table-header-corner-bottom,0)}.next-table table tr:first-child td{border-top-width:0}.next-table th{padding:0;background:#f5f5f5;background:var(--table-th-bg,#f5f5f5);color:#333;color:var(--table-th-color,#333);text-align:left;font-weight:400;font-weight:var(--table-th-font-weight,normal);border-right:1px solid #e6e6e6;border-right:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);border-bottom:1px solid #e6e6e6;border-bottom:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6)}.next-table th .next-table-cell-wrapper{padding:12px 16px;padding:var(--table-header-padding-top,12px) var(--table-header-padding-left,16px);overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table th.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table th.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table th.next-table-fix-left,.next-table th.next-table-fix-right{z-index:1}.next-table-affix{z-index:1;overflow:hidden}.next-table-stickylock .next-table-affix{z-index:9}.next-table-header-resizable{position:relative}.next-table-header-resizable .next-table-resize-handler{position:absolute;right:-5px;top:0;bottom:0;width:10px;background:transparent;cursor:ew-resize}.next-table-header-resizable .next-table-resize-handler:after{position:absolute;display:block;content:" ";width:2px;width:var(--line-2,2px);height:100%;right:50%}.next-table-header-resizable .next-table-resize-handler:hover:after{z-index:1;background:#209bfa;background:var(--color-brand1-6,#209bfa)}.next-table.next-table-lock-left .next-table-header-resizable .next-table-resize-handler,.next-table.next-table-lock-right .next-table-header-resizable .next-table-resize-handler{cursor:auto}.next-table.next-table-lock-left .next-table-header-resizable .next-table-resize-handler:hover:after,.next-table.next-table-lock-right .next-table-header-resizable .next-table-resize-handler:hover:after{z-index:-1}.next-table td{padding:0;border-right:1px solid #e6e6e6;border-right:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);border-bottom:1px solid #e6e6e6;border-bottom:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6)}.next-table td .next-table-cell-wrapper{padding:12px 16px;padding:var(--table-cell-padding-top,12px) var(--table-cell-padding-left,16px);overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-table-tree-placeholder{margin-right:8px;outline:0;cursor:pointer}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow .next-icon-remote,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{content:"";content:var(--table-tree-fold-icon-content,"\e619")}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow .next-icon-remote,.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{content:"";content:var(--table-tree-unfold-icon-content,"\e63d")}.next-table td.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table td.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table .next-table-expanded .next-table-cell-wrapper,.next-table .next-table-selection .next-table-cell-wrapper{overflow:visible}.next-table.no-header table tr:first-child td{border-top-width:1px}.next-table.only-bottom-border{border-width:0}.next-table.only-bottom-border td,.next-table.only-bottom-border th{border-width:0 0 1px;border-bottom-width:var(--table-normal-border-width,1px);border-right-width:0;border-top-width:0}.next-table.only-bottom-border table tr td:first-child,.next-table.only-bottom-border table tr th:first-child{border-left-width:0}.next-table.only-bottom-border .next-table-body tr td:last-child,.next-table.only-bottom-border .next-table-header tr th:last-child{border-right-width:0}.next-table-loading{display:block}.next-table.zebra tr:nth-child(odd) td{background:#fff;background:var(--table-td-normal,#fff)}.next-table.zebra tr:nth-child(2n) td{background:#fafafa;background:var(--table-td-gray,#fafafa)}.next-table.zebra .next-table-cell.hovered,.next-table.zebra .next-table-row.hovered td{background:#fafafa;background:var(--table-row-hover-bg,#fafafa);color:#333;color:var(--table-row-hover-color,#333)}.next-table.zebra .next-table-row.selected td{background:#f9f9f9;background:var(--table-row-selected-bg,#f9f9f9);color:#333;color:var(--table-row-selected-color,#333)}.next-table-empty{color:#ccc;color:var(--table-empty-color,#ccc);padding:32px 0;padding:var(--table-empty-padding,32px) 0;text-align:center}.next-table-expanded-row>td{border-width:0 0 1px;border-bottom-width:var(--table-normal-border-width,1px);border-right-width:0;border-top-width:0}.next-table-expanded-row>td:first-child{border-left-width:1px;border-left-width:var(--table-normal-border-width,1px)}.next-table-expanded-row>td:last-child{border-right-width:1px;border-right-width:var(--table-normal-border-width,1px)}.next-table-expanded-row:last-child>td{border-bottom-width:1px;border-bottom-width:var(--table-normal-border-width,1px)}.next-table-expanded-row .next-table{border-top:0;border-left:0}.next-table-expanded-row .next-table td,.next-table-expanded-row .next-table th{border-right:1px solid #e6e6e6;border-right:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6)}.next-table-expanded-row .next-table.only-bottom-border td,.next-table-expanded-row .next-table.only-bottom-border th{border-right:0}.next-table-expanded-row .next-table .last td{border-bottom:0}.next-table-expanded-row .next-table td.last,.next-table-expanded-row .next-table th:last-child{border-right:0}.next-table-filter-footer{margin:10px 10px 0}.next-table-filter-footer button{margin-right:5px}.next-table-row{-webkit-transition:all .1s linear;transition:all .1s linear;background:#fff;background:var(--table-row-bg,#fff);color:#333;color:var(--table-row-color,#333)}.next-table-row.hidden{display:none}.next-table-row.hovered{background:#fafafa;background:var(--table-row-hover-bg,#fafafa);color:#333;color:var(--table-row-hover-color,#333)}.next-table-row.selected{background:#f9f9f9;background:var(--table-row-selected-bg,#f9f9f9);color:#333;color:var(--table-row-selected-color,#333)}.next-table-cell.hovered{background:#fafafa;background:var(--table-row-hover-bg,#fafafa);color:#333;color:var(--table-row-hover-color,#333)}.next-table-tree-placeholder{display:inline-block;width:12px}.last .next-table-expanded-row td{border-bottom-width:1px}.next-table-body,.next-table-header{overflow:auto;font-size:14px;font-size:var(--table-th-font-size,14px)}.next-table-column-resize-proxy{position:absolute;top:0;bottom:0;width:0;border-left:2px solid #209bfa;border-left:var(--line-2,2px) solid var(--color-brand1-6,#209bfa);z-index:10;display:none}.next-table-header{margin-bottom:-20px;padding-bottom:20px;border-top-left-radius:0;border-top-left-radius:var(--table-header-corner-top,0);border-top-right-radius:0;border-top-right-radius:var(--table-header-corner-top,0);border-bottom-left-radius:0;border-bottom-left-radius:var(--table-header-corner-bottom,0);border-bottom-right-radius:0;border-bottom-right-radius:var(--table-header-corner-bottom,0);overflow:-moz-scrollbars-none;-ms-overflow-style:none;scrollbar-width:none}.next-table-header::-webkit-scrollbar{display:none}.next-table-body{font-size:14px;font-size:var(--table-body-font-size,14px);position:relative}.next-table-fixed{border-right:1px solid #e6e6e6;border-right:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);border-bottom:1px solid #e6e6e6;border-bottom:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6)}.next-table-fixed table{table-layout:fixed}.next-table-fixed .next-table-header{background:#f5f5f5;background:var(--table-th-bg,#f5f5f5)}.next-table-fixed table tr td:first-child,.next-table-fixed table tr th:first-child{border-left-width:0}.next-table-fixed .next-table-header th{border-top-width:0}.next-table-fixed .next-table-header tr th:last-child{border-right-width:0}.next-table-fixed .next-table-body td{border-top-width:0}.next-table-fixed .next-table-body tr:last-child td{border-bottom-width:0}.next-table-fixed .next-table-body tr td:last-child{border-right-width:0}.next-table-fixed.only-bottom-border .next-table-body tr:last-child td{border-bottom-width:1px;border-bottom-width:var(--table-normal-border-width,1px)}.next-table-fixed.next-table-group table tr td:first-child,.next-table-fixed.next-table-group table tr th:first-child{border-left-width:1px;border-left-width:var(--table-normal-border-width,1px)}.next-table-fixed.next-table-group .next-table-header th{border-top-width:1px;border-top-width:var(--table-normal-border-width,1px)}.next-table-fixed.next-table-group .next-table-header tr th:last-child{border-right-width:1px;border-right-width:var(--table-normal-border-width,1px)}.next-table-fixed.next-table-group .next-table-body td{border-top-width:1px;border-top-width:var(--table-normal-border-width,1px)}.next-table-fixed.next-table-group .next-table-body tr:last-child td{border-bottom-width:1px;border-bottom-width:var(--table-normal-border-width,1px)}.next-table-fixed.next-table-group .next-table-body tr td:last-child,.next-table-fixed.next-table-lock-left .next-table-body tr td:last-child,.next-table-fixed.next-table-lock-left .next-table-header tr th:last-child{border-right-width:1px;border-right-width:var(--table-normal-border-width,1px)}.next-table-lock .next-table-body{overflow-x:auto;overflow-y:visible}.next-table-group{border-width:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-header table{border-left:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-body table.next-table-row,.next-table-group.only-bottom-border .next-table-header table{border-top:0}.next-table-group.only-bottom-border .next-table-body .next-table-group-footer td{border-bottom:0}.next-table-group .next-table-body{margin-top:8px;margin-top:var(--table-group-split,8px)}.next-table-group .next-table-body table{border-top:1px solid #e6e6e6;border-top:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);border-left:1px solid #e6e6e6;border-left:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);margin-bottom:8px;margin-bottom:var(--table-group-split,8px)}.next-table-group .next-table-body table tr:first-child td{border-top-width:1px}.next-table-group .next-table-body table:last-of-type{margin-bottom:0}.next-table-group .next-table-header table{border-top:1px solid #e6e6e6;border-top:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6);border-left:1px solid #e6e6e6;border-left:var(--table-normal-border-width,1px) var(--table-normal-border-style,solid) var(--table-normal-border-color,#e6e6e6)}.next-table-group .next-table-group-header td{background:#f5f5f5;background:var(--table-group-th-bg,#f5f5f5);color:#333;color:var(--table-group-th-color,#333)}.next-table-group .next-table-group-header td:first-child{border-top-left-radius:0;border-top-left-radius:var(--table-group-header-corner-top,0);border-bottom-left-radius:0;border-bottom-left-radius:var(--table-group-header-corner-bottom,0)}.next-table-group .next-table-group-header td:last-child{border-top-right-radius:0;border-top-right-radius:var(--table-group-header-corner-top,0);border-bottom-right-radius:0;border-bottom-right-radius:var(--table-group-header-corner-bottom,0)}.next-table-group .next-table-group-footer td{background:#f5f5f5;background:var(--table-group-footer-bg,#f5f5f5);color:#333;color:var(--table-group-footer-color,#333)}.next-table-group .next-table-group-footer td:first-child{border-top-left-radius:0;border-top-left-radius:var(--table-group-footer-corner-top,0);border-bottom-left-radius:0;border-bottom-left-radius:var(--table-group-footer-corner-bottom,0)}.next-table-group .next-table-group-footer td:last-child{border-top-right-radius:0;border-top-right-radius:var(--table-group-footer-corner-top,0);border-bottom-right-radius:0;border-bottom-right-radius:var(--table-group-footer-corner-bottom,0)}.next-table-group .next-table-row.hovered,.next-table-group .next-table-row.selected{background:#fff;background:var(--table-row-bg,#fff);color:#333;color:var(--table-row-color,#333)}.next-table-lock{position:relative}.next-table-lock table{table-layout:fixed}.next-table-header-inner{overflow:unset}.next-table-header-fixer{content:" ";border-top-right-radius:0;border-top-right-radius:var(--table-header-corner-top,0);border-bottom-right-radius:0;border-bottom-right-radius:var(--table-header-corner-bottom,0);width:15px;background:inherit;position:absolute;right:0;height:100%;top:0}.next-table-wrap-empty .next-table-lock-left td,.next-table-wrap-empty .next-table-lock-right td{border:none}.next-table-wrap-empty .next-table-lock-left .next-table-empty,.next-table-wrap-empty .next-table-lock-right .next-table-empty{display:none}.next-table-wrap-empty>.next-table-inner>.next-table-body>table{table-layout:fixed}.next-table-lock-left,.next-table-lock-right{position:absolute;left:0;top:0;z-index:1;border:0;-webkit-transition:-webkit-box-shadow .3s ease;transition:-webkit-box-shadow .3s ease;transition:box-shadow .3s ease;transition:box-shadow .3s ease,-webkit-box-shadow .3s ease;overflow:hidden}.next-table-lock-left table,.next-table-lock-right table{width:auto}.next-table-lock-left .next-table-body,.next-table-lock-right .next-table-body{overflow-y:scroll;overflow-x:hidden;margin-right:-20px;padding-right:0}.next-table-lock-left.shadow .next-table-body tr td:last-child,.next-table-lock-left.shadow .next-table-header tr th:last-child,.next-table-lock-right.shadow .next-table-body tr td:last-child,.next-table-lock-right.shadow .next-table-header tr th:last-child{border-right-width:0}.next-table-lock-right{right:0;left:auto}.next-table-lock-right table tr td:first-child,.next-table-lock-right table tr th:first-child{border-left-width:1px}.next-table-lock-right.shadow{-webkit-box-shadow:-2px 0 3px rgba(0,0,0,.12);box-shadow:-2px 0 3px rgba(0,0,0,.12)}.next-table-lock-left.shadow{-webkit-box-shadow:2px 0 3px rgba(0,0,0,.12);box-shadow:2px 0 3px rgba(0,0,0,.12)}.next-table-filter{line-height:1}.next-table-sort{cursor:pointer;position:relative;width:16px;display:inline-block;line-height:1}.next-table-sort:focus{outline:0}.next-table-sort>a:before{content:" ";display:inline-block;vertical-align:middle}.next-table-sort .next-icon{position:absolute;left:-2px;color:#333;color:var(--table-sort-color,#333)}.next-table-sort .next-icon .next-icon-remote,.next-table-sort .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-table-sort .current .next-icon{color:#209bfa;color:var(--table-sort-color-current,#209bfa)}.next-table-sort .next-icon-ascending{left:2px}.next-table-filter{cursor:pointer;width:20px;display:inline-block}.next-table-filter:focus{outline:0}.next-table-filter .next-icon{color:#333;color:var(--table-sort-color,#333)}.next-table-filter .next-icon .next-icon-remote,.next-table-filter .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-table-filter .next-table-filter-active{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-table-filter-menu .next-menu-content{max-height:220px;overflow:auto}.next-table-header-icon{margin-left:8px}.next-table-expanded-ctrl{cursor:pointer}.next-table-expanded-ctrl:focus{outline:0}.next-table-expanded-ctrl.disabled{color:#999;color:var(--table-expanded-ctrl-disabled-color,#999)}.next-table-expanded-ctrl .next-table-expand-unfold .next-icon-remote,.next-table-expanded-ctrl .next-table-expand-unfold:before{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-unfold:before{content:"";content:var(--table-expand-unfold-icon-content,"\e601")}.next-table-expanded-ctrl .next-table-expand-fold .next-icon-remote,.next-table-expanded-ctrl .next-table-expand-fold:before{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-fold:before{content:"";content:var(--table-expand-fold-icon-content,"\e655")}.next-table-fix-left,.next-table-fix-right{background:inherit;position:sticky;z-index:1;background-clip:padding-box}.next-table-ping-left .next-table-expanded-area .next-table-fix-left-last:after{content:none}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last,.next-table-ping-left .next-table-fix-left-last{border-right-width:0}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last:after,.next-table-ping-left .next-table-fix-left-last:after{-webkit-box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.15);box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;right:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.next-table-ping-right .next-table-expanded-area .next-table-fix-right-first:after{content:none}.next-table-ping-right .next-table-expanded-area .next-table-ping-right .next-table-fix-right-first:after,.next-table-ping-right .next-table-fix-right-first:after{left:0}.next-table-fixed.next-table-scrolling-to-right:after,.next-table-lock.next-table-scrolling-to-right:after,.next-table-ping-right .next-table-expanded-area .next-table-ping-right .next-table-fix-right-first:after,.next-table-ping-right .next-table-fix-right-first:after{-webkit-box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15);box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.next-table-fixed.next-table-scrolling-to-right:after,.next-table-lock.next-table-scrolling-to-right:after{right:-30px}.next-table-fixed.only-bottom-border,.next-table-lock.only-bottom-border{border-right:0}.next-table[dir=rtl] th{text-align:right}.next-table[dir=rtl] .next-table-header-resizable .next-table-resize-handler{right:auto;left:0}.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-table-tree-placeholder{margin-left:3px;margin-right:0;float:right}.next-table[dir=rtl] .next-table-expanded-row td:first-child{border-left-width:0;border-right-width:1px}.next-table[dir=rtl] .next-table-expanded-row td:last-child{border-left-width:1px;border-right-width:0}.next-table[dir=rtl].only-bottom-border .next-table-expanded-row td,.next-table[dir=rtl].only-bottom-border .next-table-expanded-row th{border-width:0 0 1px;border-bottom-width:var(--table-normal-border-width,1px);border-right-width:0;border-top-width:0}.next-table[dir=rtl] .next-table-filter-footer button{margin-left:5px;margin-right:0}.next-table[dir=rtl] .next-table-lock-left,.next-table[dir=rtl] .next-table-lock-right{left:auto;right:0}.next-table[dir=rtl] .next-table-lock-right{right:auto;left:0}.next-table[dir=rtl] .next-table-lock-right table tr td:first-child,.next-table[dir=rtl] .next-table-lock-right table tr th:first-child{border-right-width:1px}.next-table[dir=rtl] .next-table-lock-right.shadow{-webkit-box-shadow:2px 0 3px rgba(0,0,0,.12);box-shadow:2px 0 3px rgba(0,0,0,.12)}.next-table[dir=rtl] .next-table-lock-left.shadow{-webkit-box-shadow:-2px 0 3px rgba(0,0,0,.12);box-shadow:-2px 0 3px rgba(0,0,0,.12)}.next-table[dir=rtl] .next-table-sort .next-icon{right:0;left:auto}.next-table[dir=rtl] .next-table-sort .next-icon-ascending{right:4px;left:auto}.next-table[dir=rtl] .next-table-filter{margin-right:5px;margin-left:0}.next-table-fixed[dir=rtl] table tr td:first-child,.next-table-fixed[dir=rtl] table tr th:first-child{border-left-width:1px;border-left-width:var(--table-normal-border-width,1px);border-right-width:0}.next-table-fixed[dir=rtl] .next-table-body tr td:last-child,.next-table-fixed[dir=rtl] .next-table-header tr th:last-child{border-left-width:1px;border-left-width:var(--table-normal-border-width,1px)}.next-calendar2,.next-calendar2 *,.next-calendar2 :after,.next-calendar2 :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-calendar2 table{border-collapse:collapse;border-spacing:0}.next-calendar2 td,.next-calendar2 th{padding:0}div[dir=rtl].next-calendar2-card .next-calendar2-header-actions,div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-actions,div[dir=rtl].next-calendar2-panel .next-calendar2-header-actions{margin-right:auto;margin-left:0}div[dir=rtl].next-calendar2-card .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-card .next-calendar2-header-ranges>:not(:first-child),div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-ranges>:not(:first-child),div[dir=rtl].next-calendar2-panel .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-panel .next-calendar2-header-ranges>:not(:first-child){margin-right:8px;margin-left:0}div[dir=rtl].next-calendar2-fullscreen .next-calendar2-cell-value,div[dir=rtl].next-calendar2-fullscreen .next-calendar2-table th{text-align:left}div[dir=rtl].next-calendar2-fullscreen .next-calendar2-table th{padding:0 0 5px 12px}.next-calendar2{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff}.next-calendar2-header{display:-webkit-box;display:-ms-flexbox;display:flex}.next-calendar2-table{width:100%;table-layout:fixed}.next-calendar2-cell{cursor:pointer;position:relative;-webkit-transition:background-color .2s,border .2s;transition:background-color .2s,border .2s}.next-calendar2 .next-calendar2-cell-inner{color:#ccc;color:var(--color-text1-1,#ccc);outline:none;min-width:24px;position:relative;border:1px solid transparent}.next-calendar2-cell-disabled:before{color:#ccc;color:var(--color-text1-1,#ccc);background:#fafafa;background:var(--color-fill1-1,#fafafa)}.next-calendar2-card .next-calendar2-header-actions,.next-calendar2-fullscreen .next-calendar2-header-actions,.next-calendar2-panel .next-calendar2-header-actions{margin-left:auto}.next-calendar2-card .next-calendar2-header-actions>:not(:first-child),.next-calendar2-card .next-calendar2-header-ranges>:not(:first-child),.next-calendar2-fullscreen .next-calendar2-header-actions>:not(:first-child),.next-calendar2-fullscreen .next-calendar2-header-ranges>:not(:first-child),.next-calendar2-panel .next-calendar2-header-actions>:not(:first-child),.next-calendar2-panel .next-calendar2-header-ranges>:not(:first-child){margin-left:8px}.next-calendar2-card .next-calendar2-header-select-month,.next-calendar2-card .next-calendar2-header-select-year,.next-calendar2-fullscreen .next-calendar2-header-select-month,.next-calendar2-fullscreen .next-calendar2-header-select-year,.next-calendar2-panel .next-calendar2-header-select-month,.next-calendar2-panel .next-calendar2-header-select-year{min-width:88px}.next-calendar2-card .next-calendar2-header-select-month .next-input,.next-calendar2-card .next-calendar2-header-select-year .next-input,.next-calendar2-fullscreen .next-calendar2-header-select-month .next-input,.next-calendar2-fullscreen .next-calendar2-header-select-year .next-input,.next-calendar2-panel .next-calendar2-header-select-month .next-input,.next-calendar2-panel .next-calendar2-header-select-year .next-input{min-width:auto}.next-calendar2-card .next-calendar2-body,.next-calendar2-fullscreen .next-calendar2-body,.next-calendar2-panel .next-calendar2-body{padding:8px 0}.next-calendar2-card .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-inner{z-index:2;height:24px;line-height:22px;border-radius:2px;display:inline-block}.next-calendar2-card .next-calendar2,.next-calendar2-panel .next-calendar2{min-height:150px}.next-calendar2-card .next-calendar2-table thead>tr,.next-calendar2-panel .next-calendar2-table thead>tr{height:24px;color:#999;color:var(--color-text1-2,#999)}.next-calendar2-card .next-calendar2-table td,.next-calendar2-card .next-calendar2-table th,.next-calendar2-panel .next-calendar2-table td,.next-calendar2-panel .next-calendar2-table th{font-weight:400;text-align:center;padding:4px 0}.next-calendar2-card .next-calendar2-table th,.next-calendar2-panel .next-calendar2-table th{height:32px}.next-calendar2-card .next-calendar2-table-decade,.next-calendar2-card .next-calendar2-table-month,.next-calendar2-card .next-calendar2-table-year,.next-calendar2-panel .next-calendar2-table-decade,.next-calendar2-panel .next-calendar2-table-month,.next-calendar2-panel .next-calendar2-table-year{height:145px}.next-calendar2-card .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-card .next-calendar2-table-month .next-calendar2-cell-inner,.next-calendar2-card .next-calendar2-table-year .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-month .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-year .next-calendar2-cell-inner{min-width:56px}.next-calendar2-card .next-calendar2-table-quarter,.next-calendar2-panel .next-calendar2-table-quarter{height:50px}.next-calendar2-card .next-calendar2-table-quarter .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-quarter .next-calendar2-cell-inner{min-width:56px}.next-calendar2-card .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-decade .next-calendar2-cell-inner{min-width:80px}.next-calendar2-card .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner{color:#666;color:var(--color-text1-3,#666)}.next-calendar2-card .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover:not(.next-calendar2-cell-hover) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover:not(.next-calendar2-cell-hover) .next-calendar2-cell-inner{background:#f9f9f9;background:var(--color-fill1-2,#f9f9f9)}.next-calendar2-card .next-calendar2-cell-current.next-calendar2-cell-today:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current.next-calendar2-cell-today:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-calendar2-card .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{color:#fff;background:#209bfa;background:var(--color-brand1-6,#209bfa)}.next-calendar2-fullscreen .next-calendar2-cell-value,.next-calendar2-fullscreen .next-calendar2-table th{text-align:right}.next-calendar2-fullscreen .next-calendar2-table th{padding:0 12px 5px 0}.next-calendar2-fullscreen .next-calendar2-cell-inner{margin:0 4px;padding:4px 8px 0}.next-calendar2-fullscreen .next-calendar2-cell-inner,.next-calendar2-fullscreen td .next-calendar2-cell-inner{height:80px;border-top:2px solid #eee;border-top:2px solid var(--color-line1-1,#eee)}.next-calendar2-fullscreen .next-calendar2-cell-disabled .next-calendar2-cell-inner{color:#ccc;color:var(--color-text1-1,#ccc);background:#fafafa;background:var(--color-fill1-1,#fafafa)}.next-calendar2-fullscreen .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner{color:#666;color:var(--color-text1-3,#666)}.next-calendar2-fullscreen .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover .next-calendar2-cell-inner{background-color:#f9f9f9;background-color:var(--color-fill1-2,#f9f9f9)}.next-calendar2-fullscreen .next-calendar2-cell-current.next-calendar2-cell-today .next-calendar2-cell-inner{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-calendar2-fullscreen .next-calendar2-cell-current .next-calendar2-cell-inner{background-color:#fff}.next-calendar2-fullscreen .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{border-top-color:#209bfa;border-top-color:var(--color-brand1-6,#209bfa);font-weight:700;color:#209bfa;color:var(--color-brand1-6,#209bfa);background:#add9ff;background:var(--color-brand1-1,#add9ff)}.next-calendar2-card .next-calendar2-header{padding:8px;border-bottom:1px solid #eee;border-bottom:1px solid var(--color-line1-1,#eee)}.next-calendar2-panel .next-calendar2-header{padding:0 8px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #eee;border-bottom:1px solid var(--color-line1-1,#eee)}.next-calendar2-panel .next-calendar2-header-btn{min-width:20px;line-height:20px;color:#666;color:var(--color-text1-3,#666);font-family:inherit;vertical-align:initial;border-radius:2px}.next-calendar2-panel .next-calendar2-header-btn>span,.next-calendar2-panel .next-calendar2-header-text-field{text-align:center;font-size:14px;color:#333;color:var(--color-text1-4,#333);font-weight:bolder;vertical-align:initial}.next-calendar2-panel .next-calendar2-header-btn:hover,.next-calendar2-panel .next-calendar2-header-btn:hover>span{color:#209bfa;color:var(--color-brand1-6,#209bfa)}.next-calendar2-panel .next-calendar2-header-left-btn:hover,.next-calendar2-panel .next-calendar2-header-right-btn:hover{background:#f9f9f9;background:var(--color-fill1-2,#f9f9f9)}.next-calendar2-panel .next-calendar2-header-text-field{-webkit-box-flex:1;-ms-flex:1;flex:1;height:38px;line-height:38px}.next-calendar2-panel .next-calendar2-header-text-field .next-calendar2-header-btn:not(:first-child){margin-left:6px}.next-calendar2-header-select-month-popup,.next-calendar2-header-select-year-popup{min-width:auto}.next-date-picker2-footer{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;border-top:1px solid #eee;border-top:1px solid var(--color-line1-1,#eee);padding:4px 12px;display:-webkit-box;display:-ms-flexbox;display:flex;min-height:40px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}.next-date-picker2-footer-preset>.next-btn{margin-right:8px}.next-date-picker2-footer-actions{margin-left:auto}.next-date-picker2-footer-preset-only{width:100%}.next-time-picker2-menu{float:left;text-align:center;padding:8px 0}.next-time-picker2-menu:not(:last-child){border-right:1px solid #e6e6e6;border-right:var(--line-1,1px) var(--line-solid,solid) var(--color-line1-2,#e6e6e6)}.next-time-picker2-menu-title{cursor:default;height:28px;line-height:28px;font-size:12px;font-size:var(--font-size-caption,12px);font-weight:400;font-weight:var(--font-weight-2,normal);color:#999;color:var(--color-text1-2,#999);background:#fff}.next-time-picker2-menu ul{position:relative;overflow-y:hidden;overflow-x:auto;list-style:none;margin:0;width:54px;padding:0;font-size:12px;font-size:var(--font-size-caption,12px);height:224px;scrollbar-width:none;-ms-overflow-style:none}.next-time-picker2-menu ul::-webkit-scrollbar{width:0}.next-time-picker2-menu ul:hover{overflow-y:auto}.next-time-picker2-menu ul:after{display:block;height:192px;content:""}.next-time-picker2-menu-item{cursor:pointer;height:32px;line-height:32px;-webkit-transition:background .1s linear;transition:background .1s linear;color:#666;color:var(--color-text1-3,#666);background:#fff;outline:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.next-time-picker2-menu-item:hover{color:#333;color:var(--color-text1-4,#333);background:#f9f9f9;background:var(--color-fill1-2,#f9f9f9)}.next-time-picker2-menu-item.next-selected{color:#666;color:var(--color-text1-3,#666);background:#add9ff;background:var(--color-brand1-1,#add9ff)}.next-time-picker2-menu-item.next-disabled{cursor:not-allowed;color:#ccc;color:var(--color-text1-1,#ccc);background:#fafafa;background:var(--color-fill1-1,#fafafa)}.next-time-picker2-panel{display:-webkit-box;display:-ms-flexbox;display:flex}.next-time-picker2-panel,.next-time-picker2-panel *,.next-time-picker2-panel :after,.next-time-picker2-panel :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-time-picker2-panel:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-time-picker2-panel-header{border-bottom:1px solid #e6e6e6;border-bottom:var(--line-1,1px) var(--line-solid,solid) var(--popup-local-border-color,#e6e6e6)}.next-time-picker2-panel-input.next-input{width:100%;padding:6px;border-color:transparent;vertical-align:middle}.next-time-picker2-panel .next-time-picker2-menu{-webkit-box-flex:1;-ms-flex:1;flex:1}.next-time-picker2-panel-range .next-time-picker2-panel-list:last-of-type{margin-left:20px}.next-time-picker2-footer{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;border-top:1px solid #f0f0f0;padding:4px 12px;display:-webkit-box;display:-ms-flexbox;display:flex;min-height:40px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.next-time-picker2-footer-actions{margin-left:auto}.next-time-picker2-wrapper[dir=rtl] .next-time-picker2-menu{float:right}.next-time-picker2-wrapper[dir=rtl] .next-time-picker2-menu:not(:last-child){border-right:none;border-left:1px solid #e6e6e6;border-left:var(--line-1,1px) var(--line-solid,solid) var(--color-line1-2,#e6e6e6)}.next-time-picker2{display:inline-block}.next-time-picker2,.next-time-picker2 *,.next-time-picker2 :after,.next-time-picker2 :before{-webkit-box-sizing:border-box;box-sizing:border-box}.next-time-picker2-trigger .next-input{width:100%}.next-time-picker2-wrapper{padding:4px 0}.next-time-picker2-body{display:block;overflow:hidden;border:1px solid #e6e6e6;border:var(--popup-local-border-width,1px) var(--popup-local-border-style,solid) var(--popup-local-border-color,#e6e6e6);border-radius:3px;border-radius:var(--popup-local-corner,3px);background:#fff;-webkit-box-shadow:none;-webkit-box-shadow:var(--popup-local-shadow,none);box-shadow:none;box-shadow:var(--popup-local-shadow,none)}.next-time-picker2-symbol-clock-icon:before{content:"";content:var(--icon-content-clock,"\e621")}.next-time-picker2-input{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;outline:none;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ddd;border:var(--input-border-width,1px) solid var(--input-border-color,#ddd);vertical-align:middle;width:inherit}.next-time-picker2-input .next-input{border:none;width:100%;height:100%}.next-time-picker2-input .next-input input{height:100%}.next-time-picker2-input.next-time-picker2-input-small{height:24px;height:var(--form-element-small-height,24px);border-radius:3px;border-radius:var(--form-element-small-corner,3px)}.next-time-picker2-input.next-time-picker2-input-small .next-input-label{padding-left:8px;padding-left:var(--input-s-label-padding-left,8px);font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small .next-input-inner{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small .next-input-control,.next-time-picker2-input.next-time-picker2-input-small .next-input-inner-text{padding-right:4px;padding-right:var(--input-s-icon-padding-right,4px)}.next-time-picker2-input.next-time-picker2-input-small input{height:22px;height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2);line-height:22px \0 ;line-height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2) \0 ;padding:0 4px;padding:0 var(--input-s-padding,4px);font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small input::-webkit-input-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small input::-moz-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small input::-ms-input-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small input::placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-time-picker2-input.next-time-picker2-input-small .next-input-text-field{padding:0 4px;padding:0 var(--input-s-padding,4px);font-size:12px;font-size:var(--form-element-small-font-size,12px);height:22px;height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2);line-height:22px;line-height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2)}.next-time-picker2-input.next-time-picker2-input-small .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-small .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-small-corner,3px) var(--form-element-small-corner,3px) 0}.next-time-picker2-input.next-time-picker2-input-medium{height:32px;height:var(--form-element-medium-height,32px);border-radius:3px;border-radius:var(--form-element-medium-corner,3px)}.next-time-picker2-input.next-time-picker2-input-medium .next-input-label{padding-left:8px;padding-left:var(--input-m-label-padding-left,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium .next-input-inner{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium .next-input-control,.next-time-picker2-input.next-time-picker2-input-medium .next-input-inner-text{padding-right:8px;padding-right:var(--input-m-icon-padding-right,8px)}.next-time-picker2-input.next-time-picker2-input-medium input{height:30px;height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2);line-height:30px \0 ;line-height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2) \0 ;padding:0 8px;padding:0 var(--input-m-padding,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium input::-webkit-input-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium input::-moz-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium input::-ms-input-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium input::placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-time-picker2-input.next-time-picker2-input-medium .next-input-text-field{padding:0 8px;padding:0 var(--input-m-padding,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px);height:30px;height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2);line-height:30px;line-height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2)}.next-time-picker2-input.next-time-picker2-input-medium .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-medium .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-medium-corner,3px) var(--form-element-medium-corner,3px) 0}.next-time-picker2-input.next-time-picker2-input-large{height:40px;height:var(--form-element-large-height,40px);border-radius:3px;border-radius:var(--form-element-large-corner,3px)}.next-time-picker2-input.next-time-picker2-input-large .next-input-label{padding-left:12px;padding-left:var(--input-l-label-padding-left,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large .next-input-inner{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large .next-input-control,.next-time-picker2-input.next-time-picker2-input-large .next-input-inner-text{padding-right:8px;padding-right:var(--input-l-icon-padding-right,8px)}.next-time-picker2-input.next-time-picker2-input-large input{height:38px;height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2);line-height:38px \0 ;line-height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2) \0 ;padding:0 12px;padding:0 var(--input-l-padding,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large input::-webkit-input-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large input::-moz-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large input::-ms-input-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large input::placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-time-picker2-input.next-time-picker2-input-large .next-input-text-field{padding:0 12px;padding:0 var(--input-l-padding,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px);height:38px;height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2);line-height:38px;line-height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2)}.next-time-picker2-input.next-time-picker2-input-large .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-large .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-large-corner,3px) var(--form-element-large-corner,3px) 0}.next-time-picker2-input:hover{border-color:#ccc;border-color:var(--input-hover-border-color,#ccc);background-color:#fff;background-color:var(--input-hover-bg-color,#fff)}.next-time-picker2-input.next-time-picker2-input-focus{border-color:#209bfa;border-color:var(--input-focus-border-color,#209bfa);background-color:#fff;background-color:var(--input-focus-bg-color,#fff);-webkit-box-shadow:0 0 0 2px rgba(32,155,250,.2);box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-time-picker2-input.next-time-picker2-input-noborder{border-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.next-time-picker2-input.next-time-picker2-input-disabled{color:#ccc;color:var(--input-disabled-color,#ccc);cursor:not-allowed}.next-time-picker2-input.next-time-picker2-input-disabled,.next-time-picker2-input.next-time-picker2-input-disabled:hover{border-color:#eee;border-color:var(--input-disabled-border-color,#eee);background-color:#fafafa;background-color:var(--input-disabled-bg-color,#fafafa)}.next-time-picker2-input-separator{color:#ddd;color:var(--input-border-color,#ddd);font-size:12px;display:inline-block;min-width:16px;text-align:center}div[dir=rtl] .next-date-picker2-footer-preset>.next-btn{margin-left:8px;margin-right:0}div[dir=rtl] .next-date-picker2-footer-actions{margin-left:0;margin-right:auto}div[dir=rtl] .next-date-picker2-wrapper .next-calendar2-cell:last-child:before{border-top-right-radius:0;border-bottom-right-radius:0;right:0;border-top-left-radius:2px;border-bottom-left-radius:2px;left:8px}div[dir=rtl] .next-date-picker2-wrapper .next-calendar2-cell:first-child:before{border-top-left-radius:0;border-bottom-left-radius:0;left:0;border-top-right-radius:2px;border-bottom-right-radius:2px;right:8px}div[dir=rtl] .next-date-time-picker-wrapper{border-right:1px solid #eee;border-right:1px solid var(--color-line1-1,#eee);border-left:node}div[dir=rtl] .next-date-time-picker-wrapper .next-time-picker2-menu:not(:last-child){border-left:1px solid #dcdee3;border-right:none}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-selected.next-calendar2-cell-range-begin:before{right:50%;left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-selected.next-calendar2-cell-range-end:before{left:50%;right:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-begin:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-child:after{right:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-begin:not(:last-child):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-child:not(.next-calendar2-cell-hover-end):after{left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-end:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-child:after{left:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-end:not(:first-child):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-child:not(.next-calendar2-cell-hover-begin):after{right:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-begin:after{left:0;right:7px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-end:after{right:0;left:7px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-of-type:after{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none;border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7;border-right:1px dashed var(--color-brand1-9,#1274e7)}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-of-type:after{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none;border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7;border-left:1px dashed var(--color-brand1-9,#1274e7)}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end:before{right:0;left:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end.next-calendar2-cell-hover:after{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none;border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7;border-left:1px dashed var(--color-brand1-9,#1274e7)}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover-begin:after{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0;border-right:1px dashed #1274e7;border-right:1px dashed var(--color-brand1-9,#1274e7);border-top-right-radius:2px;border-bottom-right-radius:2px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover-end:after{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-left:1px dashed #1274e7;border-left:1px dashed var(--color-brand1-9,#1274e7);border-top-left-radius:2px;border-bottom-left-radius:2px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):before{right:8px;left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:after{right:8px;border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7;border-right:1px dashed var(--color-brand1-9,#1274e7)}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:not(.next-calendar2-cell-hover-end):not(.next-calendar2-cell-hover-begin):after{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none}div[dir=rtl] .next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2):before{right:50%;left:0}div[dir=rtl] .next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child:before{left:50%;right:0}.next-date-picker2{outline:none;display:inline-table;position:relative;width:inherit}.next-date-picker2-overlay{vertical-align:top;padding:4px 0}.next-date-picker2-overlay-range{padding:12px 0}.next-date-picker2-wrapper{-webkit-box-shadow:0 4px 16px 0 rgba(0,0,0,.12);box-shadow:0 4px 16px 0 rgba(0,0,0,.12);background-color:#fff;border:1px solid #eee;border:1px solid var(--color-line1-1,#eee);border-radius:3px;border-radius:var(--corner-1,3px)}.next-date-picker2-wrapper .next-calendar2-panel{border-radius:3px;border-radius:var(--corner-1,3px)}.next-date-picker2-wrapper .next-calendar2-body{width:272px}.next-date-picker2-wrapper .next-calendar2-cell:before{content:"";position:absolute;top:50%;right:0;left:0;z-index:1;height:24px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.next-date-picker2-wrapper .next-calendar2-cell:last-child:before{border-top-right-radius:2px;border-bottom-right-radius:2px;right:8px}.next-date-picker2-wrapper .next-calendar2-cell:first-child:before{border-top-left-radius:2px;border-bottom-left-radius:2px;left:8px}.next-date-picker2-input{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;outline:none;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ddd;border:var(--input-border-width,1px) solid var(--input-border-color,#ddd);vertical-align:middle;width:inherit;background-color:#fff;background-color:var(--input-bg-color,#fff)}.next-date-picker2-input .next-input{border:none;-ms-flex-preferred-size:100%;flex-basis:100%;height:100%;width:100%}.next-date-picker2-input .next-input input{height:100%;width:auto}.next-date-picker2-input.next-date-picker2-input-small{height:24px;height:var(--form-element-small-height,24px);border-radius:3px;border-radius:var(--form-element-small-corner,3px)}.next-date-picker2-input.next-date-picker2-input-small .next-input-label{padding-left:8px;padding-left:var(--input-s-label-padding-left,8px);font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small .next-input-inner{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small .next-input-control,.next-date-picker2-input.next-date-picker2-input-small .next-input-inner-text{padding-right:4px;padding-right:var(--input-s-icon-padding-right,4px)}.next-date-picker2-input.next-date-picker2-input-small input{height:22px;height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2);line-height:22px \0 ;line-height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2) \0 ;padding:0 4px;padding:0 var(--input-s-padding,4px);font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small input::-webkit-input-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small input::-moz-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small input::-ms-input-placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small input::placeholder{font-size:12px;font-size:var(--form-element-small-font-size,12px)}.next-date-picker2-input.next-date-picker2-input-small .next-input-text-field{padding:0 4px;padding:0 var(--input-s-padding,4px);font-size:12px;font-size:var(--form-element-small-font-size,12px);height:22px;height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2);line-height:22px;line-height:calc(var(--form-element-small-height, 24px) - var(--input-border-width, 1px)*2)}.next-date-picker2-input.next-date-picker2-input-small .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-small .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-small-corner,3px) var(--form-element-small-corner,3px) 0}.next-date-picker2-input.next-date-picker2-input-medium{height:32px;height:var(--form-element-medium-height,32px);border-radius:3px;border-radius:var(--form-element-medium-corner,3px)}.next-date-picker2-input.next-date-picker2-input-medium .next-input-label{padding-left:8px;padding-left:var(--input-m-label-padding-left,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium .next-input-inner{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium .next-input-control,.next-date-picker2-input.next-date-picker2-input-medium .next-input-inner-text{padding-right:8px;padding-right:var(--input-m-icon-padding-right,8px)}.next-date-picker2-input.next-date-picker2-input-medium input{height:30px;height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2);line-height:30px \0 ;line-height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2) \0 ;padding:0 8px;padding:0 var(--input-m-padding,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium input::-webkit-input-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium input::-moz-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium input::-ms-input-placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium input::placeholder{font-size:14px;font-size:var(--form-element-medium-font-size,14px)}.next-date-picker2-input.next-date-picker2-input-medium .next-input-text-field{padding:0 8px;padding:0 var(--input-m-padding,8px);font-size:14px;font-size:var(--form-element-medium-font-size,14px);height:30px;height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2);line-height:30px;line-height:calc(var(--form-element-medium-height, 32px) - var(--input-border-width, 1px)*2)}.next-date-picker2-input.next-date-picker2-input-medium .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-medium .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-medium-corner,3px) var(--form-element-medium-corner,3px) 0}.next-date-picker2-input.next-date-picker2-input-large{height:40px;height:var(--form-element-large-height,40px);border-radius:3px;border-radius:var(--form-element-large-corner,3px)}.next-date-picker2-input.next-date-picker2-input-large .next-input-label{padding-left:12px;padding-left:var(--input-l-label-padding-left,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large .next-input-inner{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large .next-input-control,.next-date-picker2-input.next-date-picker2-input-large .next-input-inner-text{padding-right:8px;padding-right:var(--input-l-icon-padding-right,8px)}.next-date-picker2-input.next-date-picker2-input-large input{height:38px;height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2);line-height:38px \0 ;line-height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2) \0 ;padding:0 12px;padding:0 var(--input-l-padding,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large input::-webkit-input-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large input::-moz-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large input::-ms-input-placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large input::placeholder{font-size:16px;font-size:var(--form-element-large-font-size,16px)}.next-date-picker2-input.next-date-picker2-input-large .next-input-text-field{padding:0 12px;padding:0 var(--input-l-padding,12px);font-size:16px;font-size:var(--form-element-large-font-size,16px);height:38px;height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2);line-height:38px;line-height:calc(var(--form-element-large-height, 40px) - var(--input-border-width, 1px)*2)}.next-date-picker2-input.next-date-picker2-input-large .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-large .next-input-control{border-radius:0 3px 3px 0;border-radius:0 var(--form-element-large-corner,3px) var(--form-element-large-corner,3px) 0}.next-date-picker2-input:hover{border-color:#ccc;border-color:var(--input-hover-border-color,#ccc);background-color:#fff;background-color:var(--input-hover-bg-color,#fff)}.next-date-picker2-input.next-date-picker2-input-focus{border-color:#209bfa;border-color:var(--input-focus-border-color,#209bfa);background-color:#fff;background-color:var(--input-focus-bg-color,#fff);-webkit-box-shadow:0 0 0 2px rgba(32,155,250,.2);box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-date-picker2-input.next-date-picker2-input-noborder{border-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.next-date-picker2-input.next-date-picker2-input-disabled{color:#ccc;color:var(--input-disabled-color,#ccc);cursor:not-allowed}.next-date-picker2-input.next-date-picker2-input-disabled,.next-date-picker2-input.next-date-picker2-input-disabled:hover{border-color:#eee;border-color:var(--input-disabled-border-color,#eee);background-color:#fafafa;background-color:var(--input-disabled-bg-color,#fafafa)}.next-date-picker2-input-separator{color:#ddd;color:var(--input-border-color,#ddd);font-size:12px;line-height:12px;display:inline-block;min-width:16px;text-align:center}.next-date-picker2-panel,.next-range-picker2-panel{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-range-picker-left .next-calendar2-header-right-btn,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-range-picker-right .next-calendar2-header-left-btn{visibility:hidden}.next-range-picker2-arrow{display:block;-webkit-transform:translateY(-50%) rotate(-45deg);-ms-transform:translateY(-50%) rotate(-45deg);transform:translateY(-50%) rotate(-45deg);position:absolute;z-index:1;width:10px;height:10px;margin-left:16.5px;border-color:#eee #eee transparent transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;border-right:1px solid var(--color-line1-1,#eee);border-top:1px solid var(--color-line1-1,#eee);-webkit-transition:left .3s ease-out;transition:left .3s ease-out;background:#fff}.next-date-picker2-tl-bl .next-range-picker2-arrow{top:12.5px}.next-date-picker2-bl-tl .next-range-picker2-arrow{bottom:13px;-webkit-transform:translateY(50%) rotate(135deg);-ms-transform:translateY(50%) rotate(135deg);transform:translateY(50%) rotate(135deg)}.next-date-time-picker-wrapper{border-left:1px solid #eee;border-left:1px solid var(--color-line1-1,#eee)}.next-date-time-picker-wrapper .next-calendar2-body{padding-right:0;padding-left:0}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-disabled .next-calendar2-cell-inner{color:#ccc;color:var(--color-text1-1,#ccc);background:#fafafa;background:var(--color-fill1-1,#fafafa)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected:before{color:#666;color:var(--color-text1-3,#666);background:#add9ff;background:var(--color-brand1-1,#add9ff)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected .next-calendar2-cell-inner{color:#666;color:var(--color-text1-3,#666);background:transparent}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin .next-calendar2-cell-inner,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end .next-calendar2-cell-inner{z-index:10;color:#fff;background:#209bfa;background:var(--color-brand1-6,#209bfa)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin:before{left:50%}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end:before{right:50%}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin-single:before,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end-single:before{display:none}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:after{content:"";position:absolute;top:50%;right:0;left:0;z-index:2;height:24px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);border-color:#1274e7 transparent;border-left:1px dashed transparent;border-bottom:1px dashed var(--color-brand1-9,#1274e7);border-right:1px dashed transparent;border-top:1px dashed var(--color-brand1-9,#1274e7)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-hover-begin:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:first-child:after{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-hover-end:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:last-child:after{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-begin:after{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-end:after{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:first-of-type:after{border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7;border-left:1px dashed var(--color-brand1-9,#1274e7)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:last-of-type:after{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7;border-right:1px dashed var(--color-brand1-9,#1274e7)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end:before{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end.next-calendar2-cell-hover:after{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7;border-right:1px dashed var(--color-brand1-9,#1274e7)}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover-begin:after{border-top:1px dashed #1274e7;border-top:1px dashed var(--color-brand1-9,#1274e7);border-left:1px dashed #1274e7;border-left:1px dashed var(--color-brand1-9,#1274e7);border-top-left-radius:2px;border-bottom-left-radius:2px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover-end:after{border-top:1px dashed #1274e7;border-top:1px dashed var(--color-brand1-9,#1274e7);border-right:1px dashed #1274e7;border-right:1px dashed var(--color-brand1-9,#1274e7);border-top-right-radius:2px;border-bottom-right-radius:2px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):before{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:after{border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7;border-left:1px dashed var(--color-brand1-9,#1274e7)}.next-calendar2-table-week .next-calendar2-cell-hover:after{display:none}.next-calendar2-table-week tr:hover .next-calendar2-cell:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):before{background:#f9f9f9;background:var(--color-fill1-2,#f9f9f9)}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected .next-calendar2-cell-inner,.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:before{color:#666;color:var(--color-text1-3,#666);background-color:#add9ff;background-color:var(--color-brand1-1,#add9ff)}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child .next-calendar2-cell-inner,.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2) .next-calendar2-cell-inner{color:#fff;background:#209bfa;background:var(--color-brand1-6,#209bfa)}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2):before{left:50%}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child:before{right:50%}.next-calendar2-table-week tr:not(.next-calendar2-week-current) td.next-calendar2-cell.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-table-week tr:not(.next-calendar2-week-current) td.next-calendar2-cell.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):before{background-color:transparent;color:#ccc;color:var(--color-text1-1,#ccc)}.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):nth-child(2) .next-calendar2-cell-inner{background-color:#add9ff;background-color:var(--color-brand1-1,#add9ff);color:#666;color:var(--color-text1-3,#666)}.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-begin:last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-begin:nth-child(2) .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-end:last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-end:nth-child(2) .next-calendar2-cell-inner{color:#fff;background:#209bfa;background:var(--color-brand1-6,#209bfa)}.next-icon-ic_yusuanguanli:before{content:"";content:var(--icon-content-ic_yusuanguanli,"\e745")}.next-icon-ic_formbeifen:before{content:"";content:var(--icon-content-ic_formbeifen,"\e7e0")}.next-icon-ic_form:before{content:"";content:var(--icon-content-ic_form,"\e7e1")}.next-icon-ic_dashboard:before{content:"";content:var(--icon-content-ic_dashboard,"\e7e2")}.next-icon-ic_tongzhi:before{content:"";content:var(--icon-content-ic_tongzhi,"\e749")}.next-icon-ic_logo:before{content:"";content:var(--icon-content-ic_logo,"\e79d")}.next-icon-taobao:before{content:"";content:var(--icon-content-taobao,"\e7be")}.next-icon-alibaba:before{content:"";content:var(--icon-content-alibaba,"\e7bf")}.next-icon-ic_language:before{content:"";content:var(--icon-content-ic_language,"\e7da")} \ No newline at end of file + */:global(#root),body,html{height:100%}:global(.mainwrapper){position:absolute!important;top:0;bottom:0;left:0;right:0}:global(.sideleft){float:left;background-color:#eaedf1;position:absolute;top:0;bottom:0;z-index:2;overflow:hidden;width:180px}:global(.sideleft .toptitle){width:100%;height:70px;line-height:70px;background:#d9dee4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700;text-indent:20px}:global(.maincontainer){position:absolute;width:auto;top:0;bottom:0;left:180px;right:0;overflow:hidden;overflow-y:auto;-o-transition:all .2s ease;-ms-transition:all .2s ease;-moz-transition:all .2s ease;-webkit-transition:all .2s ease}:global(.viewFramework-product-navbar .product-nav-list li .active){background-color:#fff!important}.next-menu .next-menu-icon-arrow-down{transform:rotate(0deg)!important}li.next-menu-item:not(.next-disabled).next-selected:focus:hover,li.next-menu-item:not(.next-disabled).next-selected:hover,li.next-menu-item:not(.next-disabled):hover{background:#e4f3fe;background:var(--nav-normal-sub-nav-hover-bg-color,#e4f3fe);color:#209bfa;color:var(--nav-normal-sub-nav-hover-text-color,#209bfa)}.next-menu.next-normal .next-menu-item.next-selected{background:#e4f3fe!important;background:var(--nav-normal-sub-nav-selected-bg-color,#e4f3fe)!important;color:#209bfa!important;color:var(--nav-normal-sub-nav-selected-text-color,#209bfa)!important}.clearfix:after{content:".";clear:both;display:block;height:0;overflow:hidden;visibility:hidden}.clearfix{zoom:1}.copy-icon{cursor:pointer;margin-left:4px;color:var(--color-link-1,#298dff)}.layouttitle{height:40px;width:200px;background-color:#09c;color:#fff;line-height:40px;text-align:center;margin:0;padding:0;font-weight:700}.linknav{height:30px;line-height:30px;text-align:center}.righttitle{height:40px;background-color:#000;width:100%;font-weight:700}.product-nav-icon{padding:15px 0 0;height:70px;margin:0}.envcontainer{padding-left:15px;margin-right:auto;margin-left:auto;max-height:450px;overflow:scroll;margin-bottom:100px;display:none;top:50px;left:230px;position:fixed;z-index:99999;width:435px;height:auto;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.envtop{height:50px;line-height:50px;position:fixed;top:0;left:320px;z-index:999;background-color:transparent;-webkit-font-smoothing:antialiased}.envcontainer-top{padding-left:15px;margin-right:auto;margin-left:auto;max-height:450px;overflow:auto;margin-bottom:100px;display:none;top:50px;left:0;position:absolute;z-index:99999;width:435px;height:auto;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.envcontainer-top .row{margin:0!important}.envcontainer-top .active{background-color:#546478}.envcontainer dl dd.active{background-color:#546478;color:#fff}.current-env{display:block;padding:0;font-size:14px;margin:0 0 5px;text-align:center}.current-env a{color:#666;text-decoration:none}.product-nav-title{height:70px;line-height:70px;margin:0;text-align:center;padding:0;font-size:14px;background:#d9dee4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.console-title{padding:16px 0}.topbar-nav-item-title{margin:0 0 10px 31px;color:#666;font-weight:700}.dl{height:100%;width:125px;overflow:auto;margin:0 15px 15px 0}.dd{height:24px;line-height:24px;overflow-x:hidden;padding-left:12px;margin-left:20px}.active{color:#fff}.dd:hover{cursor:pointer;opacity:.7;filter:70}.cm-s-xq-light span.cm-keyword{line-height:1em;font-weight:700;color:#5a5cad}.cm-s-xq-light span.cm-atom{color:#6c8cd5}.cm-s-xq-light span.cm-number{color:#164}.cm-s-xq-light span.cm-def{text-decoration:underline}.cm-s-xq-light span.cm-type,.cm-s-xq-light span.cm-variable,.cm-s-xq-light span.cm-variable-2,.cm-s-xq-light span.cm-variable-3{color:#000}.cm-s-xq-light span.cm-comment{color:#0080ff;font-style:italic}.cm-s-xq-light span.cm-string{color:red}.cm-s-xq-light span.cm-meta{color:#ff0}.cm-s-xq-light span.cm-qualifier{color:grey}.cm-s-xq-light span.cm-builtin{color:#7ea656}.cm-s-xq-light span.cm-bracket{color:#cc7}.cm-s-xq-light span.cm-tag{color:#3f7f7f}.cm-s-xq-light span.cm-attribute{color:#7f007f}.cm-s-xq-light span.cm-error{color:red}.cm-s-xq-light .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-xq-light .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important;background:#ff0}.CodeMirror{border:1px solid #eee}.CodeMirror-fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:auto;z-index:9999}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:infobackground;border:1px solid #000;border-radius:4px 4px 4px 4px;color:infotext;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:0 100%;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")}.CodeMirror-lint-mark-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:50%;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:0 0;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=")}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-multiple{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:100% 100%;width:100%;height:100%}@media(min-width:992px){.modal-lg{width:980px}}@media(min-width:768px)and (max-width:992px){.modal-lg{width:750px}}.modal-body table.narrow-table td{padding:8px 0}.add-on.form-control{margin-left:-4px;box-shadow:none;font-size:28px;line-height:32px;padding:0;vertical-align:top}.text-break{word-wrap:break-word;word-break:break-all;white-space:normal}.form-inline{margin-bottom:20px}.console-title{min-height:70px}.form-horizontal .form-group .checkbox{margin-left:0;margin-right:10px}.combox_border,.combox_select{border:1px solid #c2c2c2;width:245px}.combox_border{height:auto;display:inline-block;position:relative}.combox_input{border:0;padding-left:5px;width:85%;vertical-align:middle}.form-inline .combox_input.form-control{width:85%}.combox_button{width:12%;color:#666;text-align:center;vertical-align:middle;cursor:pointer;border-left:1px solid #c2c2c2}ul.combox_select{border-top:0;padding:0;position:absolute;left:-1px;top:20px;display:none;background:#fff;max-height:300px;overflow-y:auto}ul.combox_select li{overflow:hidden;height:30px;line-height:30px;cursor:pointer}ul.combox_select li a{display:block;line-height:28px;padding:0 8px;text-decoration:none;color:#666}ul.combox_select li a:hover{text-decoration:none;background:#f5f5f5}#combox-appanme.combox_border,#combox-appanme .combox_select{width:158px}#combox-appanme .form-control{height:30px}input.error,textarea.error{border:1px solid red}.form-inline .form-group{position:relative}label.error{margin:4px 0;color:red;font-weight:400;position:absolute;right:15px;bottom:-26px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}form.vertical-margin-lg .form-group{margin-bottom:22px}.namespacewrapper{padding:5px 15px;overflow:hidden;background-color:#efefef}.xrange-container{position:relative;border:1px solid #ccc;margin:0;padding:0}.xrange-container .cocofont,.xrange-container .iconfont{cursor:pointer}.xrange-container .label{display:flex;align-items:center;text-align:center;justify-content:space-between;cursor:pointer}.xrange-container .label.is-button{display:flex;border:1px solid #e6ebef;height:32px;padding:6px 12px;background-color:#f5f5f6}.xrange-container .label.is-button>i{font-size:13px}.xrange-container .label.is-empty{padding:0}.xrange-container .label.is-empty.is-button{padding:6px 12px}.xrange-container .label.is-empty>i{font-size:15px;margin-right:0}.xrange-container .label.is-empty>span,.xrange-container .label.is-empty b{display:none}.xrange-container .label>i{font-size:13px;text-align:center}.xrange-container .label>b{padding-top:3px}.xrange-container .label>span{min-width:100px;display:inline-flex;margin-bottom:8px}.xrange-layer{position:fixed;left:0;top:0;width:100%;height:100%;z-index:990;background-color:rgba(0,0,0,.05)}.xrange-panel{display:none;position:relative;right:1px;top:-8px;z-index:1000;border:1px solid #e6e7eb;border-radius:0;box-shadow:1px 1px 3px 0 transparent;width:111px;min-height:302px;background-color:#fff}.xrange-panel.visible{display:block}.xrange-panel .quick-list{display:flex;flex-direction:column;justify-content:space-around;box-sizing:content-box!important;align-items:center}.xrange-panel .quick-list>span{flex:0 0 auto;width:100%;line-height:20px;padding:6px 0 6px 27px;font-size:12px;-webkit-user-select:none;cursor:pointer}.xrange-panel .quick-list>span+span{margin-left:0}.xrange-panel .quick-list>span.active{background-color:#f2f3f7;color:#333;cursor:default}.xrange-panel .xrange-panel-footer{display:flex;align-items:center;justify-content:space-between;height:60px;background-color:#fff;position:absolute;top:300px;left:-539px;min-width:648px;padding:12px 108px 12px 12px}.xrange-panel .xrange-panel-footer .fn-left,.xrange-panel .xrange-panel-footer .fn-right{flex:0 0 auto}.xrange-panel .xrange-panel-footer button+button{margin-left:8px}.xrange-panel .picker-container{display:none;position:relative;margin-top:16px}.xrange-panel .picker-container .next-range-picker-panel{top:-273px!important;left:-540px!important;position:absolute!important;animation:none!important;z-index:999999;border-color:#e6ebef}.next-calendar-card .next-calendar-range-body{background:#fff!important;min-height:227px!important}.xrange-panel .picker-container+.next-range-picker{display:none}.xrange-panel .picker-container .next-date-picker-quick-tool{display:none!important}.xrange-panel.show-picker .picker-container{display:block;min-height:5px}.dingding{background:url(https://g.alicdn.com/cm-design/arms/1.1.27/styles/arms/images/dingding.png) no-repeat 0}.dingding,.wangwang{display:inline-block;padding:5px 0 5px 30px;height:24px;vertical-align:middle}.wangwang{background:url(https://g.alicdn.com/cm-design/arms/1.1.27/styles/arms/images/wangwang.png) no-repeat 0;background-size:24px}@media screen and (min-width:768px){.region-group-list{max-width:784px}}@media screen and (min-width:992px){.region-group-list{max-width:862px}}@media screen and (min-width:1200px){.region-group-list{max-width:600px}}@media screen and (min-width:1330px){.region-group-list{max-width:700px}}@media screen and (min-width:1500px){.region-group-list{max-width:1000px}}.next-switch-medium{border:1px solid transparent;width:48px!important;height:26px!important;border-radius:15px!important}.next-switch-medium>.next-switch-trigger{border:1px solid transparent;position:absolute;left:33px!important;width:24px!important;height:24px!important;border-radius:15px!important}.aliyun-advice{bottom:98px!important}.next-switch-medium>.next-switch-children{font-size:12px!important;position:absolute;height:24px!important;line-height:24px!important}.next-switch-on>.next-switch-trigger{box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#fff;border-color:transparent;position:absolute;right:0!important}.next-switch-on>.next-switch-children{left:2px!important;font-size:12px!important}.next-switch-on[disabled]>.next-switch-trigger{position:absolute;right:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#e6e7eb;border-color:transparent}.next-switch-off>.next-switch-children{right:-6px;color:#979a9c!important}.next-switch-off[disabled]>.next-switch-trigger{left:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32)!important;background-color:#e6e7eb;border-color:transparent}.next-switch-off>.next-switch-trigger{left:0!important;box-shadow:1px 1px 3px 0 rgba(0,0,0,.32);background-color:#fff;border-color:transparent}.next-switch-off,.next-switch-on{width:58px!important}.next-switch-on{position:relative}.next-menu .next-menu-icon-select{position:absolute;left:4px;top:0;color:#73777a!important}.next-table-cell-wrapper{hyphens:auto!important;word-break:break-word!important}.dash-page-container{height:100%;min-width:980px}.dash-page-container:after{content:"";display:table;clear:both}.dash-left-container{position:relative;float:left;width:77.52%;height:100%}.dash-title-show{width:100%;height:106px;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:19px;padding-top:20px;padding-bottom:20px;overflow:hidden}.dash-title-item{float:left;height:49px;width:33%;border-right:1px solid #ebecec;line-height:49px;padding-left:30px;padding-right:30px}.dash-title-word{height:19px;line-height:19px;font-size:14px;color:#73777a}.dash-title-num{height:45px;font-size:32px}.dash-title-item:last-child{border:none!important}.dash-menu-list{width:100%;height:104px;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:19px}.dash-menu-item{position:relative;float:left;width:33.33%;border-right:1px solid #eee;height:100%;padding-top:20px;padding-bottom:20px;cursor:pointer}.dash-menu-item.disabled{cursor:not-allowed;opacity:.7}.dash-menu-item:last-child{border:none}.dash-menu-item:hover{box-shadow:0 3px 6px 0 rgba(0,0,0,.12)}.dash-menu-conent-wrapper{padding-left:60px;padding-right:40px}.dash-menu-pic{position:absolute;width:32px;left:20px}.dash-menu-content-title{height:19px;line-height:19px;color:#373d41;margin-bottom:5px}.dash-menu-content-word{font-size:12px;color:#73777a}.dash-scene-wrapper{width:100%;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12);margin-bottom:20px}.dash-scene-title{position:relative;padding-left:20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0}.dash-sceneitem{width:100%;height:80px;padding-top:24px}.dash-scenitem-out{border-bottom:1px solid #eee;height:100%}.dash-sceneitem:hover{box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 4px 0 rgba(0,0,0,.12);border-bottom:1px solid #f0f0f0}.dash-sceneitem-progresswrapper{position:relative;width:256px;height:6px}.dash-sceneitem-progresswrapper.green{background-color:#e2f5cf}.dash-sceneitem-progresswrapper.red{background-color:#ffe6e5}.dash-sceneitem-progresswrapper.green .dash-sceneitem-progressinner{height:100%;background-color:#a6e22e}.dash-sceneitem-progresswrapper.red .dash-sceneitem-progressinner{height:100%;background-color:#eb4c4d}.dash-sceneitem-iconshow{position:absolute;right:0;top:5px}.dash-sceneitem:hover.dash-sceneitem-out{border:none}.dash-sceneitem:after{display:table;content:"";clear:both}.dash-sceneitem-title{float:left;height:32.8px;padding-top:5px;width:14.47%;border-right:1px solid #f0f0f0;overflow:hidden;text-overflow:ellipsis}.scene-nomore-data{position:absolute;text-align:center;left:0;right:0;color:#eee;font-size:12px}.dash-sceneitem-content{position:relative;float:left;padding-top:5px;padding-left:30px;width:85.53%}.scene-title-link{position:absolute;right:20px;top:0;font-size:10px}.dash-bottom-show{width:100%;height:42px;line-height:42px;margin-top:18px;text-align:center;background-color:#fff;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12)}.dash-right-container{float:right;height:100%;width:22.44%;padding:10px;background-color:#fff}.dash-bottom-item,.dash-vl{color:#979a9c;margin-right:10px}.dash-doc{background-color:#fff;height:178px;width:100%;margin-bottom:14px}.dash-doc-title{width:100%;height:68px;line-height:68px;padding-left:20px;padding-right:20px;border-bottom:1px solid #eee}.dash-doc-content{width:100%;padding:15px}.dash-card-contentwrappers{width:100%;height:230px;margin-bottom:14px;background-color:#fff;border:1px solid #eee;box-shadow:0 0 0 0 hsla(0,0%,85.1%,.5),0 0 2px 0 rgba(0,0,0,.12)}.dash-card-title{width:100%;height:39px;line-height:39px;margin:0;padding-left:24px;padding-right:24px;color:#4a4a4a;border-bottom:1px solid #eee}.dash-card-contentlist{padding:20px}.dash-card-contentitem{position:relative;text-align:left;font-size:12px;margin-bottom:10px}.next-slick-dots-item button{height:4px!important;width:35px!important;border-radius:10px!important}.next-table-row.hovered{background-color:#f5f7f9!important}.alert-success-text{color:#4a4a4a;font-size:14px;margin:10px 0}.alert-success{border-color:#e0e0e0!important}.row-bg-green{background-color:#e4fdda}.row-bg-light-green{background-color:#e3fff8}.row-bg-orange{background-color:#fff3e0}.row-bg-red{background-color:#ffece4}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}*,:after,:before{box-sizing:border-box}ol,ul{list-style:none;margin:0;padding:0}li{margin-left:0}hr{border:solid #e6e6e6;border-width:1px 0 0}a{text-decoration:none}a:link{color:#298dff}a:visited{color:#4a83c5}a:active,a:hover{color:#2580e7}a:active{text-decoration:underline}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-thin.eot);src:url(../console-ui/public/fonts/roboto-thin.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-thin.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-thin.woff) format("woff"),url(../console-ui/public/fonts/roboto-thin.ttf) format("truetype");font-weight:200;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-light.eot);src:url(../console-ui/public/fonts/roboto-light.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-light.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-light.woff) format("woff"),url(../console-ui/public/fonts/roboto-light.ttf) format("truetype");font-weight:300;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-regular.eot);src:url(../console-ui/public/fonts/roboto-regular.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-regular.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-regular.woff) format("woff"),url(../console-ui/public/fonts/roboto-regular.ttf) format("truetype");font-weight:400;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-medium.eot);src:url(../console-ui/public/fonts/roboto-medium.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-medium.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-medium.woff) format("woff"),url(../console-ui/public/fonts/roboto-medium.ttf) format("truetype");font-weight:500;font-display:swap}@font-face{font-family:Roboto;src:url(../console-ui/public/fonts/roboto-bold.eot);src:url(../console-ui/public/fonts/roboto-bold.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/roboto-bold.woff2) format("woff2"),url(../console-ui/public/fonts/roboto-bold.woff) format("woff"),url(../console-ui/public/fonts/roboto-bold.ttf) format("truetype");font-weight:700;font-display:swap}html{font-size:100%}body{font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142;color:#333}button,input,optgroup,select,textarea{font-family:inherit}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{margin-bottom:12px;font-size:24px;line-height:36px}h1,h2{font-weight:500}h2{margin-bottom:10px;font-size:20px;line-height:30px}h3,h4{margin-bottom:8px;font-size:16px}h3,h4,h5{font-weight:400;line-height:24px}h5{margin-bottom:7px;font-size:14px}h6{font-weight:500}h6,p{margin-bottom:7px;font-size:14px;line-height:20px}p{font-weight:400}strong{font-weight:500}small{font-size:75%}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-ms-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-o-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-100px);-moz-transform:translateY(-100px);-ms-transform:translateY(-100px);-o-transform:translateY(-100px);transform:translateY(-100px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDownSmall{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(24px);-moz-transform:translateY(24px);-ms-transform:translateY(24px);-o-transform:translateY(24px);transform:translateY(24px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-ms-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-o-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-moz-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-ms-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-o-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(20px);-moz-transform:translateY(20px);-ms-transform:translateY(20px);-o-transform:translateY(20px);transform:translateY(20px)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-moz-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-ms-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-o-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-ms-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-moz-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-ms-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-o-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);-o-transform:translateX(20px);transform:translateX(20px)}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-moz-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-ms-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-o-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-24px);-moz-transform:translateY(-24px);-ms-transform:translateY(-24px);-o-transform:translateY(-24px);transform:translateY(-24px)}}@-webkit-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-moz-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-ms-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-o-keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@keyframes fadeOutUpSmall{0%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);-ms-transform:translateY(-8px);-o-transform:translateY(-8px);transform:translateY(-8px)}}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-moz-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-ms-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-o-keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(2000px);-moz-transform:translateY(2000px);-ms-transform:translateY(2000px);-o-transform:translateY(2000px);transform:translateY(2000px)}}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-moz-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-ms-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-o-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(-2000px);-moz-transform:translateX(-2000px);-ms-transform:translateX(-2000px);-o-transform:translateX(-2000px);transform:translateX(-2000px)}}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-moz-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-ms-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-o-keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}to{opacity:0;-webkit-transform:translateX(2000px);-moz-transform:translateX(2000px);-ms-transform:translateX(2000px);-o-transform:translateX(2000px);transform:translateX(2000px)}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-moz-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-ms-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-o-keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}to{opacity:0;-webkit-transform:translateY(-2000px);-moz-transform:translateY(-2000px);-ms-transform:translateY(-2000px);-o-transform:translateY(-2000px);transform:translateY(-2000px)}}@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{opacity:0;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-moz-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-ms-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-o-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-moz-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-ms-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-o-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-moz-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);-o-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@-webkit-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes zoomInBig{0%{opacity:0;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9)}to{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-moz-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-ms-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-o-keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@keyframes zoomOutBig{0%{opacity:1}to{opacity:0;-webkit-transform:scale(.8);-moz-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-moz-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-ms-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-o-keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandInDown{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-moz-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-ms-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-o-keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandInUp{0%{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-moz-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-ms-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-o-keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@keyframes expandInWithFade{0%{opacity:0}40%{opacity:.1}50%{opacity:.9}to{opacity:1}}@-webkit-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-moz-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-ms-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-o-keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@keyframes expandOutUp{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left top 0;-moz-transform-origin:left top 0;-ms-transform-origin:left top 0;-o-transform-origin:left top 0;transform-origin:left top 0}}@-webkit-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-moz-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-ms-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-o-keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@keyframes expandOutDown{0%{opacity:1;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-ms-transform:scaleY(1);-o-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}to{opacity:0;-webkit-transform:scaleY(.6);-moz-transform:scaleY(.6);-ms-transform:scaleY(.6);-o-transform:scaleY(.6);transform:scaleY(.6);-webkit-transform-origin:left bottom 0;-moz-transform-origin:left bottom 0;-ms-transform-origin:left bottom 0;-o-transform-origin:left bottom 0;transform-origin:left bottom 0}}@-webkit-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-moz-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-ms-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-o-keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@keyframes expandOutWithFade{0%{opacity:1}70%{opacity:0}to{opacity:0}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}20%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}to{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.fadeIn{-webkit-animation-name:fadeIn;-moz-animation-name:fadeIn;-ms-animation-name:fadeIn;-o-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInDown{-webkit-animation-name:fadeInDown;-moz-animation-name:fadeInDown;-ms-animation-name:fadeInDown;-o-animation-name:fadeInDown;animation-name:fadeInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInDown,.fadeInLeft{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInLeft{-webkit-animation-name:fadeInLeft;-moz-animation-name:fadeInLeft;-ms-animation-name:fadeInLeft;-o-animation-name:fadeInLeft;animation-name:fadeInLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInRight{-webkit-animation-name:fadeInRight;-moz-animation-name:fadeInRight;-ms-animation-name:fadeInRight;-o-animation-name:fadeInRight;animation-name:fadeInRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInRight,.fadeInUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeInUp{-webkit-animation-name:fadeInUp;-moz-animation-name:fadeInUp;-ms-animation-name:fadeInUp;-o-animation-name:fadeInUp;animation-name:fadeInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOut{-webkit-animation-name:fadeOut;-moz-animation-name:fadeOut;-ms-animation-name:fadeOut;-o-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOut,.fadeOutDown{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutDown{-webkit-animation-name:fadeOutDown;-moz-animation-name:fadeOutDown;-ms-animation-name:fadeOutDown;-o-animation-name:fadeOutDown;animation-name:fadeOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;-moz-animation-name:fadeOutLeft;-ms-animation-name:fadeOutLeft;-o-animation-name:fadeOutLeft;animation-name:fadeOutLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOutLeft,.fadeOutRight{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutRight{-webkit-animation-name:fadeOutRight;-moz-animation-name:fadeOutRight;-ms-animation-name:fadeOutRight;-o-animation-name:fadeOutRight;animation-name:fadeOutRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeOutUp{-webkit-animation-name:fadeOutUp;-moz-animation-name:fadeOutUp;-ms-animation-name:fadeOutUp;-o-animation-name:fadeOutUp;animation-name:fadeOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInUp{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;-ms-animation-name:slideInUp;-o-animation-name:slideInUp;animation-name:slideInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideInDown,.slideInUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInDown{-webkit-animation-name:slideInDown;-moz-animation-name:slideInDown;-ms-animation-name:slideInDown;-o-animation-name:slideInDown;animation-name:slideInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft{-webkit-animation-name:slideInLeft;-moz-animation-name:slideInLeft;-ms-animation-name:slideInLeft;-o-animation-name:slideInLeft;animation-name:slideInLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideInLeft,.slideInRight{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideInRight{-webkit-animation-name:slideInRight;-moz-animation-name:slideInRight;-ms-animation-name:slideInRight;-o-animation-name:slideInRight;animation-name:slideInRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.35s;-moz-animation-duration:.35s;-ms-animation-duration:.35s;-o-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutUp{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;-ms-animation-name:slideOutUp;-o-animation-name:slideOutUp;animation-name:slideOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutRight,.slideOutUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutRight{-webkit-animation-name:slideOutRight;-moz-animation-name:slideOutRight;-ms-animation-name:slideOutRight;-o-animation-name:slideOutRight;animation-name:slideOutRight;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutLeft{-webkit-animation-name:slideOutLeft;-moz-animation-name:slideOutLeft;-ms-animation-name:slideOutLeft;-o-animation-name:slideOutLeft;animation-name:slideOutLeft;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.slideOutDown,.slideOutLeft{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.slideOutDown{-webkit-animation-name:slideOutDown;-moz-animation-name:slideOutDown;-ms-animation-name:slideOutDown;-o-animation-name:slideOutDown;animation-name:slideOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomIn{-webkit-animation-name:zoomIn;-moz-animation-name:zoomIn;-ms-animation-name:zoomIn;-o-animation-name:zoomIn;animation-name:zoomIn;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomIn,.zoomOut{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomOut{-webkit-animation-name:zoomOut;-moz-animation-name:zoomOut;-ms-animation-name:zoomOut;-o-animation-name:zoomOut;animation-name:zoomOut;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInDown{-webkit-animation-name:expandInDown;-moz-animation-name:expandInDown;-ms-animation-name:expandInDown;-o-animation-name:expandInDown;animation-name:expandInDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInDown,.expandOutUp{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandOutUp{-webkit-animation-name:expandOutUp;-moz-animation-name:expandOutUp;-ms-animation-name:expandOutUp;-o-animation-name:expandOutUp;animation-name:expandOutUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;-moz-animation-duration:.15s;-ms-animation-duration:.15s;-o-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInUp{-webkit-animation-name:expandInUp;-moz-animation-name:expandInUp;-ms-animation-name:expandInUp;-o-animation-name:expandInUp;animation-name:expandInUp;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.expandInUp,.expandOutDown{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expandOutDown{-webkit-animation-name:expandOutDown;-moz-animation-name:expandOutDown;-ms-animation-name:expandOutDown;-o-animation-name:expandOutDown;animation-name:expandOutDown;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.15s;-moz-animation-duration:.15s;-ms-animation-duration:.15s;-o-animation-duration:.15s;animation-duration:.15s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInDownSmall{-webkit-animation-name:fadeInDownSmall;-moz-animation-name:fadeInDownSmall;-ms-animation-name:fadeInDownSmall;-o-animation-name:fadeInDownSmall;animation-name:fadeInDownSmall;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.fadeInDownSmall,.fadeOutUpSmall{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.fadeOutUpSmall{-webkit-animation-name:fadeOutUpSmall;-moz-animation-name:fadeOutUpSmall;-ms-animation-name:fadeOutUpSmall;-o-animation-name:fadeOutUpSmall;animation-name:fadeOutUpSmall;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-ms-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomInBig{-webkit-animation-name:zoomInBig;-moz-animation-name:zoomInBig;-ms-animation-name:zoomInBig;-o-animation-name:zoomInBig;animation-name:zoomInBig;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-ms-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.zoomInBig,.zoomOutBig{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.zoomOutBig{-webkit-animation-name:zoomOutBig;-moz-animation-name:zoomOutBig;-ms-animation-name:zoomOutBig;-o-animation-name:zoomOutBig;animation-name:zoomOutBig;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-ms-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.pulse{-webkit-animation-name:pulse;-moz-animation-name:pulse;-ms-animation-name:pulse;-o-animation-name:pulse;animation-name:pulse;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-ms-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expand-enter{overflow:hidden}.expand-enter-active{transition:all .3s ease-out}.expand-enter-active>*{-webkit-animation-name:expandInWithFade;-moz-animation-name:expandInWithFade;-ms-animation-name:expandInWithFade;-o-animation-name:expandInWithFade;animation-name:expandInWithFade;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.expand-leave{overflow:hidden}.expand-leave-active{transition:all .2s ease-out}.expand-leave-active>*{-webkit-animation-name:expandOutWithFade;-moz-animation-name:expandOutWithFade;-ms-animation-name:expandOutWithFade;-o-animation-name:expandOutWithFade;animation-name:expandOutWithFade;-webkit-animation-iteration-count:1;-moz-animation-iteration-count:1;-ms-animation-iteration-count:1;-o-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-webkit-animation-delay:0s;-moz-animation-delay:0s;-ms-animation-delay:0s;-o-animation-delay:0s;animation-delay:0s;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);-moz-animation-timing-function:cubic-bezier(.23,1,.32,1);-ms-animation-timing-function:cubic-bezier(.23,1,.32,1);-o-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.next-icon[dir=rtl]:before{transform:rotateY(180deg)}@font-face{font-family:NextIcon;src:url(../console-ui/public/fonts/font_1533967_slipq25tezj.eot);src:url(../console-ui/public/fonts/font_1533967_slipq25tezj.eot?#iefix) format("embedded-opentype"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.woff2) format("woff2"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.woff) format("woff"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.ttf) format("truetype"),url(../console-ui/public/fonts/font_1533967_slipq25tezj.svg#NextIcon) format("svg");font-display:swap}.next-icon{display:inline-block;font-family:NextIcon;font-style:normal;font-weight:400;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.next-icon:before{display:inline-block;vertical-align:middle;text-align:center}.next-icon-smile:before{content:""}.next-icon-cry:before{content:""}.next-icon-success:before{content:""}.next-icon-warning:before{content:""}.next-icon-prompt:before{content:""}.next-icon-error:before{content:""}.next-icon-help:before{content:""}.next-icon-clock:before{content:""}.next-icon-success-filling:before{content:""}.next-icon-delete-filling:before{content:""}.next-icon-favorites-filling:before{content:""}.next-icon-add:before{content:""}.next-icon-minus:before{content:""}.next-icon-arrow-up:before{content:""}.next-icon-arrow-down:before{content:""}.next-icon-arrow-left:before{content:""}.next-icon-arrow-right:before{content:""}.next-icon-arrow-double-left:before{content:""}.next-icon-arrow-double-right:before{content:""}.next-icon-switch:before{content:""}.next-icon-sorting:before{content:""}.next-icon-descending:before{content:""}.next-icon-ascending:before{content:""}.next-icon-select:before{content:""}.next-icon-semi-select:before{content:""}.next-icon-search:before{content:""}.next-icon-close:before{content:""}.next-icon-ellipsis:before{content:""}.next-icon-picture:before{content:""}.next-icon-calendar:before{content:""}.next-icon-ashbin:before{content:""}.next-icon-upload:before{content:""}.next-icon-download:before{content:""}.next-icon-set:before{content:""}.next-icon-edit:before{content:""}.next-icon-refresh:before{content:""}.next-icon-filter:before{content:""}.next-icon-attachment:before{content:""}.next-icon-account:before{content:""}.next-icon-email:before{content:""}.next-icon-atm:before{content:""}.next-icon-loading:before{content:"";animation:loadingCircle 1s linear infinite}.next-icon-eye:before{content:""}.next-icon-copy:before{content:""}.next-icon-toggle-left:before{content:""}.next-icon-toggle-right:before{content:""}.next-icon-eye-close:before{content:""}.next-icon-unlock:before{content:""}.next-icon-lock:before{content:""}.next-icon-exit:before{content:""}.next-icon-chart-bar:before{content:""}.next-icon-chart-pie:before{content:""}.next-icon-form:before{content:""}.next-icon-detail:before{content:""}.next-icon-list:before{content:""}.next-icon-dashboard:before{content:""}.next-icon.next-xxs .next-icon-remote,.next-icon.next-xxs:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-icon.next-xxs{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-icon.next-xxs:before{width:16px;font-size:16px}}.next-icon.next-xs .next-icon-remote,.next-icon.next-xs:before{width:12px;font-size:12px;line-height:inherit}.next-icon.next-small .next-icon-remote,.next-icon.next-small:before{width:16px;font-size:16px;line-height:inherit}.next-icon.next-medium .next-icon-remote,.next-icon.next-medium:before{width:20px;font-size:20px;line-height:inherit}.next-icon.next-large .next-icon-remote,.next-icon.next-large:before{width:24px;font-size:24px;line-height:inherit}.next-icon.next-xl .next-icon-remote,.next-icon.next-xl:before{width:32px;font-size:32px;line-height:inherit}.next-icon.next-xxl .next-icon-remote,.next-icon.next-xxl:before{width:48px;font-size:48px;line-height:inherit}.next-icon.next-xxxl .next-icon-remote,.next-icon.next-xxxl:before{width:64px;font-size:64px;line-height:inherit}.next-icon.next-inherit .next-icon-remote,.next-icon.next-inherit:before{width:inherit;font-size:inherit;line-height:inherit}.next-icon .next-icon-remote,.next-icon.next-inherit .next-icon-remote{width:1em;height:1em;vertical-align:middle;fill:currentColor}.next-overlay-wrapper .next-overlay-inner{z-index:1001}.next-overlay-wrapper .next-overlay-backdrop{position:fixed;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.3);transition:opacity .3s cubic-bezier(.4,0,.2,1);opacity:0}.next-overlay-wrapper.opened .next-overlay-backdrop{opacity:1}.next-loading-fusion-reactor[dir=rtl]{-webkit-animation-name:nextVectorRouteRTL;-moz-animation-name:nextVectorRouteRTL;-ms-animation-name:nextVectorRouteRTL;-o-animation-name:nextVectorRouteRTL;animation-name:nextVectorRouteRTL}@-webkit-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-moz-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-ms-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@-o-keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes nextVectorRouteRTL{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}25%{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}30%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}50%{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}55%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}75%{-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);-o-transform:rotate(-270deg);transform:rotate(-270deg)}80%{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}to{-webkit-transform:rotate(-1turn);-moz-transform:rotate(-1turn);-ms-transform:rotate(-1turn);-o-transform:rotate(-1turn);transform:rotate(-1turn)}}.next-loading{position:relative}.next-loading.next-open{pointer-events:none}.next-loading .next-loading-component{opacity:.7;-webkit-filter:blur(1px);filter:blur(1px);filter:"progid:DXImageTransform.Microsoft.Blur(PixelRadius=1, MakeShadow=false)";position:relative;pointer-events:none}.next-loading-masker{position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;opacity:.2;background:#fff}.next-loading-inline{display:inline-block}.next-loading-tip{display:block;position:absolute;top:50%;left:50%;z-index:4;transform:translate(-50%,-50%);text-align:center}.next-loading-tip-fullscreen{top:inherit;left:inherit;transform:inherit}.next-loading-tip-placeholder{display:none}.next-loading-right-tip .next-loading-indicator{display:inline-block}.next-loading-right-tip .next-loading-tip-content{position:absolute;display:block;top:50%;right:0;transform:translateY(-50%)}.next-loading-right-tip .next-loading-tip-placeholder{display:inline-block;visibility:hidden;margin-left:1em}.next-loading-fusion-reactor{display:inline-block;width:40px;height:40px;position:relative;margin:0;-webkit-animation-duration:5.6s;-moz-animation-duration:5.6s;-ms-animation-duration:5.6s;-o-animation-duration:5.6s;animation-duration:5.6s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:nextVectorRoute;-moz-animation-name:nextVectorRoute;-ms-animation-name:nextVectorRoute;-o-animation-name:nextVectorRoute;animation-name:nextVectorRoute}.next-loading-fusion-reactor .next-loading-dot{position:absolute;margin:auto;width:12px;height:12px;border-radius:50%;background:#209bfa;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;-ms-animation-timing-function:ease-in-out;-o-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.4s;-moz-animation-duration:1.4s;-ms-animation-duration:1.4s;-o-animation-duration:1.4s;animation-duration:1.4s}.next-loading-fusion-reactor .next-loading-dot:first-child{top:0;bottom:0;left:0;-webkit-animation-name:nextVectorDotsX;-moz-animation-name:nextVectorDotsX;-ms-animation-name:nextVectorDotsX;-o-animation-name:nextVectorDotsX;animation-name:nextVectorDotsX}.next-loading-fusion-reactor .next-loading-dot:nth-child(2){left:0;right:0;top:0;opacity:.8;-webkit-animation-name:nextVectorDotsY;-moz-animation-name:nextVectorDotsY;-ms-animation-name:nextVectorDotsY;-o-animation-name:nextVectorDotsY;animation-name:nextVectorDotsY}.next-loading-fusion-reactor .next-loading-dot:nth-child(3){top:0;bottom:0;right:0;opacity:.6;-webkit-animation-name:nextVectorDotsXR;-moz-animation-name:nextVectorDotsXR;-ms-animation-name:nextVectorDotsXR;-o-animation-name:nextVectorDotsXR;animation-name:nextVectorDotsXR}.next-loading-fusion-reactor .next-loading-dot:nth-child(4){left:0;right:0;bottom:0;opacity:.2;-webkit-animation-name:nextVectorDotsYR;-moz-animation-name:nextVectorDotsYR;-ms-animation-name:nextVectorDotsYR;-o-animation-name:nextVectorDotsYR;animation-name:nextVectorDotsYR}.next-loading-medium-fusion-reactor{width:24px;height:24px}.next-loading-medium-fusion-reactor .next-loading-dot{width:8px;height:8px}.next-loading-medium-fusion-reactor .next-loading-dot:first-child{-webkit-animation-name:nextVectorDotsX-medium;-moz-animation-name:nextVectorDotsX-medium;-ms-animation-name:nextVectorDotsX-medium;-o-animation-name:nextVectorDotsX-medium;animation-name:nextVectorDotsX-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(2){-webkit-animation-name:nextVectorDotsY-medium;-moz-animation-name:nextVectorDotsY-medium;-ms-animation-name:nextVectorDotsY-medium;-o-animation-name:nextVectorDotsY-medium;animation-name:nextVectorDotsY-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(3){-webkit-animation-name:nextVectorDotsXR-medium;-moz-animation-name:nextVectorDotsXR-medium;-ms-animation-name:nextVectorDotsXR-medium;-o-animation-name:nextVectorDotsXR-medium;animation-name:nextVectorDotsXR-medium}.next-loading-medium-fusion-reactor .next-loading-dot:nth-child(4){-webkit-animation-name:nextVectorDotsYR-medium;-moz-animation-name:nextVectorDotsYR-medium;-ms-animation-name:nextVectorDotsYR-medium;-o-animation-name:nextVectorDotsYR-medium;animation-name:nextVectorDotsYR-medium}@-webkit-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-moz-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-ms-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-o-keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes nextVectorRoute{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}5%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}25%{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}30%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}50%{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}55%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}75%{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}80%{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(1turn);-moz-transform:rotate(1turn);-ms-transform:rotate(1turn);-o-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@keyframes nextVectorDotsYR{25%{bottom:0}45%,50%{bottom:12.8px;height:14.4px;width:14.4px}90%{bottom:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@keyframes nextVectorDotsY{25%{top:0}45%,50%{top:12.8px;height:14.4px;width:14.4px}90%{top:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@keyframes nextVectorDotsX{25%{left:0}45%,50%{left:12.8px;width:14.4px;height:14.4px}90%{left:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-moz-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-ms-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-o-keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@keyframes nextVectorDotsXR{25%{right:0}45%,50%{right:12.8px;width:14.4px;height:14.4px}90%{right:0;height:12px;width:12px}}@-webkit-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@keyframes nextVectorDotsYR-medium{25%{bottom:0}45%,50%{bottom:7.2px;height:9.6px;width:9.6px}90%{bottom:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@keyframes nextVectorDotsY-medium{25%{top:0}45%,50%{top:7.2px;height:9.6px;width:9.6px}90%{top:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@keyframes nextVectorDotsX-medium{25%{left:0}45%,50%{left:7.2px;width:9.6px;height:9.6px}90%{left:0;height:8px;width:8px}}@-webkit-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-moz-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-ms-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@-o-keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}@keyframes nextVectorDotsXR-medium{25%{right:0}45%,50%{right:7.2px;width:9.6px;height:9.6px}90%{right:0;height:8px;width:8px}}.next-radio-button-large[dir=rtl]>label:first-child{margin-left:-1px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:0;border-bottom-left-radius:0}.next-radio-button-large[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-large[dir=rtl] .next-radio-label{height:38px;line-height:38px;font-size:16px}.next-radio-button-medium[dir=rtl]>label:first-child{margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-medium[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-small[dir=rtl]>label:first-child{margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-small[dir=rtl]>label:last-child{margin-left:0;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-wrapper[dir=rtl] .next-radio-label{margin-left:0;margin-right:4px}.next-radio-group[dir=rtl] .next-radio-label{margin-right:4px;margin-left:16px}.next-radio-button[dir=rtl]>label .next-radio-label{margin:0}.next-radio-wrapper{outline:0;display:inline-block}.next-radio-wrapper .next-radio{box-sizing:border-box;display:inline-block;vertical-align:middle;position:relative;line-height:1}.next-radio-wrapper .next-radio *,.next-radio-wrapper .next-radio :after,.next-radio-wrapper .next-radio :before{box-sizing:border-box}.next-radio-wrapper .next-radio input[type=radio]{opacity:0;position:absolute;vertical-align:middle;top:0;left:0;width:16px;height:16px;margin:0;cursor:pointer}.next-radio-wrapper .next-radio-inner{display:block;width:16px;height:16px;background:#fff;border-radius:50%;border:1px solid #ddd;transition:all .1s linear;box-shadow:none}.next-radio-wrapper .next-radio-inner:after{transform:scale(0);position:absolute;border-radius:50%;top:50%;margin-top:-2px;left:50%;margin-left:-2px;background:#fff;content:"";transition:all .1s linear}.next-radio-wrapper.checked .next-radio-inner{border-color:#209bfa;background:#209bfa}.next-radio-wrapper.checked .next-radio-inner:after{width:4px;height:4px;font-weight:700;background:#fff;transform:scale(1)}.next-radio-wrapper.checked.hovered .next-radio-inner,.next-radio-wrapper.checked:hover .next-radio-inner{border-color:transparent}.next-radio-wrapper.disabled input[type=radio]{cursor:not-allowed}.next-radio-wrapper.disabled .next-radio-inner{border-color:#eee;background:#fafafa}.next-radio-wrapper.disabled .next-radio-inner:after{background:#ccc}.next-radio-wrapper.disabled .next-radio-inner.hovered,.next-radio-wrapper.disabled .next-radio-inner:hover{border-color:#eee}.next-radio-wrapper.disabled.checked .next-radio-inner{border-color:#eee;background:#fafafa}.next-radio-wrapper.disabled.checked .next-radio-inner:after{background:#ccc}.next-radio-wrapper.disabled .next-radio-label{color:#ccc}.next-radio-wrapper:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper:not(.disabled):hover .next-radio-inner{border-color:#209bfa;background-color:#add9ff}.next-radio-wrapper:not(.disabled).hovered .next-radio-label,.next-radio-wrapper:not(.disabled):hover .next-radio-label{cursor:pointer}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner{border-color:transparent;background:#1274e7}.next-radio-wrapper.checked:not(.disabled).hovered .next-radio-inner:after,.next-radio-wrapper.checked:not(.disabled):hover .next-radio-inner:after{background:#fff}.next-radio-button .next-radio,.next-radio-button input[type=radio]{width:0;height:0}.next-radio-button>label{display:inline-block;box-sizing:border-box;position:relative;z-index:1;margin:0 0 0 -1px;border:1px solid #ddd;background-color:#fff;transition:all .1s linear;vertical-align:middle}.next-radio-button>label .next-radio-label{display:block;color:#333;margin:0;transition:all .1s linear}.next-radio-button>label.hovered,.next-radio-button>label:hover{z-index:10;border-color:#ccc;background-color:#f9f9f9}.next-radio-button>label.hovered .next-radio-label,.next-radio-button>label:hover .next-radio-label{color:#333}.next-radio-button>label.checked{z-index:11;border-color:#209bfa;background-color:#fff}.next-radio-button>label.checked .next-radio-label{color:#209bfa}.next-radio-button>label.disabled{z-index:0;cursor:not-allowed;border-color:#eee;background-color:#fafafa}.next-radio-button>label.disabled .next-radio-label{color:#ccc}.next-radio-button>label.checked.disabled{z-index:0;border-color:#eee;background-color:#f9f9f9}.next-radio-button>label.checked.disabled .next-radio-label{color:#ccc}.next-radio-button-large>label{padding:0 8px;height:40px;line-height:40px}.next-radio-button-large>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-large>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-large .next-radio-label{height:38px;line-height:38px;font-size:16px}.next-radio-button-medium>label{padding:0 8px;height:32px;line-height:32px}.next-radio-button-medium>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-medium>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-medium .next-radio-label{height:30px;line-height:30px;font-size:14px}.next-radio-button-small>label{padding:0 8px;height:20px;line-height:20px}.next-radio-button-small>label:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-radio-button-small>label:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.next-radio-button-small .next-radio-label{height:18px;line-height:18px;font-size:12px}.next-radio-single-input input[type=radio]{opacity:0;position:absolute;top:0;left:0;margin:0}.next-radio-group{display:inline-block}.next-radio-group .next-radio-wrapper{margin-right:12px}.next-radio-group .next-radio-wrapper:last-child{margin-right:0}.next-radio-group .next-radio-label{color:#333}.next-radio-group.disabled .next-radio-label{color:#ccc}.next-radio-group.next-radio-button .next-radio-wrapper{margin-right:0}.next-radio-group-ver .next-radio-wrapper{display:block;margin-bottom:8px}.next-radio-label{margin:0 4px;font-size:14px;vertical-align:middle;line-height:1;color:#333}@-moz-document url-prefix(){.next-radio{margin-top:-1px}@supports(animation:calc(0s)){.next-radio{margin-top:-3px}}}.next-badge{position:relative;display:inline-block;vertical-align:middle;line-height:1}.next-badge,.next-badge *,.next-badge :after,.next-badge :before{box-sizing:border-box}.next-badge .next-badge-count{color:#fff;background:#d23c26;text-align:center;white-space:nowrap;border-radius:8px;position:absolute;width:auto;height:16px;min-width:16px;padding:0 4px;font-size:12px;line-height:16px;transform:translateX(-50%);top:-.5em}.next-badge .next-badge-count a,.next-badge .next-badge-count a:hover{color:#fff}.next-badge .next-badge-dot{color:#fff;background:#d23c26;text-align:center;white-space:nowrap;border-radius:8px;position:absolute;width:8px;height:8px;min-width:8px;padding:0;font-size:1px;line-height:1;transform:translateX(-50%);top:-.5em}.next-badge .next-badge-dot a,.next-badge .next-badge-dot a:hover{color:#fff}.next-badge .next-badge-custom{line-height:1.166667;white-space:nowrap;font-size:12px;padding-left:4px;padding-right:4px;border-radius:3px;transform:translateX(-50%)}.next-badge .next-badge-custom>*{line-height:1}.next-badge .next-badge-custom>.next-icon:before,.next-badge .next-badge-custom>i:before{font-size:inherit;width:auto;vertical-align:top}.next-badge .next-badge-scroll-number{position:absolute;top:-4px;z-index:10;overflow:hidden;transform-origin:left center}.next-badge-scroll-number-only{position:relative;display:inline-block;transition:transform .1s linear,-webkit-transform .1s linear;min-width:8px}.next-badge-scroll-number-only span{display:block;height:16px;line-height:16px;font-size:12px}.next-badge-not-a-wrapper .next-badge-count,.next-badge-not-a-wrapper .next-badge-custom,.next-badge-not-a-wrapper .next-badge-dot{position:relative;display:block;top:auto;transform:translateX(0)}.next-badge-list-wrapper{margin-left:0}.next-badge-list-wrapper li{margin-bottom:0;list-style:none}.next-badge[dir=rtl] .next-badge-custom{padding-right:4px;padding-left:4px}.next-badge[dir=rtl] .next-badge-scroll-number{left:0;transform-origin:right center}.next-balloon{position:absolute;top:0;max-width:300px;border-style:solid;border-radius:3px;font-size:14px;font-weight:400;word-wrap:break-all;word-wrap:break-word;z-index:0}.next-balloon,.next-balloon *,.next-balloon :after,.next-balloon :before{box-sizing:border-box}.next-balloon:focus,.next-balloon :focus{outline:0}.next-balloon-title{margin-bottom:8px;font-size:16px;font-weight:700}.next-balloon-title.next-balloon-closable{padding:0 40px 0 0}.next-balloon-title.next-balloon-closable .next-balloon-close{top:-1px;transform:translateY(16px);right:16px}.next-balloon-primary{color:#333;border-color:#209bfa;background-color:#add9ff;box-shadow:0 1px 3px 0 rgba(0,0,0,.12);border-width:1px}.next-balloon-primary .next-balloon-close{position:absolute;top:-1px;transform:translateY(15px);right:12px;font-size:16px;cursor:pointer;color:#999}.next-balloon-primary .next-balloon-close .next-icon{width:16px;height:16px;line-height:1em}.next-balloon-primary .next-balloon-close .next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-balloon-primary .next-balloon-close :hover{color:#333}.next-balloon-primary:after{position:absolute;width:12px;height:12px;content:"";transform:rotate(45deg);box-sizing:content-box!important;border:1px solid #209bfa;background-color:#add9ff;z-index:-1}.next-balloon-primary.next-balloon-top:after{top:-7px;left:calc(50% - 7px);border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-right:after{top:calc(50% - 7px);right:-7px;border-left:none;border-bottom:none}.next-balloon-primary.next-balloon-bottom:after{bottom:-7px;left:calc(50% - 7px);border-top:none;border-left:none}.next-balloon-primary.next-balloon-left:after{top:calc(50% - 7px);left:-7px;border-top:none;border-right:none}.next-balloon-primary.next-balloon-left-top:after{top:12px;left:-7px;border-top:none;border-right:none}.next-balloon-primary.next-balloon-left-bottom:after{bottom:12px;left:-7px;border-top:none;border-right:none}.next-balloon-primary.next-balloon-right-top:after{top:12px;right:-7px;border-bottom:none;border-left:none}.next-balloon-primary.next-balloon-right-bottom:after{right:-7px;bottom:12px;border-bottom:none;border-left:none}.next-balloon-primary.next-balloon-top-left:after{top:-7px;left:12px;border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-top-right:after{top:-7px;right:12px;border-right:none;border-bottom:none}.next-balloon-primary.next-balloon-bottom-left:after{bottom:-7px;left:12px;border-top:none;border-left:none}.next-balloon-primary.next-balloon-bottom-right:after{right:12px;bottom:-7px;border-top:none;border-left:none}.next-balloon-normal{color:#333;border-color:#e6e6e6;background-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-width:1px}.next-balloon-normal .next-balloon-close{position:absolute;top:-1px;transform:translateY(15px);right:12px;font-size:16px;cursor:pointer;color:#999}.next-balloon-normal .next-balloon-close .next-icon{width:16px;height:16px;line-height:1em}.next-balloon-normal .next-balloon-close .next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-balloon-normal .next-balloon-close :hover{color:#666}.next-balloon-normal:after{position:absolute;width:12px;height:12px;content:"";transform:rotate(45deg);box-sizing:content-box!important;border:1px solid #e6e6e6;background-color:#fff;z-index:-1}.next-balloon-normal.next-balloon-top:after{top:-7px;left:calc(50% - 7px);border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-right:after{top:calc(50% - 7px);right:-7px;border-left:none;border-bottom:none}.next-balloon-normal.next-balloon-bottom:after{bottom:-7px;left:calc(50% - 7px);border-top:none;border-left:none}.next-balloon-normal.next-balloon-left:after{top:calc(50% - 7px);left:-7px;border-top:none;border-right:none}.next-balloon-normal.next-balloon-left-top:after{top:12px;left:-7px;border-top:none;border-right:none}.next-balloon-normal.next-balloon-left-bottom:after{bottom:12px;left:-7px;border-top:none;border-right:none}.next-balloon-normal.next-balloon-right-top:after{top:12px;right:-7px;border-bottom:none;border-left:none}.next-balloon-normal.next-balloon-right-bottom:after{right:-7px;bottom:12px;border-bottom:none;border-left:none}.next-balloon-normal.next-balloon-top-left:after{top:-7px;left:12px;border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-top-right:after{top:-7px;right:12px;border-right:none;border-bottom:none}.next-balloon-normal.next-balloon-bottom-left:after{bottom:-7px;left:12px;border-top:none;border-left:none}.next-balloon-normal.next-balloon-bottom-right:after{right:12px;bottom:-7px;border-top:none;border-left:none}.next-balloon.visible{display:block}.next-balloon.hidden{display:none}.next-balloon-medium{padding:16px}.next-balloon-closable{padding:16px 40px 16px 16px}.next-balloon-tooltip{box-sizing:border-box;position:absolute;top:0;max-width:300px;border-radius:3px;font-size:14px;font-weight:400;z-index:0;word-wrap:break-all;word-wrap:break-word;color:#fafafa;background-color:#333;box-shadow:none;border:1px solid transparent}.next-balloon-tooltip *,.next-balloon-tooltip :after,.next-balloon-tooltip :before{box-sizing:border-box}.next-balloon-tooltip .next-balloon-arrow{position:absolute;display:block;width:24px;height:24px;overflow:hidden;background:0 0;pointer-events:none}.next-balloon-tooltip .next-balloon-arrow .next-balloon-arrow-content{content:"";position:absolute;top:0;right:0;bottom:0;left:0;display:block;width:12px;height:12px;margin:auto;background-color:#333;border:1px solid transparent;pointer-events:auto}.next-balloon-tooltip-top .next-balloon-arrow{top:-24px;left:calc(50% - 12px)}.next-balloon-tooltip-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(12px) rotate(45deg)}.next-balloon-tooltip-right .next-balloon-arrow{top:calc(50% - 12px);right:-24px}.next-balloon-tooltip-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip-bottom .next-balloon-arrow{left:calc(50% - 12px);bottom:-24px}.next-balloon-tooltip-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(-12px) rotate(45deg)}.next-balloon-tooltip-left .next-balloon-arrow{top:calc(50% - 12px);left:-24px}.next-balloon-tooltip-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip-left-top .next-balloon-arrow{top:6px;left:-24px}.next-balloon-tooltip-left-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip-left-bottom .next-balloon-arrow{bottom:6px;left:-24px}.next-balloon-tooltip-left-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip-right-top .next-balloon-arrow{top:6px;right:-24px}.next-balloon-tooltip-right-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip-right-bottom .next-balloon-arrow{bottom:6px;right:-24px}.next-balloon-tooltip-right-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip-top-left .next-balloon-arrow{left:6px;top:-24px}.next-balloon-tooltip-top-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(12px) rotate(45deg)}.next-balloon-tooltip-top-right .next-balloon-arrow{right:6px;top:-24px}.next-balloon-tooltip-top-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(12px) rotate(45deg)}.next-balloon-tooltip-bottom-left .next-balloon-arrow{left:6px;bottom:-24px}.next-balloon-tooltip-bottom-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(-12px) rotate(45deg)}.next-balloon-tooltip-bottom-right .next-balloon-arrow{right:6px;bottom:-24px}.next-balloon-tooltip-bottom-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateY(-12px) rotate(45deg)}.next-balloon-tooltip.visible{display:block}.next-balloon-tooltip.hidden{display:none}.next-balloon-tooltip-medium{padding:8px}.next-balloon[dir=rtl].next-balloon-primary .next-balloon-close{left:12px;right:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right:after{left:-7px;right:auto;border-right:none;border-top:none;border-left:inherit;border-bottom:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left-bottom:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left-top:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-left:after{right:-7px;left:auto;border-left:none;border-bottom:none;border-right:inherit;border-top:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right-bottom:after,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-right-top:after{left:-7px;right:auto;border-right:none;border-top:none;border-bottom:inherit;border-left:inherit}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-top-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-top-right:after{right:auto;left:12px}.next-balloon[dir=rtl].next-balloon-primary.next-balloon-bottom-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-normal .next-balloon-close,.next-balloon[dir=rtl].next-balloon-primary.next-balloon-bottom-right:after{left:12px;right:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right:after{left:-7px;right:auto;border-right:none;border-top:none;border-left:inherit;border-bottom:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left-bottom:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left-top:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-left:after{right:-7px;left:auto;border-left:none;border-bottom:none;border-right:inherit;border-top:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right-bottom:after,.next-balloon[dir=rtl].next-balloon-normal.next-balloon-right-top:after{left:-7px;right:auto;border-right:none;border-top:none;border-bottom:inherit;border-left:inherit}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-top-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-top-right:after{right:auto;left:12px}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-bottom-left:after{right:12px;left:auto}.next-balloon[dir=rtl].next-balloon-normal.next-balloon-bottom-right:after{left:12px;right:auto}.next-balloon[dir=rtl].next-balloon-closable{padding:16px 16px 16px 40px}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right .next-balloon-arrow{left:-24px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left .next-balloon-arrow{right:-24px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-top .next-balloon-arrow{right:-24px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-bottom .next-balloon-arrow{right:-24px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-left-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(-12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-top .next-balloon-arrow{left:-24px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-top .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-bottom .next-balloon-arrow{left:-24px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-right-bottom .next-balloon-arrow .next-balloon-arrow-content{transform:translateX(12px) rotate(45deg)}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-top-left .next-balloon-arrow{right:10px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-top-right .next-balloon-arrow{left:10px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-bottom-left .next-balloon-arrow{right:10px;left:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-bottom-right .next-balloon-arrow{left:10px;right:auto}.next-balloon-tooltip[dir=rtl].next-balloon-tooltip-medium{padding:8px}.next-menu[dir=rtl] .next-menu-item-helper{float:left}.next-menu[dir=rtl] .next-menu-item .next-checkbox,.next-menu[dir=rtl] .next-menu-item .next-radio{margin-left:4px;margin-right:0}.next-menu[dir=rtl] .next-menu-hoz-right{float:left}.next-menu[dir=rtl] .next-menu-hoz-icon-arrow.next-icon{left:6px;right:auto}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon{margin-left:0;margin-right:-18px}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu[dir=rtl] .next-menu-icon-selected.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-menu[dir=rtl] .next-menu-icon-selected.next-icon.next-menu-icon-right{right:auto;left:4px}.next-menu[dir=rtl] .next-menu-icon-arrow.next-icon{left:10px;right:auto}.next-menu{position:relative;min-width:100px;margin:0;list-style:none;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none;background:#fff;line-height:32px;font-size:14px;animation-duration:.3s;animation-timing-function:ease}.next-menu,.next-menu *,.next-menu :after,.next-menu :before{box-sizing:border-box}.next-menu:focus,.next-menu :focus{outline:0}.next-menu-spacing-lr{padding:0}.next-menu-spacing-lr.next-menu-outside>.next-menu{height:100%;overflow-y:auto}.next-menu-spacing-tb{padding:0}.next-menu.next-ver{padding:8px 0}.next-menu.next-ver .next-menu-item{padding:0 20px}.next-menu.next-hoz{padding:8px 0}.next-menu.next-hoz .next-menu-item{padding:0 20px}.next-menu-embeddable,.next-menu-embeddable .next-menu-item.next-disabled,.next-menu-embeddable .next-menu-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-menu-embeddable{box-shadow:none}.next-menu-embeddable .next-menu-item-inner{height:100%}.next-menu-content{position:relative}.next-menu-content,.next-menu-sub-menu{padding:0;margin:0;list-style:none}.next-menu-sub-menu.next-expand-enter{overflow:hidden}.next-menu-sub-menu.next-expand-enter-active{transition:height .3s ease}.next-menu-sub-menu.next-expand-leave{overflow:hidden}.next-menu-sub-menu.next-expand-leave-active{transition:height .3s ease}.next-menu-item{position:relative;transition:background .1s linear;color:#333;cursor:pointer}.next-menu-item-helper{float:right;color:#999;font-style:normal;font-size:14px}.next-menu-item .next-checkbox,.next-menu-item .next-radio{margin-right:4px}.next-menu-item.next-selected{color:#333;background-color:#fff}.next-menu-item.next-selected .next-menu-icon-arrow{color:#666}.next-menu-item.next-selected .next-menu-icon-selected{color:#209bfa}.next-menu-item.next-disabled,.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;background-color:#fff;cursor:not-allowed}.next-menu-item.next-disabled .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-icon-selected,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc}.next-menu-item:not(.next-disabled).next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover,.next-menu-item:not(.next-disabled).next-selected:focus,.next-menu-item:not(.next-disabled).next-selected:focus:hover,.next-menu-item:not(.next-disabled).next-selected:hover,.next-menu-item:not(.next-disabled):hover{color:#333;background-color:#f9f9f9}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-arrow,.next-menu-item:not(.next-disabled):hover .next-menu-icon-arrow{color:#333}.next-menu-item:not(.next-disabled).next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected.next-focused:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:focus:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled).next-selected:hover .next-menu-icon-selected,.next-menu-item:not(.next-disabled):hover .next-menu-icon-selected{color:#209bfa}.next-menu-item-inner{height:32px;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.next-menu-item .next-menu-item-text{vertical-align:middle}.next-menu-item .next-menu-item-text>a{display:inline-block;text-decoration:none;color:#333}.next-menu-item .next-menu-item-text>a:before{position:absolute;background-color:transparent;top:0;left:0;bottom:0;right:0;content:""}.next-menu.next-hoz{padding:0}.next-menu.next-hoz.next-menu-nowrap{overflow:hidden;white-space:nowrap}.next-menu.next-hoz.next-menu-nowrap .next-menu-more{text-align:center}.next-menu.next-hoz .next-menu-content>.next-menu-item,.next-menu.next-hoz>.next-menu-item,.next-menu.next-hoz>.next-menu-sub-menu-wrapper{display:inline-block;vertical-align:top}.next-menu.next-hoz .next-menu-content,.next-menu.next-hoz .next-menu-footer,.next-menu.next-hoz .next-menu-header{display:inline-block}.next-menu-hoz-right{float:right}.next-menu-group-label{padding:0 12px;color:#999}.next-menu-divider{margin:8px 12px;border-bottom:1px solid #eee}.next-menu .next-menu-icon-selected.next-icon{position:absolute;top:0;margin-left:-16px}.next-menu .next-menu-icon-selected.next-icon .next-icon-remote,.next-menu .next-menu-icon-selected.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-menu .next-menu-icon-selected.next-icon.next-menu-icon-right{right:4px}.next-menu .next-menu-symbol-icon-selected.next-menu-icon-selected:before{content:""}.next-menu .next-menu-icon-arrow.next-icon{position:absolute;top:0;right:10px;color:#666;transition:all .1s linear}.next-menu .next-menu-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-icon-arrow.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-icon-arrow-down:before{content:""}.next-menu .next-menu-icon-arrow-down.next-open{transform:rotate(180deg)}.next-menu .next-menu-icon-arrow-down.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-down.next-open:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-symbol-popupfold:before{content:""}.next-menu .next-menu-icon-arrow-right.next-open{transform:rotate(-90deg)}.next-menu .next-menu-icon-arrow-right.next-open .next-icon-remote,.next-menu .next-menu-icon-arrow-right.next-open:before{width:20px;font-size:20px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon{position:absolute;top:0;right:6px;color:#666;transition:all .1s linear}.next-menu .next-menu-hoz-icon-arrow.next-icon .next-icon-remote,.next-menu .next-menu-hoz-icon-arrow.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-menu .next-menu-hoz-icon-arrow.next-icon:before{content:""}.next-menu-unfold-icon:before{content:""}.next-menu .next-menu-hoz-icon-arrow.next-open{transform:rotate(180deg)}.next-menu .next-menu-hoz-icon-arrow.next-open .next-icon-remote,.next-menu .next-menu-hoz-icon-arrow.next-open:before{width:12px;font-size:12px;line-height:inherit}.next-menu.next-context{line-height:24px}.next-menu.next-context .next-menu-item-inner{height:24px}.next-breadcrumb{display:block;margin:0;padding:0;white-space:nowrap;height:16px;line-height:16px}.next-breadcrumb .next-breadcrumb-item{display:inline-block}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-text{display:inline-block;text-decoration:none;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:all .1s linear}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-text>b{font-weight:400}.next-breadcrumb .next-breadcrumb-item .next-breadcrumb-separator{display:inline-block;vertical-align:top}.next-breadcrumb .next-breadcrumb-text{height:16px;min-width:16px;font-size:12px;line-height:16px}.next-breadcrumb .next-breadcrumb-separator{height:16px;margin:0 8px;font-size:16px;line-height:16px}.next-breadcrumb .next-breadcrumb-separator .next-icon:before{display:block}.next-breadcrumb .next-breadcrumb-separator .next-icon .next-icon-remote,.next-breadcrumb .next-breadcrumb-separator .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-breadcrumb .next-breadcrumb-text-ellipsis{font-size:12px}.next-breadcrumb .next-breadcrumb-text{color:#666}.next-breadcrumb .next-breadcrumb-text>b{color:#209bfa}.next-breadcrumb .next-breadcrumb-text>a{color:#666;text-decoration:none;text-align:center}.next-breadcrumb .next-breadcrumb-text.activated,.next-breadcrumb .next-breadcrumb-text.activated>a{color:#333;font-weight:700}.next-breadcrumb .next-breadcrumb-text-ellipsis{color:#666;cursor:default}.next-breadcrumb .next-breadcrumb-text-ellipsis-clickable{color:#666;cursor:pointer}.next-breadcrumb .next-breadcrumb-separator{color:#999}.next-breadcrumb .next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover>a,.next-breadcrumb a.next-breadcrumb-text.activated:hover>a,.next-breadcrumb a.next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover,.next-breadcrumb a.next-breadcrumb-text:not(.next-breadcrumb-text-ellipsis):hover>b{color:#209bfa}.next-breadcrumb a.next-breadcrumb-text.activated:hover{color:#209bfa;font-weight:700}.next-breadcrumb-icon-sep:before{content:""}.next-breadcrumb-dropdown-wrapper{padding:4px 0}.next-btn,.next-btn *,.next-btn :after,.next-btn :before{box-sizing:border-box}.next-btn::-moz-focus-inner{border:0;padding:0}.next-btn,.next-btn:active,.next-btn:focus,.next-btn:hover{outline:0}@keyframes loadingCircle{0%{transform-origin:50% 50%;transform:rotate(0deg)}to{transform-origin:50% 50%;transform:rotate(1turn)}}.next-btn{position:relative;display:inline-block;box-shadow:none;text-decoration:none;text-align:center;text-transform:none;white-space:nowrap;vertical-align:middle;user-select:none;transition:all .1s linear;line-height:1;cursor:pointer}.next-btn:after{text-align:center;position:absolute;opacity:0;visibility:hidden;transition:opacity .1s linear}.next-btn:before{content:"";height:100%;width:0}.next-btn .next-icon,.next-btn:before{display:inline-block;vertical-align:middle}.next-btn .next-icon{font-size:0}.next-btn>.next-btn-helper,.next-btn>div,.next-btn>span{display:inline-block;vertical-align:middle}.next-btn>.next-btn-helper{text-decoration:inherit}.next-btn.hover,.next-btn:hover{box-shadow:none}.next-btn.next-small{border-radius:3px;padding:0 16px;height:24px;font-size:12px;border-width:1px}.next-btn.next-small>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-small>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-small>.next-btn-icon.next-icon-alone:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:16px;top:50%;text-align:center;margin-right:4px}.next-btn.next-small.next-btn-loading>.next-icon{display:none}.next-btn.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-medium{border-radius:3px;padding:0 20px;height:32px;font-size:14px;border-width:1px}.next-btn.next-medium>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-medium>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:20px;top:50%;text-align:center;margin-right:4px}.next-btn.next-medium.next-btn-loading>.next-icon{display:none}.next-btn.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-large{border-radius:3px;padding:0 24px;height:40px;font-size:16px;border-width:1px}.next-btn.next-large>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn.next-large>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:24px;top:50%;text-align:center;margin-right:4px}.next-btn.next-large.next-btn-loading>.next-icon{display:none}.next-btn.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn.next-btn-normal{border-style:solid;background:#fff;border-color:#ddd}.next-btn.next-btn-normal,.next-btn.next-btn-normal.visited,.next-btn.next-btn-normal:link,.next-btn.next-btn-normal:visited{color:#333}.next-btn.next-btn-normal.active,.next-btn.next-btn-normal.hover,.next-btn.next-btn-normal:active,.next-btn.next-btn-normal:focus,.next-btn.next-btn-normal:hover{color:#333;background:#f9f9f9;border-color:#ccc;text-decoration:none}.next-btn.next-btn-primary{border-style:solid;background:#209bfa;border-color:transparent}.next-btn.next-btn-primary,.next-btn.next-btn-primary.visited,.next-btn.next-btn-primary:link,.next-btn.next-btn-primary:visited{color:#fff}.next-btn.next-btn-primary.active,.next-btn.next-btn-primary.hover,.next-btn.next-btn-primary:active,.next-btn.next-btn-primary:focus,.next-btn.next-btn-primary:hover{color:#fff;background:#1274e7;border-color:transparent;text-decoration:none}.next-btn.next-btn-secondary{border-style:solid;background:#fff;border-color:#209bfa}.next-btn.next-btn-secondary,.next-btn.next-btn-secondary.visited,.next-btn.next-btn-secondary:link,.next-btn.next-btn-secondary:visited{color:#209bfa}.next-btn.next-btn-secondary.active,.next-btn.next-btn-secondary.hover,.next-btn.next-btn-secondary:active,.next-btn.next-btn-secondary:focus,.next-btn.next-btn-secondary:hover{color:#fff;background:#1274e7;border-color:#1274e7;text-decoration:none}.next-btn.disabled,.next-btn[disabled]{cursor:not-allowed}.next-btn.disabled.next-btn-normal,.next-btn[disabled].next-btn-normal{background:#fafafa;border-color:#eee}.next-btn.disabled.next-btn-normal,.next-btn.disabled.next-btn-normal.visited,.next-btn.disabled.next-btn-normal:link,.next-btn.disabled.next-btn-normal:visited,.next-btn[disabled].next-btn-normal,.next-btn[disabled].next-btn-normal.visited,.next-btn[disabled].next-btn-normal:link,.next-btn[disabled].next-btn-normal:visited{color:#ccc}.next-btn.disabled.next-btn-normal.active,.next-btn.disabled.next-btn-normal.hover,.next-btn.disabled.next-btn-normal:active,.next-btn.disabled.next-btn-normal:focus,.next-btn.disabled.next-btn-normal:hover,.next-btn[disabled].next-btn-normal.active,.next-btn[disabled].next-btn-normal.hover,.next-btn[disabled].next-btn-normal:active,.next-btn[disabled].next-btn-normal:focus,.next-btn[disabled].next-btn-normal:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-primary,.next-btn[disabled].next-btn-primary{background:#fafafa;border-color:#eee}.next-btn.disabled.next-btn-primary,.next-btn.disabled.next-btn-primary.visited,.next-btn.disabled.next-btn-primary:link,.next-btn.disabled.next-btn-primary:visited,.next-btn[disabled].next-btn-primary,.next-btn[disabled].next-btn-primary.visited,.next-btn[disabled].next-btn-primary:link,.next-btn[disabled].next-btn-primary:visited{color:#ccc}.next-btn.disabled.next-btn-primary.active,.next-btn.disabled.next-btn-primary.hover,.next-btn.disabled.next-btn-primary:active,.next-btn.disabled.next-btn-primary:focus,.next-btn.disabled.next-btn-primary:hover,.next-btn[disabled].next-btn-primary.active,.next-btn[disabled].next-btn-primary.hover,.next-btn[disabled].next-btn-primary:active,.next-btn[disabled].next-btn-primary:focus,.next-btn[disabled].next-btn-primary:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn.disabled.next-btn-secondary,.next-btn[disabled].next-btn-secondary{background:#fafafa;border-color:#eee}.next-btn.disabled.next-btn-secondary,.next-btn.disabled.next-btn-secondary.visited,.next-btn.disabled.next-btn-secondary:link,.next-btn.disabled.next-btn-secondary:visited,.next-btn[disabled].next-btn-secondary,.next-btn[disabled].next-btn-secondary.visited,.next-btn[disabled].next-btn-secondary:link,.next-btn[disabled].next-btn-secondary:visited{color:#ccc}.next-btn.disabled.next-btn-secondary.active,.next-btn.disabled.next-btn-secondary.hover,.next-btn.disabled.next-btn-secondary:active,.next-btn.disabled.next-btn-secondary:focus,.next-btn.disabled.next-btn-secondary:hover,.next-btn[disabled].next-btn-secondary.active,.next-btn[disabled].next-btn-secondary.hover,.next-btn[disabled].next-btn-secondary:active,.next-btn[disabled].next-btn-secondary:focus,.next-btn[disabled].next-btn-secondary:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn-warning{border-style:solid}.next-btn-warning.next-btn-primary{background:#d23c26;border-color:#d23c26}.next-btn-warning.next-btn-primary,.next-btn-warning.next-btn-primary.visited,.next-btn-warning.next-btn-primary:link,.next-btn-warning.next-btn-primary:visited{color:#fff}.next-btn-warning.next-btn-primary.active,.next-btn-warning.next-btn-primary.hover,.next-btn-warning.next-btn-primary:active,.next-btn-warning.next-btn-primary:focus,.next-btn-warning.next-btn-primary:hover{color:#fff;background:#b7321e;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary[disabled]{background:#fafafa;border-color:#e6e6e6}.next-btn-warning.next-btn-primary.disabled,.next-btn-warning.next-btn-primary.disabled.visited,.next-btn-warning.next-btn-primary.disabled:link,.next-btn-warning.next-btn-primary.disabled:visited,.next-btn-warning.next-btn-primary[disabled],.next-btn-warning.next-btn-primary[disabled].visited,.next-btn-warning.next-btn-primary[disabled]:link,.next-btn-warning.next-btn-primary[disabled]:visited{color:#ccc}.next-btn-warning.next-btn-primary.disabled.active,.next-btn-warning.next-btn-primary.disabled.hover,.next-btn-warning.next-btn-primary.disabled:active,.next-btn-warning.next-btn-primary.disabled:focus,.next-btn-warning.next-btn-primary.disabled:hover,.next-btn-warning.next-btn-primary[disabled].active,.next-btn-warning.next-btn-primary[disabled].hover,.next-btn-warning.next-btn-primary[disabled]:active,.next-btn-warning.next-btn-primary[disabled]:focus,.next-btn-warning.next-btn-primary[disabled]:hover{color:#ccc;background:#fafafa;border-color:#e6e6e6;text-decoration:none}.next-btn-warning.next-btn-normal{background:#fff;border-color:#d23c26}.next-btn-warning.next-btn-normal,.next-btn-warning.next-btn-normal.visited,.next-btn-warning.next-btn-normal:link,.next-btn-warning.next-btn-normal:visited{color:#d23c26}.next-btn-warning.next-btn-normal.active,.next-btn-warning.next-btn-normal.hover,.next-btn-warning.next-btn-normal:active,.next-btn-warning.next-btn-normal:focus,.next-btn-warning.next-btn-normal:hover{color:#fff;background:#b7321e;border-color:#b7321e;text-decoration:none}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal[disabled]{background:#fafafa;border-color:#eee}.next-btn-warning.next-btn-normal.disabled,.next-btn-warning.next-btn-normal.disabled.visited,.next-btn-warning.next-btn-normal.disabled:link,.next-btn-warning.next-btn-normal.disabled:visited,.next-btn-warning.next-btn-normal[disabled],.next-btn-warning.next-btn-normal[disabled].visited,.next-btn-warning.next-btn-normal[disabled]:link,.next-btn-warning.next-btn-normal[disabled]:visited{color:#ccc}.next-btn-warning.next-btn-normal.disabled.active,.next-btn-warning.next-btn-normal.disabled.hover,.next-btn-warning.next-btn-normal.disabled:active,.next-btn-warning.next-btn-normal.disabled:focus,.next-btn-warning.next-btn-normal.disabled:hover,.next-btn-warning.next-btn-normal[disabled].active,.next-btn-warning.next-btn-normal[disabled].hover,.next-btn-warning.next-btn-normal[disabled]:active,.next-btn-warning.next-btn-normal[disabled]:focus,.next-btn-warning.next-btn-normal[disabled]:hover{color:#ccc;background:#fafafa;border-color:#eee;text-decoration:none}.next-btn-text{border-radius:0;user-select:text}.next-btn-text,.next-btn-text.hover,.next-btn-text:hover{box-shadow:none}.next-btn-text.next-btn-primary{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary,.next-btn-text.next-btn-primary.visited,.next-btn-text.next-btn-primary:link,.next-btn-text.next-btn-primary:visited{color:#298dff}.next-btn-text.next-btn-primary.active,.next-btn-text.next-btn-primary.hover,.next-btn-text.next-btn-primary:active,.next-btn-text.next-btn-primary:focus,.next-btn-text.next-btn-primary:hover{color:#1274e7;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-primary.disabled,.next-btn-text.next-btn-primary.disabled.visited,.next-btn-text.next-btn-primary.disabled:link,.next-btn-text.next-btn-primary.disabled:visited,.next-btn-text.next-btn-primary[disabled],.next-btn-text.next-btn-primary[disabled].visited,.next-btn-text.next-btn-primary[disabled]:link,.next-btn-text.next-btn-primary[disabled]:visited{color:#ccc}.next-btn-text.next-btn-primary.disabled.active,.next-btn-text.next-btn-primary.disabled.hover,.next-btn-text.next-btn-primary.disabled:active,.next-btn-text.next-btn-primary.disabled:focus,.next-btn-text.next-btn-primary.disabled:hover,.next-btn-text.next-btn-primary[disabled].active,.next-btn-text.next-btn-primary[disabled].hover,.next-btn-text.next-btn-primary[disabled]:active,.next-btn-text.next-btn-primary[disabled]:focus,.next-btn-text.next-btn-primary[disabled]:hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary,.next-btn-text.next-btn-secondary.visited,.next-btn-text.next-btn-secondary:link,.next-btn-text.next-btn-secondary:visited{color:#666}.next-btn-text.next-btn-secondary.active,.next-btn-text.next-btn-secondary.hover,.next-btn-text.next-btn-secondary:active,.next-btn-text.next-btn-secondary:focus,.next-btn-text.next-btn-secondary:hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-secondary.disabled,.next-btn-text.next-btn-secondary.disabled.visited,.next-btn-text.next-btn-secondary.disabled:link,.next-btn-text.next-btn-secondary.disabled:visited,.next-btn-text.next-btn-secondary[disabled],.next-btn-text.next-btn-secondary[disabled].visited,.next-btn-text.next-btn-secondary[disabled]:link,.next-btn-text.next-btn-secondary[disabled]:visited{color:#ccc}.next-btn-text.next-btn-secondary.disabled.active,.next-btn-text.next-btn-secondary.disabled.hover,.next-btn-text.next-btn-secondary.disabled:active,.next-btn-text.next-btn-secondary.disabled:focus,.next-btn-text.next-btn-secondary.disabled:hover,.next-btn-text.next-btn-secondary[disabled].active,.next-btn-text.next-btn-secondary[disabled].hover,.next-btn-text.next-btn-secondary[disabled]:active,.next-btn-text.next-btn-secondary[disabled]:focus,.next-btn-text.next-btn-secondary[disabled]:hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal,.next-btn-text.next-btn-normal.visited,.next-btn-text.next-btn-normal:link,.next-btn-text.next-btn-normal:visited{color:#333}.next-btn-text.next-btn-normal.active,.next-btn-text.next-btn-normal.hover,.next-btn-text.next-btn-normal:active,.next-btn-text.next-btn-normal:focus,.next-btn-text.next-btn-normal:hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal[disabled]{background:transparent;border-color:transparent}.next-btn-text.next-btn-normal.disabled,.next-btn-text.next-btn-normal.disabled.visited,.next-btn-text.next-btn-normal.disabled:link,.next-btn-text.next-btn-normal.disabled:visited,.next-btn-text.next-btn-normal[disabled],.next-btn-text.next-btn-normal[disabled].visited,.next-btn-text.next-btn-normal[disabled]:link,.next-btn-text.next-btn-normal[disabled]:visited{color:#ccc}.next-btn-text.next-btn-normal.disabled.active,.next-btn-text.next-btn-normal.disabled.hover,.next-btn-text.next-btn-normal.disabled:active,.next-btn-text.next-btn-normal.disabled:focus,.next-btn-text.next-btn-normal.disabled:hover,.next-btn-text.next-btn-normal[disabled].active,.next-btn-text.next-btn-normal[disabled].hover,.next-btn-text.next-btn-normal[disabled]:active,.next-btn-text.next-btn-normal[disabled]:focus,.next-btn-text.next-btn-normal[disabled]:hover{color:#ccc;background:transparent;border-color:transparent;text-decoration:none}.next-btn-text.next-large{border-radius:0;padding:0;height:24px;font-size:14px;border-width:0}.next-btn-text.next-large>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-large>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-large>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-large.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-large.next-btn-loading>.next-icon{display:none}.next-btn-text.next-large>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-large>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-medium{border-radius:0;padding:0;height:20px;font-size:14px;border-width:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-medium>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-medium>.next-btn-icon.next-icon-alone:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text.next-medium.next-btn-loading:before{width:20px;height:20px;font-size:20px;line-height:20px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-medium.next-btn-loading>.next-icon{display:none}.next-btn-text.next-medium>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-medium>.next-btn-custom-loading-icon.show{width:20px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-small{border-radius:0;padding:0;height:16px;font-size:12px;border-width:0}.next-btn-text.next-small>.next-btn-icon.next-icon-first{transform:scale(1);margin-left:0;margin-right:4px}.next-btn-text.next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-last{transform:scale(1);margin-left:4px;margin-right:0}.next-btn-text.next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small>.next-btn-icon.next-icon-alone{transform:scale(1)}.next-btn-text.next-small>.next-btn-icon.next-icon-alone .next-icon-remote,.next-btn-text.next-small>.next-btn-icon.next-icon-alone:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text.next-small.next-btn-loading:before{width:12px;height:12px;font-size:12px;line-height:12px;left:0;top:50%;text-align:center;margin-right:4px}.next-btn-text.next-small.next-btn-loading>.next-icon{display:none}.next-btn-text.next-small>.next-btn-custom-loading-icon{opacity:0;width:0}.next-btn-text.next-small>.next-btn-custom-loading-icon.show{width:12px;margin-right:4px;opacity:1;transition:all .1s linear}.next-btn-text.next-btn-loading{background:transparent;border-color:transparent}.next-btn-text.next-btn-loading,.next-btn-text.next-btn-loading.visited,.next-btn-text.next-btn-loading:link,.next-btn-text.next-btn-loading:visited{color:#333}.next-btn-text.next-btn-loading.active,.next-btn-text.next-btn-loading.hover,.next-btn-text.next-btn-loading:active,.next-btn-text.next-btn-loading:focus,.next-btn-text.next-btn-loading:hover{color:#333;background:transparent;border-color:transparent;text-decoration:none}.next-btn-loading{pointer-events:none}.next-btn-loading:before{font-family:NextIcon;content:"";opacity:1;visibility:visible;animation:loadingCircle 2s linear infinite}.next-btn-loading:after{content:"";display:inline-block;position:static;height:100%;width:0;vertical-align:middle}.next-btn-custom-loading{pointer-events:none}.next-btn-ghost{box-shadow:none;border-style:solid}.next-btn-ghost.next-btn-dark{background:transparent;border-color:#fff}.next-btn-ghost.next-btn-dark,.next-btn-ghost.next-btn-dark.visited,.next-btn-ghost.next-btn-dark:link,.next-btn-ghost.next-btn-dark:visited{color:#fff}.next-btn-ghost.next-btn-dark.active,.next-btn-ghost.next-btn-dark.hover,.next-btn-ghost.next-btn-dark:active,.next-btn-ghost.next-btn-dark:focus,.next-btn-ghost.next-btn-dark:hover{color:#fff;background:hsla(0,0%,100%,.8);border-color:#fff;text-decoration:none}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark[disabled]{background:transparent;border-color:hsla(0,0%,100%,.4)}.next-btn-ghost.next-btn-dark.disabled,.next-btn-ghost.next-btn-dark.disabled.visited,.next-btn-ghost.next-btn-dark.disabled:link,.next-btn-ghost.next-btn-dark.disabled:visited,.next-btn-ghost.next-btn-dark[disabled],.next-btn-ghost.next-btn-dark[disabled].visited,.next-btn-ghost.next-btn-dark[disabled]:link,.next-btn-ghost.next-btn-dark[disabled]:visited{color:hsla(0,0%,100%,.4)}.next-btn-ghost.next-btn-dark.disabled.active,.next-btn-ghost.next-btn-dark.disabled.hover,.next-btn-ghost.next-btn-dark.disabled:active,.next-btn-ghost.next-btn-dark.disabled:focus,.next-btn-ghost.next-btn-dark.disabled:hover,.next-btn-ghost.next-btn-dark[disabled].active,.next-btn-ghost.next-btn-dark[disabled].hover,.next-btn-ghost.next-btn-dark[disabled]:active,.next-btn-ghost.next-btn-dark[disabled]:focus,.next-btn-ghost.next-btn-dark[disabled]:hover{color:hsla(0,0%,100%,.4);background:transparent;border-color:hsla(0,0%,100%,.4);text-decoration:none}.next-btn-ghost.next-btn-light{background:transparent;border-color:#333}.next-btn-ghost.next-btn-light,.next-btn-ghost.next-btn-light.visited,.next-btn-ghost.next-btn-light:link,.next-btn-ghost.next-btn-light:visited{color:#333}.next-btn-ghost.next-btn-light.active,.next-btn-ghost.next-btn-light.hover,.next-btn-ghost.next-btn-light:active,.next-btn-ghost.next-btn-light:focus,.next-btn-ghost.next-btn-light:hover{color:#999;background:rgba(0,0,0,.92);border-color:#333;text-decoration:none}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light[disabled]{background:transparent;border-color:rgba(0,0,0,.1)}.next-btn-ghost.next-btn-light.disabled,.next-btn-ghost.next-btn-light.disabled.visited,.next-btn-ghost.next-btn-light.disabled:link,.next-btn-ghost.next-btn-light.disabled:visited,.next-btn-ghost.next-btn-light[disabled],.next-btn-ghost.next-btn-light[disabled].visited,.next-btn-ghost.next-btn-light[disabled]:link,.next-btn-ghost.next-btn-light[disabled]:visited{color:rgba(0,0,0,.1)}.next-btn-ghost.next-btn-light.disabled.active,.next-btn-ghost.next-btn-light.disabled.hover,.next-btn-ghost.next-btn-light.disabled:active,.next-btn-ghost.next-btn-light.disabled:focus,.next-btn-ghost.next-btn-light.disabled:hover,.next-btn-ghost.next-btn-light[disabled].active,.next-btn-ghost.next-btn-light[disabled].hover,.next-btn-ghost.next-btn-light[disabled]:active,.next-btn-ghost.next-btn-light[disabled]:focus,.next-btn-ghost.next-btn-light[disabled]:hover{color:rgba(0,0,0,.1);background:transparent;border-color:rgba(0,0,0,.1);text-decoration:none}.next-btn-group{position:relative;display:inline-block;vertical-align:middle}.next-btn-group>.next-btn{position:relative;float:left;box-shadow:none}.next-btn-group>.next-btn.active,.next-btn-group>.next-btn:active,.next-btn-group>.next-btn:focus,.next-btn-group>.next-btn:hover{z-index:1}.next-btn-group>.next-btn.disabled,.next-btn-group>.next-btn[disabled]{z-index:0}.next-btn-group .next-btn.next-btn{margin:0 0 0 -1px}.next-btn-group .next-btn:not(:first-child):not(:last-child){border-radius:0}.next-btn-group>.next-btn:first-child{margin:0}.next-btn-group>.next-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group>.next-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group>.next-btn-primary:not(:first-child){border-left-color:hsla(0,0%,100%,.2)}.next-btn-group>.next-btn-primary:not(:first-child):hover{border-left-color:transparent}.next-btn-group>.next-btn-primary:not(:first-child).disabled,.next-btn-group>.next-btn-primary:not(:first-child)[disabled]{border-left-color:#eee}.next-btn-group[dir=rtl]>.next-btn{float:right}.next-btn-group[dir=rtl] .next-btn.next-btn{margin:0 -1px 0 0}.next-btn-group[dir=rtl]>.next-btn:first-child:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.next-btn-group[dir=rtl]>.next-btn:last-child:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child){border-right-color:hsla(0,0%,100%,.2)}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child):hover{border-right-color:transparent}.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child).disabled,.next-btn-group[dir=rtl]>.next-btn-primary:not(:first-child)[disabled]{border-right-color:#eee}.next-btn.next-small[dir=rtl]{border-radius:3px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-small[dir=rtl]>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn.next-small[dir=rtl].next-btn-loading{padding-left:16px;padding-right:32px}.next-btn.next-small[dir=rtl].next-btn-loading:after{right:16px;top:50%;margin-right:0;margin-left:4px}.next-btn.next-medium[dir=rtl]{border-radius:3px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-medium[dir=rtl]>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-medium[dir=rtl].next-btn-loading{padding-left:20px;padding-right:44px}.next-btn.next-medium[dir=rtl].next-btn-loading:after{right:20px;top:50%;margin-right:0;margin-left:4px}.next-btn.next-large[dir=rtl]{border-radius:3px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn.next-large[dir=rtl]>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn.next-large[dir=rtl].next-btn-loading{padding-left:24px;padding-right:48px}.next-btn.next-large[dir=rtl].next-btn-loading:after{right:24px;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-large{border-radius:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-large>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-large.next-btn-loading{padding-left:0;padding-right:24px}.next-btn-text[dir=rtl].next-large.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-medium{border-radius:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-first:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-medium>.next-btn-icon.next-icon-last:before{width:20px;font-size:20px;line-height:inherit}.next-btn-text[dir=rtl].next-medium.next-btn-loading{padding-left:0;padding-right:24px}.next-btn-text[dir=rtl].next-medium.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-btn-text[dir=rtl].next-small{border-radius:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first{margin-left:4px;margin-right:0}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first .next-icon-remote,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-first:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last{margin-left:0;margin-right:4px}.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last .next-icon-remote,.next-btn-text[dir=rtl].next-small>.next-btn-icon.next-icon-last:before{width:12px;font-size:12px;line-height:inherit}.next-btn-text[dir=rtl].next-small.next-btn-loading{padding-left:0;padding-right:16px}.next-btn-text[dir=rtl].next-small.next-btn-loading:after{right:0;top:50%;margin-right:0;margin-left:4px}.next-input{vertical-align:middle;display:inline-table;border-collapse:separate;font-size:0;line-height:1;width:200px;border-spacing:0;transition:all .1s linear;border:1px solid #ddd;background-color:#fff}.next-input,.next-input *,.next-input :after,.next-input :before{box-sizing:border-box}.next-input input{height:100%}.next-input input[type=reset],.next-input input[type=submit]{-webkit-appearance:button;cursor:pointer}.next-input input::-moz-focus-inner{border:0;padding:0}.next-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #fff inset;border-radius:3px}.next-input input[type=password]::-ms-reveal{display:none}.next-input textarea{resize:none}.next-input input,.next-input textarea{width:100%;border:none;outline:none;padding:0;margin:0;font-weight:400;vertical-align:middle;background-color:transparent;color:#333}.next-input input::-ms-clear,.next-input textarea::-ms-clear{display:none}.next-input.next-small{height:24px;border-radius:3px}.next-input.next-small .next-input-label{padding-left:8px;font-size:12px}.next-input.next-small .next-input-inner{font-size:12px}.next-input.next-small .next-input-control,.next-input.next-small .next-input-inner-text{padding-right:4px}.next-input.next-small input{height:22px;line-height:22px \0 ;padding:0 4px;font-size:12px}.next-input.next-small input::placeholder{font-size:12px}.next-input.next-small .next-input-text-field{padding:0 4px;font-size:12px;height:22px;line-height:22px}.next-input.next-small .next-icon .next-icon-remote,.next-input.next-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-input.next-small .next-input-control{border-radius:0 3px 3px 0}.next-input.next-medium{height:32px;border-radius:3px}.next-input.next-medium .next-input-label{padding-left:8px;font-size:14px}.next-input.next-medium .next-input-inner{font-size:14px}.next-input.next-medium .next-input-control,.next-input.next-medium .next-input-inner-text{padding-right:8px}.next-input.next-medium input{height:30px;line-height:30px \0 ;padding:0 8px;font-size:14px}.next-input.next-medium input::placeholder{font-size:14px}.next-input.next-medium .next-input-text-field{padding:0 8px;font-size:14px;height:30px;line-height:30px}.next-input.next-medium .next-icon .next-icon-remote,.next-input.next-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-input.next-medium .next-input-control{border-radius:0 3px 3px 0}.next-input.next-large{height:40px;border-radius:3px}.next-input.next-large .next-input-label{padding-left:12px;font-size:16px}.next-input.next-large .next-input-inner{font-size:16px}.next-input.next-large .next-input-control,.next-input.next-large .next-input-inner-text{padding-right:8px}.next-input.next-large input{height:38px;line-height:38px \0 ;padding:0 12px;font-size:16px}.next-input.next-large input::placeholder{font-size:16px}.next-input.next-large .next-input-text-field{padding:0 12px;font-size:16px;height:38px;line-height:38px}.next-input.next-large .next-icon .next-icon-remote,.next-input.next-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-input.next-large .next-input-control{border-radius:0 3px 3px 0}.next-input.next-input-textarea{height:auto;border-radius:3px;font-size:0}.next-input.next-input-textarea textarea{color:#333;padding:4px 8px;font-size:14px;border-radius:3px}.next-input.next-input-textarea.next-small textarea{font-size:14px}.next-input.next-input-textarea.next-large textarea{font-size:16px}.next-input.next-input-textarea .next-input-control{display:block;width:auto;border-radius:3px}.next-input.next-input-textarea .next-input-len{padding:0 8px 4px;display:block;text-align:right;width:auto}.next-input-hint-wrap{color:#999;position:relative}.next-input-hint-wrap .next-input-clear{opacity:0;z-index:1;position:absolute}.next-input-hint-wrap .next-input-hint{opacity:1}.next-input .next-icon-eye-close:hover,.next-input .next-icon-eye:hover,.next-input .next-input-clear-icon:hover{cursor:pointer;color:#666}.next-input .next-input-hover-show{opacity:0}.next-input.next-focus,.next-input:hover{border-color:#ccc;background-color:#fff}.next-input.next-focus .next-input-clear,.next-input:hover .next-input-clear{opacity:1}.next-input.next-focus .next-input-clear+.next-input-hint,.next-input:hover .next-input-clear+.next-input-hint{opacity:0}.next-input.next-focus .next-input-hover-show,.next-input .next-input-clear:focus,.next-input:hover .next-input-hover-show{opacity:1}.next-input .next-input-clear:focus+.next-input-hint{opacity:0}.next-input.next-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-input.next-warning{border-color:#f1c826;background-color:#fff}.next-input.next-warning.next-focus,.next-input.next-warning:hover{border-color:#f1c826}.next-input.next-warning.next-focus{box-shadow:0 0 0 2px rgba(241,200,38,.2)}.next-input.next-error{border-color:#d23c26;background-color:#fff}.next-input.next-error input,.next-input.next-error textarea{color:#333}.next-input.next-error.next-focus,.next-input.next-error:hover{border-color:#d23c26}.next-input.next-error.next-focus{box-shadow:0 0 0 2px rgba(210,60,38,.2)}.next-input.next-hidden{display:none}.next-input.next-noborder{border:none;box-shadow:none}.next-input-control .next-input-len{font-size:12px;line-height:12px;color:#999;display:table-cell;width:1px;vertical-align:bottom}.next-input-control .next-input-len.next-error{color:#d23c26}.next-input-control .next-input-len.next-warning{color:#f1c826}.next-input-control>*{display:table-cell;width:1%;top:0}.next-input-control>:not(:last-child){padding-right:4px}.next-input-control .next-icon{transition:all .1s linear;color:#999}.next-input-control .next-input-warning-icon{color:#f1c826}.next-input-control .next-input-warning-icon:before{content:""}.next-input-control .next-input-success-icon{color:#1ad78c}.next-input-control .next-input-success-icon:before{content:""}.next-input-control .next-input-loading-icon{color:#298dff}.next-input-control .next-input-loading-icon:before{content:"";animation:loadingCircle 1s linear infinite}.next-input-control .next-input-clear-icon:before{content:""}.next-input-inner-text,.next-input-label{color:#666}.next-input input::-moz-placeholder,.next-input textarea::-moz-placeholder{color:#ccc;opacity:1}.next-input input:-ms-input-placeholder,.next-input textarea:-ms-input-placeholder{color:#ccc}.next-input input::-webkit-input-placeholder,.next-input textarea::-webkit-input-placeholder{color:#ccc}.next-input.next-disabled{color:#ccc;cursor:not-allowed}.next-input.next-disabled,.next-input.next-disabled:hover{border-color:#eee;background-color:#fafafa}.next-input.next-disabled input,.next-input.next-disabled textarea{-webkit-text-fill-color:#ccc;color:#ccc}.next-input.next-disabled input::-moz-placeholder,.next-input.next-disabled textarea::-moz-placeholder{color:#ccc;opacity:1}.next-input.next-disabled input:-ms-input-placeholder,.next-input.next-disabled textarea:-ms-input-placeholder{color:#ccc}.next-input.next-disabled input::-webkit-input-placeholder,.next-input.next-disabled textarea::-webkit-input-placeholder{color:#ccc}.next-input.next-disabled .next-input-hint-wrap,.next-input.next-disabled .next-input-inner-text,.next-input.next-disabled .next-input-label,.next-input.next-disabled .next-input-len{color:#ccc}.next-input.next-disabled .next-input-hint-wrap .next-input-clear{opacity:0}.next-input.next-disabled .next-input-hint-wrap .next-input-hint{opacity:1}.next-input.next-disabled .next-input-hint-wrap .next-input-clear-icon:hover{cursor:not-allowed;color:#ccc}.next-input.next-disabled .next-icon{color:#ccc}.next-input-control,.next-input-inner,.next-input-label{display:table-cell;width:1px;vertical-align:middle;line-height:1;background-color:transparent;white-space:nowrap}.next-input-group{display:inline-table;border-collapse:separate;border-spacing:0;line-height:0;width:100%}.next-input-group,.next-input-group *,.next-input-group :after,.next-input-group :before{box-sizing:border-box}.next-input-group-auto-width{width:100%;border-radius:0!important}.next-input-group>.next-input{border-radius:0}.next-input-group>.next-input.next-focus{position:relative;z-index:1}.next-input-group>.next-input:first-child.next-large,.next-input-group>.next-input:first-child.next-medium,.next-input-group>.next-input:first-child.next-small{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-input-group>.next-input:last-child.next-large,.next-input-group>.next-input:last-child.next-medium,.next-input-group>.next-input:last-child.next-small{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group-addon{width:1px;display:table-cell;vertical-align:middle;white-space:nowrap}.next-input-group-addon:first-child,.next-input-group-addon:first-child>*{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*{margin-right:-1px}.next-input-group-addon:first-child>.next-focus{position:relative;z-index:1}.next-input-group-addon:first-child>*>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group-addon:first-child>*>.next-input.next-focus{position:relative;z-index:1}.next-input-group-addon:last-child,.next-input-group-addon:last-child>*{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-addon:last-child>*{margin-left:-1px}.next-input-group-addon:last-child>*>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group-text{color:#999;background-color:#f9f9f9;text-align:center;border:1px solid #ddd;padding:0 8px}.next-input-group-text:first-child{border-right-width:0}.next-input-group-text:last-child{border-left-width:0}.next-input-group-text.next-disabled{color:#ccc;cursor:not-allowed}.next-input-group-text.next-disabled,.next-input-group-text.next-disabled:hover{border-color:#eee;background-color:#fafafa}.next-input-group-text.next-small{font-size:12px;border-radius:3px}.next-input-group-text.next-medium{font-size:14px;border-radius:3px}.next-input-group-text.next-large{font-size:16px;border-radius:3px}.next-input[dir=rtl].next-small .next-input-label{padding-left:0;padding-right:8px}.next-input[dir=rtl].next-small .next-input-control{padding-right:0;padding-left:4px}.next-input[dir=rtl].next-medium .next-input-label{padding-left:0;padding-right:8px}.next-input[dir=rtl].next-medium .next-input-control{padding-right:0;padding-left:8px}.next-input[dir=rtl].next-large .next-input-label{padding-left:0;padding-right:12px}.next-input[dir=rtl].next-large .next-input-control{padding-right:0;padding-left:8px}.next-input[dir=rtl].next-input-textarea .next-input-len{text-align:left}.next-input[dir=rtl] .next-input-control>:not(:last-child){padding-left:4px;padding-right:0}.next-input-group[dir=rtl]>.next-input:first-child.next-large,.next-input-group[dir=rtl]>.next-input:first-child.next-medium,.next-input-group[dir=rtl]>.next-input:first-child.next-small{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-input-group[dir=rtl]>.next-input:last-child.next-large,.next-input-group[dir=rtl]>.next-input:last-child.next-medium,.next-input-group[dir=rtl]>.next-input:last-child.next-small{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>*>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:first-child>.next-input.next-small{border-bottom-right-radius:3px!important;border-top-right-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:first-child>*{margin-left:-1px;border-bottom-left-radius:0!important;border-top-left-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>*>.next-input.next-small,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-large,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-medium,.next-input-group[dir=rtl] .next-input-group-addon:last-child>.next-input.next-small{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.next-input-group[dir=rtl] .next-input-group-addon:last-child>*{margin-right:-1px;border-bottom-right-radius:0!important;border-top-right-radius:0!important}.next-input-group[dir=rtl] .next-input-group-text:first-child{border-right-width:1px;border-left:0}.next-input-group[dir=rtl] .next-input-group-text:last-child{border-left-width:1px;border-right:0}.next-calendar,.next-calendar *,.next-calendar :after,.next-calendar :before{box-sizing:border-box}.next-calendar table{border-collapse:collapse;border-spacing:0}.next-calendar td,.next-calendar th{padding:0}@keyframes cellZoomIn{0%{transform:scale(.5)}to{transform:scale(1)}}@keyframes cellHover{0%{opacity:0}to{opacity:1}}@keyframes enterToLeft{0%{transform:translate(-40%);opacity:0}50%{opacity:.6}to{opacity:1;transform:translate(0)}}@keyframes enterToRight{0%{transform:translate(40%);opacity:0}50%{opacity:.6}to{opacity:1;transform:translate(0)}}.next-calendar-card .next-calendar-header,.next-calendar-fullscreen .next-calendar-header{text-align:right}.next-calendar-card .next-calendar-header .next-select,.next-calendar-fullscreen .next-calendar-header .next-select{margin-right:4px;vertical-align:top}.next-calendar-card .next-calendar-header .next-menu,.next-calendar-fullscreen .next-calendar-header .next-menu{text-align:left}.next-calendar-card .next-calendar-header,.next-calendar-fullscreen .next-calendar-header{margin-bottom:8px}.next-calendar-panel-header{position:relative;background:#fff;margin-bottom:8px;border-bottom:1px solid transparent}.next-calendar-panel-header-full,.next-calendar-panel-header-left,.next-calendar-panel-header-right{height:32px;line-height:32px}.next-calendar-panel-header-full .next-calendar-btn,.next-calendar-panel-header-left .next-calendar-btn,.next-calendar-panel-header-right .next-calendar-btn{vertical-align:top;font-weight:700;margin:0 4px;background:transparent;border-color:transparent}.next-calendar-panel-header-full .next-calendar-btn,.next-calendar-panel-header-full .next-calendar-btn.visited,.next-calendar-panel-header-full .next-calendar-btn:link,.next-calendar-panel-header-full .next-calendar-btn:visited,.next-calendar-panel-header-left .next-calendar-btn,.next-calendar-panel-header-left .next-calendar-btn.visited,.next-calendar-panel-header-left .next-calendar-btn:link,.next-calendar-panel-header-left .next-calendar-btn:visited,.next-calendar-panel-header-right .next-calendar-btn,.next-calendar-panel-header-right .next-calendar-btn.visited,.next-calendar-panel-header-right .next-calendar-btn:link,.next-calendar-panel-header-right .next-calendar-btn:visited{color:#000}.next-calendar-panel-header-full .next-calendar-btn.active,.next-calendar-panel-header-full .next-calendar-btn.hover,.next-calendar-panel-header-full .next-calendar-btn:active,.next-calendar-panel-header-full .next-calendar-btn:focus,.next-calendar-panel-header-full .next-calendar-btn:hover,.next-calendar-panel-header-left .next-calendar-btn.active,.next-calendar-panel-header-left .next-calendar-btn.hover,.next-calendar-panel-header-left .next-calendar-btn:active,.next-calendar-panel-header-left .next-calendar-btn:focus,.next-calendar-panel-header-left .next-calendar-btn:hover,.next-calendar-panel-header-right .next-calendar-btn.active,.next-calendar-panel-header-right .next-calendar-btn.hover,.next-calendar-panel-header-right .next-calendar-btn:active,.next-calendar-panel-header-right .next-calendar-btn:focus,.next-calendar-panel-header-right .next-calendar-btn:hover{color:#fff;background:transparent;border-color:transparent;text-decoration:none}.next-calendar-panel-header-left,.next-calendar-panel-header-right{display:inline-block;width:50%;text-align:center}.next-calendar-panel-header-full{width:100%;text-align:center}.next-calendar-panel-menu{max-height:210px;overflow:auto;text-align:left}.next-calendar-btn{cursor:pointer;padding:0;margin:0;border:0;background:transparent;outline:none;height:100%}.next-calendar-btn>.next-icon.next-icon .next-icon-remote,.next-calendar-btn>.next-icon.next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-calendar-btn .next-icon{margin-left:4px}.next-calendar-btn-next-decade,.next-calendar-btn-next-month,.next-calendar-btn-next-year,.next-calendar-btn-prev-decade,.next-calendar-btn-prev-month,.next-calendar-btn-prev-year{position:absolute;top:0;background:transparent;border-color:transparent}.next-calendar-btn-next-decade,.next-calendar-btn-next-decade.visited,.next-calendar-btn-next-decade:link,.next-calendar-btn-next-decade:visited,.next-calendar-btn-next-month,.next-calendar-btn-next-month.visited,.next-calendar-btn-next-month:link,.next-calendar-btn-next-month:visited,.next-calendar-btn-next-year,.next-calendar-btn-next-year.visited,.next-calendar-btn-next-year:link,.next-calendar-btn-next-year:visited,.next-calendar-btn-prev-decade,.next-calendar-btn-prev-decade.visited,.next-calendar-btn-prev-decade:link,.next-calendar-btn-prev-decade:visited,.next-calendar-btn-prev-month,.next-calendar-btn-prev-month.visited,.next-calendar-btn-prev-month:link,.next-calendar-btn-prev-month:visited,.next-calendar-btn-prev-year,.next-calendar-btn-prev-year.visited,.next-calendar-btn-prev-year:link,.next-calendar-btn-prev-year:visited{color:#666}.next-calendar-btn-next-decade.active,.next-calendar-btn-next-decade.hover,.next-calendar-btn-next-decade:active,.next-calendar-btn-next-decade:focus,.next-calendar-btn-next-decade:hover,.next-calendar-btn-next-month.active,.next-calendar-btn-next-month.hover,.next-calendar-btn-next-month:active,.next-calendar-btn-next-month:focus,.next-calendar-btn-next-month:hover,.next-calendar-btn-next-year.active,.next-calendar-btn-next-year.hover,.next-calendar-btn-next-year:active,.next-calendar-btn-next-year:focus,.next-calendar-btn-next-year:hover,.next-calendar-btn-prev-decade.active,.next-calendar-btn-prev-decade.hover,.next-calendar-btn-prev-decade:active,.next-calendar-btn-prev-decade:focus,.next-calendar-btn-prev-decade:hover,.next-calendar-btn-prev-month.active,.next-calendar-btn-prev-month.hover,.next-calendar-btn-prev-month:active,.next-calendar-btn-prev-month:focus,.next-calendar-btn-prev-month:hover,.next-calendar-btn-prev-year.active,.next-calendar-btn-prev-year.hover,.next-calendar-btn-prev-year:active,.next-calendar-btn-prev-year:focus,.next-calendar-btn-prev-year:hover{color:#209bfa;background:transparent;border-color:transparent;text-decoration:none}.next-calendar-btn-prev-decade,.next-calendar-btn-prev-year{left:8px}.next-calendar-btn-prev-month{left:28px}.next-calendar-btn-next-month{right:28px}.next-calendar-btn-next-decade,.next-calendar-btn-next-year{right:8px}.next-calendar-fullscreen .next-calendar-th{text-align:right;color:#333;font-size:16px;font-weight:700;padding-right:12px;padding-bottom:4px}.next-calendar-fullscreen .next-calendar-cell{font-size:14px}.next-calendar-fullscreen .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell.next-selected .next-calendar-month{font-weight:700;background:#add9ff;color:#209bfa;border-color:#209bfa}.next-calendar-fullscreen .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell.next-disabled .next-calendar-month{cursor:not-allowed;background:#fafafa;color:#ccc;border-color:#eee}.next-calendar-fullscreen .next-calendar-date,.next-calendar-fullscreen .next-calendar-month{text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 4px;padding:4px 8px;min-height:80px;transition:background .1s linear;background:#fff;color:#333;border-color:currentcolor #e6e6e6 #e6e6e6;border-top:2px solid #e6e6e6}.next-calendar-fullscreen .next-calendar-date:hover,.next-calendar-fullscreen .next-calendar-month:hover{background:#add9ff;color:#209bfa;border-color:#209bfa}.next-calendar-fullscreen .next-calendar-cell-next-month .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell-prev-month .next-calendar-date{background:transparent;color:#ccc;border-color:transparent}.next-calendar-fullscreen .next-calendar-cell-current .next-calendar-date,.next-calendar-fullscreen .next-calendar-cell-current .next-calendar-month{font-weight:700;background:#fff;color:#209bfa;border-color:#209bfa}.next-calendar-card .next-calendar-th,.next-calendar-panel .next-calendar-th,.next-calendar-range .next-calendar-th{text-align:center;color:#999;font-size:12px;font-weight:400}.next-calendar-card .next-calendar-cell,.next-calendar-panel .next-calendar-cell,.next-calendar-range .next-calendar-cell{text-align:center;font-size:12px}.next-calendar-card .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-card .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-card .next-calendar-cell.next-selected .next-calendar-year,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-panel .next-calendar-cell.next-selected .next-calendar-year,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-date,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-month,.next-calendar-range .next-calendar-cell.next-selected .next-calendar-year{animation:cellZoomIn .4s cubic-bezier(.23,1,.32,1);font-weight:700;background:#209bfa;color:#fff;border-color:#209bfa}.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-card .next-calendar-cell.next-disabled .next-calendar-year,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-panel .next-calendar-cell.next-disabled .next-calendar-year,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-date,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-month,.next-calendar-range .next-calendar-cell.next-disabled .next-calendar-year{cursor:not-allowed;background:#fafafa;color:#ccc;border-color:#fafafa}.next-calendar-card .next-calendar-cell.next-inrange .next-calendar-date,.next-calendar-panel .next-calendar-cell.next-inrange .next-calendar-date,.next-calendar-range .next-calendar-cell.next-inrange .next-calendar-date{background:#e4f3fe;color:#209bfa;border-color:#e4f3fe}.next-calendar-card .next-calendar-date,.next-calendar-card .next-calendar-month,.next-calendar-card .next-calendar-year,.next-calendar-panel .next-calendar-date,.next-calendar-panel .next-calendar-month,.next-calendar-panel .next-calendar-year,.next-calendar-range .next-calendar-date,.next-calendar-range .next-calendar-month,.next-calendar-range .next-calendar-year{text-align:center;background:#fff;color:#666;border:1px solid #fff}.next-calendar-card .next-calendar-date:hover,.next-calendar-card .next-calendar-month:hover,.next-calendar-card .next-calendar-year:hover,.next-calendar-panel .next-calendar-date:hover,.next-calendar-panel .next-calendar-month:hover,.next-calendar-panel .next-calendar-year:hover,.next-calendar-range .next-calendar-date:hover,.next-calendar-range .next-calendar-month:hover,.next-calendar-range .next-calendar-year:hover{cursor:pointer;background:#e4f3fe;color:#209bfa;border-color:#e4f3fe}.next-calendar-card .next-calendar-date,.next-calendar-panel .next-calendar-date,.next-calendar-range .next-calendar-date{width:24px;height:24px;line-height:22px;margin:4px auto;border-radius:3px}.next-calendar-card .next-calendar-month,.next-calendar-panel .next-calendar-month,.next-calendar-range .next-calendar-month{width:60px;height:24px;line-height:22px;margin:8px auto;border-radius:3px}.next-calendar-card .next-calendar-year,.next-calendar-panel .next-calendar-year,.next-calendar-range .next-calendar-year{width:48px;height:24px;line-height:22px;margin:8px auto;border-radius:3px}.next-calendar-card .next-calendar-cell-next-month .next-calendar-date,.next-calendar-card .next-calendar-cell-prev-month .next-calendar-date,.next-calendar-panel .next-calendar-cell-next-month .next-calendar-date,.next-calendar-panel .next-calendar-cell-prev-month .next-calendar-date,.next-calendar-range .next-calendar-cell-next-month .next-calendar-date,.next-calendar-range .next-calendar-cell-prev-month .next-calendar-date{background:#fff;color:#ccc;border-color:#fff}.next-calendar-card .next-calendar-cell-current .next-calendar-date,.next-calendar-card .next-calendar-cell-current .next-calendar-month,.next-calendar-card .next-calendar-cell-current .next-calendar-year,.next-calendar-panel .next-calendar-cell-current .next-calendar-date,.next-calendar-panel .next-calendar-cell-current .next-calendar-month,.next-calendar-panel .next-calendar-cell-current .next-calendar-year,.next-calendar-range .next-calendar-cell-current .next-calendar-date,.next-calendar-range .next-calendar-cell-current .next-calendar-month,.next-calendar-range .next-calendar-cell-current .next-calendar-year{font-weight:700;background:#fff;color:#209bfa;border-color:transparent}.next-calendar-panel.next-calendar-week .next-calendar-tbody tr{cursor:pointer}.next-calendar-panel.next-calendar-week .next-calendar-tbody tr:hover .next-calendar-cell .next-calendar-date{background:#e4f3fe;color:#209bfa;border-color:#e4f3fe}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-cell.next-selected .next-calendar-date{font-weight:400;background:transparent;border-color:transparent}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date{position:relative;color:#209bfa}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date:before{content:"";position:absolute;left:-1px;top:-1px;bottom:-1px;right:-1px;background:#e4f3fe;border:1px solid #e4f3fe;border-radius:3px}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-date>span{position:relative}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-end,.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-start{color:#fff}.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-end:before,.next-calendar-panel.next-calendar-week .next-calendar-tbody .next-calendar-week-active-start:before{background:#209bfa;border-color:#209bfa}.next-calendar[dir=rtl] .next-calendar-header{text-align:left}.next-calendar[dir=rtl] .next-calendar-header .next-select{margin-right:0;margin-left:4px}.next-calendar[dir=rtl] .next-calendar-header .next-menu{text-align:right}.next-calendar[dir=rtl] .next-calendar-btn-prev-decade,.next-calendar[dir=rtl] .next-calendar-btn-prev-year{left:auto;right:8px}.next-calendar[dir=rtl] .next-calendar-btn-prev-month{left:auto;right:28px}.next-calendar[dir=rtl] .next-calendar-btn-next-month{right:auto;left:28px}.next-calendar[dir=rtl] .next-calendar-btn-next-decade,.next-calendar[dir=rtl] .next-calendar-btn-next-year{right:auto;left:8px}.next-calendar-fullscreen[dir=rtl] .next-calendar-th{text-align:left;padding-left:12px;padding-right:0}.next-calendar-fullscreen[dir=rtl] .next-calendar-date,.next-calendar-fullscreen[dir=rtl] .next-calendar-month{text-align:left}.next-calendar-range[dir=rtl] .next-calendar-body-left,.next-calendar-range[dir=rtl] .next-calendar-body-right{float:right}.next-calendar-range[dir=rtl] .next-calendar-body-left{padding-right:0;padding-left:8px}.next-calendar-range[dir=rtl] .next-calendar-body-right{padding-left:0;padding-right:8px}.next-calendar-table{width:100%;table-layout:fixed}.next-calendar-range .next-calendar-body-left,.next-calendar-range .next-calendar-body-right{float:left;width:50%}.next-calendar-range .next-calendar-body-left{padding-right:8px}.next-calendar-range .next-calendar-body-right{padding-left:8px}.next-calendar-range .next-calendar-body:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-calendar-symbol-prev:before{content:""}.next-calendar-symbol-next:before{content:""}.next-calendar-symbol-prev-super:before{content:""}.next-calendar-symbol-next-super:before{content:""}.next-card,.next-card:after,.next-card:before{box-sizing:border-box}.next-card[dir=rtl] .next-card-extra{left:0;right:auto}.next-card[dir=rtl] .next-card-title:before{right:0;left:auto}.next-card[dir=rtl] .next-card-subtitle{float:left;padding-right:8px;padding-left:0}.next-card[dir=rtl] .next-card-head-show-bullet .next-card-title{padding-left:0;padding-right:8px}.next-card,.next-card *,.next-card :after,.next-card :before{box-sizing:border-box}.next-card{min-width:100px;border:0 solid #e6e6e6;border-radius:3px;box-shadow:none;background:#fff;overflow:hidden}.next-card-noborder{border:0}.next-card-head{background:#fff;padding-left:24px;padding-right:24px}.next-card-head-show-bullet .next-card-title{padding-left:8px}.next-card-head-show-bullet .next-card-title:before{content:"";display:inline-block;height:16px;width:3px;background:#209bfa;position:absolute;left:0;top:calc(50% - 8px)}.next-card-head-main{position:relative;margin-top:0;margin-bottom:0;height:64px;line-height:64px}.next-card-title{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:80%;height:100%;color:#333;font-size:16px;font-weight:400}.next-card-subtitle{font-size:12px;color:#666;padding-left:8px}.next-card-extra{position:absolute;right:0;top:0;height:100%;font-size:14px;color:#298dff}.next-card-body{padding-bottom:20px;padding-left:24px;padding-right:24px}.next-card-show-divider .next-card-head-main{border-bottom:1px solid #eee}.next-card-show-divider .next-card-body{padding-top:20px}.next-card-hide-divider .next-card-body{padding-top:0}.next-card—free{padding:0}.next-card-content{overflow:hidden;transition:all .3s ease;position:relative}.next-card-footer .next-icon{transition:all .1s linear}.next-card-footer .next-icon.next-icon-arrow-down.expand{transform-origin:50% 47%;transform:rotate(180deg)}.next-card-header{background:#fff;padding:0 24px;margin-bottom:20px;margin-top:20px}.next-card-media,.next-card-media>*{display:block;background-size:cover;background-repeat:no-repeat;background-position:50%;object-fit:cover;width:100%}.next-card-header-titles{overflow:hidden}.next-card-header-extra{float:right;text-align:right}.next-card-header-extra .next--btn{margin-left:12px;vertical-align:middle}.next-card-header-title{color:#333;font-size:16px;font-weight:400;line-height:1.5}.next-card-header-subtitle{font-size:12px;color:#666}.next-card-actions{display:block;padding:20px 24px}.next-card-actions .next-btn:not(:last-child){margin-right:12px;vertical-align:middle}.next-card-divider{border-style:none;width:100%;margin:0;position:relative;overflow:visible}.next-card-divider:before{content:"";display:block;border-bottom:1px solid #eee}.next-card-divider--inset{padding:0 24px}.next-card-content-container{margin-top:20px;padding-bottom:20px;padding-left:24px;padding-right:24px;font-size:14px;line-height:1.5;color:#666}.next-cascader{display:inline-block;overflow:auto;border:1px solid #e6e6e6;border-radius:3px}.next-cascader,.next-cascader *,.next-cascader :after,.next-cascader :before{box-sizing:border-box}.next-cascader-inner:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-cascader-menu-wrapper{float:left;overflow:auto;width:auto;min-width:100px;height:192px;overflow-x:hidden;overflow-y:auto}.next-cascader-menu-wrapper+.next-cascader-menu-wrapper{border-left:1px solid #e6e6e6}.next-cascader-menu{position:relative;padding:0;border:none;border-radius:0;box-shadow:none;min-width:auto;min-height:100%}.next-cascader-menu.next-has-right-border{border-right:1px solid #e6e6e6}.next-cascader-menu-item.next-expanded{color:#333;background-color:#f9f9f9}.next-cascader-menu-icon-right{position:absolute;top:0;right:10px;color:#666}.next-cascader-menu-icon-right:hover{color:#333}.next-cascader-menu-icon-expand.next-icon .next-icon-remote,.next-cascader-menu-icon-expand.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-cascader-menu-icon-loading.next-icon .next-icon-remote,.next-cascader-menu-icon-loading.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-cascader-menu-item.next-expanded .next-cascader-menu-icon-right{color:#333}.next-cascader-menu-item.next-expanded .next-cascader-menu-icon-loading{color:#209bfa}.next-cascader-filtered-list{height:192px;padding:0;border:none;border-radius:0;box-shadow:none;overflow:auto}.next-cascader-filtered-list .next-menu-item-inner{overflow:visible}.next-cascader-filtered-item em{color:#209bfa;font-style:normal}.next-cascader[dir=rtl] .next-cascader-menu-wrapper{float:right;border-left:none;border-right:1px solid #e6e6e6}.next-cascader[dir=rtl] .next-cascader-menu-wrapper:first-child{border-right:none}.next-cascader[dir=rtl] .next-cascader-menu.next-has-right-border{border-right:none;border-left:1px solid #e6e6e6}.next-cascader[dir=rtl] .next-cascader-menu-icon-right{right:auto;left:10px}.next-cascader-select,.next-cascader-select *,.next-cascader-select :after,.next-cascader-select :before{box-sizing:border-box}.next-cascader-select-dropdown{box-sizing:border-box;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none}.next-cascader-select-dropdown *,.next-cascader-select-dropdown :after,.next-cascader-select-dropdown :before{box-sizing:border-box}.next-cascader-select-dropdown .next-cascader{display:block;border:none;box-shadow:none}.next-cascader-select-not-found{padding:0;border:none;box-shadow:none;overflow:auto;color:#999}.next-cascader-select-not-found .next-menu-item:hover{color:#999;background:#fff;cursor:default}.next-checkbox-wrapper[dir=rtl]{margin-right:8px;margin-left:0}.next-checkbox-wrapper[dir=rtl]:first-child{margin-right:0}.next-checkbox-wrapper[dir=rtl]>.next-checkbox-label{margin-right:4px;margin-left:0}.next-checkbox-wrapper{box-sizing:border-box;display:inline-block}.next-checkbox-wrapper *,.next-checkbox-wrapper :after,.next-checkbox-wrapper :before{box-sizing:border-box}.next-checkbox-wrapper .next-checkbox{display:inline-block;position:relative;line-height:1;vertical-align:middle}.next-checkbox-wrapper input[type=checkbox]{opacity:0;position:absolute;top:0;left:0;width:16px;height:16px;margin:0;cursor:pointer}.next-checkbox-wrapper .next-checkbox-inner{display:block;width:16px;height:16px;background:#fff;border-radius:3px;border:1px solid #ddd;transition:all .1s linear;text-align:left;box-shadow:none}.next-checkbox-wrapper .next-checkbox-inner>.next-icon{transform:scale(0);position:absolute;top:0;opacity:0;line-height:16px;transition:all .1s linear;color:#fff;left:2px;margin-left:0}.next-checkbox-wrapper .next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper .next-checkbox-inner>.next-icon:before{vertical-align:top;margin-top:0}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-select-icon:before{content:""}.next-checkbox-wrapper .next-checkbox-inner>.next-checkbox-semi-select-icon:before{content:""}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner{border-color:transparent;background-color:#209bfa}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner:hover{border-color:transparent}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;transform:scale(1);margin-left:0}.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.checked>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner{border-color:transparent;background-color:#209bfa}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner:hover,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner.hovered,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner:hover{border-color:transparent}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon{opacity:1;transform:scaleX(1);margin-left:0}.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate.focused>.next-checkbox>.next-checkbox-inner>.next-icon:before,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon .next-icon-remote,.next-checkbox-wrapper.indeterminate>.next-checkbox>.next-checkbox-inner>.next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-checkbox-wrapper.focused>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper.hovered>.next-checkbox>.next-checkbox-inner,.next-checkbox-wrapper:not(.disabled):hover>.next-checkbox>.next-checkbox-inner{border-color:#209bfa;background-color:#add9ff}.next-checkbox-wrapper.focused .next-checkbox-label,.next-checkbox-wrapper.hovered .next-checkbox-label,.next-checkbox-wrapper:not(.disabled):hover .next-checkbox-label{cursor:pointer}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner{border-color:transparent;background-color:#1274e7}.next-checkbox-wrapper.checked:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.checked:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled).hovered>.next-checkbox .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.indeterminate:not(.disabled):hover>.next-checkbox .next-checkbox-inner>.next-icon{color:#fff;opacity:1}.next-checkbox-wrapper.disabled input[type=checkbox]{cursor:not-allowed}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner,.next-checkbox-wrapper.disabled .next-checkbox-inner{border-color:#eee;background:#fafafa}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.checked .next-checkbox-inner:hover,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner.hovered,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner:hover{border-color:#eee}.next-checkbox-wrapper.disabled.checked .next-checkbox-inner>.next-icon,.next-checkbox-wrapper.disabled.indeterminate .next-checkbox-inner>.next-icon{color:#ccc;opacity:1}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner{border-color:#eee;background:#fafafa}.next-checkbox-wrapper.disabled.checked.focused .next-checkbox-inner>.next-icon{color:#ccc;opacity:1}.next-checkbox-wrapper.disabled .next-checkbox-label{color:#ccc;cursor:not-allowed}.next-checkbox-group .next-checkbox-wrapper{display:inline-block;margin-right:12px}.next-checkbox-group .next-checkbox-wrapper:last-child{margin-right:0}.next-checkbox-group-ver .next-checkbox-wrapper{display:block;margin-left:0;margin-right:0;margin-bottom:8px}.next-checkbox-label{font-size:14px;color:#333;vertical-align:middle;margin:0 4px;line-height:1}.next-collapse[dir=rtl] .next-collapse-panel-title{padding:8px 36px 8px 0}.next-collapse[dir=rtl] .next-collapse-panel-icon{left:inherit;right:12px;transform:rotate(180deg);margin-left:0;margin-right:0}.next-collapse[dir=rtl] .next-collapse-panel-icon .next-icon-remote,.next-collapse[dir=rtl] .next-collapse-panel-icon:before{width:16px;font-size:16px;line-height:inherit}.next-collapse{border:1px solid #e6e6e6;border-radius:3px}.next-collapse,.next-collapse *,.next-collapse :after,.next-collapse :before{box-sizing:border-box}.next-collapse:focus,.next-collapse :focus{outline:0}.next-collapse-panel:not(:first-child){border-top:1px solid #e6e6e6}.next-collapse .next-collapse-panel-icon{position:absolute;color:#333;transition:transform .1s linear;left:12px;margin-top:-2px;margin-left:0;margin-right:0}.next-collapse .next-collapse-panel-icon .next-icon-remote,.next-collapse .next-collapse-panel-icon:before{width:16px;font-size:16px;line-height:inherit}.next-collapse-panel-title{position:relative;line-height:1.5;background:#f9f9f9;font-size:14px;font-weight:400;color:#333;cursor:pointer;padding:8px 0 8px 36px;transition:background .1s linear}.next-collapse-panel-title:hover{background:#f5f5f5;color:#333;font-weight:400}.next-collapse-panel-title:hover .next-collapse-panel-icon{color:#333}.next-collapse-panel-content{height:0;line-height:1.5;padding:0 16px;background:#fff;font-size:14px;color:#666;transition:all .3s ease;opacity:0}.next-collapse-panel-expanded>.next-collapse-panel-content{display:block;padding:12px 16px;height:auto;opacity:1}.next-collapse .next-collapse-unfold-icon:before{content:""}.next-collapse-panel-hidden>.next-collapse-panel-content{overflow:hidden}.next-collapse .next-collapse-panel-icon:before{content:""}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded{transform:rotate(90deg);margin-left:0;margin-right:0}.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded .next-icon-remote,.next-collapse .next-collapse-panel-icon.next-collapse-panel-icon-expanded:before{width:16px;font-size:16px;line-height:inherit}.next-collapse-disabled,.next-collapse-panel-disabled:not(:first-child){border-color:#eee}.next-collapse-panel-disabled>.next-collapse-panel-title{cursor:not-allowed;color:#ccc;background:#f9f9f9}.next-collapse-panel-disabled .next-collapse-panel-icon{color:#ccc}.next-collapse-panel-disabled .next-collapse-panel-title:hover{font-weight:400}.next-collapse-panel-disabled .next-collapse-panel-title:hover .next-collapse-panel-icon{color:#ccc}.next-collapse-panel-disabled:hover{color:#ccc;background:#f9f9f9}.next-time-picker-menu{float:left;text-align:center}.next-time-picker-menu:not(:last-child){border-right:1px solid #ddd}.next-time-picker-menu-title{cursor:default;height:28px;line-height:28px;font-size:12px;font-weight:400;color:#999;background:#fff}.next-time-picker-menu ul{position:relative;overflow-y:auto;list-style:none;margin:0;padding:0;font-size:12px;height:196px}.next-time-picker-menu-item{cursor:pointer;height:28px;line-height:28px;transition:background .1s linear;color:#666;background:#fff;outline:none}.next-time-picker-menu-item:hover{color:#333;background:#f9f9f9}.next-time-picker-menu-item.next-selected{font-weight:700;color:#666;background:#f9f9f9}.next-time-picker-menu-item.next-disabled{cursor:not-allowed;color:#ccc;background:#fff}.next-time-picker-panel,.next-time-picker-panel *,.next-time-picker-panel :after,.next-time-picker-panel :before{box-sizing:border-box}.next-time-picker-panel:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-time-picker-panel-header{border-bottom:1px solid #e6e6e6}.next-time-picker-panel-input.next-input{width:100%;padding:6px;border-color:transparent;vertical-align:middle}.next-time-picker-panel-col-3 .next-time-picker-menu{width:33.3333333333%}.next-time-picker-panel-col-2 .next-time-picker-menu{width:50%}.next-time-picker-panel-col-1 .next-time-picker-menu{width:100%}.next-time-picker-body[dir=rtl] .next-time-picker-menu{float:right}.next-time-picker-body[dir=rtl] .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd}.next-time-picker{display:inline-block;width:200px}.next-time-picker,.next-time-picker *,.next-time-picker :after,.next-time-picker :before{box-sizing:border-box}.next-time-picker-trigger .next-input{width:100%}.next-time-picker-body{overflow:hidden;width:200px;border:1px solid #e6e6e6;border-radius:3px;background:#fff;box-shadow:none}.next-time-picker-symbol-clock-icon:before{content:""}.next-range-picker-panel-input-separator,.next-range-picker-trigger-separator{cursor:default;display:inline-block;text-align:center;color:#ccc;width:16px;font-size:12px;vertical-align:middle}.next-date-picker,.next-month-picker,.next-week-picker,.next-year-picker{display:inline-block;width:200px}.next-date-picker-input,.next-month-picker-input,.next-week-picker-input,.next-year-picker-input{width:100%}.next-date-picker-body,.next-month-picker-body,.next-week-picker-body,.next-year-picker-body{width:288px}.next-date-picker-panel-input.next-input,.next-month-picker-panel-input.next-input,.next-week-picker-panel-input.next-input,.next-year-picker-panel-input.next-input{width:100%;background:transparent}.next-date-picker-body.next-date-picker-body-show-time .next-date-picker-panel-input.next-input{width:49%}.next-date-picker-body.next-date-picker-body-show-time .next-date-picker-panel-input.next-input:first-child{margin-right:2%}.next-range-picker{display:inline-block;width:336px}.next-range-picker-input{width:100%}.next-range-picker-trigger{border:1px solid #ddd;background-color:#fff}.next-range-picker-trigger:hover{border-color:#ccc;background-color:#fff}.next-range-picker-trigger.next-error{border-color:#d23c26}.next-range-picker-trigger-input.next-input{height:auto;width:calc(50% - 8px)}.next-range-picker.next-disabled .next-range-picker-trigger{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-range-picker.next-disabled .next-range-picker-trigger:hover{border-color:#eee;background-color:#fafafa}.next-range-picker.next-large .next-range-picker-panel-input,.next-range-picker.next-large .next-range-picker-trigger,.next-range-picker.next-medium .next-range-picker-panel-input,.next-range-picker.next-medium .next-range-picker-trigger,.next-range-picker.next-small .next-range-picker-panel-input,.next-range-picker.next-small .next-range-picker-trigger{border-radius:3px}.next-range-picker-body{width:600px}.next-range-picker-panel-input-end-date.next-input,.next-range-picker-panel-input-start-date.next-input{width:calc(50% - 8px)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-date,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-time,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-date,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-time{width:calc(25% - 8px)}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-start-date{margin-right:8px}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-input-end-time{margin-left:8px}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-end,.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-start{width:50%;float:left}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-start{border-right:1px solid #e6e6e6}.next-range-picker-body.next-range-picker-body-show-time .next-range-picker-panel-time-end{border-left:1px solid #e6e6e6}.next-date-picker-body[dir=rtl] .next-date-picker-panel-footer{text-align:left}.next-date-picker-body[dir=rtl] .next-date-picker-panel-footer>.next-btn:not(:last-child){margin-right:0;margin-left:16px}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-date-picker-panel-input.next-input:first-child{margin-left:2%;margin-right:0}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-time-picker-menu{float:right}.next-date-picker-body[dir=rtl].next-date-picker-body-show-time .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd}.next-range-picker-body[dir=rtl] .next-range-picker-panel-input{text-align:right}.next-range-picker-body[dir=rtl] .next-date-picker-panel-footer{text-align:left}.next-range-picker-body[dir=rtl] .next-date-picker-panel-footer>.next-btn:not(:last-child){margin-right:0;margin-left:16px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-input-start-date{margin-right:0;margin-left:8px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-input-end-time{margin-left:0;margin-right:8px}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-end,.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-start{float:right}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-start{border-right:none;border-left:1px solid #e6e6e6}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-range-picker-panel-time-end{border-left:none;border-right:1px solid #e6e6e6}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-time-picker-menu{float:right}.next-range-picker-body[dir=rtl].next-range-picker-body-show-time .next-time-picker-menu:not(:last-child){border-right:none;border-left:1px solid #ddd}.next-date-picker,.next-date-picker *,.next-date-picker :after,.next-date-picker :before,.next-month-picker,.next-month-picker *,.next-month-picker :after,.next-month-picker :before,.next-range-picker,.next-range-picker *,.next-range-picker :after,.next-range-picker :before,.next-week-picker,.next-week-picker *,.next-week-picker :after,.next-week-picker :before,.next-year-picker,.next-year-picker *,.next-year-picker :after,.next-year-picker :before{box-sizing:border-box}.next-date-picker-body,.next-month-picker-body,.next-range-picker-body,.next-week-picker-body,.next-year-picker-body{border:1px solid #e6e6e6;border-radius:3px;box-shadow:none;background:#fff}.next-date-picker-panel-header,.next-month-picker-panel-header,.next-range-picker-panel-header,.next-week-picker-panel-header,.next-year-picker-panel-header{padding:6px;text-align:center}.next-date-picker-panel-time,.next-month-picker-panel-time,.next-range-picker-panel-time,.next-week-picker-panel-time,.next-year-picker-panel-time{border-top:1px solid #e6e6e6}.next-date-picker-panel-footer,.next-month-picker-panel-footer,.next-range-picker-panel-footer,.next-week-picker-panel-footer,.next-year-picker-panel-footer{text-align:right;padding:8px 20px;border-top:1px solid #e6e6e6}.next-date-picker-panel-footer>.next-btn:not(:last-child),.next-date-picker-panel-tools>.next-btn:not(:last-child),.next-month-picker-panel-footer>.next-btn:not(:last-child),.next-month-picker-panel-tools>.next-btn:not(:last-child),.next-range-picker-panel-footer>.next-btn:not(:last-child),.next-range-picker-panel-tools>.next-btn:not(:last-child),.next-week-picker-panel-footer>.next-btn:not(:last-child),.next-week-picker-panel-tools>.next-btn:not(:last-child),.next-year-picker-panel-footer>.next-btn:not(:last-child),.next-year-picker-panel-tools>.next-btn:not(:last-child){margin-right:16px}.next-date-picker-panel-tools,.next-month-picker-panel-tools,.next-range-picker-panel-tools,.next-week-picker-panel-tools,.next-year-picker-panel-tools{float:left}.next-date-picker .next-calendar-panel-header,.next-month-picker .next-calendar-panel-header,.next-range-picker .next-calendar-panel-header,.next-week-picker .next-calendar-panel-header,.next-year-picker .next-calendar-panel-header{margin-left:-1px;margin-right:-1px}.next-date-picker .next-input input,.next-month-picker .next-input input,.next-range-picker .next-input input,.next-week-picker .next-input input,.next-year-picker .next-input input{vertical-align:baseline}.next-date-picker-symbol-calendar-icon:before,.next-month-picker-symbol-calendar-icon:before,.next-range-picker-symbol-calendar-icon:before,.next-week-picker-symbol-calendar-icon:before,.next-year-picker-symbol-calendar-icon:before{content:""}.next-range-picker-panel-body .next-calendar{display:inline-block;width:50%}.next-message{position:relative;display:block;vertical-align:baseline;animation-duration:.3s;animation-timing-function:ease-in-out}.next-message,.next-message *,.next-message :after,.next-message :before{box-sizing:border-box}.next-message:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-message .next-message-close{color:#999;font-size:0;position:absolute;cursor:pointer}.next-message .next-message-close .next-icon-close{width:12px;height:12px;line-height:1em}.next-message .next-message-close .next-icon-close:before{width:12px;height:12px;font-size:12px;line-height:1em}.next-message .next-message-close:hover{color:#666}.next-message.next-message-success.next-inline{background-color:#e5fff5;border-color:#e5fff5;box-shadow:none;border-style:solid}.next-message.next-message-success.next-inline .next-message-title{color:#333}.next-message.next-message-success.next-inline .next-message-content{color:#666}.next-message.next-message-success.next-inline .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-inline .next-message-symbol-icon:before{content:""}.next-message.next-message-success.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-success.next-addon .next-message-title{color:#333}.next-message.next-message-success.next-addon .next-message-content{color:#666}.next-message.next-message-success.next-addon .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-addon .next-message-symbol-icon:before{content:""}.next-message.next-message-success.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-success.next-toast .next-message-title{color:#333}.next-message.next-message-success.next-toast .next-message-content{color:#666}.next-message.next-message-success.next-toast .next-message-symbol{color:#1ad78c}.next-message.next-message-success.next-toast .next-message-symbol-icon:before{content:""}.next-message.next-message-warning.next-inline{background-color:#fff9e0;border-color:#fff9e0;box-shadow:none;border-style:solid}.next-message.next-message-warning.next-inline .next-message-title{color:#333}.next-message.next-message-warning.next-inline .next-message-content{color:#666}.next-message.next-message-warning.next-inline .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-inline .next-message-symbol-icon:before{content:""}.next-message.next-message-warning.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-warning.next-addon .next-message-title{color:#333}.next-message.next-message-warning.next-addon .next-message-content{color:#666}.next-message.next-message-warning.next-addon .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-addon .next-message-symbol-icon:before{content:""}.next-message.next-message-warning.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-warning.next-toast .next-message-title{color:#333}.next-message.next-message-warning.next-toast .next-message-content{color:#666}.next-message.next-message-warning.next-toast .next-message-symbol{color:#f1c826}.next-message.next-message-warning.next-toast .next-message-symbol-icon:before{content:""}.next-message.next-message-error.next-inline{background-color:#ffece4;border-color:#ffece4;box-shadow:none;border-style:solid}.next-message.next-message-error.next-inline .next-message-title{color:#333}.next-message.next-message-error.next-inline .next-message-content{color:#666}.next-message.next-message-error.next-inline .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-inline .next-message-symbol-icon:before{content:""}.next-message.next-message-error.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-error.next-addon .next-message-title{color:#333}.next-message.next-message-error.next-addon .next-message-content{color:#666}.next-message.next-message-error.next-addon .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-addon .next-message-symbol-icon:before{content:""}.next-message.next-message-error.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-error.next-toast .next-message-title{color:#333}.next-message.next-message-error.next-toast .next-message-content{color:#666}.next-message.next-message-error.next-toast .next-message-symbol{color:#d23c26}.next-message.next-message-error.next-toast .next-message-symbol-icon:before{content:""}.next-message.next-message-notice.next-inline{background-color:#e4f3fe;border-color:#e4f3fe;box-shadow:none;border-style:solid}.next-message.next-message-notice.next-inline .next-message-title{color:#333}.next-message.next-message-notice.next-inline .next-message-content{color:#666}.next-message.next-message-notice.next-inline .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-inline .next-message-symbol-icon:before{content:""}.next-message.next-message-notice.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-notice.next-addon .next-message-title{color:#333}.next-message.next-message-notice.next-addon .next-message-content{color:#666}.next-message.next-message-notice.next-addon .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-addon .next-message-symbol-icon:before{content:""}.next-message.next-message-notice.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-notice.next-toast .next-message-title{color:#333}.next-message.next-message-notice.next-toast .next-message-content{color:#666}.next-message.next-message-notice.next-toast .next-message-symbol{color:#298dff}.next-message.next-message-notice.next-toast .next-message-symbol-icon:before{content:""}.next-message.next-message-help.next-inline{background-color:#fff9e0;border-color:#fff9e0;box-shadow:none;border-style:solid}.next-message.next-message-help.next-inline .next-message-title{color:#333}.next-message.next-message-help.next-inline .next-message-content{color:#666}.next-message.next-message-help.next-inline .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-inline .next-message-symbol-icon:before{content:""}.next-message.next-message-help.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-help.next-addon .next-message-title{color:#333}.next-message.next-message-help.next-addon .next-message-content{color:#666}.next-message.next-message-help.next-addon .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-addon .next-message-symbol-icon:before{content:""}.next-message.next-message-help.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-help.next-toast .next-message-title{color:#333}.next-message.next-message-help.next-toast .next-message-content{color:#666}.next-message.next-message-help.next-toast .next-message-symbol{color:#f1c826}.next-message.next-message-help.next-toast .next-message-symbol-icon:before{content:""}.next-message.next-message-loading.next-inline{background-color:#fff;border-color:#fff;box-shadow:none;border-style:solid}.next-message.next-message-loading.next-inline .next-message-title{color:#333}.next-message.next-message-loading.next-inline .next-message-content{color:#666}.next-message.next-message-loading.next-inline .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-inline .next-message-symbol-icon:before{content:"";animation:loadingCircle 1s linear infinite}.next-message.next-message-loading.next-addon{background-color:transparent;border-color:transparent;box-shadow:none;border-style:solid}.next-message.next-message-loading.next-addon .next-message-title{color:#333}.next-message.next-message-loading.next-addon .next-message-content{color:#666}.next-message.next-message-loading.next-addon .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-addon .next-message-symbol-icon:before{content:"";animation:loadingCircle 1s linear infinite}.next-message.next-message-loading.next-toast{background-color:#fff;border-color:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);border-style:solid}.next-message.next-message-loading.next-toast .next-message-title{color:#333}.next-message.next-message-loading.next-toast .next-message-content{color:#666}.next-message.next-message-loading.next-toast .next-message-symbol{color:#209bfa}.next-message.next-message-loading.next-toast .next-message-symbol-icon:before{content:"";animation:loadingCircle 1s linear infinite}.next-message.next-medium{border-width:1px;padding:12px}.next-message.next-medium .next-message-symbol{float:left;line-height:16px}.next-message.next-medium .next-message-symbol .next-icon-remote,.next-message.next-medium .next-message-symbol:before{width:16px;font-size:16px;line-height:inherit}.next-message.next-medium .next-message-title{padding:0 20px 0 24px;font-size:16px;line-height:16px}.next-message.next-medium .next-message-content{margin-top:8px;padding:0 20px 0 24px;font-size:14px;line-height:1.5}.next-message.next-medium .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-medium.next-only-content .next-message-content,.next-message.next-medium.next-title-content .next-message-title{line-height:16px}.next-message.next-medium .next-message-close{top:12px;right:12px}.next-message.next-medium.next-inline,.next-message.next-medium.next-toast{border-radius:3px}.next-message.next-large{border-width:2px;padding:16px}.next-message.next-large .next-message-symbol{float:left;line-height:24px}.next-message.next-large .next-message-symbol .next-icon-remote,.next-message.next-large .next-message-symbol:before{width:24px;font-size:24px;line-height:inherit}.next-message.next-large .next-message-title{padding:0 20px 0 36px;font-size:20px;line-height:20px}.next-message.next-large .next-message-content{margin-top:8px;padding:0 20px 0 36px;font-size:14px;line-height:1.5}.next-message.next-large .next-message-symbol+.next-message-content{margin-top:0}.next-message.next-large.next-only-content .next-message-content,.next-message.next-large.next-title-content .next-message-title{line-height:24px}.next-message.next-large .next-message-close{top:16px;right:16px}.next-message.next-large.next-inline,.next-message.next-large.next-toast{border-radius:3px}.next-message[dir=rtl] .next-message-symbol{float:right}.next-message[dir=rtl].next-medium .next-message-title{padding:0 24px 0 20px}.next-message[dir=rtl].next-medium .next-message-close{left:12px;right:auto}.next-message[dir=rtl].next-large .next-message-title{padding:0 36px 0 20px}.next-message[dir=rtl].next-large .next-message-close{left:16px;right:auto}.next-message-wrapper-v2{margin:0;padding:0;position:fixed;left:0;z-index:1001;width:100%;pointer-events:none}.next-message-list{padding:8px;text-align:center}.next-message-list .next-message{display:inline-block;pointer-events:all}.next-message-fade-leave{animation-duration:.3s;animation-play-state:paused;animation-fill-mode:both;animation-timing-function:ease}.next-message-fade-leave.next-message-fade-leave-active{animation-name:MessageFadeOut;animation-play-state:running}@keyframes MessageFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.next-dialog[dir=rtl],.next-dialog[dir=rtl] .next-dialog-footer.next-align-left{text-align:right}.next-dialog[dir=rtl] .next-dialog-footer.next-align-center{text-align:center}.next-dialog[dir=rtl] .next-dialog-footer.next-align-right{text-align:left}.next-dialog[dir=rtl] .next-dialog-btn+.next-dialog-btn{margin-right:4px;margin-left:0}.next-dialog[dir=rtl] .next-dialog-close{left:12px;right:auto}.next-dialog{position:fixed;z-index:1001;background:#fff;border:1px solid #e6e6e6;border-radius:6px;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);text-align:left;overflow:hidden;max-width:90%}.next-dialog,.next-dialog *,.next-dialog :after,.next-dialog :before{box-sizing:border-box}.next-dialog-header{padding:12px 20px;border-bottom:0 solid transparent;font-size:16px;font-weight:400;background:transparent;color:#333}.next-dialog-body{padding:20px;font-size:14px;line-height:1.5;color:#666}.next-dialog-body-no-footer{margin-bottom:0}.next-dialog-footer{padding:12px 20px;border-top:0 solid transparent;background:transparent}.next-dialog-footer.next-align-left{text-align:left}.next-dialog-footer.next-align-center{text-align:center}.next-dialog-footer.next-align-right{text-align:right}.next-dialog-footer-fixed-height{position:absolute;width:100%;bottom:0}.next-dialog-btn+.next-dialog-btn{margin-left:4px}.next-dialog-close{position:absolute;top:12px;right:12px;width:16px;cursor:pointer}.next-dialog-close,.next-dialog-close:link,.next-dialog-close:visited{height:16px;color:#999}.next-dialog-close:hover{background:transparent;color:#333}.next-dialog-close .next-dialog-close-icon.next-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px;width:16px;height:16px;line-height:1em}.next-dialog-close .next-dialog-close-icon.next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-dialog-container{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1001;padding:40px;overflow:auto;text-align:center;box-sizing:border-box}.next-dialog-container:before{display:inline-block;vertical-align:middle;width:0;height:100%;content:""}.next-dialog-container .next-dialog{display:inline-block;position:relative;vertical-align:middle}.next-dialog-quick .next-dialog-body{padding:20px}.next-dialog .next-dialog-message.next-message{min-width:300px;padding:0}.next-dialog-wrapper{position:fixed;top:0;left:0;bottom:0;right:0;overflow:auto}.next-dialog-inner-wrapper{display:flex;position:relative;top:100px;pointer-events:none;padding-bottom:24px}.next-dialog-v2{pointer-events:auto;margin:0 auto}.next-dialog-v2 .next-dialog-header{word-break:break-word;padding-right:40px}.next-dialog-v2 .next-dialog-body{padding-right:40px}.next-dialog-v2 .next-dialog-header+.next-dialog-body{padding:20px}.next-dialog-v2 .next-dialog-header+.next-dialog-body-no-footer{margin-bottom:0}.next-dialog.next-dialog-v2{position:relative}.next-dialog-centered{text-align:center}.next-dialog-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.next-dialog-centered .next-dialog-v2{margin:40px 0;display:inline-block;text-align:left;vertical-align:middle}.next-drawer{position:fixed;z-index:1001;background:#fff;border:1px solid #e6e6e6;box-shadow:0 4px 8px 0 rgba(0,0,0,.12);overflow:auto;animation-duration:.3s;animation-timing-function:ease-in-out}.next-drawer,.next-drawer *,.next-drawer :after,.next-drawer :before{box-sizing:border-box}.next-drawer-left,.next-drawer-right{height:100%;max-width:80%;width:240px}.next-drawer-bottom,.next-drawer-top{width:100%}.next-drawer-header{padding:12px 20px;border-bottom:1px solid #e6e6e6;font-size:16px;background:#fff;color:#333}.next-drawer-no-title{padding:0;border-bottom:0}.next-drawer-body{padding:20px;font-size:14px;line-height:1.5;color:#666}.next-drawer-close{position:absolute;top:12px;right:12px;width:16px;cursor:pointer}.next-drawer-close,.next-drawer-close:link,.next-drawer-close:visited{height:16px;color:#999}.next-drawer-close:hover{background:transparent;color:#333}.next-drawer-close .next-drawer-close-icon.next-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px;width:16px;height:16px;line-height:1em}.next-drawer-close .next-drawer-close-icon.next-icon:before{width:16px;height:16px;font-size:16px;line-height:1em}.next-row{display:flex}.next-row,.next-row *,.next-row :after,.next-row :before{box-sizing:border-box}.next-row.next-row-wrap{flex-wrap:wrap}@media(min-width:320px){.next-row.next-row-fixed{width:320px}}@media(min-width:480px){.next-row.next-row-fixed{width:480px}}@media(min-width:720px){.next-row.next-row-fixed{width:720px}}@media(min-width:990px){.next-row.next-row-fixed{width:990px}}@media(min-width:1200px){.next-row.next-row-fixed{width:1200px}}@media(min-width:1500px){.next-row.next-row-fixed{width:1500px}}.next-row.next-row-fixed-xxs{width:320px}.next-row.next-row-fixed-xs{width:480px}.next-row.next-row-fixed-s{width:720px}.next-row.next-row-fixed-m{width:990px}.next-row.next-row-fixed-l{width:1200px}.next-row.next-row-fixed-xl{width:1500px}.next-row.next-row-justify-start{justify-content:flex-start}.next-row.next-row-justify-end{justify-content:flex-end}.next-row.next-row-justify-center{justify-content:center}.next-row.next-row-justify-space-between{justify-content:space-between}.next-row.next-row-justify-space-around{justify-content:space-around}.next-row.next-row-align-top{align-items:flex-start}.next-row.next-row-align-bottom{align-items:flex-end}.next-row.next-row-align-center{align-items:center}.next-row.next-row-align-baseline{align-items:baseline}.next-row.next-row-align-stretch{align-items:stretch}.next-col{flex:1}.next-col.next-col-top{align-self:flex-start}.next-col.next-col-bottom{align-self:flex-end}.next-col.next-col-center{align-self:center}@media (min-width:0\0)and (min-resolution:0.001dpcm){.next-row{display:table;width:100%}.next-col{display:table-cell;vertical-align:top}}.next-col-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-24{flex:0 0 100%;width:100%;max-width:100%}@media(min-width:320px){.next-col-xxs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xxs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xxs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xxs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xxs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xxs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xxs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xxs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xxs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xxs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xxs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xxs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xxs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xxs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xxs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xxs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xxs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xxs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xxs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xxs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xxs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xxs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xxs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xxs-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xs-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xs-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xs-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xs-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xs-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xs-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xs-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xs-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xs-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xs-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xs-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xs-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xs-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xs-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xs-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xs-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xs-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xs-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xs-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xs-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xs-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xs-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xs-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-s-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-s-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-s-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-s-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-s-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-s-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-s-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-s-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-s-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-s-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-s-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-s-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-s-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-s-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-s-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-s-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-s-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-s-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-s-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-s-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-s-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-s-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-s-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-m-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-m-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-m-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-m-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-m-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-m-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-m-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-m-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-m-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-m-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-m-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-m-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-m-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-m-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-m-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-m-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-m-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-m-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-m-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-m-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-m-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-m-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-m-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-l-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-l-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-l-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-l-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-l-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-l-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-l-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-l-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-l-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-l-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-l-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-l-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-l-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-l-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-l-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-l-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-l-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-l-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-l-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-l-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-l-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-l-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-l-24{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1{flex:0 0 4.1666666667%;width:4.1666666667%;max-width:4.1666666667%}.next-col-xl-2{flex:0 0 8.3333333333%;width:8.3333333333%;max-width:8.3333333333%}.next-col-xl-3{flex:0 0 12.5%;width:12.5%;max-width:12.5%}.next-col-xl-4{flex:0 0 16.6666666667%;width:16.6666666667%;max-width:16.6666666667%}.next-col-xl-5{flex:0 0 20.8333333333%;width:20.8333333333%;max-width:20.8333333333%}.next-col-xl-6{flex:0 0 25%;width:25%;max-width:25%}.next-col-xl-7{flex:0 0 29.1666666667%;width:29.1666666667%;max-width:29.1666666667%}.next-col-xl-8{flex:0 0 33.3333333333%;width:33.3333333333%;max-width:33.3333333333%}.next-col-xl-9{flex:0 0 37.5%;width:37.5%;max-width:37.5%}.next-col-xl-10{flex:0 0 41.6666666667%;width:41.6666666667%;max-width:41.6666666667%}.next-col-xl-11{flex:0 0 45.8333333333%;width:45.8333333333%;max-width:45.8333333333%}.next-col-xl-12{flex:0 0 50%;width:50%;max-width:50%}.next-col-xl-13{flex:0 0 54.1666666667%;width:54.1666666667%;max-width:54.1666666667%}.next-col-xl-14{flex:0 0 58.3333333333%;width:58.3333333333%;max-width:58.3333333333%}.next-col-xl-15{flex:0 0 62.5%;width:62.5%;max-width:62.5%}.next-col-xl-16{flex:0 0 66.6666666667%;width:66.6666666667%;max-width:66.6666666667%}.next-col-xl-17{flex:0 0 70.8333333333%;width:70.8333333333%;max-width:70.8333333333%}.next-col-xl-18{flex:0 0 75%;width:75%;max-width:75%}.next-col-xl-19{flex:0 0 79.1666666667%;width:79.1666666667%;max-width:79.1666666667%}.next-col-xl-20{flex:0 0 83.3333333333%;width:83.3333333333%;max-width:83.3333333333%}.next-col-xl-21{flex:0 0 87.5%;width:87.5%;max-width:87.5%}.next-col-xl-22{flex:0 0 91.6666666667%;width:91.6666666667%;max-width:91.6666666667%}.next-col-xl-23{flex:0 0 95.8333333333%;width:95.8333333333%;max-width:95.8333333333%}.next-col-xl-24{flex:0 0 100%;width:100%;max-width:100%}}.next-col-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-5p5{flex:0 0 100%;width:100%;max-width:100%}@media(min-width:320px){.next-col-xxs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xxs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xxs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xxs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xxs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:480px){.next-col-xs-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xs-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xs-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xs-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xs-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:720px){.next-col-s-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-s-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-s-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-s-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-s-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:990px){.next-col-m-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-m-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-m-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-m-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-m-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1200px){.next-col-l-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-l-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-l-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-l-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-l-5p5{flex:0 0 100%;width:100%;max-width:100%}}@media(min-width:1500px){.next-col-xl-1p5{flex:0 0 20%;width:20%;max-width:20%}.next-col-xl-2p5{flex:0 0 40%;width:40%;max-width:40%}.next-col-xl-3p5{flex:0 0 60%;width:60%;max-width:60%}.next-col-xl-4p5{flex:0 0 80%;width:80%;max-width:80%}.next-col-xl-5p5{flex:0 0 100%;width:100%;max-width:100%}}.next-col-fixed-1{flex:0 0 20px;width:20px;max-width:20px}.next-col-fixed-2{flex:0 0 40px;width:40px;max-width:40px}.next-col-fixed-3{flex:0 0 60px;width:60px;max-width:60px}.next-col-fixed-4{flex:0 0 80px;width:80px;max-width:80px}.next-col-fixed-5{flex:0 0 100px;width:100px;max-width:100px}.next-col-fixed-6{flex:0 0 120px;width:120px;max-width:120px}.next-col-fixed-7{flex:0 0 140px;width:140px;max-width:140px}.next-col-fixed-8{flex:0 0 160px;width:160px;max-width:160px}.next-col-fixed-9{flex:0 0 180px;width:180px;max-width:180px}.next-col-fixed-10{flex:0 0 200px;width:200px;max-width:200px}.next-col-fixed-11{flex:0 0 220px;width:220px;max-width:220px}.next-col-fixed-12{flex:0 0 240px;width:240px;max-width:240px}.next-col-fixed-13{flex:0 0 260px;width:260px;max-width:260px}.next-col-fixed-14{flex:0 0 280px;width:280px;max-width:280px}.next-col-fixed-15{flex:0 0 300px;width:300px;max-width:300px}.next-col-fixed-16{flex:0 0 320px;width:320px;max-width:320px}.next-col-fixed-17{flex:0 0 340px;width:340px;max-width:340px}.next-col-fixed-18{flex:0 0 360px;width:360px;max-width:360px}.next-col-fixed-19{flex:0 0 380px;width:380px;max-width:380px}.next-col-fixed-20{flex:0 0 400px;width:400px;max-width:400px}.next-col-fixed-21{flex:0 0 420px;width:420px;max-width:420px}.next-col-fixed-22{flex:0 0 440px;width:440px;max-width:440px}.next-col-fixed-23{flex:0 0 460px;width:460px;max-width:460px}.next-col-fixed-24{flex:0 0 480px;width:480px;max-width:480px}.next-col-fixed-25{flex:0 0 500px;width:500px;max-width:500px}.next-col-fixed-26{flex:0 0 520px;width:520px;max-width:520px}.next-col-fixed-27{flex:0 0 540px;width:540px;max-width:540px}.next-col-fixed-28{flex:0 0 560px;width:560px;max-width:560px}.next-col-fixed-29{flex:0 0 580px;width:580px;max-width:580px}.next-col-fixed-30{flex:0 0 600px;width:600px;max-width:600px}.next-col-offset-1{margin-left:4.1666666667%}.next-col-offset-2{margin-left:8.3333333333%}.next-col-offset-3{margin-left:12.5%}.next-col-offset-4{margin-left:16.6666666667%}.next-col-offset-5{margin-left:20.8333333333%}.next-col-offset-6{margin-left:25%}.next-col-offset-7{margin-left:29.1666666667%}.next-col-offset-8{margin-left:33.3333333333%}.next-col-offset-9{margin-left:37.5%}.next-col-offset-10{margin-left:41.6666666667%}.next-col-offset-11{margin-left:45.8333333333%}.next-col-offset-12{margin-left:50%}.next-col-offset-13{margin-left:54.1666666667%}.next-col-offset-14{margin-left:58.3333333333%}.next-col-offset-15{margin-left:62.5%}.next-col-offset-16{margin-left:66.6666666667%}.next-col-offset-17{margin-left:70.8333333333%}.next-col-offset-18{margin-left:75%}.next-col-offset-19{margin-left:79.1666666667%}.next-col-offset-20{margin-left:83.3333333333%}.next-col-offset-21{margin-left:87.5%}.next-col-offset-22{margin-left:91.6666666667%}.next-col-offset-23{margin-left:95.8333333333%}.next-col-offset-24{margin-left:100%}@media(min-width:320px){.next-col-xxs-offset-1{margin-left:4.1666666667%}.next-col-xxs-offset-2{margin-left:8.3333333333%}.next-col-xxs-offset-3{margin-left:12.5%}.next-col-xxs-offset-4{margin-left:16.6666666667%}.next-col-xxs-offset-5{margin-left:20.8333333333%}.next-col-xxs-offset-6{margin-left:25%}.next-col-xxs-offset-7{margin-left:29.1666666667%}.next-col-xxs-offset-8{margin-left:33.3333333333%}.next-col-xxs-offset-9{margin-left:37.5%}.next-col-xxs-offset-10{margin-left:41.6666666667%}.next-col-xxs-offset-11{margin-left:45.8333333333%}.next-col-xxs-offset-12{margin-left:50%}.next-col-xxs-offset-13{margin-left:54.1666666667%}.next-col-xxs-offset-14{margin-left:58.3333333333%}.next-col-xxs-offset-15{margin-left:62.5%}.next-col-xxs-offset-16{margin-left:66.6666666667%}.next-col-xxs-offset-17{margin-left:70.8333333333%}.next-col-xxs-offset-18{margin-left:75%}.next-col-xxs-offset-19{margin-left:79.1666666667%}.next-col-xxs-offset-20{margin-left:83.3333333333%}.next-col-xxs-offset-21{margin-left:87.5%}.next-col-xxs-offset-22{margin-left:91.6666666667%}.next-col-xxs-offset-23{margin-left:95.8333333333%}.next-col-xxs-offset-24{margin-left:100%}}@media(min-width:480px){.next-col-xs-offset-1{margin-left:4.1666666667%}.next-col-xs-offset-2{margin-left:8.3333333333%}.next-col-xs-offset-3{margin-left:12.5%}.next-col-xs-offset-4{margin-left:16.6666666667%}.next-col-xs-offset-5{margin-left:20.8333333333%}.next-col-xs-offset-6{margin-left:25%}.next-col-xs-offset-7{margin-left:29.1666666667%}.next-col-xs-offset-8{margin-left:33.3333333333%}.next-col-xs-offset-9{margin-left:37.5%}.next-col-xs-offset-10{margin-left:41.6666666667%}.next-col-xs-offset-11{margin-left:45.8333333333%}.next-col-xs-offset-12{margin-left:50%}.next-col-xs-offset-13{margin-left:54.1666666667%}.next-col-xs-offset-14{margin-left:58.3333333333%}.next-col-xs-offset-15{margin-left:62.5%}.next-col-xs-offset-16{margin-left:66.6666666667%}.next-col-xs-offset-17{margin-left:70.8333333333%}.next-col-xs-offset-18{margin-left:75%}.next-col-xs-offset-19{margin-left:79.1666666667%}.next-col-xs-offset-20{margin-left:83.3333333333%}.next-col-xs-offset-21{margin-left:87.5%}.next-col-xs-offset-22{margin-left:91.6666666667%}.next-col-xs-offset-23{margin-left:95.8333333333%}.next-col-xs-offset-24{margin-left:100%}}@media(min-width:720px){.next-col-s-offset-1{margin-left:4.1666666667%}.next-col-s-offset-2{margin-left:8.3333333333%}.next-col-s-offset-3{margin-left:12.5%}.next-col-s-offset-4{margin-left:16.6666666667%}.next-col-s-offset-5{margin-left:20.8333333333%}.next-col-s-offset-6{margin-left:25%}.next-col-s-offset-7{margin-left:29.1666666667%}.next-col-s-offset-8{margin-left:33.3333333333%}.next-col-s-offset-9{margin-left:37.5%}.next-col-s-offset-10{margin-left:41.6666666667%}.next-col-s-offset-11{margin-left:45.8333333333%}.next-col-s-offset-12{margin-left:50%}.next-col-s-offset-13{margin-left:54.1666666667%}.next-col-s-offset-14{margin-left:58.3333333333%}.next-col-s-offset-15{margin-left:62.5%}.next-col-s-offset-16{margin-left:66.6666666667%}.next-col-s-offset-17{margin-left:70.8333333333%}.next-col-s-offset-18{margin-left:75%}.next-col-s-offset-19{margin-left:79.1666666667%}.next-col-s-offset-20{margin-left:83.3333333333%}.next-col-s-offset-21{margin-left:87.5%}.next-col-s-offset-22{margin-left:91.6666666667%}.next-col-s-offset-23{margin-left:95.8333333333%}.next-col-s-offset-24{margin-left:100%}}@media(min-width:990px){.next-col-m-offset-1{margin-left:4.1666666667%}.next-col-m-offset-2{margin-left:8.3333333333%}.next-col-m-offset-3{margin-left:12.5%}.next-col-m-offset-4{margin-left:16.6666666667%}.next-col-m-offset-5{margin-left:20.8333333333%}.next-col-m-offset-6{margin-left:25%}.next-col-m-offset-7{margin-left:29.1666666667%}.next-col-m-offset-8{margin-left:33.3333333333%}.next-col-m-offset-9{margin-left:37.5%}.next-col-m-offset-10{margin-left:41.6666666667%}.next-col-m-offset-11{margin-left:45.8333333333%}.next-col-m-offset-12{margin-left:50%}.next-col-m-offset-13{margin-left:54.1666666667%}.next-col-m-offset-14{margin-left:58.3333333333%}.next-col-m-offset-15{margin-left:62.5%}.next-col-m-offset-16{margin-left:66.6666666667%}.next-col-m-offset-17{margin-left:70.8333333333%}.next-col-m-offset-18{margin-left:75%}.next-col-m-offset-19{margin-left:79.1666666667%}.next-col-m-offset-20{margin-left:83.3333333333%}.next-col-m-offset-21{margin-left:87.5%}.next-col-m-offset-22{margin-left:91.6666666667%}.next-col-m-offset-23{margin-left:95.8333333333%}.next-col-m-offset-24{margin-left:100%}}@media(min-width:1200px){.next-col-l-offset-1{margin-left:4.1666666667%}.next-col-l-offset-2{margin-left:8.3333333333%}.next-col-l-offset-3{margin-left:12.5%}.next-col-l-offset-4{margin-left:16.6666666667%}.next-col-l-offset-5{margin-left:20.8333333333%}.next-col-l-offset-6{margin-left:25%}.next-col-l-offset-7{margin-left:29.1666666667%}.next-col-l-offset-8{margin-left:33.3333333333%}.next-col-l-offset-9{margin-left:37.5%}.next-col-l-offset-10{margin-left:41.6666666667%}.next-col-l-offset-11{margin-left:45.8333333333%}.next-col-l-offset-12{margin-left:50%}.next-col-l-offset-13{margin-left:54.1666666667%}.next-col-l-offset-14{margin-left:58.3333333333%}.next-col-l-offset-15{margin-left:62.5%}.next-col-l-offset-16{margin-left:66.6666666667%}.next-col-l-offset-17{margin-left:70.8333333333%}.next-col-l-offset-18{margin-left:75%}.next-col-l-offset-19{margin-left:79.1666666667%}.next-col-l-offset-20{margin-left:83.3333333333%}.next-col-l-offset-21{margin-left:87.5%}.next-col-l-offset-22{margin-left:91.6666666667%}.next-col-l-offset-23{margin-left:95.8333333333%}.next-col-l-offset-24{margin-left:100%}}@media(min-width:1500px){.next-col-xl-offset-1{margin-left:4.1666666667%}.next-col-xl-offset-2{margin-left:8.3333333333%}.next-col-xl-offset-3{margin-left:12.5%}.next-col-xl-offset-4{margin-left:16.6666666667%}.next-col-xl-offset-5{margin-left:20.8333333333%}.next-col-xl-offset-6{margin-left:25%}.next-col-xl-offset-7{margin-left:29.1666666667%}.next-col-xl-offset-8{margin-left:33.3333333333%}.next-col-xl-offset-9{margin-left:37.5%}.next-col-xl-offset-10{margin-left:41.6666666667%}.next-col-xl-offset-11{margin-left:45.8333333333%}.next-col-xl-offset-12{margin-left:50%}.next-col-xl-offset-13{margin-left:54.1666666667%}.next-col-xl-offset-14{margin-left:58.3333333333%}.next-col-xl-offset-15{margin-left:62.5%}.next-col-xl-offset-16{margin-left:66.6666666667%}.next-col-xl-offset-17{margin-left:70.8333333333%}.next-col-xl-offset-18{margin-left:75%}.next-col-xl-offset-19{margin-left:79.1666666667%}.next-col-xl-offset-20{margin-left:83.3333333333%}.next-col-xl-offset-21{margin-left:87.5%}.next-col-xl-offset-22{margin-left:91.6666666667%}.next-col-xl-offset-23{margin-left:95.8333333333%}.next-col-xl-offset-24{margin-left:100%}}.next-col-offset-fixed-1{margin-left:20px}.next-col-offset-fixed-2{margin-left:40px}.next-col-offset-fixed-3{margin-left:60px}.next-col-offset-fixed-4{margin-left:80px}.next-col-offset-fixed-5{margin-left:100px}.next-col-offset-fixed-6{margin-left:120px}.next-col-offset-fixed-7{margin-left:140px}.next-col-offset-fixed-8{margin-left:160px}.next-col-offset-fixed-9{margin-left:180px}.next-col-offset-fixed-10{margin-left:200px}.next-col-offset-fixed-11{margin-left:220px}.next-col-offset-fixed-12{margin-left:240px}.next-col-offset-fixed-13{margin-left:260px}.next-col-offset-fixed-14{margin-left:280px}.next-col-offset-fixed-15{margin-left:300px}.next-col-offset-fixed-16{margin-left:320px}.next-col-offset-fixed-17{margin-left:340px}.next-col-offset-fixed-18{margin-left:360px}.next-col-offset-fixed-19{margin-left:380px}.next-col-offset-fixed-20{margin-left:400px}.next-col-offset-fixed-21{margin-left:420px}.next-col-offset-fixed-22{margin-left:440px}.next-col-offset-fixed-23{margin-left:460px}.next-col-offset-fixed-24{margin-left:480px}.next-col-offset-fixed-25{margin-left:500px}.next-col-offset-fixed-26{margin-left:520px}.next-col-offset-fixed-27{margin-left:540px}.next-col-offset-fixed-28{margin-left:560px}.next-col-offset-fixed-29{margin-left:580px}.next-col-offset-fixed-30{margin-left:600px}.next-col-offset-fixed-xxs-1{margin-left:20px}.next-col-offset-fixed-xxs-2{margin-left:40px}.next-col-offset-fixed-xxs-3{margin-left:60px}.next-col-offset-fixed-xxs-4{margin-left:80px}.next-col-offset-fixed-xxs-5{margin-left:100px}.next-col-offset-fixed-xxs-6{margin-left:120px}.next-col-offset-fixed-xxs-7{margin-left:140px}.next-col-offset-fixed-xxs-8{margin-left:160px}.next-col-offset-fixed-xxs-9{margin-left:180px}.next-col-offset-fixed-xxs-10{margin-left:200px}.next-col-offset-fixed-xxs-11{margin-left:220px}.next-col-offset-fixed-xxs-12{margin-left:240px}.next-col-offset-fixed-xxs-13{margin-left:260px}.next-col-offset-fixed-xxs-14{margin-left:280px}.next-col-offset-fixed-xxs-15{margin-left:300px}.next-col-offset-fixed-xxs-16{margin-left:320px}.next-col-offset-fixed-xxs-17{margin-left:340px}.next-col-offset-fixed-xxs-18{margin-left:360px}.next-col-offset-fixed-xxs-19{margin-left:380px}.next-col-offset-fixed-xxs-20{margin-left:400px}.next-col-offset-fixed-xxs-21{margin-left:420px}.next-col-offset-fixed-xxs-22{margin-left:440px}.next-col-offset-fixed-xxs-23{margin-left:460px}.next-col-offset-fixed-xxs-24{margin-left:480px}.next-col-offset-fixed-xxs-25{margin-left:500px}.next-col-offset-fixed-xxs-26{margin-left:520px}.next-col-offset-fixed-xxs-27{margin-left:540px}.next-col-offset-fixed-xxs-28{margin-left:560px}.next-col-offset-fixed-xxs-29{margin-left:580px}.next-col-offset-fixed-xxs-30{margin-left:600px}.next-col-offset-fixed-xs-1{margin-left:20px}.next-col-offset-fixed-xs-2{margin-left:40px}.next-col-offset-fixed-xs-3{margin-left:60px}.next-col-offset-fixed-xs-4{margin-left:80px}.next-col-offset-fixed-xs-5{margin-left:100px}.next-col-offset-fixed-xs-6{margin-left:120px}.next-col-offset-fixed-xs-7{margin-left:140px}.next-col-offset-fixed-xs-8{margin-left:160px}.next-col-offset-fixed-xs-9{margin-left:180px}.next-col-offset-fixed-xs-10{margin-left:200px}.next-col-offset-fixed-xs-11{margin-left:220px}.next-col-offset-fixed-xs-12{margin-left:240px}.next-col-offset-fixed-xs-13{margin-left:260px}.next-col-offset-fixed-xs-14{margin-left:280px}.next-col-offset-fixed-xs-15{margin-left:300px}.next-col-offset-fixed-xs-16{margin-left:320px}.next-col-offset-fixed-xs-17{margin-left:340px}.next-col-offset-fixed-xs-18{margin-left:360px}.next-col-offset-fixed-xs-19{margin-left:380px}.next-col-offset-fixed-xs-20{margin-left:400px}.next-col-offset-fixed-xs-21{margin-left:420px}.next-col-offset-fixed-xs-22{margin-left:440px}.next-col-offset-fixed-xs-23{margin-left:460px}.next-col-offset-fixed-xs-24{margin-left:480px}.next-col-offset-fixed-xs-25{margin-left:500px}.next-col-offset-fixed-xs-26{margin-left:520px}.next-col-offset-fixed-xs-27{margin-left:540px}.next-col-offset-fixed-xs-28{margin-left:560px}.next-col-offset-fixed-xs-29{margin-left:580px}.next-col-offset-fixed-xs-30{margin-left:600px}.next-col-offset-fixed-s-1{margin-left:20px}.next-col-offset-fixed-s-2{margin-left:40px}.next-col-offset-fixed-s-3{margin-left:60px}.next-col-offset-fixed-s-4{margin-left:80px}.next-col-offset-fixed-s-5{margin-left:100px}.next-col-offset-fixed-s-6{margin-left:120px}.next-col-offset-fixed-s-7{margin-left:140px}.next-col-offset-fixed-s-8{margin-left:160px}.next-col-offset-fixed-s-9{margin-left:180px}.next-col-offset-fixed-s-10{margin-left:200px}.next-col-offset-fixed-s-11{margin-left:220px}.next-col-offset-fixed-s-12{margin-left:240px}.next-col-offset-fixed-s-13{margin-left:260px}.next-col-offset-fixed-s-14{margin-left:280px}.next-col-offset-fixed-s-15{margin-left:300px}.next-col-offset-fixed-s-16{margin-left:320px}.next-col-offset-fixed-s-17{margin-left:340px}.next-col-offset-fixed-s-18{margin-left:360px}.next-col-offset-fixed-s-19{margin-left:380px}.next-col-offset-fixed-s-20{margin-left:400px}.next-col-offset-fixed-s-21{margin-left:420px}.next-col-offset-fixed-s-22{margin-left:440px}.next-col-offset-fixed-s-23{margin-left:460px}.next-col-offset-fixed-s-24{margin-left:480px}.next-col-offset-fixed-s-25{margin-left:500px}.next-col-offset-fixed-s-26{margin-left:520px}.next-col-offset-fixed-s-27{margin-left:540px}.next-col-offset-fixed-s-28{margin-left:560px}.next-col-offset-fixed-s-29{margin-left:580px}.next-col-offset-fixed-s-30{margin-left:600px}.next-col-offset-fixed-m-1{margin-left:20px}.next-col-offset-fixed-m-2{margin-left:40px}.next-col-offset-fixed-m-3{margin-left:60px}.next-col-offset-fixed-m-4{margin-left:80px}.next-col-offset-fixed-m-5{margin-left:100px}.next-col-offset-fixed-m-6{margin-left:120px}.next-col-offset-fixed-m-7{margin-left:140px}.next-col-offset-fixed-m-8{margin-left:160px}.next-col-offset-fixed-m-9{margin-left:180px}.next-col-offset-fixed-m-10{margin-left:200px}.next-col-offset-fixed-m-11{margin-left:220px}.next-col-offset-fixed-m-12{margin-left:240px}.next-col-offset-fixed-m-13{margin-left:260px}.next-col-offset-fixed-m-14{margin-left:280px}.next-col-offset-fixed-m-15{margin-left:300px}.next-col-offset-fixed-m-16{margin-left:320px}.next-col-offset-fixed-m-17{margin-left:340px}.next-col-offset-fixed-m-18{margin-left:360px}.next-col-offset-fixed-m-19{margin-left:380px}.next-col-offset-fixed-m-20{margin-left:400px}.next-col-offset-fixed-m-21{margin-left:420px}.next-col-offset-fixed-m-22{margin-left:440px}.next-col-offset-fixed-m-23{margin-left:460px}.next-col-offset-fixed-m-24{margin-left:480px}.next-col-offset-fixed-m-25{margin-left:500px}.next-col-offset-fixed-m-26{margin-left:520px}.next-col-offset-fixed-m-27{margin-left:540px}.next-col-offset-fixed-m-28{margin-left:560px}.next-col-offset-fixed-m-29{margin-left:580px}.next-col-offset-fixed-m-30{margin-left:600px}.next-col-offset-fixed-l-1{margin-left:20px}.next-col-offset-fixed-l-2{margin-left:40px}.next-col-offset-fixed-l-3{margin-left:60px}.next-col-offset-fixed-l-4{margin-left:80px}.next-col-offset-fixed-l-5{margin-left:100px}.next-col-offset-fixed-l-6{margin-left:120px}.next-col-offset-fixed-l-7{margin-left:140px}.next-col-offset-fixed-l-8{margin-left:160px}.next-col-offset-fixed-l-9{margin-left:180px}.next-col-offset-fixed-l-10{margin-left:200px}.next-col-offset-fixed-l-11{margin-left:220px}.next-col-offset-fixed-l-12{margin-left:240px}.next-col-offset-fixed-l-13{margin-left:260px}.next-col-offset-fixed-l-14{margin-left:280px}.next-col-offset-fixed-l-15{margin-left:300px}.next-col-offset-fixed-l-16{margin-left:320px}.next-col-offset-fixed-l-17{margin-left:340px}.next-col-offset-fixed-l-18{margin-left:360px}.next-col-offset-fixed-l-19{margin-left:380px}.next-col-offset-fixed-l-20{margin-left:400px}.next-col-offset-fixed-l-21{margin-left:420px}.next-col-offset-fixed-l-22{margin-left:440px}.next-col-offset-fixed-l-23{margin-left:460px}.next-col-offset-fixed-l-24{margin-left:480px}.next-col-offset-fixed-l-25{margin-left:500px}.next-col-offset-fixed-l-26{margin-left:520px}.next-col-offset-fixed-l-27{margin-left:540px}.next-col-offset-fixed-l-28{margin-left:560px}.next-col-offset-fixed-l-29{margin-left:580px}.next-col-offset-fixed-l-30{margin-left:600px}.next-col-offset-fixed-xl-1{margin-left:20px}.next-col-offset-fixed-xl-2{margin-left:40px}.next-col-offset-fixed-xl-3{margin-left:60px}.next-col-offset-fixed-xl-4{margin-left:80px}.next-col-offset-fixed-xl-5{margin-left:100px}.next-col-offset-fixed-xl-6{margin-left:120px}.next-col-offset-fixed-xl-7{margin-left:140px}.next-col-offset-fixed-xl-8{margin-left:160px}.next-col-offset-fixed-xl-9{margin-left:180px}.next-col-offset-fixed-xl-10{margin-left:200px}.next-col-offset-fixed-xl-11{margin-left:220px}.next-col-offset-fixed-xl-12{margin-left:240px}.next-col-offset-fixed-xl-13{margin-left:260px}.next-col-offset-fixed-xl-14{margin-left:280px}.next-col-offset-fixed-xl-15{margin-left:300px}.next-col-offset-fixed-xl-16{margin-left:320px}.next-col-offset-fixed-xl-17{margin-left:340px}.next-col-offset-fixed-xl-18{margin-left:360px}.next-col-offset-fixed-xl-19{margin-left:380px}.next-col-offset-fixed-xl-20{margin-left:400px}.next-col-offset-fixed-xl-21{margin-left:420px}.next-col-offset-fixed-xl-22{margin-left:440px}.next-col-offset-fixed-xl-23{margin-left:460px}.next-col-offset-fixed-xl-24{margin-left:480px}.next-col-offset-fixed-xl-25{margin-left:500px}.next-col-offset-fixed-xl-26{margin-left:520px}.next-col-offset-fixed-xl-27{margin-left:540px}.next-col-offset-fixed-xl-28{margin-left:560px}.next-col-offset-fixed-xl-29{margin-left:580px}.next-col-offset-fixed-xl-30{margin-left:600px}.next-col.next-col-hidden{display:none}@media(min-width:320px)and (max-width:479px){.next-col.next-col-xxs-hidden{display:none}}@media(min-width:480px)and (max-width:719px){.next-col.next-col-xs-hidden{display:none}}@media(min-width:720px)and (max-width:989px){.next-col.next-col-s-hidden{display:none}}@media(min-width:990px)and (max-width:1199px){.next-col.next-col-m-hidden{display:none}}@media(min-width:1200px)and (max-width:1499px){.next-col.next-col-l-hidden{display:none}}@media(min-width:1500px){.next-col.next-col-xl-hidden{display:none}}.next-row.next-row-hidden{display:none}@media(min-width:320px)and (max-width:479px){.next-row.next-row-xxs-hidden{display:none}}@media(min-width:480px)and (max-width:719px){.next-row.next-row-xs-hidden{display:none}}@media(min-width:720px)and (max-width:989px){.next-row.next-row-s-hidden{display:none}}@media(min-width:990px)and (max-width:1199px){.next-row.next-row-m-hidden{display:none}}@media(min-width:1200px)and (max-width:1499px){.next-row.next-row-l-hidden{display:none}}@media(min-width:1500px){.next-row.next-row-xl-hidden{display:none}}.next-col-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}@media(min-width:320px){.next-col-xxs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xxs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xxs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xxs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xxs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xxs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xxs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xxs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xxs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xxs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xxs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xxs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xxs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xxs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xxs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xxs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xxs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xxs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xxs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xxs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xxs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xxs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xxs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xxs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:480px){.next-col-xs-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xs-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xs-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xs-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xs-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xs-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xs-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xs-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xs-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xs-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xs-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xs-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xs-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xs-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xs-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xs-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xs-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xs-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xs-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xs-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xs-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xs-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xs-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xs-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:720px){.next-col-s-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-s-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-s-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-s-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-s-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-s-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-s-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-s-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-s-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-s-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-s-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-s-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-s-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-s-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-s-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-s-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-s-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-s-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-s-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-s-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-s-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-s-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-s-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-s-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:990px){.next-col-m-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-m-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-m-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-m-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-m-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-m-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-m-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-m-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-m-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-m-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-m-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-m-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-m-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-m-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-m-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-m-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-m-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-m-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-m-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-m-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-m-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-m-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-m-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-m-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1200px){.next-col-l-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-l-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-l-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-l-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-l-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-l-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-l-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-l-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-l-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-l-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-l-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-l-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-l-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-l-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-l-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-l-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-l-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-l-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-l-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-l-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-l-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-l-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-l-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-l-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}@media(min-width:1500px){.next-col-xl-offset-1[dir=rtl]{margin-right:4.1666666667%;margin-left:auto}.next-col-xl-offset-2[dir=rtl]{margin-right:8.3333333333%;margin-left:auto}.next-col-xl-offset-3[dir=rtl]{margin-right:12.5%;margin-left:auto}.next-col-xl-offset-4[dir=rtl]{margin-right:16.6666666667%;margin-left:auto}.next-col-xl-offset-5[dir=rtl]{margin-right:20.8333333333%;margin-left:auto}.next-col-xl-offset-6[dir=rtl]{margin-right:25%;margin-left:auto}.next-col-xl-offset-7[dir=rtl]{margin-right:29.1666666667%;margin-left:auto}.next-col-xl-offset-8[dir=rtl]{margin-right:33.3333333333%;margin-left:auto}.next-col-xl-offset-9[dir=rtl]{margin-right:37.5%;margin-left:auto}.next-col-xl-offset-10[dir=rtl]{margin-right:41.6666666667%;margin-left:auto}.next-col-xl-offset-11[dir=rtl]{margin-right:45.8333333333%;margin-left:auto}.next-col-xl-offset-12[dir=rtl]{margin-right:50%;margin-left:auto}.next-col-xl-offset-13[dir=rtl]{margin-right:54.1666666667%;margin-left:auto}.next-col-xl-offset-14[dir=rtl]{margin-right:58.3333333333%;margin-left:auto}.next-col-xl-offset-15[dir=rtl]{margin-right:62.5%;margin-left:auto}.next-col-xl-offset-16[dir=rtl]{margin-right:66.6666666667%;margin-left:auto}.next-col-xl-offset-17[dir=rtl]{margin-right:70.8333333333%;margin-left:auto}.next-col-xl-offset-18[dir=rtl]{margin-right:75%;margin-left:auto}.next-col-xl-offset-19[dir=rtl]{margin-right:79.1666666667%;margin-left:auto}.next-col-xl-offset-20[dir=rtl]{margin-right:83.3333333333%;margin-left:auto}.next-col-xl-offset-21[dir=rtl]{margin-right:87.5%;margin-left:auto}.next-col-xl-offset-22[dir=rtl]{margin-right:91.6666666667%;margin-left:auto}.next-col-xl-offset-23[dir=rtl]{margin-right:95.8333333333%;margin-left:auto}.next-col-xl-offset-24[dir=rtl]{margin-right:100%;margin-left:auto}}.next-col-offset-fixed-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xxs-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xxs-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xxs-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xxs-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xxs-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xxs-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xxs-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xxs-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xxs-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xxs-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xxs-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xxs-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xxs-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xxs-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xxs-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xxs-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xxs-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xxs-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xxs-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xxs-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xxs-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xxs-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xxs-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xxs-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xxs-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xxs-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xxs-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xxs-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xxs-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xxs-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xs-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xs-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xs-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xs-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xs-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xs-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xs-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xs-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xs-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xs-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xs-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xs-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xs-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xs-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xs-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xs-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xs-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xs-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xs-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xs-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xs-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xs-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xs-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xs-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xs-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xs-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xs-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xs-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xs-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xs-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-s-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-s-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-s-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-s-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-s-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-s-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-s-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-s-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-s-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-s-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-s-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-s-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-s-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-s-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-s-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-s-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-s-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-s-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-s-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-s-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-s-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-s-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-s-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-s-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-s-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-s-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-s-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-s-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-s-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-s-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-m-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-m-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-m-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-m-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-m-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-m-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-m-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-m-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-m-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-m-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-m-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-m-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-m-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-m-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-m-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-m-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-m-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-m-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-m-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-m-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-m-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-m-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-m-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-m-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-m-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-m-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-m-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-m-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-m-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-m-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-l-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-l-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-l-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-l-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-l-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-l-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-l-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-l-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-l-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-l-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-l-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-l-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-l-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-l-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-l-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-l-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-l-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-l-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-l-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-l-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-l-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-l-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-l-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-l-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-l-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-l-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-l-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-l-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-l-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-l-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-col-offset-fixed-xl-1[dir=rtl]{margin-right:20px;margin-left:auto}.next-col-offset-fixed-xl-2[dir=rtl]{margin-right:40px;margin-left:auto}.next-col-offset-fixed-xl-3[dir=rtl]{margin-right:60px;margin-left:auto}.next-col-offset-fixed-xl-4[dir=rtl]{margin-right:80px;margin-left:auto}.next-col-offset-fixed-xl-5[dir=rtl]{margin-right:100px;margin-left:auto}.next-col-offset-fixed-xl-6[dir=rtl]{margin-right:120px;margin-left:auto}.next-col-offset-fixed-xl-7[dir=rtl]{margin-right:140px;margin-left:auto}.next-col-offset-fixed-xl-8[dir=rtl]{margin-right:160px;margin-left:auto}.next-col-offset-fixed-xl-9[dir=rtl]{margin-right:180px;margin-left:auto}.next-col-offset-fixed-xl-10[dir=rtl]{margin-right:200px;margin-left:auto}.next-col-offset-fixed-xl-11[dir=rtl]{margin-right:220px;margin-left:auto}.next-col-offset-fixed-xl-12[dir=rtl]{margin-right:240px;margin-left:auto}.next-col-offset-fixed-xl-13[dir=rtl]{margin-right:260px;margin-left:auto}.next-col-offset-fixed-xl-14[dir=rtl]{margin-right:280px;margin-left:auto}.next-col-offset-fixed-xl-15[dir=rtl]{margin-right:300px;margin-left:auto}.next-col-offset-fixed-xl-16[dir=rtl]{margin-right:320px;margin-left:auto}.next-col-offset-fixed-xl-17[dir=rtl]{margin-right:340px;margin-left:auto}.next-col-offset-fixed-xl-18[dir=rtl]{margin-right:360px;margin-left:auto}.next-col-offset-fixed-xl-19[dir=rtl]{margin-right:380px;margin-left:auto}.next-col-offset-fixed-xl-20[dir=rtl]{margin-right:400px;margin-left:auto}.next-col-offset-fixed-xl-21[dir=rtl]{margin-right:420px;margin-left:auto}.next-col-offset-fixed-xl-22[dir=rtl]{margin-right:440px;margin-left:auto}.next-col-offset-fixed-xl-23[dir=rtl]{margin-right:460px;margin-left:auto}.next-col-offset-fixed-xl-24[dir=rtl]{margin-right:480px;margin-left:auto}.next-col-offset-fixed-xl-25[dir=rtl]{margin-right:500px;margin-left:auto}.next-col-offset-fixed-xl-26[dir=rtl]{margin-right:520px;margin-left:auto}.next-col-offset-fixed-xl-27[dir=rtl]{margin-right:540px;margin-left:auto}.next-col-offset-fixed-xl-28[dir=rtl]{margin-right:560px;margin-left:auto}.next-col-offset-fixed-xl-29[dir=rtl]{margin-right:580px;margin-left:auto}.next-col-offset-fixed-xl-30[dir=rtl]{margin-right:600px;margin-left:auto}.next-responsive-grid{box-sizing:border-box;display:grid}.next-responsive-grid *,.next-responsive-grid :after,.next-responsive-grid :before{box-sizing:border-box}.next-responsive-grid-ie{display:block}.next-form,.next-form *,.next-form :after,.next-form :before{box-sizing:border-box}.next-form-preview.next-form-item .next-form-item-label{color:#666}.next-form-preview.next-form-item .next-form-preview{color:#333}.next-form-preview.next-form-item.next-medium .next-form-item-label{font-size:14px;line-height:28px}.next-form-preview.next-form-item.next-small .next-form-item-label{font-size:12px;line-height:20px}.next-form-preview.next-form-item.next-large .next-form-item-label{font-size:16px;line-height:40px}.next-form-responsive-grid .next-form-item-control{flex:1}.next-form-responsive-grid .next-form-item{margin-bottom:0}.next-form-responsive-grid .next-form-item.next-left{display:flex}.next-form-responsive-grid.next-small .next-responsive-grid{gap:16px}.next-form-responsive-grid.next-small .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:6px;margin-bottom:6px}.next-form-responsive-grid.next-medium .next-responsive-grid{gap:20px}.next-form-responsive-grid.next-medium .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:9px;margin-bottom:9px}.next-form-responsive-grid.next-large .next-responsive-grid{gap:24px}.next-form-responsive-grid.next-large .next-form-item.next-left .next-form-item-label{line-height:1.4;margin-top:12px;margin-bottom:12px}.next-form-item{margin-bottom:16px}.next-form-item.has-error>.next-form-item-control>.next-form-item-help{color:#d23c26}.next-form-item.has-warning>.next-form-item-control>.next-form-item-help{color:#f1c826}.next-form-item .next-form-item-label,.next-form-item .next-form-text-align,.next-form-item p{line-height:32px}.next-form-item .next-form-text-align,.next-form-item p{margin:0}.next-form-item .next-checkbox-group,.next-form-item .next-checkbox-wrapper,.next-form-item .next-radio-group,.next-form-item .next-radio-wrapper,.next-form-item .next-rating{line-height:28px}.next-form-item .next-form-preview{font-size:14px;line-height:28px}.next-form-item .next-form-preview.next-input-textarea>p{font-size:14px;text-align:justify;min-height:19.6px;line-height:1.4;margin-top:4.2px}.next-form-item .next-form-item-label{font-size:14px}.next-form-item .next-form-item-label>label{display:inline-block;line-height:1.5}.next-form-item.next-large{margin-bottom:20px}.next-form-item.next-large .next-form-item-label,.next-form-item.next-large .next-form-text-align,.next-form-item.next-large p{line-height:40px}.next-form-item.next-large .next-checkbox-group,.next-form-item.next-large .next-checkbox-wrapper,.next-form-item.next-large .next-radio-group,.next-form-item.next-large .next-radio-wrapper,.next-form-item.next-large .next-rating{line-height:39px}.next-form-item.next-large .next-form-preview{font-size:16px;line-height:40px}.next-form-item.next-large .next-form-preview.next-input-textarea>p{font-size:16px;text-align:justify;min-height:22.4px;line-height:1.4;margin-top:8.8px}.next-form-item.next-large .next-switch{margin-top:7px}.next-form-item.next-large .next-form-item-label{font-size:16px}.next-form-item.next-small{margin-bottom:12px}.next-form-item.next-small .next-checkbox-group,.next-form-item.next-small .next-checkbox-wrapper,.next-form-item.next-small .next-form-item-label,.next-form-item.next-small .next-form-text-align,.next-form-item.next-small .next-radio-group,.next-form-item.next-small .next-radio-wrapper,.next-form-item.next-small .next-rating,.next-form-item.next-small p{line-height:24px}.next-form-item.next-small .next-form-preview{font-size:12px;line-height:20px}.next-form-item.next-small .next-form-preview.next-input-textarea>p{font-size:12px;text-align:justify;min-height:16.8px;line-height:1.4;margin-top:1.6px}.next-form-item.next-small .next-form-item-label{font-size:12px}.next-form-item.next-top>.next-form-item-label{margin-bottom:2px}.next-form-item.next-inset .next-form-item-label{padding-right:0;padding-left:0;line-height:inherit}.next-form-item-control .next-form-text-align{margin:0}.next-form-item-control>.next-input,.next-form-item-control>.next-input-group,.next-form-item-fullwidth .next-form-item-control>.next-date-picker,.next-form-item-fullwidth .next-form-item-control>.next-input,.next-form-item-fullwidth .next-form-item-control>.next-input-group,.next-form-item-fullwidth .next-form-item-control>.next-month-picker,.next-form-item-fullwidth .next-form-item-control>.next-range-picker,.next-form-item-fullwidth .next-form-item-control>.next-select,.next-form-item-fullwidth .next-form-item-control>.next-time-picker,.next-form-item-fullwidth .next-form-item-control>.next-year-picker{width:100%}.next-form-item-fullwidth .next-form-item-control>.next-date-picker2 .next-date-picker2-input input{width:inherit}.next-form-item-label{display:inline-block;vertical-align:top;color:#666;text-align:right;padding-right:12px}.next-form-item-label label[required]:before{margin-right:4px;content:"*";color:#d23c26}.next-form-item-label.has-colon label:after{content:":";position:relative;top:-.5px;margin:0 0 0 2px}.next-form-item-label.next-left{text-align:left}.next-form-item-label.next-left>label[required]:before{display:none}.next-form-item-label.next-left>label[required]:after{margin-left:4px;content:"*";color:#d23c26}.next-form-item-help{margin-top:4px;font-size:12px;line-height:1.5;color:#999}.next-form.next-inline .next-form-item{display:inline-block;vertical-align:top}.next-form.next-inline .next-form-item.next-left .next-form-item-control{display:inline-block;vertical-align:top;line-height:0}.next-form.next-inline .next-form-item:not(:last-child){margin-right:20px}.next-form.next-inline .next-form-item.next-large:not(:last-child){margin-right:24px}.next-form.next-inline .next-form-item.next-small:not(:last-child){margin-right:16px}@media screen and (min-width:0\0)and (min-resolution:0.001dpcm){.next-form-item.next-left>.next-form-item-label,.next-form.next-inline .next-form-item.next-left .next-form-item-control{display:table-cell}}.next-form[dir=rtl] .next-form-item-label{text-align:left;padding-left:12px;padding-right:0}.next-form[dir=rtl].next-inline .next-form-item:not(:last-child){margin-left:20px;margin-right:0}.next-form[dir=rtl].next-inline .next-form-item.next-large:not(:last-child){margin-left:24px;margin-right:0}.next-form[dir=rtl].next-inline .next-form-item.next-small:not(:last-child){margin-left:16px;margin-right:0}.next-avatar{position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#f2f2f2;width:40px;height:40px;line-height:40px;border-radius:50%}.next-avatar-image{background:transparent}.next-avatar-string{position:absolute;left:50%;transform-origin:0 center}.next-avatar-large{width:52px;height:52px;line-height:52px;border-radius:50%}.next-avatar-large-string{position:absolute;left:50%;transform-origin:0 center}.next-avatar-small{width:28px;height:28px;line-height:28px;border-radius:50%}.next-avatar-small-string{position:absolute;left:50%;transform-origin:0 center}.next-avatar-square{border-radius:3px}.next-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.next-select{display:inline-block;position:relative;font-size:0;vertical-align:middle}.next-select,.next-select *,.next-select :after,.next-select :before{box-sizing:border-box}.next-select-trigger{min-width:100px;outline:0;transition:all .1s linear}.next-select-trigger .next-input-label{flex:0 0 auto;width:auto}.next-select-trigger .next-select-values{display:block;width:100%;flex:1 1 0;overflow:hidden}.next-select-trigger .next-select-values>em{font-style:inherit}.next-select-trigger .next-select-values input{padding-left:0;padding-right:0}.next-select-trigger .next-input-control{flex:0 0 auto;width:auto}.next-select-trigger .next-input-control>*{display:inline-block;width:auto}.next-select-trigger .next-input-control>.next-select-arrow{padding-right:0}.next-select-trigger .next-input.next-disabled em{color:#ccc}.next-select-trigger .next-input.next-disabled .next-select-arrow{cursor:not-allowed}.next-select-trigger .next-select-clear{display:none}.next-select-trigger.next-has-clear:hover .next-select-clear{display:inline-block}.next-select-trigger.next-has-clear:hover .next-select-arrow{display:none}.next-select .next-select-inner{display:inline-flex;align-items:center;width:100%;min-width:100px;outline:0;color:#333}.next-select .next-select-inner .next-tag{line-height:1;margin-right:4px;margin-bottom:3px;padding-left:0;padding-right:0}.next-select .next-select-inner .next-input-inner{width:auto}.next-select-trigger-search{position:relative;display:inline-block;vertical-align:top;overflow:hidden;width:100%;max-width:100%}.next-select-trigger-search>input,.next-select-trigger-search>span{display:block;font-size:inherit;font-family:inherit;letter-spacing:inherit;white-space:nowrap;overflow:hidden}.next-select-trigger-search input{position:absolute;background-color:transparent;width:100%;height:100%!important;z-index:1;left:0;border:0;outline:0;margin:0;padding:0;cursor:inherit}.next-select-trigger-search>span{position:relative;visibility:hidden;white-space:pre;max-width:100%;z-index:-1}.next-select-single.next-no-search{cursor:pointer}.next-select-single.next-has-search.next-active .next-select-values>em{display:none}.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search,.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search{width:1px;opacity:0;filter:alpha(opacity=0)}.next-select-single .next-select-values{display:inline-flex;align-items:center}.next-select-single .next-select-values>em{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.next-select-multiple .next-select-compact{position:relative;white-space:nowrap}.next-select-multiple .next-select-compact .next-select-trigger-search{width:auto}.next-select-multiple .next-select-compact .next-select-tag-compact{position:absolute;top:0;right:0;z-index:1;padding:0 4px 0 16px;color:#333;background:linear-gradient(90deg,transparent,#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,transparent,#fafafa 10px)}.next-select-multiple .next-select-values,.next-select-tag .next-select-values{margin-bottom:-3px;height:auto!important}.next-select-multiple .next-select-trigger-search,.next-select-tag .next-select-trigger-search{margin-bottom:3px}.next-select-multiple .next-tag+.next-select-trigger-search,.next-select-tag .next-tag+.next-select-trigger-search{width:auto;min-width:1px}.next-select-multiple .next-input,.next-select-tag .next-input{height:auto;align-items:start}.next-select-multiple.next-small .next-select-values,.next-select-tag.next-small .next-select-values{min-height:22px;padding-top:4px;padding-bottom:4px;line-height:14px}.next-select-multiple.next-small .next-select-values-compact,.next-select-tag.next-small .next-select-values-compact{height:24px!important}.next-select-multiple.next-small .next-tag,.next-select-tag.next-small .next-tag{border:0;padding-top:0;padding-bottom:0;height:14px}.next-select-multiple.next-small .next-tag-body,.next-select-multiple.next-small .next-tag .next-tag-body,.next-select-multiple.next-small .next-tag .next-tag-close-btn,.next-select-tag.next-small .next-tag-body,.next-select-tag.next-small .next-tag .next-tag-body,.next-select-tag.next-small .next-tag .next-tag-close-btn{line-height:14px}.next-select-multiple.next-small .next-input-control,.next-select-multiple.next-small .next-input-inner,.next-select-multiple.next-small .next-input-label,.next-select-multiple.next-small .next-select-tag-compact,.next-select-tag.next-small .next-input-control,.next-select-tag.next-small .next-input-inner,.next-select-tag.next-small .next-input-label,.next-select-tag.next-small .next-select-tag-compact{line-height:22px}.next-select-multiple.next-medium .next-select-values,.next-select-tag.next-medium .next-select-values{min-height:30px;padding-top:5px;padding-bottom:5px;line-height:20px}.next-select-multiple.next-medium .next-select-values-compact,.next-select-tag.next-medium .next-select-values-compact{height:32px!important}.next-select-multiple.next-medium .next-tag,.next-select-tag.next-medium .next-tag{padding-top:1px;padding-bottom:1px;height:20px}.next-select-multiple.next-medium .next-tag .next-tag-body,.next-select-multiple.next-medium .next-tag .next-tag-close-btn,.next-select-tag.next-medium .next-tag .next-tag-body,.next-select-tag.next-medium .next-tag .next-tag-close-btn{line-height:18px}.next-select-multiple.next-medium .next-input-control,.next-select-multiple.next-medium .next-input-inner,.next-select-multiple.next-medium .next-input-label,.next-select-multiple.next-medium .next-select-tag-compact,.next-select-tag.next-medium .next-input-control,.next-select-tag.next-medium .next-input-inner,.next-select-tag.next-medium .next-input-label,.next-select-tag.next-medium .next-select-tag-compact{line-height:30px}.next-select-multiple.next-large .next-select-values,.next-select-tag.next-large .next-select-values{min-height:38px;padding-top:7px;padding-bottom:7px;line-height:24px}.next-select-multiple.next-large .next-select-values-compact,.next-select-tag.next-large .next-select-values-compact{height:40px!important}.next-select-multiple.next-large .next-tag,.next-select-tag.next-large .next-tag{padding-top:3px;padding-bottom:3px;height:24px}.next-select-multiple.next-large .next-tag .next-tag-body,.next-select-multiple.next-large .next-tag .next-tag-close-btn,.next-select-tag.next-large .next-tag .next-tag-body,.next-select-tag.next-large .next-tag .next-tag-close-btn{line-height:18px}.next-select-multiple.next-large .next-input-control,.next-select-multiple.next-large .next-input-inner,.next-select-multiple.next-large .next-input-label,.next-select-multiple.next-large .next-select-tag-compact,.next-select-tag.next-large .next-input-control,.next-select-tag.next-large .next-input-inner,.next-select-tag.next-large .next-input-label,.next-select-tag.next-large .next-select-tag-compact{line-height:38px}.next-select-auto-complete{width:160px}.next-select-auto-complete .next-input{width:100%}.next-select-auto-complete .next-input .next-input-hint-wrap{padding-right:1px}.next-select-auto-complete .next-input .next-select-arrow{padding-left:0}.next-select.next-active .next-select-arrow .next-icon-arrow-down{transform:rotate(180deg)}.next-select .next-select-unfold-icon:before{content:""}.next-select-symbol-fold:before{content:""}.next-select-arrow{cursor:pointer;width:auto!important;text-align:center;transition:all .1s linear}.next-select-popup-wrap{animation-duration:.3s;animation-timing-function:ease;padding:0}.next-select-spacing-tb{padding:0}.next-select-menu-wrapper{max-height:260px;overflow:auto;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none}.next-select-menu-wrapper .next-select-menu{max-height:none;border:none}.next-select-menu{max-height:260px;overflow:auto}.next-select-menu .next-select-menu-empty-content{padding-left:8px;padding-right:8px;color:#999}.next-select-menu.next-select-auto-complete-menu.next-select-menu-empty{display:none}.next-select-menu .next-menu-item-text .next-icon{vertical-align:middle}.next-select-all{display:block;cursor:pointer;padding:0 8px;margin:0 12px 8px;border-bottom:1px solid #e6e6e6}.next-select-all:hover{color:#2580e7}.next-select-all .next-menu-icon-selected.next-icon{display:inline-block!important;top:auto;color:#209bfa}.next-select-highlight{color:#209bfa;font-size:14px}.next-select-in-ie.next-select-trigger .next-select-values{overflow:visible}.next-select-in-ie.next-select-trigger .next-input-control,.next-select-in-ie.next-select-trigger .next-input-label{width:1px}.next-select-in-ie.next-select-trigger .next-input-control>*{display:table-cell;width:1%}.next-select-in-ie.next-select-trigger .next-select-arrow{display:table-cell}.next-select-in-ie.next-select-trigger .next-select-clear{display:none}.next-select-in-ie.next-select-trigger.next-select-multiple .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-tag .next-select-inner{vertical-align:top}.next-select-in-ie.next-select-trigger .next-select-inner,.next-select-in-ie.next-select-trigger.next-select-single .next-select-values{display:inline-table}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-small .next-select-values{line-height:24px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-medium .next-select-values{line-height:32px}.next-select-in-ie.next-select-trigger.next-select-single .next-input.next-large .next-select-values{line-height:40px}.next-select-in-ie.next-select-trigger .next-select-trigger-search>span{max-width:100px}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values{position:relative}.next-select-in-ie.next-select-trigger.next-select-single.next-select-in-ie-fixwidth .next-select-values>em{position:absolute;display:inline-block;height:100%;line-height:1;vertical-align:middle;overflow:hidden;left:4px;right:0;top:30%}.next-select-in-ie.next-select-trigger.next-select-single.next-inactive .next-select-values>em+.next-select-trigger-search,.next-select-in-ie.next-select-trigger.next-select-single.next-no-search .next-select-values>em+.next-select-trigger-search{filter:alpha(opacity=0);font-size:0}.next-select-in-ie.next-select-trigger.next-no-search .next-select-trigger-search input{color:inherit}@media screen and (-webkit-min-device-pixel-ratio:0){.next-select-multiple .next-select-compact .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 10px)}.next-select-multiple .next-disabled .next-select-tag-compact{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fafafa 10px)}}.next-select.next-select-multiple[dir=rtl] .next-select-compact .next-select-tag-compact{left:0;right:auto;padding:0 16px 0 4px;background:linear-gradient(270deg,hsla(0,0%,100%,0),#fff 10px)}.next-list-header{border-bottom:1px solid #e6e6e6;color:#333}.next-list-footer{border-top:1px solid #e6e6e6;color:#666}.next-list-loading.next-loading{display:block}.next-list-empty{font-size:14px;color:#ccc;padding:32px 0;text-align:center}.next-list-items{margin:0;padding:0;list-style:none}.next-list-item{display:table;display:flex;width:100%;color:#666}.next-list-item-extra,.next-list-item-media{display:table-cell;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;min-width:1px;flex-shrink:0;vertical-align:top}.next-list-item-extra{color:#999}.next-list-item-content{display:table-cell;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;flex:1;width:100%;vertical-align:middle}.next-list-item-title{color:#333}.next-list-medium .next-list-header{padding:16px 0;font-size:20px;font-weight:700}.next-list-medium .next-list-footer{padding:16px 0}.next-list-medium .next-list-item-media{padding-right:8px}.next-list-medium .next-list-item-extra{padding-left:8px}.next-list-medium .next-list-item{font-size:14px;line-height:1.5;padding:16px 0}.next-list-medium .next-list-item-title{font-weight:400;font-size:16px;line-height:1.5}.next-list-small .next-list-header{padding:8px 0;font-size:16px;font-weight:700}.next-list-small .next-list-footer{padding:8px 0}.next-list-small .next-list-item-media{padding-right:8px}.next-list-small .next-list-item-extra{padding-left:8px}.next-list-small .next-list-item{font-size:14px;font-weight:400;line-height:1.3;padding:8px 0}.next-list-small .next-list-item-title{font-size:14px;line-height:1.5}.next-list-divider .next-list-item{border-bottom:1px solid #e6e6e6}.next-list-divider .next-list-item:last-child{border-bottom:none}.next-list[dir=rtl] .next-list-item-media{padding-left:8px;padding-right:0}.next-list[dir=rtl] .next-list-item-extra{padding-right:8px;padding-left:0}.next-list[dir=rtl] .next-list-small .next-list-item-media{padding-left:8px;padding-right:0}.next-list[dir=rtl] .next-list-small .next-list-item-extra{padding-right:8px;padding-left:0}.next-menu-btn{display:inline-block;box-shadow:none}.next-menu-btn-spacing-tb{padding:0}.next-menu-btn .next-icon{transition:transform .1s linear}.next-menu-btn .next-menu-btn-arrow:before{content:""}.next-menu-btn.next-expand .next-menu-btn-arrow{transform:rotate(180deg)}.next-menu-btn-symbol-unfold:before{content:""}.next-menu-btn.next-btn-normal .next-menu-btn-arrow{color:#999}.next-menu-btn.next-btn-normal:hover .next-menu-btn-arrow{color:#333}.next-menu-btn.next-btn-secondary .next-menu-btn-arrow{color:#209bfa}.next-menu-btn.next-btn-secondary:hover .next-menu-btn-arrow{color:#fff}.next-menu-btn.next-btn-secondary.next-btn-text:hover .next-menu-btn-arrow{color:#209bfa}.next-menu-btn.next-btn-primary .next-menu-btn-arrow,.next-menu-btn.next-btn-primary:hover .next-menu-btn-arrow{color:#fff}.next-menu-btn.next-btn-text.next-btn-normal .next-menu-btn-arrow{color:#333}.next-menu-btn.next-btn-text.next-btn-normal:hover .next-menu-btn-arrow{color:#209bfa}.next-menu-btn.next-btn-text.next-btn-primary .next-menu-btn-arrow{color:#298dff}.next-menu-btn.next-btn-text.next-btn-primary:hover .next-menu-btn-arrow{color:#1274e7}.next-menu-btn.next-btn-ghost.next-btn-light .next-menu-btn-arrow{color:#333}.next-menu-btn.next-btn-ghost.next-btn-light:hover .next-menu-btn-arrow{color:#999}.next-menu-btn.next-btn-ghost.next-btn-dark .next-menu-btn-arrow,.next-menu-btn.next-btn-ghost.next-btn-dark:hover .next-menu-btn-arrow{color:#fff}.next-menu-btn.disabled .next-menu-btn-arrow,.next-menu-btn.next-btn-text.disabled .next-menu-btn-arrow,.next-menu-btn.next-btn-text[disabled] .next-menu-btn-arrow,.next-menu-btn[disabled] .next-menu-btn-arrow{color:#ccc}.next-menu-btn[disabled].next-btn-ghost.next-btn-dark .next-menu-btn-arrow{color:hsla(0,0%,100%,.4)}.next-menu-btn[disabled].next-btn-ghost.next-btn-light .next-menu-btn-arrow{color:rgba(0,0,0,.1)}.next-nav{min-width:auto;border-radius:0}.next-nav,.next-nav *,.next-nav :after,.next-nav :before{box-sizing:border-box}.next-nav-icon.next-icon{margin-right:12px;font-weight:inherit}.next-nav-icon.next-icon .next-icon-remote,.next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav-group-label{height:40px;line-height:40px;font-size:14px}.next-nav-item .next-menu-item-text>span,.next-nav-item .next-nav-group-label>span{opacity:1;transition:opacity .1s linear}.next-nav-item .next-menu-item-text>a{text-decoration:none;color:inherit}.next-nav-item.next-focused .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-focused .next-menu-icon-arrow.next-icon,.next-nav-item .next-menu-hoz-icon-arrow.next-icon,.next-nav-item .next-menu-icon-arrow.next-icon,.next-nav-item.next-opened .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-opened .next-menu-icon-arrow.next-icon,.next-nav-item.next-selected .next-menu-hoz-icon-arrow.next-icon,.next-nav-item.next-selected .next-menu-icon-arrow.next-icon,.next-nav-item:hover .next-menu-hoz-icon-arrow.next-icon,.next-nav-item:hover .next-menu-icon-arrow.next-icon{color:inherit;top:0;transform-origin:center 50%}.next-nav.next-active .next-nav-item:before{position:absolute;transition:all .3s ease;content:""}.next-nav.next-hoz{padding:0;height:44px;line-height:42px;font-size:14px}.next-nav.next-hoz .next-menu-item.next-nav-item{margin-left:0;margin-right:0;padding:0 20px;border-radius:0}.next-nav.next-hoz .next-menu-item,.next-nav.next-hoz .next-menu-sub-menu-wrapper>.next-menu-item{margin-top:0;margin-bottom:0}.next-nav.next-hoz .next-menu-item-inner{height:42px;font-size:14px}.next-nav.next-hoz .next-menu-item.next-nav-item.next-nav-with-title{line-height:1;padding:12px 8px}.next-nav.next-hoz .next-menu-item.next-nav-item.next-nav-with-title .next-menu-item-inner{height:auto;min-height:42px}.next-nav.next-hoz .next-menu-item.next-nav-item.next-nav-with-title .next-nav-text{display:block;line-height:1;margin-top:8px;overflow:hidden;text-overflow:ellipsis}.next-nav.next-hoz .next-nav-group-label .next-menu-item-inner{height:40px;line-height:40px;font-size:14px}.next-nav.next-hoz .next-menu-header{float:left;height:42px}.next-nav.next-hoz .next-menu-footer{float:right;height:42px}.next-nav.next-hoz .next-nav-item:before{width:0;left:50%;height:2px}.next-nav.next-hoz .next-nav-item:hover:before{height:0}.next-nav.next-hoz.next-top .next-nav-item:before{top:-1px}.next-nav.next-hoz.next-bottom .next-nav-item:before{bottom:-1px}.next-nav.next-hoz .next-selected.next-nav-item:before{width:100%;left:0;height:2px}.next-nav.next-ver{padding:0;transition:width .3s ease;line-height:52px;font-size:14px}.next-nav.next-ver .next-menu-item.next-nav-item{margin-left:0;margin-right:0;padding:0 16px;border-radius:0}.next-nav.next-ver .next-menu-item:not(:first-child),.next-nav.next-ver .next-menu-sub-menu-wrapper:not(:first-child)>.next-menu-item{margin-top:0}.next-nav.next-ver .next-menu-item:not(:last-child),.next-nav.next-ver .next-menu-sub-menu-wrapper:not(:last-child)>.next-menu-item{margin-bottom:0}.next-nav.next-ver .next-menu-item-inner{height:52px;font-size:14px}.next-nav.next-ver .next-menu-item.next-nav-item.next-nav-with-title{line-height:1;padding:12px 8px}.next-nav.next-ver .next-menu-item.next-nav-item.next-nav-with-title .next-menu-item-inner{height:auto;min-height:52px}.next-nav.next-ver .next-menu-item.next-nav-item.next-nav-with-title .next-nav-text{display:block;line-height:1;margin-top:8px;overflow:hidden;text-overflow:ellipsis}.next-nav.next-ver .next-nav-group-label .next-menu-item-inner{height:40px;line-height:40px;font-size:14px}.next-nav.next-ver>.next-menu-item:first-child,.next-nav.next-ver>.next-menu-sub-menu-wrapper:first-child>.next-menu-item{margin-top:0}.next-nav.next-ver>.next-menu-item:last-child,.next-nav.next-ver>.next-menu-sub-menu-wrapper:last-child>.next-menu-item{margin-bottom:0}.next-nav.next-ver .next-menu-sub-menu{line-height:52px}.next-nav.next-ver .next-menu-sub-menu .next-menu-item-inner{height:52px;font-size:14px}.next-nav.next-ver .next-nav-item:before{height:0;top:50%;width:2px}.next-nav.next-ver .next-nav-item:hover:before{width:0}.next-nav.next-ver.next-left .next-nav-item:before,.next-nav.next-ver.next-top .next-nav-item:before{left:-1px}.next-nav.next-ver.next-bottom .next-nav-item:before,.next-nav.next-ver.next-right .next-nav-item:before{right:-1px}.next-nav.next-ver .next-selected.next-nav-item:before{height:100%;top:0;width:2px}.next-nav.next-primary{border-width:0;background:#222;border-color:#222;color:#ddd;font-weight:400;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12)}.next-nav.next-primary.next-hoz{line-height:44px}.next-nav.next-primary.next-hoz .next-menu-footer,.next-nav.next-primary.next-hoz .next-menu-header,.next-nav.next-primary.next-hoz .next-menu-item-inner{line-height:44px;height:44px}.next-nav.next-primary.next-hoz.next-top .next-nav-item:before{top:0}.next-nav.next-primary.next-hoz.next-bottom .next-nav-item:before{bottom:0}.next-nav.next-primary.next-ver.next-left .next-nav-item:before{left:0}.next-nav.next-primary.next-ver.next-right .next-nav-item:before{right:0}.next-nav.next-primary .next-nav-item.next-menu-item{background:#222;color:#ddd}.next-nav.next-primary .next-nav-item.next-menu-item.next-focused,.next-nav.next-primary .next-nav-item.next-menu-item:hover{background:#333;color:#fff;font-weight:400}.next-nav.next-primary .next-nav-item.next-menu-item.next-selected{background:#333;color:#fff;font-weight:700}.next-nav.next-primary .next-nav-item.next-menu-item.next-opened{background:#222;color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item.next-child-selected{font-weight:700;background:transparent;color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item.next-child-selected.next-nav-popup,.next-nav.next-primary .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item:before,.next-nav.next-primary .next-nav-item.next-menu-item:hover:before{background:#209bfa}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-opened{background:#222;color:#fff}.next-nav.next-primary .next-nav-group-label{color:#999;font-weight:400}.next-nav.next-primary .next-menu-sub-menu .next-menu-item{background:#151515;color:#ddd;font-weight:400}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-primary .next-menu-sub-menu .next-menu-item:hover{background:#333;color:#ddd}.next-nav.next-primary .next-menu-sub-menu .next-menu-item.next-selected{background:#333;color:#fff}.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#ccc;cursor:not-allowed}.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-primary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#ccc}.next-nav.next-secondary{border-width:0;background:#209bfa;border-color:#209bfa;color:#fff;font-weight:400;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12)}.next-nav.next-secondary.next-hoz{line-height:44px}.next-nav.next-secondary.next-hoz .next-menu-footer,.next-nav.next-secondary.next-hoz .next-menu-header,.next-nav.next-secondary.next-hoz .next-menu-item-inner{line-height:44px;height:44px}.next-nav.next-secondary.next-hoz.next-top .next-nav-item:before{top:0}.next-nav.next-secondary.next-hoz.next-bottom .next-nav-item:before{bottom:0}.next-nav.next-secondary.next-ver.next-left .next-nav-item:before{left:0}.next-nav.next-secondary.next-ver.next-right .next-nav-item:before{right:0}.next-nav.next-secondary .next-nav-item.next-menu-item{background:#209bfa;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-focused,.next-nav.next-secondary .next-nav-item.next-menu-item:hover{background:#1274e7;color:#fff;font-weight:400}.next-nav.next-secondary .next-nav-item.next-menu-item.next-selected{background:#1274e7;color:#fff;font-weight:700}.next-nav.next-secondary .next-nav-item.next-menu-item.next-opened{background:transparent;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-child-selected{font-weight:700;background:transparent;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-child-selected.next-nav-popup,.next-nav.next-secondary .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item:before,.next-nav.next-secondary .next-nav-item.next-menu-item:hover:before{background:#1274e7}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;color:#fff}.next-nav.next-secondary .next-nav-group-label{color:#fff;font-weight:400}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item{background:#209bfa;color:#fff;font-weight:400}.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-secondary .next-menu-sub-menu .next-menu-item.next-selected,.next-nav.next-secondary .next-menu-sub-menu .next-menu-item:hover{background:#1274e7;color:#fff}.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#add9ff;cursor:not-allowed}.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-secondary .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#add9ff}.next-nav.next-normal{border-color:#eee;font-weight:400;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12)}.next-nav.next-normal,.next-nav.next-normal .next-nav-item.next-menu-item{background:#fff;color:#666}.next-nav.next-normal .next-nav-item.next-menu-item.next-focused,.next-nav.next-normal .next-nav-item.next-menu-item:hover{background:#fff;color:#333;font-weight:500}.next-nav.next-normal .next-nav-item.next-menu-item.next-selected{background:#e4f3fe;color:#209bfa;font-weight:700}.next-nav.next-normal .next-nav-item.next-menu-item.next-opened{background:transparent;color:#333}.next-nav.next-normal .next-nav-item.next-menu-item.next-child-selected{font-weight:400;background:transparent;color:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#333}.next-nav.next-normal .next-nav-item.next-menu-item.next-child-selected.next-nav-popup{color:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item:before{background:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item:hover:before{background:#1b84e0}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;color:#333}.next-nav.next-normal .next-nav-group-label{color:#999;font-weight:400}.next-nav.next-normal .next-menu-sub-menu .next-menu-item{background:#fafafa;color:#666;font-weight:400}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-normal .next-menu-sub-menu .next-menu-item:hover{background:#f9f9f9;color:#298dff}.next-nav.next-normal .next-menu-sub-menu .next-menu-item.next-selected{background:#e4f3fe;color:#209bfa}.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#999;cursor:not-allowed}.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-normal .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#999}.next-nav.next-line{background:transparent;border-color:#e6e6e6;color:#333;font-weight:400;box-shadow:none}.next-nav.next-line.next-hoz{border-right-color:transparent}.next-nav.next-line.next-hoz,.next-nav.next-line.next-ver{border-top-color:transparent;border-left-color:transparent}.next-nav.next-line.next-ver{border-bottom-color:transparent}.next-nav.next-line .next-nav-item.next-menu-item{background:transparent;color:#333}.next-nav.next-line .next-nav-item.next-menu-item.next-focused,.next-nav.next-line .next-nav-item.next-menu-item:hover{background:transparent;color:#209bfa;font-weight:400}.next-nav.next-line .next-nav-item.next-menu-item.next-selected{background:transparent;color:#209bfa;font-weight:700}.next-nav.next-line .next-nav-item.next-menu-item.next-opened{background:transparent;color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item.next-child-selected{font-weight:400;background:transparent;color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item.next-child-selected.next-nav-popup,.next-nav.next-line .next-nav-item.next-menu-item.next-opened.next-nav-popup{color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item:before,.next-nav.next-line .next-nav-item.next-menu-item:hover:before{background:#209bfa}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-opened{background:transparent;color:#209bfa}.next-nav.next-line .next-nav-group-label{color:#999;font-weight:400}.next-nav.next-line .next-menu-sub-menu .next-menu-item{background:transparent;color:#333;font-weight:400}.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-focused,.next-nav.next-line .next-menu-sub-menu .next-menu-item.next-selected,.next-nav.next-line .next-menu-sub-menu .next-menu-item:hover{background:transparent;color:#209bfa}.next-nav.next-line .next-nav-item.next-menu-item.next-disabled,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a{color:#999;cursor:not-allowed}.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-icon-arrow,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-icon-selected,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-arrow,.next-nav.next-line .next-nav-item.next-menu-item.next-disabled .next-menu-item-text>a .next-menu-icon-selected{color:#999}.next-nav.next-icon-only.next-icon-only-text{padding-top:4px;padding-bottom:4px}.next-nav.next-icon-only.next-custom-icon-only-width{text-align:center}.next-nav.next-icon-only .next-menu-item-inner{text-overflow:clip}.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon{margin-left:2px;margin-right:2px}.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-normal .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon{margin-left:3px;margin-right:3px}.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-primary .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon{margin-left:3px;margin-right:3px}.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon .next-icon-remote,.next-nav.next-icon-only.next-secondary .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon{margin-left:3px;margin-right:3px;transition:all .1s linear;transform-origin:center 50%}.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon .next-icon-remote,.next-nav.next-icon-only .next-nav-icon-only-arrow.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down{transform:rotate(180deg);margin-left:3px;margin-right:3px}.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down .next-icon-remote,.next-nav.next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down:before{width:20px;font-size:20px;line-height:inherit}.next-nav.next-icon-only .next-menu-hoz-icon-arrow,.next-nav.next-icon-only .next-menu-icon-arrow{display:none}.next-nav-embeddable.next-normal,.next-nav-embeddable.next-primary,.next-nav-embeddable.next-secondary{height:100%;background:transparent;box-shadow:none;border:none}.next-nav-embeddable.next-normal .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-normal .next-nav-item.next-menu-item,.next-nav-embeddable.next-primary .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-primary .next-nav-item.next-menu-item,.next-nav-embeddable.next-secondary .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-secondary .next-nav-item.next-menu-item{background:transparent}.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon{margin-left:3px;margin-right:3px}.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-normal.next-icon-only .next-nav-icon.next-icon:before,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-primary.next-icon-only .next-nav-icon.next-icon:before,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav-embeddable.next-secondary.next-icon-only .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav-embeddable.next-nav.next-hoz .next-menu-item-inner,.next-nav-embeddable.next-nav.next-hoz .next-menu-sub-menu .next-menu-item,.next-nav-embeddable.next-nav.next-hoz .next-nav-item.next-menu-item{height:100%}.next-nav-embeddable,.next-nav-embeddable .next-nav-item.next-disabled,.next-nav-embeddable .next-nav-item.next-disabled .next-menu-item-text>a{background:transparent;border:none}.next-nav[dir=rtl] .next-nav-icon.next-icon{margin-left:12px;margin-right:0}.next-nav[dir=rtl] .next-nav-icon.next-icon .next-icon-remote,.next-nav[dir=rtl] .next-nav-icon.next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-nav[dir=rtl].next-hoz .next-menu-header{float:right}.next-nav[dir=rtl].next-hoz .next-menu-footer{float:left}.next-nav[dir=rtl].next-hoz .next-nav-item:before{width:0;left:50%}.next-nav[dir=rtl].next-hoz .next-selected.next-nav-item:before{width:100%;left:auto;right:0}.next-nav[dir=rtl].next-ver.next-left .next-nav-item:before{right:0;right:-1px;left:auto}.next-nav[dir=rtl].next-ver.next-right .next-nav-item:before{left:0;left:-1px;right:auto}.next-nav[dir=rtl].next-primary.next-ver.next-left .next-nav-item:before{right:0;left:auto}.next-nav[dir=rtl].next-primary.next-ver.next-right .next-nav-item:before{left:0;right:auto}.next-nav[dir=rtl].next-secondary.next-ver.next-left .next-nav-item:before{right:0;left:auto}.next-nav[dir=rtl].next-secondary.next-ver.next-right .next-nav-item:before{left:0;right:auto}.next-nav[dir=rtl] .next-nav.next-line.next-ver{border-color:transparent}.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down{margin-left:0;margin-right:-1px}.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-icon-only-arrow.next-icon:before,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-icon.next-icon:before,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down .next-icon-remote,.next-nav[dir=rtl].next-icon-only .next-nav-item.next-opened .next-nav-icon-only-arrow.next-icon-arrow-down:before{width:20px;font-size:20px;line-height:inherit}.next-number-picker{display:inline-block}.next-number-picker,.next-number-picker *,.next-number-picker :after,.next-number-picker :before{box-sizing:border-box}.next-number-picker .next-btn{padding:0!important;line-height:0!important;box-shadow:none!important}.next-number-picker-normal .next-input{width:100%}.next-number-picker-normal .next-input .next-input-control{padding-right:0;height:100%}.next-number-picker-normal:not(.next-number-picker-no-trigger) .next-input input{padding-right:2px}.next-number-picker-normal .next-btn{display:block}.next-number-picker-normal .next-btn:hover{z-index:1}.next-number-picker-normal .next-btn:first-child{border-right:none;border-top:none;height:50%;border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.next-number-picker-normal .next-btn:last-child{border-right:none;border-bottom:none;margin-top:-1px;height:calc(50% + 1px);border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0}.next-number-picker-normal .next-number-picker-handler{transition:opacity .1s linear;height:100%;display:block}.next-number-picker-normal:not(.next-number-picker-show-trigger) .next-number-picker-handler{opacity:0}.next-number-picker-normal.hover .next-number-picker-handler,.next-number-picker-normal:hover .next-number-picker-handler{opacity:1}.next-number-picker-normal .next-input.next-disabled .next-number-picker-handler{opacity:0}.next-number-picker-normal .next-number-picker-up-icon:before{content:""}.next-number-picker-normal .next-number-picker-down-icon:before{content:""}.next-number-picker-normal.next-small{width:68px}.next-number-picker-normal.next-small .next-btn{width:20px}.next-number-picker-normal.next-small .next-btn:first-child{border-top-right-radius:3px}.next-number-picker-normal.next-small .next-btn:last-child{border-bottom-right-radius:3px}.next-number-picker-normal.next-small .next-icon .next-icon-remote,.next-number-picker-normal.next-small .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-small .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-small .next-icon:before{width:16px;font-size:16px}}.next-number-picker-normal.next-medium{width:80px}.next-number-picker-normal.next-medium .next-btn{width:20px}.next-number-picker-normal.next-medium .next-btn:first-child{border-top-right-radius:3px}.next-number-picker-normal.next-medium .next-btn:last-child{border-bottom-right-radius:3px}.next-number-picker-normal.next-medium .next-icon .next-icon-remote,.next-number-picker-normal.next-medium .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-medium .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-medium .next-icon:before{width:16px;font-size:16px}}.next-number-picker-normal.next-large{width:80px}.next-number-picker-normal.next-large .next-btn{width:20px}.next-number-picker-normal.next-large .next-btn:first-child{border-top-right-radius:3px}.next-number-picker-normal.next-large .next-btn:last-child{border-bottom-right-radius:3px}.next-number-picker-normal.next-large .next-icon .next-icon-remote,.next-number-picker-normal.next-large .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-number-picker-normal.next-large .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-number-picker-normal.next-large .next-icon:before{width:16px;font-size:16px}}.next-number-picker-inline input{text-align:center}.next-number-picker-inline .next-input input{padding:0}.next-number-picker-inline .next-number-picker-add-icon:before{content:""}.next-number-picker-inline .next-number-picker-minus-icon:before{content:""}.next-number-picker-inline.next-small{width:68px;min-width:72px}.next-number-picker-inline.next-small .next-icon .next-icon-remote,.next-number-picker-inline.next-small .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-small .next-btn{height:24px}.next-number-picker-inline.next-small .next-before .next-btn{margin-right:2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-number-picker-inline.next-small .next-after .next-btn{margin-left:2px;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-number-picker-inline.next-medium{width:100px;min-width:96px}.next-number-picker-inline.next-medium .next-icon .next-icon-remote,.next-number-picker-inline.next-medium .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-medium .next-btn{height:32px}.next-number-picker-inline.next-medium .next-before .next-btn{margin-right:2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-number-picker-inline.next-medium .next-after .next-btn{margin-left:2px;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-number-picker-inline.next-large{width:128px;min-width:120px}.next-number-picker-inline.next-large .next-icon .next-icon-remote,.next-number-picker-inline.next-large .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-number-picker-inline.next-large .next-btn{height:40px}.next-number-picker-inline.next-large .next-before .next-btn{margin-right:2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.next-number-picker-inline.next-large .next-after .next-btn{margin-left:2px;border-top-right-radius:3px;border-bottom-right-radius:3px}.next-number-picker-inline .next-btn.next-small{width:24px}.next-number-picker-inline .next-btn.next-medium{width:32px}.next-number-picker-inline .next-btn.next-large{width:40px}@-moz-document url-prefix(){.next-number-picker-normal.next-small .next-number-picker-handler{height:22px}.next-number-picker-normal.next-medium .next-number-picker-handler{height:30px}.next-number-picker-normal.next-large .next-number-picker-handler{height:38px}}.next-number-picker-normal[dir=rtl] .next-btn:first-child{border-right:1px solid #ddd;border-left:0;border-top-right-radius:0}.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-large,.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-medium,.next-number-picker-normal[dir=rtl] .next-btn:first-child.next-small{border-top-left-radius:3px}.next-number-picker-normal[dir=rtl] .next-btn:last-child{border-right:1px solid #ddd;border-left:0;border-bottom-right-radius:0}.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-large,.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-medium,.next-number-picker-normal[dir=rtl] .next-btn:last-child.next-small{border-bottom-left-radius:3px}.next-number-picker-normal[dir=rtl] .next-input .next-input-control{padding-left:0}.next-number-picker-inline[dir=rtl] .next-before .next-btn{margin-right:0}.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-large,.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-medium,.next-number-picker-inline[dir=rtl] .next-before .next-btn.next-small{margin-left:2px;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.next-number-picker-inline[dir=rtl] .next-after .next-btn{margin-left:0}.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-large,.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-medium,.next-number-picker-inline[dir=rtl] .next-after .next-btn.next-small{margin-right:2px;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.next-pagination[dir=rtl] .next-pagination-total{margin-right:0;margin-left:16px}.next-pagination[dir=rtl] .next-pagination-jump-go{margin-left:0;margin-right:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-title{margin-right:0;margin-left:4px}.next-pagination[dir=rtl] .next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:none;border-right:1px solid #e6e6e6}.next-pagination[dir=rtl] .next-pagination-pages+.next-pagination-size-selector,.next-pagination[dir=rtl] .next-pagination-size-selector+.next-pagination-pages{margin-left:0;margin-right:40px}.next-pagination[dir=rtl].next-start .next-pagination-pages{float:left}.next-pagination[dir=rtl].next-end .next-pagination-pages,.next-pagination[dir=rtl].next-start .next-pagination-size-selector{float:right}.next-pagination[dir=rtl].next-end .next-pagination-size-selector{float:left}.next-pagination[dir=rtl].next-small .next-pagination-list{margin:0 4px}.next-pagination[dir=rtl].next-small .next-pagination-total{line-height:24px;vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-item{padding:0 6px;border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-small .next-pagination-item+.next-pagination-item{margin:0 4px 0 0}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis{height:24px;line-height:24px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-small .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-small .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination[dir=rtl].next-small .next-pagination-display,.next-pagination[dir=rtl].next-small .next-pagination-display em,.next-pagination[dir=rtl].next-small .next-pagination-jump-text{font-size:12px}.next-pagination[dir=rtl].next-small .next-pagination-jump-input{width:28px}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-title{height:24px;line-height:24px;font-size:12px;vertical-align:middle}.next-pagination[dir=rtl].next-small .next-pagination-size-selector-btn{padding:0 8px}.next-pagination[dir=rtl].next-small .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-small .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination[dir=rtl].next-medium .next-pagination-list{margin:0 4px}.next-pagination[dir=rtl].next-medium .next-pagination-total{line-height:32px;vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-item{padding:0 10px;border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-medium .next-pagination-item+.next-pagination-item{margin:0 4px 0 0}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis{height:32px;line-height:32px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-medium .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination[dir=rtl].next-medium .next-pagination-display,.next-pagination[dir=rtl].next-medium .next-pagination-display em,.next-pagination[dir=rtl].next-medium .next-pagination-jump-text{font-size:14px}.next-pagination[dir=rtl].next-medium .next-pagination-jump-input{width:36px}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-title{height:32px;line-height:32px;font-size:14px;vertical-align:middle}.next-pagination[dir=rtl].next-medium .next-pagination-size-selector-btn{padding:0 12px}.next-pagination[dir=rtl].next-medium .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-medium .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination[dir=rtl].next-large .next-pagination-list{margin:0 8px}.next-pagination[dir=rtl].next-large .next-pagination-total{line-height:40px;vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-item{padding:0 15px;border-width:1px;border-radius:3px}.next-pagination[dir=rtl].next-large .next-pagination-item+.next-pagination-item{margin:0 8px 0 0}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis{height:40px;line-height:40px;margin-left:8px;margin-right:8px}.next-pagination[dir=rtl].next-large .next-pagination-ellipsis .next-icon-remote,.next-pagination[dir=rtl].next-large .next-pagination-ellipsis:before{width:16px;font-size:16px;line-height:inherit}.next-pagination[dir=rtl].next-large .next-pagination-display,.next-pagination[dir=rtl].next-large .next-pagination-display em,.next-pagination[dir=rtl].next-large .next-pagination-jump-text{font-size:16px}.next-pagination[dir=rtl].next-large .next-pagination-jump-input{width:48px}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-title{height:40px;line-height:40px;font-size:16px;vertical-align:middle}.next-pagination[dir=rtl].next-large .next-pagination-size-selector-btn{padding:0 16px}.next-pagination[dir=rtl].next-large .next-pagination-item.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination[dir=rtl].next-large .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination{font-size:0}.next-pagination,.next-pagination *,.next-pagination :after,.next-pagination :before{box-sizing:border-box}.next-pagination:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-pagination-total{display:inline-block;font-size:14px;margin-right:16px}.next-pagination-pages{display:inline-block}.next-pagination-list{display:inline-block;vertical-align:top}.next-pagination .next-pagination-item:not([disabled]){display:inline-block;border-style:solid;border-color:#ddd;background:#fff;color:#333;box-shadow:none}.next-pagination .next-pagination-item{transition:none}.next-pagination .next-pagination-item.next-current{border-color:#209bfa;background:#209bfa;color:#fff;box-shadow:none}.next-pagination .next-pagination-item.next-current:focus,.next-pagination .next-pagination-item.next-current:hover{border-color:#209bfa;background:#fff;color:#209bfa;box-shadow:none}.next-pagination-ellipsis{display:inline-block;color:#999;vertical-align:top}.next-pagination-display{display:inline-block;margin:0 16px;color:#333;vertical-align:middle}.next-pagination-display em{font-style:normal;color:#209bfa}.next-pagination-jump-text{display:inline-block;vertical-align:middle;color:#999}.next-pagination-jump-input{margin:0 4px;vertical-align:top}.next-pagination-jump-go{margin-left:4px;vertical-align:top}.next-pagination-size-selector{display:inline-block;position:relative}.next-pagination-size-selector-title{margin-right:4px;color:#999}.next-pagination-size-selector-filter{display:inline-block;vertical-align:middle}.next-pagination-size-selector-dropdown{vertical-align:top;min-width:64px}.next-pagination-size-selector-dropdown .next-select-inner,.next-pagination-size-selector-popup{min-width:64px}.next-pagination-size-selector-btn.next-btn-text{height:auto;line-height:normal;color:#666;border-radius:0}.next-pagination-size-selector-btn.next-btn-text.next-current{color:#209bfa}.next-pagination-size-selector-btn.next-btn-text+.next-pagination-size-selector-btn{border-left:1px solid #e6e6e6}.next-pagination-pages+.next-pagination-size-selector,.next-pagination-size-selector+.next-pagination-pages{margin-left:40px}.next-pagination.next-hide{display:none}.next-pagination.next-start .next-pagination-pages{float:right}.next-pagination.next-end .next-pagination-pages,.next-pagination.next-start .next-pagination-size-selector{float:left}.next-pagination.next-end .next-pagination-size-selector{float:right}.next-pagination.next-small .next-pagination-list{margin:0 4px}.next-pagination.next-small .next-pagination-total{line-height:24px;vertical-align:middle}.next-pagination.next-small .next-pagination-item{padding:0 6px;border-width:1px;border-radius:3px}.next-pagination.next-small .next-pagination-item+.next-pagination-item{margin:0 0 0 4px}.next-pagination.next-small .next-pagination-ellipsis{height:24px;line-height:24px;margin-left:8px;margin-right:8px}.next-pagination.next-small .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-small .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination.next-small .next-pagination-display,.next-pagination.next-small .next-pagination-display em,.next-pagination.next-small .next-pagination-jump-text{font-size:12px}.next-pagination.next-small .next-pagination-jump-input{width:28px}.next-pagination.next-small .next-pagination-size-selector-title{height:24px;line-height:24px;font-size:12px;vertical-align:middle}.next-pagination.next-small .next-pagination-size-selector-btn{padding:0 8px}.next-pagination.next-small .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-small .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination.next-small .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-small .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-small.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev{width:20px;padding:0}.next-pagination.next-small.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-small.next-no-border .next-pagination-item.next-next,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-small.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-small.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-small.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa}.next-pagination.next-small.next-no-border .next-pagination-display{margin:0 8px}.next-pagination.next-small.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-small.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-medium .next-pagination-list{margin:0 4px}.next-pagination.next-medium .next-pagination-total{line-height:32px;vertical-align:middle}.next-pagination.next-medium .next-pagination-item{padding:0 10px;border-width:1px;border-radius:3px}.next-pagination.next-medium .next-pagination-item+.next-pagination-item{margin:0 0 0 4px}.next-pagination.next-medium .next-pagination-ellipsis{height:32px;line-height:32px;margin-left:8px;margin-right:8px}.next-pagination.next-medium .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-medium .next-pagination-ellipsis:before{width:12px;font-size:12px;line-height:inherit}.next-pagination.next-medium .next-pagination-display,.next-pagination.next-medium .next-pagination-display em,.next-pagination.next-medium .next-pagination-jump-text{font-size:14px}.next-pagination.next-medium .next-pagination-jump-input{width:36px}.next-pagination.next-medium .next-pagination-size-selector-title{height:32px;line-height:32px;font-size:14px;vertical-align:middle}.next-pagination.next-medium .next-pagination-size-selector-btn{padding:0 12px}.next-pagination.next-medium .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-medium .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination.next-medium .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-medium .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-medium.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev{width:28px;padding:0}.next-pagination.next-medium.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-medium.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-medium.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa}.next-pagination.next-medium.next-no-border .next-pagination-display{margin:0 12px}.next-pagination.next-medium.next-mini .next-pagination-item.next-prev{margin-right:4px}.next-pagination.next-medium.next-mini .next-pagination-item.next-next{margin-left:4px}.next-pagination.next-large .next-pagination-list{margin:0 8px}.next-pagination.next-large .next-pagination-total{line-height:40px;vertical-align:middle}.next-pagination.next-large .next-pagination-item{padding:0 15px;border-width:1px;border-radius:3px}.next-pagination.next-large .next-pagination-item+.next-pagination-item{margin:0 0 0 8px}.next-pagination.next-large .next-pagination-ellipsis{height:40px;line-height:40px;margin-left:8px;margin-right:8px}.next-pagination.next-large .next-pagination-ellipsis .next-icon-remote,.next-pagination.next-large .next-pagination-ellipsis:before{width:16px;font-size:16px;line-height:inherit}.next-pagination.next-large .next-pagination-display,.next-pagination.next-large .next-pagination-display em,.next-pagination.next-large .next-pagination-jump-text{font-size:16px}.next-pagination.next-large .next-pagination-jump-input{width:48px}.next-pagination.next-large .next-pagination-size-selector-title{height:40px;line-height:40px;font-size:16px;vertical-align:middle}.next-pagination.next-large .next-pagination-size-selector-btn{padding:0 16px}.next-pagination.next-large .next-pagination-item.next-next:not([disabled]) i,.next-pagination.next-large .next-pagination-item.next-prev:not([disabled]) i{color:#666}.next-pagination.next-large .next-pagination-item:hover.next-next:not([disabled]) i,.next-pagination.next-large .next-pagination-item:hover.next-prev:not([disabled]) i{color:#333}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-only .next-pagination-item.next-next .next-icon,.next-pagination.next-large.next-arrow-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev{width:40px;padding:0}.next-pagination.next-large.next-arrow-prev-only .next-pagination-item.next-prev .next-icon{margin:0 auto}.next-pagination.next-large.next-no-border .next-pagination-item.next-next,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev{padding:0;border:none;background-color:transparent;box-shadow:none}.next-pagination.next-large.next-no-border .next-pagination-item.next-next .next-icon,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev .next-icon{margin:0}.next-pagination.next-large.next-no-border .next-pagination-item.next-next:not([disabled]):hover i,.next-pagination.next-large.next-no-border .next-pagination-item.next-prev:not([disabled]):hover i{color:#209bfa}.next-pagination.next-large.next-no-border .next-pagination-display{margin:0 16px}.next-pagination.next-large.next-mini .next-pagination-item.next-prev{margin-right:8px}.next-pagination.next-large.next-mini .next-pagination-item.next-next{margin-left:8px}.next-pagination-icon-prev:before{content:""}.next-pagination-icon-next:before{content:""}.next-pagination-icon-ellipsis:before{content:""}.next-paragraph{color:#333}.next-paragraph-short{line-height:1.5}.next-paragraph-long{line-height:1.7}.next-paragraph-medium,.next-paragraph-small{font-size:14px}.next-progress-circle[dir=rtl] .next-progress-circle-container{transform:scaleX(-1)}.next-progress-line[dir=rtl] .next-progress-line-overlay{left:auto;right:0}.next-progress-line,.next-progress-line *,.next-progress-line :after,.next-progress-line :before{box-sizing:border-box}.next-progress-line{width:100%;display:inline-block;position:relative}.next-progress-line-container{display:inline-block;width:100%;vertical-align:middle}.next-progress-line-underlay{position:relative;overflow:hidden;width:100%;background:#f5f5f5}.next-progress-line-overlay{position:absolute;left:0;top:0;transition:all .3s ease}.next-progress-line-overlay-normal{background:#209bfa}.next-progress-line-overlay-success{background:#1ad78c}.next-progress-line-overlay-error,.next-progress-line-overlay-started{background:#d23c26}.next-progress-line-overlay-middle{background:#f1c826}.next-progress-line-overlay-finishing{background:#1ad78c}.next-progress-line.next-small .next-progress-line-underlay{border-radius:12px;height:4px}.next-progress-line.next-small .next-progress-line-overlay{height:4px;border-radius:12px;top:50%;margin-top:-2px}.next-progress-line.next-small .next-progress-line-text{font-size:12px;line-height:4px}.next-progress-line.next-medium .next-progress-line-underlay{border-radius:12px;height:8px}.next-progress-line.next-medium .next-progress-line-overlay{height:8px;border-radius:12px;top:50%;margin-top:-4px}.next-progress-line.next-medium .next-progress-line-text{font-size:12px;line-height:8px}.next-progress-line.next-large .next-progress-line-underlay{border-radius:12px;height:12px}.next-progress-line.next-large .next-progress-line-overlay{height:12px;border-radius:12px;top:50%;margin-top:-6px}.next-progress-line.next-large .next-progress-line-text{font-size:14px;line-height:12px}.next-progress-line-show-info .next-progress-line-container{padding-right:60px;margin-right:-60px}.next-progress-line-show-info .next-progress-line-text{width:50px;text-align:left;margin-left:10px;vertical-align:middle;display:inline-block;color:#333}.next-progress-line-show-border .next-progress-line-underlay{border:1px solid #e6e6e6}.next-progress-line-show-border.next-small .next-progress-line-underlay{border-radius:12px;height:6px}.next-progress-line-show-border.next-small .next-progress-line-overlay{height:4px;border-radius:12px;top:50%;margin-top:-2px}.next-progress-line-show-border.next-small .next-progress-line-text{font-size:12px;line-height:6px}.next-progress-line-show-border.next-medium .next-progress-line-underlay{border-radius:12px;height:10px}.next-progress-line-show-border.next-medium .next-progress-line-overlay{height:8px;border-radius:12px;top:50%;margin-top:-4px}.next-progress-line-show-border.next-medium .next-progress-line-text{font-size:12px;line-height:10px}.next-progress-line-show-border.next-large .next-progress-line-underlay{border-radius:12px;height:14px}.next-progress-line-show-border.next-large .next-progress-line-overlay{height:12px;border-radius:12px;top:50%;margin-top:-6px}.next-progress-line-show-border.next-large .next-progress-line-text{font-size:14px;line-height:14px}.next-progress-circle,.next-progress-circle *,.next-progress-circle :after,.next-progress-circle :before{box-sizing:border-box}.next-progress-circle{position:relative;display:inline-block}.next-progress-circle-underlay{stroke-width:8px;stroke:#f5f5f5}.next-progress-circle-overlay{transition:all .3s ease;stroke-linecap:round;stroke-width:8px}.next-progress-circle-overlay-normal{stroke:#209bfa}.next-progress-circle-overlay-success{stroke:#1ad78c}.next-progress-circle-overlay-error,.next-progress-circle-overlay-started{stroke:#d23c26}.next-progress-circle-overlay-middle{stroke:#f1c826}.next-progress-circle-overlay-finishing{stroke:#1ad78c}.next-progress-circle.next-small{width:100px;height:100px;font-size:20px}.next-progress-circle.next-medium{width:116px;height:116px;font-size:24px}.next-progress-circle.next-large{width:132px;height:132px;font-size:36px}.next-progress-circle-text{display:block;position:absolute;width:100%;top:50%;left:0;text-align:center;line-height:1;-webkit-transform:translateY(-50%);transform:translateY(-50%);transition:transform .3s ease;color:#333}.next-range{width:100%;font-family:inherit;font-weight:400;font-size:inherit;line-height:inherit;vertical-align:baseline;display:flex;flex-direction:column;cursor:pointer}.next-range,.next-range *,.next-range :after,.next-range :before{box-sizing:border-box}.next-range .next-range-inner{position:relative}.next-range .next-range-inner:only-child{margin-top:auto;margin-bottom:auto}.next-range .next-range-track{position:absolute;width:100%;top:50%;border-radius:0}.next-range .next-range-selected{position:absolute;width:0;top:50%;left:0;border-radius:0}.next-range .next-range-scale{position:relative;width:100%;height:12px}.next-range .next-range-scale .next-range-scale-item{position:absolute;left:0;width:2px;border:1px solid;border-radius:0}.next-range .next-range-scale .next-range-scale-item:last-child{margin-left:-2px}.next-range .next-range-slider{position:absolute;top:50%;left:0;border-radius:50%}.next-range .next-range-slider-inner{position:absolute;top:50%;left:50%;border:1px solid #ddd;border-radius:50%;transition:transform .1s linear,border-color .1s linear}.next-range .next-range-frag.next-range-active .next-range-slider .next-range-slider-inner,.next-range .next-range-slider.next-range-slider-moving .next-range-slider-inner{border:2px solid #209bfa;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);transform:scale(1.2)}.next-range .next-range-mark{position:relative;cursor:auto}.next-range .next-range-mark .next-range-mark-text{position:absolute;left:0;transform:translateX(-50%);padding-left:2px;text-align:center}.next-range .next-range-frag{position:absolute;top:0}.next-range .next-range-frag .next-range-slider{left:0}.next-range .next-range-frag .next-range-slider:nth-child(2){left:100%}.next-range .next-range-frag .next-range-selected{width:100%}.next-range.disabled{cursor:not-allowed}.next-range.disabled .next-range-mark{cursor:auto}.next-range .next-range-track,.next-range .next-range-track:hover{background:#ddd}.next-range .next-range-selected,.next-range .next-range-selected:hover{background:#209bfa}.next-range .next-range-scale .next-range-scale-item{border-color:#ddd;background:#ddd}.next-range .next-range-scale .next-range-scale-item:hover{border-color:#ddd}.next-range .next-range-scale .next-range-scale-item.activated{border-color:#209bfa;background:#209bfa}.next-range .next-range-scale .next-range-scale-item.activated:hover{border-color:#209bfa}.next-range .next-range-slider-inner{background:#fff;border-color:#ddd}.next-range .next-range-slider-inner:hover{background:#fff;box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);transform:scale(1.2)}.next-range .next-range-mark .next-range-mark-text,.next-range .next-range-mark .next-range-mark-text:hover{color:#999}.next-range .next-range-mark .next-range-mark-text.activated,.next-range .next-range-mark .next-range-mark-text.activated:hover{color:#333}.next-range.disabled .next-range-track{background:#ddd}.next-range.disabled .next-range-selected{background:#ccc}.next-range.disabled .next-range-scale-item{border-color:#ddd}.next-range.disabled .next-range-scale-item.activated{border-color:#ccc}.next-range.disabled .next-range-slider-inner{background:#eee;border-color:#eee;transform:none;box-shadow:none}.next-range.disabled .next-range-mark-text{color:#ccc}.next-range.disabled .next-range-mark-text.activated{color:#999}.next-range .next-range-selected,.next-range .next-range-track{height:4px;margin-top:-2px}.next-range .next-range-frag{margin-top:4px;height:4px}.next-range .next-range-slider{box-shadow:1px 1px 3px 0 rgba(0,0,0,.12)}.next-range .next-range-slider,.next-range .next-range-slider-inner{height:16px;width:16px;margin-top:-8px;margin-left:-8px}.next-range .next-range-mark{display:block}.next-range .next-range-mark .next-range-mark-text{font-size:14px;font-weight:400;line-height:20px;height:20px}.next-range .next-range-mark.next-range-mark-below{height:30px}.next-range .next-range-mark.next-range-mark-below .next-range-mark-text{bottom:0}.next-range .next-range-mark.next-range-mark-above{height:30px}.next-range .next-range-scale .next-range-scale-item{height:12px}.next-range.simulation-hover>.next-range-slider-inner{background:#fff;box-shadow:20px 20px 30px 0 rgba(0,0,0,.15);transform:scale(1.2)}.next-range.simulation-hover .next-range-selected{background:#209bfa}.next-range.simulation-hover .next-range-track{background:#ddd}.next-range.simulation-hover .next-range-scale-item{border-color:#ddd}.next-range.simulation-hover .next-range-scale-item.activated{border-color:#209bfa}.next-range.simulation-click>.next-range-slider-inner{border:2px solid #209bfa;box-shadow:4px 4px 8px 0 rgba(0,0,0,.12);transform:scale(1.2)}.next-range[dir=rtl] .next-range-mark{position:relative;cursor:auto}.next-range[dir=rtl] .next-range-mark .next-range-mark-text{position:absolute;right:0;transform:translateX(50%);padding-right:2px;text-align:center}.next-rating[dir=rtl] .next-rating-overlay{right:0;left:auto}.next-rating[dir=rtl] .next-rating-overlay .next-rating-icon,.next-rating[dir=rtl] .next-rating-underlay .next-rating-icon{margin-right:4px;margin-left:0}.next-rating[dir=rtl] .next-rating-overlay .next-rating-icon:last-child,.next-rating[dir=rtl] .next-rating-underlay .next-rating-icon:last-child{margin-left:4px}.next-rating{vertical-align:top;display:inline-block;position:relative}.next-rating:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-rating-base,.next-rating-text{float:left}.next-rating-base-disabled,.next-rating-base-disabled .next-rating-overlay .next-rating-icon,.next-rating-base-disabled .next-rating-underlay .next-rating-icon{cursor:not-allowed}.next-rating-symbol-icon:before{content:""}.next-rating-underlay{white-space:nowrap;overflow:hidden}.next-rating-underlay .next-icon{color:#f2f2f2}.next-rating-stroke-mode .next-rating-underlay .next-icon{color:transparent;-webkit-text-stroke:1px #209bfa}.next-rating-overlay{white-space:nowrap;overflow:hidden;position:absolute;width:0;top:0;left:0}.next-rating-overlay .next-icon{color:#209bfa}.next-rating-overlay .next-rating-icon,.next-rating-underlay .next-rating-icon{cursor:pointer;margin-left:4px}.next-rating-overlay .next-rating-icon:last-child,.next-rating-underlay .next-rating-icon:last-child{margin-right:4px}.next-rating-overlay .next-icon,.next-rating-underlay .next-icon{transition:all .1s linear}.next-rating-overlay .next-icon.hover,.next-rating-underlay .next-icon.hover{transform:scale3d(1.1,1.1,1.1)}.next-rating-overlay .next-icon.clicked,.next-rating-underlay .next-icon.clicked{transform:scale3d(.9,.9,.9)}.next-rating-info{position:absolute;top:calc(100% + 4px);left:0;border:1px solid #f2f2f2;background:#fff;padding:4px 8px 3px;font-size:12px;white-space:nowrap}.next-rating-info:after{position:absolute;content:"";width:4px;height:4px;transform:rotate(45deg);background:#fff;border-color:#f2f2f2 transparent transparent #f2f2f2;border-style:solid;border-width:1px;top:-3px;left:4px}.next-rating.hover,.next-rating:focus .next-rating-base:not(.next-rating-base-disabled){outline:none}.next-rating.hover .next-rating-overlay .next-icon,.next-rating:focus .next-rating-base:not(.next-rating-base-disabled) .next-rating-overlay .next-icon{color:#209bfa}.next-rating-grade-low.hover .next-rating-overlay .next-icon,.next-rating-grade-low .next-rating-overlay .next-icon{color:#666}.next-rating-grade-high.hover .next-rating-overlay .next-icon,.next-rating-grade-high .next-rating-overlay .next-icon{color:#209bfa}.next-rating-small{font-size:12px}.next-rating-small .next-icon .next-icon-remote,.next-rating-small .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-rating-small .next-rating-text{margin-left:8px}.next-rating-medium{font-size:14px}.next-rating-medium .next-icon .next-icon-remote,.next-rating-medium .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-rating-medium .next-rating-text{margin-left:12px}.next-rating-large{font-size:16px}.next-rating-large .next-icon .next-icon-remote,.next-rating-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-rating-large .next-rating-text{margin-left:16px}.next-search-simple[dir=rtl].next-large .next-search-icon{margin-left:12px;margin-right:0}.next-search-simple[dir=rtl].next-medium .next-search-icon{margin-left:8px;margin-right:0}.next-search-simple[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #ddd;border-right:none}.next-search-simple[dir=rtl].next-dark .next-search-left{border-color:#666}.next-search-simple[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-right:1px solid #ddd}.next-search-simple[dir=rtl].next-dark:hover .next-search-left{border-color:#999}.next-search-simple[dir=rtl].next-dark .next-search-icon{color:#666}.next-search-simple[dir=rtl].next-dark .next-search-icon:hover{color:#999}.next-search-normal[dir=rtl] .next-search-left{border-left:none;border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:0;border-bottom-left-radius:0}.next-search-normal[dir=rtl] .next-search-btn.next-btn{border-radius:3px 0 0 3px!important}.next-search-normal[dir=rtl] .next-input{border-radius:0 3px 3px 0}.next-search-normal[dir=rtl].next-primary .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-search-normal[dir=rtl].next-primary .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-right:none}.next-search-normal[dir=rtl].next-secondary .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-search-normal[dir=rtl].next-secondary .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-right:none}.next-search-normal[dir=rtl].next-normal .next-input{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-search-normal[dir=rtl].next-normal .next-search-left .next-search-left-addon{border-left:1px solid #eee;border-right:none}.next-search-normal[dir=rtl].next-dark .next-search-left .next-search-left-addon{border-left:1px solid #209bfa;border-right:none}.next-search{width:100%;display:inline-block}.next-search,.next-search *,.next-search :after,.next-search :before{box-sizing:border-box}.next-search .next-input,.next-search .next-select{border:none;box-shadow:none}.next-search .next-select .next-input,.next-search .next-select .next-input .next-input-text-field{height:auto}.next-search .next-search-left{border-style:solid;transition:all .1s linear}.next-search .next-search-left-addon .next-input,.next-search .next-search-left-addon .next-select-trigger-search{min-height:100%;border-bottom-right-radius:0;border-top-right-radius:0}.next-search .next-search-left-addon .next-select-values{line-height:1}.next-search .next-search-left-addon.next-input-group-addon .next-select{margin:0}.next-search .next-search-left-addon+.next-search-input .next-input{border-bottom-left-radius:0;border-top-left-radius:0}.next-search .next-search-input{width:100%}.next-search .next-search-btn{box-shadow:none}.next-search .next-search-symbol-icon:before{content:""}.next-search-normal{width:600px}.next-search-normal .next-search-left{border-top-left-radius:3px;border-bottom-left-radius:3px}.next-search-normal .next-input{border-radius:3px 0 0 3px}.next-search-normal .next-btn{border-radius:0 3px 3px 0}.next-search-normal.next-primary .next-search-left{border-color:#209bfa}.next-search-normal.next-primary .next-search-left .next-search-left-addon{border-right:1px solid #eee}.next-search-normal.next-primary:hover .next-btn,.next-search-normal.next-primary:hover .next-search-left{border-color:#209bfa}.next-search-normal.next-primary .next-search-btn{background:#209bfa;border-color:#209bfa;color:#fff}.next-search-normal.next-primary .next-search-btn:hover{background:#1274e7;border-color:#209bfa;color:#fff}.next-search-normal.next-primary .next-search-btn .next-icon,.next-search-normal.next-primary .next-search-btn .next-icon:hover{color:#fff}.next-search-normal.next-primary.next-large{box-shadow:none}.next-search-normal.next-primary.next-large .next-search-btn,.next-search-normal.next-primary.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-primary.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-primary.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-primary.next-large .next-select{height:38px}.next-search-normal.next-primary.next-large .next-search-btn{font-size:16px}.next-search-normal.next-primary.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-primary.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-primary.next-medium{box-shadow:none}.next-search-normal.next-primary.next-medium .next-search-btn,.next-search-normal.next-primary.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-primary.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-primary.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-primary.next-medium .next-select{height:30px}.next-search-normal.next-primary.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-primary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-primary.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-primary.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-primary .next-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.next-search-normal.next-secondary .next-search-left{border-color:#ddd}.next-search-normal.next-secondary .next-search-left .next-search-left-addon{border-right:1px solid #eee}.next-search-normal.next-secondary:hover .next-btn,.next-search-normal.next-secondary:hover .next-search-left{border-color:#209bfa}.next-search-normal.next-secondary .next-search-btn{background:#209bfa;border-color:#209bfa;color:#fff}.next-search-normal.next-secondary .next-search-btn:hover{background:#1274e7;border-color:#209bfa;color:#fff}.next-search-normal.next-secondary .next-search-btn .next-icon,.next-search-normal.next-secondary .next-search-btn .next-icon:hover{color:#fff}.next-search-normal.next-secondary.next-large{box-shadow:none}.next-search-normal.next-secondary.next-large .next-search-btn,.next-search-normal.next-secondary.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-secondary.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-secondary.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-secondary.next-large .next-select{height:38px}.next-search-normal.next-secondary.next-large .next-search-btn{font-size:16px}.next-search-normal.next-secondary.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-secondary.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-secondary.next-medium{box-shadow:none}.next-search-normal.next-secondary.next-medium .next-search-btn,.next-search-normal.next-secondary.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-secondary.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-secondary.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-secondary.next-medium .next-select{height:30px}.next-search-normal.next-secondary.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-secondary.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-secondary.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-secondary .next-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.next-search-normal.next-normal .next-search-left{border-color:#ddd}.next-search-normal.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #eee}.next-search-normal.next-normal:hover .next-btn,.next-search-normal.next-normal:hover .next-search-left{border-color:#ccc}.next-search-normal.next-normal .next-search-btn{background:#fafafa;border-color:#ddd;color:#666}.next-search-normal.next-normal .next-search-btn:hover{background:#f5f5f5;border-color:#ccc;color:#333}.next-search-normal.next-normal .next-search-btn .next-icon{color:#666}.next-search-normal.next-normal .next-search-btn .next-icon:hover{color:#333}.next-search-normal.next-normal.next-large{box-shadow:none}.next-search-normal.next-normal.next-large .next-search-btn,.next-search-normal.next-normal.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-normal.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-normal.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-normal.next-large .next-select{height:38px}.next-search-normal.next-normal.next-large .next-search-btn{font-size:16px}.next-search-normal.next-normal.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-normal.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-normal.next-medium{box-shadow:none}.next-search-normal.next-normal.next-medium .next-search-btn,.next-search-normal.next-normal.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-normal.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-normal.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-normal.next-medium .next-select{height:30px}.next-search-normal.next-normal.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-normal.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-normal.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-normal.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-normal .next-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.next-search-normal.next-dark .next-search-left{border-color:#209bfa}.next-search-normal.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #209bfa}.next-search-normal.next-dark:hover .next-btn,.next-search-normal.next-dark:hover .next-search-left{border-color:#209bfa}.next-search-normal.next-dark .next-search-btn{background:#209bfa;border-color:#209bfa;color:#fff}.next-search-normal.next-dark .next-search-btn:hover{background:#1274e7;border-color:#209bfa;color:#fff}.next-search-normal.next-dark .next-search-btn .next-icon,.next-search-normal.next-dark .next-search-btn .next-icon:hover,.next-search-normal.next-dark .next-select-inner,.next-search-normal.next-dark input{color:#fff}.next-search-normal.next-dark .next-input,.next-search-normal.next-dark .next-select{background:hsla(0,0%,100%,0)}.next-search-normal.next-dark.next-large{box-shadow:none}.next-search-normal.next-dark.next-large .next-search-btn,.next-search-normal.next-dark.next-large .next-search-left{border-width:1px;height:40px}.next-search-normal.next-dark.next-large .next-search-input{height:38px;overflow-y:hidden}.next-search-normal.next-dark.next-large .next-search-input input{height:38px;line-height:38px \0 }.next-search-normal.next-dark.next-large .next-select{height:38px}.next-search-normal.next-dark.next-large .next-search-btn{font-size:16px}.next-search-normal.next-dark.next-large .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-large .next-search-btn .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-search-normal.next-dark.next-large .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal.next-dark.next-medium{box-shadow:none}.next-search-normal.next-dark.next-medium .next-search-btn,.next-search-normal.next-dark.next-medium .next-search-left{border-width:1px;height:32px}.next-search-normal.next-dark.next-medium .next-search-input{height:30px;overflow-y:hidden}.next-search-normal.next-dark.next-medium .next-search-input input{height:30px;line-height:30px \0 }.next-search-normal.next-dark.next-medium .next-select{height:30px}.next-search-normal.next-dark.next-medium .next-search-btn{font-size:16px}.next-search-normal.next-dark.next-medium .next-search-btn .next-icon .next-icon-remote,.next-search-normal.next-dark.next-medium .next-search-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-normal.next-dark.next-medium .next-search-btn .next-search-btn-text{display:inline-block;padding-left:0}.next-search-normal:not([dir=rtl]) .next-search-left{border-right:none}.next-search-simple{width:300px;box-shadow:none;border-radius:3px}.next-search-simple .next-search-icon{cursor:pointer;transition:all .1s linear}.next-search-simple .next-input,.next-search-simple .next-search-left{border-radius:3px}.next-search-simple.next-large .next-search-icon{margin-right:12px}.next-search-simple.next-medium .next-search-icon{margin-right:8px}.next-search-simple.next-normal .next-search-left{border-color:#ddd}.next-search-simple.next-normal .next-search-left .next-search-left-addon{border-right:1px solid #ddd}.next-search-simple.next-normal:hover .next-search-left{border-color:#ccc}.next-search-simple.next-normal .next-search-icon{color:#999}.next-search-simple.next-normal .next-search-icon:hover{color:#666}.next-search-simple.next-normal .next-search-left{border-width:1px}.next-search-simple.next-normal.next-large .next-search-icon .next-icon-remote,.next-search-simple.next-normal.next-large .next-search-icon:before{width:20px;font-size:20px;line-height:inherit}.next-search-simple.next-normal.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-normal.next-medium .next-search-icon:before{width:12px;font-size:12px;line-height:inherit}.next-search-simple.next-dark .next-search-left{border-color:#666}.next-search-simple.next-dark .next-search-left .next-search-left-addon{border-right:1px solid #ddd}.next-search-simple.next-dark:hover .next-search-left{border-color:#999}.next-search-simple.next-dark .next-search-icon{color:#666}.next-search-simple.next-dark .next-search-icon:hover{color:#999}.next-search-simple.next-dark .next-select-inner,.next-search-simple.next-dark input{color:#fff}.next-search-simple.next-dark .next-input,.next-search-simple.next-dark .next-select{background:hsla(0,0%,100%,0)}.next-search-simple.next-dark .next-search-left{border-width:1px}.next-search-simple.next-dark.next-large .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-large .next-search-icon:before,.next-search-simple.next-dark.next-medium .next-search-icon .next-icon-remote,.next-search-simple.next-dark.next-medium .next-search-icon:before{width:20px;font-size:20px;line-height:inherit}.next-search-simple .next-select.next-large{height:38px}.next-search-simple .next-select.next-medium{height:30px}.next-slick{position:relative;display:block;-webkit-touch-callout:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:rgba(0,0,0,0)}.next-slick,.next-slick *,.next-slick :after,.next-slick :before{box-sizing:border-box}.next-slick-initialized .next-slick-slide{display:block}.next-slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0;transform:translateZ(0)}.next-slick-list:focus{outline:none}.next-slick-list.dragging{cursor:pointer;cursor:hand}.next-slick-track{position:relative;top:0;left:0;display:block;transform:translateZ(0)}.next-slick-slide{float:left;height:100%;min-height:1px;outline:0;transition:all .1s linear}.next-slick[dir=rtl] .next-slick-slide{float:right}.next-slick-slide img{display:block}.next-slick-arrow{display:block;position:absolute;cursor:pointer;text-align:center;transition:all .1s linear}.next-slick-arrow.inner{color:#fff;background:#000;opacity:.2;padding:0;border:none}.next-slick-arrow.inner:focus,.next-slick-arrow.inner:hover{color:#fff;background:#000;opacity:.4}.next-slick-arrow.inner.disabled{color:#ccc;background:#fafafa;opacity:.5}.next-slick-arrow.outer{color:#666;background:transparent;opacity:.32;padding:0;border:none;border-radius:0}.next-slick-arrow.outer:focus,.next-slick-arrow.outer:hover{color:#333;background:transparent;opacity:.32}.next-slick-arrow.outer.disabled{color:#ccc;background:transparent;opacity:.32}.next-slick-arrow.disabled{cursor:not-allowed}.next-slick-dots{display:block;position:absolute;margin:0;padding:0}.next-slick-dots-item{position:relative;display:inline-block;cursor:pointer}.next-slick-dots-item button{cursor:pointer;border:0 solid #fff;outline:none;padding:0;height:8px;width:8px;border-radius:50%;background:rgba(0,0,0,.32)}.next-slick-dots-item button:focus,.next-slick-dots-item button:hover{background-color:rgba(0,0,0,.32);border-color:#fff}.next-slick-dots-item.active button{background:#209bfa;border-color:#fff;animation:zoom .3s cubic-bezier(.86,0,.07,1)}.next-slick-dots.hoz{width:100%;bottom:12px;left:0;text-align:center}.next-slick-dots.hoz .next-slick-dots-item{margin:0 4px}.next-slick-dots.ver{width:16px;top:0;right:20px;bottom:0;display:flex;justify-content:center;flex-direction:column}.next-slick-dots.ver .next-slick-dots-item{margin:0}.next-slick.next-slick-hoz.next-slick-outer{padding:0 24px}.next-slick.next-slick-hoz .next-slick-arrow.medium{width:28px;height:56px;line-height:56px}.next-slick.next-slick-hoz .next-slick-arrow.medium .next-icon .next-icon-remote,.next-slick.next-slick-hoz .next-slick-arrow.medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner{top:calc(50% - 28px)}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner.next-slick-prev{left:0}.next-slick.next-slick-hoz .next-slick-arrow.medium.inner.next-slick-next{right:0}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer{top:calc(50% - 28px)}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer.next-slick-prev{left:-4px}.next-slick.next-slick-hoz .next-slick-arrow.medium.outer.next-slick-next{right:-4px}.next-slick.next-slick-hoz .next-slick-arrow.large{width:48px;height:96px;line-height:96px}.next-slick.next-slick-hoz .next-slick-arrow.large .next-icon .next-icon-remote,.next-slick.next-slick-hoz .next-slick-arrow.large .next-icon:before{width:32px;font-size:32px;line-height:inherit}.next-slick.next-slick-hoz .next-slick-arrow.large.inner{top:calc(50% - 48px)}.next-slick.next-slick-hoz .next-slick-arrow.large.inner.next-slick-prev{left:0}.next-slick.next-slick-hoz .next-slick-arrow.large.inner.next-slick-next{right:0}.next-slick.next-slick-hoz .next-slick-arrow.large.outer{top:calc(50% - 48px)}.next-slick.next-slick-hoz .next-slick-arrow.large.outer.next-slick-prev{left:-8px}.next-slick.next-slick-hoz .next-slick-arrow.large.outer.next-slick-next{right:-8px}.next-slick.next-slick-ver.next-slick-outer{padding:24px 0}.next-slick.next-slick-ver .next-slick-slide{display:block;height:auto}.next-slick.next-slick-ver .next-slick-arrow.medium{width:56px;height:28px;line-height:28px}.next-slick.next-slick-ver .next-slick-arrow.medium .next-icon .next-icon-remote,.next-slick.next-slick-ver .next-slick-arrow.medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-slick.next-slick-ver .next-slick-arrow.medium.inner{left:calc(50% - 28px)}.next-slick.next-slick-ver .next-slick-arrow.medium.inner.next-slick-prev{top:0}.next-slick.next-slick-ver .next-slick-arrow.medium.inner.next-slick-next{bottom:0}.next-slick.next-slick-ver .next-slick-arrow.medium.outer{left:calc(50% - 28px)}.next-slick.next-slick-ver .next-slick-arrow.medium.outer.next-slick-prev{top:-4px}.next-slick.next-slick-ver .next-slick-arrow.medium.outer.next-slick-next{bottom:-4px}.next-slick.next-slick-ver .next-slick-arrow.large{width:96px;height:48px;line-height:48px}.next-slick.next-slick-ver .next-slick-arrow.large .next-icon .next-icon-remote,.next-slick.next-slick-ver .next-slick-arrow.large .next-icon:before{width:32px;font-size:32px;line-height:inherit}.next-slick.next-slick-ver .next-slick-arrow.large.inner{left:calc(50% - 48px)}.next-slick.next-slick-ver .next-slick-arrow.large.inner.next-slick-prev{top:0}.next-slick.next-slick-ver .next-slick-arrow.large.inner.next-slick-next{bottom:0}.next-slick.next-slick-ver .next-slick-arrow.large.outer{left:calc(50% - 48px)}.next-slick.next-slick-ver .next-slick-arrow.large.outer.next-slick-prev{top:-16px}.next-slick.next-slick-ver .next-slick-arrow.large.outer.next-slick-next{bottom:-16px}.next-split-btn{display:inline-block;position:relative}.next-split-btn-spacing-tb{padding:0}.next-split-btn-trigger .next-icon{transition:transform .1s linear}.next-split-btn-trigger.next-expand .next-split-btn-symbol-fold{transform:rotate(180deg)}.next-split-btn-trigger.next-btn-normal:not(:disabled):not(.disabled) .next-icon{color:#999}.next-split-btn-trigger.next-small{padding-left:4px;padding-right:4px}.next-split-btn-trigger.next-medium{padding-left:8px;padding-right:8px}.next-split-btn-symbol-fold:before{content:""}.next-split-btn-symbol-unfold:before{content:""}.next-step,.next-step *,.next-step:after,.next-step :after,.next-step:before,.next-step :before{box-sizing:border-box}.next-step{width:100%;position:relative;border:none}.next-step-item{position:relative;vertical-align:middle;outline:0;height:100%}.next-step-item-body{outline:0}.next-step-item-node{transition:all .1s linear}.next-step-item-node.clicked{transform:scale3d(.8,.8,.8)}.next-step-horizontal{overflow:hidden}.next-step-horizontal>.next-step-item{display:inline-block;text-align:left}.next-step-vertical>.next-step-item{display:block;text-align:center}.next-step-arrow{display:flex}.next-step-arrow .next-step-item{flex:1;height:32px;line-height:32px;margin-left:16px;margin-right:4px}.next-step-arrow .next-step-item:before{content:"";position:absolute;left:-16px;top:0;z-index:1;border:16px solid transparent}.next-step-arrow .next-step-item:after{content:"";position:absolute;right:-16px;top:0;z-index:1;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid transparent}.next-step-arrow .next-step-item .next-step-item-container{min-width:100px;height:32px;cursor:pointer}.next-step-arrow .next-step-item .next-step-item-container .next-step-item-title{height:32px;line-height:32px;font-weight:700;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.next-step-arrow>.next-step-item-wait{background:#f5f5f5}.next-step-arrow>.next-step-item-wait .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-wait .next-step-item-tail-underlay{background:#ccc}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#f5f5f5;border-color:#000}.next-step-arrow>.next-step-item-wait .next-step-item-title{color:#999;word-break:break-word}.next-step-arrow>.next-step-item-wait .next-step-item-content{color:#999;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow>.next-step-item-wait .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-wait:before{border:16px solid #f5f5f5;border-left-color:transparent}.next-step-arrow>.next-step-item-wait:after{border-left-color:#f5f5f5}.next-step-arrow>.next-step-item-process{background:#209bfa}.next-step-arrow>.next-step-item-process .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-process .next-step-item-tail-underlay{background:#ccc}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;border-color:#000}.next-step-arrow>.next-step-item-process .next-step-item-title{color:#fff;word-break:break-word}.next-step-arrow>.next-step-item-process .next-step-item-content{color:#fff;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow>.next-step-item-process .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-process .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-process:before{border:16px solid #209bfa;border-left-color:transparent}.next-step-arrow>.next-step-item-process:after{border-left-color:#209bfa}.next-step-arrow>.next-step-item-finish{background:#add9ff}.next-step-arrow>.next-step-item-finish .next-step-item-tail-overlay{background:#000}.next-step-arrow>.next-step-item-finish .next-step-item-tail-underlay{background:#ccc}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-arrow>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#add9ff;border-color:#000}.next-step-arrow>.next-step-item-finish .next-step-item-title{color:#209bfa;word-break:break-word}.next-step-arrow>.next-step-item-finish .next-step-item-content{color:#209bfa;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow>.next-step-item-finish .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow>.next-step-item-finish:before{border:16px solid #add9ff;border-left-color:transparent}.next-step-arrow>.next-step-item-finish:after{border-left-color:#add9ff}.next-step-arrow .next-step-item-disabled{cursor:not-allowed;background:#fafafa}.next-step-arrow .next-step-item-disabled .next-step-item-tail-overlay{background:#000}.next-step-arrow .next-step-item-disabled .next-step-item-tail-underlay{background:#ccc}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#000}.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-arrow .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fafafa;border-color:#000}.next-step-arrow .next-step-item-disabled .next-step-item-title{color:#ccc;word-break:break-word}.next-step-arrow .next-step-item-disabled .next-step-item-content{color:#ccc;font-size:12px;line-height:1.5;word-break:break-word}.next-step-arrow .next-step-item-disabled .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-arrow .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-arrow .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-arrow .next-step-item-disabled:before{border:16px solid #fafafa;border-left-color:transparent}.next-step-arrow .next-step-item-disabled:after{border-left-color:#fafafa}.next-step-arrow .next-step-item-disabled .next-step-item-container{cursor:not-allowed}.next-step-arrow .next-step-item-read-only,.next-step-arrow .next-step-item-read-only .next-step-item-container{cursor:default}.next-step-arrow .next-step-item-first{margin-left:0}.next-step-arrow .next-step-item-first:before{border:16px solid transparent}.next-step-arrow .next-step-item-last{margin-right:0}.next-step-arrow .next-step-item-last:after{border:16px solid transparent}.next-step-circle .next-step-item-container{display:inline-block;vertical-align:middle;position:relative;padding:0 8px}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-text{color:#209bfa;font-size:14px}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-underlay{stroke:#ccc;stroke-width:3px}.next-step-circle .next-step-item-container .next-step-item-progress .next-progress-circle-overlay-normal{stroke:#209bfa;stroke-width:3px}.next-step-circle .next-step-item-container .next-step-item-node-placeholder{display:inline-block}.next-step-circle>.next-step-item-wait .next-step-item-tail-overlay{background:#ddd}.next-step-circle>.next-step-item-wait .next-step-item-tail-underlay{background:#eee}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#666}.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#ccc}.next-step-circle>.next-step-item-wait .next-step-item-title{color:#666;word-break:break-word}.next-step-circle>.next-step-item-wait .next-step-item-content{color:#666;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle>.next-step-item-wait .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-wait .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle>.next-step-item-process .next-step-item-tail-overlay{background:#ddd}.next-step-circle>.next-step-item-process .next-step-item-tail-underlay{background:#eee}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#fff}.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;border-color:#209bfa}.next-step-circle>.next-step-item-process .next-step-item-title{color:#333;word-break:break-word}.next-step-circle>.next-step-item-process .next-step-item-content{color:#333;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle>.next-step-item-process .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-process .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle>.next-step-item-finish .next-step-item-tail-overlay{background:#209bfa}.next-step-circle>.next-step-item-finish .next-step-item-tail-underlay{background:#eee}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#209bfa}.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-circle>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#209bfa}.next-step-circle>.next-step-item-finish .next-step-item-title{color:#666;word-break:break-word}.next-step-circle>.next-step-item-finish .next-step-item-content{color:#666;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle>.next-step-item-finish .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle>.next-step-item-finish .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle .next-step-item-disabled .next-step-item-tail-overlay,.next-step-circle .next-step-item-disabled .next-step-item-tail-underlay{background:#eee}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:32px;height:32px}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#ccc}.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-circle .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#eee}.next-step-circle .next-step-item-disabled .next-step-item-title{color:#ccc;word-break:break-word}.next-step-circle .next-step-item-disabled .next-step-item-content{color:#ccc;font-size:12px;line-height:1.5;word-break:break-word}.next-step-circle .next-step-item-disabled .next-step-item-node-placeholder{width:32px;height:32px;position:relative}.next-step-circle .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-circle .next-step-item-disabled .next-step-item-node-circle{display:block;width:32px;height:32px;font-size:12px;font-weight:400;line-height:30px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-circle .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-circle .next-step-item-disabled .next-step-item-node,.next-step-circle .next-step-item-disabled .next-step-item-node-placeholder{cursor:not-allowed}.next-step-circle .next-step-item-read-only .next-step-item-node,.next-step-circle .next-step-item-read-only .next-step-item-node-placeholder{cursor:default}.next-step-circle .next-step-item-last .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal{text-align:center;white-space:nowrap}.next-step-circle.next-step-horizontal>.next-step-item .next-step-item-content,.next-step-circle.next-step-horizontal>.next-step-item .next-step-item-title{white-space:normal}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 48px);vertical-align:middle}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-circle.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body{width:100px;left:-26px;text-align:center;position:absolute}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-circle.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item{vertical-align:unset}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item:last-child .next-step-item-tail{display:none}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body{position:relative;display:inline-block;top:0;left:0;max-width:100px;overflow:hidden;vertical-align:top;text-align:left}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body .next-step-item-title{display:inline-block;padding-right:8px;margin-top:9px}.next-step-circle.next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-tail{width:calc(100% - 148px);position:absolute;right:0;margin-top:-1px}.next-step-circle.next-step-vertical{font-size:0;display:table-cell;vertical-align:middle;position:relative}.next-step-circle.next-step-vertical .next-step-item-container{padding:0}.next-step-circle.next-step-vertical>.next-step-item:last-child .next-step-item-tail{display:block;visibility:hidden}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-circle.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body{position:absolute;top:0;left:16px;margin-left:8px}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{margin-top:8px;text-align:left;font-weight:700;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot .next-step-item-container{display:inline-block;vertical-align:middle;position:relative;padding:0 8px;margin-top:-1px;margin-bottom:-1px}.next-step-dot .next-step-item-container .next-step-item-node-placeholder{display:inline-block}.next-step-dot .next-step-item-container .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot .next-step-item-container .next-step-item-node .next-icon .next-icon-remote,.next-step-dot .next-step-item-container .next-step-item-node .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-wait .next-step-item-tail-overlay{background:#ddd}.next-step-dot>.next-step-item-wait .next-step-item-tail-underlay{background:#eee}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node{color:#999}.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-wait>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#ccc}.next-step-dot>.next-step-item-wait .next-step-item-title{color:#666;word-break:break-word}.next-step-dot>.next-step-item-wait .next-step-item-content{color:#666;line-height:1.5;word-break:break-word}.next-step-dot>.next-step-item-wait .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot>.next-step-item-wait .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-wait .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-wait .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-wait .next-step-item-content{font-size:12px}.next-step-dot>.next-step-item-wait .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot>.next-step-item-process .next-step-item-tail-overlay{background:#ddd}.next-step-dot>.next-step-item-process .next-step-item-tail-underlay{background:#eee}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node{color:#209bfa}.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-process>.next-step-item-container .next-step-item-node-dot{background:#209bfa;border-color:#209bfa}.next-step-dot>.next-step-item-process .next-step-item-title{color:#333;word-break:break-word}.next-step-dot>.next-step-item-process .next-step-item-content{color:#333;line-height:1.5;word-break:break-word}.next-step-dot>.next-step-item-process .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot>.next-step-item-process .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-process .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-process .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-process .next-step-item-content{font-size:12px}.next-step-dot>.next-step-item-process .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot>.next-step-item-finish .next-step-item-tail-overlay{background:#209bfa}.next-step-dot>.next-step-item-finish .next-step-item-tail-underlay{background:#eee}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node{color:#209bfa}.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node-circle,.next-step-dot>.next-step-item-finish>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#209bfa}.next-step-dot>.next-step-item-finish .next-step-item-title{color:#666;word-break:break-word}.next-step-dot>.next-step-item-finish .next-step-item-content{color:#666;line-height:1.5;word-break:break-word}.next-step-dot>.next-step-item-finish .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot>.next-step-item-finish .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot>.next-step-item-finish .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot>.next-step-item-finish .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot>.next-step-item-finish .next-step-item-content{font-size:12px}.next-step-dot>.next-step-item-finish .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot .next-step-item-disabled .next-step-item-tail-overlay,.next-step-dot .next-step-item-disabled .next-step-item-tail-underlay{background:#eee}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-progress{width:12px;height:12px}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node{color:#eee}.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node-circle,.next-step-dot .next-step-item-disabled>.next-step-item-container .next-step-item-node-dot{background:#fff;border-color:#e6e6e6}.next-step-dot .next-step-item-disabled .next-step-item-title{color:#ccc;word-break:break-word}.next-step-dot .next-step-item-disabled .next-step-item-content{color:#ccc;line-height:1.5;word-break:break-word}.next-step-dot .next-step-item-disabled .next-step-item-node-placeholder{width:12px;height:12px;position:relative}.next-step-dot .next-step-item-disabled .next-step-item-node{position:relative;display:inline-block;text-align:center;cursor:pointer}.next-step-dot .next-step-item-disabled .next-step-item-node-circle{display:block;width:12px;height:12px;font-size:12px;font-weight:400;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .1s linear}.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon{animation:zoomIn .3s linear}.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon .next-icon-remote,.next-step-dot .next-step-item-disabled .next-step-item-node-circle .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-step-dot .next-step-item-disabled .next-step-item-content{font-size:12px}.next-step-dot .next-step-item-disabled .next-step-item-node-dot{display:block;width:12px;height:12px;font-size:12px;line-height:10px;text-align:center;border:1px solid;border-radius:50%;transition:background-color .3s ease,border-color .3s ease}.next-step-dot .next-step-item-disabled .next-step-item-node,.next-step-dot .next-step-item-disabled .next-step-item-node-placeholder{cursor:not-allowed}.next-step-dot .next-step-item-read-only .next-step-item-node,.next-step-dot .next-step-item-read-only .next-step-item-node-placeholder{cursor:default}.next-step-dot .next-step-item-last .next-step-item-tail{display:none}.next-step-dot.next-step-horizontal{text-align:center;white-space:nowrap}.next-step-dot.next-step-horizontal>.next-step-item .next-step-item-content,.next-step-dot.next-step-horizontal>.next-step-item .next-step-item-title{white-space:normal}.next-step-dot.next-step-horizontal .next-step-item-node .next-icon{vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail{display:inline-block;clear:both;width:calc(100% - 28px);vertical-align:middle}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{display:block;height:1px;position:relative}.next-step-dot.next-step-horizontal>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:1px;transition:all .1s linear;width:100%}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body{width:100px;left:-36px;text-align:center;position:absolute}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{font-size:14px;line-height:18px;margin-top:8px;font-weight:700}.next-step-dot.next-step-horizontal>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:4px}.next-step-dot.next-step-vertical{padding:0 0 0 4px;font-size:0;display:table-cell;position:relative}.next-step-dot.next-step-vertical .next-step-item-container{padding:0}.next-step-dot.next-step-vertical>.next-step-item:last-child .next-step-item-tail{display:block;visibility:hidden}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-wait .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-process .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-finish .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail{width:1px;height:0;margin:8px auto}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-underlay{height:100%;width:1px;position:relative}.next-step-dot.next-step-vertical>.next-step-item-disabled .next-step-item-tail .next-step-item-tail-overlay{position:absolute;top:0;height:100%;width:1px}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body{position:absolute;top:0;left:6px;margin-left:8px}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{margin-top:0;font-weight:700;text-align:left;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot.next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{margin-top:8px;min-height:8px;text-align:left;font-size:12px;line-height:1.5}.next-step-horizontal[dir=rtl]>.next-step-item{text-align:right}.next-step-arrow[dir=rtl] .next-step-item{height:32px;line-height:32px;margin-left:4px;margin-right:16px}.next-step-arrow[dir=rtl] .next-step-item:before{right:-16px;left:auto;border:16px solid transparent}.next-step-arrow[dir=rtl] .next-step-item:after{left:-32px;right:auto;border-top:16px solid transparent;border-bottom:16px solid transparent;border-right:16px solid transparent}.next-step-arrow[dir=rtl]>.next-step-item-wait{background:#f5f5f5}.next-step-arrow[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-wait:before{border:16px solid #f5f5f5;border-right-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-wait:after{border-right-color:#f5f5f5;border-left-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-process{background:#209bfa}.next-step-arrow[dir=rtl]>.next-step-item-process .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-process:before{border:16px solid #209bfa;border-right-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-process:after{border-right-color:#209bfa;border-left-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-finish{background:#add9ff}.next-step-arrow[dir=rtl]>.next-step-item-finish .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl]>.next-step-item-finish:before{border:16px solid #add9ff;border-right-color:transparent}.next-step-arrow[dir=rtl]>.next-step-item-finish:after{border-right-color:#add9ff;border-left-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-disabled{background:#fafafa}.next-step-arrow[dir=rtl] .next-step-item-disabled .next-step-item-node-dot{right:50%;left:auto}.next-step-arrow[dir=rtl] .next-step-item-disabled:before{border:16px solid #fafafa;border-right-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-disabled:after{border-right-color:#fafafa;border-left-color:transparent}.next-step-arrow[dir=rtl] .next-step-item-first{margin-right:0}.next-step-arrow[dir=rtl] .next-step-item-last{margin-left:0}.next-step-circle[dir=rtl] .next-step-item-disabled .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-finish .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-process .next-step-item-node-dot,.next-step-circle[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-disabled>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-finish>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-process>.next-step-item-body,.next-step-circle[dir=rtl].next-step-horizontal>.next-step-item-wait>.next-step-item-body{right:-26px;left:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-wait .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-process .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-finish .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body{left:auto;right:0;text-align:right}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-body .next-step-item-title{padding-left:8px;padding-right:0}.next-step-circle[dir=rtl].next-step-horizontal.next-step-label-horizontal>.next-step-item-disabled .next-step-item-tail{left:0;right:auto}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body{right:16px;left:auto;margin-right:8px;margin-left:0}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-circle[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl] .next-step-item-disabled .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-finish .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-process .next-step-item-node-dot,.next-step-dot[dir=rtl]>.next-step-item-wait .next-step-item-node-dot{right:50%;left:auto}.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-disabled>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-finish>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-process>.next-step-item-body,.next-step-dot[dir=rtl].next-step-horizontal>.next-step-item-wait>.next-step-item-body{right:-36px;left:auto}.next-step-dot[dir=rtl].next-step-vertical{padding:0 4px 0 0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-wait>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-process>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-finish>.next-step-item-body>.next-step-item-content{text-align:right}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body{right:6px;left:auto;margin-right:8px;margin-left:0}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-title{text-align:right;font-family:Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,PingFang SC,Microsoft YaHei;font-size:14px;line-height:1.2857142}.next-step-dot[dir=rtl].next-step-vertical>.next-step-item-disabled>.next-step-item-body>.next-step-item-content{text-align:right}.next-switch:after[dir=rtl]{content:" ";transition:all .1s linear;transform-origin:right center}.next-switch-medium[dir=rtl]:after,.next-switch-small[dir=rtl]:after{right:100%;transform:translateX(100%)}.next-switch-on[dir=rtl]>.next-switch-children{color:#fff}.next-switch-on[disabled][dir=rtl]:after{left:0;right:100%;box-shadow:1px 1px 3px 0 rgba(0,0,0,.12)}.next-switch-off[dir=rtl]:after{right:0;transform:translateX(0);box-shadow:-1px 0 3px 0 rgba(0,0,0,.12)}.next-switch-off.next-switch-small[dir=rtl]>.next-switch-children,.next-switch-off[dir=rtl]>.next-switch-children{right:auto}.next-switch{outline:none;text-align:left;cursor:pointer;vertical-align:middle;user-select:none;overflow:hidden;transition:background .1s cubic-bezier(.4,0,.2,1),border-color .1s cubic-bezier(.4,0,.2,1)}.next-switch,.next-switch *,.next-switch :after,.next-switch :before{box-sizing:border-box}.next-switch-btn{transition:all .15s cubic-bezier(.4,0,.2,1);transform-origin:left center}.next-switch:after{content:""}.next-switch-loading{pointer-events:none}.next-switch-loading .next-icon-loading{color:#209bfa;text-align:center;transform:translate(-1px,-1px)}.next-switch-loading .next-icon-loading.next-switch-inner-icon:before{vertical-align:top}.next-switch-medium{position:relative;display:inline-block;border:2px solid transparent;width:48px;height:28px;border-radius:12px}.next-switch-medium:not([disabled]):active .next-switch-btn{width:31.2px}.next-switch-medium.next-switch-on:not([disabled]):active .next-switch-btn{left:calc(100% - 31.2px)}.next-switch-medium.next-switch-auto-width{min-width:48px;width:auto;overflow:initial}.next-switch-medium:after{content:""}.next-switch-medium>.next-switch-btn{border:1px solid transparent;position:absolute;left:calc(100% - 24px);width:24px;height:24px;border-radius:12px;box-sizing:border-box}.next-switch-medium>.next-switch-children{height:24px;line-height:24px;font-size:14px}.next-switch-medium.next-switch.next-switch-on>.next-switch-children{margin:0 32px 0 8px}.next-switch-medium.next-switch.next-switch-off>.next-switch-children{margin:0 8px 0 32px}.next-switch-medium.next-switch-loading .next-icon-loading{line-height:24px;height:24px;width:24px}.next-switch-medium.next-switch-loading .next-icon-loading .next-icon-remote,.next-switch-medium.next-switch-loading .next-icon-loading:before{width:16px;font-size:16px;line-height:inherit}.next-switch-small{position:relative;display:inline-block;border:2px solid transparent;width:44px;height:24px;border-radius:12px}.next-switch-small:not([disabled]):active .next-switch-btn{width:26px}.next-switch-small.next-switch-on:not([disabled]):active .next-switch-btn{left:calc(100% - 26px)}.next-switch-small.next-switch-auto-width{min-width:44px;width:auto;overflow:initial}.next-switch-small:after{content:""}.next-switch-small>.next-switch-btn{border:1px solid transparent;position:absolute;left:calc(100% - 20px);width:20px;height:20px;border-radius:12px;box-sizing:border-box}.next-switch-small>.next-switch-children{height:20px;line-height:20px;font-size:12px}.next-switch-small.next-switch.next-switch-on>.next-switch-children{margin:0 28px 0 8px}.next-switch-small.next-switch.next-switch-off>.next-switch-children{margin:0 8px 0 28px}.next-switch-small.next-switch-loading .next-icon-loading{line-height:20px;height:20px;width:20px}.next-switch-small.next-switch-loading .next-icon-loading .next-icon-remote,.next-switch-small.next-switch-loading .next-icon-loading:before{width:12px;font-size:12px;line-height:inherit}.next-switch-on{background-color:#209bfa}.next-switch-on .next-switch-btn{box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fff;border-color:transparent}.next-switch-on>.next-switch-children{color:#fff}.next-switch-on.hover,.next-switch-on:focus,.next-switch-on:hover{background-color:#1274e7}.next-switch-on.hover .next-switch-btn,.next-switch-on:focus .next-switch-btn,.next-switch-on:hover .next-switch-btn{background-color:#fff}.next-switch-on[disabled]{background-color:#f5f5f5;cursor:not-allowed}.next-switch-on[disabled] .next-switch-btn{right:0;box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa;border-color:transparent}.next-switch-on[disabled]>.next-switch-children{color:#ccc}.next-switch-off,.next-switch-off.hover,.next-switch-off:focus,.next-switch-off:hover{background-color:#f5f5f5;border-color:#f5f5f5}.next-switch-off .next-switch-btn{left:0;box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fff;border-color:transparent}.next-switch-off.hover .next-switch-btn,.next-switch-off:focus .next-switch-btn,.next-switch-off:hover .next-switch-btn{background-color:#fff}.next-switch-off>.next-switch-children{color:#999}.next-switch-off[disabled]{background-color:#f5f5f5;cursor:not-allowed}.next-switch-off[disabled] .next-switch-btn{box-shadow:1px 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa;border-color:transparent}.next-switch-off[disabled]>.next-switch-children{color:#ddd}.next-tabs{width:100%}.next-tabs,.next-tabs *,.next-tabs :after,.next-tabs :before{box-sizing:border-box}.next-tabs-bar{outline:none}.next-tabs-bar-popup{overflow-y:auto;max-height:480px}.next-tabs-nav-container{position:relative}.next-tabs-nav-container:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-tabs-nav-wrap{overflow:hidden}.next-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.next-tabs-scrollable .next-tabs-nav-scroll{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}.next-tabs-scrollable .next-tabs-nav-scroll::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;-webkit-appearance:none;opacity:0!important}.next-tabs-nav{display:inline-block;position:relative;transition:all .3s ease;list-style:none;padding:0;margin:0}.next-tabs-nav-appear,.next-tabs-nav-enter{animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tabs-nav-leave{animation:fadeOutLeft .2s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tabs-nav.next-disable-animation .next-tabs-tab:before{transition:none}.next-tabs-tab{display:inline-block;position:relative;transition:all .1s linear}.next-tabs-tab-inner{position:relative;cursor:pointer;text-decoration:none}.next-tabs-tab:before{content:"";position:absolute;transition:all .3s ease}.next-tabs-tab.active{font-weight:400}.next-tabs-tab .next-tabs-tab-close{color:#666}.next-tabs-tab .next-tabs-tab-close:hover{color:#333}.next-tabs-tab .next-tabs-tab-close:focus{outline:none}.next-tabs-tab.active .next-tabs-tab-close{color:#209bfa}.next-tabs-tab.disabled .next-tabs-tab-close{color:#e6e6e6}.next-tabs-tab:focus{outline:none}.next-tabs-tabpane{visibility:hidden;opacity:0}.next-tabs-tabpane.active{visibility:visible;opacity:1;height:auto}.next-tabs-tabpane.hidden{overflow:hidden;height:0!important;margin:0!important;padding:0!important;border:0!important}.next-tabs-btn-down,.next-tabs-btn-next,.next-tabs-btn-prev{position:absolute;top:0;cursor:pointer;padding:0;border:0;outline:none;height:100%;background:transparent;border-color:transparent}.next-tabs-btn-down,.next-tabs-btn-down.visited,.next-tabs-btn-down:link,.next-tabs-btn-down:visited,.next-tabs-btn-next,.next-tabs-btn-next.visited,.next-tabs-btn-next:link,.next-tabs-btn-next:visited,.next-tabs-btn-prev,.next-tabs-btn-prev.visited,.next-tabs-btn-prev:link,.next-tabs-btn-prev:visited{color:#666}.next-tabs-btn-down.active,.next-tabs-btn-down.hover,.next-tabs-btn-down:active,.next-tabs-btn-down:focus,.next-tabs-btn-down:hover,.next-tabs-btn-next.active,.next-tabs-btn-next.hover,.next-tabs-btn-next:active,.next-tabs-btn-next:focus,.next-tabs-btn-next:hover,.next-tabs-btn-prev.active,.next-tabs-btn-prev.hover,.next-tabs-btn-prev:active,.next-tabs-btn-prev:focus,.next-tabs-btn-prev:hover{color:#333;background:transparent;border-color:transparent;text-decoration:none}.next-tabs-btn-down.disabled,.next-tabs-btn-next.disabled,.next-tabs-btn-prev.disabled{cursor:not-allowed;color:#e6e6e6}.next-tabs-btn-next{right:8px}.next-tabs-btn-prev{right:32px}.next-tabs-btn-down{right:8px}.next-tabs .next-tab-icon-dropdown:before{content:""}.next-tabs .next-tab-icon-prev:before{content:""}.next-tabs .next-tab-icon-next:before{content:""}.next-tabs-content{overflow:hidden}.next-tabs-vertical>.next-tabs-bar .next-tabs-nav{width:100%}.next-tabs-vertical>.next-tabs-bar .next-tabs-tab{display:block}.next-tabs.next-medium .next-tabs-nav-container-scrolling{padding-right:60px}.next-tabs.next-medium .next-tabs-tab-inner{font-size:14px;padding:20px 16px}.next-tabs.next-medium .next-tabs-tab-inner .next-icon{line-height:1}.next-tabs.next-medium .next-tabs-tab-inner .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-tab-inner .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close{margin-left:8px}.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close .next-icon-remote,.next-tabs.next-medium .next-tabs-tab-inner .next-tabs-tab-close:before{width:12px;font-size:12px;line-height:inherit}.next-tabs.next-medium .next-tabs-btn-down .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-down .next-icon:before,.next-tabs.next-medium .next-tabs-btn-next .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-next .next-icon:before,.next-tabs.next-medium .next-tabs-btn-prev .next-icon .next-icon-remote,.next-tabs.next-medium .next-tabs-btn-prev .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tabs.next-small .next-tabs-nav-container-scrolling{padding-right:56px}.next-tabs.next-small .next-tabs-tab-inner{font-size:12px;padding:8px 12px}.next-tabs.next-small .next-tabs-tab-inner .next-icon{line-height:1}.next-tabs.next-small .next-tabs-tab-inner .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-tab-inner .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{margin-left:8px}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close .next-icon-remote,.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tabs.next-small .next-tabs-tab-inner .next-tabs-tab-close:before{width:16px;font-size:16px}}.next-tabs.next-small .next-tabs-btn-down .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-down .next-icon:before,.next-tabs.next-small .next-tabs-btn-next .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-next .next-icon:before,.next-tabs.next-small .next-tabs-btn-prev .next-icon .next-icon-remote,.next-tabs.next-small .next-tabs-btn-prev .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tabs-pure>.next-tabs-bar{border-bottom:1px solid #e6e6e6;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container{margin-bottom:-1px;box-shadow:none}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab{color:#666;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:hover{cursor:pointer;color:#333;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active{z-index:1;color:#209bfa;background-color:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#e6e6e6;background:transparent}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab:before{border-radius:0;width:0;border-bottom:2px solid #209bfa;left:50%;bottom:0}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-container .next-tabs-tab.active:before{width:100%;left:0}.next-tabs-wrapped>.next-tabs-bar{background:transparent}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab{color:#666;background-color:#f9f9f9}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab:hover{cursor:pointer;color:#333;background-color:#f5f5f5}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#209bfa;background-color:#fff}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;background:#fafafa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close{color:#666}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close:hover{color:#333}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab .next-tabs-tab-close:focus{outline:none}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.active .next-tabs-tab-close{color:#209bfa}.next-tabs-wrapped>.next-tabs-bar .next-tabs-tab.disabled .next-tabs-tab-close{color:#e6e6e6}.next-tabs-wrapped:after,.next-tabs-wrapped:before{content:"";display:table}.next-tabs-wrapped:after{clear:both}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar,.next-tabs-wrapped>.next-tabs-content{position:relative}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab{margin-right:4px;border-radius:3px 3px 0 0;border:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #e6e6e6 #fff}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;width:0;border-top:2px solid #209bfa;left:50%;top:-1px}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active:before{width:calc(100% - 6px);left:3px}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-tab.active{border-width:1px}.next-tabs-wrapped.next-tabs-top>.next-tabs-bar:before{content:"";position:absolute;top:100%;width:100%;height:0;border-bottom:1px solid #e6e6e6;transform:translateY(-1px);display:block}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar{position:relative}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab{margin-right:4px;border:1px solid #e6e6e6;border-radius:0 0 3px 3px}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active{border-color:#fff #e6e6e6 #e6e6e6}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;width:0;border-bottom:2px solid #209bfa;left:50%;bottom:-1px}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-tab.active:before{width:calc(100% - 6px);left:3px}.next-tabs-wrapped.next-tabs-bottom>.next-tabs-content{top:1px;border-bottom:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar{float:left}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab{float:none;margin-bottom:4px;border-radius:3px 0 0 3px;border:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #fff #e6e6e6 #e6e6e6}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;height:0;border-left:2px solid #209bfa;top:50%;left:-1px}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active:before{height:calc(100% - 6px);top:3px}.next-tabs-wrapped.next-tabs-left>.next-tabs-bar .next-tabs-tab.active{border-width:1px}.next-tabs-wrapped.next-tabs-left>.next-tabs-content{right:1px;border-left:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar{float:right}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab{float:none;margin-bottom:4px;border-radius:0 3px 3px 0;border:1px solid #e6e6e6}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:hover{border-color:#ddd}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-color:#e6e6e6 #e6e6e6 #e6e6e6 #fff}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab:before{border-radius:3px;height:0;border-right:2px solid #209bfa;top:50%;right:-1px}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active:before{height:calc(100% - 6px);top:3px}.next-tabs-wrapped.next-tabs-right>.next-tabs-bar .next-tabs-tab.active{border-width:1px}.next-tabs-wrapped.next-tabs-right>.next-tabs-content{right:-1px;border-right:1px solid #e6e6e6}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab{transition:background-color .1s linear;border:1px solid #ddd;border-right-color:transparent;margin-right:-1px;color:#333;background-color:#f9f9f9}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:first-child{border-radius:3px 0 0 3px}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-radius:0 3px 3px 0;border-right:1px solid #ddd}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{border-right:1px solid;border-color:#209bfa}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{border-color:#eee}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab:hover{z-index:2;border-right:1px solid;border-color:#ddd;cursor:pointer;color:#333;background-color:#f5f5f5}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#fff;background-color:#209bfa}.next-tabs-capsule>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;background:#fafafa}.next-tabs-text>.next-tabs-bar .next-tabs-tab{color:#666;background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab:hover{cursor:pointer;color:#333;background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab.active{z-index:1;color:#209bfa;background-color:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab.disabled{pointer-events:none;cursor:default;color:#ccc;background:transparent}.next-tabs-text>.next-tabs-bar .next-tabs-tab:not(:last-child):after{content:"";position:absolute;right:0;top:calc(50% - 4px);width:1px;height:8px;background-color:#e6e6e6}.next-tabs-pure>.next-tabs-bar{position:relative}.next-tabs-pure>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-capsule>.next-tabs-bar{position:relative}.next-tabs-capsule>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs-text>.next-tabs-bar{position:relative}.next-tabs-text>.next-tabs-bar .next-tabs-nav-extra{position:absolute;top:50%;right:0;transform:translateY(-50%)}.next-tabs[dir=rtl].next-medium .next-tabs-nav-container-scrolling{padding-left:60px;padding-right:0}.next-tabs[dir=rtl].next-medium .next-tabs-tab-close{padding-right:8px;padding-left:0}.next-tabs[dir=rtl].next-small .next-tabs-nav-container-scrolling{padding-left:56px;padding-right:0}.next-tabs[dir=rtl].next-small .next-tabs-tab-close{padding-right:8px;padding-left:0}.next-tabs[dir=rtl].next-tabs-wrapped.next-tabs-bottom>.next-tabs-bar .next-tabs-nav-extra,.next-tabs[dir=rtl].next-tabs-wrapped.next-tabs-top>.next-tabs-bar .next-tabs-nav-extra,.next-tabs[dir=rtl]>.next-tabs-bar .next-tabs-nav-extra{right:auto;left:0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab{border:1px solid #ddd;border-left:0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:first-child{border-left:0;border-radius:0 3px 3px 0}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab:last-child{border-radius:3px 0 0 3px;border-left:1px solid #ddd}.next-tabs[dir=rtl].next-tabs-capsule>.next-tabs-bar .next-tabs-tab.active{margin-left:-1px;margin-right:auto;border-left:1px solid;border-color:#209bfa}.next-tabs[dir=rtl] .next-tabs-btn-next{left:8px;right:auto}.next-tabs[dir=rtl] .next-tabs-btn-prev{left:32px;right:auto}.next-tabs[dir=rtl] .next-tabs-btn-down{left:8px;right:auto}.next-tabs-text[dir=rtl]>.next-tabs-bar .next-tabs-tab:not(:last-child):after{content:"";position:absolute;left:0;right:auto}@keyframes fadeInRightForTag{0%{opacity:0;transform:rotate(45deg) translateX(20px)}to{opacity:1;transform:rotate(45deg) translateX(0)}}.next-tag>.next-tag-body{overflow:hidden;text-overflow:ellipsis}.next-tag-checkable.next-tag-level-secondary{color:#333;border-color:transparent;background-color:transparent}.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary:not(.disabled):not([disabled]):hover{color:#209bfa}.next-tag-default.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-default.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-default.next-tag-level-primary,[disabled].next-tag-default.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-default.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-default.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-closable.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-closable.next-tag-level-primary,[disabled].next-tag-closable.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-closable.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-primary{color:#666;border-color:#f5f5f5;background-color:#f5f5f5}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover{color:#333;border-color:#f2f2f2;background-color:#f2f2f2}.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-checkable.next-tag-level-primary,[disabled].next-tag-checkable.next-tag-level-primary{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn,[disabled].next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#ccc}.next-tag-checkable.next-tag-level-primary>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-primary.checked{color:#fff;border-color:#209bfa;background-color:#209bfa}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover{color:#fff;border-color:#1274e7;background-color:#1274e7}.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#fff}.disabled.next-tag-checkable.next-tag-level-primary.checked,[disabled].next-tag-checkable.next-tag-level-primary.checked{color:#ccc;border-color:#fafafa;background-color:#fafafa}.disabled.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,.next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn,[disabled].next-tag-checkable.next-tag-level-primary.checked>.next-tag-close-btn{color:#fff}.next-tag-default.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;border-color:#ccc;background-color:transparent}.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-default.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-default.next-tag-level-normal,[disabled].next-tag-default.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:#fafafa}.disabled.next-tag-default.next-tag-level-normal>.next-tag-close-btn,[disabled].next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-default.next-tag-level-normal>.next-tag-close-btn{color:#666}.next-tag-closable.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;border-color:#ccc;background-color:transparent}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover>.next-tag-close-btn,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover>.next-tag-close-btn{color:#333}.disabled.next-tag-closable.next-tag-level-normal,[disabled].next-tag-closable.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:transparent}.disabled.next-tag-closable.next-tag-level-normal>.next-tag-close-btn,[disabled].next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#ccc}.next-tag-closable.next-tag-level-normal>.next-tag-close-btn{color:#666}.next-tag-checkable.next-tag-level-normal.checked{color:#209bfa;border-color:#209bfa;background-color:transparent}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover{color:#1274e7;border-color:#1274e7;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked{color:#209bfa;border-color:#209bfa;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover{color:#1274e7;border-color:#1274e7;background-color:transparent}.next-tag-checkable.next-tag-level-secondary.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;transform:rotate(45deg)}.next-tag-checkable.next-tag-level-secondary.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"";transform:scale(.6);color:#fff}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:before{background-color:#1274e7}.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]).hover:after,.next-tag-checkable.next-tag-level-secondary.checked:not(.disabled):not([disabled]):hover:after{color:#fff}.next-tag-checkable.next-tag-level-secondary.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-secondary.checked:before{background-color:#eee}.next-tag-checkable.next-tag-level-secondary.checked:disabled:after,[disabled].next-tag-checkable.next-tag-level-secondary.checked:after{color:#fff}.next-tag-checkable.next-tag-level-normal{color:#666;border-color:#ddd;background-color:transparent}.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]).hover,.next-tag-checkable.next-tag-level-normal:not(.disabled):not([disabled]):hover{color:#333;border-color:#ddd;background-color:transparent}.disabled.next-tag-checkable.next-tag-level-normal,[disabled].next-tag-checkable.next-tag-level-normal{color:#ccc;border-color:#eee;background-color:#fafafa}.next-tag-checkable.next-tag-level-normal.checked:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#209bfa;transform:rotate(45deg)}.next-tag-checkable.next-tag-level-normal.checked:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"";transform:scale(.6);color:#fff}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:before,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:before{background-color:#1274e7}.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]).hover:after,.next-tag-checkable.next-tag-level-normal.checked:not(.disabled):not([disabled]):hover:after{color:#fff}.next-tag-checkable.next-tag-level-normal.checked:disabled:before,[disabled].next-tag-checkable.next-tag-level-normal.checked:before{background-color:#eee}.next-tag-checkable.next-tag-level-normal.checked:disabled:after,[disabled].next-tag-checkable.next-tag-level-normal.checked:after{color:#fff}.next-tag-closable.next-tag-level-normal:before{position:absolute;content:"";-webkit-font-smoothing:antialiased;background-color:#ddd;transform:rotate(45deg)}.next-tag-closable.next-tag-level-normal:after{position:absolute;font-family:NextIcon;-webkit-font-smoothing:antialiased;content:"";transform:scale(.6);color:#fff}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:before,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:before{background-color:#ccc}.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]).hover:after,.next-tag-closable.next-tag-level-normal:not(.disabled):not([disabled]):hover:after{color:#fff}.next-tag-closable.next-tag-level-normal:disabled:before,[disabled].next-tag-closable.next-tag-level-normal:before{background-color:#eee}.next-tag-closable.next-tag-level-normal:disabled:after,[disabled].next-tag-closable.next-tag-level-normal:after{color:#fff}.next-tag-group .next-tag-large,.next-tag-group .next-tag-medium{margin-right:8px;margin-bottom:8px}.next-tag-group .next-tag-small{margin-right:4px;margin-bottom:4px}.next-tag{display:inline-block;max-width:100%;vertical-align:middle;border-width:1px;border-radius:3px;box-shadow:none;border-style:solid;overflow:hidden;white-space:nowrap;transition:all .1s linear;font-size:0;outline:0}.next-tag,.next-tag *,.next-tag :after,.next-tag :before{box-sizing:border-box}.next-tag>.next-tag-body{position:relative;display:inline-block;height:100%;text-align:center;vertical-align:middle;max-width:100%;cursor:default}.next-tag>.next-tag-body>a{text-decoration:none;color:inherit}.next-tag>.next-tag-body>a:before{content:" ";position:absolute;display:block;top:0;left:0;right:0;bottom:0}.next-tag>.next-tag-body .next-icon{line-height:1;vertical-align:baseline}.next-tag>.next-tag-body .next-icon:before{font-size:inherit}.next-tag.next-tag-body-pointer{cursor:pointer}.next-tag.disabled,.next-tag[disabled]{cursor:not-allowed;pointer-events:none}.next-tag-blue{background-color:#4494f9;border-color:#4494f9;color:#fff}.next-tag-blue-inverse{background-color:rgba(68,148,249,.25);border-color:#4494f9;color:#4494f9}.next-tag-green{background-color:#46bc15;border-color:#46bc15;color:#fff}.next-tag-green-inverse{background-color:rgba(70,188,21,.25);border-color:#46bc15;color:#46bc15}.next-tag-orange{background-color:#ff9300;border-color:#ff9300;color:#fff}.next-tag-orange-inverse{background-color:rgba(255,147,0,.25);border-color:#ff9300;color:#ff9300}.next-tag-red{background-color:#ff3000;border-color:#ff3000;color:#fff}.next-tag-red-inverse{background-color:rgba(255,48,0,.25);border-color:#ff3000;color:#ff3000}.next-tag-turquoise{background-color:#01c1b2;border-color:#01c1b2;color:#fff}.next-tag-turquoise-inverse{background-color:rgba(1,193,178,.25);border-color:#01c1b2;color:#01c1b2}.next-tag-yellow{background-color:#fccc12;border-color:#fccc12;color:#fff}.next-tag-yellow-inverse{background-color:rgba(252,204,18,.25);border-color:#fccc12;color:#fccc12}.next-tag-large{height:40px;padding:0;line-height:38px;font-size:0}.next-tag-large>.next-tag-body{font-size:16px;padding:0 16px;min-width:48px}.next-tag-large.next-tag-closable>.next-tag-body{padding:0 0 0 16px;max-width:calc(100% - 48px)}.next-tag-large[dir=rtl].next-tag-closable>.next-tag-body{padding:0 16px 0 0}.next-tag-large.next-tag-closable>.next-tag-close-btn{margin-left:16px;padding-right:16px}.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-large.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-tag-large[dir=rtl]>.next-tag-close-btn{margin-right:16px;margin-left:0;padding-right:0;padding-left:16px}.next-tag-medium{height:32px;padding:0;line-height:30px;font-size:0}.next-tag-medium>.next-tag-body{font-size:14px;padding:0 12px;min-width:40px}.next-tag-medium.next-tag-closable>.next-tag-body{padding:0 0 0 12px;max-width:calc(100% - 36px)}.next-tag-medium[dir=rtl].next-tag-closable>.next-tag-body{padding:0 12px 0 0}.next-tag-medium.next-tag-closable>.next-tag-close-btn{margin-left:12px;padding-right:12px}.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-medium.next-tag-closable>.next-tag-close-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tag-medium[dir=rtl]>.next-tag-close-btn{margin-right:12px;margin-left:0;padding-right:0;padding-left:12px}.next-tag-small{height:24px;padding:0;line-height:22px;font-size:0}.next-tag-small>.next-tag-body{font-size:12px;padding:0 8px;min-width:28px}.next-tag-small.next-tag-closable>.next-tag-body{padding:0 0 0 8px;max-width:calc(100% - 24px)}.next-tag-small[dir=rtl].next-tag-closable>.next-tag-body{padding:0 8px 0 0}.next-tag-small.next-tag-closable>.next-tag-close-btn{margin-left:8px;padding-right:8px}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon .next-icon-remote,.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon{transform:scale(.5);margin-left:-4px;margin-right:-4px}.next-tag-small.next-tag-closable>.next-tag-close-btn .next-icon:before{width:16px;font-size:16px}}.next-tag-small[dir=rtl]>.next-tag-close-btn{margin-right:8px;margin-left:0;padding-right:0;padding-left:8px}.next-tag-default{cursor:default}.next-tag-closable{position:relative}.next-tag-closable>.next-tag-close-btn{display:inline-block;vertical-align:middle;height:100%;text-align:center;cursor:pointer}.next-tag-checkable{cursor:pointer;position:relative;border-radius:3px}.next-tag-checkable.checked:before{animation:fadeInRightForTag .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.checked:after{animation:zoomIn .4s cubic-bezier(.78,.14,.15,.86)}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):before{right:-10px;bottom:-10px;width:20px;height:20px}.next-tag-checkable.next-tag-small:not(.next-tag-level-primary):after{font-size:8px;line-height:8px;right:0;bottom:0}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):before{right:-14px;bottom:-14px;width:28px;height:28px}.next-tag-checkable.next-tag-medium:not(.next-tag-level-primary):after{font-size:12px;line-height:12px;right:0;bottom:0}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):before{right:-18px;bottom:-18px;width:36px;height:36px}.next-tag-checkable.next-tag-large:not(.next-tag-level-primary):after{font-size:16px;line-height:16px;right:0;bottom:0}.next-tag-checkable.next-tag-level-secondary.disabled,.next-tag-checkable.next-tag-level-secondary[disabled]{color:#ccc;border-color:#eee;background-color:#fafafa}.next-tag-zoom-appear,.next-tag-zoom-enter{animation:fadeInLeft .4s cubic-bezier(.78,.14,.15,.86);animation-fill-mode:both}.next-tag-zoom-leave{animation:zoomOut .3s ease-in;animation-fill-mode:both}.next-timeline,.next-timeline *,.next-timeline:after,.next-timeline :after,.next-timeline:before,.next-timeline :before{box-sizing:border-box}.next-timeline ul{margin:0;padding:0;list-style:none}.next-timeline p{margin:0}.next-timeline-hide{display:none}.next-timeline[dir=rtl] .next-timeline-item-folder{padding-left:0;padding-right:28px}.next-timeline[dir=rtl] .next-timeline-item-dot-tail{left:auto;right:8px;border-left:none;border-right:1px dotted #e6e6e6}.next-timeline[dir=rtl] .next-timeline-item-has-left-content.next-timeline-item-folder{margin-left:0;margin-right:80px}.next-timeline[dir=rtl] .next-timeline-item-done{position:relative}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-dot{background:#ddd}.next-timeline[dir=rtl] .next-timeline-item-done .next-timeline-item-icon{background:#ddd;color:#fff}.next-timeline[dir=rtl] .next-timeline-item-process{position:relative}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-dot{background:#209bfa}.next-timeline[dir=rtl] .next-timeline-item-process .next-timeline-item-icon{background:#209bfa;color:#fff}.next-timeline[dir=rtl] .next-timeline-item-success{position:relative}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-dot{background:#1ad78c}.next-timeline[dir=rtl] .next-timeline-item-success .next-timeline-item-icon{background:#1ad78c;color:#fff}.next-timeline[dir=rtl] .next-timeline-item-error{position:relative}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline{position:absolute;left:auto;right:0;top:0;height:100%}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-right:-12px;margin-left:0;line-height:1}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:auto;right:8px}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content{display:inline-block;margin-right:28px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:left;padding-left:12px;padding-right:0}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-right:80px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-content{margin-right:108px;margin-left:0}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-dot{background:#d23c26}.next-timeline[dir=rtl] .next-timeline-item-error .next-timeline-item-icon{background:#d23c26;color:#fff}.next-timeline{margin:0;padding:0;list-style:none}.next-timeline>li{outline:0}.next-timeline-item-folder{padding-left:28px;padding-top:4px;padding-bottom:4px;font-size:12px;line-height:1.5;position:relative}.next-timeline-item-dot-tail{position:absolute;top:0;left:8px;height:100%;border:0;border-left:1px dotted #e6e6e6}.next-timeline-item-dot-tail-solid{border-style:solid}.next-timeline-item-has-left-content.next-timeline-item-folder{margin-left:80px}.next-timeline-item-done{position:relative}.next-timeline-item-done .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-done .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-done .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-done .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-done.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-done .next-timeline-item-dot{background:#ddd}.next-timeline-item-done .next-timeline-item-icon{background:#ddd;color:#fff}.next-timeline-item-process{position:relative}.next-timeline-item-process .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-process .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-process .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-process .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-process.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-process .next-timeline-item-dot{background:#209bfa}.next-timeline-item-process .next-timeline-item-icon{background:#209bfa;color:#fff}.next-timeline-item-success{position:relative}.next-timeline-item-success .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-success .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-success .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-success .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-success.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-success .next-timeline-item-dot{background:#1ad78c}.next-timeline-item-success .next-timeline-item-icon{background:#1ad78c;color:#fff}.next-timeline-item-error{position:relative}.next-timeline-item-error .next-timeline-item-timeline{position:absolute;left:0;top:0;height:100%}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node{position:relative;width:16px;height:24px;padding:4px 0;text-align:center;float:left}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-node.next-timeline-item-node-custom{width:40px;height:auto;font-size:12px;word-break:break-all;margin-left:-12px;line-height:1}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-dot{display:block;position:absolute;width:8px;height:8px;border-radius:100%;top:50%;margin-top:-4px;left:50%;margin-left:-4px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon{display:block;position:absolute;width:16px;height:16px;line-height:16px;border-radius:100%;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon .next-icon-remote,.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-icon .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail{position:absolute;width:auto;height:calc(100% - 24px);top:24px;left:8px}.next-timeline-item-error .next-timeline-item-timeline .next-timeline-item-tail i{display:inline-block;vertical-align:top;height:100%;width:1px;position:relative;background:#e6e6e6;-webkit-transition:all .1s linear;transition:all .1s linear}.next-timeline-item-error .next-timeline-item-content{display:inline-block;margin-left:28px}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-title{font-size:14px;font-weight:700;line-height:1.5;margin:4px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline-item-error .next-timeline-item-content .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content{position:absolute;width:80px;display:inline-block;font-size:12px;color:#999;line-height:1.5;margin-top:4px;text-align:right;padding-right:12px}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-left-content p{word-break:break-word}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-timeline{margin-left:80px}.next-timeline-item-error.next-timeline-item-has-left-content>.next-timeline-item-content{margin-left:108px}.next-timeline-item-error .next-timeline-item-dot{background:#d23c26}.next-timeline-item-error .next-timeline-item-icon{background:#d23c26;color:#fff}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-left-content,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content{width:50%;padding-right:12px}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-timeline,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-timeline{margin-left:50%}.next-timeline.next-alternate .next-timeline-item-left .next-timeline-item-content,.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content{margin-left:calc(50% + 28px)}.next-timeline.next-alternate .next-timeline-item-folder{margin-left:50%}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-title{margin:4px 0 0;font-size:14px;font-weight:700;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-body{margin:4px 0 0;font-size:12px;line-height:1.5;color:#666;text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:right}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content{display:inline-block;position:relative}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-left-content .next-timeline-item-title{margin-top:0}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content{margin-left:28px;position:absolute}.next-timeline.next-alternate .next-timeline-item-right .next-timeline-item-content .next-timeline-item-body{margin-top:4px;color:#999}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-left-content,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-left-content{width:50%;padding-left:12px}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-timeline,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-timeline{margin-right:50%}.next-timeline[dir=rtl].next-alternate .next-timeline-item-left .next-timeline-item-content,.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content{width:50%;margin-right:calc(50% + 28px)}.next-timeline[dir=rtl].next-alternate .next-timeline-item-folder{margin-right:50%}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-title{margin:0;font-size:14px;font-weight:700;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-body{margin:0;font-size:12px;line-height:1.5;color:#666;text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-time{margin:4px 0 12px;font-size:12px;color:#999;text-align:left}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-left-content{display:inline-block;position:relative}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content{margin-right:28px;position:absolute}.next-timeline[dir=rtl].next-alternate .next-timeline-item-right .next-timeline-item-content .next-timeline-item-body{text-align:right}.next-timeline-item-last .next-timeline-item-tail{display:none}.next-timeline-item-has-left-content{min-height:48px}.next-timeline-item-folder.next-timeline-item-has-left-content{min-height:auto}.next-transfer{display:inline-block}.next-transfer,.next-transfer *,.next-transfer :after,.next-transfer :before{box-sizing:border-box}.next-transfer-panel{display:inline-block;border:1px solid #e6e6e6;border-radius:3px;background-color:#fff;vertical-align:middle}.next-transfer-panel-header{padding:8px 20px;border-bottom:1px solid #e6e6e6;background-color:#fafafa;color:#333;font-size:14px}.next-transfer-panel-search{padding:0 4px;margin-top:8px;margin-bottom:0;width:180px}.next-transfer .next-transfer-panel-list{width:180px;height:160px;padding:0;border:none;box-shadow:none;border-radius:0;overflow-y:auto}.next-transfer-panel-not-found-container{display:table;width:100%;height:100%}.next-transfer-panel-not-found{display:table-cell;vertical-align:middle;text-align:center;color:#999;font-size:14px}.next-transfer-panel-item.next-focused{transition:background-color .1s linear}.next-transfer-panel-item:not(.next-disabled).next-simple:hover{color:#209bfa}.next-transfer-panel-item.next-insert-before:before{position:absolute;top:0;left:0;content:"";width:100%;border-top:1px solid #209bfa}.next-transfer-panel-item.next-insert-after:after{position:absolute;left:0;bottom:0;content:"";width:100%;border-bottom:1px solid #209bfa}.next-transfer-panel-footer{position:relative;padding:8px 20px;border-top:1px solid #e6e6e6;background-color:#fff;font-size:0;box-shadow:none}.next-transfer-panel-count{margin-left:4px;font-size:14px;vertical-align:middle;color:#333}.next-transfer-panel-move-all{font-size:14px;color:#209bfa;cursor:pointer}.next-transfer-panel-move-all.next-disabled{color:#ccc;cursor:not-allowed}.next-transfer-operations{display:inline-block;vertical-align:middle;margin:0 20px}.next-transfer-move.next-icon{color:#ddd}.next-transfer-move.next-icon:before{content:""}.next-transfer-operation.next-btn{display:block}.next-transfer-operation.next-btn+.next-transfer-operation.next-btn{margin-top:8px}.next-transfer-operation.next-btn .next-icon .next-icon-remote,.next-transfer-operation.next-btn .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-tree,.next-tree *,.next-tree :after,.next-tree :before{box-sizing:border-box}.next-tree,.next-tree-child-tree{margin:0;padding:0;list-style:none}.next-tree-node{white-space:nowrap}.next-tree-node-inner{font-size:0;outline:none}.next-tree-node-label-wrapper{display:inline-block;margin:0 4px;vertical-align:middle}.next-tree-node-label{height:20px;line-height:20px;padding:0 4px;border-radius:3px;font-size:14px}.next-tree-node-label .next-icon{font-size:16px}.next-tree-node-label .next-icon:before{font-size:14px;width:14px;margin-right:.5em}.next-tree-node-input.next-input{margin:0 4px}.next-tree-node-indent-unit{display:inline-block;width:24px;vertical-align:middle;position:relative}.next-tree-node-indent-unit.next-line:before{content:"";position:absolute;display:inline-block;border-left:1px solid #ddd;height:28px;left:7.5px}.next-tree-switcher{position:relative;display:inline-block;vertical-align:middle;margin-right:8px}.next-tree .next-tree-unfold-icon:before{content:""}.next-tree-switcher.next-noline{width:20px;height:20px;line-height:20px;cursor:pointer}.next-tree-switcher.next-noline .next-tree-switcher-icon{transition:transform .1s linear;color:#999}.next-tree-switcher.next-noline .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-noline .next-tree-switcher-icon:before{width:20px;font-size:20px;line-height:inherit}.next-tree-switcher.next-noline .next-tree-fold-icon:before{content:""}.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon{transform:rotate(-90deg)}.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-noline.next-close .next-tree-switcher-icon:before{width:20px;font-size:20px;line-height:inherit}.next-tree-switcher.next-noline:not(.next-disabled):hover .next-tree-switcher-icon{color:#333}.next-tree-switcher.next-noline.next-disabled{cursor:not-allowed}.next-tree-switcher.next-noline.next-disabled .next-tree-switcher-icon{color:#ccc}.next-tree-switcher.next-noop-noline{width:20px;height:20px}.next-tree-switcher.next-line{width:16px;height:16px;line-height:14px;border:1px solid #ddd;border-radius:3px;background-color:#fff;cursor:pointer}.next-tree-switcher.next-line .next-tree-switcher-icon{margin-left:3px;color:#666}.next-tree-switcher.next-line .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-line .next-tree-switcher-icon:before{width:8px;font-size:8px;line-height:inherit}@media (-webkit-min-device-pixel-ratio:0)and (min-resolution:0.001dpcm){.next-tree-switcher.next-line .next-tree-switcher-icon{transform:scale(.5);margin-left:-1px;margin-right:-4px}.next-tree-switcher.next-line .next-tree-switcher-icon:before{width:16px;font-size:16px}}.next-tree-switcher.next-line .next-tree-switcher-fold-icon:before{content:""}.next-tree-switcher.next-line .next-tree-switcher-unfold-icon:before{content:""}.next-tree-switcher.next-line:not(.next-disabled):hover{border-color:#ccc;background-color:#f9f9f9}.next-tree-switcher.next-line:not(.next-disabled):hover .next-tree-switcher-icon{color:#333}.next-tree-switcher.next-line.next-disabled{border-color:#eee;background-color:#fff;cursor:not-allowed}.next-tree-switcher.next-line.next-disabled .next-tree-switcher-icon{color:#ccc}.next-tree-switcher.next-noop-line{width:16px;height:16px}.next-tree-switcher.next-noop-line-noroot{height:0;border-left:1px solid #ddd;border-bottom:1px solid #ddd}.next-tree-switcher.next-noop-line-noroot .next-tree-right-angle{bottom:-1px}.next-tree-switcher.next-loading.next-loading-noline{width:20px;height:20px;line-height:20px}.next-tree-switcher.next-loading.next-loading-line{width:16px;height:16px;line-height:14px;border:1px solid transparent}.next-tree-switcher.next-loading .next-tree-switcher-icon{color:#209bfa}.next-tree-switcher.next-loading .next-tree-switcher-icon .next-icon-remote,.next-tree-switcher.next-loading .next-tree-switcher-icon:before{width:20px;font-size:20px;line-height:inherit}.next-tree-right-angle{position:absolute;bottom:6.5px;left:-17.5px;display:block;width:16.5px;height:22px;border-left:1px solid #ddd;border-bottom:1px solid #ddd}.next-tree.next-label-block .next-tree-node-inner{display:flex;align-items:center;outline:none}.next-tree.next-label-block .next-tree-node-label-wrapper{flex:1 1 auto}.next-tree.next-node-indent .next-tree-node .next-tree-node{margin-left:24px}.next-tree.next-node-indent .next-tree-node-inner{padding-top:2px;padding-bottom:2px}.next-tree.next-node-indent .next-tree-node-inner:focus .next-tree-node-label{color:#333;background-color:#f9f9f9}.next-tree.next-node-indent .next-tree-node-label-wrapper{border-top:2px solid transparent;border-bottom:2px solid transparent}.next-tree.next-node-indent .next-tree-node-label{transition:color .1s linear,background-color .1s linear;cursor:default;color:#333;background-color:#fff}.next-tree.next-node-indent .next-tree-node-label-selectable{cursor:pointer}.next-tree.next-node-indent .next-tree-node-label:hover{color:#333;background-color:#f9f9f9}.next-tree.next-node-indent .next-tree-node-inner.next-selected .next-tree-node-label{color:#333;background-color:#add9ff}.next-tree.next-node-indent .next-tree-node-inner.next-disabled .next-tree-node-label,.next-tree.next-node-indent .next-tree-node-inner.next-disabled .next-tree-node-label:hover{color:#ccc;background-color:#fff;cursor:not-allowed}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over .next-tree-node-label{background-color:#209bfa;color:#fff;opacity:.8}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over-gap-top .next-tree-node-label-wrapper{border-top-color:#209bfa}.next-tree.next-node-indent .next-tree-node-inner.next-drag-over-gap-bottom .next-tree-node-label-wrapper{border-bottom-color:#209bfa}.next-tree.next-node-block .next-tree-node-inner{padding-top:4px;padding-bottom:4px;transition:color .1s linear,background-color .1s linear;cursor:pointer;color:#333;background-color:#fff}.next-tree.next-node-block .next-tree-node-inner:focus,.next-tree.next-node-block .next-tree-node-inner:hover{color:#333;background-color:#f9f9f9}.next-tree.next-node-block .next-tree-node-inner.next-selected{color:#333;background-color:#add9ff}.next-tree.next-node-block .next-tree-node-inner.next-disabled,.next-tree.next-node-block .next-tree-node-inner.next-disabled:hover{color:#ccc;background-color:#fff;cursor:not-allowed}.next-tree.next-show-line .next-tree-node .next-tree-node:not(:last-child){margin-left:7.5px;border-left:1px solid #ddd;padding-left:15.5px}.next-tree-node.next-filtered>.next-tree-node-inner .next-tree-node-label,.next-tree-node.next-filtered>.next-tree-node-inner .next-tree-node-label:hover{color:#209bfa}.next-tree[dir=rtl] .next-tree-switcher{margin-left:8px;margin-right:0}.next-tree[dir=rtl] .next-tree-right-angle,.next-tree[dir=rtl] .next-tree-switcher.next-noop-line-noroot{border-left:none;border-right:1px solid #ddd}.next-tree[dir=rtl] .next-tree-right-angle{left:auto;right:-17.5px}.next-tree[dir=rtl].next-show-line .next-tree-node .next-tree-node:not(:last-child){margin-left:0;margin-right:7.5px;border-left:none;border-right:1px solid #ddd;padding-left:0;padding-right:15.5px}.next-tree[dir=rtl].next-node-indent .next-tree-node .next-tree-node{margin-left:0;margin-right:24px}.next-tree-select,.next-tree-select *,.next-tree-select :after,.next-tree-select :before{box-sizing:border-box}.next-tree-select-dropdown{background:#fff;border:1px solid #e6e6e6;border-radius:3px;box-shadow:none;max-height:260px;overflow:auto}.next-tree-select-dropdown>.next-tree,.next-tree-select-dropdown>.next-tree-select-not-found,.next-tree-select-dropdown>.next-virtual-tree-container{padding:8px 20px}.next-tree-select-not-found{font-size:14px;color:#999}.next-upload-list[dir=rtl].next-upload-list-text .next-upload-list-item{padding:4px 8px 4px 40px}.next-upload-list[dir=rtl].next-upload-list-text .next-icon{left:12px;right:auto}.next-upload-list[dir=rtl].next-upload-list-image .next-icon-close{float:left;margin-left:4px;margin-right:0}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-thumbnail{float:right;margin-left:8px;margin-right:0}.next-upload-list[dir=rtl].next-upload-list-image .next-upload-list-item-progress{margin-right:56px;margin-left:24px}.next-upload,.next-upload *,.next-upload :after,.next-upload :before{box-sizing:border-box}.next-upload-inner{outline:0;display:inline-block}.next-upload-inner.next-hidden{display:none}.next-upload-list{overflow:hidden}.next-upload-list,.next-upload-list *,.next-upload-list :after,.next-upload-list :before{box-sizing:border-box}.next-upload-list-item{position:relative}.next-upload-list-item.next-hidden{display:none}.next-upload-list-item-name{text-decoration:none}.next-upload.next-disabled{border-color:#eee!important;color:#ccc!important}.next-upload.next-disabled .next-icon-close{cursor:not-allowed!important}.next-upload.next-disabled .next-upload-inner *{color:#ccc!important;border-color:#eee!important;cursor:not-allowed!important}.next-upload-list-text .next-upload-list-item{background-color:#f9f9f9;padding:4px 40px 4px 8px;height:40px;line-height:32px;font-size:14px;overflow:hidden;transition:all .1s linear;border-radius:0}.next-upload-list-text .next-upload-list-item:not(:last-child){margin-bottom:4px}.next-upload-list-text .next-upload-list-item-op{position:absolute;top:0;right:12px}.next-upload-list-text .next-upload-list-item .next-icon-close{color:#999;cursor:pointer;text-align:center;transition:all .1s linear;line-height:40px}.next-upload-list-text .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-text .next-upload-list-item .next-icon-close:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-text .next-upload-list-item:hover{background-color:#f9f9f9}.next-upload-list-text .next-upload-list-item:hover .next-icon{color:#666}.next-upload-list-text .next-upload-list-item-name-wrap{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-right:4px}.next-upload-list-text .next-upload-list-item-name{color:#333;transition:all .1s linear}.next-upload-list-text .next-upload-list-item-size{color:#999;margin-left:8px}.next-upload-list-text .next-upload-list-item-uploading{line-height:16px}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress{line-height:0;padding-top:4px;padding-bottom:4px}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-underlay{height:8px}.next-upload-list-text .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-overlay{height:8px;margin-top:-4px}.next-upload-list-text .next-upload-list-item-done{line-height:32px}.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-text .next-upload-list-item-done:hover .next-upload-list-item-size{color:#209bfa}.next-upload-list-text .next-upload-list-item-error{background-color:#ffece4!important}.next-upload-list-text .next-upload-list-item-error.next-upload-list-item-error-with-msg{line-height:16px}.next-upload-list-text .next-upload-list-item-error-msg{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:#d23c26}.next-upload-list-image .next-upload-list-item{box-sizing:content-box;border:1px solid #e6e6e6;background-color:#fff;padding:8px;height:48px;line-height:48px;font-size:14px;transition:all .1s linear;overflow:hidden;border-radius:0}.next-upload-list-image .next-upload-list-item:not(:last-child){margin-bottom:4px}.next-upload-list-image .next-upload-list-item:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-upload-list-image .next-upload-list-item-op{float:right;margin-right:4px}.next-upload-list-image .next-upload-list-item .next-icon-close{cursor:pointer;color:#999;text-align:center}.next-upload-list-image .next-upload-list-item .next-icon-close .next-icon-remote,.next-upload-list-image .next-upload-list-item .next-icon-close:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-image .next-upload-list-item:hover{border-color:#209bfa}.next-upload-list-image .next-upload-list-item:hover .next-icon-close{color:#666}.next-upload-list-image .next-upload-list-item-name{display:block;color:#333;margin-left:56px;margin-right:24px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;transition:all .1s linear}.next-upload-list-image .next-upload-list-item-size{color:#999;margin-left:8px}.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-name,.next-upload-list-image .next-upload-list-item-done:hover .next-upload-list-item-size{color:#209bfa}.next-upload-list-image .next-upload-list-item-thumbnail{float:left;width:48px;height:48px;color:#ccc;border:1px solid #e6e6e6;border-radius:0;background-color:#f9f9f9;margin-right:8px;vertical-align:middle;text-align:center;overflow:hidden;box-sizing:border-box}.next-upload-list-image .next-upload-list-item-thumbnail img{width:100%;height:100%}.next-upload-list-image .next-upload-list-item-thumbnail .next-icon{display:block;margin:0;line-height:48px}.next-upload-list-image .next-upload-list-item-thumbnail .next-icon .next-icon-remote,.next-upload-list-image .next-upload-list-item-thumbnail .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-upload-list-image .next-upload-list-item-error{border-color:#d23c26!important;background-color:#fff}.next-upload-list-image .next-upload-list-item-uploading{background-color:#fff}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-name{height:24px;line-height:24px}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress{margin-left:56px;margin-right:24px;line-height:0;padding-top:8px;padding-bottom:8px}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-underlay{height:8px}.next-upload-list-image .next-upload-list-item-uploading .next-upload-list-item-progress .next-progress-line-overlay{height:8px;margin-top:-4px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg,.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-name{height:24px;line-height:24px}.next-upload-list-image .next-upload-list-item-error-with-msg .next-upload-list-item-error-msg{margin-left:56px;margin-right:24px;color:#d23c26;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.next-upload-list-card{display:inline-block}.next-upload-list-card .next-upload-list-item{vertical-align:middle;float:left}.next-upload-list-card .next-upload-list-item:not(:last-child){margin-right:12px}.next-upload-list-card .next-upload-list-item-wrapper{position:relative;border:1px solid #ddd;width:100px;height:100px;padding:0;background-color:transparent;border-radius:0;overflow:hidden}.next-upload-list-card .next-upload-list-item-thumbnail{text-align:center;width:100%;height:100%;color:#ccc;font-size:12px}.next-upload-list-card .next-upload-list-item-thumbnail img{max-width:100%;max-height:100%;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.next-upload-list-card .next-upload-list-item-thumbnail img:focus{outline:0}.next-upload-list-card .next-upload-list-item-thumbnail .next-icon{width:100%}.next-upload-list-card .next-upload-list-item-thumbnail .next-icon .next-icon-remote,.next-upload-list-card .next-upload-list-item-thumbnail .next-icon:before{width:48px;font-size:48px;line-height:inherit}.next-upload-list-card .next-upload-list-item-handler{margin-top:13px}.next-upload-list-card .next-upload-list-item-handler .next-icon-cry{margin-top:10px}.next-upload-list-card .next-upload-list-item-name{display:block;width:100px;text-align:center;margin-top:4px;font-size:12px;color:#666;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.next-upload-list-card .next-upload-list-item-progress{position:absolute;font-size:0;bottom:0;left:0;width:100%}.next-upload-list-card .next-upload-list-item-progress .next-progress-line-underlay{border-radius:0;height:8px}.next-upload-list-card .next-upload-list-item-progress .next-progress-line-overlay{border-radius:0;height:8px;margin-top:-4px}.next-upload-list-card .next-upload-list-item-uploading .next-upload-list-item-wrapper{background-color:#fafafa}.next-upload-list-card .next-upload-list-item:hover .next-upload-tool{opacity:.8}.next-upload-list-card .next-upload-list-item .next-upload-tool{position:absolute;z-index:1;background-color:rgba(0,0,0,.7);transition:all .1s linear;opacity:0;width:100%;height:28px;left:0;bottom:0;display:flex}.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon{line-height:28px;color:#fff;cursor:pointer}.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon .next-icon-remote,.next-upload-list-card .next-upload-list-item .next-upload-tool .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-upload-list-card .next-upload-list-item .next-upload-tool-item{width:100%;text-align:center}.next-upload-list-card .next-upload-list-item .next-upload-tool-item:not(:last-child){border-right:1px solid #fff}.next-upload-list-card .next-upload-list-item .next-upload-tool-reupload{display:inline-block}.next-upload-list-card .next-upload-list-item .next-upload-card{display:flex;flex-direction:column;justify-content:center}.next-upload-list-card .next-upload-list-item-error .next-upload-list-item-wrapper{border-color:#d23c26}.next-upload-list-card.next-upload-ie9 .next-upload-tool{display:table}.next-upload-list-card.next-upload-ie9 .next-upload-tool-item{display:table-cell;width:1%}.next-upload-card,.next-upload-list-card.next-upload-ie9 .next-upload-card{display:table-cell}.next-upload-card{border:1px dashed #ddd;width:100px;height:100px;background-color:#fff;text-align:center;cursor:pointer;transition:border-color .1s linear;vertical-align:middle;border-radius:0}.next-upload-card .next-icon{color:#ddd}.next-upload-card .next-icon .next-icon-remote,.next-upload-card .next-icon:before{width:24px;font-size:24px;line-height:inherit}.next-upload-card .next-upload-add-icon:before{content:""}.next-upload-card .next-upload-text{font-size:14px;margin-top:12px;color:#666;outline:none}.next-upload-card:hover{border-color:#209bfa}.next-upload-card:hover .next-icon,.next-upload-card:hover .next-upload-text{color:#209bfa}.next-upload-dragable .next-upload-inner{display:block}.next-upload-dragable .next-upload-drag{border:1px dashed #ddd;transition:border-color .1s linear;cursor:pointer;border-radius:3px;background-color:transparent;text-align:center;margin-bottom:4px}.next-upload-dragable .next-upload-drag-icon{margin:20px 0 0;color:#666}.next-upload-dragable .next-upload-drag-icon .next-upload-drag-upload-icon:before{content:"";font-size:24px}.next-upload-dragable .next-upload-drag-text{margin:12px 0 0;font-size:14px;color:#666}.next-upload-dragable .next-upload-drag-hint{margin:4px 0 20px;font-size:12px;color:#999}.next-upload-dragable .next-upload-drag-over{border-color:#209bfa}.next-shell{position:relative;display:flex;flex-direction:column;transition:all .2s ease}.next-shell,.next-shell *,.next-shell :after,.next-shell :before{box-sizing:border-box}.next-shell-content-wrapper{overflow:auto}.next-shell-header{display:flex;width:100%;justify-content:space-between;align-items:center;z-index:9}.next-shell-header .dock-trigger,.next-shell-header .nav-trigger{outline:0;display:flex;justify-content:center;align-items:center;cursor:pointer;width:32px;height:32px}.next-shell-header .nav-trigger{margin-right:10px}.next-shell-header .dock-trigger{margin-left:10px}.next-shell-header.next-shell-fixed-header{position:sticky;top:0}.next-shell-header .next-shell-navigation{flex:1 1;display:flex;align-items:center;flex-direction:row}.next-shell-header .next-shell-action,.next-shell-header .next-shell-branding{display:flex;align-items:center}.next-shell-sub-main{flex:1 1;flex-direction:column;outline:0}.next-shell-main,.next-shell-sub-main{display:flex;height:100%;overflow:auto}.next-shell-main{flex:1 1 auto;flex-direction:row;position:relative;box-sizing:content-box;transition:all .2s ease}.next-shell-main .next-shell-content{flex:1 1 auto}.next-shell-main .next-shell-content-inner{margin:0 auto}.next-shell-main .next-shell-footer{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.next-shell .next-aside-navigation,.next-shell .next-aside-tooldock{display:flex}.next-shell .next-aside-navigation.fixed,.next-shell .next-aside-tooldock.fixed{position:fixed;top:0;bottom:0;z-index:1}.next-shell .next-aside-navigation.fixed{left:0}.next-shell .next-aside-tooldock.fixed{right:0}.next-shell-aside{transition:all .2s ease}.next-shell-aside .aside-trigger{cursor:pointer;outline:0;position:absolute;right:0;top:50%;width:20px;height:48px;display:flex;border:1px solid #ddd;align-items:center;justify-content:center}.next-shell-aside .local-nav-trigger{outline:0;border-left:none;transform:translate(100%,-50%);right:0}.next-shell-aside .ancillary-trigger{outline:0;transform:translate(-100%,-50%);border-right:0;left:1px}.next-shell-aside.next-aside-ancillary,.next-shell-aside.next-aside-localnavigation{position:relative}.next-shell-aside.next-shell-navigation{display:flex;flex-direction:column;justify-self:flex-start;transition:all .2s ease}.next-shell-aside.next-shell-tooldock{display:flex;flex-direction:column;align-items:center}.next-shell-aside .next-shell-tooldockitem{width:100%;text-align:center}.next-shell-aside .next-shell-localnavigation{position:relative}.next-shell-aside .next-shell-ancillary,.next-shell-aside .next-shell-localnavigation{height:100%;display:flex;flex-direction:column;justify-self:flex-start;transition:all .2s ease}.next-shell-light .next-shell-header .dock-trigger,.next-shell-light .next-shell-header .nav-trigger{background:#fff}.next-shell-light .next-shell-aside .local-nav-trigger{background:#f2f2f2}.next-shell-light .next-shell-aside .ancillary-trigger{background:#fff}.next-shell-light .next-shell-header{color:#000;height:52px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 16px}.next-shell-light .next-shell-header .next-shell-navigation{justify-content:flex-end;height:52px;line-height:52px;margin:0 48px}.next-shell-light .next-shell-task-header{width:100%;min-height:40px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0;overflow:auto}.next-shell-light .next-shell-main{background:#f5f5f5}.next-shell-light .next-shell-main .next-shell-appbar{min-height:48px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 24px}.next-shell-light .next-shell-main .next-shell-content{padding:20px}.next-shell-light .next-shell-main .next-shell-footer{background:transparent;min-height:56px;color:#ccc;font-size:14px}.next-shell-light .next-shell-aside.next-shell-navigation{width:200px;background:#fff;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px}.next-shell-light .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-light .next-shell-aside.next-shell-tooldock{width:52px;background:#f2f2f2;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside .next-shell-tooldockitem{padding:8px 0;color:#666;background:transparent}.next-shell-light .next-shell-aside .next-shell-tooldockitem:hover{color:#333;background:#f5f5f5}.next-shell-light .next-shell-aside .next-shell-localnavigation{width:168px;background:#f2f2f2;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-light .next-shell-aside .next-shell-ancillary{width:168px;background:#fff;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-light .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-dark .next-shell-header .dock-trigger,.next-shell-dark .next-shell-header .nav-trigger{background:#222}.next-shell-dark .next-shell-aside .local-nav-trigger{background:#f2f2f2}.next-shell-dark .next-shell-aside .ancillary-trigger{background:#fff}.next-shell-dark .next-shell-header{color:#fff;height:52px;background:#222;border-bottom:1px solid #1f1f1f;box-shadow:0 1px 3px 0 rgba(0,0,0,.12);padding:0 16px}.next-shell-dark .next-shell-header .next-shell-navigation{justify-content:flex-end;height:52px;line-height:52px;margin:0 48px}.next-shell-dark .next-shell-task-header{width:100%;min-height:40px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0;overflow:auto}.next-shell-dark .next-shell-main{background:#f5f5f5}.next-shell-dark .next-shell-main .next-shell-appbar{min-height:48px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 24px}.next-shell-dark .next-shell-main .next-shell-content{padding:20px}.next-shell-dark .next-shell-main .next-shell-footer{background:transparent;min-height:56px;color:#ccc;font-size:14px}.next-shell-dark .next-shell-aside.next-shell-navigation{width:200px;background:#222;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px}.next-shell-dark .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-dark .next-shell-aside.next-shell-tooldock{width:52px;background:#f2f2f2;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside .next-shell-tooldockitem{padding:8px 0;color:#666;background:transparent}.next-shell-dark .next-shell-aside .next-shell-tooldockitem:hover{color:#333;background:#f5f5f5}.next-shell-dark .next-shell-aside .next-shell-localnavigation{width:168px;background:#f2f2f2;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-dark .next-shell-aside .next-shell-ancillary{width:168px;background:#fff;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-dark .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-brand .next-shell-header .dock-trigger,.next-shell-brand .next-shell-header .nav-trigger{background:#18263c}.next-shell-brand .next-shell-aside .local-nav-trigger{background:#f2f2f2}.next-shell-brand .next-shell-aside .ancillary-trigger{background:#fff}.next-shell-brand .next-shell-header{color:#fff;height:52px;background:#18263c;border-bottom:1px solid #eee;box-shadow:0 1px 3px 0 rgba(0,0,0,.12);padding:0 16px}.next-shell-brand .next-shell-header .next-shell-navigation{justify-content:flex-end;height:52px;line-height:52px;margin:0 48px}.next-shell-brand .next-shell-task-header{width:100%;min-height:40px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0;overflow:auto}.next-shell-brand .next-shell-main{background:#f5f5f5}.next-shell-brand .next-shell-main .next-shell-appbar{min-height:48px;background:#fff;border-bottom:1px solid #eee;box-shadow:none;padding:0 24px}.next-shell-brand .next-shell-main .next-shell-content{padding:20px}.next-shell-brand .next-shell-main .next-shell-footer{background:transparent;min-height:56px;color:#ccc;font-size:14px}.next-shell-brand .next-shell-aside.next-shell-navigation{width:200px;background:#fff;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside.next-shell-navigation.next-shell-collapse.next-shell-mini{width:60px}.next-shell-brand .next-shell-aside.next-shell-navigation.next-shell-collapse{width:0}.next-shell-brand .next-shell-aside.next-shell-tooldock{width:52px;background:#f2f2f2;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside .next-shell-tooldockitem{padding:8px 0;color:#666;background:transparent}.next-shell-brand .next-shell-aside .next-shell-tooldockitem:hover{color:#333;background:#f5f5f5}.next-shell-brand .next-shell-aside .next-shell-localnavigation{width:168px;background:#f2f2f2;border-right:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside .next-shell-localnavigation.next-shell-collapse{width:0}.next-shell-brand .next-shell-aside .next-shell-ancillary{width:168px;background:#fff;border-left:1px solid #eee;box-shadow:none;padding:8px 0}.next-shell-brand .next-shell-aside .next-shell-ancillary.next-shell-collapse{width:0}.next-shell-header .next-shell-navigation.next-shell-nav-left{justify-content:flex-start}.next-shell-header .next-shell-navigation.next-shell-nav-right{justify-content:flex-end}.next-shell-header .next-shell-navigation.next-shell-nav-center{justify-content:center}.next-shell.next-shell-phone .next-aside-navigation{width:100%}.next-shell.next-shell-phone .next-aside-navigation.next-shell-collapse{width:0}.next-shell.next-shell-phone .next-shell-header .next-shell-navigation{display:none}.next-shell.next-shell-phone .next-shell-navigation{width:100%;height:100%;transition:height .2s ease}.next-shell.next-shell-phone .next-shell-navigation.next-shell-collapse{padding:0;height:0;transition:height .2s ease}.next-shell.next-shell-phone .next-shell-tooldock{height:52px;left:0;right:0;position:absolute;width:100%;flex-direction:row;justify-content:center}.next-shell.next-shell-phone .next-shell-tooldock.next-shell-collapse{display:none;height:0;padding:0;transition:all .2s ease}.next-shell.next-shell-phone .next-shell-aside.next-aside-ancillary,.next-shell.next-shell-tablet .next-shell-aside.next-aside-ancillary{width:0}.next-shell.next-shell-phone .next-shell-ancillary,.next-shell.next-shell-tablet .next-shell-ancillary{transform:translateX(-100%)}.next-shell.next-shell-phone .next-shell-aside.next-aside-localnavigation,.next-shell.next-shell-tablet .next-shell-aside.next-aside-localnavigation{width:0}.next-notification{width:384px;position:fixed;z-index:1010;padding:0;margin:0}.next-notification .next-message{margin-bottom:16px;overflow:hidden}.next-notification-fade-leave{animation-duration:.3s;animation-play-state:paused;animation-fill-mode:both;animation-timing-function:ease}.next-notification-fade-leave.next-notification-fade-leave-active{animation-name:NotificationFadeOut;animation-play-state:running}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.next-typography{color:#333}.next-typography-title{font-weight:600;margin-bottom:.5em}.next-typography+.next-typography-title{margin-top:1.2em}.next-typography-paragraph{color:#333;margin-bottom:1em;font-size:14px;line-height:1.5}.next-typography mark{padding:0;background:#ffe98f;color:#333}.next-typography strong{font-weight:600}.next-typography code{background-color:#f9f9f9;color:#333;border:1px solid #eee;margin:0 .2em;padding:.2em .4em .1em;font-size:85%;border-radius:3px}.next-typography ol,.next-typography ul{margin:0 0 1em;padding:0}.next-typography li{list-style-type:circle;margin:0 0 0 20px;padding:0 0 0 4px}.next-typography a{text-decoration:none}.next-typography a:link{color:#298dff}.next-typography a:visited{color:#4a83c5}.next-typography a:hover{color:#2580e7}.next-typography a:active{text-decoration:underline;color:#2580e7}h1.next-typography-title{font-size:24px}h2.next-typography-title{font-size:20px}h3.next-typography-title,h4.next-typography-title{font-size:16px}.next-divider,h5.next-typography-title,h6.next-typography-title{font-size:14px}.next-divider{margin:0;padding:0;line-height:1.5;list-style:none;font-variant:tabular-nums;font-feature-settings:"tnum";background:#e6e6e6;border-collapse:separate}.next-divider,.next-divider *,.next-divider :after,.next-divider :before{box-sizing:border-box}.next-divider-hoz{display:block;clear:both;width:100%;min-width:100%;height:1px;margin:16px 0}.next-divider-ver{position:relative;top:-.06em;display:inline-block;width:1px;background:#e6e6e6;height:.9em;margin:0 8px;vertical-align:middle}.next-divider-hoz.next-divider-with-text-center,.next-divider-hoz.next-divider-with-text-left,.next-divider-hoz.next-divider-with-text-right{display:table;margin:16px 0;color:#333;font-weight:400;font-size:16px;white-space:nowrap;text-align:center;background:transparent}.next-divider-hoz.next-divider-with-text-center:after,.next-divider-hoz.next-divider-with-text-center:before,.next-divider-hoz.next-divider-with-text-left:after,.next-divider-hoz.next-divider-with-text-left:before,.next-divider-hoz.next-divider-with-text-right:after,.next-divider-hoz.next-divider-with-text-right:before{top:50%;display:table-cell;width:50%;border-top:1px solid #e6e6e6;transform:translateY(50%);content:""}.next-divider-hoz.next-divider-with-text-center.next-divider-dashed,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed{border-top:0}.next-divider-hoz.next-divider-with-text-center.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-center.next-divider-dashed:before,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-left.next-divider-dashed:before,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed:after,.next-divider-hoz.next-divider-with-text-right.next-divider-dashed:before{border-style:dashed none none}.next-divider-hoz.next-divider-with-text-left .next-divider-inner-text,.next-divider-hoz.next-divider-with-text-right .next-divider-inner-text{display:inline-block;padding:0 16px}.next-divider-hoz.next-divider-with-text-left:before{top:50%;width:5%}.next-divider-hoz.next-divider-with-text-left:after,.next-divider-hoz.next-divider-with-text-right:before{top:50%;width:95%}.next-divider-hoz.next-divider-with-text-right:after{top:50%;width:5%}.next-divider-inner-text{display:inline-block;padding:0 16px}.next-divider-dashed{background:none;border:dashed #e6e6e6;border-width:1px 0 0}.next-divider-dashed.next-divider-ver{border-width:0 0 0 1px}.next-box{display:flex}.next-box,.next-box *,.next-box :after,.next-box :before,.next-table{box-sizing:border-box}.next-table{position:relative;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top:1px solid #e6e6e6;border-left:1px solid #e6e6e6}.next-table *,.next-table :after,.next-table :before{box-sizing:border-box}.next-table .next-table-header tr:first-child th:first-child{border-top-left-radius:0}.next-table .next-table-header tr:first-child th:last-child{border-top-right-radius:0}.next-table .next-table-header tr:last-child th:first-child{border-bottom-left-radius:0}.next-table .next-table-header tr:last-child th:last-child{border-bottom-right-radius:0}.next-table.next-table-layout-fixed{overflow:auto}.next-table.next-table-layout-fixed table{table-layout:fixed}.next-table.next-table-layout-auto table{table-layout:auto}.next-table.next-table-small .next-table-prerow .next-table-cell-wrapper,.next-table.next-table-small td .next-table-cell-wrapper,.next-table.next-table-small th .next-table-cell-wrapper{padding:8px}.next-table table{border-collapse:separate;border-spacing:0;width:100%;background:#fff;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.next-table table tr:first-child td{border-top-width:0}.next-table th{padding:0;background:#f5f5f5;color:#333;text-align:left;font-weight:400;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.next-table th .next-table-cell-wrapper{padding:12px 16px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table th.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table th.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table th.next-table-fix-left,.next-table th.next-table-fix-right{z-index:1}.next-table-affix{z-index:1;overflow:hidden}.next-table-stickylock .next-table-affix{z-index:9}.next-table-header-resizable{position:relative}.next-table-header-resizable .next-table-resize-handler{position:absolute;right:-5px;top:0;bottom:0;width:10px;background:transparent;cursor:ew-resize}.next-table-header-resizable .next-table-resize-handler:after{position:absolute;display:block;content:" ";width:2px;height:100%;right:50%}.next-table-header-resizable .next-table-resize-handler:hover:after{z-index:1;background:#209bfa}.next-table.next-table-lock-left .next-table-header-resizable .next-table-resize-handler,.next-table.next-table-lock-right .next-table-header-resizable .next-table-resize-handler{cursor:auto}.next-table.next-table-lock-left .next-table-header-resizable .next-table-resize-handler:hover:after,.next-table.next-table-lock-right .next-table-header-resizable .next-table-resize-handler:hover:after{z-index:-1}.next-table td{padding:0;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.next-table td .next-table-cell-wrapper{padding:12px 16px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table td .next-table-cell-wrapper .next-table-tree-placeholder{margin-right:8px;outline:0;cursor:pointer}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow .next-icon-remote,.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow:before{content:""}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow .next-icon-remote,.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{width:12px;font-size:12px;line-height:inherit}.next-table td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow:before{content:""}.next-table td.next-table-prerow .next-table-cell-wrapper{padding:12px 16px}.next-table td.next-table-word-break-word .next-table-cell-wrapper{word-break:break-word}.next-table .next-table-expanded .next-table-cell-wrapper,.next-table .next-table-selection .next-table-cell-wrapper{overflow:visible}.next-table.no-header table tr:first-child td{border-top-width:1px}.next-table.only-bottom-border{border-width:0}.next-table.only-bottom-border td,.next-table.only-bottom-border th{border-width:0 0 1px}.next-table.only-bottom-border table tr td:first-child,.next-table.only-bottom-border table tr th:first-child{border-left-width:0}.next-table.only-bottom-border .next-table-body tr td:last-child,.next-table.only-bottom-border .next-table-header tr th:last-child{border-right-width:0}.next-table-loading{display:block}.next-table.zebra tr:nth-child(odd) td{background:#fff}.next-table.zebra tr:nth-child(2n) td{background:#fafafa}.next-table.zebra .next-table-cell.hovered,.next-table.zebra .next-table-row.hovered td{background:#fafafa;color:#333}.next-table.zebra .next-table-row.selected td{background:#f9f9f9;color:#333}.next-table-empty{color:#ccc;padding:32px 0;text-align:center}.next-table-expanded-row>td{border-width:0 0 1px}.next-table-expanded-row>td:first-child{border-left-width:1px}.next-table-expanded-row>td:last-child{border-right-width:1px}.next-table-expanded-row:last-child>td{border-bottom-width:1px}.next-table-expanded-row .next-table{border-top:0;border-left:0}.next-table-expanded-row .next-table td,.next-table-expanded-row .next-table th{border-right:1px solid #e6e6e6}.next-table-expanded-row .next-table.only-bottom-border td,.next-table-expanded-row .next-table.only-bottom-border th{border-right:0}.next-table-expanded-row .next-table .last td{border-bottom:0}.next-table-expanded-row .next-table td.last,.next-table-expanded-row .next-table th:last-child{border-right:0}.next-table-filter-footer{margin:10px 10px 0}.next-table-filter-footer button{margin-right:5px}.next-table-row{transition:all .1s linear;background:#fff;color:#333}.next-table-row.hidden{display:none}.next-table-row.hovered{background:#fafafa;color:#333}.next-table-row.selected{background:#f9f9f9;color:#333}.next-table-cell.hovered{background:#fafafa;color:#333}.next-table-tree-placeholder{visibility:hidden}.next-table-tree-placeholder .next-icon-remote,.next-table-tree-placeholder:before{width:12px;font-size:12px;line-height:inherit}.last .next-table-expanded-row td{border-bottom-width:1px}.next-table-body,.next-table-header{overflow:auto;font-size:14px}.next-table-column-resize-proxy{position:absolute;top:0;bottom:0;width:0;border-left:2px solid #209bfa;z-index:10;display:none}.next-table-header{margin-bottom:-20px;padding-bottom:20px;border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;overflow:-moz-scrollbars-none;-ms-overflow-style:none;scrollbar-width:none}.next-table-header::-webkit-scrollbar{display:none}.next-table-body{font-size:14px;position:relative}.next-table-fixed{border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.next-table-fixed table{table-layout:fixed}.next-table-fixed .next-table-header{background:#f5f5f5}.next-table-fixed table tr td:first-child,.next-table-fixed table tr th:first-child{border-left-width:0}.next-table-fixed .next-table-header th{border-top-width:0}.next-table-fixed .next-table-header tr th:last-child{border-right-width:0}.next-table-fixed .next-table-body td{border-top-width:0}.next-table-fixed .next-table-body tr:last-child td{border-bottom-width:0}.next-table-fixed .next-table-body tr td:last-child{border-right-width:0}.next-table-fixed.only-bottom-border .next-table-body tr:last-child td{border-bottom-width:1px}.next-table-fixed.next-table-group table tr td:first-child,.next-table-fixed.next-table-group table tr th:first-child{border-left-width:1px}.next-table-fixed.next-table-group .next-table-header th{border-top-width:1px}.next-table-fixed.next-table-group .next-table-header tr th:last-child{border-right-width:1px}.next-table-fixed.next-table-group .next-table-body td{border-top-width:1px}.next-table-fixed.next-table-group .next-table-body tr:last-child td{border-bottom-width:1px}.next-table-fixed.next-table-group .next-table-body tr td:last-child,.next-table-fixed.next-table-lock-left .next-table-body tr td:last-child,.next-table-fixed.next-table-lock-left .next-table-header tr th:last-child{border-right-width:1px}.next-table-lock .next-table-body{overflow-x:auto;overflow-y:visible}.next-table-group{border-width:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-header table{border-left:0}.next-table-group.only-bottom-border .next-table-body table,.next-table-group.only-bottom-border .next-table-body table.next-table-row,.next-table-group.only-bottom-border .next-table-header table{border-top:0}.next-table-group.only-bottom-border .next-table-body .next-table-group-footer td{border-bottom:0}.next-table-group .next-table-body{margin-top:8px}.next-table-group .next-table-body table{border-top:1px solid #e6e6e6;border-left:1px solid #e6e6e6;margin-bottom:8px}.next-table-group .next-table-body table tr:first-child td{border-top-width:1px}.next-table-group .next-table-body table:last-of-type{margin-bottom:0}.next-table-group .next-table-header table{border-top:1px solid #e6e6e6;border-left:1px solid #e6e6e6}.next-table-group .next-table-group-header td{background:#f5f5f5;color:#333}.next-table-group .next-table-group-header td:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.next-table-group .next-table-group-header td:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.next-table-group .next-table-group-footer td{background:#f5f5f5;color:#333}.next-table-group .next-table-group-footer td:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.next-table-group .next-table-group-footer td:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.next-table-group .next-table-row.hovered,.next-table-group .next-table-row.selected{background:#fff;color:#333}.next-table-lock{position:relative}.next-table-lock table{table-layout:fixed}.next-table-header-inner{overflow:unset}.next-table-header-fixer{content:" ";border-top-right-radius:0;border-bottom-right-radius:0;width:15px;background:inherit;position:absolute;right:0;height:100%;top:0}.next-table-wrap-empty .next-table-lock-left td,.next-table-wrap-empty .next-table-lock-right td{border:none}.next-table-wrap-empty .next-table-lock-left .next-table-empty,.next-table-wrap-empty .next-table-lock-right .next-table-empty{display:none}.next-table-wrap-empty>.next-table-inner>.next-table-body>table{table-layout:fixed}.next-table-lock-left,.next-table-lock-right{position:absolute;left:0;top:0;z-index:1;border:0;transition:box-shadow .3s ease;overflow:hidden}.next-table-lock-left table,.next-table-lock-right table{width:auto}.next-table-lock-left .next-table-body,.next-table-lock-right .next-table-body{overflow-y:scroll;overflow-x:hidden;margin-right:-20px;padding-right:0}.next-table-lock-left.shadow .next-table-body tr td:last-child,.next-table-lock-left.shadow .next-table-header tr th:last-child,.next-table-lock-right.shadow .next-table-body tr td:last-child,.next-table-lock-right.shadow .next-table-header tr th:last-child{border-right-width:0}.next-table-lock-right{right:0;left:auto}.next-table-lock-right table tr td:first-child,.next-table-lock-right table tr th:first-child{border-left-width:1px}.next-table-lock-right.shadow{box-shadow:-2px 0 3px rgba(0,0,0,.12)}.next-table-lock-left.shadow{box-shadow:2px 0 3px rgba(0,0,0,.12)}.next-table-filter{line-height:1}.next-table-sort{cursor:pointer;position:relative;width:16px;display:inline-block;line-height:1}.next-table-sort:focus{outline:0}.next-table-sort>a:before{content:" ";display:inline-block;vertical-align:middle}.next-table-sort .next-icon{position:absolute;left:-2px;color:#333}.next-table-sort .next-icon .next-icon-remote,.next-table-sort .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-table-sort .current .next-icon{color:#209bfa}.next-table-sort .next-icon-ascending{left:2px}.next-table-filter{cursor:pointer;width:20px;display:inline-block}.next-table-filter:focus{outline:0}.next-table-filter .next-icon{color:#333}.next-table-filter .next-icon .next-icon-remote,.next-table-filter .next-icon:before{width:12px;font-size:12px;line-height:inherit}.next-table-filter .next-table-filter-active{color:#209bfa}.next-table-filter-menu .next-menu-content{max-height:220px;overflow:auto}.next-table-header-icon{margin-left:8px}.next-table-expanded-ctrl{cursor:pointer}.next-table-expanded-ctrl:focus{outline:0}.next-table-expanded-ctrl.disabled{color:#999}.next-table-expanded-ctrl .next-table-expand-unfold .next-icon-remote,.next-table-expanded-ctrl .next-table-expand-unfold:before{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-unfold:before{content:""}.next-table-expanded-ctrl .next-table-expand-fold .next-icon-remote,.next-table-expanded-ctrl .next-table-expand-fold:before{width:12px;font-size:12px;line-height:inherit}.next-table-expanded-ctrl .next-table-expand-fold:before{content:""}.next-table-fix-left,.next-table-fix-right{background:inherit;position:sticky;z-index:1;background-clip:padding-box}.next-table-ping-left .next-table-expanded-area .next-table-fix-left-last:after{content:none}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last,.next-table-ping-left .next-table-fix-left-last{border-right-width:0}.next-table-ping-left .next-table-expanded-area .next-table-ping-left .next-table-fix-left-last:after,.next-table-ping-left .next-table-fix-left-last:after{box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;right:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translateX(100%)}.next-table-ping-right .next-table-expanded-area .next-table-fix-right-first:after{content:none}.next-table-ping-right .next-table-expanded-area .next-table-ping-right .next-table-fix-right-first:after,.next-table-ping-right .next-table-fix-right-first:after{box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;left:0;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translateX(-100%)}.next-table-fixed.next-table-scrolling-to-right:after,.next-table-lock.next-table-scrolling-to-right:after{box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15);position:absolute;top:0;right:-30px;bottom:0;width:30px;content:"";pointer-events:none;transition:box-shadow .3s,-webkit-box-shadow .3s;transform:translateX(-100%)}.next-table-fixed.only-bottom-border,.next-table-lock.only-bottom-border{border-right:0}.next-table[dir=rtl] th{text-align:right}.next-table[dir=rtl] .next-table-header-resizable .next-table-resize-handler{right:auto;left:0}.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-down.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-icon-arrow-right.next-table-tree-arrow,.next-table[dir=rtl] td .next-table-cell-wrapper .next-table-tree-placeholder{margin-left:3px;margin-right:0;float:right}.next-table[dir=rtl] .next-table-expanded-row td:first-child{border-left-width:0;border-right-width:1px}.next-table[dir=rtl] .next-table-expanded-row td:last-child{border-left-width:1px;border-right-width:0}.next-table[dir=rtl].only-bottom-border .next-table-expanded-row td,.next-table[dir=rtl].only-bottom-border .next-table-expanded-row th{border-width:0 0 1px}.next-table[dir=rtl] .next-table-filter-footer button{margin-left:5px;margin-right:0}.next-table[dir=rtl] .next-table-lock-left,.next-table[dir=rtl] .next-table-lock-right{left:auto;right:0}.next-table[dir=rtl] .next-table-lock-right{right:auto;left:0}.next-table[dir=rtl] .next-table-lock-right table tr td:first-child,.next-table[dir=rtl] .next-table-lock-right table tr th:first-child{border-right-width:1px}.next-table[dir=rtl] .next-table-lock-right.shadow{box-shadow:2px 0 3px rgba(0,0,0,.12)}.next-table[dir=rtl] .next-table-lock-left.shadow{box-shadow:-2px 0 3px rgba(0,0,0,.12)}.next-table[dir=rtl] .next-table-sort .next-icon{right:0;left:auto}.next-table[dir=rtl] .next-table-sort .next-icon-ascending{right:4px;left:auto}.next-table[dir=rtl] .next-table-filter{margin-right:5px;margin-left:0}.next-table-fixed[dir=rtl] table tr td:first-child,.next-table-fixed[dir=rtl] table tr th:first-child{border-left-width:1px;border-right-width:0}.next-table-fixed[dir=rtl] .next-table-body tr td:last-child,.next-table-fixed[dir=rtl] .next-table-header tr th:last-child{border-left-width:1px}.next-calendar2,.next-calendar2 *,.next-calendar2 :after,.next-calendar2 :before{box-sizing:border-box}.next-calendar2 table{border-collapse:collapse;border-spacing:0}.next-calendar2 td,.next-calendar2 th{padding:0}div[dir=rtl].next-calendar2-card .next-calendar2-header-actions,div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-actions,div[dir=rtl].next-calendar2-panel .next-calendar2-header-actions{margin-right:auto;margin-left:0}div[dir=rtl].next-calendar2-card .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-card .next-calendar2-header-ranges>:not(:first-child),div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-fullscreen .next-calendar2-header-ranges>:not(:first-child),div[dir=rtl].next-calendar2-panel .next-calendar2-header-actions>:not(:first-child),div[dir=rtl].next-calendar2-panel .next-calendar2-header-ranges>:not(:first-child){margin-right:8px;margin-left:0}div[dir=rtl].next-calendar2-fullscreen .next-calendar2-cell-value,div[dir=rtl].next-calendar2-fullscreen .next-calendar2-table th{text-align:left}div[dir=rtl].next-calendar2-fullscreen .next-calendar2-table th{padding:0 0 5px 12px}.next-calendar2{font-size:12px;user-select:none;background:#fff}.next-calendar2-header{display:flex}.next-calendar2-table{width:100%;table-layout:fixed}.next-calendar2-cell{cursor:pointer;position:relative;transition:background-color .2s,border .2s}.next-calendar2 .next-calendar2-cell-inner{color:#ccc;outline:none;min-width:24px;position:relative;border:1px solid transparent}.next-calendar2-cell-disabled:before{color:#ccc;background:#fafafa}.next-calendar2-card .next-calendar2-header-actions,.next-calendar2-fullscreen .next-calendar2-header-actions,.next-calendar2-panel .next-calendar2-header-actions{margin-left:auto}.next-calendar2-card .next-calendar2-header-actions>:not(:first-child),.next-calendar2-card .next-calendar2-header-ranges>:not(:first-child),.next-calendar2-fullscreen .next-calendar2-header-actions>:not(:first-child),.next-calendar2-fullscreen .next-calendar2-header-ranges>:not(:first-child),.next-calendar2-panel .next-calendar2-header-actions>:not(:first-child),.next-calendar2-panel .next-calendar2-header-ranges>:not(:first-child){margin-left:8px}.next-calendar2-card .next-calendar2-header-select-month,.next-calendar2-card .next-calendar2-header-select-year,.next-calendar2-fullscreen .next-calendar2-header-select-month,.next-calendar2-fullscreen .next-calendar2-header-select-year,.next-calendar2-panel .next-calendar2-header-select-month,.next-calendar2-panel .next-calendar2-header-select-year{min-width:88px}.next-calendar2-card .next-calendar2-header-select-month .next-input,.next-calendar2-card .next-calendar2-header-select-year .next-input,.next-calendar2-fullscreen .next-calendar2-header-select-month .next-input,.next-calendar2-fullscreen .next-calendar2-header-select-year .next-input,.next-calendar2-panel .next-calendar2-header-select-month .next-input,.next-calendar2-panel .next-calendar2-header-select-year .next-input{min-width:auto}.next-calendar2-card .next-calendar2-body,.next-calendar2-fullscreen .next-calendar2-body,.next-calendar2-panel .next-calendar2-body{padding:8px 0}.next-calendar2-card .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-inner{z-index:2;height:24px;line-height:22px;border-radius:2px;display:inline-block}.next-calendar2-card .next-calendar2,.next-calendar2-panel .next-calendar2{min-height:150px}.next-calendar2-card .next-calendar2-table thead>tr,.next-calendar2-panel .next-calendar2-table thead>tr{height:24px;color:#999}.next-calendar2-card .next-calendar2-table td,.next-calendar2-card .next-calendar2-table th,.next-calendar2-panel .next-calendar2-table td,.next-calendar2-panel .next-calendar2-table th{font-weight:400;text-align:center;padding:4px 0}.next-calendar2-card .next-calendar2-table th,.next-calendar2-panel .next-calendar2-table th{height:32px}.next-calendar2-card .next-calendar2-table-decade,.next-calendar2-card .next-calendar2-table-month,.next-calendar2-card .next-calendar2-table-year,.next-calendar2-panel .next-calendar2-table-decade,.next-calendar2-panel .next-calendar2-table-month,.next-calendar2-panel .next-calendar2-table-year{height:145px}.next-calendar2-card .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-card .next-calendar2-table-month .next-calendar2-cell-inner,.next-calendar2-card .next-calendar2-table-year .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-month .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-year .next-calendar2-cell-inner{min-width:56px}.next-calendar2-card .next-calendar2-table-quarter,.next-calendar2-panel .next-calendar2-table-quarter{height:50px}.next-calendar2-card .next-calendar2-table-quarter .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-quarter .next-calendar2-cell-inner{min-width:56px}.next-calendar2-card .next-calendar2-table-decade .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-table-decade .next-calendar2-cell-inner{min-width:80px}.next-calendar2-card .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner{color:#666}.next-calendar2-card .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover:not(.next-calendar2-cell-hover) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover:not(.next-calendar2-cell-hover) .next-calendar2-cell-inner{background:#f9f9f9}.next-calendar2-card .next-calendar2-cell-current.next-calendar2-cell-today:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current.next-calendar2-cell-today:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{color:#209bfa}.next-calendar2-card .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-panel .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{color:#fff;background:#209bfa}.next-calendar2-fullscreen .next-calendar2-cell-value,.next-calendar2-fullscreen .next-calendar2-table th{text-align:right}.next-calendar2-fullscreen .next-calendar2-table th{padding:0 12px 5px 0}.next-calendar2-fullscreen .next-calendar2-cell-inner{height:80px;border-top:2px solid #eee;margin:0 4px;padding:4px 8px 0}.next-calendar2-fullscreen td .next-calendar2-cell-inner{height:80px;border-top:2px solid #eee}.next-calendar2-fullscreen .next-calendar2-cell-disabled .next-calendar2-cell-inner{color:#ccc;background:#fafafa}.next-calendar2-fullscreen .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today) .next-calendar2-cell-inner{color:#666}.next-calendar2-fullscreen .next-calendar2-cell-current:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):not(.next-calendar2-cell-today):hover .next-calendar2-cell-inner{background-color:#f9f9f9}.next-calendar2-fullscreen .next-calendar2-cell-current.next-calendar2-cell-today .next-calendar2-cell-inner{color:#209bfa}.next-calendar2-fullscreen .next-calendar2-cell-current .next-calendar2-cell-inner{background-color:#fff}.next-calendar2-fullscreen .next-calendar2-cell-current.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner{border-top-color:#209bfa;font-weight:700;color:#209bfa;background:#add9ff}.next-calendar2-card .next-calendar2-header{padding:8px;border-bottom:1px solid #eee}.next-calendar2-panel .next-calendar2-header{padding:0 8px;display:flex;align-items:center;border-bottom:1px solid #eee}.next-calendar2-panel .next-calendar2-header-btn{min-width:20px;line-height:20px;color:#666;font-family:inherit;vertical-align:initial;border-radius:2px}.next-calendar2-panel .next-calendar2-header-btn>span,.next-calendar2-panel .next-calendar2-header-text-field{text-align:center;font-size:14px;color:#333;font-weight:bolder;vertical-align:initial}.next-calendar2-panel .next-calendar2-header-btn:hover,.next-calendar2-panel .next-calendar2-header-btn:hover>span{color:#209bfa}.next-calendar2-panel .next-calendar2-header-left-btn:hover,.next-calendar2-panel .next-calendar2-header-right-btn:hover{background:#f9f9f9}.next-calendar2-panel .next-calendar2-header-text-field{flex:1;height:38px;line-height:38px}.next-calendar2-panel .next-calendar2-header-text-field .next-calendar2-header-btn:not(:first-child){margin-left:6px}.next-calendar2-header-select-month-popup,.next-calendar2-header-select-year-popup{min-width:auto}.next-time-picker2-menu{float:left;text-align:center;padding:8px 0}.next-time-picker2-menu:not(:last-child){border-right:1px solid #e6e6e6}.next-time-picker2-menu-title{cursor:default;height:28px;line-height:28px;font-size:12px;font-weight:400;color:#999;background:#fff}.next-time-picker2-menu ul{position:relative;overflow-y:hidden;overflow-x:auto;list-style:none;margin:0;width:54px;padding:0;font-size:12px;height:224px;scrollbar-width:none;-ms-overflow-style:none}.next-time-picker2-menu ul::-webkit-scrollbar{width:0}.next-time-picker2-menu ul:hover{overflow-y:auto}.next-time-picker2-menu ul:after{display:block;height:192px;content:""}.next-time-picker2-menu-item{cursor:pointer;height:32px;line-height:32px;transition:background .1s linear;color:#666;background:#fff;outline:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.next-time-picker2-menu-item:hover{color:#333;background:#f9f9f9}.next-time-picker2-menu-item.next-selected{color:#666;background:#add9ff}.next-time-picker2-menu-item.next-disabled{cursor:not-allowed;color:#ccc;background:#fafafa}.next-time-picker2-panel{box-sizing:border-box;display:flex}.next-time-picker2-panel *,.next-time-picker2-panel :after,.next-time-picker2-panel :before{box-sizing:border-box}.next-time-picker2-panel:after{visibility:hidden;display:block;height:0;font-size:0;content:" ";clear:both}.next-time-picker2-panel-header{border-bottom:1px solid #e6e6e6}.next-time-picker2-panel-input.next-input{width:100%;padding:6px;border-color:transparent;vertical-align:middle}.next-time-picker2-panel .next-time-picker2-menu{flex:1}.next-time-picker2-panel-range .next-time-picker2-panel-list:last-of-type{margin-left:20px}.next-time-picker2-footer{width:min-content;min-width:100%;box-sizing:border-box;text-align:center;border-top:1px solid #f0f0f0;padding:4px 12px;display:flex;min-height:40px;align-items:center;flex-wrap:wrap}.next-time-picker2-footer-actions{margin-left:auto}.next-time-picker2-wrapper[dir=rtl] .next-time-picker2-menu{float:right}.next-time-picker2-wrapper[dir=rtl] .next-time-picker2-menu:not(:last-child){border-right:none;border-left:1px solid #e6e6e6}.next-time-picker2{display:inline-block}.next-time-picker2,.next-time-picker2 *,.next-time-picker2 :after,.next-time-picker2 :before{box-sizing:border-box}.next-time-picker2-trigger .next-input{width:100%}.next-time-picker2-wrapper{padding:4px 0}.next-time-picker2-body{display:block;overflow:hidden;border:1px solid #e6e6e6;border-radius:3px;background:#fff;box-shadow:none}.next-time-picker2-symbol-clock-icon:before{content:""}.next-time-picker2-input{display:inline-flex;align-items:center;outline:none;box-sizing:border-box;border:1px solid #ddd;vertical-align:middle;width:inherit}.next-time-picker2-input .next-input{border:none;width:100%;height:100%}.next-time-picker2-input .next-input input{height:100%}.next-time-picker2-input.next-time-picker2-input-small{height:24px;border-radius:3px}.next-time-picker2-input.next-time-picker2-input-small .next-input-label{padding-left:8px;font-size:12px}.next-time-picker2-input.next-time-picker2-input-small .next-input-inner{font-size:12px}.next-time-picker2-input.next-time-picker2-input-small .next-input-control,.next-time-picker2-input.next-time-picker2-input-small .next-input-inner-text{padding-right:4px}.next-time-picker2-input.next-time-picker2-input-small input{height:22px;line-height:22px \0 ;padding:0 4px;font-size:12px}.next-time-picker2-input.next-time-picker2-input-small input::placeholder{font-size:12px}.next-time-picker2-input.next-time-picker2-input-small .next-input-text-field{padding:0 4px;font-size:12px;height:22px;line-height:22px}.next-time-picker2-input.next-time-picker2-input-small .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-small .next-input-control{border-radius:0 3px 3px 0}.next-time-picker2-input.next-time-picker2-input-medium{height:32px;border-radius:3px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-label{padding-left:8px;font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-inner{font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-control,.next-time-picker2-input.next-time-picker2-input-medium .next-input-inner-text{padding-right:8px}.next-time-picker2-input.next-time-picker2-input-medium input{height:30px;line-height:30px \0 ;padding:0 8px;font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium input::placeholder{font-size:14px}.next-time-picker2-input.next-time-picker2-input-medium .next-input-text-field{padding:0 8px;font-size:14px;height:30px;line-height:30px}.next-time-picker2-input.next-time-picker2-input-medium .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-medium .next-input-control{border-radius:0 3px 3px 0}.next-time-picker2-input.next-time-picker2-input-large{height:40px;border-radius:3px}.next-time-picker2-input.next-time-picker2-input-large .next-input-label{padding-left:12px;font-size:16px}.next-time-picker2-input.next-time-picker2-input-large .next-input-inner{font-size:16px}.next-time-picker2-input.next-time-picker2-input-large .next-input-control,.next-time-picker2-input.next-time-picker2-input-large .next-input-inner-text{padding-right:8px}.next-time-picker2-input.next-time-picker2-input-large input{height:38px;line-height:38px \0 ;padding:0 12px;font-size:16px}.next-time-picker2-input.next-time-picker2-input-large input::placeholder{font-size:16px}.next-time-picker2-input.next-time-picker2-input-large .next-input-text-field{padding:0 12px;font-size:16px;height:38px;line-height:38px}.next-time-picker2-input.next-time-picker2-input-large .next-icon .next-icon-remote,.next-time-picker2-input.next-time-picker2-input-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-time-picker2-input.next-time-picker2-input-large .next-input-control{border-radius:0 3px 3px 0}.next-time-picker2-input:hover{border-color:#ccc;background-color:#fff}.next-time-picker2-input.next-time-picker2-input-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-time-picker2-input.next-time-picker2-input-noborder{border-color:transparent!important;box-shadow:none!important}.next-time-picker2-input.next-time-picker2-input-disabled{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-time-picker2-input.next-time-picker2-input-disabled:hover{border-color:#eee;background-color:#fafafa}.next-time-picker2-input-separator{color:#ddd;font-size:12px;display:inline-block;min-width:16px;text-align:center}.next-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;top:0;margin:-1px}.next-date-picker2-footer{width:min-content;min-width:100%;box-sizing:border-box;text-align:center;border-top:1px solid #eee;padding:4px 12px;display:flex;min-height:40px;align-items:center;flex-wrap:wrap;position:relative}.next-date-picker2-footer-preset>.next-btn{margin-right:8px}.next-date-picker2-footer-actions{margin-left:auto}.next-date-picker2-footer-preset-only{width:100%}div[dir=rtl] .next-date-picker2-footer-preset>.next-btn{margin-left:8px;margin-right:0}div[dir=rtl] .next-date-picker2-footer-actions{margin-left:0;margin-right:auto}div[dir=rtl] .next-date-picker2-wrapper .next-calendar2-cell:last-child:before{border-top-right-radius:0;border-bottom-right-radius:0;right:0;border-top-left-radius:2px;border-bottom-left-radius:2px;left:8px}div[dir=rtl] .next-date-picker2-wrapper .next-calendar2-cell:first-child:before{border-top-left-radius:0;border-bottom-left-radius:0;left:0;border-top-right-radius:2px;border-bottom-right-radius:2px;right:8px}div[dir=rtl] .next-date-time-picker-wrapper{border-right:1px solid #eee;border-left:node}div[dir=rtl] .next-date-time-picker-wrapper .next-time-picker2-menu:not(:last-child){border-left:1px solid #dcdee3;border-right:none}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-selected.next-calendar2-cell-range-begin:before{right:50%;left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-selected.next-calendar2-cell-range-end:before{left:50%;right:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-begin:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-child:after{right:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-begin:not(:last-child):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-child:not(.next-calendar2-cell-hover-end):after{left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-end:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-child:after{left:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-hover-end:not(:first-child):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-child:not(.next-calendar2-cell-hover-begin):after{right:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-begin:after{left:0;right:7px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-end:after{right:0;left:7px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:first-of-type:after{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none;border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:last-of-type:after{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none;border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end:after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end:before{right:0;left:8px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-edge-end.next-calendar2-cell-hover:after{border-top-right-radius:0;border-bottom-right-radius:0;border-right:none;border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover-begin:after{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0;border-right:1px dashed #1274e7;border-top-right-radius:2px;border-bottom-right-radius:2px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover-end:after{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-left:1px dashed #1274e7;border-top-left-radius:2px;border-bottom-left-radius:2px}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):after,div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):before{right:8px;left:0}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:after{right:8px;border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}div[dir=rtl] .next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:not(.next-calendar2-cell-hover-end):not(.next-calendar2-cell-hover-begin):after{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none}div[dir=rtl] .next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2):before{right:50%;left:0}div[dir=rtl] .next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child:before{left:50%;right:0}.next-date-picker2{outline:none;display:inline-table;position:relative;width:inherit}.next-date-picker2-overlay{vertical-align:top;padding:4px 0}.next-date-picker2-overlay-range{padding:12px 0}.next-date-picker2-wrapper{box-shadow:0 4px 16px 0 rgba(0,0,0,.12);background-color:#fff;border:1px solid #eee;border-radius:3px}.next-date-picker2-wrapper .next-calendar2-panel{border-radius:3px}.next-date-picker2-wrapper .next-calendar2-body{width:272px}.next-date-picker2-wrapper .next-calendar2-cell:before{content:"";position:absolute;top:50%;right:0;left:0;z-index:1;height:24px;transform:translateY(-50%)}.next-date-picker2-wrapper .next-calendar2-cell:last-child:before{border-top-right-radius:2px;border-bottom-right-radius:2px;right:8px}.next-date-picker2-wrapper .next-calendar2-cell:first-child:before{border-top-left-radius:2px;border-bottom-left-radius:2px;left:8px}.next-date-picker2-input{display:inline-flex;align-items:center;outline:none;box-sizing:border-box;border:1px solid #ddd;vertical-align:middle;width:inherit;background-color:#fff}.next-date-picker2-input .next-input{border:none;flex-basis:100%;height:100%;width:100%}.next-date-picker2-input .next-input input{height:100%;width:auto}.next-date-picker2-input.next-date-picker2-input-small{height:24px;border-radius:3px}.next-date-picker2-input.next-date-picker2-input-small .next-input-label{padding-left:8px;font-size:12px}.next-date-picker2-input.next-date-picker2-input-small .next-input-inner{font-size:12px}.next-date-picker2-input.next-date-picker2-input-small .next-input-control,.next-date-picker2-input.next-date-picker2-input-small .next-input-inner-text{padding-right:4px}.next-date-picker2-input.next-date-picker2-input-small input{height:22px;line-height:22px \0 ;padding:0 4px;font-size:12px}.next-date-picker2-input.next-date-picker2-input-small input::placeholder{font-size:12px}.next-date-picker2-input.next-date-picker2-input-small .next-input-text-field{padding:0 4px;font-size:12px;height:22px;line-height:22px}.next-date-picker2-input.next-date-picker2-input-small .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-small .next-icon:before{width:16px;font-size:16px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-small .next-input-control{border-radius:0 3px 3px 0}.next-date-picker2-input.next-date-picker2-input-medium{height:32px;border-radius:3px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-label{padding-left:8px;font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-inner{font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-control,.next-date-picker2-input.next-date-picker2-input-medium .next-input-inner-text{padding-right:8px}.next-date-picker2-input.next-date-picker2-input-medium input{height:30px;line-height:30px \0 ;padding:0 8px;font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium input::placeholder{font-size:14px}.next-date-picker2-input.next-date-picker2-input-medium .next-input-text-field{padding:0 8px;font-size:14px;height:30px;line-height:30px}.next-date-picker2-input.next-date-picker2-input-medium .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-medium .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-medium .next-input-control{border-radius:0 3px 3px 0}.next-date-picker2-input.next-date-picker2-input-large{height:40px;border-radius:3px}.next-date-picker2-input.next-date-picker2-input-large .next-input-label{padding-left:12px;font-size:16px}.next-date-picker2-input.next-date-picker2-input-large .next-input-inner{font-size:16px}.next-date-picker2-input.next-date-picker2-input-large .next-input-control,.next-date-picker2-input.next-date-picker2-input-large .next-input-inner-text{padding-right:8px}.next-date-picker2-input.next-date-picker2-input-large input{height:38px;line-height:38px \0 ;padding:0 12px;font-size:16px}.next-date-picker2-input.next-date-picker2-input-large input::placeholder{font-size:16px}.next-date-picker2-input.next-date-picker2-input-large .next-input-text-field{padding:0 12px;font-size:16px;height:38px;line-height:38px}.next-date-picker2-input.next-date-picker2-input-large .next-icon .next-icon-remote,.next-date-picker2-input.next-date-picker2-input-large .next-icon:before{width:20px;font-size:20px;line-height:inherit}.next-date-picker2-input.next-date-picker2-input-large .next-input-control{border-radius:0 3px 3px 0}.next-date-picker2-input:hover{border-color:#ccc;background-color:#fff}.next-date-picker2-input.next-date-picker2-input-focus{border-color:#209bfa;background-color:#fff;box-shadow:0 0 0 2px rgba(32,155,250,.2)}.next-date-picker2-input.next-date-picker2-input-noborder{border-color:transparent!important;box-shadow:none!important}.next-date-picker2-input.next-date-picker2-input-disabled{color:#ccc;border-color:#eee;background-color:#fafafa;cursor:not-allowed}.next-date-picker2-input.next-date-picker2-input-disabled:hover{border-color:#eee;background-color:#fafafa}.next-date-picker2-input-separator{color:#ddd;font-size:12px;line-height:12px;display:inline-block;min-width:16px;text-align:center}.next-date-picker2-panel,.next-range-picker2-panel{display:inline-flex}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-range-picker-left .next-calendar2-header-right-btn,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-range-picker-right .next-calendar2-header-left-btn{visibility:hidden}.next-range-picker2-arrow{display:block;transform:translateY(-50%) rotate(-45deg);position:absolute;z-index:1;width:10px;height:10px;margin-left:16.5px;border-color:#eee #eee transparent transparent;border-style:solid;border-width:1px;transition:left .3s ease-out;background:#fff}.next-date-picker2-tl-bl .next-range-picker2-arrow{top:12.5px}.next-date-picker2-bl-tl .next-range-picker2-arrow{bottom:13px;transform:translateY(50%) rotate(135deg)}.next-date-time-picker-wrapper{border-left:1px solid #eee}.next-date-time-picker-wrapper .next-calendar2-body{padding-right:0;padding-left:0}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-disabled .next-calendar2-cell-inner{color:#ccc;background:#fafafa}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected:before{color:#666;background:#add9ff}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected .next-calendar2-cell-inner{color:#666;background:transparent}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin .next-calendar2-cell-inner,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end .next-calendar2-cell-inner{z-index:10;color:#fff;background:#209bfa}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin:before{left:50%}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end:before{right:50%}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-begin-single:before,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-selected.next-calendar2-cell-range-end-single:before{display:none}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:after{content:"";position:absolute;top:50%;right:0;left:0;z-index:2;height:24px;transform:translateY(-50%);border-color:#1274e7 transparent;border-style:dashed;border-width:1px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-hover-begin:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:first-child:after{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-hover-end:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:last-child:after{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-begin:after{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover.next-calendar2-cell-selected.next-calendar2-cell-hover-end:after{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:first-of-type:after{border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover:last-of-type:after{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end:after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end:before{right:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-edge-end.next-calendar2-cell-hover:after{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:1px dashed #1274e7}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover-begin:after{border-top:1px dashed #1274e7;border-left:1px dashed #1274e7;border-top-left-radius:2px;border-bottom-left-radius:2px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-current.next-calendar2-cell-hover-end:after{border-top:1px dashed #1274e7;border-right:1px dashed #1274e7;border-top-right-radius:2px;border-bottom-right-radius:2px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):after,.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled):before{left:8px}.next-range-picker2-panel:not(.next-range-picker2-panel-single) .next-calendar2-cell-edge-end+.next-calendar2-cell-current:not(.next-calendar2-cell-disabled).next-calendar2-cell-hover:after{border-top-left-radius:2px;border-bottom-left-radius:2px;border-left:1px dashed #1274e7}.next-calendar2-table-week .next-calendar2-cell-hover:after{display:none}.next-calendar2-table-week tr:hover .next-calendar2-cell:not(.next-calendar2-cell-disabled):not(.next-calendar2-cell-selected):before{background:#f9f9f9}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected .next-calendar2-cell-inner,.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:before{color:#666;background-color:#add9ff}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child .next-calendar2-cell-inner,.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2) .next-calendar2-cell-inner{color:#fff;background:#209bfa}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:nth-child(2):before{left:50%}.next-calendar2-table-week .next-calendar2-week-current .next-calendar2-cell.next-calendar2-cell-selected:last-child:before{right:50%}.next-calendar2-table-week tr:not(.next-calendar2-week-current) td.next-calendar2-cell.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled) .next-calendar2-cell-inner,.next-calendar2-table-week tr:not(.next-calendar2-week-current) td.next-calendar2-cell.next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):before{background-color:transparent;color:#ccc}.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled):nth-child(2) .next-calendar2-cell-inner{background-color:#add9ff;color:#666}.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-begin:last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-begin:nth-child(2) .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-end:last-child .next-calendar2-cell-inner,.next-range-picker2-panel .next-calendar2-week-current .next-calendar2-cell-selected:not(.next-calendar2-cell-disabled).next-calendar2-cell-week-range-end:nth-child(2) .next-calendar2-cell-inner{color:#fff;background:#209bfa}.next-icon-alibaba:before{content:""}.next-icon-ic_dashboard:before{content:""}.next-icon-ic_form:before{content:""}.next-icon-ic_formbeifen:before{content:""}.next-icon-ic_language:before{content:""}.next-icon-ic_logo:before{content:""}.next-icon-ic_tongzhi:before{content:""}.next-icon-ic_yusuanguanli:before{content:""}.next-icon-taobao:before{content:""} \ No newline at end of file diff --git a/pig-register/src/main/resources/static/index.html b/pig-register/src/main/resources/static/index.html index eb29b923..360e9536 100644 --- a/pig-register/src/main/resources/static/index.html +++ b/pig-register/src/main/resources/static/index.html @@ -35,7 +35,7 @@ - +
@@ -56,6 +56,6 @@ - + diff --git a/pig-register/src/main/resources/static/js/main.js b/pig-register/src/main/resources/static/js/main.js index c3252ad0..86b6cd67 100644 --- a/pig-register/src/main/resources/static/js/main.js +++ b/pig-register/src/main/resources/static/js/main.js @@ -1,22 +1,22 @@ -!function(n){var a={};function r(e){if(a[e])return a[e].exports;var t=a[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}r.m=n,r.c=a,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)r.d(n,a,function(e){return t[e]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=443)}([function(e,t,n){"use strict";e.exports=n(450)},function(e,t,n){"use strict";n.d(t,"a",function(){return E}),n.d(t,"c",function(){return x}),n.d(t,"b",function(){return C});n(51);var t=n(25),u=n.n(t),s=n(72),r=n(89),d=n(61),c=n(31),t=n(106),f=n.n(t),t=n(65),p=n.n(t);function h(){var e=window.location.href,e=(localStorage.removeItem("token"),e.split("#")[0]);console.log("base_url",e),window.location="".concat(e,"#/login")}var l,m,a,o,i,g,y,v,_,b,w,M,n=window,k=(l={},{once:function(e,t){this.listen.call(this,e,t,!0)},listen:function(e,t){var n=2>>0,a;for(a=0;a0)for(n=0;n=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+a}var ie=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,le=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,se={},ue={};function a(e,t,n,a){var r=a;if(typeof a==="string")r=function(){return this[a]()};if(e)ue[e]=r;if(t)ue[t[0]]=function(){return o(r.apply(this,arguments),t[1],t[2])};if(n)ue[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),e)}}function de(e){if(e.match(/\[[\s\S]/))return e.replace(/^\[|\]$/g,"");return e.replace(/\\/g,"")}function ce(a){var r=a.match(ie),e,o;for(e=0,o=r.length;e=0&&le.test(e)){e=e.replace(le,a);le.lastIndex=0;n-=1}return e}var he={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function me(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];if(t||!n)return t;this._longDateFormat[e]=n.match(ie).map(function(e){if(e==="MMMM"||e==="MM"||e==="DD"||e==="dddd")return e.slice(1);return e}).join("");return this._longDateFormat[e]}var ge="Invalid date";function ye(){return this._invalidDate}var ve="%d",_e=/\d{1,2}/;function be(e){return this._ordinal.replace("%d",e)}var we={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function Me(e,t,n,a){var r=this._relativeTime[n];return h(r)?r(e,t,n,a):r.replace(/%d/i,e)}function ke(e,t){var n=this._relativeTime[e>0?"future":"past"];return h(n)?n(t):n.replace(/%s/i,t)}var Se={};function t(e,t){var n=e.toLowerCase();Se[n]=Se[n+"s"]=Se[t]=e}function m(e){return typeof e==="string"?Se[e]||Se[e.toLowerCase()]:undefined}function Ee(e){var t={},n,a;for(a in e)if(s(e,a)){n=m(a);if(n)t[n]=e[a]}return t}var xe={};function n(e,t){xe[e]=t}function Ce(e){var t=[],n;for(n in e)if(s(e,n))t.push({unit:n,priority:xe[n]});t.sort(function(e,t){return e.priority-t.priority});return t}function Le(e){return e%4===0&&e%100!==0||e%400===0}function g(e){if(e<0)return Math.ceil(e)||0;else return Math.floor(e)}function y(e){var t=+e,n=0;if(t!==0&&isFinite(t))n=g(t);return n}function Te(t,n){return function(e){if(e!=null){Oe(this,t,e);c.updateOffset(this,n);return this}else return De(this,t)}}function De(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Oe(e,t,n){if(e.isValid()&&!isNaN(n))if(t==="FullYear"&&Le(e.year())&&e.month()===1&&e.date()===29){n=y(n);e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),ot(n,e.month()))}else e._d["set"+(e._isUTC?"UTC":"")+t](n)}function Ne(e){e=m(e);if(h(this[e]))return this[e]();return this}function Pe(e,t){if(typeof e==="object"){e=Ee(e);var n=Ce(e),a,r=n.length;for(a=0;a68?1900:2e3)};var Mt=Te("FullYear",true);function kt(){return Le(this.year())}function St(e,t,n,a,r,o,i){var l;if(e<100&&e>=0){l=new Date(e+400,t,n,a,r,o,i);if(isFinite(l.getFullYear()))l.setFullYear(e)}else l=new Date(e,t,n,a,r,o,i);return l}function Et(e){var t,n;if(e<100&&e>=0){n=Array.prototype.slice.call(arguments);n[0]=e+400;t=new Date(Date.UTC.apply(null,n));if(isFinite(t.getUTCFullYear()))t.setUTCFullYear(e)}else t=new Date(Date.UTC.apply(null,arguments));return t}function xt(e,t,n){var a=7+t-n,r=(7+Et(e,0,a).getUTCDay()-t)%7;return-r+a-1}function Ct(e,t,n,a,r){var o=(7+n-a)%7,i=xt(e,a,r),l=1+7*(t-1)+o+i,s,u;if(l<=0){s=e-1;u=wt(s)+l}else if(l>wt(e)){s=e+1;u=l-wt(e)}else{s=e;u=l}return{year:s,dayOfYear:u}}function Lt(e,t,n){var a=xt(e.year(),t,n),r=Math.floor((e.dayOfYear()-a-1)/7)+1,o,i;if(r<1){i=e.year()-1;o=r+T(i,t,n)}else if(r>T(e.year(),t,n)){o=r-T(e.year(),t,n);i=e.year()+1}else{i=e.year();o=r}return{week:o,year:i}}function T(e,t,n){var a=xt(e,t,n),r=xt(e+1,t,n);return(wt(e)-a+r)/7}function Tt(e){return Lt(e,this._week.dow,this._week.doy).week}a("w",["ww",2],"wo","week"),a("W",["WW",2],"Wo","isoWeek"),t("week","w"),t("isoWeek","W"),n("week",5),n("isoWeek",5),_("w",v),_("ww",v,r),_("W",v),_("WW",v,r),Ze(["w","ww","W","WW"],function(e,t,n,a){t[a.substr(0,1)]=y(e)});var Dt={dow:0,doy:6};function Ot(){return this._week.dow}function Nt(){return this._week.doy}function Pt(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function jt(e){var t=Lt(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}function Yt(e,t){if(typeof e!=="string")return e;if(!isNaN(e))return parseInt(e,10);e=t.weekdaysParse(e);if(typeof e==="number")return e;return null}function It(e,t){if(typeof e==="string")return t.weekdaysParse(e)%7||7;return isNaN(e)?null:e}function Rt(e,t){return e.slice(t,7).concat(e.slice(0,t))}a("d",0,"do","day"),a("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),a("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),a("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),a("e",0,0,"weekday"),a("E",0,0,"isoWeekday"),t("day","d"),t("weekday","e"),t("isoWeekday","E"),n("day",11),n("weekday",11),n("isoWeekday",11),_("d",v),_("e",v),_("E",v),_("dd",function(e,t){return t.weekdaysMinRegex(e)}),_("ddd",function(e,t){return t.weekdaysShortRegex(e)}),_("dddd",function(e,t){return t.weekdaysRegex(e)}),Ze(["dd","ddd","dddd"],function(e,t,n,a){var r=n._locale.weekdaysParse(e,a,n._strict);if(r!=null)t.d=r;else f(n).invalidWeekday=e}),Ze(["d","e","E"],function(e,t,n,a){t[a]=y(e)});var At="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ht="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ft="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),zt=qe,Wt=qe,Vt=qe;function Bt(e,t){var n=i(this._weekdays)?this._weekdays:this._weekdays[e&&e!==true&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===true?Rt(n,this._week.dow):e?n[e.day()]:n}function Ut(e){return e===true?Rt(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function Kt(e){return e===true?Rt(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Gt(e,t,n){var a,r,o,i=e.toLocaleLowerCase();if(!this._weekdaysParse){this._weekdaysParse=[];this._shortWeekdaysParse=[];this._minWeekdaysParse=[];for(a=0;a<7;++a){o=d([2e3,1]).day(a);this._minWeekdaysParse[a]=this.weekdaysMin(o,"").toLocaleLowerCase();this._shortWeekdaysParse[a]=this.weekdaysShort(o,"").toLocaleLowerCase();this._weekdaysParse[a]=this.weekdays(o,"").toLocaleLowerCase()}}if(n)if(t==="dddd"){r=L.call(this._weekdaysParse,i);return r!==-1?r:null}else if(t==="ddd"){r=L.call(this._shortWeekdaysParse,i);return r!==-1?r:null}else{r=L.call(this._minWeekdaysParse,i);return r!==-1?r:null}else if(t==="dddd"){r=L.call(this._weekdaysParse,i);if(r!==-1)return r;r=L.call(this._shortWeekdaysParse,i);if(r!==-1)return r;r=L.call(this._minWeekdaysParse,i);return r!==-1?r:null}else if(t==="ddd"){r=L.call(this._shortWeekdaysParse,i);if(r!==-1)return r;r=L.call(this._weekdaysParse,i);if(r!==-1)return r;r=L.call(this._minWeekdaysParse,i);return r!==-1?r:null}else{r=L.call(this._minWeekdaysParse,i);if(r!==-1)return r;r=L.call(this._weekdaysParse,i);if(r!==-1)return r;r=L.call(this._shortWeekdaysParse,i);return r!==-1?r:null}}function qt(e,t,n){var a,r,o;if(this._weekdaysParseExact)return Gt.call(this,e,t,n);if(!this._weekdaysParse){this._weekdaysParse=[];this._minWeekdaysParse=[];this._shortWeekdaysParse=[];this._fullWeekdaysParse=[]}for(a=0;a<7;a++){r=d([2e3,1]).day(a);if(n&&!this._fullWeekdaysParse[a]){this._fullWeekdaysParse[a]=new RegExp("^"+this.weekdays(r,"").replace(".","\\.?")+"$","i");this._shortWeekdaysParse[a]=new RegExp("^"+this.weekdaysShort(r,"").replace(".","\\.?")+"$","i");this._minWeekdaysParse[a]=new RegExp("^"+this.weekdaysMin(r,"").replace(".","\\.?")+"$","i")}if(!this._weekdaysParse[a]){o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,"");this._weekdaysParse[a]=new RegExp(o.replace(".",""),"i")}if(n&&t==="dddd"&&this._fullWeekdaysParse[a].test(e))return a;else if(n&&t==="ddd"&&this._shortWeekdaysParse[a].test(e))return a;else if(n&&t==="dd"&&this._minWeekdaysParse[a].test(e))return a;else if(!n&&this._weekdaysParse[a].test(e))return a}}function $t(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();if(e!=null){e=Yt(e,this.localeData());return this.add(e-t,"d")}else return t}function Jt(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function Xt(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=It(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function Qt(e){if(this._weekdaysParseExact){if(!s(this,"_weekdaysRegex"))tn.call(this);if(e)return this._weekdaysStrictRegex;else return this._weekdaysRegex}else{if(!s(this,"_weekdaysRegex"))this._weekdaysRegex=zt;return this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex}}function Zt(e){if(this._weekdaysParseExact){if(!s(this,"_weekdaysRegex"))tn.call(this);if(e)return this._weekdaysShortStrictRegex;else return this._weekdaysShortRegex}else{if(!s(this,"_weekdaysShortRegex"))this._weekdaysShortRegex=Wt;return this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}}function en(e){if(this._weekdaysParseExact){if(!s(this,"_weekdaysRegex"))tn.call(this);if(e)return this._weekdaysMinStrictRegex;else return this._weekdaysMinRegex}else{if(!s(this,"_weekdaysMinRegex"))this._weekdaysMinRegex=Vt;return this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}}function tn(){function e(e,t){return t.length-e.length}var t=[],n=[],a=[],r=[],o,i,l,s,u;for(o=0;o<7;o++){i=d([2e3,1]).day(o);l=b(this.weekdaysMin(i,""));s=b(this.weekdaysShort(i,""));u=b(this.weekdays(i,""));t.push(l);n.push(s);a.push(u);r.push(l);r.push(s);r.push(u)}t.sort(e);n.sort(e);a.sort(e);r.sort(e);this._weekdaysRegex=new RegExp("^("+r.join("|")+")","i");this._weekdaysShortRegex=this._weekdaysRegex;this._weekdaysMinRegex=this._weekdaysRegex;this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i");this._weekdaysShortStrictRegex=new RegExp("^("+n.join("|")+")","i");this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function nn(){return this.hours()%12||12}function an(){return this.hours()||24}function rn(e,t){a(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function on(e,t){return t._meridiemParse}function ln(e){return(e+"").toLowerCase().charAt(0)==="p"}a("H",["HH",2],0,"hour"),a("h",["hh",2],0,nn),a("k",["kk",2],0,an),a("hmm",0,0,function(){return""+nn.apply(this)+o(this.minutes(),2)}),a("hmmss",0,0,function(){return""+nn.apply(this)+o(this.minutes(),2)+o(this.seconds(),2)}),a("Hmm",0,0,function(){return""+this.hours()+o(this.minutes(),2)}),a("Hmmss",0,0,function(){return""+this.hours()+o(this.minutes(),2)+o(this.seconds(),2)}),rn("a",true),rn("A",false),t("hour","h"),n("hour",13),_("a",on),_("A",on),_("H",v),_("h",v),_("k",v),_("HH",v,r),_("hh",v,r),_("kk",v,r),_("hmm",Ae),_("hmmss",He),_("Hmm",Ae),_("Hmmss",He),w(["H","HH"],E),w(["k","kk"],function(e,t,n){var a=y(e);t[E]=a===24?0:a}),w(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e);n._meridiem=e}),w(["h","hh"],function(e,t,n){t[E]=y(e);f(n).bigHour=true}),w("hmm",function(e,t,n){var a=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a));f(n).bigHour=true}),w("hmmss",function(e,t,n){var a=e.length-4,r=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a,2));t[C]=y(e.substr(r));f(n).bigHour=true}),w("Hmm",function(e,t,n){var a=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a))}),w("Hmmss",function(e,t,n){var a=e.length-4,r=e.length-2;t[E]=y(e.substr(0,a));t[x]=y(e.substr(a,2));t[C]=y(e.substr(r))});var sn,un=Te("Hours",true);function dn(e,t,n){if(e>11)return n?"pm":"PM";else return n?"am":"AM"}var cn={calendar:re,longDateFormat:he,invalidDate:ge,ordinal:ve,dayOfMonthOrdinalParse:_e,relativeTime:we,months:it,monthsShort:lt,week:Dt,weekdays:At,weekdaysMin:Ft,weekdaysShort:Ht,meridiemParse:/[ap]\.?m?\.?/i},D={},fn={},pn;function hn(e,t){var n,a=Math.min(e.length,t.length);for(n=0;n0){r=vn(o.slice(0,n).join("-"));if(r)return r;if(a&&a.length>=n&&hn(o,a)>=n-1)break;n--}t++}return pn}function yn(e){return e.match("^[^/\\\\]*$")!=null}function vn(t){var e=null,n;if(D[t]===undefined&&typeof di!=="undefined"&&di&&di.exports&&yn(t))try{e=pn._abbr;n=ci;fi(517)("./"+t);_n(e)}catch(e){D[t]=null}return D[t]}function _n(e,t){var n;if(e){if(l(t))n=Mn(e);else n=bn(e,t);if(n)pn=n;else if(typeof console!=="undefined"&&console.warn)console.warn("Locale "+e+" not found. Did you forget to load it?")}return pn._abbr}function bn(e,t){if(t!==null){var n,a=cn;t.abbr=e;if(D[e]!=null){ee("defineLocaleOverride","use moment.updateLocale(localeName, config) to change "+"an existing locale. moment.defineLocale(localeName, "+"config) should only be used for creating a new locale "+"See http://momentjs.com/guides/#/warnings/define-locale/ for more info.");a=D[e]._config}else if(t.parentLocale!=null)if(D[t.parentLocale]!=null)a=D[t.parentLocale]._config;else{n=vn(t.parentLocale);if(n!=null)a=n._config;else{if(!fn[t.parentLocale])fn[t.parentLocale]=[];fn[t.parentLocale].push({name:e,config:t});return null}}D[e]=new ae(ne(a,t));if(fn[e])fn[e].forEach(function(e){bn(e.name,e.config)});_n(e);return D[e]}else{delete D[e];return null}}function wn(e,t){if(t!=null){var n,a,r=cn;if(D[e]!=null&&D[e].parentLocale!=null)D[e].set(ne(D[e]._config,t));else{a=vn(e);if(a!=null)r=a._config;t=ne(r,t);if(a==null)t.abbr=e;n=new ae(t);n.parentLocale=D[e];D[e]=n}_n(e)}else if(D[e]!=null)if(D[e].parentLocale!=null){D[e]=D[e].parentLocale;if(e===_n())_n(e)}else if(D[e]!=null)delete D[e];return D[e]}function Mn(e){var t;if(e&&e._locale&&e._locale._abbr)e=e._locale._abbr;if(!e)return pn;if(!i(e)){t=vn(e);if(t)return t;e=[e]}return gn(e)}function kn(){return Z(D)}function Sn(e){var t,n=e._a;if(n&&f(e).overflow===-2){t=n[k]<0||n[k]>11?k:n[S]<1||n[S]>ot(n[M],n[k])?S:n[E]<0||n[E]>24||n[E]===24&&(n[x]!==0||n[C]!==0||n[tt]!==0)?E:n[x]<0||n[x]>59?x:n[C]<0||n[C]>59?C:n[tt]<0||n[tt]>999?tt:-1;if(f(e)._overflowDayOfYear&&(tS))t=S;if(f(e)._overflowWeeks&&t===-1)t=nt;if(f(e)._overflowWeekday&&t===-1)t=at;f(e).overflow=t}return e}var En=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,xn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Cn=/Z|[+-]\d\d(?::?\d\d)?/,Ln=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,false],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,false],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,false],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,false],["YYYY",/\d{4}/,false]],Tn=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Dn=/^\/?Date\((-?\d+)/i,On=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Nn={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Pn(e){var t,n,a=e._i,r=En.exec(a)||xn.exec(a),o,i,l,s,u=Ln.length,d=Tn.length;if(r){f(e).iso=true;for(t=0,n=u;twt(i)||e._dayOfYear===0)f(e)._overflowDayOfYear=true;n=Et(i,0,e._dayOfYear);e._a[k]=n.getUTCMonth();e._a[S]=n.getUTCDate()}for(t=0;t<3&&e._a[t]==null;++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=e._a[t]==null?t===2?1:0:e._a[t];if(e._a[E]===24&&e._a[x]===0&&e._a[C]===0&&e._a[tt]===0){e._nextDay=true;e._a[E]=0}e._d=(e._useUTC?Et:St).apply(null,a);o=e._useUTC?e._d.getUTCDay():e._d.getDay();if(e._tzm!=null)e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm);if(e._nextDay)e._a[E]=24;if(e._w&&typeof e._w.d!=="undefined"&&e._w.d!==o)f(e).weekdayMismatch=true}function Bn(e){var t,n,a,r,o,i,l,s,u;t=e._w;if(t.GG!=null||t.W!=null||t.E!=null){o=1;i=4;n=zn(t.GG,e._a[M],Lt(O(),1,4).year);a=zn(t.W,1);r=zn(t.E,1);if(r<1||r>7)s=true}else{o=e._locale._week.dow;i=e._locale._week.doy;u=Lt(O(),o,i);n=zn(t.gg,e._a[M],u.year);a=zn(t.w,u.week);if(t.d!=null){r=t.d;if(r<0||r>6)s=true}else if(t.e!=null){r=t.e+o;if(t.e<0||t.e>6)s=true}else r=o}if(a<1||a>T(n,o,i))f(e)._overflowWeeks=true;else if(s!=null)f(e)._overflowWeekday=true;else{l=Ct(n,a,r,o,i);e._a[M]=l.year;e._dayOfYear=l.dayOfYear}}function Un(e){if(e._f===c.ISO_8601){Pn(e);return}if(e._f===c.RFC_2822){Hn(e);return}e._a=[];f(e).empty=true;var t=""+e._i,n,a,r,o,i,l=t.length,s=0,u,d;r=pe(e._f,e._locale).match(ie)||[];d=r.length;for(n=0;n0)f(e).unusedInput.push(i);t=t.slice(t.indexOf(a)+a.length);s+=a.length}if(ue[o]){if(a)f(e).empty=false;else f(e).unusedTokens.push(o);et(o,a,e)}else if(e._strict&&!a)f(e).unusedTokens.push(o)}f(e).charsLeftOver=l-s;if(t.length>0)f(e).unusedInput.push(t);if(e._a[E]<=12&&f(e).bigHour===true&&e._a[E]>0)f(e).bigHour=undefined;f(e).parsedDateParts=e._a.slice(0);f(e).meridiem=e._meridiem;e._a[E]=Kn(e._locale,e._a[E],e._meridiem);u=f(e).era;if(u!==null)e._a[M]=e._locale.erasConvertYear(u,e._a[M]);Vn(e);Sn(e)}function Kn(e,t,n){var a;if(n==null)return t;if(e.meridiemHour!=null)return e.meridiemHour(t,n);else if(e.isPM!=null){a=e.isPM(n);if(a&&t<12)t+=12;if(!a&&t===12)t=0;return t}else return t}function Gn(e){var t,n,a,r,o,i,l=false,s=e._f.length;if(s===0){f(e).invalidFormat=true;e._d=new Date(NaN);return}for(r=0;rthis?this:e;else return K()});function ta(e,t){var n,a;if(t.length===1&&i(t[0]))t=t[0];if(!t.length)return O();n=t[0];for(a=1;athis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ea(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={},t;$(e,this);e=Jn(e);if(e._a){t=e._isUTC?d(e._a):O(e._a);this._isDSTShifted=this.isValid()&&fa(e._a,t.toArray())>0}else this._isDSTShifted=false;return this._isDSTShifted}function xa(){return this.isValid()?!this._isUTC:false}function Ca(){return this.isValid()?this._isUTC:false}function La(){return this.isValid()?this._isUTC&&this._offset===0:false}c.updateOffset=function(){};var Ta=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Da=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function N(e,t){var n=e,a=null,r,o,i;if(da(e))n={ms:e._milliseconds,d:e._days,M:e._months};else if(u(e)||!isNaN(+e)){n={};if(t)n[t]=+e;else n.milliseconds=+e}else if(a=Ta.exec(e)){r=a[1]==="-"?-1:1;n={y:0,d:y(a[S])*r,h:y(a[E])*r,m:y(a[x])*r,s:y(a[C])*r,ms:y(ca(a[tt]*1e3))*r}}else if(a=Da.exec(e)){r=a[1]==="-"?-1:1;n={y:Oa(a[2],r),M:Oa(a[3],r),w:Oa(a[4],r),d:Oa(a[5],r),h:Oa(a[6],r),m:Oa(a[7],r),s:Oa(a[8],r)}}else if(n==null)n={};else if(typeof n==="object"&&("from"in n||"to"in n)){i=Pa(O(n.from),O(n.to));n={};n.ms=i.milliseconds;n.M=i.months}o=new ua(n);if(da(e)&&s(e,"_locale"))o._locale=e._locale;if(da(e)&&s(e,"_isValid"))o._isValid=e._isValid;return o}function Oa(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Na(e,t){var n={};n.months=t.month()-e.month()+(t.year()-e.year())*12;if(e.clone().add(n.months,"M").isAfter(t))--n.months;n.milliseconds=+t-+e.clone().add(n.months,"M");return n}function Pa(e,t){var n;if(!(e.isValid()&&t.isValid()))return{milliseconds:0,months:0};t=ga(t,e);if(e.isBefore(t))n=Na(e,t);else{n=Na(t,e);n.milliseconds=-n.milliseconds;n.months=-n.months}return n}function ja(r,o){return function(e,t){var n,a;if(t!==null&&!isNaN(+t)){ee(o,"moment()."+o+"(period, number) is deprecated. Please use moment()."+o+"(number, period). "+"See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.");a=e;e=t;t=a}n=N(e,t);Ya(this,n,r);return this}}function Ya(e,t,n,a){var r=t._milliseconds,o=ca(t._days),i=ca(t._months);if(!e.isValid())return;a=a==null?true:a;if(i)mt(e,De(e,"Month")+i*n);if(o)Oe(e,"Date",De(e,"Date")+o*n);if(r)e._d.setTime(e._d.valueOf()+r*n);if(a)c.updateOffset(e,o||i)}N.fn=ua.prototype,N.invalid=sa;var Ia=ja(1,"add"),Ra=ja(-1,"subtract");function Aa(e){return typeof e==="string"||e instanceof String}function Ha(e){return p(e)||z(e)||Aa(e)||u(e)||za(e)||Fa(e)||e===null||e===undefined}function Fa(e){var t=H(e)&&!F(e),n=false,a=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],r,o,i=a.length;for(r=0;rn.valueOf();else return n.valueOf()9999)return fe(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ");if(h(Date.prototype.toISOString))if(t)return this.toDate().toISOString();else return new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",fe(n,"Z"));return fe(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function nr(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",n,a,r,o;if(!this.isLocal()){e=this.utcOffset()===0?"moment.utc":"moment.parseZone";t="Z"}n="["+e+'("]';a=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";r="-MM-DD[T]HH:mm:ss.SSS";o=t+'[")]';return this.format(n+a+r+o)}function ar(e){if(!e)e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat;var t=fe(this,e);return this.localeData().postformat(t)}function rr(e,t){if(this.isValid()&&(p(e)&&e.isValid()||O(e).isValid()))return N({to:this,from:e}).locale(this.locale()).humanize(!t);else return this.localeData().invalidDate()}function or(e){return this.from(O(),e)}function ir(e,t){if(this.isValid()&&(p(e)&&e.isValid()||O(e).isValid()))return N({from:this,to:e}).locale(this.locale()).humanize(!t);else return this.localeData().invalidDate()}function lr(e){return this.to(O(),e)}function sr(e){var t;if(e===undefined)return this._locale._abbr;else{t=Mn(e);if(t!=null)this._locale=t;return this}}c.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",c.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ur=e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){if(e===undefined)return this.localeData();else return this.locale(e)});function dr(){return this._locale}var cr=1e3,fr=60*cr,pr=60*fr,hr=(365*400+97)*24*pr;function mr(e,t){return(e%t+t)%t}function gr(e,t,n){if(e<100&&e>=0)return new Date(e+400,t,n)-hr;else return new Date(e,t,n).valueOf()}function yr(e,t,n){if(e<100&&e>=0)return Date.UTC(e+400,t,n)-hr;else return Date.UTC(e,t,n)}function vr(e){var t,n;e=m(e);if(e===undefined||e==="millisecond"||!this.isValid())return this;n=this._isUTC?yr:gr;switch(e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf();t-=mr(t+(this._isUTC?0:this.utcOffset()*fr),pr);break;case"minute":t=this._d.valueOf();t-=mr(t,fr);break;case"second":t=this._d.valueOf();t-=mr(t,cr);break}this._d.setTime(t);c.updateOffset(this,true);return this}function _r(e){var t,n;e=m(e);if(e===undefined||e==="millisecond"||!this.isValid())return this;n=this._isUTC?yr:gr;switch(e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf();t+=pr-mr(t+(this._isUTC?0:this.utcOffset()*fr),pr)-1;break;case"minute":t=this._d.valueOf();t+=fr-mr(t,fr)-1;break;case"second":t=this._d.valueOf();t+=cr-mr(t,cr)-1;break}this._d.setTime(t);c.updateOffset(this,true);return this}function br(){return this._d.valueOf()-(this._offset||0)*6e4}function wr(){return Math.floor(this.valueOf()/1e3)}function Mr(){return new Date(this.valueOf())}function kr(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Sr(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function Er(){return this.isValid()?this.toISOString():null}function xr(){return U(this)}function Cr(){return V({},f(this))}function Lr(){return f(this).overflow}function Tr(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Dr(e,t){var n,a,r,o=this._eras||Mn("en")._eras;for(n=0,a=o.length;n=0)return o[a]}}function Nr(e,t){var n=e.since<=e.until?+1:-1;if(t===undefined)return c(e.since).year();else return c(e.since).year()+(t-e.offset)*n}function Pr(){var e,t,n,a=this.localeData().eras();for(e=0,t=a.length;eo)t=o;return Zr.call(this,e,t,n,a,r)}}function Zr(e,t,n,a,r){var o=Ct(e,t,n,a,r),i=Et(o.year,0,o.dayOfYear);this.year(i.getUTCFullYear());this.month(i.getUTCMonth());this.date(i.getUTCDate());return this}function eo(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}a("N",0,0,"eraAbbr"),a("NN",0,0,"eraAbbr"),a("NNN",0,0,"eraAbbr"),a("NNNN",0,0,"eraName"),a("NNNNN",0,0,"eraNarrow"),a("y",["y",1],"yo","eraYear"),a("y",["yy",2],0,"eraYear"),a("y",["yyy",3],0,"eraYear"),a("y",["yyyy",4],0,"eraYear"),_("N",Fr),_("NN",Fr),_("NNN",Fr),_("NNNN",zr),_("NNNNN",Wr),w(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,a){var r=n._locale.erasParse(e,a,n._strict);if(r)f(n).era=r;else f(n).invalidEra=e}),_("y",Ve),_("yy",Ve),_("yyy",Ve),_("yyyy",Ve),_("yo",Vr),w(["y","yy","yyy","yyyy"],M),w(["yo"],function(e,t,n,a){var r;if(n._locale._eraYearOrdinalRegex)r=e.match(n._locale._eraYearOrdinalRegex);if(n._locale.eraYearOrdinalParse)t[M]=n._locale.eraYearOrdinalParse(e,r);else t[M]=parseInt(e,10)}),a(0,["gg",2],0,function(){return this.weekYear()%100}),a(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ur("gggg","weekYear"),Ur("ggggg","weekYear"),Ur("GGGG","isoWeekYear"),Ur("GGGGG","isoWeekYear"),t("weekYear","gg"),t("isoWeekYear","GG"),n("weekYear",1),n("isoWeekYear",1),_("G",Be),_("g",Be),_("GG",v,r),_("gg",v,r),_("GGGG",ze,Ie),_("gggg",ze,Ie),_("GGGGG",We,Re),_("ggggg",We,Re),Ze(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,a){t[a.substr(0,2)]=y(e)}),Ze(["gg","GG"],function(e,t,n,a){t[a]=c.parseTwoDigitYear(e)}),a("Q",0,"Qo","quarter"),t("quarter","Q"),n("quarter",7),_("Q",je),w("Q",function(e,t){t[k]=(y(e)-1)*3}),a("D",["DD",2],"Do","date"),t("date","D"),n("date",9),_("D",v),_("DD",v,r),_("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),w(["D","DD"],S),w("Do",function(e,t){t[S]=y(e.match(v)[0])});var to=Te("Date",true);function no(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}a("DDD",["DDDD",3],"DDDo","dayOfYear"),t("dayOfYear","DDD"),n("dayOfYear",4),_("DDD",Fe),_("DDDD",Ye),w(["DDD","DDDD"],function(e,t,n){n._dayOfYear=y(e)}),a("m",["mm",2],0,"minute"),t("minute","m"),n("minute",14),_("m",v),_("mm",v,r),w(["m","mm"],x);var ao=Te("Minutes",false),ro=(a("s",["ss",2],0,"second"),t("second","s"),n("second",15),_("s",v),_("ss",v,r),w(["s","ss"],C),Te("Seconds",false)),oo,io;for(a("S",0,0,function(){return~~(this.millisecond()/100)}),a(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),a(0,["SSS",3],0,"millisecond"),a(0,["SSSS",4],0,function(){return this.millisecond()*10}),a(0,["SSSSS",5],0,function(){return this.millisecond()*100}),a(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),a(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),a(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),a(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),t("millisecond","ms"),n("millisecond",16),_("S",Fe,je),_("SS",Fe,r),_("SSS",Fe,Ye),oo="SSSS";oo.length<=9;oo+="S")_(oo,Ve);function lo(e,t){t[tt]=y(("0."+e)*1e3)}for(oo="S";oo.length<=9;oo+="S")w(oo,lo);function so(){return this._isUTC?"UTC":""}function uo(){return this._isUTC?"Coordinated Universal Time":""}io=Te("Milliseconds",false),a("z",0,0,"zoneAbbr"),a("zz",0,0,"zoneName");var P=J.prototype;if(P.add=Ia,P.calendar=Ba,P.clone=Ua,P.diff=Qa,P.endOf=_r,P.format=ar,P.from=rr,P.fromNow=or,P.to=ir,P.toNow=lr,P.get=Ne,P.invalidAt=Lr,P.isAfter=Ka,P.isBefore=Ga,P.isBetween=qa,P.isSame=$a,P.isSameOrAfter=Ja,P.isSameOrBefore=Xa,P.isValid=xr,P.lang=ur,P.locale=sr,P.localeData=dr,P.max=ea,P.min=Zn,P.parsingFlags=Cr,P.set=Pe,P.startOf=vr,P.subtract=Ra,P.toArray=kr,P.toObject=Sr,P.toDate=Mr,P.toISOString=tr,P.inspect=nr,typeof Symbol!=="undefined"&&Symbol.for!=null)P[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"};function co(e){return O(e*1e3)}function fo(){return O.apply(null,arguments).parseZone()}function po(e){return e}P.toJSON=Er,P.toString=er,P.unix=wr,P.valueOf=br,P.creationData=Tr,P.eraName=Pr,P.eraNarrow=jr,P.eraAbbr=Yr,P.eraYear=Ir,P.year=Mt,P.isLeapYear=kt,P.weekYear=Kr,P.isoWeekYear=Gr,P.quarter=P.quarters=eo,P.month=gt,P.daysInMonth=yt,P.week=P.weeks=Pt,P.isoWeek=P.isoWeeks=jt,P.weeksInYear=Jr,P.weeksInWeekYear=Xr,P.isoWeeksInYear=qr,P.isoWeeksInISOWeekYear=$r,P.date=to,P.day=P.days=$t,P.weekday=Jt,P.isoWeekday=Xt,P.dayOfYear=no,P.hour=P.hours=un,P.minute=P.minutes=ao,P.second=P.seconds=ro,P.millisecond=P.milliseconds=io,P.utcOffset=va,P.utc=ba,P.local=wa,P.parseZone=Ma,P.hasAlignedHourOffset=ka,P.isDST=Sa,P.isLocal=xa,P.isUtcOffset=Ca,P.isUtc=La,P.isUTC=La,P.zoneAbbr=so,P.zoneName=uo,P.dates=e("dates accessor is deprecated. Use date instead.",to),P.months=e("months accessor is deprecated. Use month instead",gt),P.years=e("years accessor is deprecated. Use year instead",Mt),P.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",_a),P.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ea);var j=ae.prototype;function ho(e,t,n,a){var r=Mn(),o=d().set(a,t);return r[n](o,e)}function mo(e,t,n){if(u(e)){t=e;e=undefined}e=e||"";if(t!=null)return ho(e,t,n,"month");var a,r=[];for(a=0;a<12;a++)r[a]=ho(e,a,n,"month");return r}function go(e,t,n,a){if(typeof e==="boolean"){if(u(t)){n=t;t=undefined}t=t||""}else{t=e;n=t;e=false;if(u(t)){n=t;t=undefined}t=t||""}var r=Mn(),o=e?r._week.dow:0,i,l=[];if(n!=null)return ho(t,(n+o)%7,a,"day");for(i=0;i<7;i++)l[i]=ho(t,(i+o)%7,a,"day");return l}function yo(e,t){return mo(e,t,"months")}function vo(e,t){return mo(e,t,"monthsShort")}function _o(e,t,n){return go(e,t,n,"weekdays")}function bo(e,t,n){return go(e,t,n,"weekdaysShort")}function wo(e,t,n){return go(e,t,n,"weekdaysMin")}j.calendar=oe,j.longDateFormat=me,j.invalidDate=ye,j.ordinal=be,j.preparse=po,j.postformat=po,j.relativeTime=Me,j.pastFuture=ke,j.set=te,j.eras=Dr,j.erasParse=Or,j.erasConvertYear=Nr,j.erasAbbrRegex=Ar,j.erasNameRegex=Rr,j.erasNarrowRegex=Hr,j.months=ct,j.monthsShort=ft,j.monthsParse=ht,j.monthsRegex=_t,j.monthsShortRegex=vt,j.week=Tt,j.firstDayOfYear=Nt,j.firstDayOfWeek=Ot,j.weekdays=Bt,j.weekdaysMin=Kt,j.weekdaysShort=Ut,j.weekdaysParse=qt,j.weekdaysRegex=Qt,j.weekdaysShortRegex=Zt,j.weekdaysMinRegex=en,j.isPM=ln,j.meridiem=dn,_n("en",{eras:[{since:"0001-01-01",until:+Infinity,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-Infinity,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=y(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}}),c.lang=e("moment.lang is deprecated. Use moment.locale instead.",_n),c.langData=e("moment.langData is deprecated. Use moment.localeData instead.",Mn);var Mo=Math.abs;function ko(){var e=this._data;this._milliseconds=Mo(this._milliseconds);this._days=Mo(this._days);this._months=Mo(this._months);e.milliseconds=Mo(e.milliseconds);e.seconds=Mo(e.seconds);e.minutes=Mo(e.minutes);e.hours=Mo(e.hours);e.months=Mo(e.months);e.years=Mo(e.years);return this}function So(e,t,n,a){var r=N(t,n);e._milliseconds+=a*r._milliseconds;e._days+=a*r._days;e._months+=a*r._months;return e._bubble()}function Eo(e,t){return So(this,e,t,1)}function xo(e,t){return So(this,e,t,-1)}function Co(e){if(e<0)return Math.floor(e);else return Math.ceil(e)}function Lo(){var e=this._milliseconds,t=this._days,n=this._months,a=this._data,r,o,i,l,s;if(!(e>=0&&t>=0&&n>=0||e<=0&&t<=0&&n<=0)){e+=Co(Do(n)+t)*864e5;t=0;n=0}a.milliseconds=e%1e3;r=g(e/1e3);a.seconds=r%60;o=g(r/60);a.minutes=o%60;i=g(o/60);a.hours=i%24;t+=g(i/24);s=g(To(t));n+=s;t-=Co(Do(s));l=g(n/12);n%=12;a.days=t;a.months=n;a.years=l;return this}function To(e){return e*4800/146097}function Do(e){return e*146097/4800}function Oo(e){if(!this.isValid())return NaN;var t,n,a=this._milliseconds;e=m(e);if(e==="month"||e==="quarter"||e==="year"){t=this._days+a/864e5;n=this._months+To(t);switch(e){case"month":return n;case"quarter":return n/3;case"year":return n/12}}else{t=this._days+Math.round(Do(this._months));switch(e){case"week":return t/7+a/6048e5;case"day":return t+a/864e5;case"hour":return t*24+a/36e5;case"minute":return t*1440+a/6e4;case"second":return t*86400+a/1e3;case"millisecond":return Math.floor(t*864e5)+a;default:throw new Error("Unknown unit "+e)}}}function No(){if(!this.isValid())return NaN;return this._milliseconds+this._days*864e5+this._months%12*2592e6+y(this._months/12)*31536e6}function Po(e){return function(){return this.as(e)}}var jo=Po("ms"),Yo=Po("s"),Io=Po("m"),Ro=Po("h"),Ao=Po("d"),Ho=Po("w"),Fo=Po("M"),zo=Po("Q"),Wo=Po("y");function Vo(){return N(this)}function Bo(e){e=m(e);return this.isValid()?this[e+"s"]():NaN}function Uo(e){return function(){return this.isValid()?this._data[e]:NaN}}var Ko=Uo("milliseconds"),Go=Uo("seconds"),qo=Uo("minutes"),$o=Uo("hours"),Jo=Uo("days"),Xo=Uo("months"),Qo=Uo("years");function Zo(){return g(this.days()/7)}var ei=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function ni(e,t,n,a,r){return r.relativeTime(t||1,!!n,e,a)}function ai(e,t,n,a){var r=N(e).abs(),o=ei(r.as("s")),i=ei(r.as("m")),l=ei(r.as("h")),s=ei(r.as("d")),u=ei(r.as("M")),d=ei(r.as("w")),c=ei(r.as("y")),f=o<=n.ss&&["s",o]||o0;f[4]=a;return ni.apply(null,f)}function ri(e){if(e===undefined)return ei;if(typeof e==="function"){ei=e;return true}return false}function oi(e,t){if(ti[e]===undefined)return false;if(t===undefined)return ti[e];ti[e]=t;if(e==="s")ti.ss=t-1;return true}function ii(e,t){if(!this.isValid())return this.localeData().invalidDate();var n=false,a=ti,r,o;if(typeof e==="object"){t=e;e=false}if(typeof e==="boolean")n=e;if(typeof t==="object"){a=Object.assign({},ti,t);if(t.s!=null&&t.ss==null)a.ss=t.s-1}r=this.localeData();o=ai(this,!n,a,r);if(n)o=r.pastFuture(+this,o);return r.postformat(o)}var li=Math.abs;function si(e){return(e>0)-(e<0)||+e}function ui(){if(!this.isValid())return this.localeData().invalidDate();var e=li(this._milliseconds)/1e3,t=li(this._days),n=li(this._months),a,r,o,i,l=this.asSeconds(),s,u,d,c;if(!l)return"P0D";a=g(e/60);r=g(a/60);e%=60;a%=60;o=g(n/12);n%=12;i=e?e.toFixed(3).replace(/\.?0+$/,""):"";s=l<0?"-":"";u=si(this._months)!==si(l)?"-":"";d=si(this._days)!==si(l)?"-":"";c=si(this._milliseconds)!==si(l)?"-":"";return s+"P"+(o?u+o+"Y":"")+(n?u+n+"M":"")+(t?d+t+"D":"")+(r||a||e?"T":"")+(r?c+r+"H":"")+(a?c+a+"M":"")+(e?c+i+"S":"")}var Y=ua.prototype;return Y.isValid=la,Y.abs=ko,Y.add=Eo,Y.subtract=xo,Y.as=Oo,Y.asMilliseconds=jo,Y.asSeconds=Yo,Y.asMinutes=Io,Y.asHours=Ro,Y.asDays=Ao,Y.asWeeks=Ho,Y.asMonths=Fo,Y.asQuarters=zo,Y.asYears=Wo,Y.valueOf=No,Y._bubble=Lo,Y.clone=Vo,Y.get=Bo,Y.milliseconds=Ko,Y.seconds=Go,Y.minutes=qo,Y.hours=$o,Y.days=Jo,Y.weeks=Zo,Y.months=Xo,Y.years=Qo,Y.humanize=ii,Y.toISOString=ui,Y.toString=ui,Y.toJSON=ui,Y.locale=sr,Y.localeData=dr,Y.toIsoString=e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ui),Y.lang=ur,a("X",0,0,"unix"),a("x",0,0,"valueOf"),_("x",Be),_("X",Ge),w("X",function(e,t,n){n._d=new Date(parseFloat(e)*1e3)}),w("x",function(e,t,n){n._d=new Date(y(e))}), //! moment.js -c.version="2.29.4",A(O),c.fn=P,c.min=na,c.max=aa,c.now=ra,c.utc=d,c.unix=co,c.months=yo,c.isDate=z,c.locale=_n,c.invalid=K,c.duration=N,c.isMoment=p,c.weekdays=_o,c.parseZone=fo,c.localeData=Mn,c.isDuration=da,c.monthsShort=vo,c.weekdaysMin=wo,c.defineLocale=bn,c.updateLocale=wn,c.locales=kn,c.weekdaysShort=bo,c.normalizeUnits=m,c.relativeTimeRounding=ri,c.relativeTimeThreshold=oi,c.calendarFormat=Va,c.prototype=P,c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},c}()}.call(this,fi(516)(e))},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(2)),r=u(n(12)),o=u(n(8)),i=u(n(360)),l=u(n(581)),s=u(n(582)),n=u(n(362));function u(e){return e&&e.__esModule?e:{default:e}}i.default.Password=o.default.config(l.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),i.default.TextArea=o.default.config(s.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),i.default.Group=n.default,t.default=o.default.config(i.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.pickAttrs=t.datejs=t.htmlId=t.KEYCODE=t.guid=t.focus=t.support=t.str=t.obj=t.log=t.func=t.events=t.env=t.dom=void 0;var a=y(n(201)),r=y(n(204)),o=y(n(499)),i=y(n(500)),l=y(n(203)),s=y(n(96)),u=y(n(202)),d=y(n(508)),c=y(n(509)),f=y(n(510)),p=g(n(511)),h=g(n(206)),m=g(n(155)),n=g(n(512));function g(e){return e&&e.__esModule?e:{default:e}}function y(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}t.dom=a,t.env=r,t.events=o,t.func=i,t.log=l,t.obj=s,t.str=u,t.support=d,t.focus=c,t.guid=p.default,t.KEYCODE=h.default,t.htmlId=f,t.datejs=m.default,t.pickAttrs=n.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n,a={};for(n in e)0<=t.indexOf(n)||Object.prototype.hasOwnProperty.call(e,n)&&(a[n]=e[n]);return a}},function(e,t,n){var a; +c.version="2.29.4",A(O),c.fn=P,c.min=na,c.max=aa,c.now=ra,c.utc=d,c.unix=co,c.months=yo,c.isDate=z,c.locale=_n,c.invalid=K,c.duration=N,c.isMoment=p,c.weekdays=_o,c.parseZone=fo,c.localeData=Mn,c.isDuration=da,c.monthsShort=vo,c.weekdaysMin=wo,c.defineLocale=bn,c.updateLocale=wn,c.locales=kn,c.weekdaysShort=bo,c.normalizeUnits=m,c.relativeTimeRounding=ri,c.relativeTimeThreshold=oi,c.calendarFormat=Va,c.prototype=P,c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},c}()}.call(this,fi(516)(e))},function(e,t,n){"use strict";t.__esModule=!0;var a=u(n(2)),r=u(n(12)),o=u(n(8)),i=u(n(360)),l=u(n(581)),s=u(n(582)),n=u(n(362));function u(e){return e&&e.__esModule?e:{default:e}}i.default.Password=o.default.config(l.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),i.default.TextArea=o.default.config(s.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),i.default.Group=n.default,t.default=o.default.config(i.default,{exportNames:["getInputNode","focus"],transform:function(e,t){var n;return"hasLimitHint"in e&&(t("hasLimitHint","showLimitHint","Input"),n=(t=e).hasLimitHint,t=(0,r.default)(t,["hasLimitHint"]),e=(0,a.default)({showLimitHint:n},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.pickAttrs=t.datejs=t.htmlId=t.KEYCODE=t.guid=t.focus=t.support=t.str=t.obj=t.log=t.func=t.events=t.env=t.dom=void 0;var a=y(n(201)),r=y(n(204)),o=y(n(499)),i=y(n(500)),l=y(n(203)),s=y(n(97)),u=y(n(202)),d=y(n(508)),c=y(n(509)),f=y(n(510)),p=g(n(511)),h=g(n(206)),m=g(n(155)),n=g(n(512));function g(e){return e&&e.__esModule?e:{default:e}}function y(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}t.dom=a,t.env=r,t.events=o,t.func=i,t.log=l,t.obj=s,t.str=u,t.support=d,t.focus=c,t.guid=p.default,t.KEYCODE=h.default,t.htmlId=f,t.datejs=m.default,t.pickAttrs=n.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n,a={};for(n in e)0<=t.indexOf(n)||Object.prototype.hasOwnProperty.call(e,n)&&(a[n]=e[n]);return a}},function(e,t,n){var a; /*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ -!function(){"use strict";var i={}.hasOwnProperty;function l(){for(var e=[],t=0;t")),"shouldUpdatePosition"in r&&(delete t.shouldUpdatePosition,d.log.warning("Warning: [ shouldUpdatePosition ] is deprecated at [ ]")),"minMargin"in r&&o("minMargin","top/bottom",""),"isFullScreen"in r&&(r.overFlowScroll=!r.isFullScreen,delete t.isFullScreen,o("isFullScreen","overFlowScroll","")),t;return["target","offset","beforeOpen","onOpen","afterOpen","beforePosition","onPosition","cache","safeNode","wrapperClassName","container"].forEach(function(e){var t,n,a;e in r&&(o(e,"overlayProps."+e,"Dialog"),t=(n=r).overlayProps,n=(0,l.default)(n,["overlayProps"]),a=(0,i.default)(((a={})[e]=r[e],a),t||{}),delete n[e],r=(0,i.default)({overlayProps:a},n))}),r}n.displayName="Dialog",n.Inner=p.default,n.show=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.show)(e)},n.alert=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.alert)(e)},n.confirm=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.confirm)(e)},n.success=function(e){return(0,h.success)(e)},n.error=function(e){return(0,h.error)(e)},n.notice=function(e){return(0,h.notice)(e)},n.warning=function(e){return(0,h.warning)(e)},n.help=function(e){return(0,h.help)(e)},n.withContext=h.withContext,t.default=u.default.config(n,{transform:v}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=v(n(2)),l=v(n(12)),a=v(n(8)),r=v(n(638)),o=v(n(643)),s=v(n(646)),u=v(n(647)),d=v(n(648)),c=v(n(649)),f=v(n(651)),p=v(n(652)),h=v(n(653)),m=v(n(656)),g=v(n(393)),y=v(n(394));function v(e){return e&&e.__esModule?e:{default:e}}var _=n(11).env.ieVersion,n=[s.default,f.default,u.default,d.default,c.default,o.default,h.default,m.default],b=n.reduce(function(e,t){return e=t(e)},r.default),n=(f.default._typeMark="lock",d.default._typeMark="expanded",s.default._typeMark="fixed",n.reduce(function(e,t){var n=!_;return e="lock"===t._typeMark?(n?(0,p.default):(0,f.default))(e):"expanded"===t._typeMark?n?(0,d.default)(e,!0):(0,d.default)(e):"fixed"===t._typeMark?n?(0,s.default)(e,!0):(0,s.default)(e):t(e)},r.default));b.Base=r.default,b.fixed=s.default,b.lock=f.default,b.selection=u.default,b.expanded=d.default,b.tree=o.default,b.virtual=c.default,b.list=h.default,b.sticky=m.default,b.GroupHeader=g.default,b.GroupFooter=y.default,b.StickyLock=a.default.config(n,{componentName:"Table"}),t.default=a.default.config(b,{componentName:"Table",transform:function(e,t){var n,a,r,o;return"expandedRowKeys"in e&&(t("expandedRowKeys","openRowKeys","Table"),o=(r=e).expandedRowKeys,r=(0,l.default)(r,["expandedRowKeys"]),e=(0,i.default)({openRowKeys:o},r)),"onExpandedChange"in e&&(t("onExpandedChange","onRowOpen","Table"),r=(o=e).onExpandedChange,o=(0,l.default)(o,["onExpandedChange"]),e=(0,i.default)({onRowOpen:r},o)),"isLoading"in e&&(t("isLoading","loading","Table"),o=(r=e).isLoading,r=(0,l.default)(r,["isLoading"]),e=(0,i.default)({loading:o},r)),"indentSize"in e&&(t("indentSize","indent","Table"),r=(o=e).indentSize,o=(0,l.default)(o,["indentSize"]),e=(0,i.default)({indent:r},o)),"optimization"in e&&(t("optimization","pure","Table"),o=(r=e).optimization,r=(0,l.default)(r,["optimization"]),e=(0,i.default)({pure:o},r)),"getRowClassName"in e&&(t("getRowClassName","getRowProps","Table"),n=(o=e).getRowClassName,a=o.getRowProps,r=(0,l.default)(o,["getRowClassName","getRowProps"]),e=n?(0,i.default)({getRowProps:function(){return(0,i.default)({className:n.apply(void 0,arguments)},a?a.apply(void 0,arguments):{})}},r):(0,i.default)({getRowProps:a},r)),"getRowProps"in e&&(t("getRowProps","rowProps","Table in 1.15.0"),r=(o=e).getRowProps,o=(0,l.default)(o,["getRowProps"]),e=(0,i.default)({rowProps:r},o)),"getCellProps"in e&&(t("getCellProps","cellProps","Table in 1.15.0"),o=(r=e).getCellProps,t=(0,l.default)(r,["getCellProps"]),e=(0,i.default)({cellProps:o},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";n.d(t,"a",function(){return o});var a=n(89);function r(t,e){var n,a=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),a.push.apply(a,n)),a}function o(t){for(var e=1;e 16.8.0")},p.prototype.validate=function(e,t){this.validateCallback(e,t)},p.prototype.reset=function(e){var t=1","Select");t=s(e,t);return e.onInputUpdate&&(t.onSearch=e.onInputUpdate,t.showSearch=!0),t}}),t.default=a.default.config(r.default,{transform:s,exportNames:["focusInput","handleSearchClear"]}),e.exports=t.default},function(e,t,n){"use strict";n.d(t,"f",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"i",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"d",function(){return l}),n.d(t,"j",function(){return s}),n.d(t,"l",function(){return u}),n.d(t,"k",function(){return d}),n.d(t,"h",function(){return c}),n.d(t,"b",function(){return f}),n.d(t,"a",function(){return p}),n.d(t,"e",function(){return h});var a="docsite_language",r="LANGUAGE_SWITCH",o="__REDUX_DEVTOOLS_EXTENSION__",i="GET_STATE",l="GET_SUBSCRIBERS",s="REMOVE_SUBSCRIBERS",u="USER_LIST",d="ROLE_LIST",c="PERMISSIONS_LIST",f="GET_NAMESPACES",p="GET_CONFIGURATION",h=[10,20,30,50,100]},function(e,t,n){"use strict";function s(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function u(t){this.setState(function(e){return null!=(e=this.constructor.getDerivedStateFromProps(t,e))?e:null}.bind(this))}function d(e,t){try{var n=this.props,a=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,a)}finally{this.props=n,this.state=a}}function a(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"==typeof e.getDerivedStateFromProps||"function"==typeof t.getSnapshotBeforeUpdate){var n,a,r=null,o=null,i=null;if("function"==typeof t.componentWillMount?r="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(r="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?o="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(o="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?i="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(i="UNSAFE_componentWillUpdate"),null!==r||null!==o||null!==i)throw n=e.displayName||e.name,a="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()",Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+n+" uses "+a+" but also contains the following legacy lifecycles:"+(null!==r?"\n "+r:"")+(null!==o?"\n "+o:"")+(null!==i?"\n "+i:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks");if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=s,t.componentWillReceiveProps=u),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=d;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){n=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,n)}}}return e}n.r(t),n.d(t,"polyfill",function(){return a}),d.__suppressDeprecationWarning=u.__suppressDeprecationWarning=s.__suppressDeprecationWarning=!0},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var a=n(133);function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],a=!0,r=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(n.push(i.value),!t||n.length!==t);a=!0);}catch(e){r=!0,o=e}finally{try{a||null==l.return||l.return()}finally{if(r)throw o}}return n}}(e,t)||Object(a.a)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(e,t,n){"use strict";n(43),n(540)},function(e,t,n){"use strict";t.__esModule=!0;var v=s(n(2)),a=s(n(4)),r=s(n(5)),o=s(n(6)),_=s(n(0)),i=s(n(3)),b=s(n(13)),w=s(n(62)),l=s(n(8)),M=n(11);function s(e){return e&&e.__esModule?e:{default:e}}u=_.default.Component,(0,o.default)(k,u),k.prototype.render=function(){var e=this.props,t=e.tip,n=e.visible,a=e.children,r=e.className,o=e.style,i=e.indicator,l=e.color,s=e.prefix,u=e.fullScreen,d=e.disableScroll,c=e.onVisibleChange,f=e.tipAlign,p=e.size,h=e.inline,m=e.rtl,e=e.safeNode,g=null,y=s+"loading-dot",p=(g=i||(i=l,p=(0,b.default)(((l={})[s+"loading-fusion-reactor"]=!0,l[s+"loading-medium-fusion-reactor"]="medium"===p,l)),_.default.createElement("div",{className:p,dir:m?"rtl":void 0},_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}))),(0,b.default)(((l={})[s+"loading"]=!0,l[s+"open"]=n,l[s+"loading-inline"]=h,l[r]=r,l))),y=(0,b.default)(((m={})[s+"loading-tip"]=!0,m[s+"loading-tip-fullscreen"]=u,m[s+"loading-right-tip"]="right"===f,m)),i=M.obj.pickOthers(k.propTypes,this.props),l=(0,b.default)(((h={})[s+"loading-component"]=n,h[s+"loading-wrap"]=!0,h));return u?[a,_.default.createElement(w.default,(0,v.default)({key:"overlay",hasMask:!0,align:"cc cc",safeNode:e,disableScroll:d},i,{className:r,style:o,visible:n,onRequestClose:c}),_.default.createElement("div",{className:y},_.default.createElement("div",{className:s+"loading-indicator"},g),_.default.createElement("div",{className:s+"loading-tip-content"},t),_.default.createElement("div",{className:s+"loading-tip-placeholder"},t)))]:_.default.createElement("div",(0,v.default)({className:p,style:o},i),n?_.default.createElement("div",{className:y},_.default.createElement("div",{className:s+"loading-indicator"},g),_.default.createElement("div",{className:s+"loading-tip-content"},t),_.default.createElement("div",{className:s+"loading-tip-placeholder"},t)):null,_.default.createElement("div",{className:l},n?_.default.createElement("div",{className:s+"loading-masker"}):null,a))},o=n=k,n.propTypes=(0,v.default)({},l.default.propTypes,{prefix:i.default.string,tip:i.default.any,tipAlign:i.default.oneOf(["right","bottom"]),visible:i.default.bool,onVisibleChange:i.default.func,className:i.default.string,style:i.default.object,size:i.default.oneOf(["large","medium"]),indicator:i.default.any,color:i.default.string,fullScreen:i.default.bool,disableScroll:i.default.bool,safeNode:i.default.any,children:i.default.any,inline:i.default.bool,rtl:i.default.bool}),n.defaultProps={prefix:"next-",visible:!0,onVisibleChange:M.func.noop,animate:null,tipAlign:"bottom",size:"large",inline:!0,disableScroll:!1};var u,i=o;function k(){return(0,a.default)(this,k),(0,r.default)(this,u.apply(this,arguments))}i.displayName="Loading",t.default=l.default.config(i),e.exports=t.default},function(e,t,n){"use strict";n(75),n(51),n(32),n(43),n(541)},function(e,t,n){"use strict";n(43),n(542)},function(M,e,t){"use strict";t.d(e,"a",function(){return a}),t.d(e,"b",function(){return B});var x=t(0),C=t.n(x),d=C.a.createContext(null);function s(){return n}var n=function(e){e()};var r={notify:function(){},get:function(){return[]}};function L(t,n){var o,i=r;function l(){e.onStateChange&&e.onStateChange()}function a(){var e,a,r;o||(o=n?n.addNestedSub(l):t.subscribe(l),e=s(),r=a=null,i={clear:function(){r=a=null},notify:function(){e(function(){for(var e=a;e;)e.callback(),e=e.next})},get:function(){for(var e=[],t=a;t;)e.push(t),t=t.next;return e},subscribe:function(e){var t=!0,n=r={callback:e,next:null,prev:r};return n.prev?n.prev.next=n:a=n,function(){t&&null!==a&&(t=!1,n.next?n.next.prev=n.prev:r=n.prev,n.prev?n.prev.next=n.next:a=n.next)}}})}var e={addNestedSub:function(e){return a(),i.subscribe(e)},notifyNestedSubs:function(){i.notify()},handleChangeWrapper:l,isSubscribed:function(){return Boolean(o)},trySubscribe:a,tryUnsubscribe:function(){o&&(o(),o=void 0,i.clear(),i=r)},getListeners:function(){return i}};return e}var o="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?x.useLayoutEffect:x.useEffect;var a=function(e){var t=e.store,n=e.context,e=e.children,a=Object(x.useMemo)(function(){var e=L(t);return{store:t,subscription:e}},[t]),r=Object(x.useMemo)(function(){return t.getState()},[t]),n=(o(function(){var e=a.subscription;return e.onStateChange=e.notifyNestedSubs,e.trySubscribe(),r!==t.getState()&&e.notifyNestedSubs(),function(){e.tryUnsubscribe(),e.onStateChange=null}},[a,r]),n||d);return C.a.createElement(n.Provider,{value:a},e)},T=t(42),D=t(54),e=t(100),c=t.n(e),O=t(412),f=["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"],N=["reactReduxForwardedRef"],P=[],j=[null,null];function Y(e,t){e=e[1];return[t.payload,e+1]}function I(e,t,n){o(function(){return e.apply(void 0,t)},n)}function R(e,t,n,a,r,o,i){e.current=a,t.current=r,n.current=!1,o.current&&(o.current=null,i())}function A(e,a,t,r,o,i,l,s,u,d){var c,f;if(e)return c=!1,f=null,e=function(){if(!c){var e,t,n=a.getState();try{e=r(n,o.current)}catch(e){f=t=e}t||(f=null),e===i.current?l.current||u():(i.current=e,s.current=e,l.current=!0,d({type:"STORE_UPDATED",payload:{error:t}}))}},t.onStateChange=e,t.trySubscribe(),e(),function(){if(c=!0,t.tryUnsubscribe(),t.onStateChange=null,f)throw f}}var H=function(){return[null,0]};function i(k,e){var e=e=void 0===e?{}:e,t=e.getDisplayName,r=void 0===t?function(e){return"ConnectAdvanced("+e+")"}:t,t=e.methodName,o=void 0===t?"connectAdvanced":t,t=e.renderCountProp,i=void 0===t?void 0:t,t=e.shouldHandleStateChanges,S=void 0===t||t,t=e.storeKey,l=void 0===t?"store":t,t=(e.withRef,e.forwardRef),s=void 0!==t&&t,t=e.context,t=void 0===t?d:t,u=Object(D.a)(e,f),E=t;return function(b){var e=b.displayName||b.name||"Component",t=r(e),w=Object(T.a)({},u,{getDisplayName:r,methodName:o,renderCountProp:i,shouldHandleStateChanges:S,storeKey:l,displayName:t,wrappedComponentName:e,WrappedComponent:b}),e=u.pure;var M=e?x.useMemo:function(e){return e()};function n(n){var e=Object(x.useMemo)(function(){var e=n.reactReduxForwardedRef,t=Object(D.a)(n,N);return[n.context,e,t]},[n]),t=e[0],a=e[1],r=e[2],o=Object(x.useMemo)(function(){return t&&t.Consumer&&Object(O.isContextConsumer)(C.a.createElement(t.Consumer,null))?t:E},[t,E]),i=Object(x.useContext)(o),l=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch),s=(Boolean(i)&&Boolean(i.store),(l?n:i).store),u=Object(x.useMemo)(function(){return k(s.dispatch,w)},[s]),e=Object(x.useMemo)(function(){if(!S)return j;var e=L(s,l?null:i.subscription),t=e.notifyNestedSubs.bind(e);return[e,t]},[s,l,i]),d=e[0],e=e[1],c=Object(x.useMemo)(function(){return l?i:Object(T.a)({},i,{subscription:d})},[l,i,d]),f=Object(x.useReducer)(Y,P,H),p=f[0][0],f=f[1];if(p&&p.error)throw p.error;var h=Object(x.useRef)(),m=Object(x.useRef)(r),g=Object(x.useRef)(),y=Object(x.useRef)(!1),v=M(function(){return g.current&&r===m.current?g.current:u(s.getState(),r)},[s,p,r]),_=(I(R,[m,h,y,r,v,g,e]),I(A,[S,s,d,u,m,h,y,g,e,f],[s,d,u]),Object(x.useMemo)(function(){return C.a.createElement(b,Object(T.a)({},v,{ref:a}))},[a,b,v]));return Object(x.useMemo)(function(){return S?C.a.createElement(o.Provider,{value:c},_):_},[o,_,c])}var a=e?C.a.memo(n):n;return a.WrappedComponent=b,a.displayName=n.displayName=t,s?((e=C.a.forwardRef(function(e,t){return C.a.createElement(a,Object(T.a)({},e,{reactReduxForwardedRef:t}))})).displayName=t,e.WrappedComponent=b,c()(e,b)):c()(a,b)}}function l(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function m(e,t){if(!l(e,t)){if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var r=0;re?t.splice(e,t.length-e,n):t.push(n),i({action:"PUSH",location:n,index:e,entries:t}))})},replace:function(e,t){var n=O(e,t,l(),u.location);o.confirmTransitionTo(n,"REPLACE",a,function(e){e&&i({action:"REPLACE",location:u.entries[u.index]=n})})},go:s,goBack:function(){s(-1)},goForward:function(){s(1)},canGo:function(e){return 0<=(e=u.index+e)&&ex',"Tag"),"readonly"!==n&&"interactive"!==n||r.log.warning("Warning: [ shape="+n+" ] is deprecated at [ Tag ]"),"secondary"===a&&r.log.warning("Warning: [ type=secondary ] is deprecated at [ Tag ]"),["count","marked","value","onChange"].forEach(function(e){e in t&&r.log.warning("Warning: [ "+e+" ] is deprecated at [ Tag ]")}),("selected"in t||"defaultSelected"in t)&&r.log.warning("Warning: [ selected|defaultSelected ] is deprecated at [ Tag ], use [ checked|defaultChecked ] at [ Tag.Selectable ] instead of it"),"closed"in t&&r.log.warning("Warning: [ closed ] is deprecated at [ Tag ], use [ onClose ] at [ Tag.Closeable ] instead of it"),"onSelect"in t&&e("onSelect","","Tag"),"afterClose"in t&&r.log.warning("Warning: [ afterClose ] is deprecated at [ Tag ], use [ afterClose ] at [ Tag.Closeable ] instead of it"),t}});o.Group=a.default.config(i.default),o.Selectable=a.default.config(l.default),o.Closable=a.default.config(n.default),o.Closeable=o.Closable,t.default=o,e.exports=t.default},function(e,t,n){"use strict";n(70),n(447)},function(e,t){e=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(e,t){e=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=e)},function(e,t,n){e.exports=!n(108)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";t.__esModule=!0;var a=o(n(344)),r=o(n(526)),n=o(n(527));function o(e){return e&&e.__esModule?e:{default:e}}a.default.Expand=r.default,a.default.OverlayAnimate=n.default,t.default=a.default,e.exports=t.default},function(e,t,n){"use strict";n(43),n(70),n(125),n(109),n(538)},function(e,t,n){"use strict";n.d(t,"a",function(){return r});function v(e,t){return"function"==typeof e?e(t):e}function _(e,t){return"string"==typeof e?Object(d.c)(e,null,null,t):e}function u(e){return e}var b=n(40),a=n(58),t=n(0),w=n.n(t),d=n(55),M=n(42),k=n(54),S=n(57),r=(w.a.Component,function(r){function e(){for(var e,t=arguments.length,n=new Array(t),a=0;athis.menuNode.clientHeight&&(this.menuNode.clientHeight+this.menuNode.scrollTop<(e=this.itemNode.offsetTop+this.itemNode.offsetHeight)?this.menuNode.scrollTop=e-this.menuNode.clientHeight:this.itemNode.offsetTop"===(d=e.charAt(o+1))){r+="(",o++,0[0-9][0-9][0-9][0-9])-(?[0-9][0-9]?)-(?[0-9][0-9]?)(?:(?:[Tt]|[ \t]+)(?[0-9][0-9]?):(?[0-9][0-9]):(?[0-9][0-9])(?:.(?[0-9]*))?(?:[ \t]*(?Z|(?[-+])(?[0-9][0-9]?)(?::(?[0-9][0-9]))?))?)?$","i"),r.LOCAL_TIMEZONE_OFFSET=60*(new Date).getTimezoneOffset()*1e3,r.trim=function(e,t){var n,a;return null==(n=this.REGEX_LEFT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_LEFT_TRIM_BY_CHAR[t]=n=new RegExp("^"+t+t+"*")),n.lastIndex=0,null==(a=this.REGEX_RIGHT_TRIM_BY_CHAR[t])&&(this.REGEX_RIGHT_TRIM_BY_CHAR[t]=a=new RegExp(t+""+t+"*$")),a.lastIndex=0,e.replace(n,"").replace(a,"")},r.ltrim=function(e,t){var n;return null==(n=this.REGEX_LEFT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_LEFT_TRIM_BY_CHAR[t]=n=new RegExp("^"+t+t+"*")),n.lastIndex=0,e.replace(n,"")},r.rtrim=function(e,t){var n;return null==(n=this.REGEX_RIGHT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_RIGHT_TRIM_BY_CHAR[t]=n=new RegExp(t+""+t+"*$")),n.lastIndex=0,e.replace(n,"")},r.isEmpty=function(e){return!e||""===e||"0"===e||e instanceof Array&&0===e.length||this.isEmptyObject(e)},r.isEmptyObject=function(t){var n;return t instanceof Object&&0===function(){var e=[];for(n in t)a.call(t,n)&&e.push(n);return e}().length},r.subStrCount=function(e,t,n,a){var r,o,i,l,s=0;for(e=""+e,t=""+t,null!=n&&(e=e.slice(n)),n=(e=null!=a?e.slice(0,a):e).length,l=t.length,r=o=0,i=n;0<=i?o>6)+t(128|63&e):e<65536?t(224|e>>12)+t(128|e>>6&63)+t(128|63&e):t(240|e>>18)+t(128|e>>12&63)+t(128|e>>6&63)+t(128|63&e)},r.parseBoolean=function(e,t){var n;return null==t&&(t=!0),"string"==typeof e?(n=e.toLowerCase(),!(!t&&"no"===n)&&("0"!==n&&("false"!==n&&""!==n))):!!e},r.isNumeric=function(e){return this.REGEX_SPACES.lastIndex=0,"number"==typeof e||"string"==typeof e&&!isNaN(e)&&""!==e.replace(this.REGEX_SPACES,"")},r.stringToDate=function(e){var t,n,a,r,o,i,l,s,u;if(null==e||!e.length)return null;if(!(e=this.PATTERN_DATE.exec(e)))return null;if(u=parseInt(e.year,10),i=parseInt(e.month,10)-1,n=parseInt(e.day,10),null==e.hour)return t=new Date(Date.UTC(u,i,n));if(r=parseInt(e.hour,10),o=parseInt(e.minute,10),l=parseInt(e.second,10),null!=e.fraction){for(a=e.fraction.slice(0,3);a.length<3;)a+="0";a=parseInt(a,10)}else a=0;return null!=e.tz&&(s=6e4*(60*parseInt(e.tz_hour,10)+(null!=e.tz_minute?parseInt(e.tz_minute,10):0)),"-"===e.tz_sign&&(s*=-1)),t=new Date(Date.UTC(u,i,n,r,o,l,a)),s&&t.setTime(t.getTime()-s),t},r.strRepeat=function(e,t){for(var n="",a=0;ae.length)&&(t=e.length);for(var n=0,a=new Array(t);ndocument.F=Object<\/script>"),e.close(),u=e.F;t--;)delete u[s][i[t]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[s]=r(e),n=new a,a[s]=null,n[l]=e):n=u(),void 0===t?n:o(n,t)}},function(e,t,n){var a=n(84).f,r=n(85),o=n(95)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&a(e,o,{configurable:!0,value:t})}},function(e,t,n){t.f=n(95)},function(e,t,n){var a=n(76),r=n(77),o=n(121),i=n(153),l=n(84).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=!o&&a.Symbol||{});"_"==e.charAt(0)||e in t||l(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";t.__esModule=!0;var a=d(n(205)),r=d(n(501)),o=d(n(502)),i=d(n(503)),l=d(n(504)),s=d(n(505)),u=d(n(506));function d(e){return e&&e.__esModule?e:{default:e}}n(507),a.default.extend(s.default),a.default.extend(l.default),a.default.extend(r.default),a.default.extend(o.default),a.default.extend(i.default),a.default.extend(u.default),a.default.locale("zh-cn");n=a.default;n.isSelf=a.default.isDayjs,a.default.localeData(),t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var v=c(n(2)),o=c(n(4)),i=c(n(5)),a=c(n(6)),r=n(0),_=c(r),l=c(n(3)),s=n(30),b=c(n(13)),u=c(n(44)),w=c(n(24)),M=c(n(79)),d=c(n(8)),k=n(11);function c(e){return e&&e.__esModule?e:{default:e}}function f(){}p=r.Component,(0,a.default)(S,p),S.getDerivedStateFromProps=function(e){return"visible"in e?{visible:e.visible}:{}},S.prototype.render=function(){var e,t=this.props,n=t.prefix,a=(t.pure,t.className),r=t.style,o=t.type,i=t.shape,l=t.size,s=t.title,u=t.children,d=(t.defaultVisible,t.visible,t.iconType),c=t.closeable,f=(t.onClose,t.afterClose),p=t.animation,h=t.rtl,t=t.locale,m=(0,v.default)({},k.obj.pickOthers(Object.keys(S.propTypes),this.props)),g=this.state.visible,y=n+"message",o=(0,b.default)(((e={})[y]=!0,e[n+"message-"+o]=o,e[""+n+i]=i,e[""+n+l]=l,e[n+"title-content"]=!!s,e[n+"only-content"]=!s&&!!u,e[a]=a,e)),i=g?_.default.createElement("div",(0,v.default)({role:"alert",style:r},m,{className:o,dir:h?"rtl":void 0}),c?_.default.createElement("a",{role:"button","aria-label":t.closeAriaLabel,className:y+"-close",onClick:this.onClose},_.default.createElement(w.default,{type:"close"})):null,!1!==d?_.default.createElement(w.default,{className:y+"-symbol "+(!d&&y+"-symbol-icon"),type:d}):null,s?_.default.createElement("div",{className:y+"-title"},s):null,u?_.default.createElement("div",{className:y+"-content"},u):null):null;return p?_.default.createElement(M.default.Expand,{animationAppear:!1,afterLeave:f},i):i},r=n=S,n.propTypes={prefix:l.default.string,pure:l.default.bool,className:l.default.string,style:l.default.object,type:l.default.oneOf(["success","warning","error","notice","help","loading"]),shape:l.default.oneOf(["inline","addon","toast"]),size:l.default.oneOf(["medium","large"]),title:l.default.node,children:l.default.node,defaultVisible:l.default.bool,visible:l.default.bool,iconType:l.default.oneOfType([l.default.string,l.default.bool]),closeable:l.default.bool,onClose:l.default.func,afterClose:l.default.func,animation:l.default.bool,locale:l.default.object,rtl:l.default.bool},n.defaultProps={prefix:"next-",pure:!1,type:"success",shape:"inline",size:"medium",defaultVisible:!0,closeable:!1,onClose:f,afterClose:f,animation:!0,locale:u.default.Message};var p,a=r;function S(){var e,t;(0,o.default)(this,S);for(var n=arguments.length,a=Array(n),r=0;r=n.length?(s=!!(c=h(o,u)))&&"get"in c&&!("originalValue"in c.get)?c.get:o[u]:(s=_(o,u),o[u]),s&&!i&&(y[d]=o)}}return o}},function(e,t,n){"use strict";n=n(604);e.exports=Function.prototype.bind||n},function(e,t,n){"use strict";var a=String.prototype.replace,r=/%20/g,o="RFC1738",i="RFC3986";e.exports={default:i,formatters:{RFC1738:function(e){return a.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:o,RFC3986:i}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var d=s(n(2)),a=s(n(4)),r=s(n(5)),o=s(n(6)),c=n(0),f=s(c),i=s(n(3)),p=s(n(13)),h=s(n(24)),l=n(11),m=s(n(98));function s(e){return e&&e.__esModule?e:{default:e}}var u,g=l.func.bindCtx,y=l.obj.pickOthers,i=(u=c.Component,(0,o.default)(v,u),v.prototype.getSelected=function(){var e=this.props,t=e._key,n=e.root,e=e.selected,a=n.props.selectMode,n=n.state.selectedKeys;return e||!!a&&-1e.length&&e.every(function(e,t){return e===n[t]})},t.isAvailablePos=function(e,t,n){var n=n[t],a=n.type,n=n.disabled;return r(e,t)&&("item"===a&&!n||"submenu"===a)});t.getFirstAvaliablelChildKey=function(t,n){var e=Object.keys(n).find(function(e){return a(t+"-0",e,n)});return e?n[e].key:null},t.getChildSelected=function(e){var t=e.selectMode,n=e.selectedKeys,a=e._k2n,e=e._key;if(!a)return!1;var r=(a[e]&&a[e].pos)+"-";return!!t&&n.some(function(e){return a[e]&&0===a[e].pos.indexOf(r)})}},function(e,t,n){"use strict";n(43),n(32),n(626)},function(e,t,n){var o=n(639),i=Object.prototype.hasOwnProperty;function l(e){return Array.isArray(e)?"array":typeof e}function s(e,t){var n,a=0,r=0;for(n in e)if(i.call(e,n)){if("style"===n){if(!o(e[n],t[n]))return!1}else if("children"!==n&&e[n]!==t[n])return!1;a++}for(n in t)i.call(t,n)&&r++;return a===r&&function e(t,n){var a=l(t);if(a!==l(n))return!1;switch(a){case"array":if(t.length!==n.length)return!1;for(var r=0;r=u,u=(0,O.default)(((u={})[n+"upload-inner"]=!0,u[n+"hidden"]=x,u)),C=this.props.children;if("card"===r&&(r=(0,O.default)(((r={})[n+"upload-card"]=!0,r[n+"disabled"]=s,r)),C=D.default.createElement("div",{className:r},D.default.createElement(P.default,{size:"large",type:"add",className:n+"upload-add-icon"}),D.default.createElement("div",{tabIndex:"0",role:"button",className:n+"upload-text"},C))),b)return"function"==typeof w?(b=(0,O.default)(((r={})[n+"form-preview"]=!0,r[o]=!!o,r)),D.default.createElement("div",{style:i,className:b},w(this.state.value,this.props))):t?D.default.createElement(Y.default,{isPreview:!0,listType:t,style:i,className:o,value:this.state.value}):null;n=s?N.func.prevent:p,r=N.obj.pickAttrsWith(this.props,"data-");return D.default.createElement("div",(0,L.default)({className:f,style:i},r),D.default.createElement(j.default,(0,L.default)({},e,{name:M,beforeUpload:c,dragable:a,disabled:s||x,className:u,onSelect:this.onSelect,onDrop:this.onDrop,onProgress:this.onProgress,onSuccess:this.onSuccess,onError:this.onError,ref:this.saveUploaderRef}),C),t||g?D.default.createElement(Y.default,{useDataURL:l,fileNameRender:k,actionRender:S,uploader:this,listType:t,value:this.state.value,closable:d,onRemove:n,progressProps:v,onCancel:h,onPreview:m,extraRender:y,rtl:_,previewOnFileName:E}):null)},i=u=h,u.displayName="Upload",u.propTypes=(0,L.default)({},d.default.propTypes,Y.default.propTypes,{prefix:l.default.string.isRequired,action:l.default.string,value:l.default.array,defaultValue:l.default.array,shape:l.default.oneOf(["card"]),listType:l.default.oneOf(["text","image","card"]),list:l.default.any,name:l.default.string,data:l.default.oneOfType([l.default.object,l.default.func]),formatter:l.default.func,limit:l.default.number,timeout:l.default.number,dragable:l.default.bool,closable:l.default.bool,useDataURL:l.default.bool,disabled:l.default.bool,onSelect:l.default.func,onProgress:l.default.func,onChange:l.default.func,onSuccess:l.default.func,afterSelect:l.default.func,onRemove:l.default.func,onError:l.default.func,beforeUpload:l.default.func,onDrop:l.default.func,className:l.default.string,style:l.default.object,children:l.default.node,autoUpload:l.default.bool,request:l.default.func,progressProps:l.default.object,rtl:l.default.bool,isPreview:l.default.bool,renderPreview:l.default.func,fileKeyName:l.default.string,fileNameRender:l.default.func,actionRender:l.default.func,previewOnFileName:l.default.bool}),u.defaultProps=(0,L.default)({},d.default.defaultProps,{prefix:"next-",limit:1/0,autoUpload:!0,closable:!0,onSelect:n,onProgress:n,onChange:n,onSuccess:n,onRemove:n,onError:n,onDrop:n,beforeUpload:n,afterSelect:n,previewOnFileName:!1}),a=function(){var u=this;this.onSelect=function(e){var t,n,a=u.props,r=a.autoUpload,o=a.afterSelect,i=a.onSelect,a=a.limit,l=u.state.value.length+e.length,s=a-u.state.value.length;s<=0||(t=e=e.map(function(e){e=(0,c.fileToObject)(e);return e.state="selected",e}),n=[],ai||l+a.width>o):t<0||e<0||t+a.height>u.height||e+a.width>u.width}function T(e,t,n,a){var r=a.overlayInfo,a=a.containerInfo,n=n.split("");return 1===n.length&&n.push(""),t<0&&(n=[n[0].replace("t","b"),n[1].replace("b","t")]),e<0&&(n=[n[0].replace("l","r"),n[1].replace("r","l")]),t+r.height>a.height&&(n=[n[0].replace("b","t"),n[1].replace("t","b")]),(n=e+r.width>a.width?[n[0].replace("r","l"),n[1].replace("l","r")]:n).join("")}function D(e,t,n){var a=n.overlayInfo,n=n.containerInfo;return(t=t<0?0:t)+a.height>n.height&&(t=n.height-a.height),{left:e=(e=e<0?0:e)+a.width>n.width?n.width-a.width:e,top:t}}function ve(e){var t=e.target,n=e.overlay,a=e.container,r=e.scrollNode,o=e.placement,i=e.placementOffset,i=void 0===i?0:i,l=e.points,l=void 0===l?["tl","bl"]:l,s=e.offset,s=void 0===s?[0,0]:s,u=e.position,u=void 0===u?"absolute":u,d=e.beforePosition,c=e.autoAdjust,c=void 0===c||c,f=e.autoHideScrollOverflow,f=void 0===f||f,e=e.rtl,p="offsetWidth"in(p=n)&&"offsetHeight"in p?{width:p.offsetWidth,height:p.offsetHeight}:{width:(p=p.getBoundingClientRect()).width,height:p.height},h=p.width,p=p.height;if("fixed"===u)return m={config:{placement:void 0,points:void 0},style:{position:u,left:s[0],top:s[1]}},d?d(m,{overlay:{node:n,width:h,height:p}}):m;var m=t.getBoundingClientRect(),g=m.width,y=m.height,v=m.left,_=m.top,m=x(a),b=m.left,m=m.top,w=a.scrollWidth,M=a.scrollHeight,k=a.scrollTop,S=a.scrollLeft,b={targetInfo:{width:g,height:y,left:v,top:_},containerInfo:{left:b,top:m,width:w,height:M,scrollTop:k,scrollLeft:S},overlayInfo:{width:h,height:p},points:l,placementOffset:i,offset:s,container:a,rtl:e},m=C(o,b),w=m.left,M=m.top,k=m.points,S=function(e){for(var t=e;t;){var n=fe(t,"overflow");if(null!=n&&n.match(/auto|scroll|hidden/))return t;t=t.parentNode}return document.documentElement}(a),E=(c&&o&&L(w,M,S,b)&&(o!==(l=T(w,M,o,b))&&(M=L(s=(i=C(l,b)).left,e=i.top,S,b)&&l!==(m=T(s,e,l,b))?(w=(c=D((a=C(o=m,b)).left,a.top,b)).left,c.top):(o=l,w=s,e)),w=(i=D(w,M,b)).left,M=i.top),{config:{placement:o,points:k},style:{position:u,left:Math.round(w),top:Math.round(M)}});return f&&o&&null!=r&&r.length&&r.forEach(function(e){var e=e.getBoundingClientRect(),t=e.top,n=e.left,a=e.width,e=e.height;E.style.display=_+y=e.length?{done:!0}:{done:!1,value:e[n++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);nt.clientHeight&&0")),"shouldUpdatePosition"in r&&(delete t.shouldUpdatePosition,d.log.warning("Warning: [ shouldUpdatePosition ] is deprecated at [ ]")),"minMargin"in r&&o("minMargin","top/bottom",""),"isFullScreen"in r&&(r.overFlowScroll=!r.isFullScreen,delete t.isFullScreen,o("isFullScreen","overFlowScroll","")),t;return["target","offset","beforeOpen","onOpen","afterOpen","beforePosition","onPosition","cache","safeNode","wrapperClassName","container"].forEach(function(e){var t,n,a;e in r&&(o(e,"overlayProps."+e,"Dialog"),t=(n=r).overlayProps,n=(0,l.default)(n,["overlayProps"]),a=(0,i.default)(((a={})[e]=r[e],a),t||{}),delete n[e],r=(0,i.default)({overlayProps:a},n))}),r}n.displayName="Dialog",n.Inner=p.default,n.show=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.show)(e)},n.alert=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.alert)(e)},n.confirm=function(e){return!1!==u.default.getContextProps(e,"Dialog").warning&&(e=v(e,d.log.deprecated)),(0,h.confirm)(e)},n.success=function(e){return(0,h.success)(e)},n.error=function(e){return(0,h.error)(e)},n.notice=function(e){return(0,h.notice)(e)},n.warning=function(e){return(0,h.warning)(e)},n.help=function(e){return(0,h.help)(e)},n.withContext=h.withContext,t.default=u.default.config(n,{transform:v}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var o=r(n(2)),i=r(n(12)),a=r(n(8)),l=r(n(576)),n=r(n(577));function r(e){return e&&e.__esModule?e:{default:e}}l.default.Group=n.default,t.default=a.default.config(l.default,{transform:function(e,t){var n,a,r;return"shape"in e&&(t("shape","text | warning | ghost","Button"),n=(t=e).shape,a=t.type,t=(0,i.default)(t,["shape","type"]),r=void 0,"ghost"===n&&(r={primary:"dark",secondary:"dark",normal:"light",dark:"dark",light:"light"}[a||l.default.defaultProps.type]),e=(0,o.default)({type:"light"===a||"dark"===a||"secondary"===a&&"warning"===n?"normal":a,ghost:r,text:"text"===n,warning:"warning"===n},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=v(n(2)),l=v(n(12)),a=v(n(8)),r=v(n(638)),o=v(n(643)),s=v(n(646)),u=v(n(647)),d=v(n(648)),c=v(n(649)),f=v(n(651)),p=v(n(652)),h=v(n(653)),m=v(n(656)),g=v(n(393)),y=v(n(394));function v(e){return e&&e.__esModule?e:{default:e}}var _=n(11).env.ieVersion,n=[s.default,f.default,u.default,d.default,c.default,o.default,h.default,m.default],b=n.reduce(function(e,t){return e=t(e)},r.default),n=(f.default._typeMark="lock",d.default._typeMark="expanded",s.default._typeMark="fixed",n.reduce(function(e,t){var n=!_;return e="lock"===t._typeMark?(n?(0,p.default):(0,f.default))(e):"expanded"===t._typeMark?n?(0,d.default)(e,!0):(0,d.default)(e):"fixed"===t._typeMark?n?(0,s.default)(e,!0):(0,s.default)(e):t(e)},r.default));b.Base=r.default,b.fixed=s.default,b.lock=f.default,b.selection=u.default,b.expanded=d.default,b.tree=o.default,b.virtual=c.default,b.list=h.default,b.sticky=m.default,b.GroupHeader=g.default,b.GroupFooter=y.default,b.StickyLock=a.default.config(n,{componentName:"Table"}),t.default=a.default.config(b,{componentName:"Table",transform:function(e,t){var n,a,r,o;return"expandedRowKeys"in e&&(t("expandedRowKeys","openRowKeys","Table"),o=(r=e).expandedRowKeys,r=(0,l.default)(r,["expandedRowKeys"]),e=(0,i.default)({openRowKeys:o},r)),"onExpandedChange"in e&&(t("onExpandedChange","onRowOpen","Table"),r=(o=e).onExpandedChange,o=(0,l.default)(o,["onExpandedChange"]),e=(0,i.default)({onRowOpen:r},o)),"isLoading"in e&&(t("isLoading","loading","Table"),o=(r=e).isLoading,r=(0,l.default)(r,["isLoading"]),e=(0,i.default)({loading:o},r)),"indentSize"in e&&(t("indentSize","indent","Table"),r=(o=e).indentSize,o=(0,l.default)(o,["indentSize"]),e=(0,i.default)({indent:r},o)),"optimization"in e&&(t("optimization","pure","Table"),o=(r=e).optimization,r=(0,l.default)(r,["optimization"]),e=(0,i.default)({pure:o},r)),"getRowClassName"in e&&(t("getRowClassName","getRowProps","Table"),n=(o=e).getRowClassName,a=o.getRowProps,r=(0,l.default)(o,["getRowClassName","getRowProps"]),e=n?(0,i.default)({getRowProps:function(){return(0,i.default)({className:n.apply(void 0,arguments)},a?a.apply(void 0,arguments):{})}},r):(0,i.default)({getRowProps:a},r)),"getRowProps"in e&&(t("getRowProps","rowProps","Table in 1.15.0"),r=(o=e).getRowProps,o=(0,l.default)(o,["getRowProps"]),e=(0,i.default)({rowProps:r},o)),"getCellProps"in e&&(t("getCellProps","cellProps","Table in 1.15.0"),o=(r=e).getCellProps,t=(0,l.default)(r,["getCellProps"]),e=(0,i.default)({cellProps:o},t)),e}}),e.exports=t.default},function(e,t,n){"use strict";n.d(t,"a",function(){return o});var a=n(90);function r(t,e){var n,a=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),a.push.apply(a,n)),a}function o(t){for(var e=1;e 16.8.0")},p.prototype.validate=function(e,t){this.validateCallback(e,t)},p.prototype.reset=function(e){var t=1","Select");t=s(e,t);return e.onInputUpdate&&(t.onSearch=e.onInputUpdate,t.showSearch=!0),t}}),t.default=a.default.config(r.default,{transform:s,exportNames:["focusInput","handleSearchClear"]}),e.exports=t.default},function(e,t,n){"use strict";function s(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function u(t){this.setState(function(e){return null!=(e=this.constructor.getDerivedStateFromProps(t,e))?e:null}.bind(this))}function d(e,t){try{var n=this.props,a=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,a)}finally{this.props=n,this.state=a}}function a(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"==typeof e.getDerivedStateFromProps||"function"==typeof t.getSnapshotBeforeUpdate){var n,a,r=null,o=null,i=null;if("function"==typeof t.componentWillMount?r="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(r="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?o="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(o="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?i="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(i="UNSAFE_componentWillUpdate"),null!==r||null!==o||null!==i)throw n=e.displayName||e.name,a="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()",Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+n+" uses "+a+" but also contains the following legacy lifecycles:"+(null!==r?"\n "+r:"")+(null!==o?"\n "+o:"")+(null!==i?"\n "+i:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks");if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=s,t.componentWillReceiveProps=u),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=d;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){n=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,n)}}}return e}n.r(t),n.d(t,"polyfill",function(){return a}),d.__suppressDeprecationWarning=u.__suppressDeprecationWarning=s.__suppressDeprecationWarning=!0},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var a=n(134);function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],a=!0,r=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(n.push(i.value),!t||n.length!==t);a=!0);}catch(e){r=!0,o=e}finally{try{a||null==l.return||l.return()}finally{if(r)throw o}}return n}}(e,t)||Object(a.a)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(e,t,n){"use strict";n(43),n(540)},function(e,t,n){"use strict";t.__esModule=!0;var v=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),_=s(n(0)),i=s(n(3)),b=s(n(13)),w=s(n(62)),l=s(n(8)),M=n(11);function s(e){return e&&e.__esModule?e:{default:e}}u=_.default.Component,(0,o.default)(k,u),k.prototype.render=function(){var e=this.props,t=e.tip,n=e.visible,a=e.children,r=e.className,o=e.style,i=e.indicator,l=e.color,s=e.prefix,u=e.fullScreen,d=e.disableScroll,c=e.onVisibleChange,f=e.tipAlign,p=e.size,h=e.inline,m=e.rtl,e=e.safeNode,g=null,y=s+"loading-dot",p=(g=i||(i=l,p=(0,b.default)(((l={})[s+"loading-fusion-reactor"]=!0,l[s+"loading-medium-fusion-reactor"]="medium"===p,l)),_.default.createElement("div",{className:p,dir:m?"rtl":void 0},_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}),_.default.createElement("span",{className:y,style:{backgroundColor:i}}))),(0,b.default)(((l={})[s+"loading"]=!0,l[s+"open"]=n,l[s+"loading-inline"]=h,l[r]=r,l))),y=(0,b.default)(((m={})[s+"loading-tip"]=!0,m[s+"loading-tip-fullscreen"]=u,m[s+"loading-right-tip"]="right"===f,m)),i=M.obj.pickOthers(k.propTypes,this.props),l=(0,b.default)(((h={})[s+"loading-component"]=n,h[s+"loading-wrap"]=!0,h));return u?[a,_.default.createElement(w.default,(0,v.default)({key:"overlay",hasMask:!0,align:"cc cc",safeNode:e,disableScroll:d},i,{className:r,style:o,visible:n,onRequestClose:c}),_.default.createElement("div",{className:y},_.default.createElement("div",{className:s+"loading-indicator"},g),_.default.createElement("div",{className:s+"loading-tip-content"},t),_.default.createElement("div",{className:s+"loading-tip-placeholder"},t)))]:_.default.createElement("div",(0,v.default)({className:p,style:o},i),n?_.default.createElement("div",{className:y},_.default.createElement("div",{className:s+"loading-indicator"},g),_.default.createElement("div",{className:s+"loading-tip-content"},t),_.default.createElement("div",{className:s+"loading-tip-placeholder"},t)):null,_.default.createElement("div",{className:l},n?_.default.createElement("div",{className:s+"loading-masker"}):null,a))},o=n=k,n.propTypes=(0,v.default)({},l.default.propTypes,{prefix:i.default.string,tip:i.default.any,tipAlign:i.default.oneOf(["right","bottom"]),visible:i.default.bool,onVisibleChange:i.default.func,className:i.default.string,style:i.default.object,size:i.default.oneOf(["large","medium"]),indicator:i.default.any,color:i.default.string,fullScreen:i.default.bool,disableScroll:i.default.bool,safeNode:i.default.any,children:i.default.any,inline:i.default.bool,rtl:i.default.bool}),n.defaultProps={prefix:"next-",visible:!0,onVisibleChange:M.func.noop,animate:null,tipAlign:"bottom",size:"large",inline:!0,disableScroll:!1};var u,i=o;function k(){return(0,a.default)(this,k),(0,r.default)(this,u.apply(this,arguments))}i.displayName="Loading",t.default=l.default.config(i),e.exports=t.default},function(e,t,n){"use strict";n(50);var a=n(26),r=n.n(a),o=n(72),a=n(137),a=n.n(a),i=n(415),l=n.n(i),s=n(47),u="Request error, please try again later!";function d(){var e=window.location.href,e=(localStorage.removeItem("token"),e.split("#")[0]);window.location.href="".concat(e,"#/login")}t.a=((i=a.a.create()).interceptors.request.use(function(e){var t=e.url,n=e.params,a=e.data,r=e.method,o=e.headers;if(n||(e.params={}),!t.includes("auth/users/login")&&localStorage.token){n={};try{n=JSON.parse(localStorage.token)}catch(e){console.log(e),d()}var i=n.accessToken,i=void 0===i?"":i,n=n.username,n=void 0===n?"":n;e.params.accessToken=i,t.includes("auth")||(e.params.username=n),e.headers=Object.assign({},o,{accessToken:i})}return a&&Object(s.d)(a)&&["post","put"].includes(r)&&(e.data=l.a.stringify(a),o||(e.headers={}),e.headers["Content-Type"]="application/x-www-form-urlencoded"),e},function(e){return Promise.reject(e)}),i.interceptors.response.use(function(e){var t=e.data;t.success,t.resultCode,t.resultMessage;return e.data},function(e){var t,n,a;return e.response?(t=void 0===(t=(n=e.response).data)?{}:t,n=n.status,a="HTTP ERROR: ".concat(n),"string"==typeof t?a=t:"object"===Object(o.a)(t)&&(a=t.message),r.a.error(a),[401,403].includes(n)&&["unknown user!","token invalid!","token expired!","session expired!"].includes(a)&&d(),Promise.reject(e.response)):(r.a.error(u),Promise.reject(e))}),i)},function(e,t,n){"use strict";n(76),n(50),n(32),n(43),n(541)},function(e,t,n){"use strict";n(43),n(542)},function(M,e,t){"use strict";t.d(e,"a",function(){return a}),t.d(e,"b",function(){return B});var x=t(0),C=t.n(x),d=C.a.createContext(null);function s(){return n}var n=function(e){e()};var r={notify:function(){},get:function(){return[]}};function L(t,n){var o,i=r;function l(){e.onStateChange&&e.onStateChange()}function a(){var e,a,r;o||(o=n?n.addNestedSub(l):t.subscribe(l),e=s(),r=a=null,i={clear:function(){r=a=null},notify:function(){e(function(){for(var e=a;e;)e.callback(),e=e.next})},get:function(){for(var e=[],t=a;t;)e.push(t),t=t.next;return e},subscribe:function(e){var t=!0,n=r={callback:e,next:null,prev:r};return n.prev?n.prev.next=n:a=n,function(){t&&null!==a&&(t=!1,n.next?n.next.prev=n.prev:r=n.prev,n.prev?n.prev.next=n.next:a=n.next)}}})}var e={addNestedSub:function(e){return a(),i.subscribe(e)},notifyNestedSubs:function(){i.notify()},handleChangeWrapper:l,isSubscribed:function(){return Boolean(o)},trySubscribe:a,tryUnsubscribe:function(){o&&(o(),o=void 0,i.clear(),i=r)},getListeners:function(){return i}};return e}var o="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?x.useLayoutEffect:x.useEffect;var a=function(e){var t=e.store,n=e.context,e=e.children,a=Object(x.useMemo)(function(){var e=L(t);return{store:t,subscription:e}},[t]),r=Object(x.useMemo)(function(){return t.getState()},[t]),n=(o(function(){var e=a.subscription;return e.onStateChange=e.notifyNestedSubs,e.trySubscribe(),r!==t.getState()&&e.notifyNestedSubs(),function(){e.tryUnsubscribe(),e.onStateChange=null}},[a,r]),n||d);return C.a.createElement(n.Provider,{value:a},e)},T=t(42),D=t(54),e=t(101),c=t.n(e),O=t(412),f=["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"],N=["reactReduxForwardedRef"],P=[],j=[null,null];function Y(e,t){e=e[1];return[t.payload,e+1]}function I(e,t,n){o(function(){return e.apply(void 0,t)},n)}function R(e,t,n,a,r,o,i){e.current=a,t.current=r,n.current=!1,o.current&&(o.current=null,i())}function A(e,a,t,r,o,i,l,s,u,d){var c,f;if(e)return c=!1,f=null,e=function(){if(!c){var e,t,n=a.getState();try{e=r(n,o.current)}catch(e){f=t=e}t||(f=null),e===i.current?l.current||u():(i.current=e,s.current=e,l.current=!0,d({type:"STORE_UPDATED",payload:{error:t}}))}},t.onStateChange=e,t.trySubscribe(),e(),function(){if(c=!0,t.tryUnsubscribe(),t.onStateChange=null,f)throw f}}var H=function(){return[null,0]};function i(k,e){var e=e=void 0===e?{}:e,t=e.getDisplayName,r=void 0===t?function(e){return"ConnectAdvanced("+e+")"}:t,t=e.methodName,o=void 0===t?"connectAdvanced":t,t=e.renderCountProp,i=void 0===t?void 0:t,t=e.shouldHandleStateChanges,S=void 0===t||t,t=e.storeKey,l=void 0===t?"store":t,t=(e.withRef,e.forwardRef),s=void 0!==t&&t,t=e.context,t=void 0===t?d:t,u=Object(D.a)(e,f),E=t;return function(b){var e=b.displayName||b.name||"Component",t=r(e),w=Object(T.a)({},u,{getDisplayName:r,methodName:o,renderCountProp:i,shouldHandleStateChanges:S,storeKey:l,displayName:t,wrappedComponentName:e,WrappedComponent:b}),e=u.pure;var M=e?x.useMemo:function(e){return e()};function n(n){var e=Object(x.useMemo)(function(){var e=n.reactReduxForwardedRef,t=Object(D.a)(n,N);return[n.context,e,t]},[n]),t=e[0],a=e[1],r=e[2],o=Object(x.useMemo)(function(){return t&&t.Consumer&&Object(O.isContextConsumer)(C.a.createElement(t.Consumer,null))?t:E},[t,E]),i=Object(x.useContext)(o),l=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch),s=(Boolean(i)&&Boolean(i.store),(l?n:i).store),u=Object(x.useMemo)(function(){return k(s.dispatch,w)},[s]),e=Object(x.useMemo)(function(){if(!S)return j;var e=L(s,l?null:i.subscription),t=e.notifyNestedSubs.bind(e);return[e,t]},[s,l,i]),d=e[0],e=e[1],c=Object(x.useMemo)(function(){return l?i:Object(T.a)({},i,{subscription:d})},[l,i,d]),f=Object(x.useReducer)(Y,P,H),p=f[0][0],f=f[1];if(p&&p.error)throw p.error;var h=Object(x.useRef)(),m=Object(x.useRef)(r),g=Object(x.useRef)(),y=Object(x.useRef)(!1),v=M(function(){return g.current&&r===m.current?g.current:u(s.getState(),r)},[s,p,r]),_=(I(R,[m,h,y,r,v,g,e]),I(A,[S,s,d,u,m,h,y,g,e,f],[s,d,u]),Object(x.useMemo)(function(){return C.a.createElement(b,Object(T.a)({},v,{ref:a}))},[a,b,v]));return Object(x.useMemo)(function(){return S?C.a.createElement(o.Provider,{value:c},_):_},[o,_,c])}var a=e?C.a.memo(n):n;return a.WrappedComponent=b,a.displayName=n.displayName=t,s?((e=C.a.forwardRef(function(e,t){return C.a.createElement(a,Object(T.a)({},e,{reactReduxForwardedRef:t}))})).displayName=t,e.WrappedComponent=b,c()(e,b)):c()(a,b)}}function l(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function m(e,t){if(!l(e,t)){if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var r=0;re?t.splice(e,t.length-e,n):t.push(n),i({action:"PUSH",location:n,index:e,entries:t}))})},replace:function(e,t){var n=O(e,t,l(),u.location);o.confirmTransitionTo(n,"REPLACE",a,function(e){e&&i({action:"REPLACE",location:u.entries[u.index]=n})})},go:s,goBack:function(){s(-1)},goForward:function(){s(1)},canGo:function(e){return 0<=(e=u.index+e)&&ex',"Tag"),"readonly"!==n&&"interactive"!==n||r.log.warning("Warning: [ shape="+n+" ] is deprecated at [ Tag ]"),"secondary"===a&&r.log.warning("Warning: [ type=secondary ] is deprecated at [ Tag ]"),["count","marked","value","onChange"].forEach(function(e){e in t&&r.log.warning("Warning: [ "+e+" ] is deprecated at [ Tag ]")}),("selected"in t||"defaultSelected"in t)&&r.log.warning("Warning: [ selected|defaultSelected ] is deprecated at [ Tag ], use [ checked|defaultChecked ] at [ Tag.Selectable ] instead of it"),"closed"in t&&r.log.warning("Warning: [ closed ] is deprecated at [ Tag ], use [ onClose ] at [ Tag.Closeable ] instead of it"),"onSelect"in t&&e("onSelect","","Tag"),"afterClose"in t&&r.log.warning("Warning: [ afterClose ] is deprecated at [ Tag ], use [ afterClose ] at [ Tag.Closeable ] instead of it"),t}});o.Group=a.default.config(i.default),o.Selectable=a.default.config(l.default),o.Closable=a.default.config(n.default),o.Closeable=o.Closable,t.default=o,e.exports=t.default},function(e,t,n){"use strict";n(70),n(447)},function(e,t){e=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(e,t){e=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=e)},function(e,t,n){e.exports=!n(108)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";t.__esModule=!0;var a=o(n(344)),r=o(n(526)),n=o(n(527));function o(e){return e&&e.__esModule?e:{default:e}}a.default.Expand=r.default,a.default.OverlayAnimate=n.default,t.default=a.default,e.exports=t.default},function(e,t,n){"use strict";n(43),n(70),n(126),n(109),n(538)},function(e,t,n){"use strict";n.d(t,"a",function(){return r});function v(e,t){return"function"==typeof e?e(t):e}function _(e,t){return"string"==typeof e?Object(d.c)(e,null,null,t):e}function u(e){return e}var b=n(40),a=n(58),t=n(0),w=n.n(t),d=n(55),M=n(42),k=n(54),S=n(57),r=(w.a.Component,function(r){function e(){for(var e,t=arguments.length,n=new Array(t),a=0;athis.menuNode.clientHeight&&(this.menuNode.clientHeight+this.menuNode.scrollTop<(e=this.itemNode.offsetTop+this.itemNode.offsetHeight)?this.menuNode.scrollTop=e-this.menuNode.clientHeight:this.itemNode.offsetTop"===(d=e.charAt(o+1))){r+="(",o++,0[0-9][0-9][0-9][0-9])-(?[0-9][0-9]?)-(?[0-9][0-9]?)(?:(?:[Tt]|[ \t]+)(?[0-9][0-9]?):(?[0-9][0-9]):(?[0-9][0-9])(?:.(?[0-9]*))?(?:[ \t]*(?Z|(?[-+])(?[0-9][0-9]?)(?::(?[0-9][0-9]))?))?)?$","i"),r.LOCAL_TIMEZONE_OFFSET=60*(new Date).getTimezoneOffset()*1e3,r.trim=function(e,t){var n,a;return null==(n=this.REGEX_LEFT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_LEFT_TRIM_BY_CHAR[t]=n=new RegExp("^"+t+t+"*")),n.lastIndex=0,null==(a=this.REGEX_RIGHT_TRIM_BY_CHAR[t])&&(this.REGEX_RIGHT_TRIM_BY_CHAR[t]=a=new RegExp(t+""+t+"*$")),a.lastIndex=0,e.replace(n,"").replace(a,"")},r.ltrim=function(e,t){var n;return null==(n=this.REGEX_LEFT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_LEFT_TRIM_BY_CHAR[t]=n=new RegExp("^"+t+t+"*")),n.lastIndex=0,e.replace(n,"")},r.rtrim=function(e,t){var n;return null==(n=this.REGEX_RIGHT_TRIM_BY_CHAR[t=null==t?"\\s":t])&&(this.REGEX_RIGHT_TRIM_BY_CHAR[t]=n=new RegExp(t+""+t+"*$")),n.lastIndex=0,e.replace(n,"")},r.isEmpty=function(e){return!e||""===e||"0"===e||e instanceof Array&&0===e.length||this.isEmptyObject(e)},r.isEmptyObject=function(t){var n;return t instanceof Object&&0===function(){var e=[];for(n in t)a.call(t,n)&&e.push(n);return e}().length},r.subStrCount=function(e,t,n,a){var r,o,i,l,s=0;for(e=""+e,t=""+t,null!=n&&(e=e.slice(n)),n=(e=null!=a?e.slice(0,a):e).length,l=t.length,r=o=0,i=n;0<=i?o>6)+t(128|63&e):e<65536?t(224|e>>12)+t(128|e>>6&63)+t(128|63&e):t(240|e>>18)+t(128|e>>12&63)+t(128|e>>6&63)+t(128|63&e)},r.parseBoolean=function(e,t){var n;return null==t&&(t=!0),"string"==typeof e?(n=e.toLowerCase(),!(!t&&"no"===n)&&("0"!==n&&("false"!==n&&""!==n))):!!e},r.isNumeric=function(e){return this.REGEX_SPACES.lastIndex=0,"number"==typeof e||"string"==typeof e&&!isNaN(e)&&""!==e.replace(this.REGEX_SPACES,"")},r.stringToDate=function(e){var t,n,a,r,o,i,l,s,u;if(null==e||!e.length)return null;if(!(e=this.PATTERN_DATE.exec(e)))return null;if(u=parseInt(e.year,10),i=parseInt(e.month,10)-1,n=parseInt(e.day,10),null==e.hour)return t=new Date(Date.UTC(u,i,n));if(r=parseInt(e.hour,10),o=parseInt(e.minute,10),l=parseInt(e.second,10),null!=e.fraction){for(a=e.fraction.slice(0,3);a.length<3;)a+="0";a=parseInt(a,10)}else a=0;return null!=e.tz&&(s=6e4*(60*parseInt(e.tz_hour,10)+(null!=e.tz_minute?parseInt(e.tz_minute,10):0)),"-"===e.tz_sign&&(s*=-1)),t=new Date(Date.UTC(u,i,n,r,o,l,a)),s&&t.setTime(t.getTime()-s),t},r.strRepeat=function(e,t){for(var n="",a=0;ae.length)&&(t=e.length);for(var n=0,a=new Array(t);ndocument.F=Object<\/script>"),e.close(),u=e.F;t--;)delete u[s][i[t]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[s]=r(e),n=new a,a[s]=null,n[l]=e):n=u(),void 0===t?n:o(n,t)}},function(e,t,n){var a=n(85).f,r=n(86),o=n(96)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&a(e,o,{configurable:!0,value:t})}},function(e,t,n){t.f=n(96)},function(e,t,n){var a=n(77),r=n(78),o=n(122),i=n(153),l=n(85).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=!o&&a.Symbol||{});"_"==e.charAt(0)||e in t||l(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";t.__esModule=!0;var a=d(n(205)),r=d(n(501)),o=d(n(502)),i=d(n(503)),l=d(n(504)),s=d(n(505)),u=d(n(506));function d(e){return e&&e.__esModule?e:{default:e}}n(507),a.default.extend(s.default),a.default.extend(l.default),a.default.extend(r.default),a.default.extend(o.default),a.default.extend(i.default),a.default.extend(u.default),a.default.locale("zh-cn");n=a.default;n.isSelf=a.default.isDayjs,a.default.localeData(),t.default=n,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var v=c(n(2)),o=c(n(4)),i=c(n(6)),a=c(n(7)),r=n(0),_=c(r),l=c(n(3)),s=n(30),b=c(n(13)),u=c(n(44)),w=c(n(24)),M=c(n(80)),d=c(n(8)),k=n(11);function c(e){return e&&e.__esModule?e:{default:e}}function f(){}p=r.Component,(0,a.default)(S,p),S.getDerivedStateFromProps=function(e){return"visible"in e?{visible:e.visible}:{}},S.prototype.render=function(){var e,t=this.props,n=t.prefix,a=(t.pure,t.className),r=t.style,o=t.type,i=t.shape,l=t.size,s=t.title,u=t.children,d=(t.defaultVisible,t.visible,t.iconType),c=t.closeable,f=(t.onClose,t.afterClose),p=t.animation,h=t.rtl,t=t.locale,m=(0,v.default)({},k.obj.pickOthers(Object.keys(S.propTypes),this.props)),g=this.state.visible,y=n+"message",o=(0,b.default)(((e={})[y]=!0,e[n+"message-"+o]=o,e[""+n+i]=i,e[""+n+l]=l,e[n+"title-content"]=!!s,e[n+"only-content"]=!s&&!!u,e[a]=a,e)),i=g?_.default.createElement("div",(0,v.default)({role:"alert",style:r},m,{className:o,dir:h?"rtl":void 0}),c?_.default.createElement("a",{role:"button","aria-label":t.closeAriaLabel,className:y+"-close",onClick:this.onClose},_.default.createElement(w.default,{type:"close"})):null,!1!==d?_.default.createElement(w.default,{className:y+"-symbol "+(!d&&y+"-symbol-icon"),type:d}):null,s?_.default.createElement("div",{className:y+"-title"},s):null,u?_.default.createElement("div",{className:y+"-content"},u):null):null;return p?_.default.createElement(M.default.Expand,{animationAppear:!1,afterLeave:f},i):i},r=n=S,n.propTypes={prefix:l.default.string,pure:l.default.bool,className:l.default.string,style:l.default.object,type:l.default.oneOf(["success","warning","error","notice","help","loading"]),shape:l.default.oneOf(["inline","addon","toast"]),size:l.default.oneOf(["medium","large"]),title:l.default.node,children:l.default.node,defaultVisible:l.default.bool,visible:l.default.bool,iconType:l.default.oneOfType([l.default.string,l.default.bool]),closeable:l.default.bool,onClose:l.default.func,afterClose:l.default.func,animation:l.default.bool,locale:l.default.object,rtl:l.default.bool},n.defaultProps={prefix:"next-",pure:!1,type:"success",shape:"inline",size:"medium",defaultVisible:!0,closeable:!1,onClose:f,afterClose:f,animation:!0,locale:u.default.Message};var p,a=r;function S(){var e,t;(0,o.default)(this,S);for(var n=arguments.length,a=Array(n),r=0;r=n.length?(s=!!(c=h(o,u)))&&"get"in c&&!("originalValue"in c.get)?c.get:o[u]:(s=_(o,u),o[u]),s&&!i&&(y[d]=o)}}return o}},function(e,t,n){"use strict";n=n(604);e.exports=Function.prototype.bind||n},function(e,t,n){"use strict";var a=String.prototype.replace,r=/%20/g,o="RFC1738",i="RFC3986";e.exports={default:i,formatters:{RFC1738:function(e){return a.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:o,RFC3986:i}},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var d=s(n(2)),a=s(n(4)),r=s(n(6)),o=s(n(7)),c=n(0),f=s(c),i=s(n(3)),p=s(n(13)),h=s(n(24)),l=n(11),m=s(n(99));function s(e){return e&&e.__esModule?e:{default:e}}var u,g=l.func.bindCtx,y=l.obj.pickOthers,i=(u=c.Component,(0,o.default)(v,u),v.prototype.getSelected=function(){var e=this.props,t=e._key,n=e.root,e=e.selected,a=n.props.selectMode,n=n.state.selectedKeys;return e||!!a&&-1e.length&&e.every(function(e,t){return e===n[t]})},t.isAvailablePos=function(e,t,n){var n=n[t],a=n.type,n=n.disabled;return r(e,t)&&("item"===a&&!n||"submenu"===a)});t.getFirstAvaliablelChildKey=function(t,n){var e=Object.keys(n).find(function(e){return a(t+"-0",e,n)});return e?n[e].key:null},t.getChildSelected=function(e){var t=e.selectMode,n=e.selectedKeys,a=e._k2n,e=e._key;if(!a)return!1;var r=(a[e]&&a[e].pos)+"-";return!!t&&n.some(function(e){return a[e]&&0===a[e].pos.indexOf(r)})}},function(e,t,n){"use strict";n(43),n(32),n(626)},function(e,t,n){var o=n(639),i=Object.prototype.hasOwnProperty;function l(e){return Array.isArray(e)?"array":typeof e}function s(e,t){var n,a=0,r=0;for(n in e)if(i.call(e,n)){if("style"===n){if(!o(e[n],t[n]))return!1}else if("children"!==n&&e[n]!==t[n])return!1;a++}for(n in t)i.call(t,n)&&r++;return a===r&&function e(t,n){var a=l(t);if(a!==l(n))return!1;switch(a){case"array":if(t.length!==n.length)return!1;for(var r=0;r=u,u=(0,O.default)(((u={})[n+"upload-inner"]=!0,u[n+"hidden"]=x,u)),C=this.props.children;if("card"===r&&(r=(0,O.default)(((r={})[n+"upload-card"]=!0,r[n+"disabled"]=s,r)),C=D.default.createElement("div",{className:r},D.default.createElement(P.default,{size:"large",type:"add",className:n+"upload-add-icon"}),D.default.createElement("div",{tabIndex:"0",role:"button",className:n+"upload-text"},C))),b)return"function"==typeof w?(b=(0,O.default)(((r={})[n+"form-preview"]=!0,r[o]=!!o,r)),D.default.createElement("div",{style:i,className:b},w(this.state.value,this.props))):t?D.default.createElement(Y.default,{isPreview:!0,listType:t,style:i,className:o,value:this.state.value}):null;n=s?N.func.prevent:p,r=N.obj.pickAttrsWith(this.props,"data-");return D.default.createElement("div",(0,L.default)({className:f,style:i},r),D.default.createElement(j.default,(0,L.default)({},e,{name:M,beforeUpload:c,dragable:a,disabled:s||x,className:u,onSelect:this.onSelect,onDrop:this.onDrop,onProgress:this.onProgress,onSuccess:this.onSuccess,onError:this.onError,ref:this.saveUploaderRef}),C),t||g?D.default.createElement(Y.default,{useDataURL:l,fileNameRender:k,actionRender:S,uploader:this,listType:t,value:this.state.value,closable:d,onRemove:n,progressProps:v,onCancel:h,onPreview:m,extraRender:y,rtl:_,previewOnFileName:E}):null)},i=u=h,u.displayName="Upload",u.propTypes=(0,L.default)({},d.default.propTypes,Y.default.propTypes,{prefix:l.default.string.isRequired,action:l.default.string,value:l.default.array,defaultValue:l.default.array,shape:l.default.oneOf(["card"]),listType:l.default.oneOf(["text","image","card"]),list:l.default.any,name:l.default.string,data:l.default.oneOfType([l.default.object,l.default.func]),formatter:l.default.func,limit:l.default.number,timeout:l.default.number,dragable:l.default.bool,closable:l.default.bool,useDataURL:l.default.bool,disabled:l.default.bool,onSelect:l.default.func,onProgress:l.default.func,onChange:l.default.func,onSuccess:l.default.func,afterSelect:l.default.func,onRemove:l.default.func,onError:l.default.func,beforeUpload:l.default.func,onDrop:l.default.func,className:l.default.string,style:l.default.object,children:l.default.node,autoUpload:l.default.bool,request:l.default.func,progressProps:l.default.object,rtl:l.default.bool,isPreview:l.default.bool,renderPreview:l.default.func,fileKeyName:l.default.string,fileNameRender:l.default.func,actionRender:l.default.func,previewOnFileName:l.default.bool}),u.defaultProps=(0,L.default)({},d.default.defaultProps,{prefix:"next-",limit:1/0,autoUpload:!0,closable:!0,onSelect:n,onProgress:n,onChange:n,onSuccess:n,onRemove:n,onError:n,onDrop:n,beforeUpload:n,afterSelect:n,previewOnFileName:!1}),a=function(){var u=this;this.onSelect=function(e){var t,n,a=u.props,r=a.autoUpload,o=a.afterSelect,i=a.onSelect,a=a.limit,l=u.state.value.length+e.length,s=a-u.state.value.length;s<=0||(t=e=e.map(function(e){e=(0,c.fileToObject)(e);return e.state="selected",e}),n=[],ai||l+a.width>o):t<0||e<0||t+a.height>u.height||e+a.width>u.width}function T(e,t,n,a){var r=a.overlayInfo,a=a.containerInfo,n=n.split("");return 1===n.length&&n.push(""),t<0&&(n=[n[0].replace("t","b"),n[1].replace("b","t")]),e<0&&(n=[n[0].replace("l","r"),n[1].replace("r","l")]),t+r.height>a.height&&(n=[n[0].replace("b","t"),n[1].replace("t","b")]),(n=e+r.width>a.width?[n[0].replace("r","l"),n[1].replace("l","r")]:n).join("")}function D(e,t,n){var a=n.overlayInfo,n=n.containerInfo;return(t=t<0?0:t)+a.height>n.height&&(t=n.height-a.height),{left:e=(e=e<0?0:e)+a.width>n.width?n.width-a.width:e,top:t}}function ve(e){var t=e.target,n=e.overlay,a=e.container,r=e.scrollNode,o=e.placement,i=e.placementOffset,i=void 0===i?0:i,l=e.points,l=void 0===l?["tl","bl"]:l,s=e.offset,s=void 0===s?[0,0]:s,u=e.position,u=void 0===u?"absolute":u,d=e.beforePosition,c=e.autoAdjust,c=void 0===c||c,f=e.autoHideScrollOverflow,f=void 0===f||f,e=e.rtl,p="offsetWidth"in(p=n)&&"offsetHeight"in p?{width:p.offsetWidth,height:p.offsetHeight}:{width:(p=p.getBoundingClientRect()).width,height:p.height},h=p.width,p=p.height;if("fixed"===u)return m={config:{placement:void 0,points:void 0},style:{position:u,left:s[0],top:s[1]}},d?d(m,{overlay:{node:n,width:h,height:p}}):m;var m=t.getBoundingClientRect(),g=m.width,y=m.height,v=m.left,_=m.top,m=x(a),b=m.left,m=m.top,w=a.scrollWidth,M=a.scrollHeight,k=a.scrollTop,S=a.scrollLeft,b={targetInfo:{width:g,height:y,left:v,top:_},containerInfo:{left:b,top:m,width:w,height:M,scrollTop:k,scrollLeft:S},overlayInfo:{width:h,height:p},points:l,placementOffset:i,offset:s,container:a,rtl:e},m=C(o,b),w=m.left,M=m.top,k=m.points,S=function(e){for(var t=e;t;){var n=fe(t,"overflow");if(null!=n&&n.match(/auto|scroll|hidden/))return t;t=t.parentNode}return document.documentElement}(a),E=(c&&o&&L(w,M,S,b)&&(o!==(l=T(w,M,o,b))&&(M=L(s=(i=C(l,b)).left,e=i.top,S,b)&&l!==(m=T(s,e,l,b))?(w=(c=D((a=C(o=m,b)).left,a.top,b)).left,c.top):(o=l,w=s,e)),w=(i=D(w,M,b)).left,M=i.top),{config:{placement:o,points:k},style:{position:u,left:Math.round(w),top:Math.round(M)}});return f&&o&&null!=r&&r.length&&r.forEach(function(e){var e=e.getBoundingClientRect(),t=e.top,n=e.left,a=e.width,e=e.height;E.style.display=_+y=e.length?{done:!0}:{done:!1,value:e[n++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);nt.clientHeight&&0r;)!i(a,n=t[r++])||~s(o,n)||o.push(n);return o}},function(e,t,n){var a=n(195);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){"use strict";function y(){return this}var v=n(121),_=n(91),b=n(197),w=n(92),M=n(150),k=n(472),S=n(152),E=n(475),x=n(95)("iterator"),C=!([].keys&&"next"in[].keys()),L="values";e.exports=function(e,t,n,a,r,o,i){k(n,t,a);function l(e){if(!C&&e in f)return f[e];switch(e){case"keys":case L:return function(){return new n(this,e)}}return function(){return new n(this,e)}}var s,u,a=t+" Iterator",d=r==L,c=!1,f=e.prototype,p=f[x]||f["@@iterator"]||r&&f[r],h=p||l(r),m=r?d?l("entries"):h:void 0,g="Array"==t&&f.entries||p;if(g&&(g=E(g.call(new e)))!==Object.prototype&&g.next&&(S(g,a,!0),v||"function"==typeof g[x]||w(g,x,y)),d&&p&&p.name!==L&&(c=!0,h=function(){return p.call(this)}),v&&!i||!C&&!c&&f[x]||w(f,x,h),M[t]=h,M[a]=y,r)if(s={values:d?h:l(L),keys:o?h:l("keys"),entries:m},i)for(u in s)u in f||b(f,u,s[u]);else _(_.P+_.F*(C||c),t,s);return s}},function(e,t,n){e.exports=n(92)},function(e,t,n){var a=n(193),r=n(147).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,r)}},function(e,t,n){var a=n(123),r=n(119),o=n(94),i=n(142),l=n(85),s=n(191),u=Object.getOwnPropertyDescriptor;t.f=n(78)?u:function(e,t){if(e=o(e),t=i(t,!0),s)try{return u(e,t)}catch(e){}if(l(e,t))return r(!a.f.call(e,t),e[t])}},function(e,t,n){"use strict";t.__esModule=!0;var v=a(n(2));t.default=function(e,t,n){var a=e.prefix,r=e.locale,o=(e.defaultPropsConfig,e.pure),i=e.rtl,l=e.device,s=e.popupContainer,e=e.errorBoundary,u=t.nextPrefix,d=t.nextLocale,c=t.nextDefaultPropsConfig,f=t.nextPure,p=t.nextWarning,h=t.nextRtl,m=t.nextDevice,g=t.nextPopupContainer,t=t.nextErrorBoundary,a=a||u,u=void 0,y=n;switch(n){case"DatePicker2":y="DatePicker";break;case"Calendar2":y="Calendar";break;case"TimePicker2":y="TimePicker"}d&&(u=d[y])&&(u.momentLocale=d.momentLocale);n=void 0;r?n=b.obj.deepMerge({},_.default[y],u,r):u&&(n=b.obj.deepMerge({},_.default[y],u));d="boolean"==typeof o?o:f,r="boolean"==typeof i?i:h,u=(0,v.default)({},w(t),w(e));"open"in u||(u.open=!1);return{prefix:a,locale:n,pure:d,rtl:r,warning:p,defaultPropsConfig:c||{},device:l||m||void 0,popupContainer:s||g,errorBoundary:u}};var _=a(n(44)),b=n(11);function a(e){return e&&e.__esModule?e:{default:e}}var w=function(e){return null==e?{}:"boolean"==typeof e?{open:e}:(0,v.default)({open:!0},e)};e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.matches=t.hasDOM=void 0;var a=n(38),r=(a=a)&&a.__esModule?a:{default:a},o=(t.hasClass=s,t.addClass=u,t.removeClass=d,t.toggleClass=function(e,t){if(!l||!e)return!1;{var n;return e.classList?e.classList.toggle(t):(((n=s(e,t))?d:u)(e,t,!0),!n)}},t.getNodeHozWhitespace=function(e){var t=m(e,"paddingLeft"),n=m(e,"paddingRight"),a=m(e,"marginLeft"),e=m(e,"marginRight");return t+n+a+e},t.getStyle=m,t.setStyle=g,t.scrollbar=v,t.hasScroll=function(e){if("hidden"===m(e,"overflow"))return!1;var t=e.parentNode;return t&&t.scrollHeight>t.clientHeight&&0=t?e:""+Array(t+1-a.length).join(n)+e},t={s:o,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),a=Math.floor(n/60),r=n%60;return(t<=0?"+":"-")+o(a,2,"0")+":"+o(r,2,"0")},m:function e(t,n){if(t.date()1)return e(i[0])}else{var l=t.name;S[l]=t,r=l}return!a&&r&&(k=r),r||!a&&k},E=function(e,t){if(a(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new l(n)},x=t,l=(x.l=r,x.i=a,x.w=function(e,t){return E(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})},function(){function e(e){this.$L=r(e.locale,null,!0),this.parse(e)}var t=e.prototype;return t.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(x.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var a=t.match(i);if(a){var r=a[2]-1||0,o=(a[7]||"0").substring(0,3);return n?new Date(Date.UTC(a[1],r,a[3]||1,a[4]||0,a[5]||0,a[6]||0,o)):new Date(a[1],r,a[3]||1,a[4]||0,a[5]||0,a[6]||0,o)}}return new Date(t)}(e),this.$x=e.x||{},this.init()},t.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},t.$utils=function(){return x},t.isValid=function(){return!(this.$d.toString()===w)},t.isSame=function(e,t){var n=E(e);return this.startOf(t)<=n&&n<=this.endOf(t)},t.isAfter=function(e,t){return E(e)r;)!i(a,n=t[r++])||~s(o,n)||o.push(n);return o}},function(e,t,n){var a=n(195);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){"use strict";function y(){return this}var v=n(122),_=n(92),b=n(197),w=n(93),M=n(150),k=n(472),S=n(152),E=n(475),x=n(96)("iterator"),C=!([].keys&&"next"in[].keys()),L="values";e.exports=function(e,t,n,a,r,o,i){k(n,t,a);function l(e){if(!C&&e in f)return f[e];switch(e){case"keys":case L:return function(){return new n(this,e)}}return function(){return new n(this,e)}}var s,u,a=t+" Iterator",d=r==L,c=!1,f=e.prototype,p=f[x]||f["@@iterator"]||r&&f[r],h=p||l(r),m=r?d?l("entries"):h:void 0,g="Array"==t&&f.entries||p;if(g&&(g=E(g.call(new e)))!==Object.prototype&&g.next&&(S(g,a,!0),v||"function"==typeof g[x]||w(g,x,y)),d&&p&&p.name!==L&&(c=!0,h=function(){return p.call(this)}),v&&!i||!C&&!c&&f[x]||w(f,x,h),M[t]=h,M[a]=y,r)if(s={values:d?h:l(L),keys:o?h:l("keys"),entries:m},i)for(u in s)u in f||b(f,u,s[u]);else _(_.P+_.F*(C||c),t,s);return s}},function(e,t,n){e.exports=n(93)},function(e,t,n){var a=n(193),r=n(147).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,r)}},function(e,t,n){var a=n(124),r=n(120),o=n(95),i=n(142),l=n(86),s=n(191),u=Object.getOwnPropertyDescriptor;t.f=n(79)?u:function(e,t){if(e=o(e),t=i(t,!0),s)try{return u(e,t)}catch(e){}if(l(e,t))return r(!a.f.call(e,t),e[t])}},function(e,t,n){"use strict";t.__esModule=!0;var v=a(n(2));t.default=function(e,t,n){var a=e.prefix,r=e.locale,o=(e.defaultPropsConfig,e.pure),i=e.rtl,l=e.device,s=e.popupContainer,e=e.errorBoundary,u=t.nextPrefix,d=t.nextLocale,c=t.nextDefaultPropsConfig,f=t.nextPure,p=t.nextWarning,h=t.nextRtl,m=t.nextDevice,g=t.nextPopupContainer,t=t.nextErrorBoundary,a=a||u,u=void 0,y=n;switch(n){case"DatePicker2":y="DatePicker";break;case"Calendar2":y="Calendar";break;case"TimePicker2":y="TimePicker"}d&&(u=d[y])&&(u.momentLocale=d.momentLocale);n=void 0;r?n=b.obj.deepMerge({},_.default[y],u,r):u&&(n=b.obj.deepMerge({},_.default[y],u));d="boolean"==typeof o?o:f,r="boolean"==typeof i?i:h,u=(0,v.default)({},w(t),w(e));"open"in u||(u.open=!1);return{prefix:a,locale:n,pure:d,rtl:r,warning:p,defaultPropsConfig:c||{},device:l||m||void 0,popupContainer:s||g,errorBoundary:u}};var _=a(n(44)),b=n(11);function a(e){return e&&e.__esModule?e:{default:e}}var w=function(e){return null==e?{}:"boolean"==typeof e?{open:e}:(0,v.default)({open:!0},e)};e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.matches=t.hasDOM=void 0;var a=n(38),r=(a=a)&&a.__esModule?a:{default:a},o=(t.hasClass=s,t.addClass=u,t.removeClass=d,t.toggleClass=function(e,t){if(!l||!e)return!1;{var n;return e.classList?e.classList.toggle(t):(((n=s(e,t))?d:u)(e,t,!0),!n)}},t.getNodeHozWhitespace=function(e){var t=m(e,"paddingLeft"),n=m(e,"paddingRight"),a=m(e,"marginLeft"),e=m(e,"marginRight");return t+n+a+e},t.getStyle=m,t.setStyle=g,t.scrollbar=v,t.hasScroll=function(e){if("hidden"===m(e,"overflow"))return!1;var t=e.parentNode;return t&&t.scrollHeight>t.clientHeight&&0=t?e:""+Array(t+1-a.length).join(n)+e},t={s:o,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),a=Math.floor(n/60),r=n%60;return(t<=0?"+":"-")+o(a,2,"0")+":"+o(r,2,"0")},m:function e(t,n){if(t.date()1)return e(i[0])}else{var l=t.name;S[l]=t,r=l}return!a&&r&&(k=r),r||!a&&k},E=function(e,t){if(a(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new l(n)},x=t,l=(x.l=r,x.i=a,x.w=function(e,t){return E(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})},function(){function e(e){this.$L=r(e.locale,null,!0),this.parse(e)}var t=e.prototype;return t.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(x.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var a=t.match(i);if(a){var r=a[2]-1||0,o=(a[7]||"0").substring(0,3);return n?new Date(Date.UTC(a[1],r,a[3]||1,a[4]||0,a[5]||0,a[6]||0,o)):new Date(a[1],r,a[3]||1,a[4]||0,a[5]||0,a[6]||0,o)}}return new Date(t)}(e),this.$x=e.x||{},this.init()},t.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},t.$utils=function(){return x},t.isValid=function(){return!(this.$d.toString()===w)},t.isSame=function(e,t){var n=E(e);return this.startOf(t)<=n&&n<=this.endOf(t)},t.isAfter=function(e,t){return E(e)=20?"ste":"de")},week:{dow:1,doy:4}})}(n(9))},function(e,t,n){!function(e){"use strict"; //! moment.js locale configuration @@ -286,7 +286,7 @@ var t;e.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_ //! moment.js locale configuration var t;e.defineLocale("zh-mo",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"D/M/YYYY",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="凌晨"||t==="早上"||t==="上午")return e;else if(t==="中午")return e>=11?e:e+12;else if(t==="下午"||t==="晚上")return e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"凌晨";else if(a<900)return"早上";else if(a<1130)return"上午";else if(a<1230)return"中午";else if(a<1800)return"下午";else return"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(n(9))},function(e,t,n){!function(e){"use strict"; //! moment.js locale configuration -var t;e.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){if(e===12)e=0;if(t==="凌晨"||t==="早上"||t==="上午")return e;else if(t==="中午")return e>=11?e:e+12;else if(t==="下午"||t==="晚上")return e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"凌晨";else if(a<900)return"早上";else if(a<1130)return"上午";else if(a<1230)return"中午";else if(a<1800)return"下午";else return"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(n(9))},function(e,t,n){"use strict";t.__esModule=!0;var u=p(n(2)),a=p(n(4)),r=p(n(5)),o=p(n(6)),i=n(0),d=p(i),l=p(n(3)),c=p(n(13)),s=p(n(8)),f=n(11);function p(e){return e&&e.__esModule?e:{default:e}}h=i.Component,(0,o.default)(m,h),m.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.type,r=t.size,o=t.className,i=t.rtl,l=t.style,t=t.children,s=f.obj.pickOthers((0,u.default)({},m.propTypes),this.props),n=(0,c.default)(((e={})[n+"icon"]=!0,e[n+"icon-"+a]=!!a,e[""+n+r]=!!r&&"string"==typeof r,e[o]=!!o,e)),o=(i&&-1!==["arrow-left","arrow-right","arrow-double-left","arrow-double-right","switch","sorting","descending","ascending"].indexOf(a)&&(s.dir="rtl"),"number"==typeof r?{width:r,height:r,lineHeight:r+"px",fontSize:r}:{});return d.default.createElement("i",(0,u.default)({},s,{style:(0,u.default)({},o,l),className:n}),t)},i=n=m,n.propTypes=(0,u.default)({},s.default.propTypes,{type:l.default.string,children:l.default.node,size:l.default.oneOfType([l.default.oneOf(["xxs","xs","small","medium","large","xl","xxl","xxxl","inherit"]),l.default.number]),className:l.default.string,style:l.default.object}),n.defaultProps={prefix:"next-",size:"medium"},n._typeMark="icon";var h,o=i;function m(){return(0,a.default)(this,m),(0,r.default)(this,h.apply(this,arguments))}o.displayName="Icon",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=s(n(2)),y=s(n(12)),a=s(n(38)),r=s(n(4)),o=s(n(5)),i=s(n(6)),v=n(0),_=s(v),l=s(n(3)),b=n(157),w=s(n(525));function s(e){return e&&e.__esModule?e:{default:e}}function u(){}function M(e){return _.default.Children.toArray(e.children)[0]||null}d=v.Component,(0,i.default)(c,d),c.prototype.normalizeNames=function(e){return"string"==typeof e?{appear:e+"-appear",appearActive:e+"-appear-active",enter:e+"-enter",enterActive:e+"-enter-active",leave:e+"-leave",leaveActive:e+"-leave-active"}:"object"===(void 0===e?"undefined":(0,a.default)(e))?{appear:e.appear,appearActive:e.appear+"-active",enter:""+e.enter,enterActive:e.enter+"-active",leave:""+e.leave,leaveActive:e.leave+"-active"}:void 0},c.prototype.render=function(){var t=this,e=this.props,n=e.animation,a=e.children,r=e.animationAppear,o=e.singleMode,i=e.component,l=e.beforeAppear,s=e.onAppear,u=e.afterAppear,d=e.beforeEnter,c=e.onEnter,f=e.afterEnter,p=e.beforeLeave,h=e.onLeave,m=e.afterLeave,e=(0,y.default)(e,["animation","children","animationAppear","singleMode","component","beforeAppear","onAppear","afterAppear","beforeEnter","onEnter","afterEnter","beforeLeave","onLeave","afterLeave"]),a=v.Children.map(a,function(e){return _.default.createElement(w.default,{key:e.key,names:t.normalizeNames(n),onAppear:l,onAppearing:s,onAppeared:u,onEnter:d,onEntering:c,onEntered:f,onExit:p,onExiting:h,onExited:m},e)});return _.default.createElement(b.TransitionGroup,(0,g.default)({appear:r,component:o?M:i},e),a)},i=n=c,n.propTypes={animation:l.default.oneOfType([l.default.string,l.default.object]),animationAppear:l.default.bool,component:l.default.any,singleMode:l.default.bool,children:l.default.oneOfType([l.default.element,l.default.arrayOf(l.default.element)]),beforeAppear:l.default.func,onAppear:l.default.func,afterAppear:l.default.func,beforeEnter:l.default.func,onEnter:l.default.func,afterEnter:l.default.func,beforeLeave:l.default.func,onLeave:l.default.func,afterLeave:l.default.func},n.defaultProps={animationAppear:!0,component:"div",singleMode:!0,beforeAppear:u,onAppear:u,afterAppear:u,beforeEnter:u,onEnter:u,afterEnter:u,beforeLeave:u,onLeave:u,afterLeave:u};var d,l=i;function c(){return(0,r.default)(this,c),(0,o.default)(this,d.apply(this,arguments))}l.displayName="Animate",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=t.EXITING=t.ENTERED=t.ENTERING=t.EXITED=t.UNMOUNTED=void 0;var a=function(e){{if(e&&e.__esModule)return e;var t,n={};if(null!=e)for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&((t=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,a):{}).get||t.set?Object.defineProperty(n,a,t):n[a]=e[a]);return n.default=e,n}}(n(3)),o=l(n(0)),i=l(n(23)),r=n(30);n(346);function l(e){return e&&e.__esModule?e:{default:e}}var s="unmounted",u=(t.UNMOUNTED=s,"exited"),d=(t.EXITED=u,"entering"),c=(t.ENTERING=d,"entered"),f=(t.ENTERED=c,"exiting"),n=(t.EXITING=f,function(r){var e;function t(e,t){var n,a=r.call(this,e,t)||this,t=t.transitionGroup,t=t&&!t.isMounting?e.enter:e.appear;return a.appearStatus=null,e.in?t?(n=u,a.appearStatus=d):n=c:n=e.unmountOnExit||e.mountOnEnter?s:u,a.state={status:n},a.nextCallback=null,a}e=r,(n=t).prototype=Object.create(e.prototype),(n.prototype.constructor=n).__proto__=e;var n=t.prototype;return n.getChildContext=function(){return{transitionGroup:null}},t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===s?{status:u}:null},n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;e!==this.props&&(e=this.state.status,this.props.in?e!==d&&e!==c&&(t=d):e!==d&&e!==c||(t=f)),this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n=this.props.timeout,a=e=t=n;return null!=n&&"number"!=typeof n&&(a=n.exit,e=n.enter,t=void 0!==n.appear?n.appear:e),{exit:a,enter:e,appear:t}},n.updateStatus=function(e,t){var n;void 0===e&&(e=!1),null!==t?(this.cancelNextCallback(),n=i.default.findDOMNode(this),t===d?this.performEnter(n,e):this.performExit(n)):this.props.unmountOnExit&&this.state.status===u&&this.setState({status:s})},n.performEnter=function(e,t){var n=this,a=this.props.enter,r=this.context.transitionGroup?this.context.transitionGroup.isMounting:t,o=this.getTimeouts(),i=r?o.appear:o.enter;t||a?(this.props.onEnter(e,r),this.safeSetState({status:d},function(){n.props.onEntering(e,r),n.onTransitionEnd(e,i,function(){n.safeSetState({status:c},function(){n.props.onEntered(e,r)})})})):this.safeSetState({status:c},function(){n.props.onEntered(e)})},n.performExit=function(e){var t=this,n=this.props.exit,a=this.getTimeouts();n?(this.props.onExit(e),this.safeSetState({status:f},function(){t.props.onExiting(e),t.onTransitionEnd(e,a.exit,function(){t.safeSetState({status:u},function(){t.props.onExited(e)})})})):this.safeSetState({status:u},function(){t.props.onExited(e)})},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(t){var n=this,a=!0;return this.nextCallback=function(e){a&&(a=!1,n.nextCallback=null,t(e))},this.nextCallback.cancel=function(){a=!1},this.nextCallback},n.onTransitionEnd=function(e,t,n){this.setNextCallback(n);n=null==t&&!this.props.addEndListener;!e||n?setTimeout(this.nextCallback,0):(this.props.addEndListener&&this.props.addEndListener(e,this.nextCallback),null!=t&&setTimeout(this.nextCallback,t))},n.render=function(){var e=this.state.status;if(e===s)return null;var t=this.props,n=t.children,t=function(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o 16.8.0"),null;function t(e){j.current=e,ne({})}function a(e,t){N(te,null),"function"==typeof S&&S(e,t)}function n(e){27===e.keyCode&&Y&&!P.current.size&&a("esc",e)}function r(){j.current||(t(!0),he.dom.setStyle(D.current,"display","none"),me.default.unlock(document.body,ee.current),s&&O.current&&(O.current.focus(),O.current=null),I())}var o=e.prefix,o=void 0===o?"next-":o,i=e.afterClose,I=void 0===i?ye:i,i=e.hasMask,l=void 0===i||i,i=e.autoFocus,s=void 0!==i&&i,i=e.className,R=e.title,A=e.children,H=e.footer,F=e.footerAlign,z=e.footerActions,u=e.onOk,u=void 0===u?ye:u,d=e.onCancel,W=e.okProps,V=e.cancelProps,c=e.locale,c=void 0===c?pe.default.Dialog:c,B=e.rtl,f=e.visible,p=e.closeMode,p=void 0===p?["close","esc"]:p,U=e.closeIcon,h=e.animation,h=void 0===h?{in:"fadeInUp",out:"fadeOutUp"}:h,m=e.cache,K=e.wrapperStyle,g=e.popupContainer,y=void 0===g?document.body:g,g=e.dialogRender,v=e.centered,_=e.top,_=void 0===_?v?40:100:_,b=e.bottom,b=void 0===b?40:b,w=e.width,w=void 0===w?520:w,G=e.height,M=e.isFullScreen,k=e.overflowScroll,M=void 0===k?!M:k,k=e.minMargin,S=e.onClose,q=e.style,E=(0,ie.default)(e,["prefix","afterClose","hasMask","autoFocus","className","title","children","footer","footerAlign","footerActions","onOk","onCancel","okProps","cancelProps","locale","rtl","visible","closeMode","closeIcon","animation","cache","wrapperStyle","popupContainer","dialogRender","centered","top","bottom","width","height","isFullScreen","overflowScroll","minMargin","onClose","style"]),x=("isFullScreen"in e&&he.log.deprecated("isFullScreen","overflowScroll","Dialog v2"),"minMargin"in e&&he.log.deprecated("minMargin","top/bottom","Dialog v2"),(0,le.useState)(f||!1)),$=x[0],J=x[1],x=(0,le.useState)(f),C=x[0],X=x[1],Q="string"==typeof y?function(){return document.getElementById(y)}:"function"!=typeof y?function(){return y}:y,x=(0,le.useState)(Q()),L=x[0],Z=x[1],T=(0,le.useRef)(null),D=(0,le.useRef)(null),O=(0,le.useRef)(null),ee=(0,le.useRef)(null),te=(0,le.useState)((0,he.guid)())[0],x=(0,le.useContext)(ge),N=x.setVisibleOverlayToParent,x=(0,ie.default)(x,["setVisibleOverlayToParent"]),P=(0,le.useRef)(new Map),j=(0,le.useRef)(!1),ne=(0,le.useState)()[1],Y=!1,ae=!1,re=!1;(Array.isArray(p)?p:[p]).forEach(function(e){switch(e){case"esc":Y=!0;break;case"mask":ae=!0;break;case"close":re=!0}}),(0,le.useEffect)(function(){"visible"in e&&X(f)},[f]),(0,le.useEffect)(function(){var e;C&&l&&(e={overflow:"hidden"},he.dom.hasScroll(document.body)&&he.dom.scrollbar().width&&(e.paddingRight=he.dom.getStyle(document.body,"paddingRight")+he.dom.scrollbar().width+"px"),ee.current=me.default.lock(document.body,e))},[C&&l]),(0,le.useEffect)(function(){if(C&&Y)return document.body.addEventListener("keydown",n,!1),function(){document.body.removeEventListener("keydown",n,!1)}},[C&&Y]),(0,le.useEffect)(function(){!$&&C&&J(!0)},[C]),(0,le.useEffect)(function(){L||setTimeout(function(){Z(Q())})},[L]);if((0,le.useEffect)(function(){return function(){r()}},[]),!1===$||!L)return null;if(!C&&!m&&j.current)return null;m=(0,de.default)(((p={})[o+"overlay-wrapper"]=!0,p.opened=C,p)),i=(0,de.default)(((p={})[o+"dialog-v2"]=!0,p[i]=!!i,p)),p={},k=void(v?_||b||!k?(_&&(p.marginTop=_),b&&(p.marginBottom=b)):(p.marginTop=k,p.marginBottom=k):(_&&(p.top=_),b&&(p.paddingBottom=b))),M&&(k="calc(100vh - "+(_+b)+"px)"),M={appear:300,enter:300,exit:250},_=se.default.createElement(fe.default.OverlayAnimate,{visible:C,animation:h,timeout:M,onEnter:function(){t(!1),he.dom.setStyle(D.current,"display","")},onEntered:function(){var e;s&&T.current&&T.current.bodyNode&&(0<(e=he.focus.getFocusNodeList(T.current.bodyNode)).length&&e[0]&&(O.current=document.activeElement,e[0].focus())),N(te,D.current)},onExited:r},se.default.createElement(ce.default,(0,oe.default)({},E,{style:v?(0,oe.default)({},p,q):q,v2:!0,ref:T,prefix:o,className:i,title:R,footer:H,footerAlign:F,footerActions:z,onOk:C?u:ye,onCancel:C?function(e){"function"==typeof d?d(e):a("cancelBtn",e)}:ye,okProps:W,cancelProps:V,locale:c,closeable:re,rtl:B,onClose:function(){for(var e=arguments.length,t=Array(e),n=0;n>6]+d[128|63&s]:s<55296||57344<=s?i+=d[224|s>>12]+d[128|s>>6&63]+d[128|63&s]:(l+=1,s=65536+((1023&s)<<10|1023&o.charCodeAt(l)),i+=d[240|s>>18]+d[128|s>>12&63]+d[128|s>>6&63]+d[128|63&s])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(m(e)){for(var n=[],a=0;athis.popupNode.offsetWidth&&p(this.popupNode,"width",l.offsetWidth+"px"),"outside"!==a||"hoz"===r&&1===n||(p(this.popupNode,"height",u.offsetHeight+"px"),this.popupNode.firstElementChild&&p(this.popupNode.firstElementChild,"overflow-y","auto")),this.popupProps);d.onOpen&&d.onOpen()}catch(e){return null}},S.prototype.handlePopupClose=function(){var e=this.props.root.popupNodes,t=e.indexOf(this.popupNode),e=(-1t?r[t+1]:r[0])}),n[a]||(o=r[0]),i.onSort(a,o)},i.keydownHandler=function(e){e.preventDefault(),e.stopPropagation(),e.keyCode===l.KEYCODE.ENTER&&i.handleClick()},i.onSort=function(e,t){var n={};n[e]=t,i.props.onSort(e,t,n)},(0,o.default)(i,e)}i.displayName="Sort",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=c(n(2)),a=c(n(4)),o=c(n(5)),i=c(n(6)),l=c(n(0)),s=c(n(3)),u=c(n(13)),d=c(n(389));function c(e){return e&&e.__esModule?e:{default:e}}f=l.default.Component,(0,i.default)(p,f),p.prototype.render=function(){var e=this.props,t=e.className,n=e.record,e=e.primaryKey,a=this.context.selectedRowKeys,n=(0,u.default)(((a={selected:-1 "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":" "+this.message},o}(Error);e.exports=n},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?" "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":" "+this.message},o}(Error);e.exports=n},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var y=m(n(2)),a=m(n(4)),r=m(n(5)),o=m(n(6)),i=n(0),v=m(i),l=n(23),s=m(n(3)),_=m(n(13)),u=n(11),f=m(n(50)),d=m(n(62)),b=m(n(10)),c=m(n(44)),p=m(n(675)),h=m(n(400)),w=n(177);function m(e){return e&&e.__esModule?e:{default:e}}var M=d.default.Popup,g=f.default.Item,k=f.default.Group,n=u.func.noop,S=u.func.bindCtx,E=u.func.makeChain;x=v.default.Component,(0,o.default)(C,x),C.prototype.componentDidMount=function(){var e=this;setTimeout(function(){return e.syncWidth()},0),u.events.on(window,"resize",this.handleResize)},C.prototype.componentDidUpdate=function(e,t){e.label===this.props.label&&t.value===this.state.value||this.syncWidth()},C.prototype.componentWillUnmount=function(){u.events.off(window,"resize",this.handleResize),clearTimeout(this.resizeTimeout)},C.prototype.syncWidth=function(){var e=this,t=this.props,n=t.popupStyle,t=t.popupProps;n&&"width"in n||t&&t.style&&"width"in t.style||(n=u.dom.getStyle(this.selectDOM,"width"))&&this.width!==n&&(this.width=n,this.popupRef&&this.shouldAutoWidth()&&setTimeout(function(){e.popupRef&&u.dom.setStyle(e.popupRef,"width",e.width)},0))},C.prototype.handleResize=function(){var e=this;clearTimeout(this.resizeTimeout),this.state.visible&&(this.resizeTimeout=setTimeout(function(){e.syncWidth()},200))},C.prototype.setDataSource=function(e){var t=e.dataSource,e=e.children;return i.Children.count(e)?this.dataStore.updateByDS(e,!0):Array.isArray(t)?this.dataStore.updateByDS(t,!1):[]},C.prototype.setVisible=function(e,t){this.props.disabled&&e||this.state.visible===e||("visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t))},C.prototype.setFirstHightLightKeyForMenu=function(e){var t=this.state.highlightKey;this.props.autoHighlightFirstItem&&(this.dataStore.getMenuDS().length&&this.dataStore.getEnableDS().length&&(!t||e)&&(t=""+this.dataStore.getEnableDS()[0].value,this.setState({highlightKey:t}),this.props.onToggleHighlightItem(t,"autoFirstItem")),e&&!this.dataStore.getEnableDS().length&&(this.setState({highlightKey:null}),this.props.onToggleHighlightItem(null,"highlightKeyToNull")))},C.prototype.handleChange=function(e){var t;"value"in this.props||this.setState({value:e});for(var n=arguments.length,a=Array(1e.slidesToShow&&(n=e.slideWidth*e.slidesToShow*-1,o=e.slideHeight*e.slidesToShow*-1),e.slideCount%e.slidesToScroll!=0&&(t=e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow,(t=e.rtl?(e.slideIndex>=e.slideCount?e.slideCount-e.slideIndex:e.slideIndex)+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow:t)&&(o=e.slideIndex>e.slideCount?(n=(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideWidth*-1,(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideHeight*-1):(n=e.slideCount%e.slidesToScroll*e.slideWidth*-1,e.slideCount%e.slidesToScroll*e.slideHeight*-1)))):e.slideCount%e.slidesToScroll!=0&&e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow&&(n=(e.slidesToShow-e.slideCount%e.slidesToScroll)*e.slideWidth),e.centerMode&&(e.infinite?n+=e.slideWidth*Math.floor(e.slidesToShow/2):n=e.slideWidth*Math.floor(e.slidesToShow/2)),a=e.vertical?e.slideIndex*e.slideHeight*-1+o:e.slideIndex*e.slideWidth*-1+n,!0===e.variableWidth&&(t=void 0,a=(r=e.slideCount<=e.slidesToShow||!1===e.infinite?i.default.findDOMNode(e.trackRef).childNodes[e.slideIndex]:(t=e.slideIndex+e.slidesToShow,i.default.findDOMNode(e.trackRef).childNodes[t]))?-1*r.offsetLeft:0,!0===e.centerMode&&(r=!1===e.infinite?i.default.findDOMNode(e.trackRef).children[e.slideIndex]:i.default.findDOMNode(e.trackRef).children[e.slideIndex+e.slidesToShow+1])&&(a=-1*r.offsetLeft+(e.listWidth-r.offsetWidth)/2)),a)}},function(e,t,n){"use strict";t.__esModule=!0;var p=u(n(2)),h=u(n(12)),o=u(n(4)),i=u(n(5)),a=u(n(6)),m=u(n(0)),r=u(n(3)),g=u(n(13)),l=u(n(8)),y=u(n(24)),s=n(11);function u(e){return e&&e.__esModule?e:{default:e}}d=m.default.Component,(0,a.default)(c,d),c.prototype.render=function(){var e=this.props,t=e.title,n=e.children,a=e.className,r=e.isExpanded,o=e.disabled,i=e.style,l=e.prefix,s=e.onClick,u=e.id,e=(0,h.default)(e,["title","children","className","isExpanded","disabled","style","prefix","onClick","id"]),a=(0,g.default)(((d={})[l+"collapse-panel"]=!0,d[l+"collapse-panel-hidden"]=!r,d[l+"collapse-panel-expanded"]=r,d[l+"collapse-panel-disabled"]=o,d[a]=a,d)),d=(0,g.default)(((d={})[l+"collapse-panel-icon"]=!0,d[l+"collapse-panel-icon-expanded"]=r,d)),c=u?u+"-heading":void 0,f=u?u+"-region":void 0;return m.default.createElement("div",(0,p.default)({className:a,style:i,id:u},e),m.default.createElement("div",{id:c,className:l+"collapse-panel-title",onClick:s,onKeyDown:this.onKeyDown,tabIndex:"0","aria-disabled":o,"aria-expanded":r,"aria-controls":f,role:"button"},m.default.createElement(y.default,{type:"arrow-right",className:d,"aria-hidden":"true"}),t),m.default.createElement("div",{className:l+"collapse-panel-content",role:"region",id:f},n))},a=n=c,n.propTypes={prefix:r.default.string,style:r.default.object,children:r.default.any,isExpanded:r.default.bool,disabled:r.default.bool,title:r.default.node,className:r.default.string,onClick:r.default.func,id:r.default.string},n.defaultProps={prefix:"next-",isExpanded:!1,onClick:s.func.noop},n.isNextPanel=!0;var d,r=a;function c(){var e,n;(0,o.default)(this,c);for(var t=arguments.length,a=Array(t),r=0;r\n com.alibaba.nacos\n nacos-client\n ${version}\n \n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\nimport java.util.concurrent.Executor;\nimport com.alibaba.nacos.api.NacosFactory;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport com.alibaba.nacos.api.config.listener.Listener;\nimport com.alibaba.nacos.api.exception.NacosException;\n\n/**\n * Config service example\n *\n * @author Nacos\n *\n */\npublic class ConfigExample {\n\n\tpublic static void main(String[] args) throws NacosException, InterruptedException {\n\t\tString serverAddr = "localhost";\n\t\tString dataId = "'.concat(e.dataId,'";\n\t\tString group = "').concat(e.group,'";\n\t\tProperties properties = new Properties();\n\t\tproperties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);\n\t\tConfigService configService = NacosFactory.createConfigService(properties);\n\t\tString content = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tconfigService.addListener(dataId, group, new Listener() {\n\t\t\t@Override\n\t\t\tpublic void receiveConfigInfo(String configInfo) {\n\t\t\t\tSystem.out.println("recieve:" + configInfo);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic Executor getExecutor() {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\n\t\tboolean isPublishOk = configService.publishConfig(dataId, group, "content");\n\t\tSystem.out.println(isPublishOk);\n\n\t\tThread.sleep(3000);\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\n\t\tboolean isRemoveOk = configService.removeConfig(dataId, group);\n\t\tSystem.out.println(isRemoveOk);\n\t\tThread.sleep(3000);\n\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tThread.sleep(300000);\n\n\t}\n}\n')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"getCSharpCode",value:function(e){return'/*\nDemo for Basic Nacos Opreation\nApp.csproj\n\n\n \n\n*/\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Nacos.V2;\nusing Nacos.V2.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nclass Program\n{\n static async Task Main(string[] args)\n {\n string serverAddr = "http://localhost:8848";\n string dataId = "'.concat(e.dataId,'";\n string group = "').concat(e.group,'";\n\n IServiceCollection services = new ServiceCollection();\n\n services.AddNacosV2Config(x =>\n {\n x.ServerAddresses = new List { serverAddr };\n x.Namespace = "cs-test";\n\n // swich to use http or rpc\n x.ConfigUseRpc = true;\n });\n\n IServiceProvider serviceProvider = services.BuildServiceProvider();\n var configSvc = serviceProvider.GetService();\n\n var content = await configSvc.GetConfig(dataId, group, 3000);\n Console.WriteLine(content);\n\n var listener = new ConfigListener();\n\n await configSvc.AddListener(dataId, group, listener);\n\n var isPublishOk = await configSvc.PublishConfig(dataId, group, "content");\n Console.WriteLine(isPublishOk);\n\n await Task.Delay(3000);\n content = await configSvc.GetConfig(dataId, group, 5000);\n Console.WriteLine(content);\n\n var isRemoveOk = await configSvc.RemoveConfig(dataId, group);\n Console.WriteLine(isRemoveOk);\n await Task.Delay(3000);\n\n content = await configSvc.GetConfig(dataId, group, 5000);\n Console.WriteLine(content);\n await Task.Delay(300000);\n }\n\n internal class ConfigListener : IListener\n {\n public void ReceiveConfigInfo(string configInfo)\n {\n Console.WriteLine("recieve:" + configInfo);\n }\n }\n}\n\n/*\nRefer to document: https://github.com/nacos-group/nacos-sdk-csharp/tree/dev/samples/MsConfigApp\nDemo for ASP.NET Core Integration\nMsConfigApp.csproj\n\n\n \n\n*/\n\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Hosting;\nusing Serilog;\nusing Serilog.Events;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n Log.Logger = new LoggerConfiguration()\n .Enrich.FromLogContext()\n .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)\n .MinimumLevel.Override("System", LogEventLevel.Warning)\n .MinimumLevel.Debug()\n .WriteTo.Console()\n .CreateLogger();\n\n try\n {\n Log.ForContext().Information("Application starting...");\n CreateHostBuilder(args, Log.Logger).Build().Run();\n }\n catch (System.Exception ex)\n {\n Log.ForContext().Fatal(ex, "Application start-up failed!!");\n }\n finally\n {\n Log.CloseAndFlush();\n }\n }\n\n public static IHostBuilder CreateHostBuilder(string[] args, Serilog.ILogger logger) =>\n Host.CreateDefaultBuilder(args)\n .ConfigureAppConfiguration((context, builder) =>\n {\n var c = builder.Build();\n builder.AddNacosV2Configuration(c.GetSection("NacosConfig"), logAction: x => x.AddSerilog(logger));\n })\n .ConfigureWebHostDefaults(webBuilder =>\n {\n webBuilder.UseStartup().UseUrls("http://*:8787");\n })\n .UseSerilog();\n}\n ')}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return x.a.createElement("div",null,x.a.createElement(y.a,{title:e.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:x.a.createElement("div",null),onClose:this.closeDialog.bind(this)},x.a.createElement("div",{style:{height:500}},x.a.createElement(R.a,{tip:e.loading,style:{width:"100%"},visible:this.state.loading},x.a.createElement(O.a,{shape:"text",style:{height:40,paddingBottom:10}},x.a.createElement(N,{title:"Java",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),x.a.createElement(N,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigboot_code)}),x.a.createElement(N,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloud_code)}),x.a.createElement(N,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),x.a.createElement(N,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),x.a.createElement(N,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),x.a.createElement(N,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)}),x.a.createElement(N,{title:"C#",key:7,onClick:this.changeTab.bind(this,"commoneditor7",this.csharpCode)})),x.a.createElement("div",{ref:"codepreview"})))))}}]),n}(x.a.Component)).displayName="ShowCodeing",S=S))||S,S=(t(66),t(41)),S=t.n(S),H=(t(716),S.a.Row),P=S.a.Col,F=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(e){return Object(_.a)(this,n),(e=t.call(this,e)).state={visible:!1,title:"",content:"",isok:!0,dataId:"",group:""},e}return Object(b.a)(n,[{key:"componentDidMount",value:function(){this.initData()}},{key:"initData",value:function(){var e=this.props.locale;this.setState({title:(void 0===e?{}:e).confManagement})}},{key:"openDialog",value:function(e){this.setState({visible:!0,title:e.title,content:e.content,isok:e.isok,dataId:e.dataId,group:e.group,message:e.message})}},{key:"closeDialog",value:function(){this.setState({visible:!1})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=x.a.createElement("div",{style:{textAlign:"right"}},x.a.createElement(d.a,{type:"primary",onClick:this.closeDialog.bind(this)},e.determine));return x.a.createElement("div",null,x.a.createElement(y.a,{visible:this.state.visible,footer:t,style:{width:555},onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this),title:e.deletetitle},x.a.createElement("div",null,x.a.createElement(H,null,x.a.createElement(P,{span:"4",style:{paddingTop:16}},x.a.createElement(m.a,{type:"".concat(this.state.isok?"success":"delete","-filling"),style:{color:this.state.isok?"green":"red"},size:"xl"})),x.a.createElement(P,{span:"20"},x.a.createElement("div",null,x.a.createElement("h3",null,this.state.isok?e.deletedSuccessfully:e.deleteFailed),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID"),x.a.createElement("span",{style:{color:"#c7254e"}},this.state.dataId)),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group"),x.a.createElement("span",{style:{color:"#c7254e"}},this.state.group)),this.state.isok?"":x.a.createElement("p",{style:{color:"red"}},this.state.message)))))))}}]),n}(x.a.Component)).displayName="DeleteDialog",S=S))||S,S=(t(717),t(419)),z=t.n(S),W=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(){return Object(_.a)(this,n),t.apply(this,arguments)}return Object(b.a)(n,[{key:"render",value:function(){var e=this.props,t=e.data,t=void 0===t?{}:t,n=e.height,e=e.locale,a=void 0===e?{}:e;return x.a.createElement("div",null,"notice"===t.modeType?x.a.createElement("div",{"data-spm-click":"gostr=/aliyun;locaid=notice"},x.a.createElement(z.a,{style:{marginBottom:1l?b.a.createElement(u.a,{className:"pagination",total:i.count,pageSize:l,onChange:function(e){return a.onChangePage(e)}}):null,b.a.createElement(C,{ref:this.editInstanceDialog,serviceName:n,clusterName:t,groupName:e,openLoading:function(){return a.openLoading()},closeLoading:function(){return a.closeLoading()},getInstanceList:function(){return a.getInstanceList()}})):null}}]),n}(b.a.Component)).displayName="InstanceTable",l.defaultProps={filters:new Map},l=l))||l,L=function(e,t){return e.filter(function(e){var n=e.metadata,a=!0;return t.forEach(function(e,t){if(e!==n[t])return a=!1}),a})},T=l,D=t(47),O=t(31),l=(t(175),t(74)),l=t.n(l),N=l.a.Group,P=l.a.Closeable,j=v.a.Item;var R=n.a.config(function(e){function t(){var e;a(),o&&l&&(e=new Map(Array.from(p)).set(o,l),h(e),d(""),f(""),n())}function n(){i(""),s("")}function a(){d(o?"":"error"),f(l?"":"error")}var r=Object(_.useState)(""),o=(r=Object(O.a)(r,2))[0],i=r[1],r=Object(_.useState)(""),l=(r=Object(O.a)(r,2))[0],s=r[1],r=Object(_.useState)(""),u=(r=Object(O.a)(r,2))[0],d=r[1],r=Object(_.useState)(""),c=(r=Object(O.a)(r,2))[0],f=r[1],r=Object(_.useState)(new Map),p=(r=Object(O.a)(r,2))[0],h=r[1],r=void 0===(r=e.locale)?{}:r;return Object(_.useEffect)(function(){e.setFilters(p)},[p]),b.a.createElement(m.a,{contentHeight:"auto",className:"inner-card"},b.a.createElement(v.a,{inline:!0,size:"small"},b.a.createElement(j,{label:r.title},b.a.createElement(j,null,b.a.createElement(y.a,{placeholder:"key",value:o,trim:!0,onChange:function(e){return i(e)},onPressEnter:t,state:u})),b.a.createElement(j,null,b.a.createElement(y.a,{placeholder:"value",value:l,trim:!0,onChange:function(e){return s(e)},onPressEnter:t,state:c})),b.a.createElement(j,{label:""},b.a.createElement(g.a,{type:"primary",onClick:t,style:{marginRight:10}},r.addFilter),0o&&v.a.createElement(s.a,{className:"users-pagination",current:i,total:t.totalCount,pageSize:o,onChange:function(e){return a.setState({pageNo:e},function(){return a.getRoles()})}}),v.a.createElement(E,{visible:l,onOk:function(e){return Object(_.b)(e).then(function(e){return a.getRoles(),e})},onCancel:function(){return a.colseCreateRole()}}))}}]),n}(v.a.Component)).displayName="RolesManagement",n=o))||n)||n);t.a=r},function(y,e,t){"use strict";t(64);var n=t(46),w=t.n(n),n=(t(32),t(18)),M=t.n(n),n=(t(87),t(53)),k=t.n(n),n=(t(35),t(10)),S=t.n(n),E=t(21),n=(t(51),t(25)),r=t.n(n),n=(t(34),t(19)),o=t.n(n),n=(t(49),t(27)),i=t.n(n),l=t(14),s=t(15),u=t(22),d=t(17),c=t(16),n=(t(26),t(8)),n=t.n(n),a=(t(63),t(20)),x=t.n(a),a=(t(66),t(41)),a=t.n(a),f=(t(39),t(7)),C=t.n(f),f=t(0),L=t.n(f),p=t(1),T=t(47),D=t(48),O=t(140),f=(t(52),t(33)),h=t.n(f),f=(t(131),t(60)),m=t.n(f),g=(t(404),m.a.Item),N=(0,n.a.config)(((f=function(e){Object(d.a)(n,e);var t=Object(c.a)(n);function n(e){return Object(l.a)(this,n),(e=t.call(this,e)).state={dialogvisible:!1,loading:!1},e.defaultCode="",e.nodejsCode="TODO",e.cppCode="TODO",e.shellCode="TODO",e.pythonCode="TODO",e.record={},e.springCode="TODO",e.sprigbootCode="TODO",e.sprigcloudCode="TODO",e.csharpCode="TODO",e}return Object(s.a)(n,[{key:"componentDidMount",value:function(){}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"getData",value:function(){var e=Object(p.a)("namespace"),e={group:this.record.group||"",dataId:this.record.dataId||"",namespace:e,inEdas:window.globalConfig.isParentEdas()};this.defaultCode=this.getJavaCode(e),this.createCodeMirror("text/x-java",this.defaultCode),this.springCode=this.getSpringCode(e),this.sprigbootCode=this.getSpringBootCode(e),this.sprigcloudCode=this.getSpringCloudCode(e),this.nodejsCode=this.getNodejsCode(e),this.cppCode=this.getCppCode(e),this.shellCode=this.getShellCode(e),this.pythonCode=this.getPythonCode(e),this.csharpCode=this.getCSharpCode(e),this.forceUpdate()}},{key:"getJavaCode",value:function(e){return'/* Refer to document: https://github.com/alibaba/nacos/blob/master/example/src/main/java/com/alibaba/nacos/example\n* pom.xml\n \n com.alibaba.nacos\n nacos-client\n ${latest.version}\n \n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\n\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingFactory;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.listener.Event;\nimport com.alibaba.nacos.api.naming.listener.EventListener;\nimport com.alibaba.nacos.api.naming.listener.NamingEvent;\n\n/**\n * @author nkorange\n */\npublic class NamingExample {\n\n public static void main(String[] args) throws NacosException {\n\n Properties properties = new Properties();\n properties.setProperty("serverAddr", System.getProperty("serverAddr"));\n properties.setProperty("namespace", System.getProperty("namespace"));\n\n NamingService naming = NamingFactory.createNamingService(properties);\n\n naming.registerInstance("'.concat(this.record.name,'", "11.11.11.11", 8888, "TEST1");\n\n naming.registerInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n System.out.println(naming.getAllInstances("').concat(this.record.name,'"));\n\n naming.deregisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n System.out.println(naming.getAllInstances("').concat(this.record.name,'"));\n\n naming.subscribe("').concat(this.record.name,'", new EventListener() {\n @Override\n public void onEvent(Event event) {\n System.out.println(((NamingEvent)event).getServiceName());\n System.out.println(((NamingEvent)event).getInstances());\n }\n });\n }\n}')}},{key:"getSpringCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-discovery-example\n* pom.xml\n \n com.alibaba.nacos\n nacos-spring-context\n ${latest.version}\n \n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-example/nacos-spring-discovery-example/src/main/java/com/alibaba/nacos/example/spring\npackage com.alibaba.nacos.example.spring;\n\nimport com.alibaba.nacos.api.annotation.NacosProperties;\nimport com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))\npublic class NacosConfiguration {\n\n}\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-discovery-example/src/main/java/com/alibaba/nacos/example/spring/controller\npackage com.alibaba.nacos.example.spring.controller;\n\nimport com.alibaba.nacos.api.annotation.NacosInjected;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("discovery")\npublic class DiscoveryController {\n\n @NacosInjected\n private NamingService namingService;\n\n @RequestMapping(value = "/get", method = GET)\n @ResponseBody\n public List get(@RequestParam String serviceName) throws NacosException {\n return namingService.getAllInstances(serviceName);\n }\n}'}},{key:"getSpringBootCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example\n* pom.xml\n \n com.alibaba.boot\n nacos-discovery-spring-boot-starter\n ${latest.version}\n \n*/\n/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example/src/main/resources\n* application.properties\n nacos.discovery.server-addr=127.0.0.1:8848\n*/\n// Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example/src/main/java/com/alibaba/nacos/example/spring/boot/controller\n\npackage com.alibaba.nacos.example.spring.boot.controller;\n\nimport com.alibaba.nacos.api.annotation.NacosInjected;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("discovery")\npublic class DiscoveryController {\n\n @NacosInjected\n private NamingService namingService;\n\n @RequestMapping(value = "/get", method = GET)\n @ResponseBody\n public List get(@RequestParam String serviceName) throws NacosException {\n return namingService.getAllInstances(serviceName);\n }\n}'}},{key:"getSpringCloudCode",value:function(e){return"/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/\n* pom.xml\n \n org.springframework.cloud\n spring-cloud-starter-alibaba-nacos-discovery\n ${latest.version}\n \n*/\n\n// nacos-spring-cloud-provider-example\n\n/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example/src/main/resources\n* application.properties\nserver.port=18080\nspring.application.name=".concat(this.record.name,'\nspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example/src/main/java/com/alibaba/nacos/example/spring/cloud\npackage com.alibaba.nacos.example.spring.cloud;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * @author xiaojing\n */\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class NacosProviderApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(NacosProviderApplication.class, args);\n}\n\n @RestController\n class EchoController {\n @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)\n public String echo(@PathVariable String string) {\n return "Hello Nacos Discovery " + string;\n }\n }\n}\n\n// nacos-spring-cloud-consumer-example\n\n/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-consumer-example/src/main/resources\n* application.properties\nspring.application.name=micro-service-oauth2\nspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-consumer-example/src/main/java/com/alibaba/nacos/example/spring/cloud\npackage com.alibaba.nacos.example.spring.cloud;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.client.loadbalancer.LoadBalanced;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n * @author xiaojing\n */\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class NacosConsumerApplication {\n\n @LoadBalanced\n @Bean\n public RestTemplate restTemplate() {\n return new RestTemplate();\n }\n\n public static void main(String[] args) {\n SpringApplication.run(NacosConsumerApplication.class, args);\n }\n\n @RestController\n public class TestController {\n\n private final RestTemplate restTemplate;\n\n @Autowired\n public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}\n\n @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)\n public String echo(@PathVariable String str) {\n return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);\n }\n }\n}')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"getCSharpCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/\nDemo for Basic Nacos Opreation\nApp.csproj\n\n\n \n\n*/\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Nacos.V2;\nusing Nacos.V2.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nclass Program\n{\n static async Task Main(string[] args)\n {\n IServiceCollection services = new ServiceCollection();\n\n services.AddNacosV2Naming(x =>\n {\n x.ServerAddresses = new List { "http://localhost:8848/" };\n x.Namespace = "cs-test";\n\n // swich to use http or rpc\n x.NamingUseRpc = true;\n });\n\n IServiceProvider serviceProvider = services.BuildServiceProvider();\n var namingSvc = serviceProvider.GetService();\n\n await namingSvc.RegisterInstance("'.concat(this.record.name,'", "11.11.11.11", 8888, "TEST1");\n\n await namingSvc.RegisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(await namingSvc.GetAllInstances("').concat(this.record.name,'")));\n\n await namingSvc.DeregisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n var listener = new EventListener();\n\n await namingSvc.Subscribe("').concat(this.record.name,'", listener);\n }\n\n internal class EventListener : IEventListener\n {\n public Task OnEvent(IEvent @event)\n {\n Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(@event));\n return Task.CompletedTask;\n }\n }\n}\n\n/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/\nDemo for ASP.NET Core Integration\nApp.csproj\n\n\n \n\n*/\n\n/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/blob/dev/samples/App1/appsettings.json\n* appsettings.json\n{\n "nacos": {\n "ServerAddresses": [ "http://localhost:8848" ],\n "DefaultTimeOut": 15000,\n "Namespace": "cs",\n "ServiceName": "App1",\n "GroupName": "DEFAULT_GROUP",\n "ClusterName": "DEFAULT",\n "Port": 0,\n "Weight": 100,\n "RegisterEnabled": true,\n "InstanceEnabled": true,\n "Ephemeral": true,\n "NamingUseRpc": true,\n "NamingLoadCacheAtStart": ""\n }\n}\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/blob/dev/samples/App1/Startup.cs\nusing Nacos.AspNetCore.V2;\n\npublic class Startup\n{\n public Startup(IConfiguration configuration)\n {\n Configuration = configuration;\n }\n\n public IConfiguration Configuration { get; }\n\n public void ConfigureServices(IServiceCollection services)\n {\n // ....\n services.AddNacosAspNet(Configuration);\n }\n\n public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n {\n // ....\n }\n}\n ')}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}),this.cm.setSize("auto","490px"))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return L.a.createElement("div",null,L.a.createElement(o.a,{title:e.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:L.a.createElement("div",null),onClose:this.closeDialog.bind(this)},L.a.createElement("div",{style:{height:500}},L.a.createElement(h.a,{tip:e.loading,style:{width:"100%"},visible:this.state.loading},L.a.createElement(m.a,{shape:"text",style:{height:40,paddingBottom:10}},L.a.createElement(g,{title:"Java",key:0,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),L.a.createElement(g,{title:"Spring",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.springCode)}),L.a.createElement(g,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigbootCode)}),L.a.createElement(g,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloudCode)}),L.a.createElement(g,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),L.a.createElement(g,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),L.a.createElement(g,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),L.a.createElement(g,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)}),L.a.createElement(g,{title:"C#",key:7,onClick:this.changeTab.bind(this,"commoneditor7",this.csharpCode)})),L.a.createElement("div",{ref:"codepreview"})))))}}]),n}(L.a.Component)).displayName="ShowServiceCodeing",f=f))||f,P=t(69),j=(t(738),t(29)),Y=C.a.Item,I=a.a.Row,R=a.a.Col,A=x.a.Column,a=(0,n.a.config)(((f=function(e){Object(d.a)(a,e);var t=Object(c.a)(a);function a(e){var n;return Object(l.a)(this,a),(n=t.call(this,e)).getQueryLater=function(){setTimeout(function(){return n.queryServiceList()})},n.showcode=function(){setTimeout(function(){return n.queryServiceList()})},n.setNowNameSpace=function(e,t){return n.setState({nowNamespaceName:e,nowNamespaceId:t})},n.rowColor=function(e){return{className:e.healthyInstanceCount?"":"row-bg-red"}},n.editServiceDialog=L.a.createRef(),n.showcode=L.a.createRef(),n.state={loading:!1,total:0,pageSize:10,currentPage:1,dataSource:[],search:{serviceName:Object(p.a)("serviceNameParam")||"",groupName:Object(p.a)("groupNameParam")||""},hasIpCount:!("false"===localStorage.getItem("hasIpCount"))},n.field=new i.a(Object(u.a)(n)),n}return Object(s.a)(a,[{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){try{this.editServiceDialog.current.getInstance().show(this.state.service)}catch(e){}}},{key:"queryServiceList",value:function(){var n=this,e=this.state,t=e.currentPage,a=e.pageSize,r=e.search,o=e.withInstances,o=void 0!==o&&o,e=e.hasIpCount,e=["hasIpCount=".concat(e),"withInstances=".concat(o),"pageNo=".concat(t),"pageSize=".concat(a),"serviceNameParam=".concat(r.serviceName),"groupNameParam=".concat(r.groupName)];Object(p.c)({serviceNameParam:r.serviceName,groupNameParam:r.groupName}),this.openLoading(),Object(p.b)({url:"v1/ns/catalog/services?".concat(e.join("&")),success:function(){var e=0i&&_.a.createElement(s.a,{className:"users-pagination",current:l,total:t.totalCount,pageSize:i,onChange:function(e){return a.setState({pageNo:e},function(){return a.getPermissions()})}}),_.a.createElement(L,{visible:n,onOk:function(e){return Object(b.a)(e).then(function(e){return a.setState({pageNo:1},function(){return a.getPermissions()}),e})},onCancel:function(){return a.colseCreatePermission()}}))}}]),n}(_.a.Component)).displayName="PermissionsManagement",n=M))||n)||n);t.a=r},function(e,t,n){"use strict";n(64);var a=n(46),u=n.n(a),a=(n(34),n(19)),d=n.n(a),a=(n(63),n(20)),c=n.n(a),a=(n(32),n(18)),f=n.n(a),a=(n(87),n(53)),p=n.n(a),a=(n(39),n(7)),h=n.n(a),a=(n(35),n(10)),m=n.n(a),i=n(14),l=n(15),s=n(22),g=n(17),y=n(16),a=(n(26),n(8)),a=n.n(a),r=n(0),v=n.n(r),r=n(36),_=n(45),b=n(48),w=n(31),o=(n(49),n(27)),M=n.n(o),k=(n(159),h.a.Item),S={labelCol:{fixedSpan:4},wrapperCol:{span:19}},E=(0,a.a.config)(((o=function(e){Object(g.a)(o,e);var r=Object(y.a)(o);function o(){var e;Object(i.a)(this,o);for(var t=arguments.length,n=new Array(t),a=0;ao&&v.a.createElement(u.a,{className:"users-pagination",current:i,total:n.totalCount,pageSize:o,onChange:function(e){return t.setState({pageNo:e},function(){return t.getUsers()})}}),v.a.createElement(E,{visible:l,onOk:function(e){return Object(_.c)(e).then(function(e){return t.setState({pageNo:1},function(){return t.getUsers()}),e})},onCancel:function(){return t.colseCreateUser()}}),v.a.createElement(x.a,{visible:s,username:e,onOk:function(e){return Object(_.k)(e).then(function(e){return t.getUsers(),e})},onCancel:function(){return t.setState({passwordResetUser:void 0,passwordResetUserVisible:!1})}}))}}]),n}(v.a.Component)).displayName="UserManagement",n=o))||n)||n;t.a=r},function(e,t,l){"use strict";l(52);var n=l(33),g=l.n(n),n=(l(32),l(18)),y=l.n(n),n=(l(395),l(138)),v=l.n(n),n=(l(43),l(24)),_=l.n(n),n=(l(125),l(88)),b=l.n(n),n=(l(109),l(71)),w=l.n(n),n=(l(59),l(28)),M=l.n(n),n=(l(39),l(7)),k=l.n(n),n=(l(35),l(10)),S=l.n(n),n=(l(131),l(60)),E=l.n(n),a=l(61),n=(l(34),l(19)),s=l.n(n),x=l(21),n=(l(51),l(25)),r=l.n(n),o=l(14),i=l(15),u=l(17),d=l(16),n=(l(26),l(8)),n=l.n(n),c=(l(66),l(41)),c=l.n(c),f=l(0),C=l.n(f),p=l(1),h=l(47),m=l(37),L=l(137),T=l(105),D=l(90),O=(l(690),c.a.Row),N=c.a.Col,P=[{value:"text",label:"TEXT"},{value:"json",label:"JSON"},{value:"xml",label:"XML"},{value:"yaml",label:"YAML"},{value:"html",label:"HTML"},{value:"properties",label:"Properties"}],j=["production","beta"],n=(0,n.a.config)(((f=function(e){Object(u.a)(n,e);var t=Object(d.a)(n);function n(e){return Object(o.a)(this,n),(e=t.call(this,e)).state={loading:!1,isBeta:!1,isNewConfig:!0,betaPublishSuccess:!1,betaIps:"",tabActiveKey:"",form:{dataId:"",group:"",content:"",appName:"",desc:"",config_tags:[],type:"text"},tagDataSource:[],subscriberDataSource:[],openAdvancedSettings:!1,editorClass:"editor-normal"},e.successDialog=C.a.createRef(),e.diffEditorDialog=C.a.createRef(),e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){var t=this,e=!Object(p.a)("dataId"),n=Object(p.a)("group").trim();this.setState({isNewConfig:e},function(){e?(n&&t.setState({group:n}),t.initMoacoEditor("text","")):t.changeForm({dataId:Object(p.a)("dataId").trim(),group:n},function(){t.getConfig(!0).then(function(e){e?t.setState({isBeta:!0,tabActiveKey:"beta",betaPublishSuccess:!0}):t.getConfig()}),t.getSubscribesByNamespace()}),t.initFullScreenEvent()})}},{key:"initMoacoEditor",value:function(e,t){var n=this,a=document.getElementById("container"),r=(a.innerHTML="",{value:t,language:e,codeLens:!(this.monacoEditor=null),selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",folding:!1,showFoldingControls:"always",cursorStyle:"line",automaticLayout:!0});window.monaco?this.monacoEditor=window.monaco.editor.create(a,r):window.importEditor(function(){n.monacoEditor=window.monaco.editor.create(a,r)})}},{key:"initFullScreenEvent",value:function(){var t=this;document.body.addEventListener("keydown",function(e){"F1"===e.key?(e.preventDefault(),t.setState({editorClass:"editor-full-screen"})):"Escape"===e.key&&t.setState({editorClass:"editor-normal"})})}},{key:"createDiffCodeMirror",value:function(e,t){var n=this.diffEditorDialog.current.getInstance();n.innerHTML="",this.diffeditor=window.CodeMirror.MergeView(n,{value:e||"",origLeft:null,orig:t||"",lineNumbers:!0,mode:this.mode,theme:"xq-light",highlightDifferences:!0,connect:"align",collapseIdentical:!1})}},{key:"openDiff",value:function(e){this.diffcb=e;var e=this.monacoEditor.getValue(),t=this.codeVal||"",e=e.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"),t=t.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n");this.diffEditorDialog.current.getInstance().openDialog(e,t)}},{key:"clickTab",value:function(e){var t=this;this.setState({tabActiveKey:e},function(){return t.getConfig("beta"===e)})}},{key:"getCodeVal",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=this.state.form,t=(t.type,t.content),t=this.monacoEditor?this.monacoEditor.getValue():t;return t||(r.a.error({content:e.submitFailed,align:"cc cc"}),!1)}},{key:"setCodeVal",value:function(e){var t=this.state.form;this.setState({form:Object(x.a)(Object(x.a)({},t),{},{content:e})}),this.monacoEditor&&this.monacoEditor.setValue(e)}},{key:"publish",value:function(){var t=this,e=this.props.locale,n=void 0===e?{}:e,e=this.state.form.type,a=(this.state.isNewConfig&&this.validation(),this.getCodeVal());if(a)return L.a.validate({content:a,type:e})?this._publishConfig():new Promise(function(e){s.a.confirm({content:n.codeValErrorPrompt,onOk:function(){return e(t._publishConfig())},onCancel:function(){return e(!1)}})})}},{key:"_publishConfig",value:function(){var t=this,n=0this.state.pageSize&&w.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},w.a.createElement(f.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:function(e){return t.setState({currentPage:e},function(){return t.queryClusterStateList()})}}))))}}]),a}(w.a.Component)).displayName="ClusterNodeList",n=_))||n;t.a=g},function(e,t,n){"use strict";n(52);var a=n(33),r=n.n(a),a=(n(32),n(18)),o=n.n(a),a=(n(395),n(138)),i=n.n(a),a=(n(43),n(24)),l=n.n(a),a=(n(35),n(10)),s=n.n(a),u=n(61),a=(n(49),n(27)),d=n.n(a),a=(n(34),n(19)),c=n.n(a),a=(n(51),n(25)),f=n.n(a),p=n(14),h=n(15),m=n(22),g=n(17),y=n(16),a=(n(26),n(8)),a=n.n(a),v=(n(59),n(28)),_=n.n(v),v=(n(125),n(88)),v=n.n(v),b=(n(39),n(7)),w=n.n(b),b=n(65),M=n.n(b),b=n(0),k=n.n(b),S=n(105),E=n(1),x=n(47),C=n(137),L=(n(670),w.a.Item),T=v.a.Group,D=_.a.AutoComplete,v=(0,a.a.config)(((b=function(e){Object(g.a)(n,e);var t=Object(y.a)(n);function n(e){var l;return Object(p.a)(this,n),(l=t.call(this,e)).publicConfigBeforeCheck=function(t){var e=l.props.locale,n=void 0===e?{}:e,e=l.state.addonBefore;Object(E.b)({url:"v1/cs/configs",data:{show:"all",dataId:e+l.field.getValue("dataId"),group:l.field.getValue("group"),tenant:Object(E.a)("namespace")||""},success:function(e){f.a.error({content:n.dataIdExists,align:"cc cc"})},error:function(e){403===(e||{}).status?c.a.alert({content:n.publishFailed403}):l._publishConfig(t)}})},l._publishConfig=function(e){var n=Object(m.a)(l),t=l.props.locale,a=void 0===t?{}:t,t=l.state,r=t.addonBefore,o=t.config_tags,t=t.configType,i=(l.tenant=Object(E.a)("namespace")||"",{dataId:r+l.field.getValue("dataId"),group:l.field.getValue("group"),content:e,desc:l.field.getValue("desc"),config_tags:o.join(),type:t,appName:l.inApp?l.edasAppId:l.field.getValue("appName"),tenant:l.tenant});l.serverId=Object(E.a)("serverId")||"center";Object(E.b)({type:"post",contentType:"application/x-www-form-urlencoded",url:"v1/cs/configs",data:i,beforeSend:function(){l.openLoading()},success:function(e){var t={};t.maintitle=a.newListingMain,t.title=a.newListing,t.content="",t.dataId=i.dataId,t.group=i.group,!0===e?(n.group=i.group,n.dataId=i.dataId,Object(E.c)({group:i.group,dataId:i.dataId}),t.isok=!0):(t.isok=!1,t.message=e.message),n.successDialog.current.getInstance().openDialog(t)},complete:function(){l.closeLoading(),l.goList()},error:function(e){l.closeLoading(),c.a.alert({content:a.publishFailed})}})},l.successDialog=k.a.createRef(),l.field=new d.a(Object(m.a)(l)),l.edasAppName=Object(E.a)("edasAppName")||"",l.edasAppId=Object(E.a)("edasAppId")||"",l.inApp=l.edasAppName,l.field.setValue("appName",l.inApp?l.edasAppName:""),l.inEdas=window.globalConfig.isParentEdas(),l.dataId=Object(E.a)("dataId")||"",l.group=Object(E.a)("group")||"DEFAULT_GROUP",l.searchDataId=Object(E.a)("searchDataId")||"",l.searchGroup=Object(E.a)("searchGroup")||"",l.state={configType:"text",codeValue:"",envname:"",targetEnvName:"",groups:[],groupNames:[],envlist:[],tagLst:[],config_tags:[],envvalues:[],showmore:!1,loading:!1,encrypt:!1,addonBefore:"",showGroupWarning:!1,editorClass:"editor-normal"},l.codeValue="",l.mode="text",l.ips="",l}return Object(h.a)(n,[{key:"componentDidMount",value:function(){var e=this;this.betaips=document.getElementById("betaips"),this.chontenttab=document.getElementById("chontenttab"),this.tenant=Object(E.a)("namespace")||"",this.field.setValue("group",this.group),window.monaco?this.initMoacoEditor():window.importEditor(function(){e.initMoacoEditor()}),this.initFullScreenEvent()}},{key:"changeModel",value:function(e){var t,n;this.monacoEditor?(t=this.monacoEditor.getModel(),n=this.monacoEditor.getValue(),n=window.monaco.editor.createModel(n,e),this.monacoEditor.setModel(n),t&&t.dispose()):(M()("#container").empty(),this.monacoEditor=window.monaco.editor.create(document.getElementById("container"),{model:null}))}},{key:"initMoacoEditor",value:function(){this.monacoEditor=window.monaco.editor.create(document.getElementById("container"),{value:this.codeValue,language:this.state.configType,codeLens:!0,selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",folding:!0,showFoldingControls:"always",cursorStyle:"line",automaticLayout:!0})}},{key:"initFullScreenEvent",value:function(){var t=this;document.body.addEventListener("keydown",function(e){"F1"===e.key&&(e.preventDefault(),t.setState({editorClass:"editor-full-screen"})),"Escape"===e.key&&t.setState({editorClass:"editor-normal"})})}},{key:"setGroup",value:function(e){this.group=e||"",this.field.setValue("group",this.group),this.inEdas&&this.setState({showGroupWarning:""!==this.group&&this.state.groupNames.indexOf(e)<0})}},{key:"tagSearch",value:function(e){var t=this.state.tagLst;t.includes(e)||this.setState({tagLst:[e].concat(Object(u.a)(t))})}},{key:"setConfigTags",value:function(n){5this.state.pageSize&&M.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},M.a.createElement(g.a,{current:this.state.pageNo,total:a,pageSize:this.state.pageSize,onChange:function(e){return t.setState({pageNo:e},function(){return t.querySubscriberList()})}}))))}}]),a}(M.a.Component)).displayName="SubscriberList",c=n))||c)||c;t.a=f},function(e,t,n){"use strict";n(43);function o(e){var t=void 0===(t=localStorage.token)?"{}":t,t=(Object(y.c)(t)&&JSON.parse(t)||{}).globalAdmin;return["naming"===e?void 0:v,{key:"serviceManagementVirtual",children:[{key:"serviceManagement",url:"/serviceManagement"},{key:"subscriberList",url:"/subscriberList"}]},t?_:void 0,{key:"namespace",url:"/namespace"},{key:"clusterManagementVirtual",children:[{key:"clusterManagement",url:"/clusterManagement"}]}].filter(function(e){return e})}var a=n(24),i=n.n(a),r=n(14),l=n(15),s=n(17),u=n(16),a=(n(26),n(8)),a=n.n(a),d=n(21),c=(n(80),n(50)),f=n.n(c),c=n(0),p=n.n(c),c=n(40),h=n(36),m=n(134),g=n(101),y=n(47),v={key:"configurationManagementVirtual",children:[{key:"configurationManagement",url:"/configurationManagement"},{key:"historyRollback",url:"/historyRollback"},{key:"listeningToQuery",url:"/listeningToQuery"}]},_={key:"authorityControl",children:[{key:"userList",url:"/userManagement"},{key:"roleManagement",url:"/rolesManagement"},{key:"privilegeManagement",url:"/permissionsManagement"}]},b=f.a.SubMenu,w=f.a.Item,c=(n=Object(h.b)(function(e){return Object(d.a)(Object(d.a)({},e.locale),e.base)},{getState:g.b}),h=a.a.config,Object(c.g)(a=n(a=h(((g=function(e){Object(s.a)(n,e);var t=Object(u.a)(n);function n(){return Object(r.a)(this,n),t.apply(this,arguments)}return Object(l.a)(n,[{key:"componentDidMount",value:function(){this.props.getState()}},{key:"goBack",value:function(){this.props.history.goBack()}},{key:"navTo",value:function(e){var t=this.props.location.search,t=new URLSearchParams(t);t.set("namespace",window.nownamespace),t.set("namespaceShowName",window.namespaceShowName),this.props.history.push([e,"?",t.toString()].join(""))}},{key:"isCurrentPath",value:function(e){return e===this.props.location.pathname?"current-path next-selected":void 0}},{key:"defaultOpenKeys",value:function(){for(var t=this,e=o(this.props.functionMode),n=0,a=e.length;n=11?e:e+12;else if(t==="下午"||t==="晚上")return e+12},meridiem:function(e,t,n){var a=e*100+t;if(a<600)return"凌晨";else if(a<900)return"早上";else if(a<1130)return"上午";else if(a<1230)return"中午";else if(a<1800)return"下午";else return"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(n(9))},function(e,t,n){"use strict";t.__esModule=!0;var u=p(n(2)),a=p(n(4)),r=p(n(6)),o=p(n(7)),i=n(0),d=p(i),l=p(n(3)),c=p(n(13)),s=p(n(8)),f=n(11);function p(e){return e&&e.__esModule?e:{default:e}}h=i.Component,(0,o.default)(m,h),m.prototype.render=function(){var e,t=this.props,n=t.prefix,a=t.type,r=t.size,o=t.className,i=t.rtl,l=t.style,t=t.children,s=f.obj.pickOthers((0,u.default)({},m.propTypes),this.props),n=(0,c.default)(((e={})[n+"icon"]=!0,e[n+"icon-"+a]=!!a,e[""+n+r]=!!r&&"string"==typeof r,e[o]=!!o,e)),o=(i&&-1!==["arrow-left","arrow-right","arrow-double-left","arrow-double-right","switch","sorting","descending","ascending"].indexOf(a)&&(s.dir="rtl"),"number"==typeof r?{width:r,height:r,lineHeight:r+"px",fontSize:r}:{});return d.default.createElement("i",(0,u.default)({},s,{style:(0,u.default)({},o,l),className:n}),t)},i=n=m,n.propTypes=(0,u.default)({},s.default.propTypes,{type:l.default.string,children:l.default.node,size:l.default.oneOfType([l.default.oneOf(["xxs","xs","small","medium","large","xl","xxl","xxxl","inherit"]),l.default.number]),className:l.default.string,style:l.default.object}),n.defaultProps={prefix:"next-",size:"medium"},n._typeMark="icon";var h,o=i;function m(){return(0,a.default)(this,m),(0,r.default)(this,h.apply(this,arguments))}o.displayName="Icon",t.default=o,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=s(n(2)),y=s(n(12)),a=s(n(38)),r=s(n(4)),o=s(n(6)),i=s(n(7)),v=n(0),_=s(v),l=s(n(3)),b=n(157),w=s(n(525));function s(e){return e&&e.__esModule?e:{default:e}}function u(){}function M(e){return _.default.Children.toArray(e.children)[0]||null}d=v.Component,(0,i.default)(c,d),c.prototype.normalizeNames=function(e){return"string"==typeof e?{appear:e+"-appear",appearActive:e+"-appear-active",enter:e+"-enter",enterActive:e+"-enter-active",leave:e+"-leave",leaveActive:e+"-leave-active"}:"object"===(void 0===e?"undefined":(0,a.default)(e))?{appear:e.appear,appearActive:e.appear+"-active",enter:""+e.enter,enterActive:e.enter+"-active",leave:""+e.leave,leaveActive:e.leave+"-active"}:void 0},c.prototype.render=function(){var t=this,e=this.props,n=e.animation,a=e.children,r=e.animationAppear,o=e.singleMode,i=e.component,l=e.beforeAppear,s=e.onAppear,u=e.afterAppear,d=e.beforeEnter,c=e.onEnter,f=e.afterEnter,p=e.beforeLeave,h=e.onLeave,m=e.afterLeave,e=(0,y.default)(e,["animation","children","animationAppear","singleMode","component","beforeAppear","onAppear","afterAppear","beforeEnter","onEnter","afterEnter","beforeLeave","onLeave","afterLeave"]),a=v.Children.map(a,function(e){return _.default.createElement(w.default,{key:e.key,names:t.normalizeNames(n),onAppear:l,onAppearing:s,onAppeared:u,onEnter:d,onEntering:c,onEntered:f,onExit:p,onExiting:h,onExited:m},e)});return _.default.createElement(b.TransitionGroup,(0,g.default)({appear:r,component:o?M:i},e),a)},i=n=c,n.propTypes={animation:l.default.oneOfType([l.default.string,l.default.object]),animationAppear:l.default.bool,component:l.default.any,singleMode:l.default.bool,children:l.default.oneOfType([l.default.element,l.default.arrayOf(l.default.element)]),beforeAppear:l.default.func,onAppear:l.default.func,afterAppear:l.default.func,beforeEnter:l.default.func,onEnter:l.default.func,afterEnter:l.default.func,beforeLeave:l.default.func,onLeave:l.default.func,afterLeave:l.default.func},n.defaultProps={animationAppear:!0,component:"div",singleMode:!0,beforeAppear:u,onAppear:u,afterAppear:u,beforeEnter:u,onEnter:u,afterEnter:u,beforeLeave:u,onLeave:u,afterLeave:u};var d,l=i;function c(){return(0,r.default)(this,c),(0,o.default)(this,d.apply(this,arguments))}l.displayName="Animate",t.default=l,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=t.EXITING=t.ENTERED=t.ENTERING=t.EXITED=t.UNMOUNTED=void 0;var a=function(e){{if(e&&e.__esModule)return e;var t,n={};if(null!=e)for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&((t=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,a):{}).get||t.set?Object.defineProperty(n,a,t):n[a]=e[a]);return n.default=e,n}}(n(3)),o=l(n(0)),i=l(n(23)),r=n(30);n(346);function l(e){return e&&e.__esModule?e:{default:e}}var s="unmounted",u=(t.UNMOUNTED=s,"exited"),d=(t.EXITED=u,"entering"),c=(t.ENTERING=d,"entered"),f=(t.ENTERED=c,"exiting"),n=(t.EXITING=f,function(r){var e;function t(e,t){var n,a=r.call(this,e,t)||this,t=t.transitionGroup,t=t&&!t.isMounting?e.enter:e.appear;return a.appearStatus=null,e.in?t?(n=u,a.appearStatus=d):n=c:n=e.unmountOnExit||e.mountOnEnter?s:u,a.state={status:n},a.nextCallback=null,a}e=r,(n=t).prototype=Object.create(e.prototype),(n.prototype.constructor=n).__proto__=e;var n=t.prototype;return n.getChildContext=function(){return{transitionGroup:null}},t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===s?{status:u}:null},n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;e!==this.props&&(e=this.state.status,this.props.in?e!==d&&e!==c&&(t=d):e!==d&&e!==c||(t=f)),this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n=this.props.timeout,a=e=t=n;return null!=n&&"number"!=typeof n&&(a=n.exit,e=n.enter,t=void 0!==n.appear?n.appear:e),{exit:a,enter:e,appear:t}},n.updateStatus=function(e,t){var n;void 0===e&&(e=!1),null!==t?(this.cancelNextCallback(),n=i.default.findDOMNode(this),t===d?this.performEnter(n,e):this.performExit(n)):this.props.unmountOnExit&&this.state.status===u&&this.setState({status:s})},n.performEnter=function(e,t){var n=this,a=this.props.enter,r=this.context.transitionGroup?this.context.transitionGroup.isMounting:t,o=this.getTimeouts(),i=r?o.appear:o.enter;t||a?(this.props.onEnter(e,r),this.safeSetState({status:d},function(){n.props.onEntering(e,r),n.onTransitionEnd(e,i,function(){n.safeSetState({status:c},function(){n.props.onEntered(e,r)})})})):this.safeSetState({status:c},function(){n.props.onEntered(e)})},n.performExit=function(e){var t=this,n=this.props.exit,a=this.getTimeouts();n?(this.props.onExit(e),this.safeSetState({status:f},function(){t.props.onExiting(e),t.onTransitionEnd(e,a.exit,function(){t.safeSetState({status:u},function(){t.props.onExited(e)})})})):this.safeSetState({status:u},function(){t.props.onExited(e)})},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(t){var n=this,a=!0;return this.nextCallback=function(e){a&&(a=!1,n.nextCallback=null,t(e))},this.nextCallback.cancel=function(){a=!1},this.nextCallback},n.onTransitionEnd=function(e,t,n){this.setNextCallback(n);n=null==t&&!this.props.addEndListener;!e||n?setTimeout(this.nextCallback,0):(this.props.addEndListener&&this.props.addEndListener(e,this.nextCallback),null!=t&&setTimeout(this.nextCallback,t))},n.render=function(){var e=this.state.status;if(e===s)return null;var t=this.props,n=t.children,t=function(e,t){if(null==e)return{};for(var n,a={},r=Object.keys(e),o=0;o 16.8.0"),null;function t(e){j.current=e,ne({})}function a(e,t){N(te,null),"function"==typeof S&&S(e,t)}function n(e){27===e.keyCode&&Y&&!P.current.size&&a("esc",e)}function r(){j.current||(t(!0),he.dom.setStyle(D.current,"display","none"),me.default.unlock(document.body,ee.current),s&&O.current&&(O.current.focus(),O.current=null),I())}var o=e.prefix,o=void 0===o?"next-":o,i=e.afterClose,I=void 0===i?ye:i,i=e.hasMask,l=void 0===i||i,i=e.autoFocus,s=void 0!==i&&i,i=e.className,R=e.title,A=e.children,H=e.footer,F=e.footerAlign,z=e.footerActions,u=e.onOk,u=void 0===u?ye:u,d=e.onCancel,W=e.okProps,V=e.cancelProps,c=e.locale,c=void 0===c?pe.default.Dialog:c,B=e.rtl,f=e.visible,p=e.closeMode,p=void 0===p?["close","esc"]:p,U=e.closeIcon,h=e.animation,h=void 0===h?{in:"fadeInUp",out:"fadeOutUp"}:h,m=e.cache,K=e.wrapperStyle,g=e.popupContainer,y=void 0===g?document.body:g,g=e.dialogRender,v=e.centered,_=e.top,_=void 0===_?v?40:100:_,b=e.bottom,b=void 0===b?40:b,w=e.width,w=void 0===w?520:w,G=e.height,M=e.isFullScreen,k=e.overflowScroll,M=void 0===k?!M:k,k=e.minMargin,S=e.onClose,q=e.style,E=(0,ie.default)(e,["prefix","afterClose","hasMask","autoFocus","className","title","children","footer","footerAlign","footerActions","onOk","onCancel","okProps","cancelProps","locale","rtl","visible","closeMode","closeIcon","animation","cache","wrapperStyle","popupContainer","dialogRender","centered","top","bottom","width","height","isFullScreen","overflowScroll","minMargin","onClose","style"]),x=("isFullScreen"in e&&he.log.deprecated("isFullScreen","overflowScroll","Dialog v2"),"minMargin"in e&&he.log.deprecated("minMargin","top/bottom","Dialog v2"),(0,le.useState)(f||!1)),$=x[0],J=x[1],x=(0,le.useState)(f),C=x[0],X=x[1],Q="string"==typeof y?function(){return document.getElementById(y)}:"function"!=typeof y?function(){return y}:y,x=(0,le.useState)(Q()),L=x[0],Z=x[1],T=(0,le.useRef)(null),D=(0,le.useRef)(null),O=(0,le.useRef)(null),ee=(0,le.useRef)(null),te=(0,le.useState)((0,he.guid)())[0],x=(0,le.useContext)(ge),N=x.setVisibleOverlayToParent,x=(0,ie.default)(x,["setVisibleOverlayToParent"]),P=(0,le.useRef)(new Map),j=(0,le.useRef)(!1),ne=(0,le.useState)()[1],Y=!1,ae=!1,re=!1;(Array.isArray(p)?p:[p]).forEach(function(e){switch(e){case"esc":Y=!0;break;case"mask":ae=!0;break;case"close":re=!0}}),(0,le.useEffect)(function(){"visible"in e&&X(f)},[f]),(0,le.useEffect)(function(){var e;C&&l&&(e={overflow:"hidden"},he.dom.hasScroll(document.body)&&he.dom.scrollbar().width&&(e.paddingRight=he.dom.getStyle(document.body,"paddingRight")+he.dom.scrollbar().width+"px"),ee.current=me.default.lock(document.body,e))},[C&&l]),(0,le.useEffect)(function(){if(C&&Y)return document.body.addEventListener("keydown",n,!1),function(){document.body.removeEventListener("keydown",n,!1)}},[C&&Y]),(0,le.useEffect)(function(){!$&&C&&J(!0)},[C]),(0,le.useEffect)(function(){L||setTimeout(function(){Z(Q())})},[L]);if((0,le.useEffect)(function(){return function(){r()}},[]),!1===$||!L)return null;if(!C&&!m&&j.current)return null;m=(0,de.default)(((p={})[o+"overlay-wrapper"]=!0,p.opened=C,p)),i=(0,de.default)(((p={})[o+"dialog-v2"]=!0,p[i]=!!i,p)),p={},k=void(v?_||b||!k?(_&&(p.marginTop=_),b&&(p.marginBottom=b)):(p.marginTop=k,p.marginBottom=k):(_&&(p.top=_),b&&(p.paddingBottom=b))),M&&(k="calc(100vh - "+(_+b)+"px)"),M={appear:300,enter:300,exit:250},_=se.default.createElement(fe.default.OverlayAnimate,{visible:C,animation:h,timeout:M,onEnter:function(){t(!1),he.dom.setStyle(D.current,"display","")},onEntered:function(){var e;s&&T.current&&T.current.bodyNode&&(0<(e=he.focus.getFocusNodeList(T.current.bodyNode)).length&&e[0]&&(O.current=document.activeElement,e[0].focus())),N(te,D.current)},onExited:r},se.default.createElement(ce.default,(0,oe.default)({},E,{style:v?(0,oe.default)({},p,q):q,v2:!0,ref:T,prefix:o,className:i,title:R,footer:H,footerAlign:F,footerActions:z,onOk:C?u:ye,onCancel:C?function(e){"function"==typeof d?d(e):a("cancelBtn",e)}:ye,okProps:W,cancelProps:V,locale:c,closeable:re,rtl:B,onClose:function(){for(var e=arguments.length,t=Array(e),n=0;n>6]+d[128|63&s]:s<55296||57344<=s?i+=d[224|s>>12]+d[128|s>>6&63]+d[128|63&s]:(l+=1,s=65536+((1023&s)<<10|1023&o.charCodeAt(l)),i+=d[240|s>>18]+d[128|s>>12&63]+d[128|s>>6&63]+d[128|63&s])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(m(e)){for(var n=[],a=0;athis.popupNode.offsetWidth&&p(this.popupNode,"width",l.offsetWidth+"px"),"outside"!==a||"hoz"===r&&1===n||(p(this.popupNode,"height",u.offsetHeight+"px"),this.popupNode.firstElementChild&&p(this.popupNode.firstElementChild,"overflow-y","auto")),this.popupProps);d.onOpen&&d.onOpen()}catch(e){return null}},S.prototype.handlePopupClose=function(){var e=this.props.root.popupNodes,t=e.indexOf(this.popupNode),e=(-1t?r[t+1]:r[0])}),n[a]||(o=r[0]),i.onSort(a,o)},i.keydownHandler=function(e){e.preventDefault(),e.stopPropagation(),e.keyCode===l.KEYCODE.ENTER&&i.handleClick()},i.onSort=function(e,t){var n={};n[e]=t,i.props.onSort(e,t,n)},(0,o.default)(i,e)}i.displayName="Sort",t.default=i,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=c(n(2)),a=c(n(4)),o=c(n(6)),i=c(n(7)),l=c(n(0)),s=c(n(3)),u=c(n(13)),d=c(n(389));function c(e){return e&&e.__esModule?e:{default:e}}f=l.default.Component,(0,i.default)(p,f),p.prototype.render=function(){var e=this.props,t=e.className,n=e.record,e=e.primaryKey,a=this.context.selectedRowKeys,n=(0,u.default)(((a={selected:-1 "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":" "+this.message},o}(Error);e.exports=n},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?" "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":" "+this.message},o}(Error);e.exports=n},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var y=m(n(2)),a=m(n(4)),r=m(n(6)),o=m(n(7)),i=n(0),v=m(i),l=n(23),s=m(n(3)),_=m(n(13)),u=n(11),f=m(n(51)),d=m(n(62)),b=m(n(10)),c=m(n(44)),p=m(n(675)),h=m(n(400)),w=n(177);function m(e){return e&&e.__esModule?e:{default:e}}var M=d.default.Popup,g=f.default.Item,k=f.default.Group,n=u.func.noop,S=u.func.bindCtx,E=u.func.makeChain;x=v.default.Component,(0,o.default)(C,x),C.prototype.componentDidMount=function(){var e=this;setTimeout(function(){return e.syncWidth()},0),u.events.on(window,"resize",this.handleResize)},C.prototype.componentDidUpdate=function(e,t){e.label===this.props.label&&t.value===this.state.value||this.syncWidth()},C.prototype.componentWillUnmount=function(){u.events.off(window,"resize",this.handleResize),clearTimeout(this.resizeTimeout)},C.prototype.syncWidth=function(){var e=this,t=this.props,n=t.popupStyle,t=t.popupProps;n&&"width"in n||t&&t.style&&"width"in t.style||(n=u.dom.getStyle(this.selectDOM,"width"))&&this.width!==n&&(this.width=n,this.popupRef&&this.shouldAutoWidth()&&setTimeout(function(){e.popupRef&&u.dom.setStyle(e.popupRef,"width",e.width)},0))},C.prototype.handleResize=function(){var e=this;clearTimeout(this.resizeTimeout),this.state.visible&&(this.resizeTimeout=setTimeout(function(){e.syncWidth()},200))},C.prototype.setDataSource=function(e){var t=e.dataSource,e=e.children;return i.Children.count(e)?this.dataStore.updateByDS(e,!0):Array.isArray(t)?this.dataStore.updateByDS(t,!1):[]},C.prototype.setVisible=function(e,t){this.props.disabled&&e||this.state.visible===e||("visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t))},C.prototype.setFirstHightLightKeyForMenu=function(e){var t=this.state.highlightKey;this.props.autoHighlightFirstItem&&(this.dataStore.getMenuDS().length&&this.dataStore.getEnableDS().length&&(!t||e)&&(t=""+this.dataStore.getEnableDS()[0].value,this.setState({highlightKey:t}),this.props.onToggleHighlightItem(t,"autoFirstItem")),e&&!this.dataStore.getEnableDS().length&&(this.setState({highlightKey:null}),this.props.onToggleHighlightItem(null,"highlightKeyToNull")))},C.prototype.handleChange=function(e){var t;"value"in this.props||this.setState({value:e});for(var n=arguments.length,a=Array(1e.slidesToShow&&(n=e.slideWidth*e.slidesToShow*-1,o=e.slideHeight*e.slidesToShow*-1),e.slideCount%e.slidesToScroll!=0&&(t=e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow,(t=e.rtl?(e.slideIndex>=e.slideCount?e.slideCount-e.slideIndex:e.slideIndex)+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow:t)&&(o=e.slideIndex>e.slideCount?(n=(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideWidth*-1,(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideHeight*-1):(n=e.slideCount%e.slidesToScroll*e.slideWidth*-1,e.slideCount%e.slidesToScroll*e.slideHeight*-1)))):e.slideCount%e.slidesToScroll!=0&&e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow&&(n=(e.slidesToShow-e.slideCount%e.slidesToScroll)*e.slideWidth),e.centerMode&&(e.infinite?n+=e.slideWidth*Math.floor(e.slidesToShow/2):n=e.slideWidth*Math.floor(e.slidesToShow/2)),a=e.vertical?e.slideIndex*e.slideHeight*-1+o:e.slideIndex*e.slideWidth*-1+n,!0===e.variableWidth&&(t=void 0,a=(r=e.slideCount<=e.slidesToShow||!1===e.infinite?i.default.findDOMNode(e.trackRef).childNodes[e.slideIndex]:(t=e.slideIndex+e.slidesToShow,i.default.findDOMNode(e.trackRef).childNodes[t]))?-1*r.offsetLeft:0,!0===e.centerMode&&(r=!1===e.infinite?i.default.findDOMNode(e.trackRef).children[e.slideIndex]:i.default.findDOMNode(e.trackRef).children[e.slideIndex+e.slidesToShow+1])&&(a=-1*r.offsetLeft+(e.listWidth-r.offsetWidth)/2)),a)}},function(e,t,n){"use strict";t.__esModule=!0;var p=u(n(2)),h=u(n(12)),o=u(n(4)),i=u(n(6)),a=u(n(7)),m=u(n(0)),r=u(n(3)),g=u(n(13)),l=u(n(8)),y=u(n(24)),s=n(11);function u(e){return e&&e.__esModule?e:{default:e}}d=m.default.Component,(0,a.default)(c,d),c.prototype.render=function(){var e=this.props,t=e.title,n=e.children,a=e.className,r=e.isExpanded,o=e.disabled,i=e.style,l=e.prefix,s=e.onClick,u=e.id,e=(0,h.default)(e,["title","children","className","isExpanded","disabled","style","prefix","onClick","id"]),a=(0,g.default)(((d={})[l+"collapse-panel"]=!0,d[l+"collapse-panel-hidden"]=!r,d[l+"collapse-panel-expanded"]=r,d[l+"collapse-panel-disabled"]=o,d[a]=a,d)),d=(0,g.default)(((d={})[l+"collapse-panel-icon"]=!0,d[l+"collapse-panel-icon-expanded"]=r,d)),c=u?u+"-heading":void 0,f=u?u+"-region":void 0;return m.default.createElement("div",(0,p.default)({className:a,style:i,id:u},e),m.default.createElement("div",{id:c,className:l+"collapse-panel-title",onClick:s,onKeyDown:this.onKeyDown,tabIndex:"0","aria-disabled":o,"aria-expanded":r,"aria-controls":f,role:"button"},m.default.createElement(y.default,{type:"arrow-right",className:d,"aria-hidden":"true"}),t),m.default.createElement("div",{className:l+"collapse-panel-content",role:"region",id:f},n))},a=n=c,n.propTypes={prefix:r.default.string,style:r.default.object,children:r.default.any,isExpanded:r.default.bool,disabled:r.default.bool,title:r.default.node,className:r.default.string,onClick:r.default.func,id:r.default.string},n.defaultProps={prefix:"next-",isExpanded:!1,onClick:s.func.noop},n.isNextPanel=!0;var d,r=a;function c(){var e,n;(0,o.default)(this,c);for(var t=arguments.length,a=Array(t),r=0;r\n com.alibaba.nacos\n nacos-client\n ${version}\n \n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\nimport java.util.concurrent.Executor;\nimport com.alibaba.nacos.api.NacosFactory;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport com.alibaba.nacos.api.config.listener.Listener;\nimport com.alibaba.nacos.api.exception.NacosException;\n\n/**\n * Config service example\n *\n * @author Nacos\n *\n */\npublic class ConfigExample {\n\n\tpublic static void main(String[] args) throws NacosException, InterruptedException {\n\t\tString serverAddr = "localhost";\n\t\tString dataId = "'.concat(e.dataId,'";\n\t\tString group = "').concat(e.group,'";\n\t\tProperties properties = new Properties();\n\t\tproperties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);\n\t\tConfigService configService = NacosFactory.createConfigService(properties);\n\t\tString content = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tconfigService.addListener(dataId, group, new Listener() {\n\t\t\t@Override\n\t\t\tpublic void receiveConfigInfo(String configInfo) {\n\t\t\t\tSystem.out.println("recieve:" + configInfo);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic Executor getExecutor() {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\n\t\tboolean isPublishOk = configService.publishConfig(dataId, group, "content");\n\t\tSystem.out.println(isPublishOk);\n\n\t\tThread.sleep(3000);\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\n\t\tboolean isRemoveOk = configService.removeConfig(dataId, group);\n\t\tSystem.out.println(isRemoveOk);\n\t\tThread.sleep(3000);\n\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tThread.sleep(300000);\n\n\t}\n}\n')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"getCSharpCode",value:function(e){return'/*\nDemo for Basic Nacos Opreation\nApp.csproj\n\n\n \n\n*/\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Nacos.V2;\nusing Nacos.V2.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nclass Program\n{\n static async Task Main(string[] args)\n {\n string serverAddr = "http://localhost:8848";\n string dataId = "'.concat(e.dataId,'";\n string group = "').concat(e.group,'";\n\n IServiceCollection services = new ServiceCollection();\n\n services.AddNacosV2Config(x =>\n {\n x.ServerAddresses = new List { serverAddr };\n x.Namespace = "cs-test";\n\n // swich to use http or rpc\n x.ConfigUseRpc = true;\n });\n\n IServiceProvider serviceProvider = services.BuildServiceProvider();\n var configSvc = serviceProvider.GetService();\n\n var content = await configSvc.GetConfig(dataId, group, 3000);\n Console.WriteLine(content);\n\n var listener = new ConfigListener();\n\n await configSvc.AddListener(dataId, group, listener);\n\n var isPublishOk = await configSvc.PublishConfig(dataId, group, "content");\n Console.WriteLine(isPublishOk);\n\n await Task.Delay(3000);\n content = await configSvc.GetConfig(dataId, group, 5000);\n Console.WriteLine(content);\n\n var isRemoveOk = await configSvc.RemoveConfig(dataId, group);\n Console.WriteLine(isRemoveOk);\n await Task.Delay(3000);\n\n content = await configSvc.GetConfig(dataId, group, 5000);\n Console.WriteLine(content);\n await Task.Delay(300000);\n }\n\n internal class ConfigListener : IListener\n {\n public void ReceiveConfigInfo(string configInfo)\n {\n Console.WriteLine("recieve:" + configInfo);\n }\n }\n}\n\n/*\nRefer to document: https://github.com/nacos-group/nacos-sdk-csharp/tree/dev/samples/MsConfigApp\nDemo for ASP.NET Core Integration\nMsConfigApp.csproj\n\n\n \n\n*/\n\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Hosting;\nusing Serilog;\nusing Serilog.Events;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n Log.Logger = new LoggerConfiguration()\n .Enrich.FromLogContext()\n .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)\n .MinimumLevel.Override("System", LogEventLevel.Warning)\n .MinimumLevel.Debug()\n .WriteTo.Console()\n .CreateLogger();\n\n try\n {\n Log.ForContext().Information("Application starting...");\n CreateHostBuilder(args, Log.Logger).Build().Run();\n }\n catch (System.Exception ex)\n {\n Log.ForContext().Fatal(ex, "Application start-up failed!!");\n }\n finally\n {\n Log.CloseAndFlush();\n }\n }\n\n public static IHostBuilder CreateHostBuilder(string[] args, Serilog.ILogger logger) =>\n Host.CreateDefaultBuilder(args)\n .ConfigureAppConfiguration((context, builder) =>\n {\n var c = builder.Build();\n builder.AddNacosV2Configuration(c.GetSection("NacosConfig"), logAction: x => x.AddSerilog(logger));\n })\n .ConfigureWebHostDefaults(webBuilder =>\n {\n webBuilder.UseStartup().UseUrls("http://*:8787");\n })\n .UseSerilog();\n}\n ')}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return x.a.createElement("div",null,x.a.createElement(y.a,{title:e.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:x.a.createElement("div",null),onClose:this.closeDialog.bind(this)},x.a.createElement("div",{style:{height:500}},x.a.createElement(A.a,{tip:e.loading,style:{width:"100%"},visible:this.state.loading},x.a.createElement(D.a,{shape:"text",style:{height:40,paddingBottom:10}},x.a.createElement(O,{title:"Java",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),x.a.createElement(O,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigboot_code)}),x.a.createElement(O,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloud_code)}),x.a.createElement(O,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),x.a.createElement(O,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),x.a.createElement(O,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),x.a.createElement(O,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)}),x.a.createElement(O,{title:"C#",key:7,onClick:this.changeTab.bind(this,"commoneditor7",this.csharpCode)})),x.a.createElement("div",{ref:"codepreview"})))))}}]),n}(x.a.Component)).displayName="ShowCodeing",S=S))||S,S=(t(66),t(41)),S=t.n(S),F=(t(716),S.a.Row),N=S.a.Col,z=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(e){return Object(_.a)(this,n),(e=t.call(this,e)).state={visible:!1,title:"",content:"",isok:!0,dataId:"",group:""},e}return Object(b.a)(n,[{key:"componentDidMount",value:function(){this.initData()}},{key:"initData",value:function(){var e=this.props.locale;this.setState({title:(void 0===e?{}:e).confManagement})}},{key:"openDialog",value:function(e){this.setState({visible:!0,title:e.title,content:e.content,isok:e.isok,dataId:e.dataId,group:e.group,message:e.message})}},{key:"closeDialog",value:function(){this.setState({visible:!1})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e,t=x.a.createElement("div",{style:{textAlign:"right"}},x.a.createElement(d.a,{type:"primary",onClick:this.closeDialog.bind(this)},e.determine));return x.a.createElement("div",null,x.a.createElement(y.a,{visible:this.state.visible,footer:t,style:{width:555},onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this),title:e.deletetitle},x.a.createElement("div",null,x.a.createElement(F,null,x.a.createElement(N,{span:"4",style:{paddingTop:16}},x.a.createElement(m.a,{type:"".concat(this.state.isok?"success":"delete","-filling"),style:{color:this.state.isok?"green":"red"},size:"xl"})),x.a.createElement(N,{span:"20"},x.a.createElement("div",null,x.a.createElement("h3",null,this.state.isok?e.deletedSuccessfully:e.deleteFailed),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID"),x.a.createElement("span",{style:{color:"#c7254e"}},this.state.dataId)),x.a.createElement("p",null,x.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group"),x.a.createElement("span",{style:{color:"#c7254e"}},this.state.group)),this.state.isok?"":x.a.createElement("p",{style:{color:"red"}},this.state.message)))))))}}]),n}(x.a.Component)).displayName="DeleteDialog",S=S))||S,S=(t(717),t(419)),W=t.n(S),V=(0,n.a.config)(((S=function(e){Object(M.a)(n,e);var t=Object(k.a)(n);function n(){return Object(_.a)(this,n),t.apply(this,arguments)}return Object(b.a)(n,[{key:"render",value:function(){var e=this.props,t=e.data,t=void 0===t?{}:t,n=e.height,e=e.locale,a=void 0===e?{}:e;return x.a.createElement("div",null,"notice"===t.modeType?x.a.createElement("div",{"data-spm-click":"gostr=/aliyun;locaid=notice"},x.a.createElement(W.a,{style:{marginBottom:1l?b.a.createElement(u.a,{className:"pagination",total:i.count,pageSize:l,onChange:function(e){return a.onChangePage(e)}}):null,b.a.createElement(C,{ref:this.editInstanceDialog,serviceName:n,clusterName:t,groupName:e,openLoading:function(){return a.openLoading()},closeLoading:function(){return a.closeLoading()},getInstanceList:function(){return a.getInstanceList()}})):null}}]),n}(b.a.Component)).displayName="InstanceTable",l.defaultProps={filters:new Map},l=l))||l,L=function(e,t){return e.filter(function(e){var n=e.metadata,a=!0;return t.forEach(function(e,t){if(e!==n[t])return a=!1}),a})},T=l,D=t(47),O=t(31),l=(t(175),t(75)),l=t.n(l),N=l.a.Group,P=l.a.Closeable,j=v.a.Item;var R=n.a.config(function(e){function t(){var e;a(),o&&l&&(e=new Map(Array.from(p)).set(o,l),h(e),d(""),f(""),n())}function n(){i(""),s("")}function a(){d(o?"":"error"),f(l?"":"error")}var r=Object(_.useState)(""),o=(r=Object(O.a)(r,2))[0],i=r[1],r=Object(_.useState)(""),l=(r=Object(O.a)(r,2))[0],s=r[1],r=Object(_.useState)(""),u=(r=Object(O.a)(r,2))[0],d=r[1],r=Object(_.useState)(""),c=(r=Object(O.a)(r,2))[0],f=r[1],r=Object(_.useState)(new Map),p=(r=Object(O.a)(r,2))[0],h=r[1],r=void 0===(r=e.locale)?{}:r;return Object(_.useEffect)(function(){e.setFilters(p)},[p]),b.a.createElement(m.a,{contentHeight:"auto",className:"inner-card"},b.a.createElement(v.a,{inline:!0,size:"small"},b.a.createElement(j,{label:r.title},b.a.createElement(j,null,b.a.createElement(y.a,{placeholder:"key",value:o,trim:!0,onChange:function(e){return i(e)},onPressEnter:t,state:u})),b.a.createElement(j,null,b.a.createElement(y.a,{placeholder:"value",value:l,trim:!0,onChange:function(e){return s(e)},onPressEnter:t,state:c})),b.a.createElement(j,{label:""},b.a.createElement(g.a,{type:"primary",onClick:t,style:{marginRight:10}},r.addFilter),0\n com.alibaba.nacos\n nacos-client\n ${latest.version}\n \n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\n\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingFactory;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.listener.Event;\nimport com.alibaba.nacos.api.naming.listener.EventListener;\nimport com.alibaba.nacos.api.naming.listener.NamingEvent;\n\n/**\n * @author nkorange\n */\npublic class NamingExample {\n\n public static void main(String[] args) throws NacosException {\n\n Properties properties = new Properties();\n properties.setProperty("serverAddr", System.getProperty("serverAddr"));\n properties.setProperty("namespace", System.getProperty("namespace"));\n\n NamingService naming = NamingFactory.createNamingService(properties);\n\n naming.registerInstance("'.concat(this.record.name,'", "11.11.11.11", 8888, "TEST1");\n\n naming.registerInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n System.out.println(naming.getAllInstances("').concat(this.record.name,'"));\n\n naming.deregisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n System.out.println(naming.getAllInstances("').concat(this.record.name,'"));\n\n naming.subscribe("').concat(this.record.name,'", new EventListener() {\n @Override\n public void onEvent(Event event) {\n System.out.println(((NamingEvent)event).getServiceName());\n System.out.println(((NamingEvent)event).getInstances());\n }\n });\n }\n}')}},{key:"getSpringCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-discovery-example\n* pom.xml\n \n com.alibaba.nacos\n nacos-spring-context\n ${latest.version}\n \n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-example/nacos-spring-discovery-example/src/main/java/com/alibaba/nacos/example/spring\npackage com.alibaba.nacos.example.spring;\n\nimport com.alibaba.nacos.api.annotation.NacosProperties;\nimport com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))\npublic class NacosConfiguration {\n\n}\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-discovery-example/src/main/java/com/alibaba/nacos/example/spring/controller\npackage com.alibaba.nacos.example.spring.controller;\n\nimport com.alibaba.nacos.api.annotation.NacosInjected;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("discovery")\npublic class DiscoveryController {\n\n @NacosInjected\n private NamingService namingService;\n\n @RequestMapping(value = "/get", method = GET)\n @ResponseBody\n public List get(@RequestParam String serviceName) throws NacosException {\n return namingService.getAllInstances(serviceName);\n }\n}'}},{key:"getSpringBootCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example\n* pom.xml\n \n com.alibaba.boot\n nacos-discovery-spring-boot-starter\n ${latest.version}\n \n*/\n/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example/src/main/resources\n* application.properties\n nacos.discovery.server-addr=127.0.0.1:8848\n*/\n// Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example/nacos-spring-boot-discovery-example/src/main/java/com/alibaba/nacos/example/spring/boot/controller\n\npackage com.alibaba.nacos.example.spring.boot.controller;\n\nimport com.alibaba.nacos.api.annotation.NacosInjected;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\nimport static org.springframework.web.bind.annotation.RequestMethod.GET;\n\n@Controller\n@RequestMapping("discovery")\npublic class DiscoveryController {\n\n @NacosInjected\n private NamingService namingService;\n\n @RequestMapping(value = "/get", method = GET)\n @ResponseBody\n public List get(@RequestParam String serviceName) throws NacosException {\n return namingService.getAllInstances(serviceName);\n }\n}'}},{key:"getSpringCloudCode",value:function(e){return"/* Refer to document: https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/\n* pom.xml\n \n org.springframework.cloud\n spring-cloud-starter-alibaba-nacos-discovery\n ${latest.version}\n \n*/\n\n// nacos-spring-cloud-provider-example\n\n/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example/src/main/resources\n* application.properties\nserver.port=18080\nspring.application.name=".concat(this.record.name,'\nspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example/src/main/java/com/alibaba/nacos/example/spring/cloud\npackage com.alibaba.nacos.example.spring.cloud;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * @author xiaojing\n */\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class NacosProviderApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(NacosProviderApplication.class, args);\n}\n\n @RestController\n class EchoController {\n @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)\n public String echo(@PathVariable String string) {\n return "Hello Nacos Discovery " + string;\n }\n }\n}\n\n// nacos-spring-cloud-consumer-example\n\n/* Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-consumer-example/src/main/resources\n* application.properties\nspring.application.name=micro-service-oauth2\nspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-consumer-example/src/main/java/com/alibaba/nacos/example/spring/cloud\npackage com.alibaba.nacos.example.spring.cloud;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.client.loadbalancer.LoadBalanced;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n * @author xiaojing\n */\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class NacosConsumerApplication {\n\n @LoadBalanced\n @Bean\n public RestTemplate restTemplate() {\n return new RestTemplate();\n }\n\n public static void main(String[] args) {\n SpringApplication.run(NacosConsumerApplication.class, args);\n }\n\n @RestController\n public class TestController {\n\n private final RestTemplate restTemplate;\n\n @Autowired\n public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}\n\n @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)\n public String echo(@PathVariable String str) {\n return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);\n }\n }\n}')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"getCSharpCode",value:function(e){return'/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/\nDemo for Basic Nacos Opreation\nApp.csproj\n\n\n \n\n*/\n\nusing Microsoft.Extensions.DependencyInjection;\nusing Nacos.V2;\nusing Nacos.V2.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nclass Program\n{\n static async Task Main(string[] args)\n {\n IServiceCollection services = new ServiceCollection();\n\n services.AddNacosV2Naming(x =>\n {\n x.ServerAddresses = new List { "http://localhost:8848/" };\n x.Namespace = "cs-test";\n\n // swich to use http or rpc\n x.NamingUseRpc = true;\n });\n\n IServiceProvider serviceProvider = services.BuildServiceProvider();\n var namingSvc = serviceProvider.GetService();\n\n await namingSvc.RegisterInstance("'.concat(this.record.name,'", "11.11.11.11", 8888, "TEST1");\n\n await namingSvc.RegisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(await namingSvc.GetAllInstances("').concat(this.record.name,'")));\n\n await namingSvc.DeregisterInstance("').concat(this.record.name,'", "2.2.2.2", 9999, "DEFAULT");\n\n var listener = new EventListener();\n\n await namingSvc.Subscribe("').concat(this.record.name,'", listener);\n }\n\n internal class EventListener : IEventListener\n {\n public Task OnEvent(IEvent @event)\n {\n Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(@event));\n return Task.CompletedTask;\n }\n }\n}\n\n/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/\nDemo for ASP.NET Core Integration\nApp.csproj\n\n\n \n\n*/\n\n/* Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/blob/dev/samples/App1/appsettings.json\n* appsettings.json\n{\n "nacos": {\n "ServerAddresses": [ "http://localhost:8848" ],\n "DefaultTimeOut": 15000,\n "Namespace": "cs",\n "ServiceName": "App1",\n "GroupName": "DEFAULT_GROUP",\n "ClusterName": "DEFAULT",\n "Port": 0,\n "Weight": 100,\n "RegisterEnabled": true,\n "InstanceEnabled": true,\n "Ephemeral": true,\n "NamingUseRpc": true,\n "NamingLoadCacheAtStart": ""\n }\n}\n*/\n\n// Refer to document: https://github.com/nacos-group/nacos-sdk-csharp/blob/dev/samples/App1/Startup.cs\nusing Nacos.AspNetCore.V2;\n\npublic class Startup\n{\n public Startup(IConfiguration configuration)\n {\n Configuration = configuration;\n }\n\n public IConfiguration Configuration { get; }\n\n public void ConfigureServices(IServiceCollection services)\n {\n // ....\n services.AddNacosAspNet(Configuration);\n }\n\n public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n {\n // ....\n }\n}\n ')}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}),this.cm.setSize("auto","490px"))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,e=void 0===e?{}:e;return L.a.createElement("div",null,L.a.createElement(o.a,{title:e.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:L.a.createElement("div",null),onClose:this.closeDialog.bind(this)},L.a.createElement("div",{style:{height:500}},L.a.createElement(h.a,{tip:e.loading,style:{width:"100%"},visible:this.state.loading},L.a.createElement(m.a,{shape:"text",style:{height:40,paddingBottom:10}},L.a.createElement(g,{title:"Java",key:0,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),L.a.createElement(g,{title:"Spring",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.springCode)}),L.a.createElement(g,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigbootCode)}),L.a.createElement(g,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloudCode)}),L.a.createElement(g,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),L.a.createElement(g,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),L.a.createElement(g,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),L.a.createElement(g,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)}),L.a.createElement(g,{title:"C#",key:7,onClick:this.changeTab.bind(this,"commoneditor7",this.csharpCode)})),L.a.createElement("div",{ref:"codepreview"})))))}}]),n}(L.a.Component)).displayName="ShowServiceCodeing",f=f))||f,P=t(69),j=(t(738),t(25)),Y=C.a.Item,I=a.a.Row,R=a.a.Col,A=x.a.Column,a=(0,n.a.config)(((f=function(e){Object(d.a)(a,e);var t=Object(c.a)(a);function a(e){var n;return Object(l.a)(this,a),(n=t.call(this,e)).getQueryLater=function(){setTimeout(function(){return n.queryServiceList()})},n.showcode=function(){setTimeout(function(){return n.queryServiceList()})},n.setNowNameSpace=function(e,t){return n.setState({nowNamespaceName:e,nowNamespaceId:t})},n.rowColor=function(e){return{className:e.healthyInstanceCount?"":"row-bg-red"}},n.editServiceDialog=L.a.createRef(),n.showcode=L.a.createRef(),n.state={loading:!1,total:0,pageSize:10,currentPage:1,dataSource:[],search:{serviceName:Object(p.a)("serviceNameParam")||"",groupName:Object(p.a)("groupNameParam")||""},hasIpCount:!("false"===localStorage.getItem("hasIpCount"))},n.field=new i.a(Object(u.a)(n)),n}return Object(s.a)(a,[{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){try{this.editServiceDialog.current.getInstance().show(this.state.service)}catch(e){}}},{key:"queryServiceList",value:function(){var n=this,e=this.state,t=e.currentPage,a=e.pageSize,r=e.search,o=e.withInstances,o=void 0!==o&&o,e=e.hasIpCount,e=["hasIpCount=".concat(e),"withInstances=".concat(o),"pageNo=".concat(t),"pageSize=".concat(a),"serviceNameParam=".concat(r.serviceName),"groupNameParam=".concat(r.groupName)];Object(p.d)({serviceNameParam:r.serviceName,groupNameParam:r.groupName}),this.openLoading(),Object(p.c)({url:"v1/ns/catalog/services?".concat(e.join("&")),success:function(){var e=0o&&v.a.createElement(u.a,{className:"users-pagination",current:i,total:n.totalCount,pageSize:o,onChange:function(e){return t.setState({pageNo:e},function(){return t.getUsers()})}}),v.a.createElement(E,{visible:l,onOk:function(e){return Object(_.c)(e).then(function(e){return t.setState({pageNo:1},function(){return t.getUsers()}),e})},onCancel:function(){return t.colseCreateUser()}}),v.a.createElement(x.a,{visible:s,username:e,onOk:function(e){return Object(_.k)(e).then(function(e){return t.getUsers(),e})},onCancel:function(){return t.setState({passwordResetUser:void 0,passwordResetUserVisible:!1})}}))}}]),n}(v.a.Component)).displayName="UserManagement",n=o))||n)||n;t.a=r},function(e,t,n){"use strict";n(64);var a=n(46),s=n.n(a),a=(n(35),n(18)),u=n.n(a),d=n(31),a=(n(63),n(20)),c=n.n(a),a=(n(32),n(19)),f=n.n(a),a=(n(88),n(53)),p=n.n(a),a=(n(39),n(5)),h=n.n(a),a=(n(36),n(10)),m=n.n(a),i=n(14),l=n(15),g=n(22),y=n(17),v=n(16),a=(n(27),n(8)),a=n.n(a),r=n(0),_=n.n(r),r=n(37),b=n(45),o=n(83),w=n(48),M=(n(49),n(28)),k=n.n(M),M=(n(59),n(29)),S=n.n(M),E=h.a.Item,x=S.a.Option,C={labelCol:{fixedSpan:4},wrapperCol:{span:19}},L=Object(r.b)(function(e){return{namespaces:e.namespace.namespaces}},{getNamespaces:o.b,searchRoles:b.l})(M=(0,a.a.config)(((M=function(e){Object(y.a)(o,e);var r=Object(v.a)(o);function o(){var t;Object(i.a)(this,o);for(var e=arguments.length,n=new Array(e),a=0;ai&&_.a.createElement(s.a,{className:"users-pagination",current:l,total:t.totalCount,pageSize:i,onChange:function(e){return a.setState({pageNo:e},function(){return a.getPermissions()})}}),_.a.createElement(L,{visible:n,onOk:function(e){return Object(b.a)(e).then(function(e){return a.setState({pageNo:1},function(){return a.getPermissions()}),e})},onCancel:function(){return a.colseCreatePermission()}}))}}]),n}(_.a.Component)).displayName="PermissionsManagement",n=M))||n)||n);t.a=r},function(e,t,n){"use strict";n(64);var a=n(46),s=n.n(a),a=(n(35),n(18)),u=n.n(a),a=(n(63),n(20)),d=n.n(a),a=(n(32),n(19)),c=n.n(a),a=(n(88),n(53)),f=n.n(a),a=(n(39),n(5)),p=n.n(a),a=(n(36),n(10)),h=n.n(a),i=n(14),l=n(15),m=n(22),g=n(17),y=n(16),a=(n(27),n(8)),a=n.n(a),r=n(0),v=n.n(r),r=n(37),_=n(45),b=n(48),o=(n(59),n(29)),w=n.n(o),o=(n(49),n(28)),M=n.n(o),k=p.a.Item,S={labelCol:{fixedSpan:4},wrapperCol:{span:19}},E=Object(r.b)(function(e){return{users:e.authority.users}},{searchUsers:_.m})(o=(0,a.a.config)(((o=function(e){Object(g.a)(o,e);var r=Object(y.a)(o);function o(){var t;Object(i.a)(this,o);for(var e=arguments.length,n=new Array(e),a=0;ao&&v.a.createElement(s.a,{className:"users-pagination",current:i,total:t.totalCount,pageSize:o,onChange:function(e){return a.setState({pageNo:e},function(){return a.getRoles()})}}),v.a.createElement(E,{visible:l,onOk:function(e){return Object(_.b)(e).then(function(e){return a.getRoles(),e})},onCancel:function(){return a.colseCreateRole()}}))}}]),n}(v.a.Component)).displayName="RolesManagement",n=o))||n)||n);t.a=r},function(e,t,n){"use strict";n(50);function o(e){var t=void 0===(t=localStorage.token)?"{}":t,t=(Object(v.c)(t)&&JSON.parse(t)||{}).globalAdmin;return["naming"===e?void 0:_,{key:"serviceManagementVirtual",children:[{key:"serviceManagement",url:"/serviceManagement"},{key:"subscriberList",url:"/subscriberList"}]},t?b:void 0,{key:"namespace",url:"/namespace"},{key:"clusterManagementVirtual",children:[{key:"clusterManagement",url:"/clusterManagement"}]}].filter(function(e){return e})}var a=n(26),i=n.n(a),a=(n(43),n(24)),l=n.n(a),r=n(14),s=n(15),u=n(17),d=n(16),a=(n(27),n(8)),a=n.n(a),c=n(21),f=(n(81),n(51)),p=n.n(f),f=n(0),h=n.n(f),f=n(40),m=n(37),g=n(135),y=n(74),v=n(47),_={key:"configurationManagementVirtual",children:[{key:"configurationManagement",url:"/configurationManagement"},{key:"historyRollback",url:"/historyRollback"},{key:"listeningToQuery",url:"/listeningToQuery"}]},b={key:"authorityControl",children:[{key:"userList",url:"/userManagement"},{key:"roleManagement",url:"/rolesManagement"},{key:"privilegeManagement",url:"/permissionsManagement"}]},w=p.a.SubMenu,M=p.a.Item,f=(n=Object(m.b)(function(e){return Object(c.a)(Object(c.a)({},e.locale),e.base)},{getState:y.c,getNotice:y.b}),m=a.a.config,Object(f.g)(a=n(a=m(((y=function(e){Object(u.a)(n,e);var t=Object(d.a)(n);function n(){return Object(r.a)(this,n),t.apply(this,arguments)}return Object(s.a)(n,[{key:"componentDidMount",value:function(){this.props.getState(),this.props.getNotice()}},{key:"goBack",value:function(){this.props.history.goBack()}},{key:"navTo",value:function(e){var t=this.props.location.search,t=new URLSearchParams(t);t.set("namespace",window.nownamespace),t.set("namespaceShowName",window.namespaceShowName),this.props.history.push([e,"?",t.toString()].join(""))}},{key:"isCurrentPath",value:function(e){return e===this.props.location.pathname?"current-path next-selected":void 0}},{key:"defaultOpenKeys",value:function(){for(var t=this,e=o(this.props.functionMode),n=0,a=e.length;nthis.state.pageSize&&M.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},M.a.createElement(g.a,{current:this.state.pageNo,total:a,pageSize:this.state.pageSize,onChange:function(e){return t.setState({pageNo:e},function(){return t.querySubscriberList()})}}))))}}]),a}(M.a.Component)).displayName="SubscriberList",c=n))||c)||c;t.a=f},function(e,t,n){"use strict";n(52);var a=n(33),c=n.n(a),a=(n(64),n(46)),f=n.n(a),a=(n(175),n(75)),p=n.n(a),a=(n(36),n(10)),h=n.n(a),a=(n(32),n(19)),m=n.n(a),a=(n(35),n(18)),r=n.n(a),a=(n(49),n(28)),o=n.n(a),i=n(14),l=n(15),s=n(22),u=n(17),d=n(16),a=(n(27),n(8)),a=n.n(a),g=(n(403),n(117)),y=n.n(g),g=(n(63),n(20)),v=n.n(g),g=(n(66),n(41)),g=n.n(g),_=(n(39),n(5)),b=n.n(_),_=n(0),w=n.n(_),M=n(1),k=n(48),_=n(137),S=n.n(_),E=n(69),x=(n(741),b.a.Item),C=g.a.Row,L=g.a.Col,T=v.a.Column,D=y.a.Panel,g=(0,a.a.config)(((_=function(e){Object(u.a)(a,e);var t=Object(d.a)(a);function a(e){var n;return Object(i.a)(this,a),(n=t.call(this,e)).getQueryLater=function(){setTimeout(function(){return n.queryClusterStateList()})},n.setNowNameSpace=function(e,t){return n.setState({nowNamespaceName:e,nowNamespaceId:t})},n.rowColor=function(e){return{className:(e.voteFor,"")}},n.state={loading:!1,total:0,pageSize:10,currentPage:1,keyword:"",dataSource:[]},n.field=new o.a(Object(s.a)(n)),n}return Object(l.a)(a,[{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){try{this.editServiceDialog.current.getInstance().show(this.state.service)}catch(e){}}},{key:"queryClusterStateList",value:function(){var n=this,e=this.state,t=e.currentPage,a=e.pageSize,r=e.keyword,e=e.withInstances,e=["withInstances=".concat(void 0!==e&&e),"pageNo=".concat(t),"pageSize=".concat(a),"keyword=".concat(r)];Object(M.c)({url:"v1/core/cluster/nodes?".concat(e.join("&")),beforeSend:function(){return n.openLoading()},success:function(){var e=0this.state.pageSize&&w.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},w.a.createElement(f.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:function(e){return t.setState({currentPage:e},function(){return t.queryClusterStateList()})}}))))}}]),a}(w.a.Component)).displayName="ClusterNodeList",n=_))||n;t.a=g},function(e,t,z){"use strict";z.r(t),function(e){z(52);var t=z(33),a=z.n(t),t=(z(27),z(8)),r=z.n(t),o=z(14),i=z(15),l=z(17),s=z(16),n=z(21),t=z(0),u=z.n(t),t=z(23),t=z.n(t),d=z(119),c=z(411),f=z(423),p=z(37),h=z(40),m=z(82),g=(z(458),z(432)),y=z(25),v=z(433),_=z(426),b=z(434),w=z(435),M=z(427),k=z(436),S=z(437),E=z(438),x=z(439),C=z(440),L=z(424),T=z(428),D=z(425),O=z(441),N=z(442),P=z(429),j=z(430),I=z(431),R=z(421),Y=z(422),A=z(104),H=z(74),e=(z(744),e.hot,localStorage.getItem(y.g)||localStorage.setItem(y.g,"zh-CN"===navigator.language?"zh-CN":"en-US"),Object(d.b)(Object(n.a)(Object(n.a)({},Y.a),{},{routing:c.routerReducer}))),Y=Object(d.d)(e,Object(d.c)(Object(d.a)(f.a),window[y.k]?window[y.k]():function(e){return e})),F=[{path:"/",exact:!0,render:function(){return u.a.createElement(h.a,{to:"/welcome"})}},{path:"/welcome",component:R.a},{path:"/namespace",component:_.a},{path:"/newconfig",component:b.a},{path:"/configsync",component:w.a},{path:"/configdetail",component:M.a},{path:"/configeditor",component:k.a},{path:"/historyDetail",component:S.a},{path:"/configRollback",component:E.a},{path:"/historyRollback",component:x.a},{path:"/listeningToQuery",component:C.a},{path:"/configurationManagement",component:L.a},{path:"/serviceManagement",component:T.a},{path:"/serviceDetail",component:D.a},{path:"/subscriberList",component:O.a},{path:"/clusterManagement",component:N.a},{path:"/userManagement",component:P.a},{path:"/rolesManagement",component:I.a},{path:"/permissionsManagement",component:j.a}],e=Object(p.b)(function(e){return Object(n.a)(Object(n.a)({},e.locale),e.base)},{changeLanguage:A.a,getState:H.c})(c=function(e){Object(l.a)(n,e);var t=Object(s.a)(n);function n(e){return Object(o.a)(this,n),(e=t.call(this,e)).state={shownotice:"none",noticecontent:"",nacosLoading:{}},e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){this.props.getState();var e=localStorage.getItem(y.g);this.props.changeLanguage(e)}},{key:"router",get:function(){var e=this.props.loginPageEnabled;return u.a.createElement(m.a,null,u.a.createElement(h.d,null,e&&"false"===e?null:u.a.createElement(h.b,{path:"/login",component:v.a}),u.a.createElement(g.a,null,F.map(function(e){return u.a.createElement(h.b,Object.assign({key:e.path},e))}))))}},{key:"render",value:function(){var e=this.props,t=e.locale,e=e.loginPageEnabled;return u.a.createElement(a.a,Object.assign({className:"nacos-loading",shape:"flower",tip:"loading...",visible:!e,fullScreen:!0},this.state.nacosLoading),u.a.createElement(r.a,{locale:t},this.router))}}]),n}(u.a.Component))||c;t.a.render(u.a.createElement(p.a,{store:Y},u.a.createElement(e,null)),document.getElementById("root"))}.call(this,z(444)(e))},function(e,t){e.exports=function(e){var t;return e.webpackPolyfill||((t=Object.create(e)).children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1),t}},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(I,e,t){"use strict"; /** @license React v16.14.0 * react.production.min.js * @@ -326,5 +326,5 @@ var t;e.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var a=60103,r=60106,o=60107,i=60108,l=60114,s=60109,u=60110,d=60112,c=60113,f=60120,p=60115,h=60116,m=60121,g=60122,y=60117,v=60129,_=60131;function b(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case a:switch(e=e.type){case o:case l:case i:case c:case f:return e;default:switch(e=e&&e.$$typeof){case u:case d:case h:case p:case s:return e;default:return t}}case r:return t}}}"function"==typeof Symbol&&Symbol.for&&(a=(w=Symbol.for)("react.element"),r=w("react.portal"),o=w("react.fragment"),i=w("react.strict_mode"),l=w("react.profiler"),s=w("react.provider"),u=w("react.context"),d=w("react.forward_ref"),c=w("react.suspense"),f=w("react.suspense_list"),p=w("react.memo"),h=w("react.lazy"),m=w("react.block"),g=w("react.server.block"),y=w("react.fundamental"),v=w("react.debug_trace_mode"),_=w("react.legacy_hidden"));var w=s,M=a,k=d,S=o,E=h,x=p,C=r,L=l,T=i,D=c;t.ContextConsumer=u,t.ContextProvider=w,t.Element=M,t.ForwardRef=k,t.Fragment=S,t.Lazy=E,t.Memo=x,t.Portal=C,t.Profiler=L,t.StrictMode=T,t.Suspense=D,t.isAsyncMode=function(){return!1},t.isConcurrentMode=function(){return!1},t.isContextConsumer=function(e){return b(e)===u},t.isContextProvider=function(e){return b(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.isForwardRef=function(e){return b(e)===d},t.isFragment=function(e){return b(e)===o},t.isLazy=function(e){return b(e)===h},t.isMemo=function(e){return b(e)===p},t.isPortal=function(e){return b(e)===r},t.isProfiler=function(e){return b(e)===l},t.isStrictMode=function(e){return b(e)===i},t.isSuspense=function(e){return b(e)===c},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===l||e===v||e===i||e===c||e===f||e===_||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===p||e.$$typeof===s||e.$$typeof===u||e.$$typeof===d||e.$$typeof===y||e.$$typeof===m||e[0]===g)},t.typeOf=b},function(e,t,n){"use strict";var a,r=n(1),o=void 0;window.edasprefix="acm",window.globalConfig={isParentEdas:function(){return window.parent&&-1!==window.parent.location.host.indexOf("edas")}},r.b.middleWare(function(){var e=0=e.length?{value:void 0,done:!0}:(e=a(e,t),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var o=n(144),i=n(143);e.exports=function(r){return function(e,t){var n,e=String(i(e)),t=o(t),a=e.length;return t<0||a<=t?r?"":void 0:(n=e.charCodeAt(t))<55296||56319=e.length?(this._t=void 0,r(1)):r(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),o.Arguments=o.Array,a("keys"),a("values"),a("entries")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){e.exports={default:n(481),__esModule:!0}},function(e,t,n){n(482),n(487),n(488),n(489),e.exports=n(77).Symbol},function(I,R,e){"use strict";function a(e){var t=L[e]=_(M[E]);return t._k=e,t}function n(e,t){m(e);for(var n,a=V(t=g(t)),r=0,o=a.length;rr;)s(L,t=n[r++])||t==x||t==H||a.push(t);return a}function i(e){for(var t,n=e===D,a=Q(n?T:g(e)),r=[],o=0;a.length>o;)!s(L,t=a[o++])||n&&!s(D,t)||r.push(L[t]);return r}var l=e(76),s=e(85),u=e(78),d=e(91),A=e(197),H=e(483).KEY,c=e(108),f=e(146),p=e(152),F=e(122),h=e(95),z=e(153),W=e(154),V=e(484),B=e(485),m=e(107),U=e(93),K=e(149),g=e(94),y=e(142),v=e(119),_=e(151),G=e(486),q=e(199),b=e(148),$=e(84),J=e(120),X=q.f,w=$.f,Q=G.f,M=l.Symbol,k=l.JSON,S=k&&k.stringify,E="prototype",x=h("_hidden"),Z=h("toPrimitive"),ee={}.propertyIsEnumerable,C=f("symbol-registry"),L=f("symbols"),T=f("op-symbols"),D=Object[E],f="function"==typeof M&&!!b.f,O=l.QObject,N=!O||!O[E]||!O[E].findChild,P=u&&c(function(){return 7!=_(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(e,t,n){var a=X(D,t);a&&delete D[t],w(e,t,n),a&&e!==D&&w(D,t,a)}:w,j=f&&"symbol"==typeof M.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof M},Y=function(e,t,n){return e===D&&Y(T,t,n),m(e),t=y(t,!0),m(n),s(L,t)?(n.enumerable?(s(e,x)&&e[x][t]&&(e[x][t]=!1),n=_(n,{enumerable:v(0,!1)})):(s(e,x)||w(e,x,v(1,{})),e[x][t]=!0),P(e,t,n)):w(e,t,n)};f||(A((M=function(){if(this instanceof M)throw TypeError("Symbol is not a constructor!");var t=F(0ne;)h(te[ne++]);for(var ae=J(h.store),re=0;ae.length>re;)W(ae[re++]);d(d.S+d.F*!f,"Symbol",{for:function(e){return s(C,e+="")?C[e]:C[e]=M(e)},keyFor:function(e){if(!j(e))throw TypeError(e+" is not a symbol!");for(var t in C)if(C[t]===e)return t},useSetter:function(){N=!0},useSimple:function(){N=!1}}),d(d.S+d.F*!f,"Object",{create:function(e,t){return void 0===t?_(e):n(_(e),t)},defineProperty:Y,defineProperties:n,getOwnPropertyDescriptor:r,getOwnPropertyNames:o,getOwnPropertySymbols:i});O=c(function(){b.f(1)});d(d.S+d.F*O,"Object",{getOwnPropertySymbols:function(e){return b.f(K(e))}}),k&&d(d.S+d.F*(!f||c(function(){var e=M();return"[null]"!=S([e])||"{}"!=S({a:e})||"{}"!=S(Object(e))})),"JSON",{stringify:function(e){for(var t,n,a=[e],r=1;ri;)o.call(e,a=r[i++])&&t.push(a);return t}},function(e,t,n){var a=n(195);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,n){var a=n(94),r=n(198).f,o={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){if(!i||"[object Window]"!=o.call(e))return r(a(e));try{return r(e)}catch(e){return i.slice()}}},function(e,t){},function(e,t,n){n(154)("asyncIterator")},function(e,t,n){n(154)("observable")},function(e,t,n){e.exports={default:n(491),__esModule:!0}},function(e,t,n){n(492),e.exports=n(77).Object.setPrototypeOf},function(e,t,n){var a=n(91);a(a.S,"Object",{setPrototypeOf:n(493).set})},function(e,t,r){function o(e,t){if(a(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")}var n=r(93),a=r(107);e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{(a=r(190)(Function.call,r(199).f(Object.prototype,"__proto__").set,2))(e,[]),n=!(e instanceof Array)}catch(e){n=!0}return function(e,t){return o(e,t),n?e.__proto__=t:a(e,t),e}}({},!1):void 0),check:o}},function(e,t,n){e.exports={default:n(495),__esModule:!0}},function(e,t,n){n(496);var a=n(77).Object;e.exports=function(e,t){return a.create(e,t)}},function(e,t,n){var a=n(91);a(a.S,"Object",{create:n(151)})},function(e,t,n){"use strict";var i=n(498);function a(){}function r(){}r.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,r,o){if(o!==i)throw o=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"),o.name="Invariant Violation",o}function t(){return e}var n={array:e.isRequired=e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:r,resetWarningCache:a};return n.PropTypes=n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function s(e,t,n,a){e.removeEventListener&&e.removeEventListener(t,n,a||!1)}function a(e,t,n,a){return e.addEventListener&&e.addEventListener(t,n,a||!1),{off:function(){return s(e,t,n,a)}}}t.__esModule=!0,t.on=a,t.once=function(r,o,i,l){return a(r,o,function e(){for(var t=arguments.length,n=Array(t),a=0;a68?1900:2e3)},r=function(t){return function(e){this[t]=+e}},o=[/[+-]\d\d:?(\d\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if("Z"===e)return 0;var t=e.match(/([+-]|\d\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:"+"===t[0]?-n:n}(e)}],i=function(e){var t=h[e];return t&&(t.indexOf?t:t.s.concat(t.f))},l=function(e,t){var n,a=h.meridiem;if(a){for(var r=1;r<=24;r+=1)if(e.indexOf(a(r,0,t))>-1){n=r>12;break}}else n=e===(t?"pm":"PM");return n},f={A:[n,function(e){this.afternoon=l(e,!1)}],a:[n,function(e){this.afternoon=l(e,!0)}],S:[/\d/,function(e){this.milliseconds=100*+e}],SS:[e,function(e){this.milliseconds=10*+e}],SSS:[/\d{3}/,function(e){this.milliseconds=+e}],s:[t,r("seconds")],ss:[t,r("seconds")],m:[t,r("minutes")],mm:[t,r("minutes")],H:[t,r("hours")],h:[t,r("hours")],HH:[t,r("hours")],hh:[t,r("hours")],D:[t,r("day")],DD:[e,r("day")],Do:[n,function(e){var t=h.ordinal,n=e.match(/\d+/);if(this.day=n[0],t)for(var a=1;a<=31;a+=1)t(a).replace(/\[|\]/g,"")===e&&(this.day=a)}],M:[t,r("month")],MM:[e,r("month")],MMM:[n,function(e){var t=i("months"),n=(i("monthsShort")||t.map(function(e){return e.slice(0,3)})).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[n,function(e){var t=i("months").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\d+/,r("year")],YY:[e,function(e){this.year=a(e)}],YYYY:[/\d{4}/,r("year")],Z:o,ZZ:o};function b(e){var t,r;t=e,r=h&&h.formats;for(var u=(e=t.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(e,t,n){var a=n&&n.toUpperCase();return t||r[n]||s[n]||r[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,n){return t||n.slice(1)})})).match(c),d=u.length,n=0;n-1)return new Date(("X"===t?1e3:1)*e);var a=b(t)(e),r=a.year,o=a.month,i=a.day,l=a.hours,s=a.minutes,u=a.seconds,d=a.milliseconds,c=a.zone,f=new Date,p=i||(r||o?1:f.getDate()),h=r||f.getFullYear(),m=0;r&&!o||(m=o>0?o-1:f.getMonth());var g=l||0,y=s||0,v=u||0,_=d||0;return c?new Date(Date.UTC(h,m,p,g,y,v,_+60*c.offset*1e3)):n?new Date(Date.UTC(h,m,p,g,y,v,_)):new Date(h,m,p,g,y,v,_)}catch(e){return new Date("")}}(t,r,n),this.init(),s&&!0!==s&&(this.$L=this.locale(s).$L),l&&t!=this.format(r)&&(this.$d=new Date("")),h={}}else if(r instanceof Array)for(var u=r.length,d=1;d<=u;d+=1){a[1]=r[d-1];var c=f.apply(this,a);if(c.isValid()){this.$d=c.$d,this.$L=c.$L,this.init();break}d===u&&(this.$d=new Date(""))}else p.call(this,e)}}}()},function(e,t,n){e.exports=function(){"use strict";return function(e,t,a){a.updateLocale=function(e,t){var n=a.Ls[e];if(n)return(t?Object.keys(t):[]).forEach(function(e){n[e]=t[e]}),n}}}()},function(e,t,n){e.exports=function(e,t,n){function a(e,t,n,a,r){var e=e.name?e:e.$locale(),t=l(e[t]),n=l(e[n]),o=t||n.map(function(e){return e.slice(0,a)});if(!r)return o;var i=e.weekStart;return o.map(function(e,t){return o[(t+(i||0))%7]})}function r(){return n.Ls[n.locale()]}function o(e,t){return e.formats[t]||e.formats[t.toUpperCase()].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,n){return t||n.slice(1)})}var t=t.prototype,l=function(e){return e&&(e.indexOf?e:e.s)};t.localeData=function(){return function(){var t=this;return{months:function(e){return e?e.format("MMMM"):a(t,"months")},monthsShort:function(e){return e?e.format("MMM"):a(t,"monthsShort","months",3)},firstDayOfWeek:function(){return t.$locale().weekStart||0},weekdays:function(e){return e?e.format("dddd"):a(t,"weekdays")},weekdaysMin:function(e){return e?e.format("dd"):a(t,"weekdaysMin","weekdays",2)},weekdaysShort:function(e){return e?e.format("ddd"):a(t,"weekdaysShort","weekdays",3)},longDateFormat:function(e){return o(t.$locale(),e)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}}.bind(this)()},n.localeData=function(){var t=r();return{firstDayOfWeek:function(){return t.weekStart||0},weekdays:function(){return n.weekdays()},weekdaysShort:function(){return n.weekdaysShort()},weekdaysMin:function(){return n.weekdaysMin()},months:function(){return n.months()},monthsShort:function(){return n.monthsShort()},longDateFormat:function(e){return o(t,e)},meridiem:t.meridiem,ordinal:t.ordinal}},n.months=function(){return a(r(),"months")},n.monthsShort=function(){return a(r(),"monthsShort","months",3)},n.weekdays=function(e){return a(r(),"weekdays",null,null,e)},n.weekdaysShort=function(e){return a(r(),"weekdaysShort","weekdays",3,e)},n.weekdaysMin=function(e){return a(r(),"weekdaysMin","weekdays",2,e)}}},function(e,t,n){e.exports=function(){"use strict";var i="month",l="quarter";return function(e,t){var n=t.prototype;n.quarter=function(e){return this.$utils().u(e)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(e-1))};var a=n.add;n.add=function(e,t){return e=Number(e),this.$utils().p(t)===l?this.add(3*e,i):a.bind(this)(e,t)};var o=n.startOf;n.startOf=function(e,t){var n=this.$utils(),a=!!n.u(t)||t;if(n.p(e)===l){var r=this.quarter()-1;return a?this.month(3*r).startOf(i).startOf("day"):this.month(3*r+2).endOf(i).endOf("day")}return o.bind(this)(e,t)}}}()},function(e,t,n){e.exports=function(){"use strict";return function(e,t,n){var a=t.prototype,o=a.format;n.en.ordinal=function(e){var t=["th","st","nd","rd"],n=e%100;return"["+e+(t[(n-20)%10]||t[n]||t[0])+"]"},a.format=function(e){var t=this,n=this.$locale();if(!this.isValid())return o.bind(this)(e);var a=this.$utils(),r=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(e){switch(e){case"Q":return Math.ceil((t.$M+1)/3);case"Do":return n.ordinal(t.$D);case"gggg":return t.weekYear();case"GGGG":return t.isoWeekYear();case"wo":return n.ordinal(t.week(),"W");case"w":case"ww":return a.s(t.week(),"w"===e?1:2,"0");case"W":case"WW":return a.s(t.isoWeek(),"W"===e?1:2,"0");case"k":case"kk":return a.s(String(0===t.$H?24:t.$H),"k"===e?1:2,"0");case"X":return Math.floor(t.$d.getTime()/1e3);case"x":return t.$d.getTime();case"z":return"["+t.offsetName()+"]";case"zzz":return"["+t.offsetName("long")+"]";default:return e}});return o.bind(this)(r)}}}()},function(e,t,n){e.exports=function(){"use strict";var l="week",s="year";return function(e,t,i){var n=t.prototype;n.week=function(e){if(void 0===e&&(e=null),null!==e)return this.add(7*(e-this.week()),"day");var t=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var n=i(this).startOf(s).add(1,s).date(t),a=i(this).endOf(l);if(n.isBefore(a))return 1}var r=i(this).startOf(s).date(t).startOf(l).subtract(1,"millisecond"),o=this.diff(r,l,!0);return o<0?i(this).startOf("week").week():Math.ceil(o)},n.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}()},function(e,t,n){e.exports=function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),a={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,t){return"W"===t?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,t){var n=100*e+t;return n<600?"凌晨":n<900?"早上":n<1100?"上午":n<1300?"中午":n<1800?"下午":"晚上"}};return n.default.locale(a,null,!0),a}(n(205))},function(e,t,n){"use strict";t.__esModule=!0,t.flex=t.transition=t.animation=void 0;var r=n(201),o=n(96);function a(e){if(!r.hasDOM)return!1;var n=document.createElement("div"),a=!1;return(0,o.each)(e,function(e,t){if(void 0!==n.style[t])return!(a={end:e})}),a}t.animation=a({WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd",animation:"animationend"}),t.transition=a({WebkitTransition:"webkitTransitionEnd",OTransition:"oTransitionEnd",transition:"transitionend"}),t.flex=function(e){if(!r.hasDOM)return!1;var n=document.createElement("div"),a=!1;return(0,o.each)(e,function(e,t){return(0,o.each)(e,function(e){try{n.style[t]=e,a=a||n.style[t]===e}catch(e){}return!a}),!a}),a}({display:["flex","-webkit-flex","-moz-flex","-ms-flexbox"]})},function(e,t,n){"use strict";t.__esModule=!0,t.getFocusNodeList=i,t.saveLastFocusNode=function(){l=document.activeElement},t.clearLastFocusNode=function(){l=null},t.backLastFocusNode=function(){if(l)try{l.focus()}catch(e){}},t.limitTabRange=function(e,t){{var n,a;t.keyCode===r.default.TAB&&(e=i(e),n=e.length-1,-1<(a=e.indexOf(document.activeElement))&&(a=a+(t.shiftKey?-1:1),e[a=n<(a=a<0?n:a)?0:a].focus(),t.preventDefault()))}};var t=n(206),r=(t=t)&&t.__esModule?t:{default:t},a=n(96);function o(e){var t=e.nodeName.toLowerCase(),n=parseInt(e.getAttribute("tabindex"),10),n=!isNaN(n)&&-1a.height)&&(r[1]=-t.top-("t"===e?t.height:0))),r},this._getParentScrollOffset=function(e){var t=0,n=0;return e&&e.offsetParent&&e.offsetParent!==document.body&&(isNaN(e.offsetParent.scrollTop)||(t+=e.offsetParent.scrollTop),isNaN(e.offsetParent.scrollLeft)||(n+=e.offsetParent.scrollLeft)),{top:t,left:n}}};var h=a;function m(e){(0,o.default)(this,m),r.call(this),this.pinElement=e.pinElement,this.baseElement=e.baseElement,this.pinFollowBaseElementWhenFixed=e.pinFollowBaseElementWhenFixed,this.container=function(e){var t=e.container,e=e.baseElement;if(void 0===("undefined"==typeof document?"undefined":(0,i.default)(document)))return t;for(var n=(n=(0,l.default)(t,e))||document.body;"static"===y.dom.getStyle(n,"position");){if(!n||n===document.body)return document.body;n=n.parentNode}return n}(e),this.autoFit=e.autoFit||!1,this.align=e.align||"tl tl",this.offset=e.offset||[0,0],this.needAdjust=e.needAdjust||!1,this.isRtl=e.isRtl||!1}t.default=h,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var w=a(n(2)),M=a(n(12)),k=n(0),S=a(k),E=a(n(13)),x=a(n(183)),C=a(n(79)),L=n(11);function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(e){if(!k.useState||!k.useRef||!k.useEffect)return L.log.warning("need react version > 16.8.0"),null;var t=e.prefix,t=void 0===t?"next-":t,n=e.animation,a=void 0===n?{in:"expandInDown",out:"expandOutUp"}:n,r=e.visible,n=e.hasMask,o=e.align,i=e.points,o=void 0===i?o?o.split(" "):void 0:i,l=e.onPosition,i=e.children,s=e.className,u=e.style,d=e.wrapperClassName,c=e.beforeOpen,f=e.onOpen,p=e.afterOpen,h=e.beforeClose,m=e.onClose,g=e.afterClose,e=(0,M.default)(e,["prefix","animation","visible","hasMask","align","points","onPosition","children","className","style","wrapperClassName","beforeOpen","onOpen","afterOpen","beforeClose","onClose","afterClose"]),y=(0,k.useState)(!0),v=y[0],_=y[1],b=(0,k.useRef)(null),y=S.default.createElement(C.default.OverlayAnimate,{visible:r,animation:a,onEnter:function(){_(!1),"function"==typeof c&&c(b.current)},onEntering:function(){"function"==typeof f&&f(b.current)},onEntered:function(){"function"==typeof p&&p(b.current)},onExit:function(){"function"==typeof h&&h(b.current)},onExiting:function(){"function"==typeof m&&m(b.current)},onExited:function(){_(!0),"function"==typeof g&&g(b.current)},timeout:300,style:u},i?(0,k.cloneElement)(i,{className:(0,E.default)([t+"overlay-inner",s,i&&i.props&&i.props.className])}):S.default.createElement("span",null)),s=(0,E.default)(((u={})[t+"overlay-wrapper v2"]=!0,u[d]=d,u.opened=r,u));return S.default.createElement(x.default,(0,w.default)({},e,{visible:r,isAnimationEnd:v,hasMask:n,wrapperClassName:s,maskClassName:t+"overlay-backdrop",maskRender:function(e){return S.default.createElement(C.default.OverlayAnimate,{visible:r,animation:!!a&&{in:"fadeIn",out:"fadeOut"},timeout:300,unmountOnExit:!0},e)},points:o,onPosition:function(e){(0,w.default)(e,{align:e.config.points}),"function"==typeof l&&l(e)},ref:b}),y)},e.exports=t.default},function(n,e){function a(e,t){return n.exports=a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n.exports.__esModule=!0,n.exports.default=n.exports,a(e,t)}n.exports=a,n.exports.__esModule=!0,n.exports.default=n.exports},function(e,t,n){"use strict";t.__esModule=!0;var a,d=g(n(12)),c=g(n(2)),r=g(n(4)),o=g(n(5)),i=g(n(6)),s=n(0),f=g(s),p=n(23),l=n(30),u=g(n(3)),h=n(11),m=g(n(348));function g(e){return e&&e.__esModule?e:{default:e}}var y,n=h.func.noop,v=h.func.makeChain,_=h.func.bindCtx,u=(y=s.Component,(0,i.default)(b,y),b.getDerivedStateFromProps=function(e,t){return"visible"in e?(0,c.default)({},t,{visible:e.visible}):null},b.prototype.componentWillUnmount=function(){var t=this;["_timer","_hideTimer","_showTimer"].forEach(function(e){t[e]&&clearTimeout(t[e])})},b.prototype.handleVisibleChange=function(e,t,n){"visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t,n)},b.prototype.handleTriggerClick=function(e){this.state.visible&&!this.props.canCloseByTrigger||this.handleVisibleChange(!this.state.visible,"fromTrigger",e)},b.prototype.handleTriggerKeyDown=function(e){var t=this.props.triggerClickKeycode;(Array.isArray(t)?t:[t]).includes(e.keyCode)&&(e.preventDefault(),this.handleTriggerClick(e))},b.prototype.handleTriggerMouseEnter=function(e){var t=this;this._mouseNotFirstOnMask=!1,this._hideTimer&&(clearTimeout(this._hideTimer),this._hideTimer=null),this._showTimer&&(clearTimeout(this._showTimer),this._showTimer=null),this.state.visible||(this._showTimer=setTimeout(function(){t.handleVisibleChange(!0,"fromTrigger",e)},this.props.delay))},b.prototype.handleTriggerMouseLeave=function(e,t){var n=this;this._showTimer&&(clearTimeout(this._showTimer),this._showTimer=null),this.state.visible&&(this._hideTimer=setTimeout(function(){n.handleVisibleChange(!1,t||"fromTrigger",e)},this.props.delay))},b.prototype.handleTriggerFocus=function(e){this.handleVisibleChange(!0,"fromTrigger",e)},b.prototype.handleTriggerBlur=function(e){this._isForwardContent||this.handleVisibleChange(!1,"fromTrigger",e),this._isForwardContent=!1},b.prototype.handleContentMouseDown=function(){this._isForwardContent=!0},b.prototype.handleContentMouseEnter=function(){clearTimeout(this._hideTimer)},b.prototype.handleContentMouseLeave=function(e){this.handleTriggerMouseLeave(e,"fromContent")},b.prototype.handleMaskMouseEnter=function(){this._mouseNotFirstOnMask||(clearTimeout(this._hideTimer),this._hideTimer=null,this._mouseNotFirstOnMask=!1)},b.prototype.handleMaskMouseLeave=function(){this._mouseNotFirstOnMask=!0},b.prototype.handleRequestClose=function(e,t){this.handleVisibleChange(!1,e,t)},b.prototype.renderTrigger=function(){var e,t,n,a,r,o,i,l=this,s=this.props,u=s.trigger,s=s.disabled,d={key:"trigger","aria-haspopup":!0,"aria-expanded":this.state.visible};return this.state.visible||(d["aria-describedby"]=void 0),s||(s=this.props.triggerType,s=Array.isArray(s)?s:[s],e=u&&u.props||{},t=e.onClick,n=e.onKeyDown,a=e.onMouseEnter,r=e.onMouseLeave,o=e.onFocus,i=e.onBlur,s.forEach(function(e){switch(e){case"click":d.onClick=v(l.handleTriggerClick,t),d.onKeyDown=v(l.handleTriggerKeyDown,n);break;case"hover":d.onMouseEnter=v(l.handleTriggerMouseEnter,a),d.onMouseLeave=v(l.handleTriggerMouseLeave,r);break;case"focus":d.onFocus=v(l.handleTriggerFocus,o),d.onBlur=v(l.handleTriggerBlur,i)}})),u&&f.default.cloneElement(u,d)},b.prototype.renderContent=function(){var t=this,e=this.props,n=e.children,e=e.triggerType,e=Array.isArray(e)?e:[e],n=s.Children.only(n),a=n.props,r=a.onMouseDown,o=a.onMouseEnter,i=a.onMouseLeave,l={key:"portal"};return e.forEach(function(e){switch(e){case"focus":l.onMouseDown=v(t.handleContentMouseDown,r);break;case"hover":l.onMouseEnter=v(t.handleContentMouseEnter,o),l.onMouseLeave=v(t.handleContentMouseLeave,i)}}),f.default.cloneElement(n,l)},b.prototype.renderPortal=function(){function e(){return(0,p.findDOMNode)(t)}var t=this,n=this.props,a=n.target,r=n.safeNode,o=n.followTrigger,i=n.triggerType,l=n.hasMask,s=n.wrapperStyle,n=(0,d.default)(n,["target","safeNode","followTrigger","triggerType","hasMask","wrapperStyle"]),u=this.props.container,r=Array.isArray(r)?[].concat(r):[r],s=(r.unshift(e),s||{});return o&&(u=function(e){return e&&e.parentNode||e},s.position="relative"),"hover"===i&&l&&(n.onMaskMouseEnter=this.handleMaskMouseEnter,n.onMaskMouseLeave=this.handleMaskMouseLeave),f.default.createElement(m.default,(0,c.default)({},n,{key:"overlay",ref:function(e){return t.overlay=e},visible:this.state.visible,target:a||e,container:u,safeNode:r,wrapperStyle:s,triggerType:i,hasMask:l,onRequestClose:this.handleRequestClose}),this.props.children&&this.renderContent())},b.prototype.render=function(){return[this.renderTrigger(),this.renderPortal()]},a=i=b,i.propTypes={children:u.default.node,trigger:u.default.element,triggerType:u.default.oneOfType([u.default.string,u.default.array]),triggerClickKeycode:u.default.oneOfType([u.default.number,u.default.array]),visible:u.default.bool,defaultVisible:u.default.bool,onVisibleChange:u.default.func,disabled:u.default.bool,autoFit:u.default.bool,delay:u.default.number,canCloseByTrigger:u.default.bool,target:u.default.any,safeNode:u.default.any,followTrigger:u.default.bool,container:u.default.any,hasMask:u.default.bool,wrapperStyle:u.default.object,rtl:u.default.bool,v2:u.default.bool,placement:u.default.string,placementOffset:u.default.number},i.defaultProps={triggerType:"hover",triggerClickKeycode:[h.KEYCODE.SPACE,h.KEYCODE.ENTER],defaultVisible:!1,onVisibleChange:n,disabled:!1,autoFit:!1,delay:200,canCloseByTrigger:!0,followTrigger:!1,container:function(){return document.body},rtl:!1},a);function b(e){(0,r.default)(this,b);var t=(0,o.default)(this,y.call(this,e));return t.state={visible:void 0===e.visible?e.defaultVisible:e.visible},_(t,["handleTriggerClick","handleTriggerKeyDown","handleTriggerMouseEnter","handleTriggerMouseLeave","handleTriggerFocus","handleTriggerBlur","handleContentMouseEnter","handleContentMouseLeave","handleContentMouseDown","handleRequestClose","handleMaskMouseEnter","handleMaskMouseLeave"]),t}u.displayName="Popup",t.default=(0,l.polyfill)(u),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var T=a(n(2)),D=a(n(12)),O=n(0),N=a(O),P=a(n(13)),j=a(n(183)),Y=a(n(79)),I=n(11);function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(r){if(!O.useState||!O.useRef||!O.useEffect)return I.log.warning("need react version > 16.8.0"),null;var e=r.prefix,e=void 0===e?"next-":e,t=r.animation,n=void 0===t?{in:"expandInDown",out:"expandOutUp"}:t,t=r.defaultVisible,a=r.onVisibleChange,o=void 0===a?function(){}:a,a=r.trigger,i=r.triggerType,i=void 0===i?"hover":i,l=r.overlay,s=r.onPosition,u=r.children,d=r.className,c=r.style,f=r.wrapperClassName,p=r.triggerClickKeycode,h=r.align,m=r.beforeOpen,g=r.onOpen,y=r.afterOpen,v=r.beforeClose,_=r.onClose,b=r.afterClose,w=(0,D.default)(r,["prefix","animation","defaultVisible","onVisibleChange","trigger","triggerType","overlay","onPosition","children","className","style","wrapperClassName","triggerClickKeycode","align","beforeOpen","onOpen","afterOpen","beforeClose","onClose","afterClose"]),t=(0,O.useState)(t),M=t[0],k=t[1],t=(0,O.useState)(n),S=t[0],E=t[1],t=(0,O.useState)(!0),x=t[0],C=t[1],L=(0,O.useRef)(null),t=((0,O.useEffect)(function(){"visible"in r&&k(r.visible)},[r.visible]),(0,O.useEffect)(function(){"animation"in r&&S!==n&&E(n)},[n]),l?u:a),a=l||u,a=N.default.createElement(Y.default.OverlayAnimate,{visible:M,animation:S,timeout:200,onEnter:function(){C(!1),"function"==typeof m&&m(L.current)},onEntering:function(){"function"==typeof g&&g(L.current)},onEntered:function(){"function"==typeof y&&y(L.current)},onExit:function(){"function"==typeof v&&v(L.current)},onExiting:function(){"function"==typeof _&&_(L.current)},onExited:function(){C(!0),"function"==typeof b&&b(L.current)},style:c},a?(0,O.cloneElement)(a,{className:(0,P.default)([e+"overlay-inner",d,a&&a.props&&a.props.className])}):N.default.createElement("span",null)),u=(0,P.default)(((l={})[e+"overlay-wrapper v2"]=!0,l[f]=f,l.opened=M,l)),c={};h&&(c.points=h.split(" "));return N.default.createElement(j.default.Popup,(0,T.default)({},w,c,{wrapperClassName:u,overlay:a,visible:M,isAnimationEnd:x,triggerType:i,onVisibleChange:function(e){for(var t=arguments.length,n=Array(1a&&y.shift(),i.default.render(d.default.createElement(l.default,l.default.getContext(),d.default.createElement(m,{dataSource:y})),g),{key:n,close:function(){r.timer&&clearTimeout(r.timer);var e=y.indexOf(r);-1 16.8.0")}},e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n(546)},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var p=s(n(2)),r=s(n(4)),o=s(n(5)),a=s(n(6)),h=s(n(38)),m=s(n(0)),i=s(n(3)),g=s(n(13)),y=n(11),l=s(n(27)),v=s(n(355));function s(e){return e&&e.__esModule?e:{default:e}}function _(e,r){var o=r.size,i=r.device,l=r.labelAlign,s=r.labelTextAlign,u=r.labelCol,d=r.wrapperCol,c=r.responsive,f=r.colon;return m.default.Children.map(e,function(e){return y.obj.isReactFragment(e)?_(e.props.children,r):e&&-1<["function","object"].indexOf((0,h.default)(e.type))&&"form_item"===e.type._typeMark?(t={labelCol:e.props.labelCol||u,wrapperCol:e.props.wrapperCol||d,labelAlign:e.props.labelAlign||("phone"===i?"top":l),labelTextAlign:e.props.labelTextAlign||s,colon:"colon"in e.props?e.props.colon:f,size:e.props.size||o,responsive:c},m.default.cloneElement(e,(n=t,a={},Object.keys(n).forEach(function(e){void 0!==n[e]&&(a[e]=n[e])}),a))):e;var t,n,a})}u=m.default.Component,(0,a.default)(b,u),b.prototype.getChildContext=function(){return{_formField:this.props.field||this._formField,_formSize:this.props.size,_formDisabled:this.props.disabled,_formPreview:this.props.isPreview,_formFullWidth:this.props.fullWidth,_formLabelForErrorMessage:this.props.useLabelForErrorMessage}},b.prototype.componentDidUpdate=function(e){var t=this.props;this._formField&&("value"in t&&t.value!==e.value&&this._formField.setValues(t.value),"error"in t&&t.error!==e.error&&this._formField.setValues(t.error))},b.prototype.render=function(){var e=this.props,t=e.className,n=e.inline,a=e.size,r=(e.device,e.labelAlign,e.labelTextAlign,e.onSubmit),o=e.children,i=(e.labelCol,e.wrapperCol,e.style),l=e.prefix,s=e.rtl,u=e.isPreview,d=e.component,c=e.responsive,f=e.gap,n=(e.colon,(0,g.default)(((e={})[l+"form"]=!0,e[l+"inline"]=n,e[""+l+a]=a,e[l+"form-responsive-grid"]=c,e[l+"form-preview"]=u,e[t]=!!t,e))),a=_(o,this.props);return m.default.createElement(d,(0,p.default)({role:"grid"},y.obj.pickOthers(b.propTypes,this.props),{className:n,style:i,dir:s?"rtl":void 0,onSubmit:r}),c?m.default.createElement(v.default,{gap:f},a):a)},a=n=b,n.propTypes={prefix:i.default.string,inline:i.default.bool,size:i.default.oneOf(["large","medium","small"]),fullWidth:i.default.bool,labelAlign:i.default.oneOf(["top","left","inset"]),labelTextAlign:i.default.oneOf(["left","right"]),field:i.default.any,saveField:i.default.func,labelCol:i.default.object,wrapperCol:i.default.object,onSubmit:i.default.func,children:i.default.any,className:i.default.string,style:i.default.object,value:i.default.object,onChange:i.default.func,component:i.default.oneOfType([i.default.string,i.default.func]),fieldOptions:i.default.object,rtl:i.default.bool,device:i.default.oneOf(["phone","tablet","desktop"]),responsive:i.default.bool,isPreview:i.default.bool,useLabelForErrorMessage:i.default.bool,colon:i.default.bool,disabled:i.default.bool,gap:i.default.oneOfType([i.default.arrayOf(i.default.number),i.default.number])},n.defaultProps={prefix:"next-",onSubmit:function(e){e.preventDefault()},size:"medium",labelAlign:"left",onChange:y.func.noop,component:"form",saveField:y.func.noop,device:"desktop",colon:!1,disabled:!1},n.childContextTypes={_formField:i.default.object,_formSize:i.default.string,_formDisabled:i.default.bool,_formPreview:i.default.bool,_formFullWidth:i.default.bool,_formLabelForErrorMessage:i.default.bool};var u,n=a;function b(e){(0,r.default)(this,b);var t,n,a=(0,o.default)(this,u.call(this,e));return a.onChange=function(e,t){a.props.onChange(a._formField.getValues(),{name:e,value:t,field:a._formField})},a._formField=null,!1!==e.field&&(t=(0,p.default)({},e.fieldOptions,{onChange:a.onChange}),e.field?(a._formField=e.field,n=a._formField.options.onChange,t.onChange=y.func.makeChain(n,a.onChange),a._formField.setOptions&&a._formField.setOptions(t)):("value"in e&&(t.values=e.value),a._formField=new l.default(a,t)),e.locale&&e.locale.Validate&&a._formField.setOptions({messages:e.locale.Validate}),e.saveField(a._formField)),a}n.displayName="Form",t.default=n,e.exports=t.default},function(e,t,n){"use strict";var a=n(86),m=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(160))),i=a(n(551)),r=a(n(162)),o=a(n(161)),b=a(n(163)),w=a(n(73)),l=a(n(352)),s=a(n(353)),g=a(n(557)),M=n(566),u={state:"",valueName:"value",trigger:"onChange",inputValues:[]},a=function(){function a(e){var t=this,n=1e.length)&&(t=e.length);for(var n=0,a=new Array(t);n=a.length)return n;var o=a[r],n=e(t&&t[o],n,a,r+1);return t?Array.isArray(t)?((a=[].concat(t))[o]=n,a):(0,s.default)({},t,(0,i.default)({},o,n)):((r=isNaN(o)?{}:[])[o]=n,r)};t=function(){};void 0!==e&&e.env,n.warning=t}.call(this,r(354))},function(e,t,n){"use strict";t.__esModule=!0,t.cloneAndAddKey=function(e){{var t;if(e&&(0,a.isValidElement)(e))return t=e.key||"error",(0,a.cloneElement)(e,{key:t})}return e},t.scrollToFirstError=function(e){var t=e.errorsGroup,n=e.options,a=e.instance;if(t&&n.scrollToFirstError){var r,o=void 0,i=void 0;for(r in t)if(t.hasOwnProperty(r)){var l=u.default.findDOMNode(a[r]);if(!l)return;var s=l.offsetTop;(void 0===i||s), use instead of.'),S.default.cloneElement(e,{className:t,size:c||C(r)})):(0,k.isValidElement)(e)?e:S.default.createElement("span",{className:a+"btn-helper"},e)}),t=d,_=(0,b.default)({},x.obj.pickOthers(Object.keys(L.propTypes),e),{type:o,disabled:p,onClick:h,className:(0,E.default)(n)});return"button"!==t&&(delete _.type,_.disabled&&(delete _.onClick,_.href&&delete _.href)),S.default.createElement(t,(0,b.default)({},_,{dir:g?"rtl":void 0,onMouseUp:this.onMouseUp,ref:this.buttonRefHandler}),l,u)},a=n=L,n.propTypes=(0,b.default)({},l.default.propTypes,{prefix:r.default.string,rtl:r.default.bool,type:r.default.oneOf(["primary","secondary","normal"]),size:r.default.oneOf(["small","medium","large"]),icons:r.default.shape({loading:r.default.node}),iconSize:r.default.oneOfType([r.default.oneOf(["xxs","xs","small","medium","large","xl","xxl","xxxl","inherit"]),r.default.number]),htmlType:r.default.oneOf(["submit","reset","button"]),component:r.default.oneOf(["button","a","div","span"]),loading:r.default.bool,ghost:r.default.oneOf([!0,!1,"light","dark"]),text:r.default.bool,warning:r.default.bool,disabled:r.default.bool,onClick:r.default.func,className:r.default.string,onMouseUp:r.default.func,children:r.default.node}),n.defaultProps={prefix:"next-",type:"normal",size:"medium",icons:{},htmlType:"button",component:"button",loading:!1,ghost:!1,text:!1,warning:!1,disabled:!1,onClick:function(){}};var u,l=a;function L(){var e,t;(0,o.default)(this,L);for(var n=arguments.length,a=Array(n),r=0;ra[r])return!0;if(n[r] 0, or `null`');if(W(i,"numericSeparator")&&"boolean"!=typeof i.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var t=i.numericSeparator;if(void 0===n)return"undefined";if(null===n)return"null";if("boolean"==typeof n)return n?"true":"false";if("string"==typeof n)return function e(t,n){if(t.length>n.maxStringLength)return a=t.length-n.maxStringLength,a="... "+a+" more character"+(1"}if(H(n)){if(0===n.length)return"[]";var v=$(n,h);return l&&!function(e){for(var t=0;t "+h(e,n))}),G("Map",_.call(n),u,l)):function(e){if(b&&e&&"object"==typeof e)try{b.call(e);try{_.call(e)}catch(e){return 1}return e instanceof Set}catch(e){}return}(n)?(d=[],X.call(n,function(e){d.push(h(e,n))}),G("Set",b.call(n),d,l)):function(e){if(w&&e&&"object"==typeof e)try{w.call(e,w);try{M.call(e,M)}catch(e){return 1}return e instanceof WeakMap}catch(e){}return}(n)?K("WeakMap"):function(e){if(M&&e&&"object"==typeof e)try{M.call(e,M);try{w.call(e,w)}catch(e){return 1}return e instanceof WeakSet}catch(e){}return}(n)?K("WeakSet"):function(e){if(k&&e&&"object"==typeof e)try{return k.call(e),1}catch(e){}return}(n)?K("WeakRef"):"[object Number]"!==V(c=n)||N&&"object"==typeof c&&N in c?function(e){if(e&&"object"==typeof e&&T)try{return T.call(e),1}catch(e){}return}(n)?U(h(T.call(n))):"[object Boolean]"!==V(t=n)||N&&"object"==typeof t&&N in t?"[object String]"!==V(e=n)||N&&"object"==typeof e&&N in e?("[object Date]"!==V(t=n)||N&&"object"==typeof t&&N in t)&&!F(n)?(e=$(n,h),t=j?j(n)===Object.prototype:n instanceof Object||n.constructor===Object,f=n instanceof Object?"":"null prototype",p=!t&&N&&Object(n)===n&&N in n?S.call(V(n),8,-1):f?"Object":"",t=(!t&&"function"==typeof n.constructor&&n.constructor.name?n.constructor.name+" ":"")+(p||f?"["+L.call(C.call([],p||[],f||[]),": ")+"] ":""),0===e.length?t+"{}":l?t+"{"+q(e,l)+"}":t+"{ "+L.call(e,", ")+" }"):String(n):U(h(String(n))):U(Q.call(n)):U(h(Number(n)))};var s=Object.prototype.hasOwnProperty||function(e){return e in this};function W(e,t){return s.call(e,t)}function V(e){return i.call(e)}function B(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,a=e.length;n, as child."),a.push(t),e.props.children&&(t.children=n(e.props.children)))}),a}(e.children):t},N.prototype.fetchInfoFromBinaryChildren=function(e){function r(e,t){return t=t||0,e.forEach(function(e){e.children?t=r(e.children,t):t+=1}),t}var a=!1,o=[],i=[],e=(function t(){var e=0r.tRight&&(e=r.tRight,r.changedPageX=r.tRight-r.startLeft),e-r.cellLefto.clientHeight,o.scrollWidth,o.clientWidth,o={},e||(o[r]=0,o[a]=0),+i&&(o.marginBottom=-i,o.paddingBottom=i,e&&(o[a]=i)),h.dom.setStyle(this.headerNode,o)),n&&!this.props.lockType&&this.headerNode&&(r=this.headerNode.querySelector("."+t+"table-header-fixer"),e=h.dom.getStyle(this.headerNode,"height"),a=h.dom.getStyle(this.headerNode,"paddingBottom"),h.dom.setStyle(r,{width:i,height:e-a}))},o.prototype.render=function(){var e=this.props,t=e.components,n=e.className,a=e.prefix,r=e.fixedHeader,o=e.lockType,i=e.dataSource,e=(e.maxBodyHeight,(0,u.default)(e,["components","className","prefix","fixedHeader","lockType","dataSource","maxBodyHeight"]));return r&&((t=(0,s.default)({},t)).Header||(t.Header=m.default),t.Body||(t.Body=g.default),t.Wrapper||(t.Wrapper=y.default),n=(0,p.default)(((r={})[a+"table-fixed"]=!0,r[a+"table-wrap-empty"]=!i.length,r[n]=n,r))),c.default.createElement(l,(0,s.default)({},e,{dataSource:i,lockType:o,components:t,className:n,prefix:a}))},o}(c.default.Component),n.FixedHeader=m.default,n.FixedBody=g.default,n.FixedWrapper=y.default,n.propTypes=(0,s.default)({hasHeader:r.default.bool,fixedHeader:r.default.bool,maxBodyHeight:r.default.oneOfType([r.default.number,r.default.string])},l.propTypes),n.defaultProps=(0,s.default)({},l.defaultProps,{hasHeader:!0,fixedHeader:!1,maxBodyHeight:200,components:{},refs:{},prefix:"next-"}),n.childContextTypes={fixedHeader:r.default.bool,getNode:r.default.func,onFixedScrollSync:r.default.func,getTableInstanceForFixed:r.default.func,maxBodyHeight:r.default.oneOfType([r.default.number,r.default.string])};var t,n=t;return n.displayName="FixedTable",(0,o.statics)(n,l),n};var c=l(n(0)),r=l(n(3)),f=n(23),p=l(n(13)),h=n(11),m=l(n(129)),g=l(n(390)),y=l(n(130)),o=n(67);function l(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=o(n(12)),f=o(n(2)),r=o(n(4)),l=o(n(5)),s=o(n(6)),u=(t.default=function(o){e=t=function(n){function a(e,t){(0,r.default)(this,a);var c=(0,l.default)(this,n.call(this,e,t));return c.addSelection=function(e){var t=c.props,n=t.prefix,a=t.rowSelection,t=t.size,a=a.columnProps&&a.columnProps()||{};e.find(function(e){return"selection"===e.key})||e.unshift((0,f.default)({key:"selection",title:c.renderSelectionHeader.bind(c),cell:c.renderSelectionBody.bind(c),width:"small"===t?34:50,className:n+"table-selection "+n+"table-prerow",__normalized:!0},a))},c.renderSelectionHeader=function(){var e=c.selectAllRow,t={},n=c.props,a=n.rowSelection,r=n.primaryKey,o=n.dataSource,i=n.entireDataSource,n=n.locale,l=c.state.selectedRowKeys,s=a.mode||"multiple",u=!!l.length,d=!1,i=(c.flatDataSource(i||o).filter(function(e,t){return!a.getProps||!(a.getProps(e,t)||{}).disabled}).map(function(e){return e[r]}).forEach(function(e){-1===l.indexOf(e)?u=!1:d=!0}),t.onClick=b(function(e){e.stopPropagation()},t.onClick),a.titleProps&&a.titleProps()||{});return u&&(d=!1),["multiple"===s?p.default.createElement(h.default,(0,f.default)({key:"_total",indeterminate:d,"aria-label":n.selectAll,checked:u,onChange:e},t,i)):null,a.titleAddons&&a.titleAddons()]},c.renderSelectionBody=function(e,t,n){var a=c.props,r=a.rowSelection,a=a.primaryKey,o=c.state.selectedRowKeys,i=r.mode||"multiple",o=-1s.length&&(u=o),w(u.filter(function(e){return-1=Math.max(a-y,0)&&oc.clientHeight;this.isLock()?(e=this.bodyLeftNode,t=this.bodyRightNode,n=this.getWrapperNode("right"),a=f?d:0,c=c.offsetHeight-d,f||(r[s]=0,r[u]=0),+d?(r.marginBottom=-d,r.paddingBottom=d):(r.marginBottom=-20,r.paddingBottom=20),c={"max-height":c},o||+d||(c[u]=0),+d&&(c[u]=-d),e&&g.dom.setStyle(e,c),t&&g.dom.setStyle(t,c),n&&+d&&g.dom.setStyle(n,i?"left":"right",a+"px")):(r.marginBottom=-d,r.paddingBottom=d,r[u]=0,f||(r[s]=0)),l&&g.dom.setStyle(l,r)},a.prototype.adjustHeaderSize=function(){var o=this;this.isLock()&&this.tableInc.groupChildren.forEach(function(e,t){var n=o.tableInc.groupChildren[t].length-1,n=o.getHeaderCellNode(t,n),a=o.getHeaderCellNode(t,0),r=o.getHeaderCellNode(t,0,"right"),t=o.getHeaderCellNode(t,0,"left");n&&r&&(n=n.offsetHeight,g.dom.setStyle(r,"height",n),setTimeout(function(){var e=o.tableRightInc.affixRef;return e&&e.getInstance()&&e.getInstance().updatePosition()})),a&&t&&(r=a.offsetHeight,g.dom.setStyle(t,"height",r),setTimeout(function(){var e=o.tableLeftInc.affixRef;return e&&e.getInstance()&&e.getInstance().updatePosition()}))})},a.prototype.adjustRowHeight=function(){var n=this;this.isLock()&&this.tableInc.props.dataSource.forEach(function(e,t){t=""+("object"===(void 0===e?"undefined":(0,r.default)(e))&&"__rowIndex"in e?e.__rowIndex:t)+(e.__expanded?"_expanded":"");n.setRowHeight(t,"left"),n.setRowHeight(t,"right")})},a.prototype.setRowHeight=function(e,t){var t=this.getRowNode(e,t),e=this.getRowNode(e),e=(M?e&&e.offsetHeight:e&&parseFloat(getComputedStyle(e).height))||"auto",n=(M?t&&t.offsetHeight:t&&parseFloat(getComputedStyle(t).height))||"auto";t&&e!==n&&g.dom.setStyle(t,"height",e)},a.prototype.getWrapperNode=function(e){e=e?e.charAt(0).toUpperCase()+e.substr(1):"";try{return(0,u.findDOMNode)(this["lock"+e+"El"])}catch(e){return null}},a.prototype.getRowNode=function(e,t){t=this["table"+(t=t?t.charAt(0).toUpperCase()+t.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(t.getRowRef(e))}catch(e){return null}},a.prototype.getHeaderCellNode=function(e,t,n){n=this["table"+(n=n?n.charAt(0).toUpperCase()+n.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(n.getHeaderCellRef(e,t))}catch(e){return null}},a.prototype.getCellNode=function(e,t,n){n=this["table"+(n=n?n.charAt(0).toUpperCase()+n.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(n.getCellRef(e,t))}catch(e){return null}},a.prototype.render=function(){var e,t=this.props,n=(t.children,t.columns,t.prefix),a=t.components,r=t.className,o=t.dataSource,i=t.tableWidth,t=(0,f.default)(t,["children","columns","prefix","components","className","dataSource","tableWidth"]),l=this.normalizeChildrenState(this.props),s=l.lockLeftChildren,u=l.lockRightChildren,l=l.children,d={left:this.getFlatenChildrenLength(s),right:this.getFlatenChildrenLength(u),origin:this.getFlatenChildrenLength(l)};return this._notNeedAdjustLockLeft&&(s=[]),this._notNeedAdjustLockRight&&(u=[]),this.lockLeftChildren=s,this.lockRightChildren=u,this.isOriginLock()?((a=(0,p.default)({},a)).Body=a.Body||v.default,a.Header=a.Header||_.default,a.Wrapper=a.Wrapper||b.default,a.Row=a.Row||y.default,r=(0,m.default)(((e={})[n+"table-lock"]=!0,e[n+"table-wrap-empty"]=!o.length,e[r]=r,e)),e=[h.default.createElement(c,(0,p.default)({},t,{dataSource:o,key:"lock-left",columns:s,className:n+"table-lock-left",lengths:d,prefix:n,lockType:"left",components:a,ref:this.saveLockLeftRef,loading:!1,"aria-hidden":!0})),h.default.createElement(c,(0,p.default)({},t,{dataSource:o,key:"lock-right",columns:u,className:n+"table-lock-right",lengths:d,prefix:n,lockType:"right",components:a,ref:this.saveLockRightRef,loading:!1,"aria-hidden":!0}))],h.default.createElement(c,(0,p.default)({},t,{tableWidth:i,dataSource:o,columns:l,prefix:n,lengths:d,wrapperContent:e,components:a,className:r}))):h.default.createElement(c,this.props)},a}(h.default.Component),t.LockRow=y.default,t.LockBody=v.default,t.LockHeader=_.default,t.propTypes=(0,p.default)({scrollToCol:a.default.number,scrollToRow:a.default.number},c.propTypes),t.defaultProps=(0,p.default)({},c.defaultProps),t.childContextTypes={getTableInstance:a.default.func,getLockNode:a.default.func,onLockBodyScroll:a.default.func,onRowMouseEnter:a.default.func,onRowMouseLeave:a.default.func};var e,t=e;return t.displayName="LockTable",(0,w.statics)(t,c),t},n(0)),h=c(s),u=n(23),a=c(n(3)),m=c(n(13)),d=c(n(172)),g=n(11),y=c(n(174)),v=c(n(391)),_=c(n(392)),b=c(n(130)),w=n(67);function c(e){return e&&e.__esModule?e:{default:e}}var M=g.env.ieVersion;function k(e){return function n(e){return e.map(function(e){var t=(0,p.default)({},e);return e.children&&(e.children=n(e.children)),t})}(e)}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=l(n(12)),u=l(n(2)),r=l(n(4)),o=l(n(5)),i=l(n(6)),d=(t.default=function(l){e=t=function(n){function a(e,t){(0,r.default)(this,a);var d=(0,o.default)(this,n.call(this,e));return d.state={},d.updateOffsetArr=function(){var e=d.splitChildren||{},t=e.lockLeftChildren,n=e.lockRightChildren,e=e.originChildren,a=d.getFlatenChildren(t).length,r=d.getFlatenChildren(n).length,e=a+r+d.getFlatenChildren(e).length,a=0r.top-e.offset?(t?(s.position="absolute",s.top=a-(r.top-e.offset),u="relative"):(s.position="fixed",s.top=e.offset+n.top),d._setAffixStyle(s,!0),d._setContainerStyle(l)):e.bottom&&a![^\\|>]*)\\s+)?(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$"),R.prototype.PATTERN_FOLDED_SCALAR_END=new p("(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$"),R.prototype.PATTERN_SEQUENCE_ITEM=new p("^\\-((?\\s+)(?.+?))?\\s*$"),R.prototype.PATTERN_ANCHOR_VALUE=new p("^&(?[^ ]+) *(?.*)"),R.prototype.PATTERN_COMPACT_NOTATION=new p("^(?"+j.REGEX_QUOTED_STRING+"|[^ '\"\\{\\[].*?) *\\:(\\s+(?.+?))?\\s*$"),R.prototype.PATTERN_MAPPING_ITEM=new p("^(?"+j.REGEX_QUOTED_STRING+"|[^ '\"\\[\\{].*?) *\\:(\\s+(?.+?))?\\s*$"),R.prototype.PATTERN_DECIMAL=new p("\\d+"),R.prototype.PATTERN_INDENT_SPACES=new p("^ +"),R.prototype.PATTERN_TRAILING_LINES=new p("(\n*)$"),R.prototype.PATTERN_YAML_HEADER=new p("^\\%YAML[: ][\\d\\.]+.*\n","m"),R.prototype.PATTERN_LEADING_COMMENTS=new p("^(\\#.*?\n)+","m"),R.prototype.PATTERN_DOCUMENT_MARKER_START=new p("^\\-\\-\\-.*?\n","m"),R.prototype.PATTERN_DOCUMENT_MARKER_END=new p("^\\.\\.\\.\\s*$","m"),R.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION={},R.prototype.CONTEXT_NONE=0,R.prototype.CONTEXT_SEQUENCE=1,R.prototype.CONTEXT_MAPPING=2,R.prototype.parse=function(e,t,n){var a,r,o,i,l,s,u,d,c,f,p,h,m,g,y,v,_,b,w,M,k,S,E,x,C,L,T,D,O,N,P;for(null==t&&(t=!1),null==n&&(n=null),this.currentLineNb=-1,this.currentLine="",this.lines=this.cleanup(e).split("\n"),i=null,o=this.CONTEXT_NONE,r=!1;this.moveToNextLine();)if(!this.isCurrentLineEmpty()){if("\t"===this.currentLine[0])throw new Y("A YAML file cannot contain tabs as indentation.",this.getRealCurrentLineNb()+1,this.currentLine);if(d=k=!1,P=this.PATTERN_SEQUENCE_ITEM.exec(this.currentLine)){if(this.CONTEXT_MAPPING===o)throw new Y("You cannot define a sequence item when in a mapping");o=this.CONTEXT_SEQUENCE,null==i&&(i=[]),null!=P.value&&(M=this.PATTERN_ANCHOR_VALUE.exec(P.value))&&(d=M.ref,P.value=M.value),null==P.value||""===I.trim(P.value," ")||0===I.ltrim(P.value," ").indexOf("#")?this.currentLineNb=this.lines.length-1)&&(this.currentLine=this.lines[++this.currentLineNb],!0)},R.prototype.moveToPreviousLine=function(){this.currentLine=this.lines[--this.currentLineNb]},R.prototype.parseValue=function(t,e,n){var a,r,o,i;if(0===t.indexOf("*")){if(t=-1!==(r=t.indexOf("#"))?t.substr(1,r-2):t.slice(1),void 0===this.refs[t])throw new Y('Reference "'+t+'" does not exist.',this.currentLine);return this.refs[t]}if(r=this.PATTERN_FOLDED_SCALAR_ALL.exec(t))return i=null!=(i=r.modifiers)?i:"",o=Math.abs(parseInt(i)),isNaN(o)&&(o=0),i=this.parseFoldedScalar(r.separator,this.PATTERN_DECIMAL.replace(i,""),o),null!=r.type?(j.configure(e,n),j.parseScalar(r.type+" "+i)):i;if("["!==(o=t.charAt(0))&&"{"!==o&&'"'!==o&&"'"!==o)return this.isNextLineIndented()&&(t+="\n"+this.getNextEmbedBlock()),j.parse(t,e,n);for(;;)try{return j.parse(t,e,n)}catch(e){if(!((a=e)instanceof l&&this.moveToNextLine()))throw a.parsedLine=this.getRealCurrentLineNb()+1,a.snippet=this.currentLine,a;t+="\n"+I.trim(this.currentLine," ")}},R.prototype.parseFoldedScalar=function(e,t,n){var a,r,o,i,l,s,u,d,c,f;if(null==t&&(t=""),null==n&&(n=0),!(u=this.moveToNextLine()))return"";for(a=this.isCurrentLineBlank(),f="";u&&a;)(u=this.moveToNextLine())&&(f+="\n",a=this.isCurrentLineBlank());if(0<(n=0===n&&(l=this.PATTERN_INDENT_SPACES.exec(this.currentLine))?l[0].length:n))for(null==(d=this.PATTERN_FOLDED_SCALAR_BY_INDENTATION[n])&&(d=new p("^ {"+n+"}(.*)$"),R.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION[n]=d);u&&(a||(l=d.exec(this.currentLine)));)f+=a?this.currentLine.slice(n):l[1],(u=this.moveToNextLine())&&(f+="\n",a=this.isCurrentLineBlank());else u&&(f+="\n");if(u&&this.moveToPreviousLine(),">"===e){for(s="",r=0,o=(c=f.split("\n")).length;rn&&(e=!0),this.moveToPreviousLine(),e)},R.prototype.isCurrentLineEmpty=function(){var e=I.trim(this.currentLine," ");return 0===e.length||"#"===e.charAt(0)},R.prototype.isCurrentLineBlank=function(){return""===I.trim(this.currentLine," ")},R.prototype.isCurrentLineComment=function(){return"#"===I.ltrim(this.currentLine," ").charAt(0)},R.prototype.cleanup=function(e){var t,n,a,r,o,i,l,s,u,d,c;for(-1!==e.indexOf("\r")&&(e=e.split("\r\n").join("\n").split("\r").join("\n")),e=(u=this.PATTERN_YAML_HEADER.replaceAll(e,""))[0],u=u[1],this.offset+=u,c=(u=this.PATTERN_LEADING_COMMENTS.replaceAll(e,"",1))[0],1===u[1]&&(this.offset+=I.subStrCount(e,"\n")-I.subStrCount(c,"\n"),e=c),c=(u=this.PATTERN_DOCUMENT_MARKER_START.replaceAll(e,"",1))[0],1===u[1]&&(this.offset+=I.subStrCount(e,"\n")-I.subStrCount(c,"\n"),e=c,e=this.PATTERN_DOCUMENT_MARKER_END.replace(e,"")),d=-1,a=0,o=(s=e.split("\n")).length;a=!%@`]"),r.requiresDoubleQuoting=function(e){return this.PATTERN_CHARACTERS_TO_ESCAPE.test(e)},r.escapeWithDoubleQuotes=function(e){var t;return'"'+this.PATTERN_MAPPING_ESCAPEES.replace(e,(t=this,function(e){return t.MAPPING_ESCAPEES_TO_ESCAPED[e]}))+'"'},r.requiresSingleQuoting=function(e){return this.PATTERN_SINGLE_QUOTING.test(e)},r.escapeWithSingleQuotes=function(e){return"'"+e.replace(/'/g,"''")+"'"},e.exports=r},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?" "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":" "+this.message},o}(Error);e.exports=n},function(e,t,n){var f,p;function a(){}p=n(112),f=n(396),a.indentation=4,a.prototype.dump=function(e,t,n,a,r){var o,i,l,s,u,d,c;if(null==t&&(t=0),null==a&&(a=!1),null==r&&(r=null),s="",u=(n=null==n?0:n)?p.strRepeat(" ",n):"",t<=0||"object"!=typeof e||e instanceof Date||p.isEmpty(e))s+=u+f.dump(e,a,r);else if(e instanceof Array)for(o=0,l=e.length;ou&&!c&&(o=o.slice(0,u),e=C.default.createElement(m.default,{key:"_count",type:"primary",size:p,animation:!1},d(a,t))),0=D.KEYCODE.LEFT&&t<=D.KEYCODE.DOWN&&e.preventDefault(),e=void 0,t===D.KEYCODE.RIGHT||t===D.KEYCODE.DOWN?(e=o.getNextActiveKey(!0),o.handleTriggerEvent(o.props.triggerType,e)):t!==D.KEYCODE.LEFT&&t!==D.KEYCODE.UP||(e=o.getNextActiveKey(!1),o.handleTriggerEvent(o.props.triggerType,e)))},o.state={activeKey:o.getDefaultActiveKey(e)},o}l.displayName="Tab",t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var h=f(n(2)),a=f(n(4)),r=f(n(5)),o=f(n(6)),m=f(n(0)),i=n(23),l=f(n(3)),g=f(n(13)),s=f(n(24)),u=f(n(62)),d=f(n(50)),y=f(n(79)),v=n(11),c=n(402);function f(e){return e&&e.__esModule?e:{default:e}}var p,_={float:"right",zIndex:1},b={float:"left",zIndex:1},w={dropdown:"arrow-down",prev:"arrow-left",next:"arrow-right"},M=u.default.Popup,u=(p=m.default.Component,(0,o.default)(k,p),k.prototype.componentDidMount=function(){this.props.animation||this.initialSettings(),v.events.on(window,"resize",this.onWindowResized)},k.prototype.componentDidUpdate=function(e){var t=this;clearTimeout(this.scrollTimer),this.scrollTimer=setTimeout(function(){t.scrollToActiveTab()},410),clearTimeout(this.slideTimer),this.slideTimer=setTimeout(function(){t.setSlideBtn()},410),"dropdown"!==this.props.excessMode||(0,c.tabsArrayShallowEqual)(this.props.tabs,e.tabs)||this.getDropdownItems(this.props)},k.prototype.componentWillUnmount=function(){v.events.off(window,"resize",this.onWindowResized)},k.prototype.initialSettings=function(){this.setSlideBtn(),this.getDropdownItems(this.props)},k.prototype.setOffset=function(e){var t=!(1n&&(t.current=n),this.setState(t),this.props.onPageSizeChange(e)},I.prototype.renderPageTotal=function(){var e=this.props,t=e.prefix,n=e.total,e=e.totalRender,a=this.state,r=a.currentPageSize,a=a.current;return N.default.createElement("div",{className:t+"pagination-total"},e(n,[(a-1)*r+1,a*r]))},I.prototype.renderPageItem=function(e){var t=this.props,n=t.prefix,a=t.size,r=t.link,o=t.pageNumberRender,i=t.total,l=t.pageSize,t=t.locale,s=this.state.current,i=Y(i,l),l=parseInt(e,10)===s,a={size:a,className:(0,P.default)(((s={})[n+"pagination-item"]=!0,s[n+"current"]=l,s)),onClick:l?m:this.onPageItemClick.bind(this,e)};return r&&(a.component="a",a.href=r.replace("{page}",e)),N.default.createElement(c.default,(0,O.default)({"aria-label":j.str.template(t.total,{current:e,total:i})},a,{key:e}),o(e))},I.prototype.renderPageFirst=function(e){var t=this.props,n=t.prefix,a=t.size,r=t.shape,t=t.locale,a={disabled:e<=1,size:a,className:(0,P.default)(((a={})[n+"pagination-item"]=!0,a[n+"prev"]=!0,a)),onClick:this.onPageItemClick.bind(this,e-1)},n=N.default.createElement(d.default,{type:"arrow-left",className:n+"pagination-icon-prev"});return N.default.createElement(c.default,(0,O.default)({},a,{"aria-label":j.str.template(t.labelPrev,{current:e})}),n,"arrow-only"===r||"arrow-prev-only"===r||"no-border"===r?"":t.prev)},I.prototype.renderPageLast=function(e,t){var n=this.props,a=n.prefix,r=n.size,o=n.shape,n=n.locale,r={disabled:t<=e,size:r,className:(0,P.default)(((t={})[a+"pagination-item"]=!0,t[a+"next"]=!0,t)),onClick:this.onPageItemClick.bind(this,e+1)},t=N.default.createElement(d.default,{type:"arrow-right",className:a+"pagination-icon-next"});return N.default.createElement(c.default,(0,O.default)({},r,{"aria-label":j.str.template(n.labelNext,{current:e})}),"arrow-only"===o||"no-border"===o?"":n.next,t)},I.prototype.renderPageEllipsis=function(e){var t=this.props.prefix;return N.default.createElement(d.default,{className:t+"pagination-ellipsis "+t+"pagination-icon-ellipsis",type:"ellipsis",key:"ellipsis-"+e})},I.prototype.renderPageJump=function(){var t=this,e=this.props,n=e.prefix,a=e.size,e=e.locale,r=this.state.inputValue;return[N.default.createElement("span",{className:n+"pagination-jump-text"},e.goTo),N.default.createElement(f.default,{className:n+"pagination-jump-input",type:"text","aria-label":e.inputAriaLabel,size:a,value:r,onChange:this.onInputChange.bind(this),onKeyDown:function(e){e.keyCode===j.KEYCODE.ENTER&&t.handleJump(e)}}),N.default.createElement("span",{className:n+"pagination-jump-text"},e.page),N.default.createElement(c.default,{className:n+"pagination-jump-go",size:a,onClick:this.handleJump},e.go)]},I.prototype.renderPageDisplay=function(e,t){var n=this.props,a=n.prefix,n=n.pageNumberRender;return N.default.createElement("span",{className:a+"pagination-display"},N.default.createElement("em",null,n(e)),"/",n(t))},I.prototype.renderPageList=function(e,t){var n=this.props,a=n.prefix,n=n.pageShowCount,r=[];if(t<=n)for(var o=1;o<=t;o++)r.push(this.renderPageItem(o));else{var n=n-3,i=parseInt(n/2,10),l=void 0,s=void 0;r.push(this.renderPageItem(1)),s=e+i,(l=e-i)<=1&&(s=(l=2)+n),2=e.length&&-1=this.props.children.length?(this.update(this.props),this.changeSlide({message:"index",index:this.props.children.length-this.props.slidesToShow,currentSlide:this.state.currentSlide})):s.obj.shallowEqual(e,this.props)||this.update(this.props),this.adaptHeight()},p.prototype.componentWillUnmount=function(){this.animationEndCallback&&clearTimeout(this.animationEndCallback),s.events.off(window,"resize",this.onWindowResized),this.state.autoPlayTimer&&clearInterval(this.state.autoPlayTimer)},p.prototype.onWindowResized=function(){this.update(this.props),this.setState({animating:!1}),clearTimeout(this.animationEndCallback),delete this.animationEndCallback},p.prototype.slickGoTo=function(e){"number"==typeof e&&this.changeSlide({message:"index",index:e,currentSlide:this.state.currentSlide})},p.prototype.onEnterArrow=function(e){this.arrowHoverHandler(e)},p.prototype.onLeaveArrow=function(){this.arrowHoverHandler()},p.prototype._instanceRefHandler=function(e,t){this[e]=t},p.prototype.render=function(){var e=this.props,t=e.prefix,n=e.animation,a=e.arrows,r=e.arrowSize,o=e.arrowPosition,i=e.arrowDirection,l=e.dots,s=e.dotsClass,u=e.cssEase,d=e.speed,c=e.infinite,f=e.centerMode,p=e.centerPadding,h=e.lazyLoad,m=e.dotsDirection,g=e.rtl,y=e.slidesToShow,v=e.slidesToScroll,_=e.variableWidth,b=e.vertical,w=e.verticalSwiping,M=e.focusOnSelect,k=e.children,S=e.dotsRender,e=e.triggerType,E=this.state,x=E.currentSlide,C=E.lazyLoadedList,L=E.slideCount,T=E.slideWidth,D=E.slideHeight,O=E.trackStyle,N=E.listHeight,E=E.dragging,u={prefix:t,animation:n,cssEase:u,speed:d,infinite:c,centerMode:f,focusOnSelect:M?this.selectHandler:null,currentSlide:x,lazyLoad:h,lazyLoadedList:C,rtl:g,slideWidth:T,slideHeight:D,slidesToShow:y,slidesToScroll:v,slideCount:L,trackStyle:O,variableWidth:_,vertical:b,verticalSwiping:w,triggerType:e},d=void 0,h=(!0===l&&yt.startX?1:-1),!0===this.props.verticalSwiping&&(t.swipeLength=Math.round(Math.sqrt(Math.pow(t.curY-t.startY,2))),a=t.curY>t.startY?1:-1),r=this.state.currentSlide,l=Math.ceil(this.state.slideCount/this.props.slidesToScroll),o=this.swipeDirection(this.state.touchObject),i=t.swipeLength,!1===this.props.infinite&&(0===r&&"right"===o||l<=r+1&&"left"===o)&&(i=t.swipeLength*this.props.edgeFriction,!1===this.state.edgeDragged&&this.props.edgeEvent&&(this.props.edgeEvent(o),this.setState({edgeDragged:!0}))),!1===this.state.swiped&&this.props.swipeEvent&&(this.props.swipeEvent(o),this.setState({swiped:!0})),this.setState({touchObject:t,swipeLeft:l=n+i*a,trackStyle:(0,u.getTrackCSS)((0,s.default)({left:l},this.props,this.state))}),Math.abs(t.curX-t.startX)<.8*Math.abs(t.curY-t.startY)||4t[t.length-1])e=t[t.length-1];else for(var a in t){if(e-1*n.state.swipeLeft)return t=e,!1}else if(e.offsetLeft-a+(n.getWidth(e)||0)/2>-1*n.state.swipeLeft)return t=e,!1;return!0}),Math.abs(t.dataset.index-this.state.currentSlide)||1):this.props.slidesToScroll},swipeEnd:function(e){if(this.state.dragging){var t=this.state.touchObject,n=this.state.listWidth/this.props.touchThreshold,a=this.swipeDirection(t);if(this.props.verticalSwiping&&(n=this.state.listHeight/this.props.touchThreshold),this.setState({dragging:!1,edgeDragged:!1,swiped:!1,swipeLeft:null,touchObject:{}}),t.swipeLength)if(t.swipeLength>n){e.preventDefault();var r=void 0,o=void 0;switch(a){case"left":case"down":o=this.state.currentSlide+this.getSlideCount(),r=this.props.swipeToSlide?this.checkNavigable(o):o,this.setState({currentDirection:0});break;case"right":case"up":o=this.state.currentSlide-this.getSlideCount(),r=this.props.swipeToSlide?this.checkNavigable(o):o,this.setState({currentDirection:1});break;default:r=this.state.currentSlide}this.slideHandler(r)}else{t=(0,u.getTrackLeft)((0,s.default)({slideIndex:this.state.currentSlide,trackRef:this.track},this.props,this.state));this.setState({trackStyle:(0,u.getTrackAnimateCSS)((0,s.default)({left:t},this.props,this.state))})}}else this.props.swipe&&e.preventDefault()},onInnerSliderEnter:function(){this.props.autoplay&&this.props.pauseOnHover&&this.pause()},onInnerSliderLeave:function(){this.props.autoplay&&this.props.pauseOnHover&&this.autoPlay()}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=a(n(2)),d=a(n(0)),c=a(n(23)),y=n(405);function a(e){return e&&e.__esModule?e:{default:e}}t.default={initialize:function(t){var n=this,e=c.default.findDOMNode(this.list),a=d.default.Children.count(t.children),r=this.getWidth(e)||0,o=this.getWidth(c.default.findDOMNode(this.track))||0,i=void 0,e=(i=t.vertical?r:(r-(t.centerMode&&2*parseInt(t.centerPadding)))/t.slidesToShow,this.getHeight(e.querySelector('[data-index="0"]'))||0),l=e*t.slidesToShow,s=t.slidesToShow||1,u="activeIndex"in t?t.activeIndex:t.defaultActiveIndex,s=t.rtl?a-1-(s-1)-u:u;this.setState({slideCount:a,slideWidth:i,listWidth:r,trackWidth:o,currentSlide:s,slideHeight:e,listHeight:l},function(){var e=(0,y.getTrackLeft)((0,g.default)({slideIndex:n.state.currentSlide,trackRef:n.track},t,n.state)),e=(0,y.getTrackCSS)((0,g.default)({left:e},t,n.state));n.setState({trackStyle:e}),n.autoPlay()})},update:function(e){this.initialize(e)},getWidth:function(e){return"clientWidth"in e?e.clientWidth:e&&e.getBoundingClientRect().width},getHeight:function(e){return"clientHeight"in e?e.clientHeight:e&&e.getBoundingClientRect().height},adaptHeight:function(){var e,t;this.props.adaptiveHeight&&(t='[data-index="'+this.state.currentSlide+'"]',this.list&&(t=(e=c.default.findDOMNode(this.list)).querySelector(t).offsetHeight,e.style.height=t+"px"))},canGoNext:function(e){var t=!0;return e.infinite||(e.centerMode?e.currentSlide>=e.slideCount-1&&(t=!1):(e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1)),t},slideHandler:function(e){var t=this,n=this.props.rtl,a=void 0,r=void 0,o=void 0;if(!this.props.waitForAnimate||!this.state.animating){if("fade"===this.props.animation)return r=this.state.currentSlide,!1===this.props.infinite&&(e<0||e>=this.state.slideCount)?void 0:(a=e<0?e+this.state.slideCount:e>=this.state.slideCount?e-this.state.slideCount:e,this.props.lazyLoad&&this.state.lazyLoadedList.indexOf(a)<0&&this.setState({lazyLoadedList:this.state.lazyLoadedList.concat(a)}),o=function(){t.setState({animating:!1}),t.props.onChange(a),delete t.animationEndCallback},this.props.onBeforeChange(this.state.currentSlide,a),this.setState({animating:!0,currentSlide:a},function(){this.animationEndCallback=setTimeout(o,this.props.speed+20)}),void this.autoPlay());a=e,n?a<0?!1===this.props.infinite?r=0:this.state.slideCount%this.props.slidesToScroll!=0?a+this.props.slidesToScroll<=0?(r=this.state.slideCount+a,a=this.state.slideCount-this.props.slidesToScroll):r=a=0:r=this.state.slideCount+a:r=a>=this.state.slideCount?!1===this.props.infinite?this.state.slideCount-this.props.slidesToShow:this.state.slideCount%this.props.slidesToScroll!=0?0:a-this.state.slideCount:a:r=a<0?!1===this.props.infinite?0:this.state.slideCount%this.props.slidesToScroll!=0?this.state.slideCount-this.state.slideCount%this.props.slidesToScroll:this.state.slideCount+a:a>=this.state.slideCount?!1===this.props.infinite?this.state.slideCount-this.props.slidesToShow:this.state.slideCount%this.props.slidesToScroll!=0?0:a-this.state.slideCount:a;var i,e=(0,y.getTrackLeft)((0,g.default)({slideIndex:a,trackRef:this.track},this.props,this.state)),l=(0,y.getTrackLeft)((0,g.default)({slideIndex:r,trackRef:this.track},this.props,this.state));if(!1===this.props.infinite&&(e=l),this.props.lazyLoad){for(var s=!0,u=[],d=this.state.slideCount,c=a<0?d+a:r,f=c;f=s.activeIndex?"visible":"hidden",d.transition="opacity "+s.speed+"ms "+s.cssEase,d.WebkitTransition="opacity "+s.speed+"ms "+s.cssEase,s.vertical?d.top=-s.activeIndex*s.slideHeight:d.left=-s.activeIndex*s.slideWidth),s.vertical&&(d.width="100%"),d),u=(d=(0,v.default)({activeIndex:e},c),a=d.prefix,u=r=i=void 0,o=(u=d.rtl?d.slideCount-1-d.activeIndex:d.activeIndex)<0||u>=d.slideCount,d.centerMode?(n=Math.floor(d.slidesToShow/2),r=(u-d.currentSlide)%d.slideCount==0,u>d.currentSlide-n-1&&u<=d.currentSlide+n&&(i=!0)):i=d.currentSlide<=u&&u=u,u=(0,k.default)(((v={})[o+"upload-list-item"]=!0,v[o+"hidden"]=u,v)),v=this.props.children||i.card.addPhoto,c=r?S.func.prevent:c,_=S.obj.pickOthers(C.propTypes,this.props),b=S.obj.pickOthers(E.default.propTypes,_);if(h&&"function"==typeof m)return e=(0,k.default)(((e={})[o+"form-preview"]=!0,e[l]=!!l,e)),M.default.createElement("div",{style:s,className:e},m(this.state.value,this.props));return M.default.createElement(E.default,(0,w.default)({className:l,style:s,listType:"card",closable:!0,locale:i,value:this.state.value,onRemove:c,onCancel:f,onPreview:d,itemRender:g,isPreview:h,uploader:this.uploaderRef,reUpload:y,showDownload:n},_),M.default.createElement(x.default,(0,w.default)({},b,{shape:"card",prefix:o,disabled:r,action:a,timeout:p,isPreview:h,value:this.state.value,onProgress:this.onProgress,onChange:this.onChange,ref:function(e){return t.saveRef(e)},className:u}),v))},d=n=C,n.displayName="Card",n.propTypes={prefix:l.default.string,locale:l.default.object,children:l.default.object,value:l.default.oneOfType([l.default.array,l.default.object]),defaultValue:l.default.oneOfType([l.default.array,l.default.object]),onPreview:l.default.func,onChange:l.default.func,onRemove:l.default.func,onCancel:l.default.func,itemRender:l.default.func,reUpload:l.default.bool,showDownload:l.default.bool,onProgress:l.default.func,isPreview:l.default.bool,renderPreview:l.default.func},n.defaultProps={prefix:"next-",locale:u.default.Upload,showDownload:!0,onChange:S.func.noop,onPreview:S.func.noop,onProgress:S.func.noop},a=function(){var n=this;this.onProgress=function(e,t){n.setState({value:e}),n.props.onProgress(e,t)},this.onChange=function(e,t){"value"in n.props||n.setState({value:e}),n.props.onChange(e,t)}};var f,i=d;function C(e){(0,r.default)(this,C);var t=(0,o.default)(this,f.call(this,e)),n=(a.call(t),void 0),n="value"in e?e.value:e.defaultValue;return t.state={value:Array.isArray(n)?n:[],uploaderRef:t.uploaderRef},t}t.default=(0,s.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var u=m(n(2)),d=m(n(12)),o=m(n(4)),i=m(n(5)),a=m(n(6)),c=m(n(0)),r=m(n(3)),f=m(n(13)),p=m(n(24)),l=n(11),s=m(n(44)),h=m(n(180));function m(e){return e&&e.__esModule?e:{default:e}}g=c.default.Component,(0,a.default)(y,g),y.prototype.abort=function(e){this.uploaderRef.abort(e)},y.prototype.startUpload=function(){this.uploaderRef.startUpload()},y.prototype.render=function(){var e=this.props,t=e.className,n=e.style,a=e.shape,r=e.locale,o=e.prefix,i=e.listType,e=(0,d.default)(e,["className","style","shape","locale","prefix","listType"]),l=o+"upload-drag",t=(0,f.default)(((s={})[l]=!0,s[l+"-over"]=this.state.dragOver,s[t]=!!t,s)),s=this.props.children||c.default.createElement("div",{className:t},c.default.createElement("p",{className:l+"-icon"},c.default.createElement(p.default,{size:"large",className:l+"-upload-icon"})),c.default.createElement("p",{className:l+"-text"},r.drag.text),c.default.createElement("p",{className:l+"-hint"},r.drag.hint));return c.default.createElement(h.default,(0,u.default)({},e,{prefix:o,shape:a,listType:i,dragable:!0,style:n,onDragOver:this.onDragOver,onDragLeave:this.onDragLeave,onDrop:this.onDrop,ref:this.saveUploaderRef}),s)},a=n=y,n.propTypes={prefix:r.default.string,locale:r.default.object,shape:r.default.string,onDragOver:r.default.func,onDragLeave:r.default.func,onDrop:r.default.func,limit:r.default.number,className:r.default.string,style:r.default.object,defaultValue:r.default.array,children:r.default.node,listType:r.default.string,timeout:r.default.number},n.defaultProps={prefix:"next-",onDragOver:l.func.noop,onDragLeave:l.func.noop,onDrop:l.func.noop,locale:s.default.Upload};var g,r=a;function y(){var e,t;(0,o.default)(this,y);for(var n=arguments.length,a=Array(n),r=0;r=e.length?{value:void 0,done:!0}:(e=a(e,t),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var o=n(144),i=n(143);e.exports=function(r){return function(e,t){var n,e=String(i(e)),t=o(t),a=e.length;return t<0||a<=t?r?"":void 0:(n=e.charCodeAt(t))<55296||56319=e.length?(this._t=void 0,r(1)):r(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),o.Arguments=o.Array,a("keys"),a("values"),a("entries")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){e.exports={default:n(481),__esModule:!0}},function(e,t,n){n(482),n(487),n(488),n(489),e.exports=n(78).Symbol},function(I,R,e){"use strict";function a(e){var t=L[e]=_(M[E]);return t._k=e,t}function n(e,t){m(e);for(var n,a=V(t=g(t)),r=0,o=a.length;rr;)s(L,t=n[r++])||t==x||t==H||a.push(t);return a}function i(e){for(var t,n=e===D,a=Q(n?T:g(e)),r=[],o=0;a.length>o;)!s(L,t=a[o++])||n&&!s(D,t)||r.push(L[t]);return r}var l=e(77),s=e(86),u=e(79),d=e(92),A=e(197),H=e(483).KEY,c=e(108),f=e(146),p=e(152),F=e(123),h=e(96),z=e(153),W=e(154),V=e(484),B=e(485),m=e(107),U=e(94),K=e(149),g=e(95),y=e(142),v=e(120),_=e(151),G=e(486),q=e(199),b=e(148),$=e(85),J=e(121),X=q.f,w=$.f,Q=G.f,M=l.Symbol,k=l.JSON,S=k&&k.stringify,E="prototype",x=h("_hidden"),Z=h("toPrimitive"),ee={}.propertyIsEnumerable,C=f("symbol-registry"),L=f("symbols"),T=f("op-symbols"),D=Object[E],f="function"==typeof M&&!!b.f,O=l.QObject,N=!O||!O[E]||!O[E].findChild,P=u&&c(function(){return 7!=_(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(e,t,n){var a=X(D,t);a&&delete D[t],w(e,t,n),a&&e!==D&&w(D,t,a)}:w,j=f&&"symbol"==typeof M.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof M},Y=function(e,t,n){return e===D&&Y(T,t,n),m(e),t=y(t,!0),m(n),s(L,t)?(n.enumerable?(s(e,x)&&e[x][t]&&(e[x][t]=!1),n=_(n,{enumerable:v(0,!1)})):(s(e,x)||w(e,x,v(1,{})),e[x][t]=!0),P(e,t,n)):w(e,t,n)};f||(A((M=function(){if(this instanceof M)throw TypeError("Symbol is not a constructor!");var t=F(0ne;)h(te[ne++]);for(var ae=J(h.store),re=0;ae.length>re;)W(ae[re++]);d(d.S+d.F*!f,"Symbol",{for:function(e){return s(C,e+="")?C[e]:C[e]=M(e)},keyFor:function(e){if(!j(e))throw TypeError(e+" is not a symbol!");for(var t in C)if(C[t]===e)return t},useSetter:function(){N=!0},useSimple:function(){N=!1}}),d(d.S+d.F*!f,"Object",{create:function(e,t){return void 0===t?_(e):n(_(e),t)},defineProperty:Y,defineProperties:n,getOwnPropertyDescriptor:r,getOwnPropertyNames:o,getOwnPropertySymbols:i});O=c(function(){b.f(1)});d(d.S+d.F*O,"Object",{getOwnPropertySymbols:function(e){return b.f(K(e))}}),k&&d(d.S+d.F*(!f||c(function(){var e=M();return"[null]"!=S([e])||"{}"!=S({a:e})||"{}"!=S(Object(e))})),"JSON",{stringify:function(e){for(var t,n,a=[e],r=1;ri;)o.call(e,a=r[i++])&&t.push(a);return t}},function(e,t,n){var a=n(195);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,n){var a=n(95),r=n(198).f,o={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){if(!i||"[object Window]"!=o.call(e))return r(a(e));try{return r(e)}catch(e){return i.slice()}}},function(e,t){},function(e,t,n){n(154)("asyncIterator")},function(e,t,n){n(154)("observable")},function(e,t,n){e.exports={default:n(491),__esModule:!0}},function(e,t,n){n(492),e.exports=n(78).Object.setPrototypeOf},function(e,t,n){var a=n(92);a(a.S,"Object",{setPrototypeOf:n(493).set})},function(e,t,r){function o(e,t){if(a(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")}var n=r(94),a=r(107);e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{(a=r(190)(Function.call,r(199).f(Object.prototype,"__proto__").set,2))(e,[]),n=!(e instanceof Array)}catch(e){n=!0}return function(e,t){return o(e,t),n?e.__proto__=t:a(e,t),e}}({},!1):void 0),check:o}},function(e,t,n){e.exports={default:n(495),__esModule:!0}},function(e,t,n){n(496);var a=n(78).Object;e.exports=function(e,t){return a.create(e,t)}},function(e,t,n){var a=n(92);a(a.S,"Object",{create:n(151)})},function(e,t,n){"use strict";var i=n(498);function a(){}function r(){}r.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,r,o){if(o!==i)throw o=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"),o.name="Invariant Violation",o}function t(){return e}var n={array:e.isRequired=e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:r,resetWarningCache:a};return n.PropTypes=n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function s(e,t,n,a){e.removeEventListener&&e.removeEventListener(t,n,a||!1)}function a(e,t,n,a){return e.addEventListener&&e.addEventListener(t,n,a||!1),{off:function(){return s(e,t,n,a)}}}t.__esModule=!0,t.on=a,t.once=function(r,o,i,l){return a(r,o,function e(){for(var t=arguments.length,n=Array(t),a=0;a68?1900:2e3)},r=function(t){return function(e){this[t]=+e}},o=[/[+-]\d\d:?(\d\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if("Z"===e)return 0;var t=e.match(/([+-]|\d\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:"+"===t[0]?-n:n}(e)}],i=function(e){var t=h[e];return t&&(t.indexOf?t:t.s.concat(t.f))},l=function(e,t){var n,a=h.meridiem;if(a){for(var r=1;r<=24;r+=1)if(e.indexOf(a(r,0,t))>-1){n=r>12;break}}else n=e===(t?"pm":"PM");return n},f={A:[n,function(e){this.afternoon=l(e,!1)}],a:[n,function(e){this.afternoon=l(e,!0)}],S:[/\d/,function(e){this.milliseconds=100*+e}],SS:[e,function(e){this.milliseconds=10*+e}],SSS:[/\d{3}/,function(e){this.milliseconds=+e}],s:[t,r("seconds")],ss:[t,r("seconds")],m:[t,r("minutes")],mm:[t,r("minutes")],H:[t,r("hours")],h:[t,r("hours")],HH:[t,r("hours")],hh:[t,r("hours")],D:[t,r("day")],DD:[e,r("day")],Do:[n,function(e){var t=h.ordinal,n=e.match(/\d+/);if(this.day=n[0],t)for(var a=1;a<=31;a+=1)t(a).replace(/\[|\]/g,"")===e&&(this.day=a)}],M:[t,r("month")],MM:[e,r("month")],MMM:[n,function(e){var t=i("months"),n=(i("monthsShort")||t.map(function(e){return e.slice(0,3)})).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[n,function(e){var t=i("months").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\d+/,r("year")],YY:[e,function(e){this.year=a(e)}],YYYY:[/\d{4}/,r("year")],Z:o,ZZ:o};function b(e){var t,r;t=e,r=h&&h.formats;for(var u=(e=t.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(e,t,n){var a=n&&n.toUpperCase();return t||r[n]||s[n]||r[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,n){return t||n.slice(1)})})).match(c),d=u.length,n=0;n-1)return new Date(("X"===t?1e3:1)*e);var a=b(t)(e),r=a.year,o=a.month,i=a.day,l=a.hours,s=a.minutes,u=a.seconds,d=a.milliseconds,c=a.zone,f=new Date,p=i||(r||o?1:f.getDate()),h=r||f.getFullYear(),m=0;r&&!o||(m=o>0?o-1:f.getMonth());var g=l||0,y=s||0,v=u||0,_=d||0;return c?new Date(Date.UTC(h,m,p,g,y,v,_+60*c.offset*1e3)):n?new Date(Date.UTC(h,m,p,g,y,v,_)):new Date(h,m,p,g,y,v,_)}catch(e){return new Date("")}}(t,r,n),this.init(),s&&!0!==s&&(this.$L=this.locale(s).$L),l&&t!=this.format(r)&&(this.$d=new Date("")),h={}}else if(r instanceof Array)for(var u=r.length,d=1;d<=u;d+=1){a[1]=r[d-1];var c=f.apply(this,a);if(c.isValid()){this.$d=c.$d,this.$L=c.$L,this.init();break}d===u&&(this.$d=new Date(""))}else p.call(this,e)}}}()},function(e,t,n){e.exports=function(){"use strict";return function(e,t,a){a.updateLocale=function(e,t){var n=a.Ls[e];if(n)return(t?Object.keys(t):[]).forEach(function(e){n[e]=t[e]}),n}}}()},function(e,t,n){e.exports=function(e,t,n){function a(e,t,n,a,r){var e=e.name?e:e.$locale(),t=l(e[t]),n=l(e[n]),o=t||n.map(function(e){return e.slice(0,a)});if(!r)return o;var i=e.weekStart;return o.map(function(e,t){return o[(t+(i||0))%7]})}function r(){return n.Ls[n.locale()]}function o(e,t){return e.formats[t]||e.formats[t.toUpperCase()].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(e,t,n){return t||n.slice(1)})}var t=t.prototype,l=function(e){return e&&(e.indexOf?e:e.s)};t.localeData=function(){return function(){var t=this;return{months:function(e){return e?e.format("MMMM"):a(t,"months")},monthsShort:function(e){return e?e.format("MMM"):a(t,"monthsShort","months",3)},firstDayOfWeek:function(){return t.$locale().weekStart||0},weekdays:function(e){return e?e.format("dddd"):a(t,"weekdays")},weekdaysMin:function(e){return e?e.format("dd"):a(t,"weekdaysMin","weekdays",2)},weekdaysShort:function(e){return e?e.format("ddd"):a(t,"weekdaysShort","weekdays",3)},longDateFormat:function(e){return o(t.$locale(),e)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}}.bind(this)()},n.localeData=function(){var t=r();return{firstDayOfWeek:function(){return t.weekStart||0},weekdays:function(){return n.weekdays()},weekdaysShort:function(){return n.weekdaysShort()},weekdaysMin:function(){return n.weekdaysMin()},months:function(){return n.months()},monthsShort:function(){return n.monthsShort()},longDateFormat:function(e){return o(t,e)},meridiem:t.meridiem,ordinal:t.ordinal}},n.months=function(){return a(r(),"months")},n.monthsShort=function(){return a(r(),"monthsShort","months",3)},n.weekdays=function(e){return a(r(),"weekdays",null,null,e)},n.weekdaysShort=function(e){return a(r(),"weekdaysShort","weekdays",3,e)},n.weekdaysMin=function(e){return a(r(),"weekdaysMin","weekdays",2,e)}}},function(e,t,n){e.exports=function(){"use strict";var i="month",l="quarter";return function(e,t){var n=t.prototype;n.quarter=function(e){return this.$utils().u(e)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(e-1))};var a=n.add;n.add=function(e,t){return e=Number(e),this.$utils().p(t)===l?this.add(3*e,i):a.bind(this)(e,t)};var o=n.startOf;n.startOf=function(e,t){var n=this.$utils(),a=!!n.u(t)||t;if(n.p(e)===l){var r=this.quarter()-1;return a?this.month(3*r).startOf(i).startOf("day"):this.month(3*r+2).endOf(i).endOf("day")}return o.bind(this)(e,t)}}}()},function(e,t,n){e.exports=function(){"use strict";return function(e,t,n){var a=t.prototype,o=a.format;n.en.ordinal=function(e){var t=["th","st","nd","rd"],n=e%100;return"["+e+(t[(n-20)%10]||t[n]||t[0])+"]"},a.format=function(e){var t=this,n=this.$locale();if(!this.isValid())return o.bind(this)(e);var a=this.$utils(),r=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(e){switch(e){case"Q":return Math.ceil((t.$M+1)/3);case"Do":return n.ordinal(t.$D);case"gggg":return t.weekYear();case"GGGG":return t.isoWeekYear();case"wo":return n.ordinal(t.week(),"W");case"w":case"ww":return a.s(t.week(),"w"===e?1:2,"0");case"W":case"WW":return a.s(t.isoWeek(),"W"===e?1:2,"0");case"k":case"kk":return a.s(String(0===t.$H?24:t.$H),"k"===e?1:2,"0");case"X":return Math.floor(t.$d.getTime()/1e3);case"x":return t.$d.getTime();case"z":return"["+t.offsetName()+"]";case"zzz":return"["+t.offsetName("long")+"]";default:return e}});return o.bind(this)(r)}}}()},function(e,t,n){e.exports=function(){"use strict";var l="week",s="year";return function(e,t,i){var n=t.prototype;n.week=function(e){if(void 0===e&&(e=null),null!==e)return this.add(7*(e-this.week()),"day");var t=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var n=i(this).startOf(s).add(1,s).date(t),a=i(this).endOf(l);if(n.isBefore(a))return 1}var r=i(this).startOf(s).date(t).startOf(l).subtract(1,"millisecond"),o=this.diff(r,l,!0);return o<0?i(this).startOf("week").week():Math.ceil(o)},n.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}()},function(e,t,n){e.exports=function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),a={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,t){return"W"===t?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,t){var n=100*e+t;return n<600?"凌晨":n<900?"早上":n<1100?"上午":n<1300?"中午":n<1800?"下午":"晚上"}};return n.default.locale(a,null,!0),a}(n(205))},function(e,t,n){"use strict";t.__esModule=!0,t.flex=t.transition=t.animation=void 0;var r=n(201),o=n(97);function a(e){if(!r.hasDOM)return!1;var n=document.createElement("div"),a=!1;return(0,o.each)(e,function(e,t){if(void 0!==n.style[t])return!(a={end:e})}),a}t.animation=a({WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd",animation:"animationend"}),t.transition=a({WebkitTransition:"webkitTransitionEnd",OTransition:"oTransitionEnd",transition:"transitionend"}),t.flex=function(e){if(!r.hasDOM)return!1;var n=document.createElement("div"),a=!1;return(0,o.each)(e,function(e,t){return(0,o.each)(e,function(e){try{n.style[t]=e,a=a||n.style[t]===e}catch(e){}return!a}),!a}),a}({display:["flex","-webkit-flex","-moz-flex","-ms-flexbox"]})},function(e,t,n){"use strict";t.__esModule=!0,t.getFocusNodeList=i,t.saveLastFocusNode=function(){l=document.activeElement},t.clearLastFocusNode=function(){l=null},t.backLastFocusNode=function(){if(l)try{l.focus()}catch(e){}},t.limitTabRange=function(e,t){{var n,a;t.keyCode===r.default.TAB&&(e=i(e),n=e.length-1,-1<(a=e.indexOf(document.activeElement))&&(a=a+(t.shiftKey?-1:1),e[a=n<(a=a<0?n:a)?0:a].focus(),t.preventDefault()))}};var t=n(206),r=(t=t)&&t.__esModule?t:{default:t},a=n(97);function o(e){var t=e.nodeName.toLowerCase(),n=parseInt(e.getAttribute("tabindex"),10),n=!isNaN(n)&&-1a.height)&&(r[1]=-t.top-("t"===e?t.height:0))),r},this._getParentScrollOffset=function(e){var t=0,n=0;return e&&e.offsetParent&&e.offsetParent!==document.body&&(isNaN(e.offsetParent.scrollTop)||(t+=e.offsetParent.scrollTop),isNaN(e.offsetParent.scrollLeft)||(n+=e.offsetParent.scrollLeft)),{top:t,left:n}}};var h=a;function m(e){(0,o.default)(this,m),r.call(this),this.pinElement=e.pinElement,this.baseElement=e.baseElement,this.pinFollowBaseElementWhenFixed=e.pinFollowBaseElementWhenFixed,this.container=function(e){var t=e.container,e=e.baseElement;if(void 0===("undefined"==typeof document?"undefined":(0,i.default)(document)))return t;for(var n=(n=(0,l.default)(t,e))||document.body;"static"===y.dom.getStyle(n,"position");){if(!n||n===document.body)return document.body;n=n.parentNode}return n}(e),this.autoFit=e.autoFit||!1,this.align=e.align||"tl tl",this.offset=e.offset||[0,0],this.needAdjust=e.needAdjust||!1,this.isRtl=e.isRtl||!1}t.default=h,e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var w=a(n(2)),M=a(n(12)),k=n(0),S=a(k),E=a(n(13)),x=a(n(183)),C=a(n(80)),L=n(11);function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(e){if(!k.useState||!k.useRef||!k.useEffect)return L.log.warning("need react version > 16.8.0"),null;var t=e.prefix,t=void 0===t?"next-":t,n=e.animation,a=void 0===n?{in:"expandInDown",out:"expandOutUp"}:n,r=e.visible,n=e.hasMask,o=e.align,i=e.points,o=void 0===i?o?o.split(" "):void 0:i,l=e.onPosition,i=e.children,s=e.className,u=e.style,d=e.wrapperClassName,c=e.beforeOpen,f=e.onOpen,p=e.afterOpen,h=e.beforeClose,m=e.onClose,g=e.afterClose,e=(0,M.default)(e,["prefix","animation","visible","hasMask","align","points","onPosition","children","className","style","wrapperClassName","beforeOpen","onOpen","afterOpen","beforeClose","onClose","afterClose"]),y=(0,k.useState)(!0),v=y[0],_=y[1],b=(0,k.useRef)(null),y=S.default.createElement(C.default.OverlayAnimate,{visible:r,animation:a,onEnter:function(){_(!1),"function"==typeof c&&c(b.current)},onEntering:function(){"function"==typeof f&&f(b.current)},onEntered:function(){"function"==typeof p&&p(b.current)},onExit:function(){"function"==typeof h&&h(b.current)},onExiting:function(){"function"==typeof m&&m(b.current)},onExited:function(){_(!0),"function"==typeof g&&g(b.current)},timeout:300,style:u},i?(0,k.cloneElement)(i,{className:(0,E.default)([t+"overlay-inner",s,i&&i.props&&i.props.className])}):S.default.createElement("span",null)),s=(0,E.default)(((u={})[t+"overlay-wrapper v2"]=!0,u[d]=d,u.opened=r,u));return S.default.createElement(x.default,(0,w.default)({},e,{visible:r,isAnimationEnd:v,hasMask:n,wrapperClassName:s,maskClassName:t+"overlay-backdrop",maskRender:function(e){return S.default.createElement(C.default.OverlayAnimate,{visible:r,animation:!!a&&{in:"fadeIn",out:"fadeOut"},timeout:300,unmountOnExit:!0},e)},points:o,onPosition:function(e){(0,w.default)(e,{align:e.config.points}),"function"==typeof l&&l(e)},ref:b}),y)},e.exports=t.default},function(n,e){function a(e,t){return n.exports=a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n.exports.__esModule=!0,n.exports.default=n.exports,a(e,t)}n.exports=a,n.exports.__esModule=!0,n.exports.default=n.exports},function(e,t,n){"use strict";t.__esModule=!0;var a,d=g(n(12)),c=g(n(2)),r=g(n(4)),o=g(n(6)),i=g(n(7)),s=n(0),f=g(s),p=n(23),l=n(30),u=g(n(3)),h=n(11),m=g(n(348));function g(e){return e&&e.__esModule?e:{default:e}}var y,n=h.func.noop,v=h.func.makeChain,_=h.func.bindCtx,u=(y=s.Component,(0,i.default)(b,y),b.getDerivedStateFromProps=function(e,t){return"visible"in e?(0,c.default)({},t,{visible:e.visible}):null},b.prototype.componentWillUnmount=function(){var t=this;["_timer","_hideTimer","_showTimer"].forEach(function(e){t[e]&&clearTimeout(t[e])})},b.prototype.handleVisibleChange=function(e,t,n){"visible"in this.props||this.setState({visible:e}),this.props.onVisibleChange(e,t,n)},b.prototype.handleTriggerClick=function(e){this.state.visible&&!this.props.canCloseByTrigger||this.handleVisibleChange(!this.state.visible,"fromTrigger",e)},b.prototype.handleTriggerKeyDown=function(e){var t=this.props.triggerClickKeycode;(Array.isArray(t)?t:[t]).includes(e.keyCode)&&(e.preventDefault(),this.handleTriggerClick(e))},b.prototype.handleTriggerMouseEnter=function(e){var t=this;this._mouseNotFirstOnMask=!1,this._hideTimer&&(clearTimeout(this._hideTimer),this._hideTimer=null),this._showTimer&&(clearTimeout(this._showTimer),this._showTimer=null),this.state.visible||(this._showTimer=setTimeout(function(){t.handleVisibleChange(!0,"fromTrigger",e)},this.props.delay))},b.prototype.handleTriggerMouseLeave=function(e,t){var n=this;this._showTimer&&(clearTimeout(this._showTimer),this._showTimer=null),this.state.visible&&(this._hideTimer=setTimeout(function(){n.handleVisibleChange(!1,t||"fromTrigger",e)},this.props.delay))},b.prototype.handleTriggerFocus=function(e){this.handleVisibleChange(!0,"fromTrigger",e)},b.prototype.handleTriggerBlur=function(e){this._isForwardContent||this.handleVisibleChange(!1,"fromTrigger",e),this._isForwardContent=!1},b.prototype.handleContentMouseDown=function(){this._isForwardContent=!0},b.prototype.handleContentMouseEnter=function(){clearTimeout(this._hideTimer)},b.prototype.handleContentMouseLeave=function(e){this.handleTriggerMouseLeave(e,"fromContent")},b.prototype.handleMaskMouseEnter=function(){this._mouseNotFirstOnMask||(clearTimeout(this._hideTimer),this._hideTimer=null,this._mouseNotFirstOnMask=!1)},b.prototype.handleMaskMouseLeave=function(){this._mouseNotFirstOnMask=!0},b.prototype.handleRequestClose=function(e,t){this.handleVisibleChange(!1,e,t)},b.prototype.renderTrigger=function(){var e,t,n,a,r,o,i,l=this,s=this.props,u=s.trigger,s=s.disabled,d={key:"trigger","aria-haspopup":!0,"aria-expanded":this.state.visible};return this.state.visible||(d["aria-describedby"]=void 0),s||(s=this.props.triggerType,s=Array.isArray(s)?s:[s],e=u&&u.props||{},t=e.onClick,n=e.onKeyDown,a=e.onMouseEnter,r=e.onMouseLeave,o=e.onFocus,i=e.onBlur,s.forEach(function(e){switch(e){case"click":d.onClick=v(l.handleTriggerClick,t),d.onKeyDown=v(l.handleTriggerKeyDown,n);break;case"hover":d.onMouseEnter=v(l.handleTriggerMouseEnter,a),d.onMouseLeave=v(l.handleTriggerMouseLeave,r);break;case"focus":d.onFocus=v(l.handleTriggerFocus,o),d.onBlur=v(l.handleTriggerBlur,i)}})),u&&f.default.cloneElement(u,d)},b.prototype.renderContent=function(){var t=this,e=this.props,n=e.children,e=e.triggerType,e=Array.isArray(e)?e:[e],n=s.Children.only(n),a=n.props,r=a.onMouseDown,o=a.onMouseEnter,i=a.onMouseLeave,l={key:"portal"};return e.forEach(function(e){switch(e){case"focus":l.onMouseDown=v(t.handleContentMouseDown,r);break;case"hover":l.onMouseEnter=v(t.handleContentMouseEnter,o),l.onMouseLeave=v(t.handleContentMouseLeave,i)}}),f.default.cloneElement(n,l)},b.prototype.renderPortal=function(){function e(){return(0,p.findDOMNode)(t)}var t=this,n=this.props,a=n.target,r=n.safeNode,o=n.followTrigger,i=n.triggerType,l=n.hasMask,s=n.wrapperStyle,n=(0,d.default)(n,["target","safeNode","followTrigger","triggerType","hasMask","wrapperStyle"]),u=this.props.container,r=Array.isArray(r)?[].concat(r):[r],s=(r.unshift(e),s||{});return o&&(u=function(e){return e&&e.parentNode||e},s.position="relative"),"hover"===i&&l&&(n.onMaskMouseEnter=this.handleMaskMouseEnter,n.onMaskMouseLeave=this.handleMaskMouseLeave),f.default.createElement(m.default,(0,c.default)({},n,{key:"overlay",ref:function(e){return t.overlay=e},visible:this.state.visible,target:a||e,container:u,safeNode:r,wrapperStyle:s,triggerType:i,hasMask:l,onRequestClose:this.handleRequestClose}),this.props.children&&this.renderContent())},b.prototype.render=function(){return[this.renderTrigger(),this.renderPortal()]},a=i=b,i.propTypes={children:u.default.node,trigger:u.default.element,triggerType:u.default.oneOfType([u.default.string,u.default.array]),triggerClickKeycode:u.default.oneOfType([u.default.number,u.default.array]),visible:u.default.bool,defaultVisible:u.default.bool,onVisibleChange:u.default.func,disabled:u.default.bool,autoFit:u.default.bool,delay:u.default.number,canCloseByTrigger:u.default.bool,target:u.default.any,safeNode:u.default.any,followTrigger:u.default.bool,container:u.default.any,hasMask:u.default.bool,wrapperStyle:u.default.object,rtl:u.default.bool,v2:u.default.bool,placement:u.default.string,placementOffset:u.default.number},i.defaultProps={triggerType:"hover",triggerClickKeycode:[h.KEYCODE.SPACE,h.KEYCODE.ENTER],defaultVisible:!1,onVisibleChange:n,disabled:!1,autoFit:!1,delay:200,canCloseByTrigger:!0,followTrigger:!1,container:function(){return document.body},rtl:!1},a);function b(e){(0,r.default)(this,b);var t=(0,o.default)(this,y.call(this,e));return t.state={visible:void 0===e.visible?e.defaultVisible:e.visible},_(t,["handleTriggerClick","handleTriggerKeyDown","handleTriggerMouseEnter","handleTriggerMouseLeave","handleTriggerFocus","handleTriggerBlur","handleContentMouseEnter","handleContentMouseLeave","handleContentMouseDown","handleRequestClose","handleMaskMouseEnter","handleMaskMouseLeave"]),t}u.displayName="Popup",t.default=(0,l.polyfill)(u),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var T=a(n(2)),D=a(n(12)),O=n(0),N=a(O),P=a(n(13)),j=a(n(183)),Y=a(n(80)),I=n(11);function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(r){if(!O.useState||!O.useRef||!O.useEffect)return I.log.warning("need react version > 16.8.0"),null;var e=r.prefix,e=void 0===e?"next-":e,t=r.animation,n=void 0===t?{in:"expandInDown",out:"expandOutUp"}:t,t=r.defaultVisible,a=r.onVisibleChange,o=void 0===a?function(){}:a,a=r.trigger,i=r.triggerType,i=void 0===i?"hover":i,l=r.overlay,s=r.onPosition,u=r.children,d=r.className,c=r.style,f=r.wrapperClassName,p=r.triggerClickKeycode,h=r.align,m=r.beforeOpen,g=r.onOpen,y=r.afterOpen,v=r.beforeClose,_=r.onClose,b=r.afterClose,w=(0,D.default)(r,["prefix","animation","defaultVisible","onVisibleChange","trigger","triggerType","overlay","onPosition","children","className","style","wrapperClassName","triggerClickKeycode","align","beforeOpen","onOpen","afterOpen","beforeClose","onClose","afterClose"]),t=(0,O.useState)(t),M=t[0],k=t[1],t=(0,O.useState)(n),S=t[0],E=t[1],t=(0,O.useState)(!0),x=t[0],C=t[1],L=(0,O.useRef)(null),t=((0,O.useEffect)(function(){"visible"in r&&k(r.visible)},[r.visible]),(0,O.useEffect)(function(){"animation"in r&&S!==n&&E(n)},[n]),l?u:a),a=l||u,a=N.default.createElement(Y.default.OverlayAnimate,{visible:M,animation:S,timeout:200,onEnter:function(){C(!1),"function"==typeof m&&m(L.current)},onEntering:function(){"function"==typeof g&&g(L.current)},onEntered:function(){"function"==typeof y&&y(L.current)},onExit:function(){"function"==typeof v&&v(L.current)},onExiting:function(){"function"==typeof _&&_(L.current)},onExited:function(){C(!0),"function"==typeof b&&b(L.current)},style:c},a?(0,O.cloneElement)(a,{className:(0,P.default)([e+"overlay-inner",d,a&&a.props&&a.props.className])}):N.default.createElement("span",null)),u=(0,P.default)(((l={})[e+"overlay-wrapper v2"]=!0,l[f]=f,l.opened=M,l)),c={};h&&(c.points=h.split(" "));return N.default.createElement(j.default.Popup,(0,T.default)({},w,c,{wrapperClassName:u,overlay:a,visible:M,isAnimationEnd:x,triggerType:i,onVisibleChange:function(e){for(var t=arguments.length,n=Array(1a&&y.shift(),i.default.render(d.default.createElement(l.default,l.default.getContext(),d.default.createElement(m,{dataSource:y})),g),{key:n,close:function(){r.timer&&clearTimeout(r.timer);var e=y.indexOf(r);-1 16.8.0")}},e.exports=t.default},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n(546)},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var p=s(n(2)),r=s(n(4)),o=s(n(6)),a=s(n(7)),h=s(n(38)),m=s(n(0)),i=s(n(3)),g=s(n(13)),y=n(11),l=s(n(28)),v=s(n(355));function s(e){return e&&e.__esModule?e:{default:e}}function _(e,r){var o=r.size,i=r.device,l=r.labelAlign,s=r.labelTextAlign,u=r.labelCol,d=r.wrapperCol,c=r.responsive,f=r.colon;return m.default.Children.map(e,function(e){return y.obj.isReactFragment(e)?_(e.props.children,r):e&&-1<["function","object"].indexOf((0,h.default)(e.type))&&"form_item"===e.type._typeMark?(t={labelCol:e.props.labelCol||u,wrapperCol:e.props.wrapperCol||d,labelAlign:e.props.labelAlign||("phone"===i?"top":l),labelTextAlign:e.props.labelTextAlign||s,colon:"colon"in e.props?e.props.colon:f,size:e.props.size||o,responsive:c},m.default.cloneElement(e,(n=t,a={},Object.keys(n).forEach(function(e){void 0!==n[e]&&(a[e]=n[e])}),a))):e;var t,n,a})}u=m.default.Component,(0,a.default)(b,u),b.prototype.getChildContext=function(){return{_formField:this.props.field||this._formField,_formSize:this.props.size,_formDisabled:this.props.disabled,_formPreview:this.props.isPreview,_formFullWidth:this.props.fullWidth,_formLabelForErrorMessage:this.props.useLabelForErrorMessage}},b.prototype.componentDidUpdate=function(e){var t=this.props;this._formField&&("value"in t&&t.value!==e.value&&this._formField.setValues(t.value),"error"in t&&t.error!==e.error&&this._formField.setValues(t.error))},b.prototype.render=function(){var e=this.props,t=e.className,n=e.inline,a=e.size,r=(e.device,e.labelAlign,e.labelTextAlign,e.onSubmit),o=e.children,i=(e.labelCol,e.wrapperCol,e.style),l=e.prefix,s=e.rtl,u=e.isPreview,d=e.component,c=e.responsive,f=e.gap,n=(e.colon,(0,g.default)(((e={})[l+"form"]=!0,e[l+"inline"]=n,e[""+l+a]=a,e[l+"form-responsive-grid"]=c,e[l+"form-preview"]=u,e[t]=!!t,e))),a=_(o,this.props);return m.default.createElement(d,(0,p.default)({role:"grid"},y.obj.pickOthers(b.propTypes,this.props),{className:n,style:i,dir:s?"rtl":void 0,onSubmit:r}),c?m.default.createElement(v.default,{gap:f},a):a)},a=n=b,n.propTypes={prefix:i.default.string,inline:i.default.bool,size:i.default.oneOf(["large","medium","small"]),fullWidth:i.default.bool,labelAlign:i.default.oneOf(["top","left","inset"]),labelTextAlign:i.default.oneOf(["left","right"]),field:i.default.any,saveField:i.default.func,labelCol:i.default.object,wrapperCol:i.default.object,onSubmit:i.default.func,children:i.default.any,className:i.default.string,style:i.default.object,value:i.default.object,onChange:i.default.func,component:i.default.oneOfType([i.default.string,i.default.func]),fieldOptions:i.default.object,rtl:i.default.bool,device:i.default.oneOf(["phone","tablet","desktop"]),responsive:i.default.bool,isPreview:i.default.bool,useLabelForErrorMessage:i.default.bool,colon:i.default.bool,disabled:i.default.bool,gap:i.default.oneOfType([i.default.arrayOf(i.default.number),i.default.number])},n.defaultProps={prefix:"next-",onSubmit:function(e){e.preventDefault()},size:"medium",labelAlign:"left",onChange:y.func.noop,component:"form",saveField:y.func.noop,device:"desktop",colon:!1,disabled:!1},n.childContextTypes={_formField:i.default.object,_formSize:i.default.string,_formDisabled:i.default.bool,_formPreview:i.default.bool,_formFullWidth:i.default.bool,_formLabelForErrorMessage:i.default.bool};var u,n=a;function b(e){(0,r.default)(this,b);var t,n,a=(0,o.default)(this,u.call(this,e));return a.onChange=function(e,t){a.props.onChange(a._formField.getValues(),{name:e,value:t,field:a._formField})},a._formField=null,!1!==e.field&&(t=(0,p.default)({},e.fieldOptions,{onChange:a.onChange}),e.field?(a._formField=e.field,n=a._formField.options.onChange,t.onChange=y.func.makeChain(n,a.onChange),a._formField.setOptions&&a._formField.setOptions(t)):("value"in e&&(t.values=e.value),a._formField=new l.default(a,t)),e.locale&&e.locale.Validate&&a._formField.setOptions({messages:e.locale.Validate}),e.saveField(a._formField)),a}n.displayName="Form",t.default=n,e.exports=t.default},function(e,t,n){"use strict";var a=n(87),m=(Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,a(n(160))),i=a(n(551)),r=a(n(162)),o=a(n(161)),b=a(n(163)),w=a(n(73)),l=a(n(352)),s=a(n(353)),g=a(n(557)),M=n(566),u={state:"",valueName:"value",trigger:"onChange",inputValues:[]},a=function(){function a(e){var t=this,n=1e.length)&&(t=e.length);for(var n=0,a=new Array(t);n=a.length)return n;var o=a[r],n=e(t&&t[o],n,a,r+1);return t?Array.isArray(t)?((a=[].concat(t))[o]=n,a):(0,s.default)({},t,(0,i.default)({},o,n)):((r=isNaN(o)?{}:[])[o]=n,r)};t=function(){};void 0!==e&&e.env,n.warning=t}.call(this,r(354))},function(e,t,n){"use strict";t.__esModule=!0,t.cloneAndAddKey=function(e){{var t;if(e&&(0,a.isValidElement)(e))return t=e.key||"error",(0,a.cloneElement)(e,{key:t})}return e},t.scrollToFirstError=function(e){var t=e.errorsGroup,n=e.options,a=e.instance;if(t&&n.scrollToFirstError){var r,o=void 0,i=void 0;for(r in t)if(t.hasOwnProperty(r)){var l=u.default.findDOMNode(a[r]);if(!l)return;var s=l.offsetTop;(void 0===i||s), use instead of.'),S.default.cloneElement(e,{className:t,size:c||C(r)})):(0,k.isValidElement)(e)?e:S.default.createElement("span",{className:a+"btn-helper"},e)}),t=d,_=(0,b.default)({},x.obj.pickOthers(Object.keys(L.propTypes),e),{type:o,disabled:p,onClick:h,className:(0,E.default)(n)});return"button"!==t&&(delete _.type,_.disabled&&(delete _.onClick,_.href&&delete _.href)),S.default.createElement(t,(0,b.default)({},_,{dir:g?"rtl":void 0,onMouseUp:this.onMouseUp,ref:this.buttonRefHandler}),l,u)},a=n=L,n.propTypes=(0,b.default)({},l.default.propTypes,{prefix:r.default.string,rtl:r.default.bool,type:r.default.oneOf(["primary","secondary","normal"]),size:r.default.oneOf(["small","medium","large"]),icons:r.default.shape({loading:r.default.node}),iconSize:r.default.oneOfType([r.default.oneOf(["xxs","xs","small","medium","large","xl","xxl","xxxl","inherit"]),r.default.number]),htmlType:r.default.oneOf(["submit","reset","button"]),component:r.default.oneOf(["button","a","div","span"]),loading:r.default.bool,ghost:r.default.oneOf([!0,!1,"light","dark"]),text:r.default.bool,warning:r.default.bool,disabled:r.default.bool,onClick:r.default.func,className:r.default.string,onMouseUp:r.default.func,children:r.default.node}),n.defaultProps={prefix:"next-",type:"normal",size:"medium",icons:{},htmlType:"button",component:"button",loading:!1,ghost:!1,text:!1,warning:!1,disabled:!1,onClick:function(){}};var u,l=a;function L(){var e,t;(0,o.default)(this,L);for(var n=arguments.length,a=Array(n),r=0;ra[r])return!0;if(n[r] 0, or `null`');if(W(i,"numericSeparator")&&"boolean"!=typeof i.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var t=i.numericSeparator;if(void 0===n)return"undefined";if(null===n)return"null";if("boolean"==typeof n)return n?"true":"false";if("string"==typeof n)return function e(t,n){if(t.length>n.maxStringLength)return a=t.length-n.maxStringLength,a="... "+a+" more character"+(1"}if(H(n)){if(0===n.length)return"[]";var v=$(n,h);return l&&!function(e){for(var t=0;t "+h(e,n))}),G("Map",_.call(n),u,l)):function(e){if(b&&e&&"object"==typeof e)try{b.call(e);try{_.call(e)}catch(e){return 1}return e instanceof Set}catch(e){}return}(n)?(d=[],X.call(n,function(e){d.push(h(e,n))}),G("Set",b.call(n),d,l)):function(e){if(w&&e&&"object"==typeof e)try{w.call(e,w);try{M.call(e,M)}catch(e){return 1}return e instanceof WeakMap}catch(e){}return}(n)?K("WeakMap"):function(e){if(M&&e&&"object"==typeof e)try{M.call(e,M);try{w.call(e,w)}catch(e){return 1}return e instanceof WeakSet}catch(e){}return}(n)?K("WeakSet"):function(e){if(k&&e&&"object"==typeof e)try{return k.call(e),1}catch(e){}return}(n)?K("WeakRef"):"[object Number]"!==V(c=n)||N&&"object"==typeof c&&N in c?function(e){if(e&&"object"==typeof e&&T)try{return T.call(e),1}catch(e){}return}(n)?U(h(T.call(n))):"[object Boolean]"!==V(t=n)||N&&"object"==typeof t&&N in t?"[object String]"!==V(e=n)||N&&"object"==typeof e&&N in e?("[object Date]"!==V(t=n)||N&&"object"==typeof t&&N in t)&&!F(n)?(e=$(n,h),t=j?j(n)===Object.prototype:n instanceof Object||n.constructor===Object,f=n instanceof Object?"":"null prototype",p=!t&&N&&Object(n)===n&&N in n?S.call(V(n),8,-1):f?"Object":"",t=(!t&&"function"==typeof n.constructor&&n.constructor.name?n.constructor.name+" ":"")+(p||f?"["+L.call(C.call([],p||[],f||[]),": ")+"] ":""),0===e.length?t+"{}":l?t+"{"+q(e,l)+"}":t+"{ "+L.call(e,", ")+" }"):String(n):U(h(String(n))):U(Q.call(n)):U(h(Number(n)))};var s=Object.prototype.hasOwnProperty||function(e){return e in this};function W(e,t){return s.call(e,t)}function V(e){return i.call(e)}function B(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,a=e.length;n, as child."),a.push(t),e.props.children&&(t.children=n(e.props.children)))}),a}(e.children):t},N.prototype.fetchInfoFromBinaryChildren=function(e){function r(e,t){return t=t||0,e.forEach(function(e){e.children?t=r(e.children,t):t+=1}),t}var a=!1,o=[],i=[],e=(function t(){var e=0r.tRight&&(e=r.tRight,r.changedPageX=r.tRight-r.startLeft),e-r.cellLefto.clientHeight,o.scrollWidth,o.clientWidth,o={},e||(o[r]=0,o[a]=0),+i&&(o.marginBottom=-i,o.paddingBottom=i,e&&(o[a]=i)),h.dom.setStyle(this.headerNode,o)),n&&!this.props.lockType&&this.headerNode&&(r=this.headerNode.querySelector("."+t+"table-header-fixer"),e=h.dom.getStyle(this.headerNode,"height"),a=h.dom.getStyle(this.headerNode,"paddingBottom"),h.dom.setStyle(r,{width:i,height:e-a}))},o.prototype.render=function(){var e=this.props,t=e.components,n=e.className,a=e.prefix,r=e.fixedHeader,o=e.lockType,i=e.dataSource,e=(e.maxBodyHeight,(0,u.default)(e,["components","className","prefix","fixedHeader","lockType","dataSource","maxBodyHeight"]));return r&&((t=(0,s.default)({},t)).Header||(t.Header=m.default),t.Body||(t.Body=g.default),t.Wrapper||(t.Wrapper=y.default),n=(0,p.default)(((r={})[a+"table-fixed"]=!0,r[a+"table-wrap-empty"]=!i.length,r[n]=n,r))),c.default.createElement(l,(0,s.default)({},e,{dataSource:i,lockType:o,components:t,className:n,prefix:a}))},o}(c.default.Component),n.FixedHeader=m.default,n.FixedBody=g.default,n.FixedWrapper=y.default,n.propTypes=(0,s.default)({hasHeader:r.default.bool,fixedHeader:r.default.bool,maxBodyHeight:r.default.oneOfType([r.default.number,r.default.string])},l.propTypes),n.defaultProps=(0,s.default)({},l.defaultProps,{hasHeader:!0,fixedHeader:!1,maxBodyHeight:200,components:{},refs:{},prefix:"next-"}),n.childContextTypes={fixedHeader:r.default.bool,getNode:r.default.func,onFixedScrollSync:r.default.func,getTableInstanceForFixed:r.default.func,maxBodyHeight:r.default.oneOfType([r.default.number,r.default.string])};var t,n=t;return n.displayName="FixedTable",(0,o.statics)(n,l),n};var c=l(n(0)),r=l(n(3)),f=n(23),p=l(n(13)),h=n(11),m=l(n(130)),g=l(n(390)),y=l(n(131)),o=n(67);function l(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var i=o(n(12)),f=o(n(2)),r=o(n(4)),l=o(n(6)),s=o(n(7)),u=(t.default=function(o){e=t=function(n){function a(e,t){(0,r.default)(this,a);var c=(0,l.default)(this,n.call(this,e,t));return c.addSelection=function(e){var t=c.props,n=t.prefix,a=t.rowSelection,t=t.size,a=a.columnProps&&a.columnProps()||{};e.find(function(e){return"selection"===e.key})||e.unshift((0,f.default)({key:"selection",title:c.renderSelectionHeader.bind(c),cell:c.renderSelectionBody.bind(c),width:"small"===t?34:50,className:n+"table-selection "+n+"table-prerow",__normalized:!0},a))},c.renderSelectionHeader=function(){var e=c.selectAllRow,t={},n=c.props,a=n.rowSelection,r=n.primaryKey,o=n.dataSource,i=n.entireDataSource,n=n.locale,l=c.state.selectedRowKeys,s=a.mode||"multiple",u=!!l.length,d=!1,i=(c.flatDataSource(i||o).filter(function(e,t){return!a.getProps||!(a.getProps(e,t)||{}).disabled}).map(function(e){return e[r]}).forEach(function(e){-1===l.indexOf(e)?u=!1:d=!0}),t.onClick=b(function(e){e.stopPropagation()},t.onClick),a.titleProps&&a.titleProps()||{});return u&&(d=!1),["multiple"===s?p.default.createElement(h.default,(0,f.default)({key:"_total",indeterminate:d,"aria-label":n.selectAll,checked:u,onChange:e},t,i)):null,a.titleAddons&&a.titleAddons()]},c.renderSelectionBody=function(e,t,n){var a=c.props,r=a.rowSelection,a=a.primaryKey,o=c.state.selectedRowKeys,i=r.mode||"multiple",o=-1s.length&&(u=o),w(u.filter(function(e){return-1=Math.max(a-y,0)&&oc.clientHeight;this.isLock()?(e=this.bodyLeftNode,t=this.bodyRightNode,n=this.getWrapperNode("right"),a=f?d:0,c=c.offsetHeight-d,f||(r[s]=0,r[u]=0),+d?(r.marginBottom=-d,r.paddingBottom=d):(r.marginBottom=-20,r.paddingBottom=20),c={"max-height":c},o||+d||(c[u]=0),+d&&(c[u]=-d),e&&g.dom.setStyle(e,c),t&&g.dom.setStyle(t,c),n&&+d&&g.dom.setStyle(n,i?"left":"right",a+"px")):(r.marginBottom=-d,r.paddingBottom=d,r[u]=0,f||(r[s]=0)),l&&g.dom.setStyle(l,r)},a.prototype.adjustHeaderSize=function(){var o=this;this.isLock()&&this.tableInc.groupChildren.forEach(function(e,t){var n=o.tableInc.groupChildren[t].length-1,n=o.getHeaderCellNode(t,n),a=o.getHeaderCellNode(t,0),r=o.getHeaderCellNode(t,0,"right"),t=o.getHeaderCellNode(t,0,"left");n&&r&&(n=n.offsetHeight,g.dom.setStyle(r,"height",n),setTimeout(function(){var e=o.tableRightInc.affixRef;return e&&e.getInstance()&&e.getInstance().updatePosition()})),a&&t&&(r=a.offsetHeight,g.dom.setStyle(t,"height",r),setTimeout(function(){var e=o.tableLeftInc.affixRef;return e&&e.getInstance()&&e.getInstance().updatePosition()}))})},a.prototype.adjustRowHeight=function(){var n=this;this.isLock()&&this.tableInc.props.dataSource.forEach(function(e,t){t=""+("object"===(void 0===e?"undefined":(0,r.default)(e))&&"__rowIndex"in e?e.__rowIndex:t)+(e.__expanded?"_expanded":"");n.setRowHeight(t,"left"),n.setRowHeight(t,"right")})},a.prototype.setRowHeight=function(e,t){var t=this.getRowNode(e,t),e=this.getRowNode(e),e=(M?e&&e.offsetHeight:e&&parseFloat(getComputedStyle(e).height))||"auto",n=(M?t&&t.offsetHeight:t&&parseFloat(getComputedStyle(t).height))||"auto";t&&e!==n&&g.dom.setStyle(t,"height",e)},a.prototype.getWrapperNode=function(e){e=e?e.charAt(0).toUpperCase()+e.substr(1):"";try{return(0,u.findDOMNode)(this["lock"+e+"El"])}catch(e){return null}},a.prototype.getRowNode=function(e,t){t=this["table"+(t=t?t.charAt(0).toUpperCase()+t.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(t.getRowRef(e))}catch(e){return null}},a.prototype.getHeaderCellNode=function(e,t,n){n=this["table"+(n=n?n.charAt(0).toUpperCase()+n.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(n.getHeaderCellRef(e,t))}catch(e){return null}},a.prototype.getCellNode=function(e,t,n){n=this["table"+(n=n?n.charAt(0).toUpperCase()+n.substr(1):"")+"Inc"];try{return(0,u.findDOMNode)(n.getCellRef(e,t))}catch(e){return null}},a.prototype.render=function(){var e,t=this.props,n=(t.children,t.columns,t.prefix),a=t.components,r=t.className,o=t.dataSource,i=t.tableWidth,t=(0,f.default)(t,["children","columns","prefix","components","className","dataSource","tableWidth"]),l=this.normalizeChildrenState(this.props),s=l.lockLeftChildren,u=l.lockRightChildren,l=l.children,d={left:this.getFlatenChildrenLength(s),right:this.getFlatenChildrenLength(u),origin:this.getFlatenChildrenLength(l)};return this._notNeedAdjustLockLeft&&(s=[]),this._notNeedAdjustLockRight&&(u=[]),this.lockLeftChildren=s,this.lockRightChildren=u,this.isOriginLock()?((a=(0,p.default)({},a)).Body=a.Body||v.default,a.Header=a.Header||_.default,a.Wrapper=a.Wrapper||b.default,a.Row=a.Row||y.default,r=(0,m.default)(((e={})[n+"table-lock"]=!0,e[n+"table-wrap-empty"]=!o.length,e[r]=r,e)),e=[h.default.createElement(c,(0,p.default)({},t,{dataSource:o,key:"lock-left",columns:s,className:n+"table-lock-left",lengths:d,prefix:n,lockType:"left",components:a,ref:this.saveLockLeftRef,loading:!1,"aria-hidden":!0})),h.default.createElement(c,(0,p.default)({},t,{dataSource:o,key:"lock-right",columns:u,className:n+"table-lock-right",lengths:d,prefix:n,lockType:"right",components:a,ref:this.saveLockRightRef,loading:!1,"aria-hidden":!0}))],h.default.createElement(c,(0,p.default)({},t,{tableWidth:i,dataSource:o,columns:l,prefix:n,lengths:d,wrapperContent:e,components:a,className:r}))):h.default.createElement(c,this.props)},a}(h.default.Component),t.LockRow=y.default,t.LockBody=v.default,t.LockHeader=_.default,t.propTypes=(0,p.default)({scrollToCol:a.default.number,scrollToRow:a.default.number},c.propTypes),t.defaultProps=(0,p.default)({},c.defaultProps),t.childContextTypes={getTableInstance:a.default.func,getLockNode:a.default.func,onLockBodyScroll:a.default.func,onRowMouseEnter:a.default.func,onRowMouseLeave:a.default.func};var e,t=e;return t.displayName="LockTable",(0,w.statics)(t,c),t},n(0)),h=c(s),u=n(23),a=c(n(3)),m=c(n(13)),d=c(n(172)),g=n(11),y=c(n(174)),v=c(n(391)),_=c(n(392)),b=c(n(131)),w=n(67);function c(e){return e&&e.__esModule?e:{default:e}}var M=g.env.ieVersion;function k(e){return function n(e){return e.map(function(e){var t=(0,p.default)({},e);return e.children&&(e.children=n(e.children)),t})}(e)}e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var s=l(n(12)),u=l(n(2)),r=l(n(4)),o=l(n(6)),i=l(n(7)),d=(t.default=function(l){e=t=function(n){function a(e,t){(0,r.default)(this,a);var d=(0,o.default)(this,n.call(this,e));return d.state={},d.updateOffsetArr=function(){var e=d.splitChildren||{},t=e.lockLeftChildren,n=e.lockRightChildren,e=e.originChildren,a=d.getFlatenChildren(t).length,r=d.getFlatenChildren(n).length,e=a+r+d.getFlatenChildren(e).length,a=0r.top-e.offset?(t?(s.position="absolute",s.top=a-(r.top-e.offset),u="relative"):(s.position="fixed",s.top=e.offset+n.top),d._setAffixStyle(s,!0),d._setContainerStyle(l)):e.bottom&&a![^\\|>]*)\\s+)?(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$"),R.prototype.PATTERN_FOLDED_SCALAR_END=new p("(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$"),R.prototype.PATTERN_SEQUENCE_ITEM=new p("^\\-((?\\s+)(?.+?))?\\s*$"),R.prototype.PATTERN_ANCHOR_VALUE=new p("^&(?[^ ]+) *(?.*)"),R.prototype.PATTERN_COMPACT_NOTATION=new p("^(?"+j.REGEX_QUOTED_STRING+"|[^ '\"\\{\\[].*?) *\\:(\\s+(?.+?))?\\s*$"),R.prototype.PATTERN_MAPPING_ITEM=new p("^(?"+j.REGEX_QUOTED_STRING+"|[^ '\"\\[\\{].*?) *\\:(\\s+(?.+?))?\\s*$"),R.prototype.PATTERN_DECIMAL=new p("\\d+"),R.prototype.PATTERN_INDENT_SPACES=new p("^ +"),R.prototype.PATTERN_TRAILING_LINES=new p("(\n*)$"),R.prototype.PATTERN_YAML_HEADER=new p("^\\%YAML[: ][\\d\\.]+.*\n","m"),R.prototype.PATTERN_LEADING_COMMENTS=new p("^(\\#.*?\n)+","m"),R.prototype.PATTERN_DOCUMENT_MARKER_START=new p("^\\-\\-\\-.*?\n","m"),R.prototype.PATTERN_DOCUMENT_MARKER_END=new p("^\\.\\.\\.\\s*$","m"),R.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION={},R.prototype.CONTEXT_NONE=0,R.prototype.CONTEXT_SEQUENCE=1,R.prototype.CONTEXT_MAPPING=2,R.prototype.parse=function(e,t,n){var a,r,o,i,l,s,u,d,c,f,p,h,m,g,y,v,_,b,w,M,k,S,E,x,C,L,T,D,O,N,P;for(null==t&&(t=!1),null==n&&(n=null),this.currentLineNb=-1,this.currentLine="",this.lines=this.cleanup(e).split("\n"),i=null,o=this.CONTEXT_NONE,r=!1;this.moveToNextLine();)if(!this.isCurrentLineEmpty()){if("\t"===this.currentLine[0])throw new Y("A YAML file cannot contain tabs as indentation.",this.getRealCurrentLineNb()+1,this.currentLine);if(d=k=!1,P=this.PATTERN_SEQUENCE_ITEM.exec(this.currentLine)){if(this.CONTEXT_MAPPING===o)throw new Y("You cannot define a sequence item when in a mapping");o=this.CONTEXT_SEQUENCE,null==i&&(i=[]),null!=P.value&&(M=this.PATTERN_ANCHOR_VALUE.exec(P.value))&&(d=M.ref,P.value=M.value),null==P.value||""===I.trim(P.value," ")||0===I.ltrim(P.value," ").indexOf("#")?this.currentLineNb=this.lines.length-1)&&(this.currentLine=this.lines[++this.currentLineNb],!0)},R.prototype.moveToPreviousLine=function(){this.currentLine=this.lines[--this.currentLineNb]},R.prototype.parseValue=function(t,e,n){var a,r,o,i;if(0===t.indexOf("*")){if(t=-1!==(r=t.indexOf("#"))?t.substr(1,r-2):t.slice(1),void 0===this.refs[t])throw new Y('Reference "'+t+'" does not exist.',this.currentLine);return this.refs[t]}if(r=this.PATTERN_FOLDED_SCALAR_ALL.exec(t))return i=null!=(i=r.modifiers)?i:"",o=Math.abs(parseInt(i)),isNaN(o)&&(o=0),i=this.parseFoldedScalar(r.separator,this.PATTERN_DECIMAL.replace(i,""),o),null!=r.type?(j.configure(e,n),j.parseScalar(r.type+" "+i)):i;if("["!==(o=t.charAt(0))&&"{"!==o&&'"'!==o&&"'"!==o)return this.isNextLineIndented()&&(t+="\n"+this.getNextEmbedBlock()),j.parse(t,e,n);for(;;)try{return j.parse(t,e,n)}catch(e){if(!((a=e)instanceof l&&this.moveToNextLine()))throw a.parsedLine=this.getRealCurrentLineNb()+1,a.snippet=this.currentLine,a;t+="\n"+I.trim(this.currentLine," ")}},R.prototype.parseFoldedScalar=function(e,t,n){var a,r,o,i,l,s,u,d,c,f;if(null==t&&(t=""),null==n&&(n=0),!(u=this.moveToNextLine()))return"";for(a=this.isCurrentLineBlank(),f="";u&&a;)(u=this.moveToNextLine())&&(f+="\n",a=this.isCurrentLineBlank());if(0<(n=0===n&&(l=this.PATTERN_INDENT_SPACES.exec(this.currentLine))?l[0].length:n))for(null==(d=this.PATTERN_FOLDED_SCALAR_BY_INDENTATION[n])&&(d=new p("^ {"+n+"}(.*)$"),R.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION[n]=d);u&&(a||(l=d.exec(this.currentLine)));)f+=a?this.currentLine.slice(n):l[1],(u=this.moveToNextLine())&&(f+="\n",a=this.isCurrentLineBlank());else u&&(f+="\n");if(u&&this.moveToPreviousLine(),">"===e){for(s="",r=0,o=(c=f.split("\n")).length;rn&&(e=!0),this.moveToPreviousLine(),e)},R.prototype.isCurrentLineEmpty=function(){var e=I.trim(this.currentLine," ");return 0===e.length||"#"===e.charAt(0)},R.prototype.isCurrentLineBlank=function(){return""===I.trim(this.currentLine," ")},R.prototype.isCurrentLineComment=function(){return"#"===I.ltrim(this.currentLine," ").charAt(0)},R.prototype.cleanup=function(e){var t,n,a,r,o,i,l,s,u,d,c;for(-1!==e.indexOf("\r")&&(e=e.split("\r\n").join("\n").split("\r").join("\n")),e=(u=this.PATTERN_YAML_HEADER.replaceAll(e,""))[0],u=u[1],this.offset+=u,c=(u=this.PATTERN_LEADING_COMMENTS.replaceAll(e,"",1))[0],1===u[1]&&(this.offset+=I.subStrCount(e,"\n")-I.subStrCount(c,"\n"),e=c),c=(u=this.PATTERN_DOCUMENT_MARKER_START.replaceAll(e,"",1))[0],1===u[1]&&(this.offset+=I.subStrCount(e,"\n")-I.subStrCount(c,"\n"),e=c,e=this.PATTERN_DOCUMENT_MARKER_END.replace(e,"")),d=-1,a=0,o=(s=e.split("\n")).length;a=!%@`]"),r.requiresDoubleQuoting=function(e){return this.PATTERN_CHARACTERS_TO_ESCAPE.test(e)},r.escapeWithDoubleQuotes=function(e){var t;return'"'+this.PATTERN_MAPPING_ESCAPEES.replace(e,(t=this,function(e){return t.MAPPING_ESCAPEES_TO_ESCAPED[e]}))+'"'},r.requiresSingleQuoting=function(e){return this.PATTERN_SINGLE_QUOTING.test(e)},r.escapeWithSingleQuotes=function(e){return"'"+e.replace(/'/g,"''")+"'"},e.exports=r},function(e,t){var i={}.hasOwnProperty,n=function(e){var t,n=o,a=e;for(t in a)i.call(a,t)&&(n[t]=a[t]);function r(){this.constructor=n}function o(e,t,n){this.message=e,this.parsedLine=t,this.snippet=n}return r.prototype=a.prototype,n.prototype=new r,n.__super__=a.prototype,o.prototype.toString=function(){return null!=this.parsedLine&&null!=this.snippet?" "+this.message+" (line "+this.parsedLine+": '"+this.snippet+"')":" "+this.message},o}(Error);e.exports=n},function(e,t,n){var f,p;function a(){}p=n(112),f=n(396),a.indentation=4,a.prototype.dump=function(e,t,n,a,r){var o,i,l,s,u,d,c;if(null==t&&(t=0),null==a&&(a=!1),null==r&&(r=null),s="",u=(n=null==n?0:n)?p.strRepeat(" ",n):"",t<=0||"object"!=typeof e||e instanceof Date||p.isEmpty(e))s+=u+f.dump(e,a,r);else if(e instanceof Array)for(o=0,l=e.length;ou&&!c&&(o=o.slice(0,u),e=C.default.createElement(m.default,{key:"_count",type:"primary",size:p,animation:!1},d(a,t))),0=D.KEYCODE.LEFT&&t<=D.KEYCODE.DOWN&&e.preventDefault(),e=void 0,t===D.KEYCODE.RIGHT||t===D.KEYCODE.DOWN?(e=o.getNextActiveKey(!0),o.handleTriggerEvent(o.props.triggerType,e)):t!==D.KEYCODE.LEFT&&t!==D.KEYCODE.UP||(e=o.getNextActiveKey(!1),o.handleTriggerEvent(o.props.triggerType,e)))},o.state={activeKey:o.getDefaultActiveKey(e)},o}l.displayName="Tab",t.default=(0,s.polyfill)(l),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var h=f(n(2)),a=f(n(4)),r=f(n(6)),o=f(n(7)),m=f(n(0)),i=n(23),l=f(n(3)),g=f(n(13)),s=f(n(24)),u=f(n(62)),d=f(n(51)),y=f(n(80)),v=n(11),c=n(402);function f(e){return e&&e.__esModule?e:{default:e}}var p,_={float:"right",zIndex:1},b={float:"left",zIndex:1},w={dropdown:"arrow-down",prev:"arrow-left",next:"arrow-right"},M=u.default.Popup,u=(p=m.default.Component,(0,o.default)(k,p),k.prototype.componentDidMount=function(){this.props.animation||this.initialSettings(),v.events.on(window,"resize",this.onWindowResized)},k.prototype.componentDidUpdate=function(e){var t=this;clearTimeout(this.scrollTimer),this.scrollTimer=setTimeout(function(){t.scrollToActiveTab()},410),clearTimeout(this.slideTimer),this.slideTimer=setTimeout(function(){t.setSlideBtn()},410),"dropdown"!==this.props.excessMode||(0,c.tabsArrayShallowEqual)(this.props.tabs,e.tabs)||this.getDropdownItems(this.props)},k.prototype.componentWillUnmount=function(){v.events.off(window,"resize",this.onWindowResized)},k.prototype.initialSettings=function(){this.setSlideBtn(),this.getDropdownItems(this.props)},k.prototype.setOffset=function(e){var t=!(1n&&(t.current=n),this.setState(t),this.props.onPageSizeChange(e)},I.prototype.renderPageTotal=function(){var e=this.props,t=e.prefix,n=e.total,e=e.totalRender,a=this.state,r=a.currentPageSize,a=a.current;return N.default.createElement("div",{className:t+"pagination-total"},e(n,[(a-1)*r+1,a*r]))},I.prototype.renderPageItem=function(e){var t=this.props,n=t.prefix,a=t.size,r=t.link,o=t.pageNumberRender,i=t.total,l=t.pageSize,t=t.locale,s=this.state.current,i=Y(i,l),l=parseInt(e,10)===s,a={size:a,className:(0,P.default)(((s={})[n+"pagination-item"]=!0,s[n+"current"]=l,s)),onClick:l?m:this.onPageItemClick.bind(this,e)};return r&&(a.component="a",a.href=r.replace("{page}",e)),N.default.createElement(c.default,(0,O.default)({"aria-label":j.str.template(t.total,{current:e,total:i})},a,{key:e}),o(e))},I.prototype.renderPageFirst=function(e){var t=this.props,n=t.prefix,a=t.size,r=t.shape,t=t.locale,a={disabled:e<=1,size:a,className:(0,P.default)(((a={})[n+"pagination-item"]=!0,a[n+"prev"]=!0,a)),onClick:this.onPageItemClick.bind(this,e-1)},n=N.default.createElement(d.default,{type:"arrow-left",className:n+"pagination-icon-prev"});return N.default.createElement(c.default,(0,O.default)({},a,{"aria-label":j.str.template(t.labelPrev,{current:e})}),n,"arrow-only"===r||"arrow-prev-only"===r||"no-border"===r?"":t.prev)},I.prototype.renderPageLast=function(e,t){var n=this.props,a=n.prefix,r=n.size,o=n.shape,n=n.locale,r={disabled:t<=e,size:r,className:(0,P.default)(((t={})[a+"pagination-item"]=!0,t[a+"next"]=!0,t)),onClick:this.onPageItemClick.bind(this,e+1)},t=N.default.createElement(d.default,{type:"arrow-right",className:a+"pagination-icon-next"});return N.default.createElement(c.default,(0,O.default)({},r,{"aria-label":j.str.template(n.labelNext,{current:e})}),"arrow-only"===o||"no-border"===o?"":n.next,t)},I.prototype.renderPageEllipsis=function(e){var t=this.props.prefix;return N.default.createElement(d.default,{className:t+"pagination-ellipsis "+t+"pagination-icon-ellipsis",type:"ellipsis",key:"ellipsis-"+e})},I.prototype.renderPageJump=function(){var t=this,e=this.props,n=e.prefix,a=e.size,e=e.locale,r=this.state.inputValue;return[N.default.createElement("span",{className:n+"pagination-jump-text"},e.goTo),N.default.createElement(f.default,{className:n+"pagination-jump-input",type:"text","aria-label":e.inputAriaLabel,size:a,value:r,onChange:this.onInputChange.bind(this),onKeyDown:function(e){e.keyCode===j.KEYCODE.ENTER&&t.handleJump(e)}}),N.default.createElement("span",{className:n+"pagination-jump-text"},e.page),N.default.createElement(c.default,{className:n+"pagination-jump-go",size:a,onClick:this.handleJump},e.go)]},I.prototype.renderPageDisplay=function(e,t){var n=this.props,a=n.prefix,n=n.pageNumberRender;return N.default.createElement("span",{className:a+"pagination-display"},N.default.createElement("em",null,n(e)),"/",n(t))},I.prototype.renderPageList=function(e,t){var n=this.props,a=n.prefix,n=n.pageShowCount,r=[];if(t<=n)for(var o=1;o<=t;o++)r.push(this.renderPageItem(o));else{var n=n-3,i=parseInt(n/2,10),l=void 0,s=void 0;r.push(this.renderPageItem(1)),s=e+i,(l=e-i)<=1&&(s=(l=2)+n),2=e.length&&-1=this.props.children.length?(this.update(this.props),this.changeSlide({message:"index",index:this.props.children.length-this.props.slidesToShow,currentSlide:this.state.currentSlide})):s.obj.shallowEqual(e,this.props)||this.update(this.props),this.adaptHeight()},p.prototype.componentWillUnmount=function(){this.animationEndCallback&&clearTimeout(this.animationEndCallback),s.events.off(window,"resize",this.onWindowResized),this.state.autoPlayTimer&&clearInterval(this.state.autoPlayTimer)},p.prototype.onWindowResized=function(){this.update(this.props),this.setState({animating:!1}),clearTimeout(this.animationEndCallback),delete this.animationEndCallback},p.prototype.slickGoTo=function(e){"number"==typeof e&&this.changeSlide({message:"index",index:e,currentSlide:this.state.currentSlide})},p.prototype.onEnterArrow=function(e){this.arrowHoverHandler(e)},p.prototype.onLeaveArrow=function(){this.arrowHoverHandler()},p.prototype._instanceRefHandler=function(e,t){this[e]=t},p.prototype.render=function(){var e=this.props,t=e.prefix,n=e.animation,a=e.arrows,r=e.arrowSize,o=e.arrowPosition,i=e.arrowDirection,l=e.dots,s=e.dotsClass,u=e.cssEase,d=e.speed,c=e.infinite,f=e.centerMode,p=e.centerPadding,h=e.lazyLoad,m=e.dotsDirection,g=e.rtl,y=e.slidesToShow,v=e.slidesToScroll,_=e.variableWidth,b=e.vertical,w=e.verticalSwiping,M=e.focusOnSelect,k=e.children,S=e.dotsRender,e=e.triggerType,E=this.state,x=E.currentSlide,C=E.lazyLoadedList,L=E.slideCount,T=E.slideWidth,D=E.slideHeight,O=E.trackStyle,N=E.listHeight,E=E.dragging,u={prefix:t,animation:n,cssEase:u,speed:d,infinite:c,centerMode:f,focusOnSelect:M?this.selectHandler:null,currentSlide:x,lazyLoad:h,lazyLoadedList:C,rtl:g,slideWidth:T,slideHeight:D,slidesToShow:y,slidesToScroll:v,slideCount:L,trackStyle:O,variableWidth:_,vertical:b,verticalSwiping:w,triggerType:e},d=void 0,h=(!0===l&&yt.startX?1:-1),!0===this.props.verticalSwiping&&(t.swipeLength=Math.round(Math.sqrt(Math.pow(t.curY-t.startY,2))),a=t.curY>t.startY?1:-1),r=this.state.currentSlide,l=Math.ceil(this.state.slideCount/this.props.slidesToScroll),o=this.swipeDirection(this.state.touchObject),i=t.swipeLength,!1===this.props.infinite&&(0===r&&"right"===o||l<=r+1&&"left"===o)&&(i=t.swipeLength*this.props.edgeFriction,!1===this.state.edgeDragged&&this.props.edgeEvent&&(this.props.edgeEvent(o),this.setState({edgeDragged:!0}))),!1===this.state.swiped&&this.props.swipeEvent&&(this.props.swipeEvent(o),this.setState({swiped:!0})),this.setState({touchObject:t,swipeLeft:l=n+i*a,trackStyle:(0,u.getTrackCSS)((0,s.default)({left:l},this.props,this.state))}),Math.abs(t.curX-t.startX)<.8*Math.abs(t.curY-t.startY)||4t[t.length-1])e=t[t.length-1];else for(var a in t){if(e-1*n.state.swipeLeft)return t=e,!1}else if(e.offsetLeft-a+(n.getWidth(e)||0)/2>-1*n.state.swipeLeft)return t=e,!1;return!0}),Math.abs(t.dataset.index-this.state.currentSlide)||1):this.props.slidesToScroll},swipeEnd:function(e){if(this.state.dragging){var t=this.state.touchObject,n=this.state.listWidth/this.props.touchThreshold,a=this.swipeDirection(t);if(this.props.verticalSwiping&&(n=this.state.listHeight/this.props.touchThreshold),this.setState({dragging:!1,edgeDragged:!1,swiped:!1,swipeLeft:null,touchObject:{}}),t.swipeLength)if(t.swipeLength>n){e.preventDefault();var r=void 0,o=void 0;switch(a){case"left":case"down":o=this.state.currentSlide+this.getSlideCount(),r=this.props.swipeToSlide?this.checkNavigable(o):o,this.setState({currentDirection:0});break;case"right":case"up":o=this.state.currentSlide-this.getSlideCount(),r=this.props.swipeToSlide?this.checkNavigable(o):o,this.setState({currentDirection:1});break;default:r=this.state.currentSlide}this.slideHandler(r)}else{t=(0,u.getTrackLeft)((0,s.default)({slideIndex:this.state.currentSlide,trackRef:this.track},this.props,this.state));this.setState({trackStyle:(0,u.getTrackAnimateCSS)((0,s.default)({left:t},this.props,this.state))})}}else this.props.swipe&&e.preventDefault()},onInnerSliderEnter:function(){this.props.autoplay&&this.props.pauseOnHover&&this.pause()},onInnerSliderLeave:function(){this.props.autoplay&&this.props.pauseOnHover&&this.autoPlay()}},e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var g=a(n(2)),d=a(n(0)),c=a(n(23)),y=n(405);function a(e){return e&&e.__esModule?e:{default:e}}t.default={initialize:function(t){var n=this,e=c.default.findDOMNode(this.list),a=d.default.Children.count(t.children),r=this.getWidth(e)||0,o=this.getWidth(c.default.findDOMNode(this.track))||0,i=void 0,e=(i=t.vertical?r:(r-(t.centerMode&&2*parseInt(t.centerPadding)))/t.slidesToShow,this.getHeight(e.querySelector('[data-index="0"]'))||0),l=e*t.slidesToShow,s=t.slidesToShow||1,u="activeIndex"in t?t.activeIndex:t.defaultActiveIndex,s=t.rtl?a-1-(s-1)-u:u;this.setState({slideCount:a,slideWidth:i,listWidth:r,trackWidth:o,currentSlide:s,slideHeight:e,listHeight:l},function(){var e=(0,y.getTrackLeft)((0,g.default)({slideIndex:n.state.currentSlide,trackRef:n.track},t,n.state)),e=(0,y.getTrackCSS)((0,g.default)({left:e},t,n.state));n.setState({trackStyle:e}),n.autoPlay()})},update:function(e){this.initialize(e)},getWidth:function(e){return"clientWidth"in e?e.clientWidth:e&&e.getBoundingClientRect().width},getHeight:function(e){return"clientHeight"in e?e.clientHeight:e&&e.getBoundingClientRect().height},adaptHeight:function(){var e,t;this.props.adaptiveHeight&&(t='[data-index="'+this.state.currentSlide+'"]',this.list&&(t=(e=c.default.findDOMNode(this.list)).querySelector(t).offsetHeight,e.style.height=t+"px"))},canGoNext:function(e){var t=!0;return e.infinite||(e.centerMode?e.currentSlide>=e.slideCount-1&&(t=!1):(e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1)),t},slideHandler:function(e){var t=this,n=this.props.rtl,a=void 0,r=void 0,o=void 0;if(!this.props.waitForAnimate||!this.state.animating){if("fade"===this.props.animation)return r=this.state.currentSlide,!1===this.props.infinite&&(e<0||e>=this.state.slideCount)?void 0:(a=e<0?e+this.state.slideCount:e>=this.state.slideCount?e-this.state.slideCount:e,this.props.lazyLoad&&this.state.lazyLoadedList.indexOf(a)<0&&this.setState({lazyLoadedList:this.state.lazyLoadedList.concat(a)}),o=function(){t.setState({animating:!1}),t.props.onChange(a),delete t.animationEndCallback},this.props.onBeforeChange(this.state.currentSlide,a),this.setState({animating:!0,currentSlide:a},function(){this.animationEndCallback=setTimeout(o,this.props.speed+20)}),void this.autoPlay());a=e,n?a<0?!1===this.props.infinite?r=0:this.state.slideCount%this.props.slidesToScroll!=0?a+this.props.slidesToScroll<=0?(r=this.state.slideCount+a,a=this.state.slideCount-this.props.slidesToScroll):r=a=0:r=this.state.slideCount+a:r=a>=this.state.slideCount?!1===this.props.infinite?this.state.slideCount-this.props.slidesToShow:this.state.slideCount%this.props.slidesToScroll!=0?0:a-this.state.slideCount:a:r=a<0?!1===this.props.infinite?0:this.state.slideCount%this.props.slidesToScroll!=0?this.state.slideCount-this.state.slideCount%this.props.slidesToScroll:this.state.slideCount+a:a>=this.state.slideCount?!1===this.props.infinite?this.state.slideCount-this.props.slidesToShow:this.state.slideCount%this.props.slidesToScroll!=0?0:a-this.state.slideCount:a;var i,e=(0,y.getTrackLeft)((0,g.default)({slideIndex:a,trackRef:this.track},this.props,this.state)),l=(0,y.getTrackLeft)((0,g.default)({slideIndex:r,trackRef:this.track},this.props,this.state));if(!1===this.props.infinite&&(e=l),this.props.lazyLoad){for(var s=!0,u=[],d=this.state.slideCount,c=a<0?d+a:r,f=c;f=s.activeIndex?"visible":"hidden",d.transition="opacity "+s.speed+"ms "+s.cssEase,d.WebkitTransition="opacity "+s.speed+"ms "+s.cssEase,s.vertical?d.top=-s.activeIndex*s.slideHeight:d.left=-s.activeIndex*s.slideWidth),s.vertical&&(d.width="100%"),d),u=(d=(0,v.default)({activeIndex:e},c),a=d.prefix,u=r=i=void 0,o=(u=d.rtl?d.slideCount-1-d.activeIndex:d.activeIndex)<0||u>=d.slideCount,d.centerMode?(n=Math.floor(d.slidesToShow/2),r=(u-d.currentSlide)%d.slideCount==0,u>d.currentSlide-n-1&&u<=d.currentSlide+n&&(i=!0)):i=d.currentSlide<=u&&u=u,u=(0,k.default)(((v={})[o+"upload-list-item"]=!0,v[o+"hidden"]=u,v)),v=this.props.children||i.card.addPhoto,c=r?S.func.prevent:c,_=S.obj.pickOthers(C.propTypes,this.props),b=S.obj.pickOthers(E.default.propTypes,_);if(h&&"function"==typeof m)return e=(0,k.default)(((e={})[o+"form-preview"]=!0,e[l]=!!l,e)),M.default.createElement("div",{style:s,className:e},m(this.state.value,this.props));return M.default.createElement(E.default,(0,w.default)({className:l,style:s,listType:"card",closable:!0,locale:i,value:this.state.value,onRemove:c,onCancel:f,onPreview:d,itemRender:g,isPreview:h,uploader:this.uploaderRef,reUpload:y,showDownload:n},_),M.default.createElement(x.default,(0,w.default)({},b,{shape:"card",prefix:o,disabled:r,action:a,timeout:p,isPreview:h,value:this.state.value,onProgress:this.onProgress,onChange:this.onChange,ref:function(e){return t.saveRef(e)},className:u}),v))},d=n=C,n.displayName="Card",n.propTypes={prefix:l.default.string,locale:l.default.object,children:l.default.object,value:l.default.oneOfType([l.default.array,l.default.object]),defaultValue:l.default.oneOfType([l.default.array,l.default.object]),onPreview:l.default.func,onChange:l.default.func,onRemove:l.default.func,onCancel:l.default.func,itemRender:l.default.func,reUpload:l.default.bool,showDownload:l.default.bool,onProgress:l.default.func,isPreview:l.default.bool,renderPreview:l.default.func},n.defaultProps={prefix:"next-",locale:u.default.Upload,showDownload:!0,onChange:S.func.noop,onPreview:S.func.noop,onProgress:S.func.noop},a=function(){var n=this;this.onProgress=function(e,t){n.setState({value:e}),n.props.onProgress(e,t)},this.onChange=function(e,t){"value"in n.props||n.setState({value:e}),n.props.onChange(e,t)}};var f,i=d;function C(e){(0,r.default)(this,C);var t=(0,o.default)(this,f.call(this,e)),n=(a.call(t),void 0),n="value"in e?e.value:e.defaultValue;return t.state={value:Array.isArray(n)?n:[],uploaderRef:t.uploaderRef},t}t.default=(0,s.polyfill)(i),e.exports=t.default},function(e,t,n){"use strict";t.__esModule=!0;var u=m(n(2)),d=m(n(12)),o=m(n(4)),i=m(n(6)),a=m(n(7)),c=m(n(0)),r=m(n(3)),f=m(n(13)),p=m(n(24)),l=n(11),s=m(n(44)),h=m(n(180));function m(e){return e&&e.__esModule?e:{default:e}}g=c.default.Component,(0,a.default)(y,g),y.prototype.abort=function(e){this.uploaderRef.abort(e)},y.prototype.startUpload=function(){this.uploaderRef.startUpload()},y.prototype.render=function(){var e=this.props,t=e.className,n=e.style,a=e.shape,r=e.locale,o=e.prefix,i=e.listType,e=(0,d.default)(e,["className","style","shape","locale","prefix","listType"]),l=o+"upload-drag",t=(0,f.default)(((s={})[l]=!0,s[l+"-over"]=this.state.dragOver,s[t]=!!t,s)),s=this.props.children||c.default.createElement("div",{className:t},c.default.createElement("p",{className:l+"-icon"},c.default.createElement(p.default,{size:"large",className:l+"-upload-icon"})),c.default.createElement("p",{className:l+"-text"},r.drag.text),c.default.createElement("p",{className:l+"-hint"},r.drag.hint));return c.default.createElement(h.default,(0,u.default)({},e,{prefix:o,shape:a,listType:i,dragable:!0,style:n,onDragOver:this.onDragOver,onDragLeave:this.onDragLeave,onDrop:this.onDrop,ref:this.saveUploaderRef}),s)},a=n=y,n.propTypes={prefix:r.default.string,locale:r.default.object,shape:r.default.string,onDragOver:r.default.func,onDragLeave:r.default.func,onDrop:r.default.func,limit:r.default.number,className:r.default.string,style:r.default.object,defaultValue:r.default.array,children:r.default.node,listType:r.default.string,timeout:r.default.number},n.defaultProps={prefix:"next-",onDragOver:l.func.noop,onDragLeave:l.func.noop,onDrop:l.func.noop,locale:s.default.Upload};var g,r=a;function y(){var e,t;(0,o.default)(this,y);for(var n=arguments.length,a=Array(n),r=0;r Date: Wed, 21 Jun 2023 09:56:23 +0800 Subject: [PATCH 106/238] =?UTF-8?q?:art:=20Improving=20structure=20/=20for?= =?UTF-8?q?mat=20of=20the=20code.=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/PigSecurityInnerAspect.java | 8 - .../console/controller/HealthController.java | 143 ++++++------ .../controller/NamespaceController.java | 204 +++++++++-------- .../controller/ServerStateController.java | 52 ++--- .../controller/v2/NamespaceControllerV2.java | 188 ++++++++-------- .../console/enums/NamespaceTypeEnum.java | 82 +++---- .../exception/ConsoleExceptionHandler.java | 49 ++-- .../exception/NacosApiExceptionHandler.java | 159 ++++++------- .../nacos/console/filter/XssFilter.java | 26 ++- .../nacos/console/model/Namespace.java | 180 +++++++-------- .../nacos/console/model/NamespaceAllInfo.java | 12 +- .../console/model/form/NamespaceForm.java | 160 +++++++------- .../service/NamespaceOperationService.java | 209 +++++++++--------- 13 files changed, 734 insertions(+), 738 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java index 6d55f61e..0b449291 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java @@ -16,7 +16,6 @@ package com.pig4cloud.pig.common.security.component; -import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.annotation.Inner; import lombok.RequiredArgsConstructor; @@ -26,7 +25,6 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.Ordered; -import org.springframework.core.annotation.AnnotationUtils; import org.springframework.security.access.AccessDeniedException; import javax.servlet.http.HttpServletRequest; @@ -47,12 +45,6 @@ public class PigSecurityInnerAspect implements Ordered { @SneakyThrows @Around("@within(inner) || @annotation(inner)") public Object around(ProceedingJoinPoint point, Inner inner) { - // 实际注入的inner实体由表达式后一个注解决定,即是方法上的@Inner注解实体,若方法上无@Inner注解,则获取类上的 - // 这段代码没有意义,拦截的就是@Inner注解,怎么会为null呢 - // if (inner == null) { - // Class clazz = point.getTarget().getClass(); - // inner = AnnotationUtils.findAnnotation(clazz, Inner.class); - // } String header = request.getHeader(SecurityConstants.FROM); if (inner.value() && !SecurityConstants.FROM_IN.equals(header)) { log.warn("访问接口 {} 没有权限", point.getSignature().getName()); diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java index f5b0e981..2b088165 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java @@ -37,74 +37,77 @@ import javax.servlet.http.HttpServletRequest; @RestController("consoleHealth") @RequestMapping("/v1/console/health") public class HealthController { - - private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class); - - private final ConfigInfoPersistService configInfoPersistService; - - private final OperatorController apiCommands; - - @Autowired - public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) { - this.configInfoPersistService = configInfoPersistService; - this.apiCommands = apiCommands; - } - - /** - * Whether the Nacos is in broken states or not, and cannot recover except by being restarted. - * - * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code equal to 500 indicates that - * Nacos is in broken states. - */ - @GetMapping("/liveness") - public ResponseEntity liveness() { - return ResponseEntity.ok().body("OK"); - } - - /** - * Ready to receive the request or not. - * - * @return HTTP code equal to 200 indicates that Nacos is ready. HTTP code equal to 500 indicates that Nacos is not - * ready. - */ - @GetMapping("/readiness") - public ResponseEntity readiness(HttpServletRequest request) { - boolean isConfigReadiness = isConfigReadiness(); - boolean isNamingReadiness = isNamingReadiness(request); - - if (isConfigReadiness && isNamingReadiness) { - return ResponseEntity.ok().body("OK"); - } - - if (!isConfigReadiness && !isNamingReadiness) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config and Naming are not in readiness"); - } - - if (!isConfigReadiness) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config is not in readiness"); - } - - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Naming is not in readiness"); - } - - private boolean isConfigReadiness() { - // check db - try { - configInfoPersistService.configInfoCount(""); - return true; - } catch (Exception e) { - LOGGER.error("Config health check fail.", e); - } - return false; - } - - private boolean isNamingReadiness(HttpServletRequest request) { - try { - apiCommands.metrics(request); - return true; - } catch (Exception e) { - LOGGER.error("Naming health check fail.", e); - } - return false; - } + + private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class); + + private final ConfigInfoPersistService configInfoPersistService; + + private final OperatorController apiCommands; + + @Autowired + public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) { + this.configInfoPersistService = configInfoPersistService; + this.apiCommands = apiCommands; + } + + /** + * Whether the Nacos is in broken states or not, and cannot recover except by being + * restarted. + * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code + * equal to 500 indicates that Nacos is in broken states. + */ + @GetMapping("/liveness") + public ResponseEntity liveness() { + return ResponseEntity.ok().body("OK"); + } + + /** + * Ready to receive the request or not. + * @return HTTP code equal to 200 indicates that Nacos is ready. HTTP code equal to + * 500 indicates that Nacos is not ready. + */ + @GetMapping("/readiness") + public ResponseEntity readiness(HttpServletRequest request) { + boolean isConfigReadiness = isConfigReadiness(); + boolean isNamingReadiness = isNamingReadiness(request); + + if (isConfigReadiness && isNamingReadiness) { + return ResponseEntity.ok().body("OK"); + } + + if (!isConfigReadiness && !isNamingReadiness) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Config and Naming are not in readiness"); + } + + if (!isConfigReadiness) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config is not in readiness"); + } + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Naming is not in readiness"); + } + + private boolean isConfigReadiness() { + // check db + try { + configInfoPersistService.configInfoCount(""); + return true; + } + catch (Exception e) { + LOGGER.error("Config health check fail.", e); + } + return false; + } + + private boolean isNamingReadiness(HttpServletRequest request) { + try { + apiCommands.metrics(request); + return true; + } + catch (Exception e) { + LOGGER.error("Naming health check fail.", e); + } + return false; + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java index ffe1e31d..32d93ea2 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java @@ -48,108 +48,104 @@ import java.util.regex.Pattern; @RestController @RequestMapping("/v1/console/namespaces") public class NamespaceController { - - @Autowired - private CommonPersistService commonPersistService; - - @Autowired - private NamespaceOperationService namespaceOperationService; - - private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); - - private static final int NAMESPACE_ID_MAX_LENGTH = 128; - - /** - * Get namespace list. - * - * @return namespace list - */ - @GetMapping - public RestResult> getNamespaces() { - return RestResultUtils.success(namespaceOperationService.getNamespaceList()); - } - - /** - * get namespace all info by namespace id. - * - * @param namespaceId namespaceId - * @return namespace all info - */ - @GetMapping(params = "show=all") - public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException { - return namespaceOperationService.getNamespace(namespaceId); - } - - /** - * create namespace. - * - * @param namespaceName namespace Name - * @param namespaceDesc namespace Desc - * @return whether create ok - */ - @PostMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) - public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId, - @RequestParam("namespaceName") String namespaceName, - @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { - if (StringUtils.isBlank(namespaceId)) { - namespaceId = UUID.randomUUID().toString(); - } else { - namespaceId = namespaceId.trim(); - if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { - return false; - } - if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { - return false; - } - } - try { - return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc); - } catch (NacosException e) { - return false; - } - } - - /** - * check namespaceId exist. - * - * @param namespaceId namespace id - * @return true if exist, otherwise false - */ - @GetMapping(params = "checkNamespaceIdExist=true") - public Boolean checkNamespaceIdExist(@RequestParam("customNamespaceId") String namespaceId) { - if (StringUtils.isBlank(namespaceId)) { - return false; - } - return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0); - } - - /** - * edit namespace. - * - * @param namespace namespace - * @param namespaceShowName namespace ShowName - * @param namespaceDesc namespace Desc - * @return whether edit ok - */ - @PutMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) - public Boolean editNamespace(@RequestParam("namespace") String namespace, - @RequestParam("namespaceShowName") String namespaceShowName, - @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { - return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc); - } - - /** - * del namespace by id. - * - * @param namespaceId namespace Id - * @return whether del ok - */ - @DeleteMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) - public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) { - return namespaceOperationService.removeNamespace(namespaceId); - } - + + @Autowired + private CommonPersistService commonPersistService; + + @Autowired + private NamespaceOperationService namespaceOperationService; + + private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); + + private static final int NAMESPACE_ID_MAX_LENGTH = 128; + + /** + * Get namespace list. + * @return namespace list + */ + @GetMapping + public RestResult> getNamespaces() { + return RestResultUtils.success(namespaceOperationService.getNamespaceList()); + } + + /** + * get namespace all info by namespace id. + * @param namespaceId namespaceId + * @return namespace all info + */ + @GetMapping(params = "show=all") + public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException { + return namespaceOperationService.getNamespace(namespaceId); + } + + /** + * create namespace. + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + */ + @PostMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId, + @RequestParam("namespaceName") String namespaceName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { + if (StringUtils.isBlank(namespaceId)) { + namespaceId = UUID.randomUUID().toString(); + } + else { + namespaceId = namespaceId.trim(); + if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { + return false; + } + if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { + return false; + } + } + try { + return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc); + } + catch (NacosException e) { + return false; + } + } + + /** + * check namespaceId exist. + * @param namespaceId namespace id + * @return true if exist, otherwise false + */ + @GetMapping(params = "checkNamespaceIdExist=true") + public Boolean checkNamespaceIdExist(@RequestParam("customNamespaceId") String namespaceId) { + if (StringUtils.isBlank(namespaceId)) { + return false; + } + return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0); + } + + /** + * edit namespace. + * @param namespace namespace + * @param namespaceShowName namespace ShowName + * @param namespaceDesc namespace Desc + * @return whether edit ok + */ + @PutMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean editNamespace(@RequestParam("namespace") String namespace, + @RequestParam("namespaceShowName") String namespaceShowName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { + return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc); + } + + /** + * del namespace by id. + * @param namespaceId namespace Id + * @return whether del ok + */ + @DeleteMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) { + return namespaceOperationService.removeNamespace(namespaceId); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java index 75056bf0..8eac3c71 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java @@ -39,30 +39,30 @@ import java.util.Map; @RestController @RequestMapping("/v1/console/server") public class ServerStateController { - - private static final String ANNOUNCEMENT_FILE = "announcement.conf"; - - /** - * Get server state of current server. - * - * @return state json. - */ - @GetMapping("/state") - public ResponseEntity> serverState() { - Map serverState = new HashMap<>(4); - for (ModuleState each : ModuleStateHolder.getInstance().getAllModuleStates()) { - each.getStates().forEach((s, o) -> serverState.put(s, null == o ? null : o.toString())); - } - return ResponseEntity.ok().body(serverState); - } - - @GetMapping("/announcement") - public RestResult getAnnouncement() { - File announcementFile = new File(EnvUtil.getConfPath(), ANNOUNCEMENT_FILE); - String announcement = null; - if (announcementFile.exists() && announcementFile.isFile()) { - announcement = DiskUtils.readFile(announcementFile); - } - return RestResultUtils.success(announcement); - } + + private static final String ANNOUNCEMENT_FILE = "announcement.conf"; + + /** + * Get server state of current server. + * @return state json. + */ + @GetMapping("/state") + public ResponseEntity> serverState() { + Map serverState = new HashMap<>(4); + for (ModuleState each : ModuleStateHolder.getInstance().getAllModuleStates()) { + each.getStates().forEach((s, o) -> serverState.put(s, null == o ? null : o.toString())); + } + return ResponseEntity.ok().body(serverState); + } + + @GetMapping("/announcement") + public RestResult getAnnouncement() { + File announcementFile = new File(EnvUtil.getConfPath(), ANNOUNCEMENT_FILE); + String announcement = null; + if (announcementFile.exists() && announcementFile.isFile()) { + announcement = DiskUtils.readFile(announcementFile); + } + return RestResultUtils.success(announcement); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java index c01325d5..6827582f 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java @@ -53,100 +53,96 @@ import java.util.regex.Pattern; @RestController @RequestMapping("/v2/console/namespace") public class NamespaceControllerV2 { - - private final NamespaceOperationService namespaceOperationService; - - public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) { - this.namespaceOperationService = namespaceOperationService; - } - - private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); - - private static final int NAMESPACE_ID_MAX_LENGTH = 128; - - /** - * Get namespace list. - * - * @return namespace list - */ - @GetMapping("/list") - public Result> getNamespaceList() { - return Result.success(namespaceOperationService.getNamespaceList()); - } - - /** - * get namespace all info by namespace id. - * - * @param namespaceId namespaceId - * @return namespace all info - */ - @GetMapping() - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX - + "namespaces", action = ActionTypes.READ, signType = SignType.CONSOLE) - public Result getNamespace(@RequestParam("namespaceId") String namespaceId) - throws NacosException { - return Result.success(namespaceOperationService.getNamespace(namespaceId)); - } - - /** - * create namespace. - * - * @param namespaceForm namespaceForm. - * @return whether create ok - */ - @PostMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX - + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) - public Result createNamespace(NamespaceForm namespaceForm) throws NacosException { - - namespaceForm.validate(); - - String namespaceId = namespaceForm.getNamespaceId(); - String namespaceName = namespaceForm.getNamespaceName(); - String namespaceDesc = namespaceForm.getNamespaceDesc(); - - if (StringUtils.isBlank(namespaceId)) { - namespaceId = UUID.randomUUID().toString(); - } else { - namespaceId = namespaceId.trim(); - if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, - "namespaceId [" + namespaceId + "] mismatch the pattern"); - } - if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, - "too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH); - } - } - return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc)); - } - - /** - * edit namespace. - * - * @param namespaceForm namespace params - * @return whether edit ok - */ - @PutMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX - + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) - public Result editNamespace(NamespaceForm namespaceForm) throws NacosException { - namespaceForm.validate(); - return Result.success(namespaceOperationService - .editNamespace(namespaceForm.getNamespaceId(), namespaceForm.getNamespaceName(), - namespaceForm.getNamespaceDesc())); - } - - /** - * delete namespace by id. - * - * @param namespaceId namespace ID - * @return whether delete ok - */ - @DeleteMapping - @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX - + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) - public Result deleteNamespace(@RequestParam("namespaceId") String namespaceId) { - return Result.success(namespaceOperationService.removeNamespace(namespaceId)); - } + + private final NamespaceOperationService namespaceOperationService; + + public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) { + this.namespaceOperationService = namespaceOperationService; + } + + private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); + + private static final int NAMESPACE_ID_MAX_LENGTH = 128; + + /** + * Get namespace list. + * @return namespace list + */ + @GetMapping("/list") + public Result> getNamespaceList() { + return Result.success(namespaceOperationService.getNamespaceList()); + } + + /** + * get namespace all info by namespace id. + * @param namespaceId namespaceId + * @return namespace all info + */ + @GetMapping() + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.READ, + signType = SignType.CONSOLE) + public Result getNamespace(@RequestParam("namespaceId") String namespaceId) + throws NacosException { + return Result.success(namespaceOperationService.getNamespace(namespaceId)); + } + + /** + * create namespace. + * @param namespaceForm namespaceForm. + * @return whether create ok + */ + @PostMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE, + signType = SignType.CONSOLE) + public Result createNamespace(NamespaceForm namespaceForm) throws NacosException { + + namespaceForm.validate(); + + String namespaceId = namespaceForm.getNamespaceId(); + String namespaceName = namespaceForm.getNamespaceName(); + String namespaceDesc = namespaceForm.getNamespaceDesc(); + + if (StringUtils.isBlank(namespaceId)) { + namespaceId = UUID.randomUUID().toString(); + } + else { + namespaceId = namespaceId.trim(); + if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, + "namespaceId [" + namespaceId + "] mismatch the pattern"); + } + if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, + "too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH); + } + } + return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc)); + } + + /** + * edit namespace. + * @param namespaceForm namespace params + * @return whether edit ok + */ + @PutMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE, + signType = SignType.CONSOLE) + public Result editNamespace(NamespaceForm namespaceForm) throws NacosException { + namespaceForm.validate(); + return Result.success(namespaceOperationService.editNamespace(namespaceForm.getNamespaceId(), + namespaceForm.getNamespaceName(), namespaceForm.getNamespaceDesc())); + } + + /** + * delete namespace by id. + * @param namespaceId namespace ID + * @return whether delete ok + */ + @DeleteMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE, + signType = SignType.CONSOLE) + public Result deleteNamespace(@RequestParam("namespaceId") String namespaceId) { + return Result.success(namespaceOperationService.removeNamespace(namespaceId)); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java b/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java index 8674ce8a..c1c67b5c 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java @@ -17,50 +17,50 @@ package com.alibaba.nacos.console.enums; /** - * the enum of namespace. - * 0 : Global configuration, 1 : Default private namespace ,2 : Custom namespace. + * the enum of namespace. 0 : Global configuration, 1 : Default private namespace ,2 : + * Custom namespace. * * @author chenglu * @date 2021-05-25 17:01 */ public enum NamespaceTypeEnum { - - /** - * Global configuration. - */ - GLOBAL(0, "Global configuration"), - - /** - * Default private namespace. - */ - PRIVATE(1, "Default private namespace"), - - /** - * Custom namespace. - */ - CUSTOM(2, "Custom namespace"); - - /** - * the namespace type. - */ - private final int type; - - /** - * the description. - */ - private final String description; - - NamespaceTypeEnum(int type, String description) { - this.type = type; - this.description = description; - } - - public int getType() { - return type; - } - - public String getDescription() { - return description; - } -} + /** + * Global configuration. + */ + GLOBAL(0, "Global configuration"), + + /** + * Default private namespace. + */ + PRIVATE(1, "Default private namespace"), + + /** + * Custom namespace. + */ + CUSTOM(2, "Custom namespace"); + + /** + * the namespace type. + */ + private final int type; + + /** + * the description. + */ + private final String description; + + NamespaceTypeEnum(int type, String description) { + this.type = type; + this.description = description; + } + + public int getType() { + return type; + } + + public String getDescription() { + return description; + } + +} diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java index b7c7fcdb..8b0d6fbd 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java @@ -37,28 +37,29 @@ import javax.servlet.http.HttpServletRequest; */ @ControllerAdvice public class ConsoleExceptionHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class); - - @ExceptionHandler(AccessException.class) - private ResponseEntity handleAccessException(AccessException e) { - LOGGER.error("got exception. {}", e.getErrMsg()); - return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg()); - } - - @ExceptionHandler(IllegalArgumentException.class) - private ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e)); - } - - @ExceptionHandler(Exception.class) - private ResponseEntity handleException(HttpServletRequest request, Exception e) { - String uri = request.getRequestURI(); - LOGGER.error("CONSOLE {}", uri, e); - if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); - } - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); - } + + private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class); + + @ExceptionHandler(AccessException.class) + private ResponseEntity handleAccessException(AccessException e) { + LOGGER.error("got exception. {}", e.getErrMsg()); + return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg()); + } + + @ExceptionHandler(IllegalArgumentException.class) + private ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e)); + } + + @ExceptionHandler(Exception.class) + private ResponseEntity handleException(HttpServletRequest request, Exception e) { + String uri = request.getRequestURI(); + LOGGER.error("CONSOLE {}", uri, e); + if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); + } + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java index df0c1f02..c704dd0f 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java @@ -43,89 +43,92 @@ import java.io.IOException; /** * Exception Handler for Nacos API. + * * @author dongyafei * @date 2022/7/22 */ @Order(-1) -@ControllerAdvice(annotations = {NacosApi.class}) +@ControllerAdvice(annotations = { NacosApi.class }) @ResponseBody public class NacosApiExceptionHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class); - - @ExceptionHandler(NacosApiException.class) - public ResponseEntity> handleNacosApiException(NacosApiException e) { - LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); - return ResponseEntity.status(e.getErrCode()).body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); - } - - @ExceptionHandler(NacosException.class) - public ResponseEntity> handleNacosException(NacosException e) { - LOGGER.error("got exception. {}", e.getErrMsg()); - return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg())); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMessageNotReadableException.class) - public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMessageConversionException.class) - public Result handleHttpMessageConversionException(HttpMessageConversionException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(NumberFormatException.class) - public Result handleNumberFormatException(NumberFormatException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(IllegalArgumentException.class) - public Result handleIllegalArgumentException(IllegalArgumentException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(MissingServletRequestParameterException.class) - public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMediaTypeException.class) - public Result handleHttpMediaTypeException(HttpMediaTypeException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.FORBIDDEN) - @ExceptionHandler(AccessException.class) - public Result handleAccessException(AccessException e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg()); - } - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(value = {DataAccessException.class, ServletException.class, IOException.class}) - public Result handleDataAccessException(Exception e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage()); - } - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(Exception.class) - public Result handleOtherException(Exception e) { - LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); - return Result.failure(e.getMessage()); - } + + private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class); + + @ExceptionHandler(NacosApiException.class) + public ResponseEntity> handleNacosApiException(NacosApiException e) { + LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); + return ResponseEntity.status(e.getErrCode()) + .body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); + } + + @ExceptionHandler(NacosException.class) + public ResponseEntity> handleNacosException(NacosException e) { + LOGGER.error("got exception. {}", e.getErrMsg()); + return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException.class) + public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageConversionException.class) + public Result handleHttpMessageConversionException(HttpMessageConversionException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(NumberFormatException.class) + public Result handleNumberFormatException(NumberFormatException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(IllegalArgumentException.class) + public Result handleIllegalArgumentException(IllegalArgumentException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMediaTypeException.class) + public Result handleHttpMediaTypeException(HttpMediaTypeException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(AccessException.class) + public Result handleAccessException(AccessException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg()); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(value = { DataAccessException.class, ServletException.class, IOException.class }) + public Result handleDataAccessException(Exception e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + public Result handleOtherException(Exception e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(e.getMessage()); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java b/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java index 192a609a..7764ec8a 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java @@ -26,19 +26,21 @@ import java.io.IOException; /** * XSS filter. + * * @author onewe */ public class XssFilter extends OncePerRequestFilter { - - private static final String CONTENT_SECURITY_POLICY_HEADER = "Content-Security-Policy"; - - private static final String CONTENT_SECURITY_POLICY = "script-src 'self'"; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - - response.setHeader(CONTENT_SECURITY_POLICY_HEADER, CONTENT_SECURITY_POLICY); - filterChain.doFilter(request, response); - } + + private static final String CONTENT_SECURITY_POLICY_HEADER = "Content-Security-Policy"; + + private static final String CONTENT_SECURITY_POLICY = "script-src 'self'"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + response.setHeader(CONTENT_SECURITY_POLICY_HEADER, CONTENT_SECURITY_POLICY); + filterChain.doFilter(request, response); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java b/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java index 0a13166f..0137dade 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java @@ -22,94 +22,94 @@ package com.alibaba.nacos.console.model; * @author diamond */ public class Namespace { - - private String namespace; - - private String namespaceShowName; - - private String namespaceDesc; - - private int quota; - - private int configCount; - - /** - * see {@link com.alibaba.nacos.console.enums.NamespaceTypeEnum}. - */ - private int type; - - public String getNamespaceShowName() { - return namespaceShowName; - } - - public void setNamespaceShowName(String namespaceShowName) { - this.namespaceShowName = namespaceShowName; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public Namespace() { - } - - public Namespace(String namespace, String namespaceShowName) { - this.namespace = namespace; - this.namespaceShowName = namespaceShowName; - } - - public Namespace(String namespace, String namespaceShowName, int quota, int configCount, int type) { - this.namespace = namespace; - this.namespaceShowName = namespaceShowName; - this.quota = quota; - this.configCount = configCount; - this.type = type; - } - - public Namespace(String namespace, String namespaceShowName, String namespaceDesc, int quota, int configCount, - int type) { - this.namespace = namespace; - this.namespaceShowName = namespaceShowName; - this.quota = quota; - this.configCount = configCount; - this.type = type; - this.namespaceDesc = namespaceDesc; - } - - public String getNamespaceDesc() { - return namespaceDesc; - } - - public void setNamespaceDesc(String namespaceDesc) { - this.namespaceDesc = namespaceDesc; - } - - public int getQuota() { - return quota; - } - - public void setQuota(int quota) { - this.quota = quota; - } - - public int getConfigCount() { - return configCount; - } - - public void setConfigCount(int configCount) { - this.configCount = configCount; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - + + private String namespace; + + private String namespaceShowName; + + private String namespaceDesc; + + private int quota; + + private int configCount; + + /** + * see {@link com.alibaba.nacos.console.enums.NamespaceTypeEnum}. + */ + private int type; + + public String getNamespaceShowName() { + return namespaceShowName; + } + + public void setNamespaceShowName(String namespaceShowName) { + this.namespaceShowName = namespaceShowName; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Namespace() { + } + + public Namespace(String namespace, String namespaceShowName) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + } + + public Namespace(String namespace, String namespaceShowName, int quota, int configCount, int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + } + + public Namespace(String namespace, String namespaceShowName, String namespaceDesc, int quota, int configCount, + int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + this.namespaceDesc = namespaceDesc; + } + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + public int getQuota() { + return quota; + } + + public void setQuota(int quota) { + this.quota = quota; + } + + public int getConfigCount() { + return configCount; + } + + public void setConfigCount(int configCount) { + this.configCount = configCount; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java b/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java index 92d9c8fd..3d544188 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java @@ -22,10 +22,10 @@ package com.alibaba.nacos.console.model; * @author Nacos */ public class NamespaceAllInfo extends Namespace { - - public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type, - String namespaceDesc) { - super(namespace, namespaceShowName, namespaceDesc, quota, configCount, type); - } - + + public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type, + String namespaceDesc) { + super(namespace, namespaceShowName, namespaceDesc, quota, configCount, type); + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java b/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java index 851429a3..952d6efb 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java @@ -26,86 +26,90 @@ import java.util.Objects; /** * NamespaceForm. + * * @author dongyafei * @date 2022/8/16 */ public class NamespaceForm implements Serializable { - - private static final long serialVersionUID = -1078976569495343487L; - - private String namespaceId; - - private String namespaceName; - - private String namespaceDesc; - - public NamespaceForm() { - } - - public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) { - this.namespaceId = namespaceId; - this.namespaceName = namespaceName; - this.namespaceDesc = namespaceDesc; - } - - public String getNamespaceId() { - return namespaceId; - } - - public void setNamespaceId(String namespaceId) { - this.namespaceId = namespaceId; - } - - public String getNamespaceName() { - return namespaceName; - } - - public void setNamespaceName(String namespaceName) { - this.namespaceName = namespaceName; - } - - public String getNamespaceDesc() { - return namespaceDesc; - } - - public void setNamespaceDesc(String namespaceDesc) { - this.namespaceDesc = namespaceDesc; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - NamespaceForm that = (NamespaceForm) o; - return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName) - && Objects.equals(namespaceDesc, that.namespaceDesc); - } - - @Override - public int hashCode() { - return Objects.hash(namespaceId, namespaceName, namespaceDesc); - } - - @Override - public String toString() { - return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\'' - + ", namespaceDesc='" + namespaceDesc + '\'' + '}'; - } - - /** - * check required param. - * @throws NacosException NacosException - */ - public void validate() throws NacosException { - if (null == namespaceId) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceId' is missing"); - } - if (null == namespaceName) { - throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceName' is missing"); - } - } + + private static final long serialVersionUID = -1078976569495343487L; + + private String namespaceId; + + private String namespaceName; + + private String namespaceDesc; + + public NamespaceForm() { + } + + public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) { + this.namespaceId = namespaceId; + this.namespaceName = namespaceName; + this.namespaceDesc = namespaceDesc; + } + + public String getNamespaceId() { + return namespaceId; + } + + public void setNamespaceId(String namespaceId) { + this.namespaceId = namespaceId; + } + + public String getNamespaceName() { + return namespaceName; + } + + public void setNamespaceName(String namespaceName) { + this.namespaceName = namespaceName; + } + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NamespaceForm that = (NamespaceForm) o; + return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName) + && Objects.equals(namespaceDesc, that.namespaceDesc); + } + + @Override + public int hashCode() { + return Objects.hash(namespaceId, namespaceName, namespaceDesc); + } + + @Override + public String toString() { + return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\'' + + ", namespaceDesc='" + namespaceDesc + '\'' + '}'; + } + + /** + * check required param. + * @throws NacosException NacosException + */ + public void validate() throws NacosException { + if (null == namespaceId) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, + "required parameter 'namespaceId' is missing"); + } + if (null == namespaceName) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, + "required parameter 'namespaceName' is missing"); + } + } + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java b/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java index 199261ef..bfac3a30 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java @@ -42,109 +42,108 @@ import java.util.List; @Service public class NamespaceOperationService { - - private final ConfigInfoPersistService configInfoPersistService; - - private final CommonPersistService commonPersistService; - - private static final String DEFAULT_NAMESPACE = "public"; - - private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public"; - - private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace"; - - private static final int DEFAULT_QUOTA = 200; - - private static final String DEFAULT_CREATE_SOURCE = "nacos"; - - private static final String DEFAULT_TENANT = ""; - - private static final String DEFAULT_KP = "1"; - - public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService, - CommonPersistService commonPersistService) { - this.configInfoPersistService = configInfoPersistService; - this.commonPersistService = commonPersistService; - } - - public List getNamespaceList() { - // TODO 获取用kp - List tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP); - - Namespace namespace0 = new Namespace(NamespaceUtil.getNamespaceDefaultId(), DEFAULT_NAMESPACE, DEFAULT_QUOTA, - configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType()); - List namespaceList = new ArrayList<>(); - namespaceList.add(namespace0); - - for (TenantInfo tenantInfo : tenantInfos) { - int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId()); - Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), - tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType()); - namespaceList.add(namespaceTmp); - } - return namespaceList; - } - - /** - * query namespace by namespace id. - * - * @param namespaceId namespace Id. - * @return NamespaceAllInfo. - */ - public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException { - // TODO 获取用kp - if (StringUtils.isBlank(namespaceId) || namespaceId.equals(NamespaceUtil.getNamespaceDefaultId())) { - return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA, - configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(), - DEFAULT_NAMESPACE_DESCRIPTION); - } else { - TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId); - if (null == tenantInfo) { - throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST, - "namespaceId [ " + namespaceId + " ] not exist"); - } - int configCount = configInfoPersistService.configInfoCount(namespaceId); - return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount, - NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc()); - } - } - - /** - * create namespace. - * - * @param namespaceId namespace ID - * @param namespaceName namespace Name - * @param namespaceDesc namespace Desc - * @return whether create ok - */ - public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc) - throws NacosException { - // TODO 获取用kp - if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) { - throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST, - "namespaceId [" + namespaceId + "] already exist"); - } - - commonPersistService - .insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, DEFAULT_CREATE_SOURCE, - System.currentTimeMillis()); - return true; - } - - /** - * edit namespace. - */ - public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) { - // TODO 获取用kp - commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc); - return true; - } - - /** - * remove namespace. - */ - public Boolean removeNamespace(String namespaceId) { - commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId); - return true; - } + + private final ConfigInfoPersistService configInfoPersistService; + + private final CommonPersistService commonPersistService; + + private static final String DEFAULT_NAMESPACE = "public"; + + private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public"; + + private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace"; + + private static final int DEFAULT_QUOTA = 200; + + private static final String DEFAULT_CREATE_SOURCE = "nacos"; + + private static final String DEFAULT_TENANT = ""; + + private static final String DEFAULT_KP = "1"; + + public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService, + CommonPersistService commonPersistService) { + this.configInfoPersistService = configInfoPersistService; + this.commonPersistService = commonPersistService; + } + + public List getNamespaceList() { + // TODO 获取用kp + List tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP); + + Namespace namespace0 = new Namespace(NamespaceUtil.getNamespaceDefaultId(), DEFAULT_NAMESPACE, DEFAULT_QUOTA, + configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType()); + List namespaceList = new ArrayList<>(); + namespaceList.add(namespace0); + + for (TenantInfo tenantInfo : tenantInfos) { + int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId()); + Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), + tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType()); + namespaceList.add(namespaceTmp); + } + return namespaceList; + } + + /** + * query namespace by namespace id. + * @param namespaceId namespace Id. + * @return NamespaceAllInfo. + */ + public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException { + // TODO 获取用kp + if (StringUtils.isBlank(namespaceId) || namespaceId.equals(NamespaceUtil.getNamespaceDefaultId())) { + return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA, + configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(), + DEFAULT_NAMESPACE_DESCRIPTION); + } + else { + TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId); + if (null == tenantInfo) { + throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST, + "namespaceId [ " + namespaceId + " ] not exist"); + } + int configCount = configInfoPersistService.configInfoCount(namespaceId); + return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount, + NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc()); + } + } + + /** + * create namespace. + * @param namespaceId namespace ID + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + */ + public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc) + throws NacosException { + // TODO 获取用kp + if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) { + throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST, + "namespaceId [" + namespaceId + "] already exist"); + } + + commonPersistService.insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, + DEFAULT_CREATE_SOURCE, System.currentTimeMillis()); + return true; + } + + /** + * edit namespace. + */ + public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) { + // TODO 获取用kp + commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc); + return true; + } + + /** + * remove namespace. + */ + public Boolean removeNamespace(String namespaceId) { + commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId); + return true; + } + } -- Gitee From 0d78482d8cca308f95d1d845b3ef5510aebb934b Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 23 Jun 2023 11:29:10 +0800 Subject: [PATCH 107/238] =?UTF-8?q?:construction=5Fworker:=20Adding=20CI?= =?UTF-8?q?=20build=20system.=20=E5=A2=9E=E5=8A=A0=20atomgit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/mirror.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 35d6cb69..00b5dbb6 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -14,3 +14,9 @@ jobs: with: source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@code.gitlink.org.cn:lengleng/pig.git" + - uses: wearerequired/git-mirror-action@master #同步至 gitlink + env: + SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} + with: + source-repo: "git@github.com:pig-mesh/pig.git" + destination-repo: "git@atomgit.com:log4j/pig.git" -- Gitee From da5623b516ee81cef66d36f73fc6f1df1724c346 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Fri, 23 Jun 2023 03:32:49 +0000 Subject: [PATCH 108/238] Spring Boot 2.7.13 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 638d0d8b..dd6925d3 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.12 + 2.7.13 2021.0.7 2021.0.5.0 UTF-8 -- Gitee From eac07916f46c4c4b0b635ac454a9daec8b4bf8ed Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 23 Jun 2023 11:39:37 +0800 Subject: [PATCH 109/238] =?UTF-8?q?:construction=5Fworker:=20Adding=20CI?= =?UTF-8?q?=20build=20system.=20=E5=A2=9E=E5=8A=A0=20atomgit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/mirror.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 00b5dbb6..31cfa186 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -5,7 +5,7 @@ on: branches: [ master,dev ] jobs: - sync: + gitlink: runs-on: ubuntu-latest steps: - uses: wearerequired/git-mirror-action@master #同步至 gitlink @@ -14,7 +14,10 @@ jobs: with: source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@code.gitlink.org.cn:lengleng/pig.git" - - uses: wearerequired/git-mirror-action@master #同步至 gitlink + atomgit: + runs-on: ubuntu-latest + steps: + - uses: wearerequired/git-mirror-action@master #同步至 atomgit env: SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} with: -- Gitee From 1bfda7657ddce14615ab2eede9ab91708a9f24da Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Sun, 25 Jun 2023 01:28:02 +0000 Subject: [PATCH 110/238] Spring Authorization Server 0.4.3 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dd6925d3..e71b54bd 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 1.8 1.8 2.7.10 - 0.4.2 + 0.4.3 3.6.0 2.2.2 2.3 -- Gitee From 2402876fa8c301fb1f91cf1d265e6b875abe95f1 Mon Sep 17 00:00:00 2001 From: lht Date: Sun, 25 Jun 2023 13:33:44 +0000 Subject: [PATCH 111/238] update README.md. Signed-off-by: lht --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 53a504b1..64001576 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,10 @@ | 依赖 | 版本 | |-----------------------------|------------| -| Spring Boot | 2.7.12 | +| Spring Boot | 2.7.13 | | Spring Cloud | 2021.0.7 | | Spring Cloud Alibaba | 2021.0.5.0 | -| Spring Authorization Server | 0.4.2 | +| Spring Authorization Server | 0.4.3 | | Mybatis Plus | 3.5.3.1 | | hutool | 5.8.19 | -- Gitee From 021871294f768466f9e2c5eabaf3cb619f72babc Mon Sep 17 00:00:00 2001 From: Lht Date: Sun, 25 Jun 2023 21:38:14 +0800 Subject: [PATCH 112/238] :arrow_up: Upgrading dependencies. UP hutool 5.8.20 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 64001576..ba0ad503 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.3 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.19 | +| hutool | 5.8.20 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 4bb911a6..cae06993 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.19 + 5.8.20 2.7.4 1.8.4 -- Gitee From 8e22918dfeb67f829baa2aa1d1721d8581b5b294 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Mon, 3 Jul 2023 01:54:10 +0000 Subject: [PATCH 113/238] spring-cloud.version 2021.0.8 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e71b54bd..53f5f1d4 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.7.13 - 2021.0.7 + 2021.0.8 2021.0.5.0 UTF-8 1.8 -- Gitee From e427126bcc4199f7ac95090b1287c82ef7ba0f4b Mon Sep 17 00:00:00 2001 From: knight Date: Wed, 26 Jul 2023 11:03:37 +0800 Subject: [PATCH 114/238] =?UTF-8?q?:recycle:=20PigSecurityInnerAspect?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=89=8D=E7=BD=AE=E9=80=9A=E7=9F=A5=E6=9B=BF?= =?UTF-8?q?=E4=BB=A3=E7=8E=AF=E7=BB=95=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/component/PigSecurityInnerAspect.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java index 6d55f61e..42f2ff1f 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java @@ -16,17 +16,15 @@ package com.pig4cloud.pig.common.security.component; -import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.annotation.Inner; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; import org.springframework.core.Ordered; -import org.springframework.core.annotation.AnnotationUtils; import org.springframework.security.access.AccessDeniedException; import javax.servlet.http.HttpServletRequest; @@ -45,8 +43,8 @@ public class PigSecurityInnerAspect implements Ordered { private final HttpServletRequest request; @SneakyThrows - @Around("@within(inner) || @annotation(inner)") - public Object around(ProceedingJoinPoint point, Inner inner) { + @Before("@within(inner) || @annotation(inner)") + public void around(JoinPoint point, Inner inner) { // 实际注入的inner实体由表达式后一个注解决定,即是方法上的@Inner注解实体,若方法上无@Inner注解,则获取类上的 // 这段代码没有意义,拦截的就是@Inner注解,怎么会为null呢 // if (inner == null) { @@ -58,7 +56,6 @@ public class PigSecurityInnerAspect implements Ordered { log.warn("访问接口 {} 没有权限", point.getSignature().getName()); throw new AccessDeniedException("Access is denied"); } - return point.proceed(); } @Override -- Gitee From cc43baa795a8bf4e37cd3b9530f584bffe2ce35f Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 17 Aug 2023 21:45:14 +0800 Subject: [PATCH 115/238] :bookmark: Releasing / Version tags. 3.7.0-JDK8 --- README.md | 8 +- db/pig.sql | 888 +- db/pig_codegen.sql | 255 +- db/pig_config.sql | 8 +- db/pig_job.sql | 168 +- docker-compose.yml | 47 +- pig-auth/pom.xml | 2 +- .../pig/auth/endpoint/PigTokenEndpoint.java | 8 +- ...ourceOwnerBaseAuthenticationConverter.java | 2 +- ...sourceOwnerBaseAuthenticationProvider.java | 28 +- .../core/CustomeOAuth2TokenCustomizer.java | 2 + .../core/FormIdentityLoginConfigurer.java | 12 +- .../core/PigDaoAuthenticationProvider.java | 11 +- .../FormAuthenticationFailureHandler.java | 5 +- .../PigAuthenticationFailureEventHandler.java | 12 +- .../PigAuthenticationSuccessEventHandler.java | 18 +- .../handler/PigLogoutSuccessEventHandler.java | 1 - .../handler/SsoLogoutSuccessHandler.java | 4 +- ...eOwnerPasswordAuthenticationConverter.java | 2 +- ...sourceOwnerSmsAuthenticationConverter.java | 6 +- ...esourceOwnerSmsAuthenticationProvider.java | 2 +- pig-common/pig-common-bom/pom.xml | 27 +- pig-common/pig-common-core/pom.xml | 2 +- .../common/core/constant/CacheConstants.java | 10 +- .../core/constant/SecurityConstants.java | 9 +- pig-common/pig-common-datasource/pom.xml | 43 +- .../DynamicDataSourceAutoConfiguration.java | 64 +- .../config/ClearTtlDataSourceFilter.java | 34 + .../config/JdbcDynamicDataSourceProvider.java | 9 +- .../datasource/enums/DsConfTypeEnum.java | 30 + .../datasource/enums/DsJdbcUrlEnum.java | 72 + pig-common/pig-common-feign/pom.xml | 2 +- pig-common/pig-common-job/pom.xml | 4 +- pig-common/pig-common-log/pom.xml | 2 +- .../pig/common/log/LogAutoConfiguration.java | 13 +- .../pig/common/log/aspect/SysLogAspect.java | 13 +- .../common/log/config/PigLogProperties.java | 51 +- .../common/log/event/SysLogEventSource.java | 20 + .../pig/common/log/event/SysLogListener.java | 51 +- .../init/ApplicationLoggerInitializer.java | 3 + .../pig/common/log/util/SysLogUtils.java | 63 +- .../spring-configuration-metadata.json | 30 + .../main/resources/META-INF/spring.factories | 3 - pig-common/pig-common-mybatis/pom.xml | 13 +- .../config/MybatisPlusMetaObjectHandler.java | 24 +- .../handler/JsonLongArrayTypeHandler.java | 56 + .../handler/JsonStringArrayTypeHandler.java | 56 + .../resolver/SqlFilterArgumentResolver.java | 2 +- pig-common/pig-common-oss/pom.xml | 27 + .../common/file/FileAutoConfiguration.java | 36 + .../pig/common/file/core/FileProperties.java | 51 + .../pig/common/file/core/FileTemplate.java | 87 + .../local/LocalFileAutoConfiguration.java | 45 + .../file/local/LocalFileProperties.java | 44 + .../common/file/local/LocalFileTemplate.java | 139 + .../common/file/oss/OssAutoConfiguration.java | 56 + .../pig/common/file/oss/OssProperties.java | 80 + .../pig/common/file/oss/http/OssEndpoint.java | 138 + .../common/file/oss/service/OssTemplate.java | 240 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + pig-common/pig-common-seata/pom.xml | 2 +- pig-common/pig-common-security/pom.xml | 2 +- ...cessTokenResponseHttpMessageConverter.java | 51 + .../service/PigAppUserDetailsServiceImpl.java | 7 +- .../PigRemoteRegisteredClientRepository.java | 66 +- .../service/PigUserDetailsServiceImpl.java | 6 +- pig-common/pig-common-swagger/pom.xml | 2 +- pig-common/pig-common-xss/pom.xml | 2 +- pig-common/pom.xml | 3 +- pig-gateway/pom.xml | 2 +- .../config/SpringDocConfiguration.java | 2 +- pig-register/Dockerfile | 0 pig-register/pom.xml | 177 +- .../alibaba/nacos/PigNacosApplication.java | 1 + .../alibaba/nacos/config/ConfigConstants.java | 5 + .../alibaba/nacos/config/ConsoleConfig.java | 7 - .../controller/ServerStateController.java | 18 +- .../META-INF/nacos-default.properties | 78 - .../src/main/resources/META-INF/schema.sql | 215 - .../src/main/resources/application.yml | 11 +- .../src/main/resources/conf/announcement.conf | 1 + .../src/main/resources/nacos-version.txt | 2 +- pig-upms/pig-upms-api/pom.xml | 11 +- .../pig/admin/api/dto/AppSmsDTO.java | 27 - .../pig4cloud/pig/admin/api/dto/RoleDTO.java | 41 - .../pig/admin/api/dto/SysLogDTO.java | 70 +- .../pig4cloud/pig/admin/api/dto/UserDTO.java | 38 +- .../pig4cloud/pig/admin/api/dto/UserInfo.java | 51 +- .../pig/admin/api/entity/SysDept.java | 78 +- .../pig/admin/api/entity/SysDeptRelation.java | 27 +- .../pig/admin/api/entity/SysDict.java | 68 +- .../pig/admin/api/entity/SysDictItem.java | 76 +- .../pig/admin/api/entity/SysFile.java | 50 +- .../pig/admin/api/entity/SysLog.java | 85 +- .../pig/admin/api/entity/SysMenu.java | 89 +- .../api/entity/SysOauthClientDetails.java | 81 +- .../pig/admin/api/entity/SysPost.java | 60 +- .../pig/admin/api/entity/SysPublicParam.java | 45 +- .../pig/admin/api/entity/SysRole.java | 72 +- .../pig/admin/api/entity/SysRoleMenu.java | 26 +- .../pig/admin/api/entity/SysUser.java | 124 +- .../pig/admin/api/entity/SysUserRole.java | 26 +- .../api/feign/RemoteClientDetailsService.java | 12 +- .../admin/api/feign/RemoteDeptService.java | 41 - .../pig/admin/api/feign/RemoteLogService.java | 31 +- .../admin/api/feign/RemoteParamService.java | 6 +- .../admin/api/feign/RemoteTokenService.java | 48 +- .../admin/api/feign/RemoteUserService.java | 59 +- .../pig/admin/api/util/DictResolver.java | 4 +- .../pig/admin/api/util/ParamResolver.java | 3 +- .../pig/admin/api/vo/DeptExcelVo.java | 44 + .../pig4cloud/pig/admin/api/vo/ImageCode.java | 44 - .../com/pig4cloud/pig/admin/api/vo/LogVO.java | 37 - .../pig/admin/api/vo/PostExcelVO.java | 6 +- .../pig4cloud/pig/admin/api/vo/PreLogVO.java | 73 + .../pig/admin/api/vo/RoleExcelVO.java | 4 +- .../pig4cloud/pig/admin/api/vo/RoleVO.java | 41 + .../pig4cloud/pig/admin/api/vo/RoleVo.java | 40 - .../pig/admin/api/vo/UserExcelVO.java | 29 +- .../pig/admin/api/vo/UserInfoVO.java | 49 - .../pig4cloud/pig/admin/api/vo/UserVO.java | 84 +- ...mework.cloud.openfeign.FeignClient.imports | 7 - pig-upms/pig-upms-biz/pom.xml | 6 +- .../pig/admin/PigAdminApplication.java | 29 +- .../pig/admin/controller/AppController.java | 62 - ...ntroller.java => SysClientController.java} | 125 +- .../admin/controller/SysDeptController.java | 114 +- .../admin/controller/SysDictController.java | 146 +- .../admin/controller/SysFileController.java | 46 +- .../admin/controller/SysLogController.java | 64 +- .../admin/controller/SysMenuController.java | 82 +- .../admin/controller/SysMobileController.java | 53 + .../admin/controller/SysPostController.java | 57 +- .../controller/SysPublicParamController.java | 73 +- .../controller/SysRegisterController.java | 2 +- .../admin/controller/SysRoleController.java | 99 +- .../controller/SysSystemInfoController.java | 59 + ...ontroller.java => SysTokenController.java} | 56 +- .../admin/controller/SysUserController.java | 183 +- .../pig/admin/mapper/SysDeptMapper.java | 33 +- .../admin/mapper/SysDeptRelationMapper.java | 52 - .../pig/admin/mapper/SysDictItemMapper.java | 23 +- .../pig/admin/mapper/SysDictMapper.java | 23 +- .../pig/admin/mapper/SysLogMapper.java | 25 +- .../pig/admin/mapper/SysMenuMapper.java | 29 +- .../mapper/SysOauthClientDetailsMapper.java | 25 +- .../pig/admin/mapper/SysPostMapper.java | 4 +- .../pig/admin/mapper/SysRoleMapper.java | 25 +- .../pig/admin/mapper/SysRoleMenuMapper.java | 25 +- .../pig/admin/mapper/SysUserMapper.java | 27 +- .../pig/admin/mapper/SysUserRoleMapper.java | 35 +- .../admin/service/SysDeptRelationService.java | 51 - .../pig/admin/service/SysDeptService.java | 61 +- .../pig/admin/service/SysDictItemService.java | 28 +- .../pig/admin/service/SysDictService.java | 35 +- .../pig/admin/service/SysFileService.java | 11 +- .../pig/admin/service/SysLogService.java | 37 +- .../pig/admin/service/SysMenuService.java | 45 +- ...{AppService.java => SysMobileService.java} | 15 +- .../service/SysOauthClientDetailsService.java | 52 +- .../pig/admin/service/SysPostService.java | 16 +- .../admin/service/SysPublicParamService.java | 4 +- .../pig/admin/service/SysRoleMenuService.java | 27 +- .../pig/admin/service/SysRoleService.java | 52 +- .../pig/admin/service/SysUserRoleService.java | 25 +- .../pig/admin/service/SysUserService.java | 75 +- .../impl/SysDeptRelationServiceImpl.java | 95 - .../service/impl/SysDeptServiceImpl.java | 242 +- .../service/impl/SysDictItemServiceImpl.java | 49 +- .../service/impl/SysDictServiceImpl.java | 72 +- .../service/impl/SysFileServiceImpl.java | 43 +- .../admin/service/impl/SysLogServiceImpl.java | 67 +- .../service/impl/SysMenuServiceImpl.java | 131 +- ...iceImpl.java => SysMobileServiceImpl.java} | 56 +- .../SysOauthClientDetailsServiceImpl.java | 77 +- .../service/impl/SysPostServiceImpl.java | 6 +- .../impl/SysPublicParamServiceImpl.java | 20 +- .../service/impl/SysRoleMenuServiceImpl.java | 39 +- .../service/impl/SysRoleServiceImpl.java | 78 +- .../service/impl/SysUserRoleServiceImpl.java | 25 +- .../service/impl/SysUserServiceImpl.java | 302 +- .../src/main/resources/file/approle.xlsx | Bin 0 -> 8834 bytes .../src/main/resources/file/dept.xlsx | Bin 0 -> 10037 bytes .../src/main/resources/file/user.xlsx | Bin 8902 -> 8923 bytes .../src/main/resources/logback-spring.xml | 129 +- .../main/resources/mapper/SysDeptMapper.xml | 51 +- .../mapper/SysDeptRelationMapper.xml | 56 - .../main/resources/mapper/SysMenuMapper.xml | 54 +- .../main/resources/mapper/SysPostMapper.xml | 7 +- .../main/resources/mapper/SysRoleMapper.xml | 53 +- .../main/resources/mapper/SysUserMapper.xml | 348 +- .../resources/mapper/SysUserRoleMapper.xml | 32 - pig-upms/pom.xml | 2 +- pig-visual/pig-codegen/pom.xml | 12 +- .../pig/codegen/PigCodeGenApplication.java | 29 +- .../controller/GenDsConfController.java | 94 +- .../controller/GenFieldTypeController.java} | 162 +- .../controller/GenFormConfController.java | 110 - .../controller/GenGroupController.java | 145 + .../controller/GenTableController.java | 176 + .../controller/GenTemplateController.java | 146 + .../GenTemplateGroupController.java | 131 + .../controller/GeneratorController.java | 102 +- .../pig/codegen/entity/ColumnEntity.java | 28 +- .../pig/codegen/entity/GenConfig.java | 25 +- .../pig/codegen/entity/GenDatasourceConf.java | 83 +- .../pig/codegen/entity/GenFieldType.java | 103 + .../pig/codegen/entity/GenFormConf.java | 64 - .../pig/codegen/entity/GenGroupEntity.java | 98 + .../pig/codegen/entity/GenTable.java | 172 + .../codegen/entity/GenTableColumnEntity.java | 155 + .../pig/codegen/entity/GenTemplateEntity.java | 109 + .../entity/GenTemplateGroupEntity.java} | 50 +- .../pig/codegen/entity/TableEntity.java | 28 +- .../mapper/GenDatasourceConfMapper.java | 23 +- .../pig/codegen/mapper/GenDynamicMapper.java | 39 + .../codegen/mapper/GenFieldTypeMapper.java | 44 + .../pig/codegen/mapper/GenFormConfMapper.java | 32 - .../pig/codegen/mapper/GenGroupMapper.java | 37 + .../codegen/mapper/GenTableColumnMapper.java | 33 + .../pig/codegen/mapper/GenTableMapper.java} | 12 +- .../mapper/GenTemplateGroupMapper.java | 33 + .../pig/codegen/mapper/GenTemplateMapper.java | 42 + .../pig/codegen/mapper/GeneratorMapper.java | 72 +- .../codegen/mapper/GeneratorMysqlMapper.java | 31 + .../pig/codegen/service/GenCodeService.java | 329 - .../service/GenDatasourceConfService.java | 27 +- .../codegen/service/GenFieldTypeService.java | 41 + .../codegen/service/GenFormConfService.java | 38 - .../pig/codegen/service/GenGroupService.java | 53 + .../service/GenTableColumnService.java | 47 + .../pig/codegen/service/GenTableService.java | 73 + .../service/GenTemplateGroupService.java | 31 + .../codegen/service/GenTemplateService.java} | 12 +- .../pig/codegen/service/GeneratorService.java | 53 +- .../impl/GenDatasourceConfServiceImpl.java | 83 +- .../service/impl/GenFieldTypeServiceImpl.java | 51 + .../service/impl/GenFormConfServiceImpl.java | 95 - .../service/impl/GenGroupServiceImpl.java | 116 + .../impl/GenTableColumnServiceImpl.java | 88 + .../service/impl/GenTableServiceImpl.java | 203 + .../impl/GenTemplateGroupServiceImpl.java | 35 + .../service/impl/GenTemplateServiceImpl.java} | 17 +- .../service/impl/GeneratorServiceImpl.java | 303 +- .../impl/temp/AvueGenCodeServiceImpl.java | 106 - .../impl/temp/EleGenCodeServiceImpl.java | 61 - .../pig/codegen/support/StyleTypeEnum.java | 46 - .../codegen/util/CommonColumnFiledEnum.java | 62 + .../pig4cloud/pig/codegen/util/DictTool.java | 32 + .../pig4cloud/pig/codegen/util/GenKit.java | 75 + .../codegen/util/GeneratorFileTypeEnum.java | 14 + .../pig/codegen/util/NamingCaseTool.java | 35 + .../pig/codegen/util/VelocityKit.java | 69 + .../pig/codegen/util/vo/GroupVo.java | 45 + .../pig4cloud/pig/codegen/util/vo/SqlDto.java | 22 + .../pig/codegen/util/vo/TemplateGroupDTO.java | 21 + .../src/main/resources/generator.properties | 51 - .../src/main/resources/logback-spring.xml | 45 +- .../GenFieldTypeMapper.xml} | 26 +- .../resources/mapper/GenFormConfMapper.xml | 31 - .../main/resources/mapper/GenGroupMapper.xml | 26 + .../main/resources/mapper/GenTableMapper.xml | 45 + .../mapper/GenTemplateGroupMapper.xml | 10 + .../resources/mapper/GenTemplateMapper.xml | 22 + .../main/resources/mapper/GeneratorMapper.xml | 39 - .../resources/mapper/GeneratorMySqlMapper.xml | 48 + .../main/resources/template/avue/api.js.vm | 56 - .../main/resources/template/avue/crud.js.vm | 34 - .../main/resources/template/avue/index.vue.vm | 130 - .../src/main/resources/template/config.json | 12 + .../resources/template/element/form.vue.vm | 102 - .../resources/template/element/index.vue.vm | 130 - .../src/main/resources/template/menu.sql.vm | 20 - pig-visual/pig-monitor/pom.xml | 2 +- .../Dockerfile | 8 +- pig-visual/pig-quartz/pom.xml | 91 + .../daemon/quartz/PigQuartzApplication.java} | 15 +- .../config/AutowireCapableBeanJobFactory.java | 50 + .../quartz/config/PigInitQuartzJob.java | 63 + .../daemon/quartz/config/PigQuartzConfig.java | 124 + .../config/PigQuartzCustomizerConfig.java | 35 + .../quartz/config/PigQuartzFactory.java | 50 + .../quartz/config/PigQuartzInvokeFactory.java | 46 + .../quartz/constants/JobTypeQuartzEnum.java | 63 + .../quartz/constants/PigQuartzEnum.java | 94 + .../quartz/controller/SysJobController.java | 314 + .../controller/SysJobLogController.java | 65 + .../pig/daemon/quartz/entity/SysJob.java | 162 + .../pig/daemon/quartz/entity/SysJobLog.java | 130 + .../pig/daemon/quartz/event/SysJobEvent.java | 36 + .../daemon/quartz/event/SysJobListener.java | 49 + .../daemon/quartz/event/SysJobLogEvent.java | 33 + .../quartz/event/SysJobLogListener.java | 48 + .../quartz/exception/TaskException.java | 35 + .../daemon/quartz/mapper/SysJobLogMapper.java | 33 + .../daemon/quartz/mapper/SysJobMapper.java | 33 + .../quartz/service/SysJobLogService.java | 31 + .../daemon/quartz/service/SysJobService.java | 31 + .../service/impl/SysJobLogServiceImpl.java | 39 + .../service/impl/SysJobServiceImpl.java | 39 + .../pig/daemon/quartz/task/RestTaskDemo.java | 34 + .../quartz/task/SpringBeanTaskDemo.java | 43 + .../pig/daemon/quartz/util/ITaskInvok.java | 37 + .../pig/daemon/quartz/util/JarTaskInvok.java | 62 + .../quartz/util/JavaClassTaskInvok.java | 87 + .../pig/daemon/quartz/util/RestTaskInvok.java | 50 + .../quartz/util/SpringBeanTaskInvok.java | 79 + .../daemon/quartz/util/TaskInvokFactory.java | 50 + .../pig/daemon/quartz/util/TaskInvokUtil.java | 115 + .../pig/daemon/quartz/util/TaskUtil.java | 244 + .../src/main/resources/application.yml | 17 +- .../src/main/resources/logback-spring.xml | 36 +- pig-visual/pig-sentinel-dashboard/Dockerfile | 15 - pig-visual/pig-sentinel-dashboard/pom.xml | 107 - .../dashboard/PigSentinelApplication.java | 39 - .../sentinel/dashboard/auth/AuthAction.java | 44 - .../sentinel/dashboard/auth/AuthService.java | 112 - .../auth/AuthorizationInterceptor.java | 29 - .../auth/DefaultAuthorizationInterceptor.java | 75 - .../DefaultLoginAuthenticationFilter.java | 131 - .../dashboard/auth/FakeAuthServiceImpl.java | 73 - .../auth/LoginAuthenticationFilter.java | 44 - .../auth/SimpleWebAuthServiceImpl.java | 75 - .../client/CommandFailedException.java | 35 - .../client/CommandNotFoundException.java | 36 - .../dashboard/client/SentinelApiClient.java | 888 -- .../dashboard/config/AuthConfiguration.java | 59 - .../dashboard/config/DashboardConfig.java | 149 - .../sentinel/dashboard/config/WebConfig.java | 115 - .../dashboard/controller/AppController.java | 83 - .../dashboard/controller/AuthController.java | 94 - .../controller/AuthorityRuleController.java | 186 - .../controller/DegradeController.java | 219 - .../dashboard/controller/DemoController.java | 141 - .../controller/FlowControllerV1.java | 267 - .../controller/MachineRegistryController.java | 87 - .../controller/MetricController.java | 163 - .../controller/ParamFlowRuleController.java | 273 - .../controller/ResourceController.java | 91 - .../controller/SystemController.java | 257 - .../controller/VersionController.java | 50 - .../cluster/ClusterAssignController.java | 102 - .../cluster/ClusterConfigController.java | 246 - .../gateway/GatewayApiController.java | 267 - .../gateway/GatewayFlowRuleController.java | 449 - .../controller/v2/FlowControllerV2.java | 220 - .../datasource/entity/ApplicationEntity.java | 108 - .../datasource/entity/MachineEntity.java | 127 - .../datasource/entity/MetricEntity.java | 217 - .../entity/MetricPositionEntity.java | 121 - .../datasource/entity/SentinelVersion.java | 136 - .../entity/gateway/ApiDefinitionEntity.java | 208 - .../gateway/ApiPredicateItemEntity.java | 80 - .../entity/gateway/GatewayFlowRuleEntity.java | 352 - .../gateway/GatewayParamFlowItemEntity.java | 94 - .../entity/rule/AbstractRuleEntity.java | 115 - .../entity/rule/AuthorityRuleEntity.java | 63 - .../entity/rule/DegradeRuleEntity.java | 213 - .../entity/rule/FlowRuleEntity.java | 263 - .../entity/rule/ParamFlowRuleEntity.java | 121 - .../datasource/entity/rule/RuleEntity.java | 41 - .../entity/rule/SystemRuleEntity.java | 167 - .../sentinel/dashboard/discovery/AppInfo.java | 127 - .../dashboard/discovery/AppManagement.java | 69 - .../dashboard/discovery/MachineDiscovery.java | 50 - .../dashboard/discovery/MachineInfo.java | 206 - .../discovery/SimpleMachineDiscovery.java | 77 - .../dashboard/domain/ResourceTreeNode.java | 257 - .../csp/sentinel/dashboard/domain/Result.java | 97 - .../cluster/ClusterAppAssignResultVO.java | 65 - .../cluster/ClusterAppFullAssignRequest.java | 56 - .../ClusterAppSingleServerAssignRequest.java | 56 - .../domain/cluster/ClusterClientInfoVO.java | 74 - .../domain/cluster/ClusterGroupEntity.java | 88 - .../domain/cluster/ClusterStateSingleVO.java | 63 - .../cluster/ConnectionDescriptorVO.java | 51 - .../domain/cluster/ConnectionGroupVO.java | 65 - .../cluster/config/ClusterClientConfig.java | 74 - .../cluster/config/ServerFlowConfig.java | 110 - .../cluster/config/ServerTransportConfig.java | 64 - .../cluster/request/ClusterAppAssignMap.java | 110 - .../request/ClusterClientModifyRequest.java | 85 - .../cluster/request/ClusterModifyRequest.java | 32 - .../request/ClusterServerModifyRequest.java | 117 - .../state/AppClusterClientStateWrapVO.java | 77 - .../state/AppClusterServerStateWrapVO.java | 99 - .../cluster/state/ClusterClientStateVO.java | 45 - .../cluster/state/ClusterRequestLimitVO.java | 63 - .../cluster/state/ClusterServerStateVO.java | 126 - .../state/ClusterStateSimpleEntity.java | 74 - .../state/ClusterUniversalStatePairVO.java | 72 - .../state/ClusterUniversalStateVO.java | 63 - .../dashboard/domain/vo/MachineInfoVo.java | 130 - .../dashboard/domain/vo/MetricVo.java | 220 - .../dashboard/domain/vo/ResourceVo.java | 249 - .../domain/vo/gateway/api/AddApiReqVo.java | 78 - .../vo/gateway/api/ApiPredicateItemVo.java | 59 - .../domain/vo/gateway/api/UpdateApiReqVo.java | 58 - .../vo/gateway/rule/AddFlowRuleReqVo.java | 156 - .../gateway/rule/GatewayParamFlowItemVo.java | 66 - .../vo/gateway/rule/UpdateFlowRuleReqVo.java | 126 - .../dashboard/metric/MetricFetcher.java | 383 - .../gateway/InMemApiDefinitionStore.java | 40 - .../gateway/InMemGatewayFlowRuleStore.java | 40 - .../metric/InMemoryMetricsRepository.java | 164 - .../repository/metric/MetricsRepository.java | 58 - .../rule/InMemAuthorityRuleStore.java | 39 - .../rule/InMemDegradeRuleStore.java | 36 - .../repository/rule/InMemFlowRuleStore.java | 53 - .../rule/InMemParamFlowRuleStore.java | 51 - .../repository/rule/InMemSystemRuleStore.java | 36 - .../rule/InMemoryRuleRepositoryAdapter.java | 132 - .../repository/rule/RuleRepository.java | 80 - .../dashboard/rule/DynamicRuleProvider.java | 26 - .../dashboard/rule/DynamicRulePublisher.java | 32 - .../dashboard/rule/FlowRuleApiProvider.java | 62 - .../dashboard/rule/FlowRuleApiPublisher.java | 61 - .../service/ClusterAssignService.java | 56 - .../service/ClusterAssignServiceImpl.java | 257 - .../service/ClusterConfigService.java | 180 - .../sentinel/dashboard/util/AsyncUtils.java | 73 - .../dashboard/util/ClusterEntityUtils.java | 160 - .../sentinel/dashboard/util/MachineUtils.java | 63 - .../sentinel/dashboard/util/VersionUtils.java | 95 - .../src/main/resources/application.yml | 44 - .../src/main/webapp/resources/.gitignore | 2 - .../src/main/webapp/resources/.jshintrc | 67 - .../src/main/webapp/resources/README.md | 32 - .../src/main/webapp/resources/README_zh.md | 32 - .../main/webapp/resources/app/scripts/app.js | 365 - .../app/scripts/controllers/authority.js | 227 - .../controllers/cluster_app_assign_manage.js | 283 - .../controllers/cluster_app_server_list.js | 570 - .../controllers/cluster_app_server_manage.js | 283 - .../controllers/cluster_app_server_monitor.js | 97 - .../cluster_app_token_client_list.js | 121 - .../app/scripts/controllers/cluster_single.js | 262 - .../app/scripts/controllers/degrade.js | 204 - .../app/scripts/controllers/flow_v1.js | 220 - .../app/scripts/controllers/flow_v2.js | 221 - .../app/scripts/controllers/gateway/api.js | 245 - .../app/scripts/controllers/gateway/flow.js | 251 - .../scripts/controllers/gateway/identity.js | 299 - .../resources/app/scripts/controllers/home.js | 11 - .../app/scripts/controllers/identity.js | 478 - .../app/scripts/controllers/login.js | 33 - .../app/scripts/controllers/machine.js | 65 - .../resources/app/scripts/controllers/main.js | 10 - .../app/scripts/controllers/metric.js | 263 - .../app/scripts/controllers/param_flow.js | 328 - .../app/scripts/controllers/system.js | 239 - .../app/scripts/directives/header/header.html | 15 - .../app/scripts/directives/header/header.js | 61 - .../sidebar-search/sidebar-search.html | 10 - .../sidebar/sidebar-search/sidebar-search.js | 20 - .../scripts/directives/sidebar/sidebar.html | 91 - .../app/scripts/directives/sidebar/sidebar.js | 71 - .../resources/app/scripts/filters/filters.js | 17 - .../resources/app/scripts/libs/treeTable.js | 292 - .../app/scripts/services/appservice.js | 12 - .../app/scripts/services/auth_service.js | 25 - .../app/scripts/services/authority_service.js | 56 - .../scripts/services/cluster_state_service.js | 73 - .../app/scripts/services/degrade_service.js | 97 - .../app/scripts/services/flow_service_v1.js | 119 - .../app/scripts/services/flow_service_v2.js | 85 - .../scripts/services/gateway/api_service.js | 73 - .../scripts/services/gateway/flow_service.js | 76 - .../app/scripts/services/identityservice.js | 30 - .../app/scripts/services/machineservice.js | 25 - .../app/scripts/services/metricservice.js | 36 - .../scripts/services/param_flow_service.js | 104 - .../app/scripts/services/systemservice.js | 77 - .../app/scripts/services/version_service.js | 10 - .../main/webapp/resources/app/styles/main.css | 1756 --- .../main/webapp/resources/app/styles/page.css | 399 - .../webapp/resources/app/styles/timeline.css | 180 - .../webapp/resources/app/views/authority.html | 85 - .../resources/app/views/cluster/client.html | 30 - .../resources/app/views/cluster/server.html | 29 - .../app/views/cluster_app_assign_manage.html | 118 - .../app/views/cluster_app_client_list.html | 73 - .../app/views/cluster_app_server_list.html | 96 - .../views/cluster_app_server_overview.html | 88 - .../app/views/cluster_single_config.html | 95 - .../resources/app/views/dashboard/home.html | 13 - .../resources/app/views/dashboard/main.html | 10 - .../webapp/resources/app/views/degrade.html | 98 - .../views/dialog/authority-rule-dialog.html | 46 - .../cluster/cluster-client-config-dialog.html | 40 - .../cluster/cluster-server-assign-dialog.html | 139 - ...uster-server-connection-detail-dialog.html | 37 - .../app/views/dialog/confirm-dialog.html | 20 - .../app/views/dialog/degrade-rule-dialog.html | 83 - .../app/views/dialog/flow-rule-dialog.html | 148 - .../app/views/dialog/gateway/api-dialog.html | 49 - .../dialog/gateway/flow-rule-dialog.html | 172 - .../views/dialog/param-flow-rule-dialog.html | 166 - .../app/views/dialog/system-rule-dialog.html | 58 - .../webapp/resources/app/views/flow_v1.html | 117 - .../webapp/resources/app/views/flow_v2.html | 113 - .../resources/app/views/gateway/api.html | 87 - .../resources/app/views/gateway/flow.html | 94 - .../resources/app/views/gateway/identity.html | 98 - .../webapp/resources/app/views/identity.html | 110 - .../webapp/resources/app/views/login.html | 34 - .../webapp/resources/app/views/machine.html | 76 - .../webapp/resources/app/views/metric.html | 117 - .../resources/app/views/pagination.tpl.html | 18 - .../resources/app/views/param_flow.html | 118 - .../webapp/resources/app/views/system.html | 92 - .../resources/assets/img/sentinel-logo.png | Bin 28346 -> 0 bytes .../main/webapp/resources/dist/css/app.css | 5 - .../src/main/webapp/resources/dist/js/app.js | 1 - .../webapp/resources/dist/js/app.vendor.js | 1 - .../src/main/webapp/resources/gulpfile.js | 134 - .../src/main/webapp/resources/index.htm | 30 - .../src/main/webapp/resources/index_dev.htm | 30 - .../resources/lib/css/bootstrap.min.css | 7 - .../resources/lib/css/font-awesome.min.css | 4 - .../lib/fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../lib/fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../lib/fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes .../fonts/glyphicons-halflings-regular.ttf | Bin 41236 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23292 -> 0 bytes .../webapp/resources/lib/js/angular.min.js | 295 - .../webapp/resources/lib/js/bootstrap.min.js | 7 - .../main/webapp/resources/lib/js/g2.min.js | 1 - .../webapp/resources/lib/js/jquery.min.js | 5 - .../main/webapp/resources/license-stat.csv | 26 - .../main/webapp/resources/package-lock.json | 4498 -------- .../src/main/webapp/resources/package.json | 55 - pig-visual/pig-xxl-job-admin/pom.xml | 118 - .../job/admin/controller/IndexController.java | 99 - .../admin/controller/JobApiController.java | 78 - .../admin/controller/JobCodeController.java | 99 - .../admin/controller/JobGroupController.java | 212 - .../admin/controller/JobInfoController.java | 189 - .../admin/controller/JobLogController.java | 263 - .../job/admin/controller/UserController.java | 182 - .../annotation/PermissionLimit.java | 28 - .../interceptor/CookieInterceptor.java | 42 - .../interceptor/PermissionInterceptor.java | 70 - .../controller/interceptor/WebMvcConfig.java | 29 - .../resolver/WebExceptionResolver.java | 69 - .../xxl/job/admin/core/alarm/JobAlarm.java | 19 - .../xxl/job/admin/core/alarm/JobAlarmer.java | 67 - .../admin/core/alarm/impl/EmailJobAlarm.java | 109 - .../admin/core/complete/XxlJobCompleter.java | 102 - .../admin/core/conf/XxlJobAdminConfig.java | 163 - .../job/admin/core/cron/CronExpression.java | 1707 --- .../admin/core/exception/XxlJobException.java | 15 - .../xxl/job/admin/core/model/XxlJobGroup.java | 83 - .../xxl/job/admin/core/model/XxlJobInfo.java | 252 - .../xxl/job/admin/core/model/XxlJobLog.java | 167 - .../job/admin/core/model/XxlJobLogGlue.java | 82 - .../job/admin/core/model/XxlJobLogReport.java | 57 - .../job/admin/core/model/XxlJobRegistry.java | 60 - .../xxl/job/admin/core/model/XxlJobUser.java | 78 - .../job/admin/core/old/RemoteHttpJobBean.java | 33 - .../core/old/XxlJobDynamicScheduler.java | 430 - .../job/admin/core/old/XxlJobThreadPool.java | 58 - .../core/route/ExecutorRouteStrategyEnum.java | 50 - .../job/admin/core/route/ExecutorRouter.java | 24 - .../route/strategy/ExecutorRouteBusyover.java | 52 - .../strategy/ExecutorRouteConsistentHash.java | 84 - .../route/strategy/ExecutorRouteFailover.java | 53 - .../route/strategy/ExecutorRouteFirst.java | 19 - .../core/route/strategy/ExecutorRouteLFU.java | 79 - .../core/route/strategy/ExecutorRouteLRU.java | 75 - .../route/strategy/ExecutorRouteLast.java | 19 - .../route/strategy/ExecutorRouteRandom.java | 23 - .../route/strategy/ExecutorRouteRound.java | 48 - .../core/scheduler/MisfireStrategyEnum.java | 39 - .../core/scheduler/ScheduleTypeEnum.java | 46 - .../admin/core/scheduler/XxlJobScheduler.java | 101 - .../admin/core/thread/JobCompleteHelper.java | 193 - .../core/thread/JobFailMonitorHelper.java | 132 - .../admin/core/thread/JobLogReportHelper.java | 170 - .../admin/core/thread/JobRegistryHelper.java | 221 - .../admin/core/thread/JobScheduleHelper.java | 414 - .../core/thread/JobTriggerPoolHelper.java | 135 - .../admin/core/trigger/TriggerTypeEnum.java | 26 - .../job/admin/core/trigger/XxlJobTrigger.java | 252 - .../xxl/job/admin/core/util/CookieUtil.java | 95 - .../com/xxl/job/admin/core/util/FtlUtil.java | 34 - .../com/xxl/job/admin/core/util/I18nUtil.java | 81 - .../xxl/job/admin/core/util/JacksonUtil.java | 100 - .../job/admin/core/util/LocalCacheUtil.java | 134 - .../com/xxl/job/admin/dao/XxlJobGroupDao.java | 33 - .../com/xxl/job/admin/dao/XxlJobInfoDao.java | 43 - .../com/xxl/job/admin/dao/XxlJobLogDao.java | 55 - .../xxl/job/admin/dao/XxlJobLogGlueDao.java | 25 - .../xxl/job/admin/dao/XxlJobLogReportDao.java | 27 - .../xxl/job/admin/dao/XxlJobRegistryDao.java | 31 - .../com/xxl/job/admin/dao/XxlJobUserDao.java | 29 - .../xxl/job/admin/service/LoginService.java | 105 - .../xxl/job/admin/service/XxlJobService.java | 78 - .../job/admin/service/impl/AdminBizImpl.java | 34 - .../admin/service/impl/XxlJobServiceImpl.java | 495 - .../main/resources/i18n/message_en.properties | 276 - .../resources/i18n/message_zh_CN.properties | 276 - .../resources/i18n/message_zh_TC.properties | 276 - .../mybatis-mapper/XxlJobGroupMapper.xml | 91 - .../mybatis-mapper/XxlJobInfoMapper.xml | 240 - .../mybatis-mapper/XxlJobLogGlueMapper.xml | 71 - .../mybatis-mapper/XxlJobLogMapper.xml | 273 - .../mybatis-mapper/XxlJobLogReportMapper.xml | 62 - .../mybatis-mapper/XxlJobRegistryMapper.xml | 62 - .../mybatis-mapper/XxlJobUserMapper.xml | 87 - .../Ionicons/css/ionicons.min.css | 11 - .../Ionicons/fonts/ionicons.eot | Bin 120724 -> 0 bytes .../Ionicons/fonts/ionicons.svg | 2230 ---- .../Ionicons/fonts/ionicons.ttf | Bin 188508 -> 0 bytes .../Ionicons/fonts/ionicons.woff | Bin 67904 -> 0 bytes .../bower_components/PACE/pace.min.js | 2 - .../PACE/themes/blue/pace-theme-flash.css | 77 - .../daterangepicker.css | 269 - .../daterangepicker.js | 1653 --- .../bootstrap/css/bootstrap.min.css | 6 - .../bootstrap/css/bootstrap.min.css.map | 1 - .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../bootstrap/js/bootstrap.min.js | 6 - .../css/dataTables.bootstrap.min.css | 1 - .../js/dataTables.bootstrap.min.js | 8 - .../js/jquery.dataTables.min.js | 166 - .../bower_components/fastclick/fastclick.js | 841 -- .../font-awesome/css/font-awesome.css.map | 7 - .../font-awesome/css/font-awesome.min.css | 4 - .../font-awesome/fonts/FontAwesome.otf | Bin 134808 -> 0 bytes .../fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../fonts/fontawesome-webfont.svg | 2671 ----- .../fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes .../jquery.slimscroll.min.js | 16 - .../bower_components/jquery/jquery.min.js | 2 - .../bower_components/moment/moment.min.js | 1 - .../static/adminlte/dist/css/AdminLTE.min.css | 8 - .../dist/css/skins/_all-skins.min.css | 1 - .../static/adminlte/dist/js/adminlte.min.js | 13 - .../adminlte/plugins/iCheck/icheck.min.js | 10 - .../adminlte/plugins/iCheck/square/blue.css | 62 - .../adminlte/plugins/iCheck/square/blue.png | Bin 2185 -> 0 bytes .../plugins/iCheck/square/blue@2x.png | Bin 4485 -> 0 bytes .../src/main/resources/static/favicon.ico | Bin 4286 -> 0 bytes .../src/main/resources/static/js/common.1.js | 156 - .../src/main/resources/static/js/index.js | 207 - .../resources/static/js/jobcode.index.1.js | 97 - .../resources/static/js/jobgroup.index.1.js | 359 - .../resources/static/js/jobinfo.index.1.js | 739 -- .../resources/static/js/joblog.detail.1.js | 89 - .../resources/static/js/joblog.index.1.js | 396 - .../src/main/resources/static/js/login.1.js | 66 - .../main/resources/static/js/user.index.1.js | 328 - .../codemirror/addon/hint/anyword-hint.js | 41 - .../codemirror/addon/hint/show-hint.css | 36 - .../codemirror/addon/hint/show-hint.js | 434 - .../plugins/codemirror/lib/codemirror.css | 346 - .../plugins/codemirror/lib/codemirror.js | 9698 ----------------- .../plugins/codemirror/mode/clike/clike.js | 879 -- .../codemirror/mode/javascript/javascript.js | 899 -- .../static/plugins/codemirror/mode/php/php.js | 234 - .../codemirror/mode/powershell/powershell.js | 398 - .../plugins/codemirror/mode/python/python.js | 409 - .../plugins/codemirror/mode/shell/shell.js | 152 - .../static/plugins/cronGen/cronGen.js | 1106 -- .../static/plugins/cronGen/cronGen_en.js | 1106 -- .../plugins/echarts/echarts.common.min.js | 22 - .../static/plugins/jquery/jquery.cookie.js | 117 - .../plugins/jquery/jquery.validate.min.js | 4 - .../resources/static/plugins/layer/layer.js | 2 - .../plugins/layer/theme/default/icon-ext.png | Bin 5911 -> 0 bytes .../plugins/layer/theme/default/icon.png | Bin 11493 -> 0 bytes .../plugins/layer/theme/default/layer.css | 1 - .../plugins/layer/theme/default/loading-0.gif | Bin 5793 -> 0 bytes .../plugins/layer/theme/default/loading-1.gif | Bin 701 -> 0 bytes .../plugins/layer/theme/default/loading-2.gif | Bin 1787 -> 0 bytes .../templates/common/common.exception.ftl | 31 - .../templates/common/common.macro.ftl | 239 - .../src/main/resources/templates/help.ftl | 47 - .../src/main/resources/templates/index.ftl | 147 - .../templates/jobcode/jobcode.index.ftl | 164 - .../templates/jobgroup/jobgroup.index.ftl | 172 - .../templates/jobinfo/jobinfo.index.ftl | 540 - .../templates/joblog/joblog.detail.ftl | 70 - .../templates/joblog/joblog.index.ftl | 180 - .../src/main/resources/templates/login.ftl | 45 - .../resources/templates/user/user.index.ftl | 188 - pig-visual/pom.xml | 5 +- pom.xml | 4 +- 695 files changed, 12007 insertions(+), 75193 deletions(-) create mode 100644 pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/ClearTtlDataSourceFilter.java create mode 100644 pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsConfTypeEnum.java create mode 100644 pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsJdbcUrlEnum.java rename pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java => pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/config/PigLogProperties.java (39%) create mode 100644 pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogEventSource.java create mode 100644 pig-common/pig-common-log/src/main/resources/META-INF/spring-configuration-metadata.json delete mode 100644 pig-common/pig-common-log/src/main/resources/META-INF/spring.factories create mode 100644 pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonLongArrayTypeHandler.java create mode 100644 pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonStringArrayTypeHandler.java create mode 100755 pig-common/pig-common-oss/pom.xml create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/FileAutoConfiguration.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileProperties.java create mode 100644 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileTemplate.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileAutoConfiguration.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileProperties.java create mode 100644 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileTemplate.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssAutoConfiguration.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssProperties.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java create mode 100755 pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/service/OssTemplate.java create mode 100644 pig-common/pig-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOAuth2AccessTokenResponseHttpMessageConverter.java mode change 100755 => 100644 pig-register/Dockerfile mode change 100755 => 100644 pig-register/pom.xml mode change 100755 => 100644 pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java mode change 100755 => 100644 pig-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java delete mode 100644 pig-register/src/main/resources/META-INF/nacos-default.properties delete mode 100644 pig-register/src/main/resources/META-INF/schema.sql mode change 100755 => 100644 pig-register/src/main/resources/application.yml create mode 100644 pig-register/src/main/resources/conf/announcement.conf mode change 100755 => 100644 pig-register/src/main/resources/nacos-version.txt delete mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/AppSmsDTO.java delete mode 100755 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/RoleDTO.java delete mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDeptService.java mode change 100755 => 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java mode change 100755 => 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java mode change 100755 => 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java create mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/DeptExcelVo.java delete mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/ImageCode.java delete mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/LogVO.java create mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PreLogVO.java create mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVO.java delete mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVo.java delete mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserInfoVO.java delete mode 100644 pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports delete mode 100644 pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/AppController.java rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{SysOauthClientDetailsController.java => SysClientController.java} (36%) create mode 100644 pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMobileController.java create mode 100644 pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysSystemInfoController.java rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/{TokenController.java => SysTokenController.java} (32%) delete mode 100644 pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptRelationMapper.java delete mode 100644 pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptRelationService.java rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/{AppService.java => SysMobileService.java} (78%) delete mode 100644 pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java rename pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/{AppServiceImpl.java => SysMobileServiceImpl.java} (64%) create mode 100644 pig-upms/pig-upms-biz/src/main/resources/file/approle.xlsx create mode 100644 pig-upms/pig-upms-biz/src/main/resources/file/dept.xlsx mode change 100755 => 100644 pig-upms/pig-upms-biz/src/main/resources/logback-spring.xml delete mode 100644 pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptRelationMapper.xml delete mode 100644 pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserRoleMapper.xml rename pig-visual/pig-codegen/src/main/{resources/template/Controller.java.vm => java/com/pig4cloud/pig/codegen/controller/GenFieldTypeController.java} (33%) mode change 100755 => 100644 delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFormConfController.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateGroupController.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFieldType.java delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFormConf.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenGroupEntity.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java create mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTableColumnEntity.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateEntity.java rename pig-visual/pig-codegen/src/main/{resources/template/Entity.java.vm => java/com/pig4cloud/pig/codegen/entity/GenTemplateGroupEntity.java} (53%) mode change 100755 => 100644 create mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDynamicMapper.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFieldTypeMapper.java delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFormConfMapper.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableColumnMapper.java rename pig-visual/pig-codegen/src/main/{resources/template/Mapper.java.vm => java/com/pig4cloud/pig/codegen/mapper/GenTableMapper.java} (80%) mode change 100755 => 100644 create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateGroupMapper.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateMapper.java create mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java delete mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenCodeService.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFieldTypeService.java delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFormConfService.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateGroupService.java rename pig-visual/pig-codegen/src/main/{resources/template/Service.java.vm => java/com/pig4cloud/pig/codegen/service/GenTemplateService.java} (79%) mode change 100755 => 100644 create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenFieldTypeServiceImpl.java delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenFormConfServiceImpl.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenGroupServiceImpl.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableColumnServiceImpl.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateGroupServiceImpl.java rename pig-visual/pig-codegen/src/main/{resources/template/ServiceImpl.java.vm => java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java} (69%) mode change 100755 => 100644 delete mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/AvueGenCodeServiceImpl.java delete mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/EleGenCodeServiceImpl.java delete mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/DictTool.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorFileTypeEnum.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/NamingCaseTool.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VelocityKit.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/SqlDto.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/TemplateGroupDTO.java delete mode 100755 pig-visual/pig-codegen/src/main/resources/generator.properties mode change 100755 => 100644 pig-visual/pig-codegen/src/main/resources/logback-spring.xml rename pig-visual/pig-codegen/src/main/resources/{template/Mapper.xml.vm => mapper/GenFieldTypeMapper.xml} (57%) mode change 100755 => 100644 delete mode 100755 pig-visual/pig-codegen/src/main/resources/mapper/GenFormConfMapper.xml create mode 100644 pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml create mode 100644 pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml create mode 100644 pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateGroupMapper.xml create mode 100644 pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateMapper.xml delete mode 100755 pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMapper.xml create mode 100755 pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml delete mode 100644 pig-visual/pig-codegen/src/main/resources/template/avue/api.js.vm delete mode 100644 pig-visual/pig-codegen/src/main/resources/template/avue/crud.js.vm delete mode 100755 pig-visual/pig-codegen/src/main/resources/template/avue/index.vue.vm create mode 100644 pig-visual/pig-codegen/src/main/resources/template/config.json delete mode 100644 pig-visual/pig-codegen/src/main/resources/template/element/form.vue.vm delete mode 100644 pig-visual/pig-codegen/src/main/resources/template/element/index.vue.vm delete mode 100644 pig-visual/pig-codegen/src/main/resources/template/menu.sql.vm rename pig-visual/{pig-xxl-job-admin => pig-quartz}/Dockerfile (62%) create mode 100644 pig-visual/pig-quartz/pom.xml rename pig-visual/{pig-xxl-job-admin/src/main/java/com/xxl/job/admin/PigXxlJobAdminApplication.java => pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java} (44%) create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/AutowireCapableBeanJobFactory.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigInitQuartzJob.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzCustomizerConfig.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzFactory.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzInvokeFactory.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/JobTypeQuartzEnum.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/PigQuartzEnum.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobController.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobLogController.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJob.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJobLog.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobEvent.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobListener.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogEvent.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogListener.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/exception/TaskException.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobLogMapper.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobMapper.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobLogService.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobService.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobLogServiceImpl.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobServiceImpl.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/RestTaskDemo.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/SpringBeanTaskDemo.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/ITaskInvok.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JarTaskInvok.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/RestTaskInvok.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/SpringBeanTaskInvok.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokFactory.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokUtil.java create mode 100644 pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskUtil.java rename pig-visual/{pig-xxl-job-admin => pig-quartz}/src/main/resources/application.yml (50%) rename pig-visual/{pig-xxl-job-admin => pig-quartz}/src/main/resources/logback-spring.xml (69%) mode change 100755 => 100644 delete mode 100644 pig-visual/pig-sentinel-dashboard/Dockerfile delete mode 100755 pig-visual/pig-sentinel-dashboard/pom.xml delete mode 100755 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/PigSentinelApplication.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java delete mode 100755 pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.gitignore delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.jshintrc delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README.md delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README_zh.md delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/login.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/system.html delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/js/app.vendor.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/gulpfile.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index.htm delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index_dev.htm delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2 delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.woff delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/angular.min.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/license-stat.csv delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/package-lock.json delete mode 100644 pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/package.json delete mode 100644 pig-visual/pig-xxl-job-admin/pom.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java delete mode 100644 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java delete mode 100644 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java delete mode 100644 pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties delete mode 100644 pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/css/ionicons.min.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.eot delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.svg delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.ttf delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.woff delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css.map delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/js/bootstrap.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/fastclick/fastclick.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/css/font-awesome.css.map delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/css/font-awesome.min.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/FontAwesome.otf delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.eot delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.svg delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.ttf delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.woff delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.woff2 delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/jquery/jquery.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/bower_components/moment/moment.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.min.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.min.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/dist/js/adminlte.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/icheck.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.png delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue@2x.png delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/favicon.ico delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/common.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/index.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/jobcode.index.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js delete mode 100644 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.index.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/login.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/js/user.index.1.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/anyword-hint.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/clike/clike.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/javascript/javascript.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/php/php.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/powershell/powershell.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/python/python.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/shell/shell.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen_en.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/echarts/echarts.common.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.cookie.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.validate.min.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/layer.js delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon-ext.png delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon.png delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/layer.css delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-0.gif delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-1.gif delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-2.gif delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/common/common.exception.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/help.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/index.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobcode/jobcode.index.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl delete mode 100644 pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/login.ftl delete mode 100755 pig-visual/pig-xxl-job-admin/src/main/resources/templates/user/user.index.ftl diff --git a/README.md b/README.md index 1071d39d..63afb06e 100644 --- a/README.md +++ b/README.md @@ -41,11 +41,11 @@ | 依赖 | 版本 | |-----------------------------|------------| | Spring Boot | 2.7.13 | -| Spring Cloud | 2021.0.7 | +| Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.3 | | Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.20 | +| hutool | 5.8.1 | ### 模块说明 @@ -60,6 +60,7 @@ pig ├── pig-common-datasource -- 动态数据源包 ├── pig-common-job -- xxl-job 封装 ├── pig-common-log -- 日志服务 + ├── pig-common-oss -- 文件上传工具类 ├── pig-common-mybatis -- mybatis 扩展封装 ├── pig-common-seata -- 分布式事务 ├── pig-common-security -- 安全工具类 @@ -74,8 +75,7 @@ pig └── pig-visual └── pig-monitor -- 服务监控 [5001] ├── pig-codegen -- 图形化代码生成 [5002] - ├── pig-sentinel-dashboard -- 流量高可用 [5003] - └── pig-xxl-job-admin -- 分布式定时任务管理台 [5004] + └── pig-quartz -- 定时任务管理台 [5007] ``` ### 本地开发 运行 diff --git a/db/pig.sql b/db/pig.sql index afa97a07..c42cd8e5 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -2,69 +2,47 @@ DROP DATABASE IF EXISTS `pig`; CREATE DATABASE `pig` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -SET NAMES utf8; +SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; USE `pig`; -DROP TABLE IF EXISTS `sys_dept` ; --- 创建表 `sys_dept` -CREATE TABLE `sys_dept` ( - `dept_id` bigint NOT NULL COMMENT '部门ID', - `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '部门名称', - `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', - `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记 -1:已删除 0:正常', - `parent_id` bigint DEFAULT NULL COMMENT '父部门ID', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`dept_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='部门管理'; -- ---------------------------- --- Records of sys_dept +-- Table structure for sys_dept -- ---------------------------- -BEGIN; -INSERT INTO `sys_dept` VALUES (1, '总经办', 0, '0', 0, '2020-03-13 13:13:16', ' ', '2020-03-13 13:14:31', ' '); -INSERT INTO `sys_dept` VALUES (2, '行政中心', 0, '0', 1, '2020-03-13 13:13:30', ' ', '2021-12-31 06:59:56', ' '); -INSERT INTO `sys_dept` VALUES (3, '技术中心', 0, '0', 1, '2020-03-13 13:14:55', ' ', '2021-12-31 06:59:56', ' '); -INSERT INTO `sys_dept` VALUES (4, '运营中心', 0, '0', 1, '2020-03-13 13:15:15', ' ', '2021-12-31 06:59:56', ' '); -INSERT INTO `sys_dept` VALUES (5, '研发中心', 0, '0', 3, '2020-03-13 13:15:34', ' ', '2021-12-31 06:59:56', ' '); -INSERT INTO `sys_dept` VALUES (6, '产品中心', 0, '0', 3, '2020-03-13 13:15:49', ' ', '2021-12-31 06:59:56', ' '); -INSERT INTO `sys_dept` VALUES (7, '测试中心', 0, '0', 3, '2020-03-13 13:16:02', ' ', '2021-12-31 06:59:56', ' '); -COMMIT; - -DROP TABLE IF EXISTS `sys_dept_relation`; --- 创建表 `sys_dept_relation` -CREATE TABLE `sys_dept_relation` ( - `ancestor` bigint NOT NULL COMMENT '祖先节点', - `descendant` bigint NOT NULL COMMENT '后代节点', - PRIMARY KEY (`ancestor`,`descendant`), - KEY `idx1` (`ancestor`), - KEY `idx2` (`descendant`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='部门关系表'; +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint NOT NULL COMMENT '部门ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '部门名称', + `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `parent_id` bigint DEFAULT NULL COMMENT '父级部门ID', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='部门管理'; -- ---------------------------- --- Records of sys_dept_relation +-- Records of sys_dept -- ---------------------------- BEGIN; -INSERT INTO `sys_dept_relation` VALUES (1, 1); -INSERT INTO `sys_dept_relation` VALUES (1, 2); -INSERT INTO `sys_dept_relation` VALUES (1, 3); -INSERT INTO `sys_dept_relation` VALUES (1, 4); -INSERT INTO `sys_dept_relation` VALUES (1, 5); -INSERT INTO `sys_dept_relation` VALUES (1, 6); -INSERT INTO `sys_dept_relation` VALUES (1, 7); -INSERT INTO `sys_dept_relation` VALUES (2, 2); -INSERT INTO `sys_dept_relation` VALUES (3, 3); -INSERT INTO `sys_dept_relation` VALUES (3, 5); -INSERT INTO `sys_dept_relation` VALUES (3, 6); -INSERT INTO `sys_dept_relation` VALUES (3, 7); -INSERT INTO `sys_dept_relation` VALUES (4, 4); -INSERT INTO `sys_dept_relation` VALUES (5, 5); -INSERT INTO `sys_dept_relation` VALUES (6, 6); -INSERT INTO `sys_dept_relation` VALUES (7, 7); +INSERT INTO `sys_dept` VALUES (1, '总裁办', 1, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:07:49', '0', 0); +INSERT INTO `sys_dept` VALUES (2, '技术部', 2, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1); +INSERT INTO `sys_dept` VALUES (3, '市场部', 3, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1); +INSERT INTO `sys_dept` VALUES (4, '销售部', 4, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1); +INSERT INTO `sys_dept` VALUES (5, '财务部', 5, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1); +INSERT INTO `sys_dept` VALUES (6, '人事行政部', 6, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:53:36', '1', 1); +INSERT INTO `sys_dept` VALUES (7, '研发部', 7, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 2); +INSERT INTO `sys_dept` VALUES (8, 'UI设计部', 11, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 7); +INSERT INTO `sys_dept` VALUES (9, '产品部', 12, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 2); +INSERT INTO `sys_dept` VALUES (10, '渠道部', 13, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 3); +INSERT INTO `sys_dept` VALUES (11, '推广部', 14, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 3); +INSERT INTO `sys_dept` VALUES (12, '客服部', 15, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 4); +INSERT INTO `sys_dept` VALUES (13, '财务会计部', 16, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 5); +INSERT INTO `sys_dept` VALUES (14, '审计风控部', 17, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 14:06:57', '0', 5); COMMIT; -- ---------------------------- @@ -72,33 +50,51 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_dict`; CREATE TABLE `sys_dict` ( - `id` bigint NOT NULL, - `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标识', - `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注', - `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '是否是系统内置', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `sys_dict_del_flag` (`del_flag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='字典表'; + `id` bigint NOT NULL COMMENT '编号', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '系统标志', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE, + KEY `sys_dict_del_flag` (`del_flag`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict -- ---------------------------- BEGIN; -INSERT INTO `sys_dict` VALUES (1, 'dict_type', '字典类型', NULL, '0', '0', '2019-05-16 14:16:20', '', 'admin', '2021-12-29 12:29:18'); -INSERT INTO `sys_dict` VALUES (2, 'log_type', '日志类型', NULL, '0', '0', '2020-03-13 14:21:01', '', 'admin', '2021-12-29 12:30:14'); -INSERT INTO `sys_dict` VALUES (3, 'ds_type', '驱动类型', NULL, '0', '0', '2021-10-15 16:24:35', '', 'admin', '2021-12-29 12:30:18'); -INSERT INTO `sys_dict` VALUES (4, 'param_type', '参数配置', '检索、原文、报表、安全、文档、消息、其他', '1', '0', '2022-03-25 20:51:26', 'admin', 'admin', '2022-03-25 20:51:26'); -INSERT INTO `sys_dict` VALUES (5, 'status_type', '租户状态', '租户状态', '1', '0', '2022-03-25 20:56:51', 'admin', 'admin', '2022-03-25 20:56:51'); -INSERT INTO `sys_dict` VALUES (6, 'menu_type_status', '菜单类型', NULL, '1', '0', '2022-09-18 17:12:05', 'admin', 'admin', '2022-09-18 17:12:05'); -INSERT INTO `sys_dict` VALUES (7, 'dict_css_type', '字典项展示样式', NULL, '1', '0', '2022-09-28 21:37:23', 'admin', 'admin', '2022-09-28 21:37:23'); -INSERT INTO `sys_dict` VALUES (8, 'keepalive_status', '菜单是否开启缓冲', NULL, '1', '0', '2022-09-28 21:46:12', 'admin', 'admin', '2022-09-28 21:46:12'); -INSERT INTO `sys_dict` VALUES (9, 'user_lock_flag', '用户锁定标记', NULL, '1', '0', '2022-09-28 21:51:39', 'admin', 'admin', '2022-09-28 21:51:39'); +INSERT INTO `sys_dict` VALUES (1, 'log_type', '日志类型', ' ', ' ', '2019-03-19 11:06:44', '2019-03-19 11:06:44', '异常、正常', '1', '0'); +INSERT INTO `sys_dict` VALUES (2, 'social_type', '社交登录', ' ', ' ', '2019-03-19 11:09:44', '2019-03-19 11:09:44', '微信、QQ', '1', '0'); +INSERT INTO `sys_dict` VALUES (3, 'job_type', '定时任务类型', ' ', ' ', '2019-03-19 11:22:21', '2019-03-19 11:22:21', 'quartz', '1', '0'); +INSERT INTO `sys_dict` VALUES (4, 'job_status', '定时任务状态', ' ', ' ', '2019-03-19 11:24:57', '2019-03-19 11:24:57', '发布状态、运行状态', '1', '0'); +INSERT INTO `sys_dict` VALUES (5, 'job_execute_status', '定时任务执行状态', ' ', ' ', '2019-03-19 11:26:15', '2019-03-19 11:26:15', '正常、异常', '1', '0'); +INSERT INTO `sys_dict` VALUES (6, 'misfire_policy', '定时任务错失执行策略', ' ', ' ', '2019-03-19 11:27:19', '2019-03-19 11:27:19', '周期', '1', '0'); +INSERT INTO `sys_dict` VALUES (7, 'gender', '性别', ' ', ' ', '2019-03-27 13:44:06', '2019-03-27 13:44:06', '微信用户性别', '1', '0'); +INSERT INTO `sys_dict` VALUES (8, 'subscribe', '订阅状态', ' ', ' ', '2019-03-27 13:48:33', '2019-03-27 13:48:33', '公众号订阅状态', '1', '0'); +INSERT INTO `sys_dict` VALUES (9, 'response_type', '回复', ' ', ' ', '2019-03-28 21:29:21', '2019-03-28 21:29:21', '微信消息是否已回复', '1', '0'); +INSERT INTO `sys_dict` VALUES (10, 'param_type', '参数配置', ' ', ' ', '2019-04-29 18:20:47', '2019-04-29 18:20:47', '检索、原文、报表、安全、文档、消息、其他', '1', '0'); +INSERT INTO `sys_dict` VALUES (11, 'status_type', '租户状态', ' ', ' ', '2019-05-15 16:31:08', '2019-05-15 16:31:08', '租户状态', '1', '0'); +INSERT INTO `sys_dict` VALUES (12, 'dict_type', '字典类型', ' ', ' ', '2019-05-16 14:16:20', '2019-05-16 14:20:16', '系统类不能修改', '1', '0'); +INSERT INTO `sys_dict` VALUES (13, 'channel_type', '支付类型', ' ', ' ', '2019-05-16 14:16:20', '2019-05-16 14:20:16', '系统类不能修改', '1', '0'); +INSERT INTO `sys_dict` VALUES (14, 'grant_types', '授权类型', ' ', ' ', '2019-08-13 07:34:10', '2019-08-13 07:34:10', NULL, '1', '0'); +INSERT INTO `sys_dict` VALUES (15, 'style_type', '前端风格', ' ', ' ', '2020-02-07 03:49:28', '2020-02-07 03:50:40', '0-Avue 1-element', '1', '0'); +INSERT INTO `sys_dict` VALUES (16, 'captcha_flag_types', '验证码开关', ' ', ' ', '2020-11-18 06:53:25', '2020-11-18 06:53:25', '是否校验验证码', '1', '0'); +INSERT INTO `sys_dict` VALUES (17, 'enc_flag_types', '前端密码加密', ' ', ' ', '2020-11-18 06:54:44', '2020-11-18 06:54:44', '前端密码是否加密传输', '1', '0'); +INSERT INTO `sys_dict` VALUES (18, 'lock_flag', '用户状态', 'admin', ' ', '2023-02-01 16:55:31', NULL, NULL, '1', '0'); +INSERT INTO `sys_dict` VALUES (19, 'ds_config_type', '数据连接类型', 'admin', ' ', '2023-02-06 18:36:59', NULL, NULL, '1', '0'); +INSERT INTO `sys_dict` VALUES (20, 'common_status', '通用状态', 'admin', ' ', '2023-02-09 11:02:08', NULL, NULL, '1', '0'); +INSERT INTO `sys_dict` VALUES (21, 'app_social_type', 'app社交登录', 'admin', ' ', '2023-02-10 11:11:06', NULL, 'app社交登录', '1', '0'); +INSERT INTO `sys_dict` VALUES (22, 'yes_no_type', '是否', 'admin', ' ', '2023-02-20 23:25:04', NULL, NULL, '1', '0'); +INSERT INTO `sys_dict` VALUES (23, 'repType', '微信消息类型', 'admin', ' ', '2023-02-24 15:08:25', NULL, NULL, '0', '0'); +INSERT INTO `sys_dict` VALUES (24, 'leave_status', '请假状态', 'admin', ' ', '2023-03-02 22:50:15', NULL, NULL, '0', '0'); +INSERT INTO `sys_dict` VALUES (25, 'schedule_type', '日程类型', 'admin', ' ', '2023-03-06 14:49:18', NULL, NULL, '0', '0'); +INSERT INTO `sys_dict` VALUES (26, 'schedule_status', '日程状态', 'admin', ' ', '2023-03-06 14:52:57', NULL, NULL, '0', '0'); +INSERT INTO `sys_dict` VALUES (27, 'ds_type', '代码生成器支持的数据库类型', 'admin', ' ', '2023-03-12 09:57:59', NULL, NULL, '1', '0'); COMMIT; -- ---------------------------- @@ -106,113 +102,134 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_dict_item`; CREATE TABLE `sys_dict_item` ( - `id` bigint NOT NULL, - `dict_id` bigint NOT NULL COMMENT '字典ID', - `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字典标识', - `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '值', - `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标签', - `type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字典类型', - `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', - `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序(升序)', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT ' ' COMMENT '备注', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `sys_dict_value` (`value`) USING BTREE, - KEY `sys_dict_label` (`label`) USING BTREE, - KEY `sys_dict_del_flag` (`del_flag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='字典项'; + `id` bigint NOT NULL COMMENT '编号', + `dict_id` bigint NOT NULL COMMENT '字典ID', + `item_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典项值', + `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典项名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典项描述', + `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序(升序)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE, + KEY `sys_dict_value` (`item_value`) USING BTREE, + KEY `sys_dict_label` (`label`) USING BTREE, + KEY `sys_dict_item_del_flag` (`del_flag`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典项'; -- ---------------------------- -- Records of sys_dict_item -- ---------------------------- BEGIN; -INSERT INTO `sys_dict_item` VALUES (1, 1, 'dict_type', '1', '系统类', NULL, '系统类字典', 0, ' ', '0', '2019-05-16 14:20:40', NULL, NULL, '2019-05-16 14:20:40'); -INSERT INTO `sys_dict_item` VALUES (2, 1, 'dict_type', '0', '业务类', NULL, '业务类字典', 0, ' ', '0', '2019-05-16 14:20:59', NULL, NULL, '2019-05-16 14:20:59'); -INSERT INTO `sys_dict_item` VALUES (3, 2, 'log_type', '0', '正常', NULL, '正常', 0, ' ', '0', '2020-03-13 14:23:22', NULL, NULL, '2020-03-13 14:23:22'); -INSERT INTO `sys_dict_item` VALUES (4, 2, 'log_type', '9', '异常', NULL, '异常', 0, ' ', '0', '2020-03-13 14:23:35', NULL, NULL, '2020-03-13 14:23:35'); -INSERT INTO `sys_dict_item` VALUES (5, 3, 'ds_type', 'com.mysql.cj.jdbc.Driver', 'MYSQL8', NULL, 'MYSQL8', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (6, 3, 'ds_type', 'com.mysql.jdbc.Driver', 'MYSQL5', NULL, 'MYSQL5', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (7, 3, 'ds_type', 'oracle.jdbc.OracleDriver', 'Oracle', NULL, 'Oracle', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (8, 3, 'ds_type', 'org.mariadb.jdbc.Driver', 'mariadb', NULL, 'mariadb', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (9, 3, 'ds_type', 'com.microsoft.sqlserver.jdbc.SQLServerDriver', 'sqlserver2005+', NULL, 'sqlserver2005+', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (10, 3, 'ds_type', 'com.microsoft.jdbc.sqlserver.SQLServerDriver', 'sqlserver2000', NULL, 'sqlserver2000', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (11, 3, 'ds_type', 'com.ibm.db2.jcc.DB2Driver', 'db2', NULL, 'db2', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (12, 3, 'ds_type', 'org.postgresql.Driver', 'postgresql', NULL, 'postgresql', 0, ' ', '0', NULL, NULL, NULL, NULL); -INSERT INTO `sys_dict_item` VALUES (13, 4, 'param_type', '1', '检索', NULL, '检索', 0, '检索', '0', '2022-03-25 20:51:51', 'admin', 'admin', '2022-03-25 20:51:51'); -INSERT INTO `sys_dict_item` VALUES (14, 4, 'param_type', '2', '原文', NULL, '原文', 1, '原文', '0', '2022-03-25 20:52:06', 'admin', 'admin', '2022-03-25 20:52:06'); -INSERT INTO `sys_dict_item` VALUES (15, 4, 'param_type', '3', '报表', NULL, '报表', 2, '报表', '0', '2022-03-25 20:52:16', 'admin', 'admin', '2022-03-25 20:52:16'); -INSERT INTO `sys_dict_item` VALUES (16, 4, 'param_type', '4', '安全', NULL, '安全', 3, '安全', '0', '2022-03-25 20:52:32', 'admin', 'admin', '2022-03-25 20:52:32'); -INSERT INTO `sys_dict_item` VALUES (17, 4, 'param_type', '5', '文档', NULL, '文档', 4, '文档', '0', '2022-03-25 20:52:52', 'admin', 'admin', '2022-03-25 20:52:52'); -INSERT INTO `sys_dict_item` VALUES (18, 4, 'param_type', '6', '消息', NULL, '消息', 5, '消息', '0', '2022-03-25 20:53:07', 'admin', 'admin', '2022-03-25 20:53:07'); -INSERT INTO `sys_dict_item` VALUES (19, 4, 'param_type', '9', '其他', NULL, '其他', 6, '其他', '0', '2022-03-25 20:54:50', 'admin', 'admin', '2022-03-25 20:54:50'); -INSERT INTO `sys_dict_item` VALUES (20, 4, 'param_type', '0', '默认', NULL, '默认', 7, '默认', '0', '2022-03-25 20:55:23', 'admin', 'admin', '2022-03-25 20:55:23'); -INSERT INTO `sys_dict_item` VALUES (21, 5, 'status_type', '0', '正常', NULL, '状态正常', 0, '状态正常', '0', '2022-03-25 20:57:12', 'admin', 'admin', '2022-03-25 20:57:12'); -INSERT INTO `sys_dict_item` VALUES (22, 5, 'status_type', '9', '冻结', NULL, '状态冻结', 1, '状态冻结', '0', '2022-03-25 20:57:34', 'admin', 'admin', '2022-03-25 20:57:34'); -INSERT INTO `sys_dict_item` VALUES (23, 6, 'menu_type_status', '0', '菜单', NULL, '菜单', 0, ' ', '0', '2022-09-18 17:15:52', 'admin', 'admin', '2022-09-18 17:15:52'); -INSERT INTO `sys_dict_item` VALUES (24, 6, 'menu_type_status', '1', '按钮', 'success', '按钮', 1, ' ', '0', '2022-09-18 17:16:06', 'admin', 'admin', '2022-09-18 17:16:06'); -INSERT INTO `sys_dict_item` VALUES (25, 7, 'dict_css_type', 'success', 'success', 'success', 'success', 2, ' ', '0', '2022-09-28 21:41:49', 'admin', 'admin', '2022-09-28 21:41:49'); -INSERT INTO `sys_dict_item` VALUES (26, 7, 'dict_css_type', 'info', 'info', 'info', 'info', 3, ' ', '0', '2022-09-28 21:41:59', 'admin', 'admin', '2022-09-28 21:41:59'); -INSERT INTO `sys_dict_item` VALUES (27, 7, 'dict_css_type', 'warning', 'warning', 'warning', 'warning', 4, ' ', '0', '2022-09-28 21:42:09', 'admin', 'admin', '2022-09-28 21:42:09'); -INSERT INTO `sys_dict_item` VALUES (28, 7, 'dict_css_type', 'danger', 'danger', 'danger', 'danger', 5, ' ', '0', '2022-09-28 21:42:19', 'admin', 'admin', '2022-09-28 21:42:19'); -INSERT INTO `sys_dict_item` VALUES (29, 8, 'keepalive_status', '0', '否', 'info', '不开启缓冲', 0, ' ', '0', '2022-09-28 21:46:32', 'admin', 'admin', '2022-09-28 21:46:32'); -INSERT INTO `sys_dict_item` VALUES (30, 8, 'keepalive_status', '1', '是', NULL, '开启缓冲', 1, ' ', '0', '2022-09-28 21:46:54', 'admin', 'admin', '2022-09-28 21:46:54'); -INSERT INTO `sys_dict_item` VALUES (31, 9, 'user_lock_flag', '0', '正常', NULL, '正常状态', 0, ' ', '0', '2022-09-28 21:51:55', 'admin', 'admin', '2022-09-28 21:51:55'); -INSERT INTO `sys_dict_item` VALUES (32, 9, 'user_lock_flag', '9', '锁定', 'info', '已锁定', 9, ' ', '0', '2022-09-28 21:52:13', 'admin', 'admin', '2022-09-28 21:52:13'); -COMMIT; - - --- ---------------------------- --- Table structure for sys_public_param --- ---------------------------- -DROP TABLE IF EXISTS `sys_public_param`; --- 创建表 `sys_public_param` -CREATE TABLE `sys_public_param` ( - `public_id` bigint(0) NOT NULL COMMENT '编号', - `public_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数名称', - `public_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数键名', - `public_value` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数键值', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '状态,1-启用,0-禁用', - `validate_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '校验码', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '修改人', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', - `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', - `public_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '参数类型,1-系统参数,2-业务参数', - `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '是否为系统内置参数,1-是,0-否', - PRIMARY KEY (`public_id`) USING BTREE -) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公共参数配置表'; - --- ---------------------------- --- Records of sys_public_param --- ---------------------------- -BEGIN; -INSERT INTO `sys_public_param` VALUES (1, '接口文档不显示的字段', 'GEN_HIDDEN_COLUMNS', 'tenant_id', '0', '', ' ', ' ', '2020-05-12 04:25:19', NULL, '9', '1'); -INSERT INTO `sys_public_param` VALUES (2, '注册用户默认角色', 'USER_DEFAULT_ROLE', 'GENERAL_USER', '0', '', 'admin', 'admin', '2022-03-30 10:00:57', '2022-03-30 02:05:59', '2', '1'); +INSERT INTO `sys_dict_item` VALUES (1, 1, '9', '异常', 'log_type', '日志异常', 1, ' ', ' ', '2019-03-19 11:08:59', '2019-03-25 12:49:13', '', '0'); +INSERT INTO `sys_dict_item` VALUES (2, 1, '0', '正常', 'log_type', '日志正常', 0, ' ', ' ', '2019-03-19 11:09:17', '2019-03-25 12:49:18', '', '0'); +INSERT INTO `sys_dict_item` VALUES (3, 2, 'WX', '微信', 'social_type', '微信登录', 0, ' ', ' ', '2019-03-19 11:10:02', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (4, 2, 'QQ', 'QQ', 'social_type', 'QQ登录', 1, ' ', ' ', '2019-03-19 11:10:14', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (5, 3, '1', 'java类', 'job_type', 'java类', 1, ' ', ' ', '2019-03-19 11:22:37', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (6, 3, '2', 'spring bean', 'job_type', 'spring bean容器实例', 2, ' ', ' ', '2019-03-19 11:23:05', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (7, 3, '9', '其他', 'job_type', '其他类型', 9, ' ', ' ', '2019-03-19 11:23:31', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (8, 3, '3', 'Rest 调用', 'job_type', 'Rest 调用', 3, ' ', ' ', '2019-03-19 11:23:57', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (9, 3, '4', 'jar', 'job_type', 'jar类型', 4, ' ', ' ', '2019-03-19 11:24:20', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (10, 4, '1', '未发布', 'job_status', '未发布', 1, ' ', ' ', '2019-03-19 11:25:18', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (11, 4, '2', '运行中', 'job_status', '运行中', 2, ' ', ' ', '2019-03-19 11:25:31', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (12, 4, '3', '暂停', 'job_status', '暂停', 3, ' ', ' ', '2019-03-19 11:25:42', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (13, 5, '0', '正常', 'job_execute_status', '正常', 0, ' ', ' ', '2019-03-19 11:26:27', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (14, 5, '1', '异常', 'job_execute_status', '异常', 1, ' ', ' ', '2019-03-19 11:26:41', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (15, 6, '1', '错失周期立即执行', 'misfire_policy', '错失周期立即执行', 1, ' ', ' ', '2019-03-19 11:27:45', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (16, 6, '2', '错失周期执行一次', 'misfire_policy', '错失周期执行一次', 2, ' ', ' ', '2019-03-19 11:27:57', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (17, 6, '3', '下周期执行', 'misfire_policy', '下周期执行', 3, ' ', ' ', '2019-03-19 11:28:08', '2019-03-25 12:49:36', '', '0'); +INSERT INTO `sys_dict_item` VALUES (18, 7, '1', '男', 'gender', '微信-男', 0, ' ', ' ', '2019-03-27 13:45:13', '2019-03-27 13:45:13', '微信-男', '0'); +INSERT INTO `sys_dict_item` VALUES (19, 7, '2', '女', 'gender', '女-微信', 1, ' ', ' ', '2019-03-27 13:45:34', '2019-03-27 13:45:34', '女-微信', '0'); +INSERT INTO `sys_dict_item` VALUES (20, 7, '0', '未知', 'gender', 'x性别未知', 3, ' ', ' ', '2019-03-27 13:45:57', '2019-03-27 13:45:57', 'x性别未知', '0'); +INSERT INTO `sys_dict_item` VALUES (21, 8, '0', '未关注', 'subscribe', '公众号-未关注', 0, ' ', ' ', '2019-03-27 13:49:07', '2019-03-27 13:49:07', '公众号-未关注', '0'); +INSERT INTO `sys_dict_item` VALUES (22, 8, '1', '已关注', 'subscribe', '公众号-已关注', 1, ' ', ' ', '2019-03-27 13:49:26', '2019-03-27 13:49:26', '公众号-已关注', '0'); +INSERT INTO `sys_dict_item` VALUES (23, 9, '0', '未回复', 'response_type', '微信消息-未回复', 0, ' ', ' ', '2019-03-28 21:29:47', '2019-03-28 21:29:47', '微信消息-未回复', '0'); +INSERT INTO `sys_dict_item` VALUES (24, 9, '1', '已回复', 'response_type', '微信消息-已回复', 1, ' ', ' ', '2019-03-28 21:30:08', '2019-03-28 21:30:08', '微信消息-已回复', '0'); +INSERT INTO `sys_dict_item` VALUES (25, 10, '1', '检索', 'param_type', '检索', 0, ' ', ' ', '2019-04-29 18:22:17', '2019-04-29 18:22:17', '检索', '0'); +INSERT INTO `sys_dict_item` VALUES (26, 10, '2', '原文', 'param_type', '原文', 0, ' ', ' ', '2019-04-29 18:22:27', '2019-04-29 18:22:27', '原文', '0'); +INSERT INTO `sys_dict_item` VALUES (27, 10, '3', '报表', 'param_type', '报表', 0, ' ', ' ', '2019-04-29 18:22:36', '2019-04-29 18:22:36', '报表', '0'); +INSERT INTO `sys_dict_item` VALUES (28, 10, '4', '安全', 'param_type', '安全', 0, ' ', ' ', '2019-04-29 18:22:46', '2019-04-29 18:22:46', '安全', '0'); +INSERT INTO `sys_dict_item` VALUES (29, 10, '5', '文档', 'param_type', '文档', 0, ' ', ' ', '2019-04-29 18:22:56', '2019-04-29 18:22:56', '文档', '0'); +INSERT INTO `sys_dict_item` VALUES (30, 10, '6', '消息', 'param_type', '消息', 0, ' ', ' ', '2019-04-29 18:23:05', '2019-04-29 18:23:05', '消息', '0'); +INSERT INTO `sys_dict_item` VALUES (31, 10, '9', '其他', 'param_type', '其他', 0, ' ', ' ', '2019-04-29 18:23:16', '2019-04-29 18:23:16', '其他', '0'); +INSERT INTO `sys_dict_item` VALUES (32, 10, '0', '默认', 'param_type', '默认', 0, ' ', ' ', '2019-04-29 18:23:30', '2019-04-29 18:23:30', '默认', '0'); +INSERT INTO `sys_dict_item` VALUES (33, 11, '0', '正常', 'status_type', '状态正常', 0, ' ', ' ', '2019-05-15 16:31:34', '2019-05-16 22:30:46', '状态正常', '0'); +INSERT INTO `sys_dict_item` VALUES (34, 11, '9', '冻结', 'status_type', '状态冻结', 1, ' ', ' ', '2019-05-15 16:31:56', '2019-05-16 22:30:50', '状态冻结', '0'); +INSERT INTO `sys_dict_item` VALUES (35, 12, '1', '系统类', 'dict_type', '系统类字典', 0, ' ', ' ', '2019-05-16 14:20:40', '2019-05-16 14:20:40', '不能修改删除', '0'); +INSERT INTO `sys_dict_item` VALUES (36, 12, '0', '业务类', 'dict_type', '业务类字典', 0, ' ', ' ', '2019-05-16 14:20:59', '2019-05-16 14:20:59', '可以修改', '0'); +INSERT INTO `sys_dict_item` VALUES (37, 2, 'GITEE', '码云', 'social_type', '码云', 2, ' ', ' ', '2019-06-28 09:59:12', '2019-06-28 09:59:12', '码云', '0'); +INSERT INTO `sys_dict_item` VALUES (38, 2, 'OSC', '开源中国', 'social_type', '开源中国登录', 2, ' ', ' ', '2019-06-28 10:04:32', '2019-06-28 10:04:32', '', '0'); +INSERT INTO `sys_dict_item` VALUES (39, 14, 'password', '密码模式', 'grant_types', '支持oauth密码模式', 0, ' ', ' ', '2019-08-13 07:35:28', '2019-08-13 07:35:28', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (40, 14, 'authorization_code', '授权码模式', 'grant_types', 'oauth2 授权码模式', 1, ' ', ' ', '2019-08-13 07:36:07', '2019-08-13 07:36:07', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (41, 14, 'client_credentials', '客户端模式', 'grant_types', 'oauth2 客户端模式', 2, ' ', ' ', '2019-08-13 07:36:30', '2019-08-13 07:36:30', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (42, 14, 'refresh_token', '刷新模式', 'grant_types', 'oauth2 刷新token', 3, ' ', ' ', '2019-08-13 07:36:54', '2019-08-13 07:36:54', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (43, 14, 'implicit', '简化模式', 'grant_types', 'oauth2 简化模式', 4, ' ', ' ', '2019-08-13 07:39:32', '2019-08-13 07:39:32', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (44, 15, '0', 'Avue', 'style_type', 'Avue风格', 0, ' ', ' ', '2020-02-07 03:52:52', '2020-02-07 03:52:52', '', '0'); +INSERT INTO `sys_dict_item` VALUES (45, 15, '1', 'element', 'style_type', 'element-ui', 1, ' ', ' ', '2020-02-07 03:53:12', '2020-02-07 03:53:12', '', '0'); +INSERT INTO `sys_dict_item` VALUES (46, 16, '0', '关', 'captcha_flag_types', '不校验验证码', 0, ' ', ' ', '2020-11-18 06:53:58', '2020-11-18 06:53:58', '不校验验证码 -0', '0'); +INSERT INTO `sys_dict_item` VALUES (47, 16, '1', '开', 'captcha_flag_types', '校验验证码', 1, ' ', ' ', '2020-11-18 06:54:15', '2020-11-18 06:54:15', '不校验验证码-1', '0'); +INSERT INTO `sys_dict_item` VALUES (48, 17, '0', '否', 'enc_flag_types', '不加密', 0, ' ', ' ', '2020-11-18 06:55:31', '2020-11-18 06:55:31', '不加密-0', '0'); +INSERT INTO `sys_dict_item` VALUES (49, 17, '1', '是', 'enc_flag_types', '加密', 1, ' ', ' ', '2020-11-18 06:55:51', '2020-11-18 06:55:51', '加密-1', '0'); +INSERT INTO `sys_dict_item` VALUES (50, 13, 'MERGE_PAY', '聚合支付', 'channel_type', '聚合支付', 1, ' ', ' ', '2019-05-30 19:08:08', '2019-06-18 13:51:53', '聚合支付', '0'); +INSERT INTO `sys_dict_item` VALUES (51, 2, 'CAS', 'CAS登录', 'social_type', 'CAS 单点登录系统', 3, ' ', ' ', '2022-02-18 13:56:25', '2022-02-18 13:56:28', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (52, 2, 'DINGTALK', '钉钉', 'social_type', '钉钉', 3, ' ', ' ', '2022-02-18 13:56:25', '2022-02-18 13:56:28', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (53, 2, 'WEIXIN_CP', '企业微信', 'social_type', '企业微信', 3, ' ', ' ', '2022-02-18 13:56:25', '2022-02-18 13:56:28', NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (54, 15, '2', 'APP', 'style_type', 'uview风格', 1, ' ', ' ', '2020-02-07 03:53:12', '2020-02-07 03:53:12', '', '0'); +INSERT INTO `sys_dict_item` VALUES (55, 13, 'ALIPAY_WAP', '支付宝支付', 'channel_type', '支付宝支付', 1, ' ', ' ', '2019-05-30 19:08:08', '2019-06-18 13:51:53', '聚合支付', '0'); +INSERT INTO `sys_dict_item` VALUES (56, 13, 'WEIXIN_MP', '微信支付', 'channel_type', '微信支付', 1, ' ', ' ', '2019-05-30 19:08:08', '2019-06-18 13:51:53', '聚合支付', '0'); +INSERT INTO `sys_dict_item` VALUES (57, 14, 'mobile', 'mobile', 'grant_types', '移动端登录', 5, 'admin', ' ', '2023-01-29 17:21:42', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (58, 18, '0', '有效', 'lock_flag', '有效', 0, 'admin', ' ', '2023-02-01 16:56:00', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (59, 18, '9', '禁用', 'lock_flag', '禁用', 1, 'admin', ' ', '2023-02-01 16:56:09', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (60, 15, '4', 'vue3', 'style_type', 'element-plus', 4, 'admin', ' ', '2023-02-06 13:52:43', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (61, 19, '0', '主机', 'ds_config_type', '主机', 0, 'admin', ' ', '2023-02-06 18:37:23', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (62, 19, '1', 'JDBC', 'ds_config_type', 'jdbc', 2, 'admin', ' ', '2023-02-06 18:37:34', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (63, 20, 'false', '否', 'common_status', '否', 1, 'admin', ' ', '2023-02-09 11:02:39', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (64, 20, 'true', '是', 'common_status', '是', 2, 'admin', ' ', '2023-02-09 11:02:52', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (65, 21, 'MINI', '小程序', 'app_social_type', '小程序登录', 0, 'admin', ' ', '2023-02-10 11:11:41', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (66, 22, '0', '否', 'yes_no_type', '0', 0, 'admin', ' ', '2023-02-20 23:35:23', NULL, '0', '0'); +INSERT INTO `sys_dict_item` VALUES (67, 22, '1', '是', 'yes_no_type', '1', 0, 'admin', ' ', '2023-02-20 23:35:37', NULL, '1', '0'); +INSERT INTO `sys_dict_item` VALUES (69, 23, 'text', '文本', 'repType', '文本', 0, 'admin', ' ', '2023-02-24 15:08:45', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (70, 23, 'image', '图片', 'repType', '图片', 0, 'admin', ' ', '2023-02-24 15:08:56', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (71, 23, 'voice', '语音', 'repType', '语音', 0, 'admin', ' ', '2023-02-24 15:09:08', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (72, 23, 'video', '视频', 'repType', '视频', 0, 'admin', ' ', '2023-02-24 15:09:18', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (73, 23, 'shortvideo', '小视频', 'repType', '小视频', 0, 'admin', ' ', '2023-02-24 15:09:29', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (74, 23, 'location', '地理位置', 'repType', '地理位置', 0, 'admin', ' ', '2023-02-24 15:09:41', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (75, 23, 'link', '链接消息', 'repType', '链接消息', 0, 'admin', ' ', '2023-02-24 15:09:49', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (76, 23, 'event', '事件推送', 'repType', '事件推送', 0, 'admin', ' ', '2023-02-24 15:09:57', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (77, 24, '0', '未提交', 'leave_status', '未提交', 0, 'admin', ' ', '2023-03-02 22:50:45', NULL, '未提交', '0'); +INSERT INTO `sys_dict_item` VALUES (78, 24, '1', '审批中', 'leave_status', '审批中', 0, 'admin', ' ', '2023-03-02 22:50:57', NULL, '审批中', '0'); +INSERT INTO `sys_dict_item` VALUES (79, 24, '2', '完成', 'leave_status', '完成', 0, 'admin', ' ', '2023-03-02 22:51:06', NULL, '完成', '0'); +INSERT INTO `sys_dict_item` VALUES (80, 24, '9', '驳回', 'leave_status', '驳回', 0, 'admin', ' ', '2023-03-02 22:51:20', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (81, 25, 'record', '日程记录', 'schedule_type', '日程记录', 0, 'admin', ' ', '2023-03-06 14:50:01', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (82, 25, 'plan', '计划', 'schedule_type', '计划类型', 0, 'admin', ' ', '2023-03-06 14:50:29', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (83, 26, '0', '计划中', 'schedule_status', '日程状态', 0, 'admin', ' ', '2023-03-06 14:53:18', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (84, 26, '1', '已开始', 'schedule_status', '已开始', 0, 'admin', ' ', '2023-03-06 14:53:33', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (85, 26, '3', '已结束', 'schedule_status', '已结束', 0, 'admin', ' ', '2023-03-06 14:53:41', NULL, NULL, '0'); +INSERT INTO `sys_dict_item` VALUES (86, 27, 'mysql', 'mysql', 'ds_type', 'mysql', 0, 'admin', ' ', '2023-03-12 09:58:11', NULL, NULL, '0'); COMMIT; - -- ---------------------------- -- Table structure for sys_file -- ---------------------------- DROP TABLE IF EXISTS `sys_file`; CREATE TABLE `sys_file` ( - `id` bigint NOT NULL COMMENT '文件ID', - `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件名称', - `bucket_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件存储桶名称', - `original` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '原始文件名', - `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件类型', - `file_size` bigint DEFAULT NULL COMMENT '文件大小', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标志:0-正常,1-删除', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='文件管理表'; + `id` bigint NOT NULL COMMENT '编号', + `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件名', + `bucket_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件存储桶名称', + `original` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '原始文件名', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件类型', + `file_size` bigint DEFAULT NULL COMMENT '文件大小', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '上传时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件管理表'; -- ---------------------------- -- Records of sys_file @@ -225,119 +242,147 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( - `id` bigint NOT NULL, - `type` char(1) COLLATE utf8mb4_bin DEFAULT '1' COMMENT '日志类型', - `title` varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '日志标题', - `service_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '服务ID', - `remote_addr` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作IP地址', - `user_agent` varchar(1000) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户代理', - `request_uri` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '请求URI', - `method` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作方式', - `params` text COLLATE utf8mb4_bin COMMENT '操作提交的数据', - `time` bigint DEFAULT NULL COMMENT '执行时间', - `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', - `exception` text COLLATE utf8mb4_bin COMMENT '异常信息', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`), - KEY `sys_log_create_by` (`create_by`), - KEY `sys_log_request_uri` (`request_uri`), - KEY `sys_log_type` (`type`), - KEY `sys_log_create_date` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='日志表'; - --- ---------------------------- --- Records of sys_log --- ---------------------------- -BEGIN; -COMMIT; + `id` bigint NOT NULL COMMENT '编号', + `log_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '日志类型', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '日志标题', + `service_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '服务ID', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remote_addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '远程地址', + `user_agent` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户代理', + `request_uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求URI', + `method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求方法', + `params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '请求参数', + `time` bigint DEFAULT NULL COMMENT '执行时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `exception` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '异常信息', + PRIMARY KEY (`id`) USING BTREE, + KEY `sys_log_request_uri` (`request_uri`) USING BTREE, + KEY `sys_log_type` (`log_type`) USING BTREE, + KEY `sys_log_create_date` (`create_time`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='日志表'; + -- ---------------------------- -- Table structure for sys_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( - `menu_id` bigint NOT NULL, - `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '菜单名称', - `permission` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单权限标识', - `path` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '前端URL', - `parent_id` bigint DEFAULT NULL COMMENT '父菜单ID', - `icon` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图标', - `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', - `keep_alive` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-开启,1- 关闭', - `type` char(1) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单类型 (0菜单 1按钮)', - `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '逻辑删除标记(0--正常 1--删除)', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`menu_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='菜单权限表'; + `menu_id` bigint NOT NULL COMMENT '菜单ID', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '菜单名称', + `en_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '英文名称', + `permission` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识', + `path` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由路径', + `parent_id` bigint DEFAULT NULL COMMENT '父菜单ID', + `icon` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '菜单图标', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否可见,0隐藏,1显示', + `sort_order` int DEFAULT '1' COMMENT '排序值,越小越靠前', + `keep_alive` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否缓存,0否,1是', + `embedded` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否内嵌,0否,1是', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单类型,0目录,1菜单,2按钮', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志,0未删除,1已删除', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='菜单权限表'; -- ---------------------------- -- Records of sys_menu -- ---------------------------- BEGIN; -INSERT INTO `sys_menu` VALUES ('1000', '权限管理', null, '/admin', '-1', 'icon-quanxianguanli', '1', '0', '0', '0', ' ', '2018-09-28 08:29:53', ' ', '2020-03-11 23:58:18'); -INSERT INTO `sys_menu` VALUES ('1100', '用户管理', null, '/admin/user/index', '1000', 'icon-yonghuguanli', '0', '0', '0', '0', ' ', '2017-11-02 22:24:37', ' ', '2020-03-12 00:12:57'); -INSERT INTO `sys_menu` VALUES ('1101', '用户新增', 'sys_user_add', null, '1100', null, '0', '0', '1', '0', ' ', '2017-11-08 09:52:09', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1102', '用户修改', 'sys_user_edit', null, '1100', null, '0', '0', '1', '0', ' ', '2017-11-08 09:52:48', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1103', '用户删除', 'sys_user_del', null, '1100', null, '0', '0', '1', '0', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1104', '导入导出', 'sys_user_import_export', null, '1100', null, '0', '0', '1', '0', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1200', '菜单管理', null, '/admin/menu/index', '1000', 'icon-caidanguanli', '1', '0', '0', '0', ' ', '2017-11-08 09:57:27', ' ', '2020-03-12 00:13:52'); -INSERT INTO `sys_menu` VALUES ('1201', '菜单新增', 'sys_menu_add', null, '1200', null, '0', '0', '1', '0', ' ', '2017-11-08 10:15:53', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1202', '菜单修改', 'sys_menu_edit', null, '1200', null, '0', '0', '1', '0', ' ', '2017-11-08 10:16:23', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1203', '菜单删除', 'sys_menu_del', null, '1200', null, '0', '0', '1', '0', ' ', '2017-11-08 10:16:43', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1300', '角色管理', null, '/admin/role/index', '1000', 'icon-jiaoseguanli', '2', '0', '0', '0', ' ', '2017-11-08 10:13:37', ' ', '2020-03-12 00:15:40'); -INSERT INTO `sys_menu` VALUES ('1301', '角色新增', 'sys_role_add', null, '1300', null, '0', '0', '1', '0', ' ', '2017-11-08 10:14:18', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1302', '角色修改', 'sys_role_edit', null, '1300', null, '0', '0', '1', '0', ' ', '2017-11-08 10:14:41', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1303', '角色删除', 'sys_role_del', null, '1300', null, '0', '0', '1', '0', ' ', '2017-11-08 10:14:59', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1304', '分配权限', 'sys_role_perm', null, '1300', null, '0', '0', '1', '0', ' ', '2018-04-20 07:22:55', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1305', '导入导出', 'sys_role_import_export', null, '1300', null, '0', '0', '1', '0', 'admin', '2022-03-21 11:14:52', 'admin', '2022-03-21 11:15:07'); -INSERT INTO `sys_menu` VALUES ('1400', '部门管理', null, '/admin/dept/index', '1000', 'icon-web-icon-', '3', '0', '0', '0', ' ', '2018-01-20 13:17:19', ' ', '2020-03-12 00:15:44'); -INSERT INTO `sys_menu` VALUES ('1401', '部门新增', 'sys_dept_add', null, '1400', null, '0', '0', '1', '0', ' ', '2018-01-20 14:56:16', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1402', '部门修改', 'sys_dept_edit', null, '1400', null, '0', '0', '1', '0', ' ', '2018-01-20 14:56:59', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1403', '部门删除', 'sys_dept_del', null, '1400', null, '0', '0', '1', '0', ' ', '2018-01-20 14:57:28', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('1500', '岗位管理', '', '/admin/post/index', '1000', 'icon-gangweiguanli', '4', '0', '0', '0', null, '2018-01-20 13:17:19', 'admin', '2022-11-10 21:35:55'); -INSERT INTO `sys_menu` VALUES ('1501', '岗位查看', 'sys_post_get', null, '1500', '1', '0', '0', '1', '0', null, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:32:54'); -INSERT INTO `sys_menu` VALUES ('1502', '岗位新增', 'sys_post_add', null, '1500', '1', '1', '0', '1', '0', null, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:32:48'); -INSERT INTO `sys_menu` VALUES ('1503', '岗位修改', 'sys_post_edit', null, '1500', '1', '2', '0', '1', '0', null, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:33:10'); -INSERT INTO `sys_menu` VALUES ('1504', '岗位删除', 'sys_post_del', null, '1500', '1', '3', '0', '1', '0', null, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:33:27'); -INSERT INTO `sys_menu` VALUES ('1505', '导入导出', 'sys_post_import_export', null, '1500', null, '4', '0', '1', '0', 'admin', '2022-03-21 12:53:05', 'admin', '2022-03-21 12:53:05'); -INSERT INTO `sys_menu` VALUES ('2000', '系统管理', null, '/setting', '-1', 'icon-wxbgongju1', '2', '0', '0', '0', '', '2017-11-07 20:56:00', 'admin', '2022-11-10 21:42:39'); -INSERT INTO `sys_menu` VALUES ('2100', '日志管理', null, '/admin/log/index', '2000', 'icon-rizhiguanli', '3', '0', '0', '0', ' ', '2017-11-20 14:06:22', ' ', '2020-03-12 00:15:49'); -INSERT INTO `sys_menu` VALUES ('2101', '日志删除', 'sys_log_del', null, '2100', null, '0', '0', '1', '0', ' ', '2017-11-20 20:37:37', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2102', '导入导出', 'sys_log_import_export', null, '2100', null, '0', '0', '1', '0', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2200', '字典管理', null, '/admin/dict/index', '2000', 'icon-tubiaozhizuomoban-27', '2', '0', '0', '0', '', '2017-11-29 11:30:52', 'admin', '2022-11-10 21:38:09'); -INSERT INTO `sys_menu` VALUES ('2201', '字典删除', 'sys_dict_del', null, '2200', null, '0', '0', '1', '0', ' ', '2017-11-29 11:30:11', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2202', '字典新增', 'sys_dict_add', null, '2200', null, '0', '0', '1', '0', ' ', '2018-05-11 22:34:55', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2203', '字典修改', 'sys_dict_edit', null, '2200', null, '0', '0', '1', '0', ' ', '2018-05-11 22:36:03', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2300', '令牌管理', null, '/admin/token/index', '2000', 'icon-lingpaiguanli', '4', '0', '0', '0', '', '2018-09-04 05:58:41', 'admin', '2022-11-10 21:38:33'); -INSERT INTO `sys_menu` VALUES ('2301', '令牌删除', 'sys_token_del', null, '2300', null, '0', '0', '1', '0', ' ', '2018-09-04 05:59:50', ' ', '2020-03-13 12:57:34'); -INSERT INTO `sys_menu` VALUES ('2400', '终端管理', '', '/admin/client/index', '2000', 'icon-shouji', '0', '0', '0', '0', ' ', '2018-01-20 13:17:19', ' ', '2020-03-12 00:15:54'); -INSERT INTO `sys_menu` VALUES ('2401', '客户端新增', 'sys_client_add', null, '2400', '1', '0', '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2402', '客户端修改', 'sys_client_edit', null, '2400', null, '0', '0', '1', '0', ' ', '2018-05-15 21:37:06', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2403', '客户端删除', 'sys_client_del', null, '2400', null, '0', '0', '1', '0', ' ', '2018-05-15 21:39:16', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2600', '文件管理', null, '/admin/file/index', '2000', 'icon-wenjianjiawenjianguanli', '1', '0', '0', '0', '', '2018-06-26 10:50:32', 'admin', '2022-11-10 21:35:40'); -INSERT INTO `sys_menu` VALUES ('2601', '文件删除', 'sys_file_del', null, '2600', null, '0', '0', '1', '0', ' ', '2017-11-29 11:30:11', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2602', '文件新增', 'sys_file_add', null, '2600', null, '0', '0', '1', '0', ' ', '2018-05-11 22:34:55', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2603', '文件修改', 'sys_file_edit', null, '2600', null, '0', '0', '1', '0', ' ', '2018-05-11 22:36:03', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES ('2700', '参数管理', null, '/admin/param/index', '2000', 'icon-canshu', '5', '0', '0', '0', 'admin', '2022-03-25 20:40:27', 'admin', '2022-11-10 21:38:50'); -INSERT INTO `sys_menu` VALUES ('2701', '参数新增', 'sys_publicparam_add', null, '2700', null, '0', '0', '1', '0', 'admin', '2022-03-25 20:45:05', 'admin', '2022-03-25 20:45:05'); -INSERT INTO `sys_menu` VALUES ('2702', '参数删除', 'sys_publicparam_del', null, '2700', null, '1', '0', '1', '0', 'admin', '2022-03-25 20:45:43', 'admin', '2022-03-25 20:45:43'); -INSERT INTO `sys_menu` VALUES ('2703', '参数修改', 'sys_publicparam_edit', null, '2700', null, '3', '0', '1', '0', 'admin', '2022-03-25 20:46:04', 'admin', '2022-03-25 20:46:04'); -INSERT INTO `sys_menu` VALUES ('3000', '开发平台', null, '/gen', '-1', 'icon-keshihuapingtaiicon_zujian', '3', '1', '0', '0', '', '2020-03-11 22:15:40', 'admin', '2022-11-10 21:39:25'); -INSERT INTO `sys_menu` VALUES ('3100', '数据源管理', null, '/gen/datasource', '3000', 'icon-shujuyuan', '3', '1', '0', '0', '', '2020-03-11 22:17:05', 'admin', '2022-11-10 21:40:27'); -INSERT INTO `sys_menu` VALUES ('3200', '代码生成', null, '/gen/index', '3000', 'icon-didaima', '0', '0', '0', '0', '', '2020-03-11 22:23:42', 'admin', '2022-11-10 21:39:54'); -INSERT INTO `sys_menu` VALUES ('3300', '表单管理', null, '/gen/form', '3000', 'icon-biaodanguanli', '1', '1', '0', '0', '', '2020-03-11 22:19:32', 'admin', '2022-11-10 21:40:06'); -INSERT INTO `sys_menu` VALUES ('3301', '表单新增', 'gen_form_add', null, '3300', '', '0', '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2020-03-11 22:39:08'); -INSERT INTO `sys_menu` VALUES ('3302', '表单修改', 'gen_form_edit', null, '3300', '', '0', '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2020-03-11 22:39:09'); -INSERT INTO `sys_menu` VALUES ('3303', '表单删除', 'gen_form_del', null, '3300', '', '0', '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2020-03-11 22:39:11'); -INSERT INTO `sys_menu` VALUES ('3400', '表单设计', null, '/gen/design', '3000', 'icon-sheji', '2', '1', '0', '0', '', '2020-03-11 22:18:05', 'admin', '2022-11-10 21:40:16'); -INSERT INTO `sys_menu` VALUES ('4000', '服务监控', null, 'http://localhost:5001/login', '-1', 'icon-iconset0265', '4', '0', '0', '0', 'admin', '2022-03-21 09:44:50', 'admin', '2022-11-10 21:42:17'); -INSERT INTO `sys_menu` VALUES ('9999', '系统官网', null, 'https://pig4cloud.com/#/', '-1', 'icon-web-icon-', '999', '0', '0', '0', '', '2019-01-17 17:05:19', 'admin', '2022-11-10 21:40:53'); +INSERT INTO `sys_menu` VALUES (1000, '权限管理', 'authorization', NULL, '/admin', -1, 'iconfont icon-icon-', '1', 0, '0', '0', '0', '', '2018-09-28 08:29:53', 'admin', '2023-03-12 22:32:52', '0'); +INSERT INTO `sys_menu` VALUES (1100, '用户管理', 'user', NULL, '/admin/user/index', 1000, 'ele-User', '1', 1, '0', '0', '0', '', '2017-11-02 22:24:37', 'admin', '2023-07-05 10:28:22', '0'); +INSERT INTO `sys_menu` VALUES (1101, '用户新增', NULL, 'sys_user_add', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:52:09', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1102, '用户修改', NULL, 'sys_user_edit', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:52:48', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1103, '用户删除', NULL, 'sys_user_del', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1104, '导入导出', NULL, 'sys_user_export', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1200, '菜单管理', 'menu', NULL, '/admin/menu/index', 1000, 'iconfont icon-caidan', '1', 2, '0', '0', '0', '', '2017-11-08 09:57:27', 'admin', '2023-07-05 10:28:17', '0'); +INSERT INTO `sys_menu` VALUES (1201, '菜单新增', NULL, 'sys_menu_add', NULL, 1200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:15:53', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1202, '菜单修改', NULL, 'sys_menu_edit', NULL, 1200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:16:23', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1203, '菜单删除', NULL, 'sys_menu_del', NULL, 1200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:16:43', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1300, '角色管理', 'role', NULL, '/admin/role/index', 1000, 'iconfont icon-gerenzhongxin', '1', 3, '0', NULL, '0', '', '2017-11-08 10:13:37', 'admin', '2023-07-05 10:28:13', '0'); +INSERT INTO `sys_menu` VALUES (1301, '角色新增', NULL, 'sys_role_add', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:14:18', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1302, '角色修改', NULL, 'sys_role_edit', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:14:41', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1303, '角色删除', NULL, 'sys_role_del', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:14:59', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1304, '分配权限', NULL, 'sys_role_perm', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2018-04-20 07:22:55', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1305, '角色导入导出', NULL, 'sys_role_export', NULL, 1300, NULL, '1', 4, '0', NULL, '1', ' ', '2022-03-26 15:54:34', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (1400, '部门管理', 'dept', NULL, '/admin/dept/index', 1000, 'iconfont icon-zidingyibuju', '1', 4, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-07-05 10:28:07', '0'); +INSERT INTO `sys_menu` VALUES (1401, '部门新增', NULL, 'sys_dept_add', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:56:16', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1402, '部门修改', NULL, 'sys_dept_edit', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:56:59', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1403, '部门删除', NULL, 'sys_dept_del', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:57:28', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (1600, '岗位管理', 'post', NULL, '/admin/post/index', 1000, 'iconfont icon--chaifenhang', '1', 5, '1', '0', '0', '', '2022-03-26 13:04:14', 'admin', '2023-07-05 10:28:03', '0'); +INSERT INTO `sys_menu` VALUES (1601, '岗位信息查看', NULL, 'sys_post_view', NULL, 1600, NULL, '1', 0, '0', NULL, '1', ' ', '2022-03-26 13:05:34', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (1602, '岗位信息新增', NULL, 'sys_post_add', NULL, 1600, NULL, '1', 1, '0', NULL, '1', ' ', '2022-03-26 13:06:00', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (1603, '岗位信息修改', NULL, 'sys_post_edit', NULL, 1600, NULL, '1', 2, '0', NULL, '1', ' ', '2022-03-26 13:06:31', ' ', '2022-03-26 13:06:38', '0'); +INSERT INTO `sys_menu` VALUES (1604, '岗位信息删除', NULL, 'sys_post_del', NULL, 1600, NULL, '1', 3, '0', NULL, '1', ' ', '2022-03-26 13:06:31', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (1605, '岗位导入导出', NULL, 'sys_post_export', NULL, 1600, NULL, '1', 4, '0', NULL, '1', ' ', '2022-03-26 13:06:31', ' ', '2022-03-26 06:32:02', '0'); +INSERT INTO `sys_menu` VALUES (2000, '系统管理', 'system', NULL, '/system', -1, 'iconfont icon-quanjushezhi_o', '1', 1, '0', NULL, '0', '', '2017-11-07 20:56:00', 'admin', '2023-07-05 10:27:58', '0'); +INSERT INTO `sys_menu` VALUES (2001, '日志管理', 'log', NULL, '/admin/logs', 2000, 'ele-Cloudy', '1', 0, '0', '0', '0', 'admin', '2023-03-02 12:26:42', 'admin', '2023-07-05 10:27:53', '0'); +INSERT INTO `sys_menu` VALUES (2100, '操作日志', 'operation', NULL, '/admin/log/index', 2001, 'iconfont icon-jinridaiban', '1', 2, '0', '0', '0', '', '2017-11-20 14:06:22', 'admin', '2023-07-05 10:27:49', '0'); +INSERT INTO `sys_menu` VALUES (2101, '日志删除', NULL, 'sys_log_del', NULL, 2100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-20 20:37:37', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2102, '导入导出', NULL, 'sys_log_export', NULL, 2100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2200, '字典管理', 'dict', NULL, '/admin/dict/index', 2000, 'iconfont icon-zhongduancanshuchaxun', '1', 6, '0', NULL, '0', '', '2017-11-29 11:30:52', 'admin', '2023-07-05 10:27:37', '0'); +INSERT INTO `sys_menu` VALUES (2201, '字典删除', NULL, 'sys_dict_del', NULL, 2200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-29 11:30:11', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2202, '字典新增', NULL, 'sys_dict_add', NULL, 2200, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-11 22:34:55', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2203, '字典修改', NULL, 'sys_dict_edit', NULL, 2200, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-11 22:36:03', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2210, '参数管理', 'parameter', NULL, '/admin/param/index', 2000, 'iconfont icon-wenducanshu-05', '1', 7, '1', NULL, '0', '', '2019-04-29 22:16:50', 'admin', '2023-02-16 15:24:51', '0'); +INSERT INTO `sys_menu` VALUES (2211, '参数新增', NULL, 'sys_syspublicparam_add', NULL, 2210, NULL, '1', 1, '0', NULL, '1', ' ', '2019-04-29 22:17:36', ' ', '2020-03-24 08:57:11', '0'); +INSERT INTO `sys_menu` VALUES (2212, '参数删除', NULL, 'sys_syspublicparam_del', NULL, 2210, NULL, '1', 1, '0', NULL, '1', ' ', '2019-04-29 22:17:55', ' ', '2020-03-24 08:57:12', '0'); +INSERT INTO `sys_menu` VALUES (2213, '参数编辑', NULL, 'sys_syspublicparam_edit', NULL, 2210, NULL, '1', 1, '0', NULL, '1', ' ', '2019-04-29 22:18:14', ' ', '2020-03-24 08:57:13', '0'); +INSERT INTO `sys_menu` VALUES (2300, '代码生成', 'code', NULL, '/gen/table/index', 9000, 'iconfont icon-zhongduancanshu', '1', 1, '0', '0', '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-20 13:54:35', '0'); +INSERT INTO `sys_menu` VALUES (2400, '终端管理', 'client', NULL, '/admin/client/index', 2000, 'iconfont icon-gongju', '1', 9, '1', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:25:28', '0'); +INSERT INTO `sys_menu` VALUES (2401, '客户端新增', NULL, 'sys_client_add', NULL, 2400, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2402, '客户端修改', NULL, 'sys_client_edit', NULL, 2400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:37:06', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2403, '客户端删除', NULL, 'sys_client_del', NULL, 2400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:39:16', ' ', '2021-05-25 03:12:55', '0'); +INSERT INTO `sys_menu` VALUES (2500, '密钥管理', 'key', NULL, '/admin/social/index', 2000, 'iconfont icon-quanxian', '1', 10, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:26:16', '0'); +INSERT INTO `sys_menu` VALUES (2501, '密钥新增', NULL, 'sys_social_details_add', NULL, 2500, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:19', '0'); +INSERT INTO `sys_menu` VALUES (2502, '密钥修改', NULL, 'sys_social_details_edit', NULL, 2500, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:19', '0'); +INSERT INTO `sys_menu` VALUES (2503, '密钥删除', NULL, 'sys_social_details_del', NULL, 2500, '1', '1', 2, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:23', '0'); +INSERT INTO `sys_menu` VALUES (2600, '令牌管理', 'token', NULL, '/admin/token/index', 2000, 'ele-Key', '1', 11, '0', NULL, '0', '', '2018-09-04 05:58:41', 'admin', '2023-02-16 15:28:28', '0'); +INSERT INTO `sys_menu` VALUES (2601, '令牌删除', NULL, 'sys_token_del', NULL, 2600, NULL, '1', 1, '0', NULL, '1', ' ', '2018-09-04 05:59:50', ' ', '2020-03-24 08:57:24', '0'); +INSERT INTO `sys_menu` VALUES (2800, 'Quartz管理', 'quartz', NULL, '/daemon/job-manage/index', 2000, 'ele-AlarmClock', '1', 8, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:25:06', '0'); +INSERT INTO `sys_menu` VALUES (2810, '任务新增', NULL, 'job_sys_job_add', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:26', '0'); +INSERT INTO `sys_menu` VALUES (2820, '任务修改', NULL, 'job_sys_job_edit', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:27', '0'); +INSERT INTO `sys_menu` VALUES (2830, '任务删除', NULL, 'job_sys_job_del', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:28', '0'); +INSERT INTO `sys_menu` VALUES (2840, '任务暂停', NULL, 'job_sys_job_shutdown_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:28', '0'); +INSERT INTO `sys_menu` VALUES (2850, '任务开始', NULL, 'job_sys_job_start_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:29', '0'); +INSERT INTO `sys_menu` VALUES (2860, '任务刷新', NULL, 'job_sys_job_refresh_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:30', '0'); +INSERT INTO `sys_menu` VALUES (2870, '执行任务', NULL, 'job_sys_job_run_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2019-08-08 15:35:18', ' ', '2020-03-24 08:57:31', '0'); +INSERT INTO `sys_menu` VALUES (2871, '导出', NULL, 'job_sys_job_export', NULL, 2800, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-06 15:26:13', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (2900, '国际化管理', 'i18n', NULL, '/admin/i18n/index', 2000, 'iconfont icon-zhongyingzhuanhuan', '1', 8, '0', NULL, '0', '', NULL, 'admin', '2023-02-16 15:25:18', '0'); +INSERT INTO `sys_menu` VALUES (2901, '系统表-国际化查看', NULL, 'sys_i18n_view', NULL, 2900, '1', '1', 0, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (2902, '系统表-国际化新增', NULL, 'sys_i18n_add', NULL, 2900, '1', '1', 1, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (2903, '系统表-国际化修改', NULL, 'sys_i18n_edit', NULL, 2900, '1', '1', 2, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (2904, '系统表-国际化删除', NULL, 'sys_i18n_del', NULL, 2900, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (2905, '导入导出', NULL, 'sys_i18n_export', NULL, 2900, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (2906, '文件管理', 'file', NULL, '/admin/file/index', 2000, 'ele-Files', '1', 6, '0', NULL, '0', '', '2019-06-25 12:44:46', 'admin', '2023-02-16 15:24:42', '0'); +INSERT INTO `sys_menu` VALUES (2907, '删除文件', NULL, 'sys_file_del', NULL, 2906, NULL, '1', 1, '0', NULL, '1', ' ', '2019-06-25 13:41:41', ' ', '2020-03-24 08:58:42', '0'); +INSERT INTO `sys_menu` VALUES (4000, '系统监控', 'monitor', NULL, '/daemon', -1, 'iconfont icon-shuju', '1', 3, '0', '0', '0', 'admin', '2023-02-06 20:20:47', 'admin', '2023-02-23 20:01:07', '0'); +INSERT INTO `sys_menu` VALUES (4001, '文档扩展', 'doc', NULL, 'http://pig-gateway:9999/swagger-ui.html', 4000, 'iconfont icon-biaodan', '1', 2, '0', '1', '0', '', '2018-06-26 10:50:32', 'admin', '2023-02-23 20:01:29', '0'); +INSERT INTO `sys_menu` VALUES (4002, '缓存监控', 'cache', NULL, '/ext/cache', 4000, 'iconfont icon-shuju', '1', 1, '0', '0', '0', 'admin', '2023-05-29 15:12:59', 'admin', '2023-06-06 11:58:41', '0'); +INSERT INTO `sys_menu` VALUES (9000, '开发平台', 'develop', NULL, '/gen', -1, 'iconfont icon-shuxingtu', '1', 9, '0', '0', '0', '', '2019-08-12 09:35:16', 'admin', '2023-07-05 10:25:27', '0'); +INSERT INTO `sys_menu` VALUES (9005, '数据源管理', 'datasource', NULL, '/gen/datasource/index', 9000, 'ele-Coin', '1', 0, '0', NULL, '0', '', '2019-08-12 09:42:11', 'admin', '2023-07-05 10:26:56', '0'); +INSERT INTO `sys_menu` VALUES (9006, '表单设计', 'Form Design', NULL, '/gen/design/index', 9000, 'iconfont icon-AIshiyanshi', '0', 2, '0', '0', '0', '', '2019-08-16 10:08:56', 'admin', '2023-02-23 14:06:50', '0'); +INSERT INTO `sys_menu` VALUES (9007, '生成页面', 'generation', NULL, '/gen/gener/index', 9000, 'iconfont icon-tongzhi4', '0', 0, '0', '0', '0', 'admin', '2023-02-20 09:58:23', 'admin', '2023-07-05 10:27:06', '0'); +INSERT INTO `sys_menu` VALUES (9050, '元数据管理', 'metadata', NULL, '/gen/metadata', 9000, 'iconfont icon--chaifenhang', '1', 9, '0', '0', '0', '', '2018-07-27 01:13:21', 'admin', '2023-07-05 10:27:13', '0'); +INSERT INTO `sys_menu` VALUES (9051, '模板管理', 'template', NULL, '/gen/template/index', 9050, 'iconfont icon--chaifenhang', '1', 5, '0', '0', '0', 'admin', '2023-02-21 11:22:54', 'admin', '2023-07-05 10:27:18', '0'); +INSERT INTO `sys_menu` VALUES (9052, '查询', NULL, 'codegen_template_view', NULL, 9051, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 12:33:03', 'admin', '2023-02-21 13:50:54', '0'); +INSERT INTO `sys_menu` VALUES (9053, '增加', NULL, 'codegen_template_add', NULL, 9051, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-21 13:34:10', 'admin', '2023-02-21 13:39:49', '0'); +INSERT INTO `sys_menu` VALUES (9054, '新增', NULL, 'codegen_template_add', NULL, 9051, NULL, '0', 1, '0', '0', '1', 'admin', '2023-02-21 13:51:32', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9055, '导出', NULL, 'codegen_template_export', NULL, 9051, NULL, '0', 2, '0', '0', '1', 'admin', '2023-02-21 13:51:58', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9056, '删除', NULL, 'codegen_template_del', NULL, 9051, NULL, '0', 3, '0', '0', '1', 'admin', '2023-02-21 13:52:16', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9057, '编辑', NULL, 'codegen_template_edit', NULL, 9051, NULL, '0', 4, '0', '0', '1', 'admin', '2023-02-21 13:52:58', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9059, '模板分组', 'group', NULL, '/gen/group/index', 9050, 'iconfont icon-shuxingtu', '1', 6, '0', '0', '0', 'admin', '2023-02-21 15:06:50', 'admin', '2023-07-05 10:27:22', '0'); +INSERT INTO `sys_menu` VALUES (9060, '查询', NULL, 'codegen_group_view', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:08:07', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9061, '新增', NULL, 'codegen_group_add', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:08:28', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9062, '修改', NULL, 'codegen_group_edit', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:08:43', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9063, '删除', NULL, 'codegen_group_del', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:09:02', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9064, '导出', NULL, 'codegen_group_export', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:09:22', ' ', NULL, '0'); +INSERT INTO `sys_menu` VALUES (9065, '字段管理', 'field', NULL, '/gen/field-type/index', 9050, 'iconfont icon-fuwenben', '1', 0, '0', '0', '0', 'admin', '2023-02-23 20:05:09', 'admin', '2023-07-05 10:27:31', '0'); COMMIT; -- ---------------------------- @@ -345,78 +390,98 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_oauth_client_details`; CREATE TABLE `sys_oauth_client_details` ( - `client_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '客户端ID', - `resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '资源列表', - `client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户端密钥', - `scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '域', - `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '认证类型', - `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '重定向地址', - `authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '角色列表', - `access_token_validity` int DEFAULT NULL COMMENT 'token 有效期', - `refresh_token_validity` int DEFAULT NULL COMMENT '刷新令牌有效期', - `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '令牌扩展字段JSON', - `autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否自动放行', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`client_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='终端信息表'; + `id` bigint NOT NULL COMMENT 'ID', + `client_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '客户端ID', + `resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源ID集合', + `client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端秘钥', + `scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授权范围', + `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授权类型', + `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调地址', + `authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限集合', + `access_token_validity` int DEFAULT NULL COMMENT '访问令牌有效期(秒)', + `refresh_token_validity` int DEFAULT NULL COMMENT '刷新令牌有效期(秒)', + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附加信息', + `autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动授权', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='终端信息表'; -- ---------------------------- -- Records of sys_oauth_client_details -- ---------------------------- BEGIN; -INSERT INTO `sys_oauth_client_details` VALUES ('app', NULL, 'app', 'server', 'app,refresh_token', NULL, NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL); -INSERT INTO `sys_oauth_client_details` VALUES ('daemon', NULL, 'daemon', 'server', 'password,refresh_token', NULL, NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL); -INSERT INTO `sys_oauth_client_details` VALUES ('gen', NULL, 'gen', 'server', 'password,refresh_token', NULL, NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL); -INSERT INTO `sys_oauth_client_details` VALUES ('pig', NULL, 'pig', 'server', 'password,app,refresh_token,authorization_code,client_credentials', 'https://pigx.vip', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL); -INSERT INTO `sys_oauth_client_details` VALUES ('test', NULL, 'test', 'server', 'password,app,refresh_token', NULL, NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL); -INSERT INTO `sys_oauth_client_details` VALUES ('client', NULL, 'client', 'server', 'client_credentials', NULL, NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL); +INSERT INTO `sys_oauth_client_details` VALUES (1, 'app', NULL, 'app', 'server', 'password,refresh_token,authorization_code,client_credentials,mobile', 'http://localhost:4040/sso1/login,http://localhost:4041/sso1/login,http://localhost:8080/renren-admin/sys/oauth2-sso,http://localhost:8090/sys/oauth2-sso', NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\",\"online_quantity\":\"1\"}', 'true', '0', '', 'admin', NULL, '2023-02-09 13:54:54'); +INSERT INTO `sys_oauth_client_details` VALUES (2, 'daemon', NULL, 'daemon', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\"}', 'true', '0', ' ', ' ', NULL, NULL); +INSERT INTO `sys_oauth_client_details` VALUES (3, 'gen', NULL, 'gen', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\"}', 'true', '0', ' ', ' ', NULL, NULL); +INSERT INTO `sys_oauth_client_details` VALUES (4, 'mp', NULL, 'mp', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\"}', 'true', '0', ' ', ' ', NULL, NULL); +INSERT INTO `sys_oauth_client_details` VALUES (5, 'pig', NULL, 'pig', 'server', 'password,refresh_token,authorization_code,client_credentials,mobile', 'http://localhost:4040/sso1/login,http://localhost:4041/sso1/login,http://localhost:8080/renren-admin/sys/oauth2-sso,http://localhost:8090/sys/oauth2-sso', NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\",\"online_quantity\":\"1\"}', 'false', '0', '', 'admin', NULL, '2023-03-08 11:32:41'); +INSERT INTO `sys_oauth_client_details` VALUES (6, 'test', NULL, 'test', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{ \"enc_flag\":\"1\",\"captcha_flag\":\"0\"}', 'true', '0', ' ', ' ', NULL, NULL); +INSERT INTO `sys_oauth_client_details` VALUES (7, 'social', NULL, 'social', 'server', 'password,refresh_token,mobile', NULL, NULL, 43200, 2592001, '{ \"enc_flag\":\"0\",\"captcha_flag\":\"0\"}', 'true', '0', ' ', ' ', NULL, NULL); COMMIT; -- ---------------------------- -- Table structure for sys_post -- ---------------------------- DROP TABLE IF EXISTS `sys_post`; -CREATE TABLE `sys_post` ( - `post_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', - `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位编码', - `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位名称', - `post_sort` int(0) NOT NULL COMMENT '岗位排序', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建人', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新人', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注信息', - PRIMARY KEY (`post_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT = '岗位信息表'; +CREATE TABLE `sys_post` ( + `post_id` bigint NOT NULL COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `post_sort` int NOT NULL COMMENT '岗位排序', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '岗位描述', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '更新人', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='岗位信息表'; -- ---------------------------- -- Records of sys_post -- ---------------------------- BEGIN; -INSERT INTO `sys_post` VALUES (1, 'user', '员工', 2, '0', '2022-03-19 10:05:15', 'admin', '2022-03-19 10:42:28', 'admin', '打工人'); -INSERT INTO `sys_post` VALUES (2, 'cto', 'cto', 0, '0', '2022-03-19 10:06:20', 'admin', '2022-03-19 10:06:20', 'admin', 'cto666'); -INSERT INTO `sys_post` VALUES (3, 'boss', '董事长', -1, '0', '2022-03-19 10:06:35', 'admin', '2022-03-19 10:42:44', 'admin', '大boss'); +INSERT INTO `sys_post` VALUES (1, 'CTO', 'CTO', 0, 'CTOOO', '0', '2022-03-26 13:48:17', '', '2023-03-08 16:03:35', 'admin'); COMMIT; -- ---------------------------- --- Table structure for sys_user_post +-- Table structure for sys_public_param -- ---------------------------- -DROP TABLE IF EXISTS `sys_user_post`; -CREATE TABLE `sys_user_post` ( - `user_id` bigint(0) NOT NULL COMMENT '用户ID', - `post_id` bigint(0) NOT NULL COMMENT '岗位ID', - PRIMARY KEY (`user_id`, `post_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT = '用户与岗位关联表'; +DROP TABLE IF EXISTS `sys_public_param`; +CREATE TABLE `sys_public_param` ( + `public_id` bigint NOT NULL COMMENT '编号', + `public_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称', + `public_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '键', + `public_value` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '值', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态,0禁用,1启用', + `validate_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '校验码', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `public_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '类型,0未知,1系统,2业务', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '系统标识,0非系统,1系统', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + PRIMARY KEY (`public_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公共参数配置表'; -- ---------------------------- --- Records of sys_user_post +-- Records of sys_public_param -- ---------------------------- BEGIN; -INSERT INTO `sys_user_post` VALUES (1, 1); +INSERT INTO `sys_public_param` VALUES (1, '租户默认来源', 'TENANT_DEFAULT_ID', '1', '0', '', ' ', ' ', '2020-05-12 04:03:46', '2020-06-20 08:56:30', '2', '0', '1'); +INSERT INTO `sys_public_param` VALUES (2, '租户默认部门名称', 'TENANT_DEFAULT_DEPTNAME', '租户默认部门', '0', '', ' ', ' ', '2020-05-12 03:36:32', NULL, '2', '1', '0'); +INSERT INTO `sys_public_param` VALUES (3, '租户默认账户', 'TENANT_DEFAULT_USERNAME', 'admin', '0', '', ' ', ' ', '2020-05-12 04:05:04', NULL, '2', '1', '0'); +INSERT INTO `sys_public_param` VALUES (4, '租户默认密码', 'TENANT_DEFAULT_PASSWORD', '123456', '0', '', ' ', ' ', '2020-05-12 04:05:24', NULL, '2', '1', '0'); +INSERT INTO `sys_public_param` VALUES (5, '租户默认角色编码', 'TENANT_DEFAULT_ROLECODE', 'ROLE_ADMIN', '0', '', ' ', ' ', '2020-05-12 04:05:57', NULL, '2', '1', '0'); +INSERT INTO `sys_public_param` VALUES (6, '租户默认角色名称', 'TENANT_DEFAULT_ROLENAME', '租户默认角色', '0', '', ' ', ' ', '2020-05-12 04:06:19', NULL, '2', '1', '0'); +INSERT INTO `sys_public_param` VALUES (7, '表前缀', 'GEN_TABLE_PREFIX', 'tb_', '0', '', ' ', ' ', '2020-05-12 04:23:04', NULL, '9', '1', '0'); +INSERT INTO `sys_public_param` VALUES (8, '接口文档不显示的字段', 'GEN_HIDDEN_COLUMNS', 'tenant_id', '0', '', ' ', ' ', '2020-05-12 04:25:19', NULL, '9', '1', '0'); +INSERT INTO `sys_public_param` VALUES (9, '注册用户默认角色', 'USER_DEFAULT_ROLE', 'GENERAL_USER', '0', NULL, ' ', ' ', '2022-03-31 16:52:24', NULL, '2', '1', '0'); COMMIT; -- ---------------------------- @@ -424,25 +489,25 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( - `role_id` bigint NOT NULL COMMENT '角色ID', - `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色名称', - `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色代码', - `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '角色描述', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标识:0-正常,1-删除', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - PRIMARY KEY (`role_id`), - UNIQUE KEY `role_idx1_role_code` (`role_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='系统角色表'; + `role_id` bigint NOT NULL COMMENT '角色ID', + `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色名称', + `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色编码', + `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色描述', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + PRIMARY KEY (`role_id`) USING BTREE, + KEY `role_idx1_role_code` (`role_code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统角色表'; -- ---------------------------- -- Records of sys_role -- ---------------------------- BEGIN; -INSERT INTO `sys_role` VALUES (1, '管理员', 'ROLE_ADMIN', '管理员', '0', '2017-10-29 15:45:51', '2018-12-26 14:09:11', NULL, NULL); -INSERT INTO `sys_role` VALUES (2, '普通用户','GENERAL_USER', '普通用户', '0', '2022-03-30 09:59:24', '2022-03-30 09:59:24', 'admin', 'admin'); +INSERT INTO `sys_role` VALUES (1, '管理员', 'ROLE_ADMIN', '管理员', '', 'admin', '2017-10-29 15:45:51', '2023-07-07 14:55:07', '0'); +INSERT INTO `sys_role` VALUES (2, '普通用户', 'GENERAL_USER', '普通用户', '', 'admin', '2022-03-31 17:03:15', '2023-04-03 02:28:51', '0'); COMMIT; -- ---------------------------- @@ -450,10 +515,10 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_role_menu`; CREATE TABLE `sys_role_menu` ( - `role_id` bigint NOT NULL COMMENT '角色ID', - `menu_id` bigint NOT NULL COMMENT '菜单ID', - PRIMARY KEY (`role_id`,`menu_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='角色菜单表'; + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色菜单表'; -- ---------------------------- -- Records of sys_role_menu @@ -479,13 +544,14 @@ INSERT INTO `sys_role_menu` VALUES (1, 1400); INSERT INTO `sys_role_menu` VALUES (1, 1401); INSERT INTO `sys_role_menu` VALUES (1, 1402); INSERT INTO `sys_role_menu` VALUES (1, 1403); -INSERT INTO `sys_role_menu` VALUES (1, 1500); -INSERT INTO `sys_role_menu` VALUES (1, 1501); -INSERT INTO `sys_role_menu` VALUES (1, 1502); -INSERT INTO `sys_role_menu` VALUES (1, 1503); -INSERT INTO `sys_role_menu` VALUES (1, 1504); -INSERT INTO `sys_role_menu` VALUES (1, 1505); +INSERT INTO `sys_role_menu` VALUES (1, 1600); +INSERT INTO `sys_role_menu` VALUES (1, 1601); +INSERT INTO `sys_role_menu` VALUES (1, 1602); +INSERT INTO `sys_role_menu` VALUES (1, 1603); +INSERT INTO `sys_role_menu` VALUES (1, 1604); +INSERT INTO `sys_role_menu` VALUES (1, 1605); INSERT INTO `sys_role_menu` VALUES (1, 2000); +INSERT INTO `sys_role_menu` VALUES (1, 2001); INSERT INTO `sys_role_menu` VALUES (1, 2100); INSERT INTO `sys_role_menu` VALUES (1, 2101); INSERT INTO `sys_role_menu` VALUES (1, 2102); @@ -493,32 +559,63 @@ INSERT INTO `sys_role_menu` VALUES (1, 2200); INSERT INTO `sys_role_menu` VALUES (1, 2201); INSERT INTO `sys_role_menu` VALUES (1, 2202); INSERT INTO `sys_role_menu` VALUES (1, 2203); +INSERT INTO `sys_role_menu` VALUES (1, 2210); +INSERT INTO `sys_role_menu` VALUES (1, 2211); +INSERT INTO `sys_role_menu` VALUES (1, 2212); +INSERT INTO `sys_role_menu` VALUES (1, 2213); INSERT INTO `sys_role_menu` VALUES (1, 2300); -INSERT INTO `sys_role_menu` VALUES (1, 2301); INSERT INTO `sys_role_menu` VALUES (1, 2400); INSERT INTO `sys_role_menu` VALUES (1, 2401); INSERT INTO `sys_role_menu` VALUES (1, 2402); INSERT INTO `sys_role_menu` VALUES (1, 2403); +INSERT INTO `sys_role_menu` VALUES (1, 2500); +INSERT INTO `sys_role_menu` VALUES (1, 2501); +INSERT INTO `sys_role_menu` VALUES (1, 2502); +INSERT INTO `sys_role_menu` VALUES (1, 2503); INSERT INTO `sys_role_menu` VALUES (1, 2600); INSERT INTO `sys_role_menu` VALUES (1, 2601); -INSERT INTO `sys_role_menu` VALUES (1, 2602); -INSERT INTO `sys_role_menu` VALUES (1, 2603); -INSERT INTO `sys_role_menu` VALUES (1, 2700); -INSERT INTO `sys_role_menu` VALUES (1, 2701); -INSERT INTO `sys_role_menu` VALUES (1, 2702); -INSERT INTO `sys_role_menu` VALUES (1, 2703); -INSERT INTO `sys_role_menu` VALUES (1, 3000); -INSERT INTO `sys_role_menu` VALUES (1, 3100); -INSERT INTO `sys_role_menu` VALUES (1, 3200); -INSERT INTO `sys_role_menu` VALUES (1, 3300); -INSERT INTO `sys_role_menu` VALUES (1, 3301); -INSERT INTO `sys_role_menu` VALUES (1, 3302); -INSERT INTO `sys_role_menu` VALUES (1, 3303); -INSERT INTO `sys_role_menu` VALUES (1, 3400); +INSERT INTO `sys_role_menu` VALUES (1, 2800); +INSERT INTO `sys_role_menu` VALUES (1, 2810); +INSERT INTO `sys_role_menu` VALUES (1, 2820); +INSERT INTO `sys_role_menu` VALUES (1, 2830); +INSERT INTO `sys_role_menu` VALUES (1, 2840); +INSERT INTO `sys_role_menu` VALUES (1, 2850); +INSERT INTO `sys_role_menu` VALUES (1, 2860); +INSERT INTO `sys_role_menu` VALUES (1, 2870); +INSERT INTO `sys_role_menu` VALUES (1, 2871); +INSERT INTO `sys_role_menu` VALUES (1, 2900); +INSERT INTO `sys_role_menu` VALUES (1, 2901); +INSERT INTO `sys_role_menu` VALUES (1, 2902); +INSERT INTO `sys_role_menu` VALUES (1, 2903); +INSERT INTO `sys_role_menu` VALUES (1, 2904); +INSERT INTO `sys_role_menu` VALUES (1, 2905); +INSERT INTO `sys_role_menu` VALUES (1, 2906); +INSERT INTO `sys_role_menu` VALUES (1, 2907); INSERT INTO `sys_role_menu` VALUES (1, 4000); -INSERT INTO `sys_role_menu` VALUES (1, 9999); +INSERT INTO `sys_role_menu` VALUES (1, 4001); +INSERT INTO `sys_role_menu` VALUES (1, 4002); +INSERT INTO `sys_role_menu` VALUES (1, 9000); +INSERT INTO `sys_role_menu` VALUES (1, 9005); +INSERT INTO `sys_role_menu` VALUES (1, 9006); +INSERT INTO `sys_role_menu` VALUES (1, 9007); +INSERT INTO `sys_role_menu` VALUES (1, 9050); +INSERT INTO `sys_role_menu` VALUES (1, 9051); +INSERT INTO `sys_role_menu` VALUES (1, 9052); +INSERT INTO `sys_role_menu` VALUES (1, 9053); +INSERT INTO `sys_role_menu` VALUES (1, 9054); +INSERT INTO `sys_role_menu` VALUES (1, 9055); +INSERT INTO `sys_role_menu` VALUES (1, 9056); +INSERT INTO `sys_role_menu` VALUES (1, 9057); +INSERT INTO `sys_role_menu` VALUES (1, 9059); +INSERT INTO `sys_role_menu` VALUES (1, 9060); +INSERT INTO `sys_role_menu` VALUES (1, 9061); +INSERT INTO `sys_role_menu` VALUES (1, 9062); +INSERT INTO `sys_role_menu` VALUES (1, 9063); +INSERT INTO `sys_role_menu` VALUES (1, 9064); +INSERT INTO `sys_role_menu` VALUES (1, 9065); INSERT INTO `sys_role_menu` VALUES (2, 4000); -INSERT INTO `sys_role_menu` VALUES (2, 9999); +INSERT INTO `sys_role_menu` VALUES (2, 4001); +INSERT INTO `sys_role_menu` VALUES (2, 4002); COMMIT; -- ---------------------------- @@ -526,28 +623,56 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( - `user_id` bigint NOT NULL, - `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户名', - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '密码', - `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '随机盐', - `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '简介', - `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像', - `dept_id` bigint DEFAULT NULL COMMENT '部门ID', - `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,9-锁定', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,1-删除', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`user_id`), - KEY `user_idx1_username` (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='用户表'; + `user_id` bigint NOT NULL COMMENT '用户ID', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '盐值', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '电话号码', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像', + `nickname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '昵称', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名', + `email` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱地址', + `dept_id` bigint DEFAULT NULL COMMENT '所属部门ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '锁定标记,0未锁定,9已锁定', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `wx_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信登录openId', + `mini_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小程序openId', + `qq_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'QQ openId', + `gitee_login` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '码云标识', + `osc_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开源中国标识', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '所属租户ID', + PRIMARY KEY (`user_id`) USING BTREE, + KEY `user_wx_openid` (`wx_openid`) USING BTREE, + KEY `user_qq_openid` (`qq_openid`) USING BTREE, + KEY `user_idx1_username` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表'; -- ---------------------------- -- Records of sys_user -- ---------------------------- BEGIN; -INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$RpFJjxYiXdEsAGnWp/8fsOetMuOON96Ntk/Ym2M/RKRyU0GZseaDC', NULL, '17034642999', '', 1, '0', '0', '2018-04-20 07:15:18', '2019-01-31 14:29:07', NULL, NULL); +INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$c/Ae0pRjJtMZg3BnvVpO.eIK6WYWVbKTzqgdy3afR7w.vd.xi3Mgy', '', '17034642999', '/admin/sys-file/s3demo/7ff4ca6b7bf446f3a5a13ac016dc21af.png', '管理员', '管理员', 'pig4cloud@qq.com', 4, ' ', 'admin', '2018-04-20 07:15:18', '2023-07-07 14:55:40', '0', '0', NULL, 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', NULL, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `post_id` bigint NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`,`post_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户与岗位关联表'; + +-- ---------------------------- +-- Records of sys_user_post +-- ---------------------------- +BEGIN; +INSERT INTO `sys_user_post` VALUES (1, 1); COMMIT; -- ---------------------------- @@ -555,16 +680,17 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( - `user_id` bigint NOT NULL COMMENT '用户ID', - `role_id` bigint NOT NULL COMMENT '角色ID', - PRIMARY KEY (`user_id`,`role_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户角色表'; -- ---------------------------- -- Records of sys_user_role -- ---------------------------- BEGIN; INSERT INTO `sys_user_role` VALUES (1, 1); +INSERT INTO `sys_user_role` VALUES (1676492190299299842, 2); COMMIT; SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql index 791d1393..98a0d741 100644 --- a/db/pig_codegen.sql +++ b/db/pig_codegen.sql @@ -4,26 +4,30 @@ CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; - -USE `pig_codegen`; +USE pig_codegen; -- ---------------------------- -- Table structure for gen_datasource_conf -- ---------------------------- DROP TABLE IF EXISTS `gen_datasource_conf`; CREATE TABLE `gen_datasource_conf` ( - `id` bigint NOT NULL COMMENT '数据源ID', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '数据源名称', - `url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'jdbc-url', - `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名', - `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='数据源表'; + `id` bigint NOT NULL COMMENT '主键', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '别名', + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'jdbcurl', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `ds_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', + `conf_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配置类型', + `ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称', + `instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实例', + `port` int DEFAULT NULL COMMENT '端口', + `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据源表'; -- ---------------------------- -- Records of gen_datasource_conf @@ -32,26 +36,219 @@ BEGIN; COMMIT; -- ---------------------------- --- Table structure for gen_form_conf +-- Table structure for gen_field_type +-- ---------------------------- +DROP TABLE IF EXISTS `gen_field_type`; +CREATE TABLE `gen_field_type` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `column_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', + `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`), + UNIQUE KEY `column_type` (`column_type`) +) ENGINE=InnoDB AUTO_INCREMENT=1634915190321451010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字段类型管理'; + +-- ---------------------------- +-- Records of gen_field_type +-- ---------------------------- +BEGIN; +INSERT INTO `gen_field_type` VALUES (1, 'datetime', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (2, 'date', 'LocalDate', 'java.time.LocalDate', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (3, 'tinyint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (4, 'smallint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (5, 'mediumint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (6, 'int', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (7, 'integer', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (8, 'bigint', 'Long', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (9, 'float', 'Float', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (10, 'double', 'Double', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (11, 'decimal', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (12, 'bit', 'Boolean', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (13, 'char', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (14, 'varchar', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (15, 'tinytext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (16, 'text', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (17, 'mediumtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (18, 'longtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (19, 'timestamp', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (20, 'NUMBER', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (21, 'BINARY_INTEGER', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (22, 'BINARY_FLOAT', 'Float', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (23, 'BINARY_DOUBLE', 'Double', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (24, 'VARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (25, 'NVARCHAR', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (26, 'NVARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (27, 'CLOB', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (28, 'int8', 'Long', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (29, 'int4', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (30, 'int2', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (31, 'numeric', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (32, 'json', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_group +-- ---------------------------- +DROP TABLE IF EXISTS `gen_group`; +CREATE TABLE `gen_group` ( + `id` bigint NOT NULL, + `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组名称', + `group_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组描述', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组'; + +-- ---------------------------- +-- Records of gen_group +-- ---------------------------- +BEGIN; +INSERT INTO `gen_group` VALUES (1, '单表增删改查', '单表增删改查', 1, ' ', 'admin', NULL, '2023-07-07 15:47:51', '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名', + `class_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类名', + `db_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', + `table_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '说明', + `author` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '作者', + `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目包名', + `version` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目版本号', + `i18n` tinyint DEFAULT '1' COMMENT '是否生成带有i18n 0 不带有 1带有', + `style` bigint DEFAULT '0' COMMENT '代码风格', + `child_table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表名称', + `main_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表关联键', + `child_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联键', + `generator_type` tinyint DEFAULT NULL COMMENT '生成方式 0:zip压缩包 1:自定义目录', + `backend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端生成路径', + `frontend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端生成路径', + `module_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模块名', + `function_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '功能名', + `form_layout` tinyint DEFAULT NULL COMMENT '表单布局 1:一列 2:两列', + `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源ID', + `baseclass_id` bigint DEFAULT NULL COMMENT '基类ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `table_name` (`table_name`,`ds_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表'; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源名称', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名称', + `field_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段名称', + `field_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', + `field_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段说明', + `attr_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性名', + `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', + `sort` int DEFAULT NULL COMMENT '排序', + `auto_fill` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动填充 DEFAULT、INSERT、UPDATE、INSERT_UPDATE', + `primary_pk` tinyint DEFAULT NULL COMMENT '主键 0:否 1:是', + `base_field` tinyint DEFAULT NULL COMMENT '基类字段 0:否 1:是', + `form_item` tinyint DEFAULT NULL COMMENT '表单项 0:否 1:是', + `form_required` tinyint DEFAULT NULL COMMENT '表单必填 0:否 1:是', + `form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单类型', + `form_validator` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单效验', + `grid_item` tinyint DEFAULT NULL COMMENT '列表项 0:否 1:是', + `grid_sort` tinyint DEFAULT NULL COMMENT '列表排序 0:否 1:是', + `query_item` tinyint DEFAULT NULL COMMENT '查询项 0:否 1:是', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询方式', + `query_form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询表单类型', + `field_dict` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表字段'; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_template +-- ---------------------------- +DROP TABLE IF EXISTS `gen_template`; +CREATE TABLE `gen_template` ( + `id` bigint NOT NULL COMMENT '主键', + `template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称', + `generator_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板路径', + `template_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板描述', + `template_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板代码', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板'; + +-- ---------------------------- +-- Records of gen_template +-- ---------------------------- +BEGIN; +INSERT INTO `gen_template` VALUES (1, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-07-21 22:12:38', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (2, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-07-21 22:12:41', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (3, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pig.common.core.util.R;\nimport com.pig4cloud.pig.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.core.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page,@ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.queryType == \'=\')\n wrapper.eq(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className}) {\n return ${className}Service.list(Wrappers.query(${className}));\n }\n}', '2023-02-23 01:16:17', '2023-07-21 22:02:51', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (4, 'Service', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java', 'Service', 'package ${package}.${moduleName}.service;\n\n#if($ChildClassName)\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport com.baomidou.mybatisplus.extension.service.IService;\n#end\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n\n#if($ChildClassName)\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(Long[] ids);\n\n Boolean removeChild(Long[] ids);\n#else\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:16:53', '2023-06-04 10:35:25', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (5, 'ServiceImpl', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java', 'ServiceImpl', 'package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n#if($ChildClassName)\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\n#end\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n#if($ChildClassName)\n@RequiredArgsConstructor\n#end\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n#if($ChildClassName)\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#foreach ($field in $childFieldList)\n#if($field.primaryPk)\n#set($getChildPkName=$str.getProperty($field.attrName))\n#end\n#end\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.getId());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(Long[] ids) {\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery().in(${ChildClassName}Entity::$str.getProperty($childField), ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(Long[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n#end\n}', '2023-02-23 01:17:36', '2023-06-04 10:35:21', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (6, '实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ClassName}Entity.java', 'Entity', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n#if($ChildClassName)\nimport com.alibaba.excel.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk)\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n private $field.attrType $field.attrName;\n#end\n#if($ChildClassName)\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n#end\n}', '2023-02-23 01:17:53', '2023-06-04 10:45:15', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (7, 'Mapper', '${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java', 'Mapper', 'package ${package}.${moduleName}.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n#if($ChildClassName)\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n#end\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\n#if($ChildClassName)\npublic interface ${ChildClassName}Mapper extends BaseMapper<${ChildClassName}Entity> {\n#else\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:18:18', '2023-07-21 22:01:14', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (8, 'Mapper.xml', '${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml', 'Mapper.xml', '\n\n\n\n\n \n#foreach ($field in $fieldList)\n #if($field.primaryPk)\n \n #end\n #if(!$field.primaryPk)\n \n #end\n#end\n \n', '2023-02-23 01:18:35', '2023-06-04 10:34:56', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (9, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 , 默认租户 1\n#set($menuId=${dateTool.getSystemTime()})\n\n -- 菜单SQL\n insert into `sys_menu` ( `menu_id`,`parent_id`, `path`, `permission`, `menu_type`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`)\n values (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\');\n\n-- 按钮父菜单ID\n set @parentId = @@identity;\n\n-- 菜单对应按钮SQL\n insert into `sys_menu` ( `menu_id`,`parent_id`, `permission`, `menu_type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`)\n values (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\');\n\n insert into `sys_menu` ( `menu_id`,`parent_id`, `permission`, `menu_type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`)\n values (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\');\n\n insert into `sys_menu` (`menu_id`, `parent_id`, `permission`, `menu_type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`)\n values (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\');\n\n insert into `sys_menu` (`menu_id`, `parent_id`, `permission`, `menu_type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`)\n values (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\');\n\n insert into `sys_menu` ( `menu_id`,`parent_id`, `permission`, `menu_type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`)\n values (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\');', '2023-02-23 01:19:08', '2023-07-21 22:08:16', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (10, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', 1, ' ', ' '); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_template_group -- ---------------------------- -DROP TABLE IF EXISTS `gen_form_conf`; -CREATE TABLE `gen_form_conf` ( - `id` bigint NOT NULL COMMENT '表单配置ID', - `table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '表名', - `form_info` json NOT NULL COMMENT '表单信息', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE, - KEY `table_name` (`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='表单配置'; +DROP TABLE IF EXISTS `gen_template_group`; +CREATE TABLE `gen_template_group` ( + `group_id` bigint NOT NULL COMMENT '分组id', + `template_id` bigint NOT NULL COMMENT '模板id', + PRIMARY KEY (`group_id`,`template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组关联表'; -- ---------------------------- --- Records of gen_form_conf +-- Records of gen_template_group -- ---------------------------- BEGIN; +INSERT INTO `gen_template_group` VALUES (1, 1); +INSERT INTO `gen_template_group` VALUES (1, 2); +INSERT INTO `gen_template_group` VALUES (1, 3); +INSERT INTO `gen_template_group` VALUES (1, 4); +INSERT INTO `gen_template_group` VALUES (1, 5); +INSERT INTO `gen_template_group` VALUES (1, 6); +INSERT INTO `gen_template_group` VALUES (1, 7); +INSERT INTO `gen_template_group` VALUES (1, 8); +INSERT INTO `gen_template_group` VALUES (1, 9); +INSERT INTO `gen_template_group` VALUES (1, 10); COMMIT; SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/pig_config.sql b/db/pig_config.sql index 3a404bb0..ba73c3da 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -37,13 +37,13 @@ CREATE TABLE `config_info` ( -- Records of config_info -- ---------------------------- BEGIN; -INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pig\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', '81f8bae4b8125fd198704f797268c6b5', '2022-05-08 12:10:37', '2023-02-28 14:45:23', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pig\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n type-handlers-package: com.pig4cloud.pig.common.mybatis.handler\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n shrink-whitespaces-in-sql: true\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', 'a07e272a112eaa8d4f7ea2a257bf5076', '2022-05-08 12:10:37', '2023-08-17 21:20:45', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '74f53b71c7799aa754da75662378b93c', '2022-05-08 12:10:37', '2022-06-04 14:15:35', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'cf786dbe3b07074fc187bf2eab3266b1', '2022-05-08 12:10:37', '2023-01-28 14:05:36', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', '000988cf0102382d3f23df35027b47fd', '2022-05-08 12:10:37', '2022-06-07 14:00:11', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 代码生成模块\n - id: pig-quartz\n uri: lb://pig-quartz\n predicates:\n - Path=/job/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', 'cde041935aeeb2a5f59bf3b56d78f56d', '2022-05-08 12:10:37', '2023-07-05 13:50:59', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '899d2431d91da0d521378cc7fa61268d', '2022-05-08 12:10:37', '2023-01-28 14:01:46', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (7, 'pig-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# xxl\nxxl:\n job:\n accessToken: default_token\n i18n: zh_CN\n logretentiondays: 30\n triggerpool:\n fast.max: 200\n slow.max: 200\n\n# mybatis\nmybatis:\n mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n\nspring:\n datasource:\n url: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n mvc:\n static-path-pattern: /static/**\n freemarker:\n suffix: .ftl\n request-context-attribute: request\n settings:\n number_format: 0.##########\n mail:\n host: smtp.mxhichina.com\n port: 465\n from: xxxx@gitee.wang\n username: xxxx@gitee.wang\n password: xxxx\n properties:\n mail:\n smtp:\n auth: true\n ssl.enable: true\n starttls.enable: false\n required: false\n# spring boot admin 配置\n\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS\n\n', 'b67cbbd37c8b42cdc6521780b3ed742a', '2022-11-27 17:23:42', '2022-11-27 17:28:01', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\nfile:\n bucketName: s3demo \n local:\n enable: true\n base-path: /Users/lengleng/Downloads/img', '48f8db128aeb5debb331bae49ff37908', '2022-05-08 12:10:37', '2023-07-07 14:44:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:4000/pig_job?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构 (第一次启动自动创建表,后续改成never 即可)\n jdbc:\n initialize-schema: always\n\n', '7a2859cbd056ef554b6163f5c70dfcf5', '2023-07-02 12:24:33', '2023-08-17 20:44:54', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); COMMIT; -- ---------------------------- diff --git a/db/pig_job.sql b/db/pig_job.sql index 76617829..f78adefa 100644 --- a/db/pig_job.sql +++ b/db/pig_job.sql @@ -2,119 +2,57 @@ DROP DATABASE IF EXISTS `pig_job`; CREATE DATABASE `pig_job` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -use `pig_job`; - -SET NAMES utf8mb4; - -CREATE TABLE `xxl_job_info` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `job_group` int(11) NOT NULL COMMENT '执行器主键ID', - `job_desc` varchar(255) NOT NULL, - `add_time` datetime DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - `author` varchar(64) DEFAULT NULL COMMENT '作者', - `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', - `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型', - `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型', - `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略', - `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', - `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', - `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', - `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略', - `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', - `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', - `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型', - `glue_source` mediumtext COMMENT 'GLUE源代码', - `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注', - `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间', - `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔', - `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行', - `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间', - `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_log` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `job_group` int(11) NOT NULL COMMENT '执行器主键ID', - `job_id` int(11) NOT NULL COMMENT '任务,主键ID', - `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址', - `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', - `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', - `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2', - `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', - `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', - `trigger_code` int(11) NOT NULL COMMENT '调度-结果', - `trigger_msg` text COMMENT '调度-日志', - `handle_time` datetime DEFAULT NULL COMMENT '执行-时间', - `handle_code` int(11) NOT NULL COMMENT '执行-状态', - `handle_msg` text COMMENT '执行-日志', - `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败', - PRIMARY KEY (`id`), - KEY `I_trigger_time` (`trigger_time`), - KEY `I_handle_code` (`handle_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_log_report` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间', - `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量', - `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量', - `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', - `update_time` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_logglue` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `job_id` int(11) NOT NULL COMMENT '任务,主键ID', - `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型', - `glue_source` mediumtext COMMENT 'GLUE源代码', - `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注', - `add_time` datetime DEFAULT NULL, - `update_time` datetime DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_registry` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `registry_group` varchar(50) NOT NULL, - `registry_key` varchar(255) NOT NULL, - `registry_value` varchar(255) NOT NULL, - `update_time` datetime DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_group` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `app_name` varchar(64) NOT NULL COMMENT '执行器AppName', - `title` varchar(12) NOT NULL COMMENT '执行器名称', - `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', - `address_list` text COMMENT '执行器地址列表,多地址逗号分隔', - `update_time` datetime DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `username` varchar(50) NOT NULL COMMENT '账号', - `password` varchar(50) NOT NULL COMMENT '密码', - `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员', - `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', - PRIMARY KEY (`id`), - UNIQUE KEY `i_username` (`username`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -CREATE TABLE `xxl_job_lock` ( - `lock_name` varchar(50) NOT NULL COMMENT '锁名称', - PRIMARY KEY (`lock_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' ); -INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', ''); -INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL); -INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock'); - +USE pig_job; + +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint NOT NULL COMMENT '任务id', + `job_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务组名', + `job_order` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', + `job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', + `execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空', + `class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', + `method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法', + `method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 DEFAULT '3' COMMENT '错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行)', + `job_tenant_type` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '1、多租户任务;2、非多租户任务', + `job_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(1、未发布;2、运行中;3、暂停;4、删除;)', + `job_execute_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(0正常 1异常)', + `create_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间', + `previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间', + `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间', + `remark` varchar(500) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表'; + +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint NOT NULL COMMENT '任务日志ID', + `job_id` bigint NOT NULL COMMENT '任务id', + `job_name` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务组名', + `job_order` char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', + `job_type` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', + `execute_path` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空', + `class_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', + `method_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务方法', + `method_params_value` varchar(2000) CHARACTER SET utf8 DEFAULT NULL COMMENT '参数值', + `cron_expression` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'cron执行表达式', + `job_message` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '日志信息', + `job_log_status` char(1) CHARACTER SET utf8 DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `execute_time` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '执行时间', + `exception_info` varchar(2000) CHARACTER SET utf8 DEFAULT '' COMMENT '异常信息', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务执行日志表'; commit; diff --git a/docker-compose.yml b/docker-compose.yml index 3380751d..bebfe470 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,12 +9,20 @@ services: restart: always container_name: pig-mysql image: pig-mysql + ports: + - 3306:3306 + networks: + - spring_cloud_default pig-redis: image: redis:7.0.0 + ports: + - 6379:6379 restart: always container_name: pig-redis hostname: pig-redis + networks: + - spring_cloud_default pig-register: build: @@ -25,6 +33,8 @@ services: container_name: pig-register hostname: pig-register image: pig-register + networks: + - spring_cloud_default pig-gateway: build: @@ -35,6 +45,8 @@ services: container_name: pig-gateway hostname: pig-gateway image: pig-gateway + networks: + - spring_cloud_default pig-auth: build: @@ -43,6 +55,8 @@ services: container_name: pig-auth hostname: pig-auth image: pig-auth + networks: + - spring_cloud_default pig-upms: build: @@ -51,6 +65,8 @@ services: container_name: pig-upms hostname: pig-upms image: pig-upms + networks: + - spring_cloud_default pig-monitor: build: @@ -61,15 +77,8 @@ services: container_name: pig-monitor hostname: pig-monitor image: pig-monitor - - pig-sentinel: - build: - context: ./pig-visual/pig-sentinel-dashboard - restart: always - image: pig-sentinel - container_name: pig-sentinel - ports: - - 5003:5003 + networks: + - spring_cloud_default pig-codegen: build: @@ -78,13 +87,19 @@ services: container_name: pig-codegen hostname: pig-codegen image: pig-codegen + networks: + - spring_cloud_default - pig-job: + pig-quartz: build: - context: ./pig-visual/pig-xxl-job-admin + context: ./pig-visual/pig-quartz restart: always - container_name: pig-job - hostname: pig-job - image: pig-job - ports: - - 5004:5004 + image: pig-quartz + container_name: pig-quartz + networks: + - spring_cloud_default + +networks: + spring_cloud_default: + name: spring_cloud_default + driver: bridge diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 9557d78d..50348180 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.7 + 3.7.0-JDK8 pig-auth diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java index 51b358ed..a9c951da 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java @@ -27,6 +27,7 @@ import com.pig4cloud.pig.admin.api.vo.TokenVo; import com.pig4cloud.pig.auth.support.handler.PigAuthenticationFailureEventHandler; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.CommonConstants; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.RetOps; import com.pig4cloud.pig.common.core.util.SpringContextHolder; @@ -34,6 +35,8 @@ import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.pig.common.security.util.OAuth2EndpointUtils; import com.pig4cloud.pig.common.security.util.OAuth2ErrorCodesExpand; import com.pig4cloud.pig.common.security.util.OAuthClientException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -59,8 +62,6 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.security.Principal; import java.util.List; import java.util.Map; @@ -107,7 +108,8 @@ public class PigTokenEndpoint { @RequestParam(OAuth2ParameterNames.CLIENT_ID) String clientId, @RequestParam(OAuth2ParameterNames.SCOPE) String scope, @RequestParam(OAuth2ParameterNames.STATE) String state) { - SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)) + SysOauthClientDetails clientDetails = RetOps + .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)) .getData() .orElseThrow(() -> new OAuthClientException("clientId 不合法")); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java index 2f681311..9082042e 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java @@ -1,6 +1,7 @@ package com.pig4cloud.pig.auth.support.base; import com.pig4cloud.pig.common.security.util.OAuth2EndpointUtils; +import javax.servlet.http.HttpServletRequest; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.core.OAuth2ErrorCodes; @@ -9,7 +10,6 @@ import org.springframework.security.web.authentication.AuthenticationConverter; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; -import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.HashSet; import java.util.Map; diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 0ef6892c..22044ec1 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -3,7 +3,6 @@ package com.pig4cloud.pig.auth.support.base; import cn.hutool.extra.spring.SpringUtil; import com.pig4cloud.pig.common.security.util.OAuth2ErrorCodesExpand; import com.pig4cloud.pig.common.security.util.ScopeException; -import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.context.support.MessageSourceAccessor; @@ -36,7 +35,6 @@ import java.util.function.Supplier; * * 处理自定义授权 */ -@Slf4j public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider implements AuthenticationProvider { @@ -111,29 +109,29 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider authorizedScopes; // Default to configured scopes - if (!CollectionUtils.isEmpty(resourceOwnerBaseAuthentication.getScopes())) { - for (String requestedScope : resourceOwnerBaseAuthentication.getScopes()) { + if (!CollectionUtils.isEmpty(resouceOwnerBaseAuthentication.getScopes())) { + for (String requestedScope : resouceOwnerBaseAuthentication.getScopes()) { if (!registeredClient.getScopes().contains(requestedScope)) { throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_SCOPE); } } - authorizedScopes = new LinkedHashSet<>(resourceOwnerBaseAuthentication.getScopes()); + authorizedScopes = new LinkedHashSet<>(resouceOwnerBaseAuthentication.getScopes()); } else { - throw new ScopeException(OAuth2ErrorCodesExpand.SCOPE_IS_EMPTY); + authorizedScopes = new LinkedHashSet<>(); } - Map reqParameters = resourceOwnerBaseAuthentication.getAdditionalParameters(); + Map reqParameters = resouceOwnerBaseAuthentication.getAdditionalParameters(); try { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = buildToken(reqParameters); @@ -149,14 +147,14 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider logout.logoutSuccessHandler(new SsoLogoutSuccessHandler()) + .deleteCookies("JSESSIONID") + .invalidateHttpSession(true)) // SSO登出成功处理 + + .csrf(AbstractHttpConfigurer::disable); } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java index 1be78b53..67463377 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java @@ -1,11 +1,11 @@ package com.pig4cloud.pig.auth.support.core; import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.spring.SpringUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.WebUtils; import com.pig4cloud.pig.common.security.service.PigUserDetailsService; +import javax.servlet.http.HttpServletRequest; import lombok.SneakyThrows; import org.springframework.core.Ordered; import org.springframework.security.authentication.BadCredentialsException; @@ -24,7 +24,6 @@ import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.web.authentication.www.BasicAuthenticationConverter; import org.springframework.util.Assert; -import javax.servlet.http.HttpServletRequest; import java.util.Comparator; import java.util.Map; import java.util.Optional; @@ -70,7 +69,7 @@ public class PigDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat // app 模式不用校验密码 String grantType = WebUtils.getRequest().get().getParameter(OAuth2ParameterNames.GRANT_TYPE); - if (StrUtil.equals(SecurityConstants.APP, grantType)) { + if (StrUtil.equals(SecurityConstants.MOBILE, grantType)) { return; } @@ -89,15 +88,15 @@ public class PigDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat @SneakyThrows @Override + protected final UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) { prepareTimingAttackProtection(); HttpServletRequest request = WebUtils.getRequest() .orElseThrow( (Supplier) () -> new InternalAuthenticationServiceException("web request is empty")); - Map paramMap = ServletUtil.getParamMap(request); - String grantType = paramMap.get(OAuth2ParameterNames.GRANT_TYPE); - String clientId = paramMap.get(OAuth2ParameterNames.CLIENT_ID); + String grantType = WebUtils.getRequest().get().getParameter(OAuth2ParameterNames.GRANT_TYPE); + String clientId = WebUtils.getRequest().get().getParameter(OAuth2ParameterNames.CLIENT_ID); if (StrUtil.isBlank(clientId)) { clientId = basicConvert.convert(request).getName(); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/FormAuthenticationFailureHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/FormAuthenticationFailureHandler.java index f4c0ad5f..636af33e 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/FormAuthenticationFailureHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/FormAuthenticationFailureHandler.java @@ -19,14 +19,13 @@ package com.pig4cloud.pig.auth.support.handler; import cn.hutool.core.util.CharsetUtil; import cn.hutool.http.HttpUtil; import com.pig4cloud.pig.common.core.util.WebUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - /** * @author lengleng * @date 2022-06-02 diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java index 979282e1..cdf42d2a 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java @@ -23,10 +23,11 @@ import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.SpringContextHolder; -import com.pig4cloud.pig.common.core.util.WebUtils; import com.pig4cloud.pig.common.log.event.SysLogEvent; import com.pig4cloud.pig.common.log.util.LogTypeEnum; import com.pig4cloud.pig.common.log.util.SysLogUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -38,8 +39,6 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.web.authentication.AuthenticationFailureHandler; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -67,7 +66,7 @@ public class PigAuthenticationFailureEventHandler implements AuthenticationFailu log.info("用户:{} 登录失败,异常:{}", username, exception.getLocalizedMessage()); SysLog logVo = SysLogUtils.getSysLog(); logVo.setTitle("登录失败"); - logVo.setType(LogTypeEnum.ERROR.getType()); + logVo.setLogType(LogTypeEnum.ERROR.getType()); logVo.setException(exception.getLocalizedMessage()); // 发送异步日志事件 String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME); @@ -76,10 +75,7 @@ public class PigAuthenticationFailureEventHandler implements AuthenticationFailu Long endTime = System.currentTimeMillis(); logVo.setTime(endTime - startTime); } - - logVo.setServiceId(WebUtils.getClientId()); logVo.setCreateBy(username); - logVo.setUpdateBy(username); SpringContextHolder.publishEvent(new SysLogEvent(logVo)); // 写出错误信息 sendErrorResponse(request, response, exception); @@ -103,7 +99,7 @@ public class PigAuthenticationFailureEventHandler implements AuthenticationFailu // 手机号登录 String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); - if (SecurityConstants.APP.equals(grantType)) { + if (SecurityConstants.MOBILE.equals(grantType)) { errorMessage = MsgUtils.getSecurityMessage("AbstractUserDetailsAuthenticationProvider.smsBadCredentials"); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java index 09e6f01f..40dff7d5 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java @@ -24,24 +24,23 @@ import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.SpringContextHolder; import com.pig4cloud.pig.common.log.event.SysLogEvent; import com.pig4cloud.pig.common.log.util.SysLogUtils; +import com.pig4cloud.pig.common.security.component.PigCustomOAuth2AccessTokenResponseHttpMessageConverter; import com.pig4cloud.pig.common.security.service.PigUser; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.security.oauth2.core.OAuth2RefreshToken; import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; -import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.util.CollectionUtils; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.temporal.ChronoUnit; import java.util.Map; @@ -53,7 +52,7 @@ import java.util.Map; @Slf4j public class PigAuthenticationSuccessEventHandler implements AuthenticationSuccessHandler { - private final HttpMessageConverter accessTokenHttpResponseConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); + private final HttpMessageConverter accessTokenHttpResponseConverter = new PigCustomOAuth2AccessTokenResponseHttpMessageConverter(); /** * Called when a user has been successfully authenticated. @@ -72,10 +71,7 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce // 发送异步日志事件 PigUser userInfo = (PigUser) map.get(SecurityConstants.DETAILS_USER); log.info("用户:{} 登录成功", userInfo.getName()); - // 避免 race condition - SecurityContext context = SecurityContextHolder.createEmptyContext(); - context.setAuthentication(accessTokenAuthentication); - SecurityContextHolder.setContext(context); + SecurityContextHolder.getContext().setAuthentication(accessTokenAuthentication); SysLog logVo = SysLogUtils.getSysLog(); logVo.setTitle("登录成功"); String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME); @@ -84,10 +80,7 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce Long endTime = System.currentTimeMillis(); logVo.setTime(endTime - startTime); } - - logVo.setServiceId(accessTokenAuthentication.getRegisteredClient().getClientId()); logVo.setCreateBy(userInfo.getName()); - logVo.setUpdateBy(userInfo.getName()); SpringContextHolder.publishEvent(new SysLogEvent(logVo)); } @@ -121,6 +114,7 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce // 无状态 注意删除 context 上下文的信息 SecurityContextHolder.clearContext(); + this.accessTokenHttpResponseConverter.write(accessTokenResponse, null, httpResponse); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigLogoutSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigLogoutSuccessEventHandler.java index b929345b..cbd10860 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigLogoutSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigLogoutSuccessEventHandler.java @@ -70,7 +70,6 @@ public class PigLogoutSuccessEventHandler implements ApplicationListenercom.pig4cloud pig-common-bom - 3.6.7 + 3.7.0-JDK8 pom pig-common-bom @@ -15,7 +15,7 @@ ${project.version} - 2.7.10 + 2.7.13 UTF-8 2.17.1 1.8 @@ -25,15 +25,17 @@ 1.2.83 1.6.9 2.2.0 - 3.5.3.1 + 3.5.3.2 + 4.1.3 8.0.33 1.6.1 1.2.6 7.1 + 1.11.543 1.0.5 2.0.2 2.3.5 - 5.8.20 + 5.8.21 2.7.4 1.8.4 @@ -91,6 +93,11 @@ pig-common-xss ${pig.common.version} + + com.pig4cloud + pig-common-oss + ${pig.common.version} + com.pig4cloud pig-upms-api @@ -134,6 +141,18 @@ excel-spring-boot-starter ${excel.version} + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-ds.version} + + + + com.amazonaws + aws-java-sdk-s3 + ${aws.version} + io.springboot.sms diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index 6b3a2332..205af844 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-core diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/CacheConstants.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/CacheConstants.java index 0de69d68..cc4e6174 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/CacheConstants.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/CacheConstants.java @@ -29,11 +29,6 @@ public interface CacheConstants { */ String PROJECT_OAUTH_ACCESS = "token::access_token"; - /** - * oauth 缓存令牌前缀 - */ - String PROJECT_OAUTH_TOKEN = "pig_oauth:token:"; - /** * 验证码前缀 */ @@ -54,6 +49,11 @@ public interface CacheConstants { */ String DICT_DETAILS = "dict_details"; + /** + * 角色信息缓存 + */ + String ROLE_DETAILS = "role_details"; + /** * oauth 客户端信息 */ diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java index 15b2a312..acda5fa6 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java @@ -65,7 +65,7 @@ public interface SecurityConstants { /** * 手机号登录 */ - String APP = "app"; + String MOBILE = "mobile"; /** * {bcrypt} 加密的特征码 @@ -92,6 +92,11 @@ public interface SecurityConstants { */ String DETAILS_USER = "user_info"; + /** + * 用户ID + */ + String DETAILS_USER_ID = "user_id"; + /** * 协议字段 */ @@ -120,7 +125,7 @@ public interface SecurityConstants { /** * 短信登录 参数名称 */ - String SMS_PARAMETER_NAME = "phone"; + String SMS_PARAMETER_NAME = "mobile"; /** * 授权码模式confirm diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index e03d585e..31a09b9d 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -16,28 +16,31 @@ --> - - pig-common - com.pig4cloud - 3.6.7 - - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + pig-common + com.pig4cloud + 3.7.0-JDK8 + + 4.0.0 - com.pig4cloud - pig-common-datasource + com.pig4cloud + pig-common-datasource - jar + jar - pig 动态切换数据源 + pig 动态切换数据源 - - - - com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-ds.version} - - + + + + com.baomidou + dynamic-datasource-spring-boot-starter + + + jakarta.servlet + jakarta.servlet-api + + diff --git a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/DynamicDataSourceAutoConfiguration.java b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/DynamicDataSourceAutoConfiguration.java index 6492235c..1d88abcf 100644 --- a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/DynamicDataSourceAutoConfiguration.java +++ b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/DynamicDataSourceAutoConfiguration.java @@ -16,17 +16,29 @@ package com.pig4cloud.pig.common.datasource; +import com.baomidou.dynamic.datasource.creator.DataSourceCreator; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; +import com.baomidou.dynamic.datasource.creator.hikaricp.HikariDataSourceCreator; +import com.baomidou.dynamic.datasource.processor.DsHeaderProcessor; import com.baomidou.dynamic.datasource.processor.DsProcessor; +import com.baomidou.dynamic.datasource.processor.DsSessionProcessor; +import com.baomidou.dynamic.datasource.processor.DsSpelExpressionProcessor; import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; +import com.pig4cloud.pig.common.datasource.config.ClearTtlDataSourceFilter; import com.pig4cloud.pig.common.datasource.config.DataSourceProperties; import com.pig4cloud.pig.common.datasource.config.JdbcDynamicDataSourceProvider; import com.pig4cloud.pig.common.datasource.config.LastParamDsProcessor; import org.jasypt.encryption.StringEncryptor; +import org.springframework.beans.factory.BeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.expression.BeanFactoryResolver; + +import java.util.ArrayList; +import java.util.List; /** * @author lengleng @@ -39,15 +51,57 @@ import org.springframework.context.annotation.Configuration; @EnableConfigurationProperties(DataSourceProperties.class) public class DynamicDataSourceAutoConfiguration { + /** + * 动态数据源提供者 + * @param defaultDataSourceCreator 默认数据源创建器 + * @param stringEncryptor 字符串加密器 + * @param properties 数据源配置属性 + * @return 动态数据源提供者 + */ + @Bean + public DynamicDataSourceProvider dynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, + StringEncryptor stringEncryptor, DataSourceProperties properties) { + return new JdbcDynamicDataSourceProvider(defaultDataSourceCreator, stringEncryptor, properties); + } + + /** + * 获取数据源处理器 + * @return 数据源处理器 + */ + @Bean + public DsProcessor dsProcessor(BeanFactory beanFactory) { + DsProcessor lastParamDsProcessor = new LastParamDsProcessor(); + DsProcessor headerProcessor = new DsHeaderProcessor(); + DsProcessor sessionProcessor = new DsSessionProcessor(); + DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor(); + spelExpressionProcessor.setBeanResolver(new BeanFactoryResolver(beanFactory)); + lastParamDsProcessor.setNextProcessor(headerProcessor); + headerProcessor.setNextProcessor(sessionProcessor); + sessionProcessor.setNextProcessor(spelExpressionProcessor); + return lastParamDsProcessor; + } + + /** + * 默认数据源创建器 + * @param hikariDataSourceCreator Hikari数据源创建器 + * @return 默认数据源创建器 + */ @Bean - public DynamicDataSourceProvider dynamicDataSourceProvider(StringEncryptor stringEncryptor, - DataSourceProperties properties) { - return new JdbcDynamicDataSourceProvider(stringEncryptor, properties); + public DefaultDataSourceCreator defaultDataSourceCreator(HikariDataSourceCreator hikariDataSourceCreator) { + DefaultDataSourceCreator defaultDataSourceCreator = new DefaultDataSourceCreator(); + List creators = new ArrayList<>(); + creators.add(hikariDataSourceCreator); + defaultDataSourceCreator.setCreators(creators); + return defaultDataSourceCreator; } + /** + * 清除Ttl数据源过滤器 + * @return 清除Ttl数据源过滤器 + */ @Bean - public DsProcessor dsProcessor() { - return new LastParamDsProcessor(); + public ClearTtlDataSourceFilter clearTtlDsFilter() { + return new ClearTtlDataSourceFilter(); } } diff --git a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/ClearTtlDataSourceFilter.java b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/ClearTtlDataSourceFilter.java new file mode 100644 index 00000000..e485d170 --- /dev/null +++ b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/ClearTtlDataSourceFilter.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pig.common.datasource.config; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import org.springframework.core.Ordered; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +/** + * @author lengleng + * @date 2020/12/11 + *

+ * 清空上文的DS 设置避免污染当前线程 + */ +public class ClearTtlDataSourceFilter extends GenericFilterBean implements Ordered { + + @Override + public int getOrder() { + return Integer.MIN_VALUE; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + DynamicDataSourceContextHolder.clear(); + filterChain.doFilter(servletRequest, servletResponse); + DynamicDataSourceContextHolder.clear(); + } + +} diff --git a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/JdbcDynamicDataSourceProvider.java b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/JdbcDynamicDataSourceProvider.java index 9f8e81a8..ca1433da 100644 --- a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/JdbcDynamicDataSourceProvider.java +++ b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/config/JdbcDynamicDataSourceProvider.java @@ -16,8 +16,9 @@ package com.pig4cloud.pig.common.datasource.config; +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.pig4cloud.pig.common.datasource.support.DataSourceConstants; import org.jasypt.encryption.StringEncryptor; @@ -39,8 +40,10 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide private final StringEncryptor stringEncryptor; - public JdbcDynamicDataSourceProvider(StringEncryptor stringEncryptor, DataSourceProperties properties) { - super(properties.getDriverClassName(), properties.getUrl(), properties.getUsername(), properties.getPassword()); + public JdbcDynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, + StringEncryptor stringEncryptor, DataSourceProperties properties) { + super(defaultDataSourceCreator, properties.getDriverClassName(), properties.getUrl(), properties.getUsername(), + properties.getPassword()); this.stringEncryptor = stringEncryptor; this.properties = properties; } diff --git a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsConfTypeEnum.java b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsConfTypeEnum.java new file mode 100644 index 00000000..2289806f --- /dev/null +++ b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsConfTypeEnum.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pig.common.datasource.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2020/12/11 + *

+ * 数据源配置类型 + */ +@Getter +@AllArgsConstructor +public enum DsConfTypeEnum { + + /** + * 主机链接 + */ + HOST(0, "主机链接"), + + /** + * JDBC链接 + */ + JDBC(1, "JDBC链接"); + + private final Integer type; + + private final String description; + +} diff --git a/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsJdbcUrlEnum.java b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsJdbcUrlEnum.java new file mode 100644 index 00000000..ccdad2e4 --- /dev/null +++ b/pig-common/pig-common-datasource/src/main/java/com/pig4cloud/pig/common/datasource/enums/DsJdbcUrlEnum.java @@ -0,0 +1,72 @@ +package com.pig4cloud.pig.common.datasource.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * @author lengleng + * @date 2020/12/11 + *

+ * jdbc-url + */ +@Getter +@AllArgsConstructor +public enum DsJdbcUrlEnum { + + /** + * mysql 数据库 + */ + MYSQL("mysql", + "jdbc:mysql://%s:%s/%s?characterEncoding=utf8" + + "&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true" + + "&useLegacyDatetimeCode=false&allowMultiQueries=true&allowPublicKeyRetrieval=true", + "select 1", "mysql8 链接"), + + /** + * pg 数据库 + */ + PG("pg", "jdbc:postgresql://%s:%s/%s", "select 1", "postgresql 链接"), + + /** + * SQL SERVER + */ + MSSQL("mssql", "jdbc:sqlserver://%s:%s;database=%s;characterEncoding=UTF-8", "select 1", "sqlserver 链接"), + + /** + * oracle + */ + ORACLE("oracle", "jdbc:oracle:thin:@%s:%s:%s", "select 1 from dual", "oracle 链接"), + + /** + * db2 + */ + DB2("db2", "jdbc:db2://%s:%s/%s", "select 1 from sysibm.sysdummy1", "DB2 TYPE4 连接"), + + /** + * 达梦 + */ + DM("dm", "jdbc:dm://%s:%s/%s", "select 1 from dual", "达梦连接"), + + /** + * pg 数据库 + */ + HIGHGO("highgo", "jdbc:highgo://%s:%s/%s", "select 1", "highgo 链接"); + + private final String dbName; + + private final String url; + + private final String validationQuery; + + private final String description; + + public static DsJdbcUrlEnum get(String dsType) { + return Arrays.stream(DsJdbcUrlEnum.values()) + .filter(dsJdbcUrlEnum -> dsType.equals(dsJdbcUrlEnum.getDbName())) + .findFirst() + .get(); + } + +} diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 0f2332db..82832f37 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 4.0.0 diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 6c5b166a..911f1770 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,13 +23,13 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-job jar - pig 定时任务,基于xxl-job + pig 定时任务,基于xxl-job 支持自动发现 diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index b01f6f38..c77d56c3 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-log diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/LogAutoConfiguration.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/LogAutoConfiguration.java index ef0d1622..1f3b46ff 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/LogAutoConfiguration.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/LogAutoConfiguration.java @@ -18,9 +18,10 @@ package com.pig4cloud.pig.common.log; import com.pig4cloud.pig.admin.api.feign.RemoteLogService; import com.pig4cloud.pig.common.log.aspect.SysLogAspect; +import com.pig4cloud.pig.common.log.config.PigLogProperties; import com.pig4cloud.pig.common.log.event.SysLogListener; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @@ -30,14 +31,14 @@ import org.springframework.scheduling.annotation.EnableAsync; * @date 2019/2/1 日志自动配置 */ @EnableAsync -@RequiredArgsConstructor -@ConditionalOnWebApplication @Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(PigLogProperties.class) +@ConditionalOnProperty(value = "security.log.enabled", matchIfMissing = true) public class LogAutoConfiguration { @Bean - public SysLogListener sysLogListener(RemoteLogService remoteLogService) { - return new SysLogListener(remoteLogService); + public SysLogListener sysLogListener(PigLogProperties logProperties, RemoteLogService remoteLogService) { + return new SysLogListener(remoteLogService, logProperties); } @Bean diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/aspect/SysLogAspect.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/aspect/SysLogAspect.java index 4d984530..59619c74 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/aspect/SysLogAspect.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/aspect/SysLogAspect.java @@ -17,11 +17,12 @@ package com.pig4cloud.pig.common.log.aspect; import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pig.admin.api.entity.SysLog; import com.pig4cloud.pig.common.core.util.SpringContextHolder; import com.pig4cloud.pig.common.log.event.SysLogEvent; +import com.pig4cloud.pig.common.log.event.SysLogEventSource; import com.pig4cloud.pig.common.log.util.LogTypeEnum; import com.pig4cloud.pig.common.log.util.SysLogUtils; +import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -37,6 +38,7 @@ import org.springframework.expression.EvaluationContext; */ @Aspect @Slf4j +@RequiredArgsConstructor public class SysLogAspect { @Around("@annotation(sysLog)") @@ -62,9 +64,12 @@ public class SysLogAspect { } } - SysLog logVo = SysLogUtils.getSysLog(); + SysLogEventSource logVo = SysLogUtils.getSysLog(); logVo.setTitle(value); - + // 获取请求body参数 + if (StrUtil.isBlank(logVo.getParams())) { + logVo.setBody(point.getArgs()); + } // 发送异步日志事件 Long startTime = System.currentTimeMillis(); Object obj; @@ -73,7 +78,7 @@ public class SysLogAspect { obj = point.proceed(); } catch (Exception e) { - logVo.setType(LogTypeEnum.ERROR.getType()); + logVo.setLogType(LogTypeEnum.ERROR.getType()); logVo.setException(e.getMessage()); throw e; } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/config/PigLogProperties.java similarity index 39% rename from pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java rename to pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/config/PigLogProperties.java index 961a857c..5891ada1 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthProperties.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/config/PigLogProperties.java @@ -1,33 +1,54 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * http://www.gnu.org/licenses/lgpl.html + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.dashboard.config; +package com.pig4cloud.pig.common.log.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; -@ConfigurationProperties(prefix = "auth") -public class AuthProperties { +import java.util.List; + +/** + * 日志配置类 + * + * @author L.cm + */ +@Getter +@Setter +@ConfigurationProperties(PigLogProperties.PREFIX) +public class PigLogProperties { + + public static final String PREFIX = "security.log"; + /** + * 开启日志记录 + */ private boolean enabled = true; - public boolean isEnabled() { - return enabled; - } + /** + * 放行字段,password,mobile,idcard,phone + */ + @Value("${security.log.exclude-fields:password,mobile,idcard,phone}") + private List excludeFields; - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } + /** + * 请求报文最大存储长度 + */ + private Integer maxLength = 2000; } diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogEventSource.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogEventSource.java new file mode 100644 index 00000000..a1bf7da7 --- /dev/null +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogEventSource.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pig.common.log.event; + +import com.pig4cloud.pig.admin.api.entity.SysLog; +import lombok.Data; + +/** + * spring event log + * + * @author lengleng + * @date 2023/8/11 + */ +@Data +public class SysLogEventSource extends SysLog { + + /** + * 参数重写成object + */ + private Object body; + +} diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java index 162ab829..581db9c5 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java @@ -16,29 +16,74 @@ package com.pig4cloud.pig.common.log.event; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.pig4cloud.pig.admin.api.entity.SysLog; import com.pig4cloud.pig.admin.api.feign.RemoteLogService; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import com.pig4cloud.pig.common.core.jackson.PigJavaTimeModule; +import com.pig4cloud.pig.common.log.config.PigLogProperties; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.InitializingBean; import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; import org.springframework.scheduling.annotation.Async; +import java.util.Objects; + /** * @author lengleng 异步监听日志事件 */ @Slf4j @RequiredArgsConstructor -public class SysLogListener { +public class SysLogListener implements InitializingBean { + + // new 一个 避免日志脱敏策略影响全局ObjectMapper + private final static ObjectMapper objectMapper = new ObjectMapper(); private final RemoteLogService remoteLogService; + private final PigLogProperties logProperties; + + @SneakyThrows @Async @Order @EventListener(SysLogEvent.class) public void saveSysLog(SysLogEvent event) { - SysLog sysLog = (SysLog) event.getSource(); - remoteLogService.saveLog(sysLog); + SysLogEventSource source = (SysLogEventSource) event.getSource(); + SysLog sysLog = new SysLog(); + BeanUtils.copyProperties(source, sysLog); + + // json 格式刷参数放在异步中处理,提升性能 + if (Objects.nonNull(source.getBody())) { + String params = objectMapper.writeValueAsString(source.getBody()); + sysLog.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); + } + + remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN); + } + + @Override + public void afterPropertiesSet() { + objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); + String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); + + FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", + SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); + objectMapper.setFilterProvider(filters); + objectMapper.registerModule(new PigJavaTimeModule()); + } + + @JsonFilter("filter properties by name") + class PropertyFilterMixIn { + } } diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java index 8f22ed6d..1ba935a0 100644 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java @@ -36,6 +36,9 @@ public class ApplicationLoggerInitializer implements EnvironmentPostProcessor, O // spring boot admin 直接加载日志 System.setProperty("logging.file.name", String.format("%s/%s/debug.log", logBase, appName)); + + // 避免 sentinel 1.8.4+ 心跳日志过大 + System.setProperty("csp.sentinel.log.level", "OFF"); } @Override diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java index 6046cfe9..f8ac27f3 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java @@ -17,13 +17,17 @@ package com.pig4cloud.pig.common.log.util; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.URLUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpUtil; -import com.pig4cloud.pig.admin.api.entity.SysLog; import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.log.config.PigLogProperties; +import com.pig4cloud.pig.common.log.event.SysLogEventSource; import lombok.experimental.UtilityClass; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.StandardReflectionParameterNameDiscoverer; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; @@ -37,6 +41,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; +import java.util.Map; import java.util.Objects; /** @@ -47,38 +52,24 @@ import java.util.Objects; @UtilityClass public class SysLogUtils { - public SysLog getSysLog() { + public SysLogEventSource getSysLog() { HttpServletRequest request = ((ServletRequestAttributes) Objects .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); - SysLog sysLog = new SysLog(); - sysLog.setType(LogTypeEnum.NORMAL.getType()); - sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); + SysLogEventSource sysLog = new SysLogEventSource(); + sysLog.setLogType(LogTypeEnum.NORMAL.getType()); sysLog.setRequestUri(URLUtil.getPath(request.getRequestURI())); sysLog.setMethod(request.getMethod()); + sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); sysLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); - sysLog.setParams(HttpUtil.toParams(request.getParameterMap())); sysLog.setCreateBy(getUsername()); - sysLog.setUpdateBy(getUsername()); sysLog.setServiceId(getClientId()); - return sysLog; - } - - /** - * 获取客户端 - * @return clientId - */ - private String getClientId() { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication == null) { - return null; - } - Object principal = authentication.getPrincipal(); - if (principal instanceof OAuth2AuthenticatedPrincipal) { - OAuth2AuthenticatedPrincipal auth2Authentication = (OAuth2AuthenticatedPrincipal) principal; - return MapUtil.getStr(auth2Authentication.getAttributes(), SecurityConstants.CLIENT_ID); - } - return null; + // get 参数脱敏 + PigLogProperties logProperties = SpringContextHolder.getBean(PigLogProperties.class); + Map paramsMap = MapUtil.removeAny(request.getParameterMap(), + ArrayUtil.toArray(logProperties.getExcludeFields(), String.class)); + sysLog.setParams(HttpUtil.toParams(paramsMap)); + return sysLog; } /** @@ -114,7 +105,7 @@ public class SysLogUtils { * @return 装载参数的容器 */ public EvaluationContext getContext(Object[] arguments, Method signatureMethod) { - String[] parameterNames = new LocalVariableTableParameterNameDiscoverer().getParameterNames(signatureMethod); + String[] parameterNames = new StandardReflectionParameterNameDiscoverer().getParameterNames(signatureMethod); EvaluationContext context = new StandardEvaluationContext(); if (parameterNames == null) { return context; @@ -125,4 +116,22 @@ public class SysLogUtils { return context; } + /** + * 获取客户端 + * @return clientId + */ + private String getClientId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return null; + } + + Object principal = authentication.getPrincipal(); + if (principal instanceof OAuth2AuthenticatedPrincipal) { + OAuth2AuthenticatedPrincipal auth2Authentication = (OAuth2AuthenticatedPrincipal) principal; + return MapUtil.getStr(auth2Authentication.getAttributes(), SecurityConstants.CLIENT_ID); + } + return null; + } + } diff --git a/pig-common/pig-common-log/src/main/resources/META-INF/spring-configuration-metadata.json b/pig-common/pig-common-log/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 00000000..951a9beb --- /dev/null +++ b/pig-common/pig-common-log/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,30 @@ +{ + "groups": [ + { + "name": "security.log", + "type": "com.pig4cloud.pig.common.log.config.PigLogProperties", + "sourceType": "com.pig4cloud.pig.common.log.config.PigLogProperties" + } + ], + "properties": [ + { + "name": "security.log.enabled", + "type": "java.lang.Boolean", + "description": "开启日志记录", + "sourceType": "com.pig4cloud.pig.common.log.config.PigLogProperties" + }, + { + "name": "security.log.exclude-fields", + "type": "java.util.List", + "description": "放行字段,password,mobile,idcard,phone", + "sourceType": "com.pig4cloud.pig.common.log.config.PigLogProperties" + }, + { + "name": "security.log.max-length", + "type": "java.lang.Integer", + "description": "请求报文最大存储长度", + "sourceType": "com.pig4cloud.pig.common.log.config.PigLogProperties" + } + ], + "hints": [] +} diff --git a/pig-common/pig-common-log/src/main/resources/META-INF/spring.factories b/pig-common/pig-common-log/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 7f7301ba..00000000 --- a/pig-common/pig-common-log/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -# https://github.com/spring-projects/spring-boot/issues/31252 -org.springframework.boot.env.EnvironmentPostProcessor=\ - com.pig4cloud.pig.common.log.init.ApplicationLoggerInitializer diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index c2d0b5da..3b0d1b3e 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-mybatis @@ -45,17 +45,12 @@ com.baomidou mybatis-plus-extension - + io.swagger.core.v3 swagger-annotations - - javax.servlet - javax.servlet-api - provided - org.springframework spring-webmvc @@ -67,5 +62,9 @@ spring-security-core true + + com.pig4cloud + pig-common-core + diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/config/MybatisPlusMetaObjectHandler.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/config/MybatisPlusMetaObjectHandler.java index fb84043d..67b0f7cf 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/config/MybatisPlusMetaObjectHandler.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/config/MybatisPlusMetaObjectHandler.java @@ -2,8 +2,10 @@ package com.pig4cloud.pig.common.mybatis.config; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.pig4cloud.pig.common.core.constant.CommonConstants; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; +import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.ClassUtils; @@ -25,10 +27,13 @@ public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { log.debug("mybatis plus start insert fill ...."); LocalDateTime now = LocalDateTime.now(); - fillValIfNullByName("createTime", now, metaObject, false); - fillValIfNullByName("updateTime", now, metaObject, false); - fillValIfNullByName("createBy", getUserName(), metaObject, false); - fillValIfNullByName("updateBy", getUserName(), metaObject, false); + fillValIfNullByName("createTime", now, metaObject, true); + fillValIfNullByName("updateTime", now, metaObject, true); + fillValIfNullByName("createBy", getUserName(), metaObject, true); + fillValIfNullByName("updateBy", getUserName(), metaObject, true); + + // 删除标记自动填充 + fillValIfNullByName("delFlag", CommonConstants.STATUS_NORMAL, metaObject, true); } @Override @@ -46,6 +51,11 @@ public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { * @param isCover 是否覆盖原有值,避免更新操作手动入参 */ private static void fillValIfNullByName(String fieldName, Object fieldVal, MetaObject metaObject, boolean isCover) { + // 0. 如果填充值为空 + if (fieldVal == null) { + return; + } + // 1. 没有 set 方法 if (!metaObject.hasSetter(fieldName)) { return; @@ -69,9 +79,15 @@ public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { */ private String getUserName() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + // 匿名接口直接返回 + if (authentication instanceof AnonymousAuthenticationToken) { + return null; + } + if (Optional.ofNullable(authentication).isPresent()) { return authentication.getName(); } + return null; } diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonLongArrayTypeHandler.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonLongArrayTypeHandler.java new file mode 100644 index 00000000..005c3ea2 --- /dev/null +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonLongArrayTypeHandler.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pig.common.mybatis.handler; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import lombok.SneakyThrows; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Mybatis数组,符串互转 + *

+ * MappedJdbcTypes 数据库中的数据类型 MappedTypes java中的的数据类型 + * + * @author xuzihui + * @date 2019-11-20 + */ +@MappedTypes(value = { Long[].class }) +@MappedJdbcTypes(value = JdbcType.VARCHAR) +public class JsonLongArrayTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Long[] parameter, JdbcType jdbcType) + throws SQLException { + ps.setString(i, ArrayUtil.join(parameter, StrUtil.COMMA)); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(ResultSet rs, String columnName) { + String reString = rs.getString(columnName); + return Convert.toLongArray(reString); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(ResultSet rs, int columnIndex) { + String reString = rs.getString(columnIndex); + return Convert.toLongArray(reString); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(CallableStatement cs, int columnIndex) { + String reString = cs.getString(columnIndex); + return Convert.toLongArray(reString); + } + +} diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonStringArrayTypeHandler.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonStringArrayTypeHandler.java new file mode 100644 index 00000000..017ca4d2 --- /dev/null +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/handler/JsonStringArrayTypeHandler.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pig.common.mybatis.handler; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import lombok.SneakyThrows; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Mybatis数组,符串互转 + *

+ * MappedJdbcTypes 数据库中的数据类型 MappedTypes java中的的数据类型 + * + * @author xuzihui + * @date 2019-11-20 + */ +@MappedTypes(value = { String[].class }) +@MappedJdbcTypes(value = JdbcType.VARCHAR) +public class JsonStringArrayTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) + throws SQLException { + ps.setString(i, ArrayUtil.join(parameter, StrUtil.COMMA)); + } + + @Override + @SneakyThrows + public String[] getNullableResult(ResultSet rs, String columnName) { + String reString = rs.getString(columnName); + return Convert.toStrArray(reString); + } + + @Override + @SneakyThrows + public String[] getNullableResult(ResultSet rs, int columnIndex) { + String reString = rs.getString(columnIndex); + return Convert.toStrArray(reString); + } + + @Override + @SneakyThrows + public String[] getNullableResult(CallableStatement cs, int columnIndex) { + String reString = cs.getString(columnIndex); + return Convert.toStrArray(reString); + } + +} diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 683b13e0..3b9a9a20 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -21,6 +21,7 @@ package com.pig4cloud.pig.common.mybatis.resolver; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; @@ -28,7 +29,6 @@ import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; -import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/pig-common/pig-common-oss/pom.xml b/pig-common/pig-common-oss/pom.xml new file mode 100755 index 00000000..13c33d0a --- /dev/null +++ b/pig-common/pig-common-oss/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + com.pig4cloud + pig-common + 3.7.0-JDK8 + + + pig-common-oss + jar + + pig 文件系统依赖 + + + + com.amazonaws + aws-java-sdk-s3 + + + cn.hutool + hutool-core + + + diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/FileAutoConfiguration.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/FileAutoConfiguration.java new file mode 100755 index 00000000..2227b953 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/FileAutoConfiguration.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file; + +import com.pig4cloud.pig.common.file.core.FileProperties; +import com.pig4cloud.pig.common.file.local.LocalFileAutoConfiguration; +import com.pig4cloud.pig.common.file.oss.OssAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Import; + +/** + * aws 自动配置类 + * + * @author lengleng + * @author 858695266 + */ +@Import({ LocalFileAutoConfiguration.class, OssAutoConfiguration.class }) +@EnableConfigurationProperties({ FileProperties.class }) +public class FileAutoConfiguration { + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileProperties.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileProperties.java new file mode 100755 index 00000000..e225cd95 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileProperties.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.core; + +import com.pig4cloud.pig.common.file.local.LocalFileProperties; +import com.pig4cloud.pig.common.file.oss.OssProperties; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 文件 配置信息 + * + * @author lengleng + *

+ * bucket 设置公共读权限 + */ +@Data +@ConfigurationProperties(prefix = "file") +public class FileProperties { + + /** + * 默认的存储桶名称 + */ + private String bucketName = "local"; + + /** + * 本地文件配置信息 + */ + private LocalFileProperties local; + + /** + * oss 文件配置信息 + */ + private OssProperties oss; + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileTemplate.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileTemplate.java new file mode 100644 index 00000000..c9e95785 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/core/FileTemplate.java @@ -0,0 +1,87 @@ +package com.pig4cloud.pig.common.file.core; + +import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import org.springframework.beans.factory.InitializingBean; + +import java.io.InputStream; +import java.util.List; + +/** + * 文件操作模板 + * + * @author lengleng + * @date 2022/4/19 + */ +public interface FileTemplate extends InitializingBean { + + /** + * 创建bucket + * @param bucketName bucket名称 + */ + void createBucket(String bucketName); + + /** + * 获取全部bucket + *

+ * + * API Documentation + */ + List getAllBuckets(); + + /** + * @param bucketName bucket名称 + * @see + */ + void removeBucket(String bucketName); + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + * @throws Exception + */ + void putObject(String bucketName, String objectName, InputStream stream, String contextType) throws Exception; + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + * @throws Exception + */ + void putObject(String bucketName, String objectName, InputStream stream) throws Exception; + + /** + * 获取文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 API Documentation + */ + S3Object getObject(String bucketName, String objectName); + + void removeObject(String bucketName, String objectName) throws Exception; + + /** + * @throws Exception + */ + @Override + default void afterPropertiesSet() throws Exception { + } + + /** + * 根据文件前置查询文件 + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return S3ObjectSummary 列表 + * @see AWS + * API Documentation + */ + List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive); + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileAutoConfiguration.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileAutoConfiguration.java new file mode 100755 index 00000000..bf34b0c3 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileAutoConfiguration.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.local; + +import com.pig4cloud.pig.common.file.core.FileProperties; +import com.pig4cloud.pig.common.file.core.FileTemplate; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; + +/** + * aws 自动配置类 + * + * @author lengleng + * @author 858695266 + */ +@AllArgsConstructor +public class LocalFileAutoConfiguration { + + private final FileProperties properties; + + @Bean + @ConditionalOnMissingBean(LocalFileTemplate.class) + @ConditionalOnProperty(name = "file.local.enable", havingValue = "true", matchIfMissing = true) + public FileTemplate localFileTemplate() { + return new LocalFileTemplate(properties); + } + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileProperties.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileProperties.java new file mode 100755 index 00000000..7cf833e9 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileProperties.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.local; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 本地文件 配置信息 + * + * @author lengleng + *

+ * bucket 设置公共读权限 + */ +@Data +@ConfigurationProperties(prefix = "local") +public class LocalFileProperties { + + /** + * 是否开启 + */ + private boolean enable; + + /** + * 默认路径 + */ + private String basePath; + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileTemplate.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileTemplate.java new file mode 100644 index 00000000..295186df --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/local/LocalFileTemplate.java @@ -0,0 +1,139 @@ +package com.pig4cloud.pig.common.file.local; + +import cn.hutool.core.io.FileUtil; +import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.pig4cloud.pig.common.file.core.FileProperties; +import com.pig4cloud.pig.common.file.core.FileTemplate; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +import java.io.File; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 本地文件读取模式 + * + * @author lengleng + * @date 2022/4/19 + */ +@RequiredArgsConstructor +public class LocalFileTemplate implements FileTemplate { + + private final FileProperties properties; + + /** + * 创建bucket + * @param bucketName bucket名称 + */ + @Override + public void createBucket(String bucketName) { + FileUtil.mkdir(properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName); + } + + /** + * 获取全部bucket + *

+ *

+ * API Documentation + */ + @Override + public List getAllBuckets() { + return Arrays.stream(FileUtil.ls(properties.getLocal().getBasePath())) + .filter(FileUtil::isDirectory) + .map(dir -> new Bucket(dir.getName())) + .collect(Collectors.toList()); + } + + /** + * @param bucketName bucket名称 + * @see + */ + @Override + public void removeBucket(String bucketName) { + FileUtil.del(properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + */ + @Override + public void putObject(String bucketName, String objectName, InputStream stream, String contextType) { + // 当 Bucket 不存在时创建 + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + if (!FileUtil.isDirectory(properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName)) { + createBucket(bucketName); + } + + // 写入文件 + File file = FileUtil.file(dir + FileUtil.FILE_SEPARATOR + objectName); + FileUtil.writeFromStream(stream, file); + } + + /** + * 获取文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 API Documentation + */ + @Override + @SneakyThrows + public S3Object getObject(String bucketName, String objectName) { + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + S3Object s3Object = new S3Object(); + s3Object.setObjectContent(FileUtil.getInputStream(dir + FileUtil.FILE_SEPARATOR + objectName)); + return s3Object; + } + + /** + * @param bucketName + * @param objectName + * @throws Exception + */ + @Override + public void removeObject(String bucketName, String objectName) throws Exception { + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + FileUtil.del(dir + FileUtil.FILE_SEPARATOR + objectName); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @throws Exception + */ + @Override + public void putObject(String bucketName, String objectName, InputStream stream) throws Exception { + putObject(bucketName, objectName, stream, null); + } + + /** + * 根据文件前置查询文件 + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return S3ObjectSummary 列表 + * @see AWS + * API Documentation + */ + @Override + public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) { + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + + return Arrays.stream(FileUtil.ls(dir)).filter(file -> file.getName().startsWith(prefix)).map(file -> { + S3ObjectSummary summary = new S3ObjectSummary(); + summary.setKey(file.getName()); + return new S3ObjectSummary(); + }).collect(Collectors.toList()); + } + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssAutoConfiguration.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssAutoConfiguration.java new file mode 100755 index 00000000..e0b31449 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssAutoConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.oss; + +import com.pig4cloud.pig.common.file.core.FileProperties; +import com.pig4cloud.pig.common.file.core.FileTemplate; +import com.pig4cloud.pig.common.file.oss.http.OssEndpoint; +import com.pig4cloud.pig.common.file.oss.service.OssTemplate; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; + +/** + * aws 自动配置类 + * + * @author lengleng + * @author 858695266 + */ +@AllArgsConstructor +public class OssAutoConfiguration { + + private final FileProperties properties; + + @Bean + @Primary + @ConditionalOnMissingBean(OssTemplate.class) + @ConditionalOnProperty(name = "file.oss.enable", havingValue = "true") + public FileTemplate ossTemplate() { + return new OssTemplate(properties); + } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "file.oss.info", havingValue = "true") + public OssEndpoint ossEndpoint(OssTemplate template) { + return new OssEndpoint(template); + } + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssProperties.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssProperties.java new file mode 100755 index 00000000..a1cad010 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/OssProperties.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.oss; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * aws 配置信息 + * + * @author lengleng + * @author 858695266 配置文件添加: oss: enable: true endpoint: http://127.0.0.1:9000 # + * pathStyleAccess 采用nginx反向代理或者AWS S3 配置成true,支持第三方云存储配置成false pathStyleAccess: false + * access-key: lengleng secret-key: lengleng bucket-name: lengleng region: custom-domain: + * https://oss.xxx.com/lengleng + *

+ * bucket 设置公共读权限 + */ +@Data +@ConfigurationProperties(prefix = "oss") +public class OssProperties { + + /** + * 对象存储服务的URL + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String customDomain; + + /** + * true path-style nginx 反向代理和S3默认支持 pathStyle {http://endpoint/bucketname} false + * supports virtual-hosted-style 阿里云等需要配置为 virtual-hosted-style + * 模式{http://bucketname.endpoint} + */ + private Boolean pathStyleAccess = true; + + /** + * 应用ID + */ + private String appId; + + /** + * 区域 + */ + private String region; + + /** + * Access key就像用户ID,可以唯一标识你的账户 + */ + private String accessKey; + + /** + * Secret key是你账户的密码 + */ + private String secretKey; + + /** + * 最大线程数,默认: 100 + */ + private Integer maxConnections = 100; + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java new file mode 100755 index 00000000..4ab42ca7 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.oss.http; + +import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.pig4cloud.pig.common.file.oss.service.OssTemplate; +import lombok.AllArgsConstructor; +import lombok.Cleanup; +import lombok.SneakyThrows; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * aws 对外提供服务端点 + * + * @author lengleng + * @author 858695266 + *

+ * oss.info + */ +@RestController +@AllArgsConstructor +@RequestMapping("/oss") +@ConditionalOnProperty(name = "file.oss.info", havingValue = "true") +public class OssEndpoint { + + private final OssTemplate template; + + /** + * Bucket Endpoints + */ + @SneakyThrows + @PostMapping("/bucket/{bucketName}") + public Bucket createBucker(@PathVariable String bucketName) { + + template.createBucket(bucketName); + return template.getBucket(bucketName).get(); + + } + + @SneakyThrows + @GetMapping("/bucket") + public List getBuckets() { + return template.getAllBuckets(); + } + + @SneakyThrows + @GetMapping("/bucket/{bucketName}") + public Bucket getBucket(@PathVariable String bucketName) { + return template.getBucket(bucketName).orElseThrow(() -> new IllegalArgumentException("Bucket Name not found!")); + } + + @SneakyThrows + @DeleteMapping("/bucket/{bucketName}") + @ResponseStatus(HttpStatus.ACCEPTED) + public void deleteBucket(@PathVariable String bucketName) { + template.removeBucket(bucketName); + } + + /** + * Object Endpoints + */ + @SneakyThrows + @PostMapping("/object/{bucketName}") + public S3Object createObject(@RequestBody MultipartFile object, @PathVariable String bucketName) { + String name = object.getOriginalFilename(); + @Cleanup + InputStream inputStream = object.getInputStream(); + template.putObject(bucketName, name, inputStream, object.getSize(), object.getContentType()); + return template.getObjectInfo(bucketName, name); + + } + + @SneakyThrows + @PostMapping("/object/{bucketName}/{objectName}") + public S3Object createObject(@RequestBody MultipartFile object, @PathVariable String bucketName, + @PathVariable String objectName) { + @Cleanup + InputStream inputStream = object.getInputStream(); + template.putObject(bucketName, objectName, inputStream, object.getSize(), object.getContentType()); + return template.getObjectInfo(bucketName, objectName); + + } + + @SneakyThrows + @GetMapping("/object/{bucketName}/{objectName}") + public List filterObject(@PathVariable String bucketName, @PathVariable String objectName) { + + return template.getAllObjectsByPrefix(bucketName, objectName, true); + + } + + @SneakyThrows + @GetMapping("/object/{bucketName}/{objectName}/{expires}") + public Map getObject(@PathVariable String bucketName, @PathVariable String objectName, + @PathVariable Integer expires) { + Map responseBody = new HashMap<>(8); + // Put Object info + responseBody.put("bucket", bucketName); + responseBody.put("object", objectName); + responseBody.put("url", template.getObjectURL(bucketName, objectName, expires)); + responseBody.put("expires", expires); + return responseBody; + } + + @SneakyThrows + @ResponseStatus(HttpStatus.ACCEPTED) + @DeleteMapping("/object/{bucketName}/{objectName}/") + public void deleteObject(@PathVariable String bucketName, @PathVariable String objectName) { + + template.removeObject(bucketName, objectName); + } + +} diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/service/OssTemplate.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/service/OssTemplate.java new file mode 100755 index 00000000..fd6bd119 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/service/OssTemplate.java @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.common.file.oss.service; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.*; +import com.amazonaws.util.IOUtils; +import com.pig4cloud.pig.common.file.core.FileProperties; +import com.pig4cloud.pig.common.file.core.FileTemplate; +import lombok.Cleanup; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.beans.factory.InitializingBean; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.*; + +/** + * aws-s3 通用存储操作 支持所有兼容s3协议的云存储: {阿里云OSS,腾讯云COS,七牛云,京东云,minio 等} + * + * @author lengleng + * @author 858695266 + * @date 2020/5/23 6:36 上午 + * @since 1.0 + */ +@RequiredArgsConstructor +public class OssTemplate implements InitializingBean, FileTemplate { + + private final FileProperties properties; + + private AmazonS3 amazonS3; + + /** + * 创建bucket + * @param bucketName bucket名称 + */ + @SneakyThrows + public void createBucket(String bucketName) { + if (!amazonS3.doesBucketExistV2(bucketName)) { + amazonS3.createBucket((bucketName)); + } + } + + /** + * 获取全部bucket + *

+ * + * @see AWS + * API Documentation + */ + @SneakyThrows + public List getAllBuckets() { + return amazonS3.listBuckets(); + } + + /** + * @param bucketName bucket名称 + * @see AWS + * API Documentation + */ + @SneakyThrows + public Optional getBucket(String bucketName) { + return amazonS3.listBuckets().stream().filter(b -> b.getName().equals(bucketName)).findFirst(); + } + + /** + * @param bucketName bucket名称 + * @see AWS API + * Documentation + */ + @SneakyThrows + public void removeBucket(String bucketName) { + amazonS3.deleteBucket(bucketName); + } + + /** + * 根据文件前置查询文件 + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return S3ObjectSummary 列表 + * @see AWS + * API Documentation + */ + @SneakyThrows + public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) { + ObjectListing objectListing = amazonS3.listObjects(bucketName, prefix); + return new ArrayList<>(objectListing.getObjectSummaries()); + } + + /** + * 获取文件外链 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param expires 过期时间 <=7 + * @return url + * @see AmazonS3#generatePresignedUrl(String bucketName, String key, Date expiration) + */ + @SneakyThrows + public String getObjectURL(String bucketName, String objectName, Integer expires) { + Date date = new Date(); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_MONTH, expires); + URL url = amazonS3.generatePresignedUrl(bucketName, objectName, calendar.getTime()); + return url.toString(); + } + + /** + * 获取文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 + * @see AWS + * API Documentation + */ + @SneakyThrows + public S3Object getObject(String bucketName, String objectName) { + return amazonS3.getObject(bucketName, objectName); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @throws Exception + */ + public void putObject(String bucketName, String objectName, InputStream stream) throws Exception { + putObject(bucketName, objectName, stream, stream.available(), "application/octet-stream"); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + * @throws Exception + */ + public void putObject(String bucketName, String objectName, InputStream stream, String contextType) + throws Exception { + putObject(bucketName, objectName, stream, stream.available(), contextType); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param size 大小 + * @param contextType 类型 + * @throws Exception + * @see AWS + * API Documentation + */ + public PutObjectResult putObject(String bucketName, String objectName, InputStream stream, long size, + String contextType) throws Exception { + // String fileName = getFileName(objectName); + byte[] bytes = IOUtils.toByteArray(stream); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(size); + objectMetadata.setContentType(contextType); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); + // 上传 + return amazonS3.putObject(bucketName, objectName, byteArrayInputStream, objectMetadata); + + } + + /** + * 获取文件信息 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @see AWS + * API Documentation + */ + public S3Object getObjectInfo(String bucketName, String objectName) throws Exception { + @Cleanup + S3Object object = amazonS3.getObject(bucketName, objectName); + return object; + } + + /** + * 删除文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @throws Exception + * @see AWS API + * Documentation + */ + public void removeObject(String bucketName, String objectName) throws Exception { + amazonS3.deleteObject(bucketName, objectName); + } + + @Override + public void afterPropertiesSet() { + ClientConfiguration clientConfiguration = new ClientConfiguration(); + clientConfiguration.setMaxConnections(properties.getOss().getMaxConnections()); + + AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration( + properties.getOss().getEndpoint(), properties.getOss().getRegion()); + AWSCredentials awsCredentials = new BasicAWSCredentials(properties.getOss().getAccessKey(), + properties.getOss().getSecretKey()); + AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials); + this.amazonS3 = AmazonS3Client.builder() + .withEndpointConfiguration(endpointConfiguration) + .withClientConfiguration(clientConfiguration) + .withCredentials(awsCredentialsProvider) + .disableChunkedEncoding() + .withPathStyleAccessEnabled(properties.getOss().getPathStyleAccess()) + .build(); + } + +} diff --git a/pig-common/pig-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..ae145c04 --- /dev/null +++ b/pig-common/pig-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pig.common.file.FileAutoConfiguration diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index d227a7fc..8d995c62 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index 46652e78..9cd6769e 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-security diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOAuth2AccessTokenResponseHttpMessageConverter.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOAuth2AccessTokenResponseHttpMessageConverter.java new file mode 100644 index 00000000..378240fc --- /dev/null +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOAuth2AccessTokenResponseHttpMessageConverter.java @@ -0,0 +1,51 @@ +package com.pig4cloud.pig.common.security.component; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.core.convert.converter.Converter; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.GenericHttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.security.oauth2.core.endpoint.DefaultOAuth2AccessTokenResponseMapConverter; +import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; + +import java.util.Map; + +/** + * 扩展原生的实现,支持 Long2String + * + * @author lengleng + * @date 2023/6/28 + */ +public class PigCustomOAuth2AccessTokenResponseHttpMessageConverter + extends OAuth2AccessTokenResponseHttpMessageConverter { + + private static final ParameterizedTypeReference> STRING_OBJECT_MAP = new ParameterizedTypeReference>() { + }; + + private Converter> accessTokenResponseParametersConverter = new DefaultOAuth2AccessTokenResponseMapConverter(); + + @Override + protected void writeInternal(OAuth2AccessTokenResponse tokenResponse, HttpOutputMessage outputMessage) + throws HttpMessageNotWritableException { + try { + Map tokenResponseParameters = this.accessTokenResponseParametersConverter + .convert(tokenResponse); + + ObjectMapper objectMapper = SpringContextHolder.getBean(ObjectMapper.class); + GenericHttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter( + objectMapper); + jsonMessageConverter.write(tokenResponseParameters, STRING_OBJECT_MAP.getType(), MediaType.APPLICATION_JSON, + outputMessage); + } + catch (Exception ex) { + throw new HttpMessageNotWritableException( + "An error occurred writing the OAuth 2.0 Access Token Response: " + ex.getMessage(), ex); + } + } + +} diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java index 2da51253..93a718af 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java @@ -16,6 +16,7 @@ package com.pig4cloud.pig.common.security.service; +import com.pig4cloud.pig.admin.api.dto.UserDTO; import com.pig4cloud.pig.admin.api.dto.UserInfo; import com.pig4cloud.pig.admin.api.feign.RemoteUserService; import com.pig4cloud.pig.common.core.constant.CacheConstants; @@ -54,7 +55,9 @@ public class PigAppUserDetailsServiceImpl implements PigUserDetailsService { return (PigUser) cache.get(phone).get(); } - R result = remoteUserService.infoByMobile(phone); + UserDTO userDTO = new UserDTO(); + userDTO.setPhone(phone); + R result = remoteUserService.info(userDTO, SecurityConstants.FROM_IN); UserDetails userDetails = getUserDetails(result); if (cache != null) { @@ -80,7 +83,7 @@ public class PigAppUserDetailsServiceImpl implements PigUserDetailsService { */ @Override public boolean support(String clientId, String grantType) { - return SecurityConstants.APP.equals(grantType); + return SecurityConstants.MOBILE.equals(grantType); } } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java index 65583c1e..35c62955 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java @@ -19,7 +19,6 @@ import org.springframework.security.oauth2.server.authorization.client.Registere import org.springframework.security.oauth2.server.authorization.settings.ClientSettings; import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat; import org.springframework.security.oauth2.server.authorization.settings.TokenSettings; -import org.springframework.util.StringUtils; import java.time.Duration; import java.util.Arrays; @@ -56,7 +55,6 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo */ @Override public void save(RegisteredClient registeredClient) { - throw new UnsupportedOperationException(); } /** @@ -87,48 +85,46 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") public RegisteredClient findByClientId(String clientId) { - SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)) - .getData() - .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( - new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); + SysOauthClientDetails clientDetails = RetOps + .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)) + .getData() + .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( + new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) - .clientId(clientDetails.getClientId()) - .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) - .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) - .clientAuthenticationMethods(clientAuthenticationMethods -> { - clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); - clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_POST); - }); - - // 授权模式 - Optional.ofNullable(clientDetails.getAuthorizedGrantTypes()) - .ifPresent(grants -> StringUtils.commaDelimitedListToSet(grants) - .forEach(s -> builder.authorizationGrantType(new AuthorizationGrantType(s)))); + .clientId(clientDetails.getClientId()) + .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + + + for (String authorizedGrantType : clientDetails.getAuthorizedGrantTypes()) { + builder.authorizationGrantType(new AuthorizationGrantType(authorizedGrantType)); + } + // 回调地址 Optional.ofNullable(clientDetails.getWebServerRedirectUri()) - .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) - .filter(StrUtil::isNotBlank) - .forEach(builder::redirectUri)); + .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::redirectUri)); // scope Optional.ofNullable(clientDetails.getScope()) - .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) - .filter(StrUtil::isNotBlank) - .forEach(builder::scope)); + .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::scope)); return builder - .tokenSettings(TokenSettings.builder() - .accessTokenFormat(OAuth2TokenFormat.REFERENCE) - .accessTokenTimeToLive(Duration.ofSeconds( - Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) - .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) - .orElse(refreshTokenValiditySeconds))) - .build()) - .clientSettings(ClientSettings.builder() - .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) - .build()) - .build(); + .tokenSettings(TokenSettings.builder() + .accessTokenFormat(OAuth2TokenFormat.REFERENCE) + .accessTokenTimeToLive(Duration.ofSeconds( + Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) + .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) + .orElse(refreshTokenValiditySeconds))) + .build()) + .clientSettings(ClientSettings.builder() + .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) + .build()) + .build(); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java index 0eb0b862..a997a928 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java @@ -16,9 +16,11 @@ package com.pig4cloud.pig.common.security.service; +import com.pig4cloud.pig.admin.api.dto.UserDTO; import com.pig4cloud.pig.admin.api.dto.UserInfo; import com.pig4cloud.pig.admin.api.feign.RemoteUserService; import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.R; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -55,7 +57,9 @@ public class PigUserDetailsServiceImpl implements PigUserDetailsService { return (PigUser) cache.get(username).get(); } - R result = remoteUserService.info(username); + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(username); + R result = remoteUserService.info(userDTO, SecurityConstants.FROM_IN); UserDetails userDetails = getUserDetails(result); if (cache != null) { cache.put(username, userDetails); diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index 50015985..e5374f45 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 615fd489..400dbb07 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.6.7 + 3.7.0-JDK8 pig-common-xss diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 15908dee..a41efaab 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.7 + 3.7.0-JDK8 pig-common @@ -36,6 +36,7 @@ pig-common-job pig-common-log pig-common-mybatis + pig-common-oss pig-common-seata pig-common-security pig-common-feign diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 9e4ea278..f0dd6548 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.7 + 3.7.0-JDK8 pig-gateway diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java index 9b24743b..b5a259eb 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/SpringDocConfiguration.java @@ -21,11 +21,11 @@ import java.util.Map; * swagger 3.0 展示 */ @Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(name = "springdoc.api-docs.enabled", matchIfMissing = true) public class SpringDocConfiguration { @Bean @Lazy(false) - @ConditionalOnProperty(name = "springdoc.api-docs.enabled", matchIfMissing = true) public List apis(SwaggerUiConfigParameters swaggerUiConfigParameters, SwaggerDocProperties swaggerProperties) { List groups = new ArrayList<>(); diff --git a/pig-register/Dockerfile b/pig-register/Dockerfile old mode 100755 new mode 100644 diff --git a/pig-register/pom.xml b/pig-register/pom.xml old mode 100755 new mode 100644 index 0c3f3af1..ccd1201d --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -12,101 +12,102 @@ limitations under the License. --> - 4.0.0 - - com.pig4cloud - pig - 3.6.7 - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.pig4cloud + pig + 3.7.0-JDK8 + - pig-register - jar - pig-register - nacos 注册配置中心 + pig-register + jar + pig-register + nacos 注册配置中心 - - 2.2.3 - + + 2.2.4 + - - - io.springboot.nacos - nacos-config - ${nacos.version} - - - org.apache.tomcat.embed - tomcat-embed-jasper - + + + io.springboot.nacos + nacos-config + ${nacos.version} + + + org.apache.tomcat.embed + tomcat-embed-jasper + - - io.springboot.nacos - nacos-naming - ${nacos.version} - + + io.springboot.nacos + nacos-naming + ${nacos.version} + - - io.springboot.nacos - nacos-istio - ${nacos.version} - + + io.springboot.nacos + nacos-istio + ${nacos.version} + - - io.springboot.nacos - nacos-plugin-default-impl - ${nacos.version} - + + io.springboot.nacos + nacos-plugin-default-impl + ${nacos.version} + - - io.springboot.nacos - nacos-prometheus - ${nacos.version} - + + io.springboot.nacos + nacos-prometheus + ${nacos.version} + - - org.springframework.boot - spring-boot-starter-security - + + org.springframework.boot + spring-boot-starter-security + - - cn.hutool - hutool-system - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - - - src/main/resources - true - - **/*.woff - **/*.woff2 - **/*.ttf - **/*.eot - - - - src/main/resources - false - - **/*.woff - **/*.woff2 - **/*.ttf - **/*.eot - - - - + + cn.hutool + hutool-system + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + src/main/resources + true + + **/*.woff + **/*.woff2 + **/*.ttf + **/*.eot + + + + src/main/resources + false + + **/*.woff + **/*.woff2 + **/*.ttf + **/*.eot + + + + diff --git a/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java b/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java old mode 100755 new mode 100644 index 42abdf46..eaef4fb9 --- a/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java +++ b/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java @@ -46,6 +46,7 @@ public class PigNacosApplication { System.setProperty(ConfigConstants.AUTH_ENABLED, "true"); System.setProperty(ConfigConstants.LOG_BASEDIR, "logs"); System.setProperty(ConfigConstants.LOG_ENABLED, "false"); + System.setProperty(ConfigConstants.NACOS_CONTEXT_PATH, "/nacos"); return true; } diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java b/pig-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java old mode 100755 new mode 100644 index 91133f54..b4998e42 --- a/pig-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java @@ -45,4 +45,9 @@ public interface ConfigConstants { */ String LOG_ENABLED = "server.tomcat.accesslog.enabled"; + /** + * 路径 nacos context path + */ + String NACOS_CONTEXT_PATH = "server.servlet.contextPath"; + } diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java index b5dbe6e8..be96ebcb 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java @@ -16,7 +16,6 @@ package com.alibaba.nacos.config; -import com.alibaba.nacos.console.filter.XssFilter; import com.alibaba.nacos.core.code.ControllerMethodsCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; @@ -65,17 +64,11 @@ public class ConsoleConfig { config.addAllowedHeader("*"); config.setMaxAge(18000L); config.addAllowedMethod("*"); - config.addAllowedOriginPattern("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } - @Bean - public XssFilter xssFilter() { - return new XssFilter(); - } - @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(ZoneId.systemDefault().toString()); diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java index 8eac3c71..1bceefa5 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java @@ -16,18 +16,19 @@ package com.alibaba.nacos.console.controller; +import cn.hutool.core.io.FileUtil; import com.alibaba.nacos.common.model.RestResult; import com.alibaba.nacos.common.model.RestResultUtils; -import com.alibaba.nacos.sys.env.EnvUtil; import com.alibaba.nacos.sys.module.ModuleState; import com.alibaba.nacos.sys.module.ModuleStateHolder; -import com.alibaba.nacos.sys.utils.DiskUtils; +import lombok.SneakyThrows; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.io.File; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; @@ -40,7 +41,7 @@ import java.util.Map; @RequestMapping("/v1/console/server") public class ServerStateController { - private static final String ANNOUNCEMENT_FILE = "announcement.conf"; + private static final String ANNOUNCEMENT_FILE = "conf/announcement.conf"; /** * Get server state of current server. @@ -55,14 +56,11 @@ public class ServerStateController { return ResponseEntity.ok().body(serverState); } + @SneakyThrows @GetMapping("/announcement") public RestResult getAnnouncement() { - File announcementFile = new File(EnvUtil.getConfPath(), ANNOUNCEMENT_FILE); - String announcement = null; - if (announcementFile.exists() && announcementFile.isFile()) { - announcement = DiskUtils.readFile(announcementFile); - } - return RestResultUtils.success(announcement); + ClassPathResource resource = new ClassPathResource(ANNOUNCEMENT_FILE); + return RestResultUtils.success(FileUtil.readString(resource.getFile(), Charset.defaultCharset())); } } diff --git a/pig-register/src/main/resources/META-INF/nacos-default.properties b/pig-register/src/main/resources/META-INF/nacos-default.properties deleted file mode 100644 index 04aa6500..00000000 --- a/pig-register/src/main/resources/META-INF/nacos-default.properties +++ /dev/null @@ -1,78 +0,0 @@ -# -# Copyright 1999-2018 Alibaba Group Holding Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# Console Default Properties - -spring.mvc.view.prefix=/jsp/ -# the default suffix of page -spring.mvc.view.suffix=.jsp -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration -#logging.level.root=DEBUG - -# P0 key,For Debug. whether use address-server; true:use; false:not use;default:true -useAddressServer=true - -# whether open interInterFaceFilter; true:open; false:close; if open, others can't call inner interface. default:false -openInnerInterfaceFilter=false - -# quickStart stip dumpAll;only dump change config -isQuickStart=false - -# server notify each otherd -notifyConnectTimeout=200 - -# server notify each other -notifySocketTimeout=8000 - -# whether health check -isHealthCheck=true - -# health check max fail count -maxHealthCheckFailCount=12 - -# whether open spas; true:open; false:close -OPEN_SPAS=true - -nacos.cmdb.dumpTaskInterval=3600 -nacos.cmdb.eventTaskInterval=10 -nacos.cmdb.labelTaskInterval=300 -nacos.cmdb.loadDataAtStart=false - -#management.endpoints.web.exposure.include=* - -#spring.security.enabled=false -#management.security=false -#security.basic.enabled=false -#nacos.security.ignore.urls=/** -nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/login,/v1/console/health,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/** - -management.metrics.export.elastic.enabled=false -#management.metrics.export.elastic.host=http://localhost:9200 - -# metrics for influx -management.metrics.export.influx.enabled=false -#management.metrics.export.influx.db=springboot -#management.metrics.export.influx.uri=http://localhost:8086 -#management.metrics.export.influx.auto-create-db=true -#management.metrics.export.influx.consistency=one -#management.metrics.export.influx.compressed=true - -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D -# default current work dir -server.tomcat.basedir= - - diff --git a/pig-register/src/main/resources/META-INF/schema.sql b/pig-register/src/main/resources/META-INF/schema.sql deleted file mode 100644 index db17fcb1..00000000 --- a/pig-register/src/main/resources/META-INF/schema.sql +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -CREATE SCHEMA nacos AUTHORIZATION nacos; - -CREATE TABLE config_info ( - id bigint NOT NULL generated by default as identity, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - tenant_id varchar(128) default '', - app_name varchar(128), - content CLOB, - md5 varchar(32) DEFAULT NULL, - gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - src_user varchar(128) DEFAULT NULL, - src_ip varchar(20) DEFAULT NULL, - c_desc varchar(256) DEFAULT NULL, - c_use varchar(64) DEFAULT NULL, - effect varchar(64) DEFAULT NULL, - type varchar(64) DEFAULT NULL, - c_schema LONG VARCHAR DEFAULT NULL, - encrypted_data_key LONG VARCHAR DEFAULT NULL, - constraint configinfo_id_key PRIMARY KEY (id), - constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id)); - -CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id); -CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id); -CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id); - -CREATE TABLE his_config_info ( - id bigint NOT NULL, - nid bigint NOT NULL generated by default as identity, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - tenant_id varchar(128) default '', - app_name varchar(128), - content CLOB, - md5 varchar(32) DEFAULT NULL, - gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000', - gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000', - src_user varchar(128), - src_ip varchar(20) DEFAULT NULL, - op_type char(10) DEFAULT NULL, - encrypted_data_key LONG VARCHAR DEFAULT NULL, - constraint hisconfiginfo_nid_key PRIMARY KEY (nid)); - -CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id); -CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create); -CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified); - - -CREATE TABLE config_info_beta ( - id bigint NOT NULL generated by default as identity, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - tenant_id varchar(128) default '', - app_name varchar(128), - content CLOB, - beta_ips varchar(1024), - md5 varchar(32) DEFAULT NULL, - gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - src_user varchar(128), - src_ip varchar(20) DEFAULT NULL, - encrypted_data_key LONG VARCHAR DEFAULT NULL, - constraint configinfobeta_id_key PRIMARY KEY (id), - constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id)); - -CREATE TABLE config_info_tag ( - id bigint NOT NULL generated by default as identity, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - tenant_id varchar(128) default '', - tag_id varchar(128) NOT NULL, - app_name varchar(128), - content CLOB, - md5 varchar(32) DEFAULT NULL, - gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - src_user varchar(128), - src_ip varchar(20) DEFAULT NULL, - constraint configinfotag_id_key PRIMARY KEY (id), - constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id)); - -CREATE TABLE config_info_aggr ( - id bigint NOT NULL generated by default as identity, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - tenant_id varchar(128) default '', - datum_id varchar(255) NOT NULL, - app_name varchar(128), - content CLOB, - gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', - constraint configinfoaggr_id_key PRIMARY KEY (id), - constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id)); - -CREATE TABLE app_list ( - id bigint NOT NULL generated by default as identity, - app_name varchar(128) NOT NULL, - is_dynamic_collect_disabled smallint DEFAULT 0, - last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0', - sub_info_lock_owner varchar(128), - sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0', - constraint applist_id_key PRIMARY KEY (id), - constraint uk_appname UNIQUE (app_name)); - -CREATE TABLE app_configdata_relation_subs ( - id bigint NOT NULL generated by default as identity, - app_name varchar(128) NOT NULL, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', - constraint configdatarelationsubs_id_key PRIMARY KEY (id), - constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id)); - - -CREATE TABLE app_configdata_relation_pubs ( - id bigint NOT NULL generated by default as identity, - app_name varchar(128) NOT NULL, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', - constraint configdatarelationpubs_id_key PRIMARY KEY (id), - constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id)); - -CREATE TABLE config_tags_relation ( - id bigint NOT NULL, - tag_name varchar(128) NOT NULL, - tag_type varchar(64) DEFAULT NULL, - data_id varchar(255) NOT NULL, - group_id varchar(128) NOT NULL, - tenant_id varchar(128) DEFAULT '', - nid bigint NOT NULL generated by default as identity, - constraint config_tags_id_key PRIMARY KEY (nid), - constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type)); - -CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id); - -CREATE TABLE group_capacity ( - id bigint NOT NULL generated by default as identity, - group_id varchar(128) DEFAULT '', - quota int DEFAULT 0, - usage int DEFAULT 0, - max_size int DEFAULT 0, - max_aggr_count int DEFAULT 0, - max_aggr_size int DEFAULT 0, - max_history_count int DEFAULT 0, - gmt_create timestamp DEFAULT '2010-05-05 00:00:00', - gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', - constraint group_capacity_id_key PRIMARY KEY (id), - constraint uk_group_id UNIQUE (group_id)); - -CREATE TABLE tenant_capacity ( - id bigint NOT NULL generated by default as identity, - tenant_id varchar(128) DEFAULT '', - quota int DEFAULT 0, - usage int DEFAULT 0, - max_size int DEFAULT 0, - max_aggr_count int DEFAULT 0, - max_aggr_size int DEFAULT 0, - max_history_count int DEFAULT 0, - gmt_create timestamp DEFAULT '2010-05-05 00:00:00', - gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', - constraint tenant_capacity_id_key PRIMARY KEY (id), - constraint uk_tenant_id UNIQUE (tenant_id)); - -CREATE TABLE tenant_info ( - id bigint NOT NULL generated by default as identity, - kp varchar(128) NOT NULL, - tenant_id varchar(128) DEFAULT '', - tenant_name varchar(128) DEFAULT '', - tenant_desc varchar(256) DEFAULT NULL, - create_source varchar(32) DEFAULT NULL, - gmt_create bigint NOT NULL, - gmt_modified bigint NOT NULL, - constraint tenant_info_id_key PRIMARY KEY (id), - constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id)); -CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id); - -CREATE TABLE users ( - username varchar(50) NOT NULL PRIMARY KEY, - password varchar(500) NOT NULL, - enabled boolean NOT NULL DEFAULT true -); - -CREATE TABLE roles ( - username varchar(50) NOT NULL, - role varchar(50) NOT NULL, - constraint uk_username_role UNIQUE (username,role) -); - -CREATE TABLE permissions ( - role varchar(50) NOT NULL, - resource varchar(512) NOT NULL, - action varchar(8) NOT NULL, - constraint uk_role_permission UNIQUE (role,resource,action) -); - -INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); - -INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); diff --git a/pig-register/src/main/resources/application.yml b/pig-register/src/main/resources/application.yml old mode 100755 new mode 100644 index 58899527..d27db8b1 --- a/pig-register/src/main/resources/application.yml +++ b/pig-register/src/main/resources/application.yml @@ -2,16 +2,16 @@ server: port: 8848 #如何修改 pig-register 启动端口 >: https://t.cn/A6XGvTdb tomcat: basedir: logs - error: - include-message: always + servlet: + context-path: /nacos db: num: 1 user: ${MYSQL_USER:root} password: ${MYSQL_PWD:root} url: - 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true - pool.config.connectionTimeout: 30000 + 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:4000}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + nacos: core: @@ -21,10 +21,11 @@ nacos: key: serverIdentity value: security plugin.nacos.token.secret.key: SecretKey012345678901234567890123456789012345678901234567890123456789 + enabled: false system.type: nacos security: ignore: - urls: /actuator/**,/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** + urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** spring: datasource: diff --git a/pig-register/src/main/resources/conf/announcement.conf b/pig-register/src/main/resources/conf/announcement.conf new file mode 100644 index 00000000..e241c201 --- /dev/null +++ b/pig-register/src/main/resources/conf/announcement.conf @@ -0,0 +1 @@ +无论您是多年编程的高级工程师,还是刚刚入门的实习生,部署请完全参考微服务开发平台部署手册操作。 diff --git a/pig-register/src/main/resources/nacos-version.txt b/pig-register/src/main/resources/nacos-version.txt old mode 100755 new mode 100644 index cf199263..0a7561c5 --- a/pig-register/src/main/resources/nacos-version.txt +++ b/pig-register/src/main/resources/nacos-version.txt @@ -1 +1 @@ -version=2.2.3 +version=2.2.4 diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index 9fae9627..eee770ce 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.7 + 3.7.0-JDK8 pig-upms-api @@ -36,15 +36,10 @@ com.pig4cloud pig-common-core - - - io.swagger.core.v3 - swagger-annotations - - com.pig4cloud - pig-common-feign + org.springframework.cloud + spring-cloud-openfeign-core true diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/AppSmsDTO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/AppSmsDTO.java deleted file mode 100644 index 2069903a..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/AppSmsDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pig4cloud.pig.admin.api.dto; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** - * 客户端请求验证码 - * - * @author lengleng - * @date 2022/10/13 - */ -@Data -public class AppSmsDTO { - - /** - * 手机号 - */ - @NotBlank(message = "手机号不能为空") - private String phone; - - /** - * 手机号是否存在数据库 - */ - private Boolean exist; - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/RoleDTO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/RoleDTO.java deleted file mode 100755 index 5f5f0fdb..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/RoleDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.api.dto; - -import com.pig4cloud.pig.admin.api.entity.SysRole; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @author lengleng - * @date 2019/2/1 角色Dto - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class RoleDTO extends SysRole { - - /** - * 角色部门Id - */ - private Long roleDeptId; - - /** - * 部门名称 - */ - private String deptName; - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/SysLogDTO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/SysLogDTO.java index fc66c8fe..d7a64a68 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/SysLogDTO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/SysLogDTO.java @@ -1,6 +1,7 @@ package com.pig4cloud.pig.admin.api.dto; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; import lombok.Data; import java.time.LocalDateTime; @@ -16,20 +17,75 @@ import java.time.LocalDateTime; public class SysLogDTO { /** - * 查询日志类型 + * 编号 */ - @Schema(description = "日志类型") - private String type; + private Long id; /** - * 创建时间区间 [开始时间,结束时间] + * 日志类型 */ - @Schema(description = "创建时间区间") - private LocalDateTime[] createTime; + @NotBlank(message = "日志类型不能为空") + private String logType; + + /** + * 日志标题 + */ + @NotBlank(message = "日志标题不能为空") + private String title; /** - * 请求IP + * 创建者 + */ + private String createBy; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 操作IP地址 */ private String remoteAddr; + /** + * 用户代理 + */ + private String userAgent; + + /** + * 请求URI + */ + private String requestUri; + + /** + * 操作方式 + */ + private String method; + + /** + * 操作提交的数据 + */ + private String params; + + /** + * 执行时间 + */ + private Long time; + + /** + * 异常信息 + */ + private String exception; + + /** + * 服务ID + */ + private String serviceId; + + /** + * 创建时间区间 [开始时间,结束时间] + */ + private LocalDateTime[] createTime; + } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserDTO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserDTO.java index 972b2b46..287bae3f 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserDTO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserDTO.java @@ -1,22 +1,26 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.dto; import com.pig4cloud.pig.admin.api.entity.SysUser; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -24,17 +28,23 @@ import java.util.List; /** * @author lengleng - * @date 2019/2/1 + * @date 2017/11/5 */ @Data +@Schema(description = "系统用户传输对象") @EqualsAndHashCode(callSuper = true) public class UserDTO extends SysUser { /** * 角色ID */ + @Schema(description = "角色id集合") private List role; + /** + * 部门id + */ + @Schema(description = "部门id") private Long deptId; /** @@ -45,11 +55,7 @@ public class UserDTO extends SysUser { /** * 新密码 */ + @Schema(description = "新密码") private String newpassword1; - /** - * 验证码 - */ - private String code; - } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserInfo.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserInfo.java index 789f51e3..d0558648 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserInfo.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/dto/UserInfo.java @@ -1,67 +1,54 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.dto; -import com.pig4cloud.pig.admin.api.entity.SysPost; -import com.pig4cloud.pig.admin.api.entity.SysRole; import com.pig4cloud.pig.admin.api.entity.SysUser; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; -import java.util.List; /** * @author lengleng - * @date 2019/2/1 - *

- * commit('SET_ROLES', data) commit('SET_NAME', data) commit('SET_AVATAR', data) - * commit('SET_INTRODUCTION', data) commit('SET_PERMISSIONS', data) + * @date 2017/11/11 */ @Data +@Schema(description = "用户信息") public class UserInfo implements Serializable { /** * 用户基本信息 */ + @Schema(description = "用户基本信息") private SysUser sysUser; /** * 权限标识集合 */ + @Schema(description = "权限标识集合") private String[] permissions; /** * 角色集合 */ + @Schema(description = "角色标识集合") private Long[] roles; - /** - * 角色集合 - */ - private List roleList; - - /** - * 岗位集合 - */ - private Long[] posts; - - /** - * 岗位集合 - */ - private List postList; - } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDept.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDept.java index 6d84605d..7315b857 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDept.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDept.java @@ -1,31 +1,33 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; /** *

@@ -33,12 +35,12 @@ import javax.validation.constraints.NotNull; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-01-22 */ -@Schema(description = "部门") @Data +@Schema(description = "部门") @EqualsAndHashCode(callSuper = true) -public class SysDept extends BaseEntity { +public class SysDept extends Model { private static final long serialVersionUID = 1L; @@ -50,16 +52,44 @@ public class SysDept extends BaseEntity { * 部门名称 */ @NotBlank(message = "部门名称不能为空") - @Schema(description = "部门名称", required = true) + @Schema(description = "部门名称") private String name; /** * 排序 */ - @NotNull(message = "部门排序值不能为空") - @Schema(description = "排序值", required = true) + @NotNull(message = "排序值不能为空") + @Schema(description = "排序值") private Integer sortOrder; + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + /** * 父级部门id */ @@ -67,9 +97,11 @@ public class SysDept extends BaseEntity { private Long parentId; /** - * 是否删除 -1:已删除 0:正常 + * 是否删除 1:已删除 0:正常 */ @TableLogic + @Schema(description = "删除标记,1:已删除,0:正常") + @TableField(fill = FieldFill.INSERT) private String delFlag; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDeptRelation.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDeptRelation.java index 8fbfea7f..133622cc 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDeptRelation.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDeptRelation.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; @@ -27,10 +30,10 @@ import lombok.EqualsAndHashCode; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-01-22 */ -@Schema(description = "部门关系") @Data +@Schema(description = "部门关系") @EqualsAndHashCode(callSuper = true) public class SysDeptRelation extends Model { diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDict.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDict.java index 28434df2..31b9829a 100755 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDict.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDict.java @@ -1,28 +1,29 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** * 字典表 * @@ -32,7 +33,7 @@ import lombok.EqualsAndHashCode; @Data @Schema(description = "字典类型") @EqualsAndHashCode(callSuper = true) -public class SysDict extends BaseEntity { +public class SysDict extends Model { private static final long serialVersionUID = 1L; @@ -46,8 +47,8 @@ public class SysDict extends BaseEntity { /** * 类型 */ - @Schema(description = "字典key") - private String dictKey; + @Schema(description = "字典类型") + private String dictType; /** * 描述 @@ -55,6 +56,20 @@ public class SysDict extends BaseEntity { @Schema(description = "字典描述") private String description; + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + /** * 是否是系统内置 */ @@ -65,12 +80,27 @@ public class SysDict extends BaseEntity { * 备注信息 */ @Schema(description = "备注信息") - private String remark; + private String remarks; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; /** * 删除标记 */ @TableLogic + @TableField(fill = FieldFill.INSERT) @Schema(description = "删除标记,1:已删除,0:正常") private String delFlag; diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDictItem.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDictItem.java index 410edfbd..eed39f70 100755 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDictItem.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysDictItem.java @@ -1,28 +1,30 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** * 字典项 * @@ -32,7 +34,7 @@ import lombok.EqualsAndHashCode; @Data @Schema(description = "字典项") @EqualsAndHashCode(callSuper = true) -public class SysDictItem extends BaseEntity { +public class SysDictItem extends Model { private static final long serialVersionUID = 1L; @@ -49,17 +51,12 @@ public class SysDictItem extends BaseEntity { @Schema(description = "所属字典类id") private Long dictId; - /** - * 所属字典类id - */ - @Schema(description = "所属字典类key") - private String dictKey; - /** * 数据值 */ @Schema(description = "数据值") - private String value; + @JsonProperty(value = "value") + private String itemValue; /** * 标签名 @@ -71,7 +68,7 @@ public class SysDictItem extends BaseEntity { * 类型 */ @Schema(description = "类型") - private String type; + private String dictType; /** * 描述 @@ -85,16 +82,45 @@ public class SysDictItem extends BaseEntity { @Schema(description = "排序值,默认升序") private Integer sortOrder; + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + /** * 备注信息 */ @Schema(description = "备注信息") - private String remark; + private String remarks; /** * 删除标记 */ @TableLogic + @TableField(fill = FieldFill.INSERT) @Schema(description = "删除标记,1:已删除,0:正常") private String delFlag; diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysFile.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysFile.java index 78882a35..c86ec837 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysFile.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysFile.java @@ -17,13 +17,14 @@ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** * 文件管理 * @@ -31,8 +32,9 @@ import lombok.EqualsAndHashCode; * @date 2019-06-18 17:18:42 */ @Data +@Schema(description = "文件") @EqualsAndHashCode(callSuper = true) -public class SysFile extends BaseEntity { +public class SysFile extends Model { private static final long serialVersionUID = 1L; @@ -40,37 +42,73 @@ public class SysFile extends BaseEntity { * 编号 */ @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "文件编号") private Long id; /** * 文件名 */ + @Schema(description = "文件名") private String fileName; /** * 原文件名 */ + @Schema(description = "原始文件名") private String original; /** * 容器名称 */ + @Schema(description = "存储桶名称") private String bucketName; /** * 文件类型 */ + @Schema(description = "文件类型") private String type; /** * 文件大小 */ + @Schema(description = "文件大小") private Long fileSize; + /** + * 上传人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建者") + private String createBy; + + /** + * 上传时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "更新者") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + /** * 删除标识:1-删除,0-正常 */ @TableLogic - private Integer delFlag; + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysLog.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysLog.java index f532c95c..61ba452c 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysLog.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysLog.java @@ -1,34 +1,33 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; import lombok.Data; -import lombok.EqualsAndHashCode; -import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -36,21 +35,20 @@ import javax.validation.constraints.NotBlank; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-11-20 */ @Data -@EqualsAndHashCode(callSuper = true) -public class SysLog extends BaseEntity { +@Schema(description = "日志") +public class SysLog implements Serializable { private static final long serialVersionUID = 1L; /** * 编号 */ - @TableId(value = "id", type = IdType.ASSIGN_ID) + @TableId(type = IdType.ASSIGN_ID) @ExcelProperty("日志编号") @Schema(description = "日志编号") - @JsonSerialize(using = ToStringSerializer.class) private Long id; /** @@ -59,7 +57,7 @@ public class SysLog extends BaseEntity { @NotBlank(message = "日志类型不能为空") @ExcelProperty("日志类型(0-正常 9-错误)") @Schema(description = "日志类型") - private String type; + private String logType; /** * 日志标题 @@ -69,24 +67,47 @@ public class SysLog extends BaseEntity { @Schema(description = "日志标题") private String title; + /** + * 创建者 + */ + @ExcelProperty("创建人") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @ExcelProperty("创建时间") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @ExcelIgnore + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + /** * 操作IP地址 */ - @ExcelProperty("IP") + @ExcelProperty("操作ip地址") @Schema(description = "操作ip地址") private String remoteAddr; /** - * 用户浏览器 + * 用户代理 */ - @ExcelProperty("浏览器类型") @Schema(description = "用户代理") private String userAgent; /** * 请求URI */ - @ExcelProperty("请求URI") + @ExcelProperty("浏览器") @Schema(description = "请求uri") private String requestUri; @@ -100,14 +121,14 @@ public class SysLog extends BaseEntity { /** * 操作提交的数据 */ - @ExcelProperty("请求参数") - @Schema(description = "数据") + @ExcelProperty("提交数据") + @Schema(description = "提交数据") private String params; /** * 执行时间 */ - @ExcelProperty("方法执行时间") + @ExcelProperty("执行时间") @Schema(description = "方法执行时间") private Long time; @@ -130,6 +151,8 @@ public class SysLog extends BaseEntity { */ @TableLogic @ExcelIgnore + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") private String delFlag; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysMenu.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysMenu.java index 3fb7b1b4..aa3aecf2 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysMenu.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysMenu.java @@ -1,31 +1,33 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; /** *

@@ -33,11 +35,12 @@ import javax.validation.constraints.NotNull; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-11-08 */ @Data +@Schema(description = "菜单") @EqualsAndHashCode(callSuper = true) -public class SysMenu extends BaseEntity { +public class SysMenu extends Model { private static final long serialVersionUID = 1L; @@ -55,6 +58,12 @@ public class SysMenu extends BaseEntity { @Schema(description = "菜单名称") private String name; + /** + * 菜单名称 + */ + @Schema(description = "菜单名称") + private String enName; + /** * 菜单权限标识 */ @@ -75,11 +84,17 @@ public class SysMenu extends BaseEntity { private String icon; /** - * 前端URL + * 前端路由标识路径,默认和 comment 保持一致 过期 */ @Schema(description = "前端路由标识路径") private String path; + /** + * 菜单显示隐藏控制 + */ + @Schema(description = "菜单是否显示") + private String visible; + /** * 排序值 */ @@ -90,7 +105,8 @@ public class SysMenu extends BaseEntity { * 菜单类型 (0菜单 1按钮) */ @NotNull(message = "菜单类型不能为空") - private String type; + @Schema(description = "菜单类型,0:菜单 1:按钮") + private String menuType; /** * 路由缓冲 @@ -98,10 +114,43 @@ public class SysMenu extends BaseEntity { @Schema(description = "路由缓冲") private String keepAlive; + @Schema(description = "菜单是否内嵌") + private String embedded; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + /** * 0--正常 1--删除 */ @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") private String delFlag; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysOauthClientDetails.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysOauthClientDetails.java index 76043bac..fdf164fb 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysOauthClientDetails.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysOauthClientDetails.java @@ -1,29 +1,32 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; /** *

@@ -31,19 +34,23 @@ import javax.validation.constraints.NotBlank; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-05-15 */ @Data +@Schema(description = "客户端信息") @EqualsAndHashCode(callSuper = true) -public class SysOauthClientDetails extends BaseEntity { +public class SysOauthClientDetails extends Model { private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + /** * 客户端ID */ @NotBlank(message = "client_id 不能为空") - @TableId(value = "client_id", type = IdType.INPUT) @Schema(description = "客户端id") private String clientId; @@ -68,10 +75,10 @@ public class SysOauthClientDetails extends BaseEntity { private String scope; /** - * 授权方式(A,B,C) + * 授权方式[A,B,C] */ @Schema(description = "授权方式") - private String authorizedGrantTypes; + private String[] authorizedGrantTypes; /** * 回调地址 @@ -109,4 +116,40 @@ public class SysOauthClientDetails extends BaseEntity { @Schema(description = "是否自动放行") private String autoapprove; + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPost.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPost.java index 5cd02780..af606376 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPost.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPost.java @@ -14,65 +14,101 @@ * this software without specific prior written permission. * Author: lengleng (wangiegie@gmail.com) */ + package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** - * 岗位管理 + * 岗位信息表 * * @author fxz - * @date 2022-03-15 17:18:40 + * @date 2022-03-26 12:50:43 */ @Data @TableName("sys_post") @EqualsAndHashCode(callSuper = true) @Schema(description = "岗位信息表") -public class SysPost extends BaseEntity { +public class SysPost extends Model { - private static final long serialVersionUID = -8744622014102311894L; + private static final long serialVersionUID = 1L; /** * 岗位ID */ - @TableId(type = IdType.ASSIGN_ID) + @TableId(value = "post_id", type = IdType.ASSIGN_ID) @Schema(description = "岗位ID") private Long postId; /** * 岗位编码 */ + @NotBlank(message = "岗位编码不能为空") @Schema(description = "岗位编码") private String postCode; /** * 岗位名称 */ + @NotBlank(message = "岗位名称不能为空") @Schema(description = "岗位名称") private String postName; /** * 岗位排序 */ + @NotNull(message = "排序值不能为空") @Schema(description = "岗位排序") private Integer postSort; + /** + * 岗位描述 + */ + @Schema(description = "岗位描述") + private String remark; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + /** * 是否删除 -1:已删除 0:正常 */ + @TableLogic + @TableField(fill = FieldFill.INSERT) @Schema(description = "是否删除 -1:已删除 0:正常") private String delFlag; /** - * 备注信息 + * 创建时间 */ - @Schema(description = "备注信息") - private String remark; + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPublicParam.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPublicParam.java index 51893a77..a6eb7416 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPublicParam.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysPublicParam.java @@ -17,13 +17,14 @@ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** * 公共参数配置 * @@ -33,7 +34,7 @@ import lombok.EqualsAndHashCode; @Data @Schema(description = "公共参数") @EqualsAndHashCode(callSuper = true) -public class SysPublicParam extends BaseEntity { +public class SysPublicParam extends Model { private static final long serialVersionUID = 1L; @@ -86,4 +87,40 @@ public class SysPublicParam extends BaseEntity { @Schema(description = "类型[1-检索;2-原文...]", example = "1") private String publicType; + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRole.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRole.java index 2599ef4a..b64b8581 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRole.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRole.java @@ -1,30 +1,32 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; /** *

@@ -32,11 +34,12 @@ import javax.validation.constraints.NotBlank; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Data +@Schema(description = "角色") @EqualsAndHashCode(callSuper = true) -public class SysRole extends BaseEntity { +public class SysRole extends Model { private static final long serialVersionUID = 1L; @@ -44,22 +47,51 @@ public class SysRole extends BaseEntity { @Schema(description = "角色编号") private Long roleId; - @NotBlank(message = "角色名称 不能为空") + @NotBlank(message = "角色名称不能为空") @Schema(description = "角色名称") private String roleName; - @NotBlank(message = "角色标识 不能为空") + @NotBlank(message = "角色标识不能为空") @Schema(description = "角色标识") private String roleCode; - @NotBlank(message = "角色描述 不能为空") @Schema(description = "角色描述") private String roleDesc; + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + /** * 删除标识(0-正常,1-删除) */ @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") private String delFlag; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRoleMenu.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRoleMenu.java index 5573bcb7..bdc264f7 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRoleMenu.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysRoleMenu.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; @@ -27,9 +30,10 @@ import lombok.EqualsAndHashCode; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Data +@Schema(description = "角色菜单") @EqualsAndHashCode(callSuper = true) public class SysRoleMenu extends Model { diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUser.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUser.java index 919f1461..0c4c9142 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUser.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUser.java @@ -1,29 +1,31 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; /** *

@@ -31,11 +33,11 @@ import lombok.EqualsAndHashCode; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Data -@EqualsAndHashCode(callSuper = true) -public class SysUser extends BaseEntity { +@Schema(description = "用户") +public class SysUser implements Serializable { private static final long serialVersionUID = 1L; @@ -49,7 +51,7 @@ public class SysUser extends BaseEntity { /** * 用户名 */ - @Schema(title = "用户名") + @Schema(description = "用户名") private String username; /** @@ -65,6 +67,42 @@ public class SysUser extends BaseEntity { @Schema(description = "随机盐") private String salt; + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 0-正常,1-删除 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + /** * 锁定标记 */ @@ -90,9 +128,51 @@ public class SysUser extends BaseEntity { private Long deptId; /** - * 0-正常,1-删除 + * 微信openid */ - @TableLogic - private String delFlag; + @Schema(description = "微信openid") + private String wxOpenid; + + /** + * 微信小程序openId + */ + @Schema(description = "微信小程序openid") + private String miniOpenid; + + /** + * QQ openid + */ + @Schema(description = "QQ openid") + private String qqOpenid; + + /** + * 码云唯一标识 + */ + @Schema(description = "码云唯一标识") + private String giteeLogin; + + /** + * 开源中国唯一标识 + */ + @Schema(description = "开源中国唯一标识") + private String oscId; + + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickname; + + /** + * 姓名 + */ + @Schema(description = "姓名") + private String name; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUserRole.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUserRole.java index 93d4e63c..ffb92d8e 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUserRole.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/entity/SysUserRole.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.entity; @@ -27,9 +30,10 @@ import lombok.EqualsAndHashCode; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Data +@Schema(description = "用户角色") @EqualsAndHashCode(callSuper = true) public class SysUserRole extends Model { diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java index e130bd89..af15361f 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java @@ -26,6 +26,7 @@ import com.pig4cloud.pig.common.core.util.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; import java.util.List; @@ -39,16 +40,19 @@ public interface RemoteClientDetailsService { /** * 通过clientId 查询客户端信息 * @param clientId 用户名 + * @param from 调用标志 * @return R */ - @GetMapping(value = "/client/getClientDetailsById/{clientId}", headers = SecurityConstants.HEADER_FROM_IN) - R getClientDetailsById(@PathVariable("clientId") String clientId); + @GetMapping("/client/getClientDetailsById/{clientId}") + R getClientDetailsById(@PathVariable("clientId") String clientId, + @RequestHeader(SecurityConstants.FROM) String from); /** * 查询全部客户端 + * @param from 调用标识 * @return R */ - @GetMapping(value = "/client/list", headers = SecurityConstants.HEADER_FROM_IN) - R> listClientDetails(); + @GetMapping("/client/list") + R> listClientDetails(@RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDeptService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDeptService.java deleted file mode 100644 index 197b3015..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDeptService.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.api.feign; - -import com.pig4cloud.pig.common.core.constant.SecurityConstants; -import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; -import com.pig4cloud.pig.common.core.util.R; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -import java.util.List; - -/** - * @author hccake - */ -@FeignClient(contextId = "remoteDeptService", value = ServiceNameConstants.UMPS_SERVICE) -public interface RemoteDeptService { - - /** - * 查收子级id列表 - * @return 返回子级id列表 - */ - @GetMapping(value = "/dept/child-id/{deptId}", headers = SecurityConstants.HEADER_FROM_IN) - R> listChildDeptId(@PathVariable("deptId") Long deptId); - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java old mode 100755 new mode 100644 index f4fd260d..b547825d --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.feign; @@ -23,10 +26,11 @@ import com.pig4cloud.pig.common.core.util.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; /** * @author lengleng - * @date 2019/2/1 + * @date 2018/6/28 */ @FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.UMPS_SERVICE) public interface RemoteLogService { @@ -34,9 +38,10 @@ public interface RemoteLogService { /** * 保存日志 * @param sysLog 日志实体 + * @param from 是否内部调用 * @return succes、false */ - @PostMapping(value = "/log", headers = SecurityConstants.HEADER_FROM_IN) - R saveLog(@RequestBody SysLog sysLog); + @PostMapping("/log/save") + R saveLog(@RequestBody SysLog sysLog, @RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java index deb214bc..712f45bc 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java @@ -6,6 +6,7 @@ import com.pig4cloud.pig.common.core.util.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; /** * @author lengleng @@ -19,9 +20,10 @@ public interface RemoteParamService { /** * 通过key 查询参数配置 * @param key key + * @param from 声明成内部调用,避免MQ 等无法调用 * @return */ - @GetMapping(value = "/param/publicValue/{key}", headers = SecurityConstants.HEADER_FROM_IN) - R getByKey(@PathVariable("key") String key); + @GetMapping("/param/publicValue/{key}") + R getByKey(@PathVariable("key") String key, @RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java old mode 100755 new mode 100644 index 7976fef9..85d64872 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java @@ -1,21 +1,23 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.api.feign; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; @@ -26,25 +28,39 @@ import java.util.Map; /** * @author lengleng - * @date 2019/2/1 + * @date 2018/9/4 */ @FeignClient(contextId = "remoteTokenService", value = ServiceNameConstants.AUTH_SERVICE) public interface RemoteTokenService { /** * 分页查询token 信息 + * @param from 内部调用标志 * @param params 分页参数 + * @param from 内部调用标志 * @return page */ - @PostMapping(value = "/token/page", headers = SecurityConstants.HEADER_FROM_IN) - R getTokenPage(@RequestBody Map params); + @PostMapping("/token/page") + R getTokenPage(@RequestBody Map params, @RequestHeader(SecurityConstants.FROM) String from); /** * 删除token + * @param from 内部调用标志 * @param token token + * @param from 内部调用标志 + * @return + */ + @DeleteMapping("/token/{token}") + R removeTokenById(@PathVariable("token") String token, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 校验令牌获取用户信息 + * @param token + * @param from * @return */ - @DeleteMapping(value = "/token/{token}", headers = SecurityConstants.HEADER_FROM_IN) - R removeToken(@PathVariable("token") String token); + @GetMapping("/token/query-token") + R> queryToken(@RequestParam("token") String token, + @RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java old mode 100755 new mode 100644 index 0af6d9ba..e1f6b4da --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java @@ -1,62 +1,59 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.feign; +import com.pig4cloud.pig.admin.api.dto.UserDTO; import com.pig4cloud.pig.admin.api.dto.UserInfo; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.SpringQueryMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; -import java.util.Set; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestHeader; /** * @author lengleng - * @date 2019/2/1 + * @date 2018/6/22 */ @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UMPS_SERVICE) public interface RemoteUserService { /** * 通过用户名查询用户、角色信息 - * @param username 用户名 - * @return R - */ - @GetMapping(value = "/user/info/{username}", headers = SecurityConstants.HEADER_FROM_IN) - R info(@PathVariable("username") String username); - - /** - * 通过手机号码查询用户、角色信息 - * @param phone 手机号码 + * @param user 用户查询对象 + * @param from 调用标志 * @return R */ - @GetMapping(value = "/app/info/{phone}", headers = SecurityConstants.HEADER_FROM_IN) - R infoByMobile(@PathVariable("phone") String phone); + @GetMapping("/user/info/query") + R info(@SpringQueryMap UserDTO user, @RequestHeader(SecurityConstants.FROM) String from); /** - * 根据部门id,查询对应的用户 id 集合 - * @param deptIds 部门id 集合 - * @return 用户 id 集合 + * 锁定用户 + * @param username 用户名 + * @param from 调用标识 + * @return */ - @GetMapping(value = "/user/ids", headers = SecurityConstants.HEADER_FROM_IN) - R> listUserIdByDeptIds(@RequestParam("deptIds") Set deptIds); + @PutMapping("/user/lock/{username}") + R lockUser(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/DictResolver.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/DictResolver.java index 6c7a7193..136b9ea8 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/DictResolver.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/DictResolver.java @@ -57,7 +57,7 @@ public class DictResolver { SysDictItem sysDictItem = getDictItemByItemLabel(type, itemLabel); - return ObjectUtils.isNotEmpty(sysDictItem) ? sysDictItem.getValue() : StringPool.EMPTY; + return ObjectUtils.isNotEmpty(sysDictItem) ? sysDictItem.getItemValue() : StringPool.EMPTY; } /** @@ -72,7 +72,7 @@ public class DictResolver { List dictItemList = getDictItemsByType(type); if (CollectionUtils.isNotEmpty(dictItemList)) { - return dictItemList.stream().filter(item -> itemValue.equals(item.getValue())).findFirst().orElse(null); + return dictItemList.stream().filter(item -> itemValue.equals(item.getItemValue())).findFirst().orElse(null); } return null; diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java index 9b4e43a0..51d0337b 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java @@ -3,6 +3,7 @@ package com.pig4cloud.pig.admin.api.util; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.admin.api.feign.RemoteParamService; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.SpringContextHolder; import lombok.experimental.UtilityClass; @@ -43,7 +44,7 @@ public class ParamResolver { RemoteParamService remoteParamService = SpringContextHolder.getBean(RemoteParamService.class); - String result = remoteParamService.getByKey(key).getData(); + String result = remoteParamService.getByKey(key, SecurityConstants.FROM_IN).getData(); if (StrUtil.isNotBlank(result)) { return Convert.convert(clazz, result); diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/DeptExcelVo.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/DeptExcelVo.java new file mode 100644 index 00000000..13b36058 --- /dev/null +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/DeptExcelVo.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pig.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.pig4cloud.plugin.excel.annotation.ExcelLine; +import javax.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serializable; + +/** + * 部门导入导出 + */ +@Data +public class DeptExcelVo implements Serializable { + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 上级部门 + */ + @NotBlank(message = "上级部门不能为空") + @ExcelProperty("上级部门") + private String parentName; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @ExcelProperty("部门名称") + private String name; + + /** + * 排序 + */ + @ExcelProperty(value = "排序值") + private Integer sortOrder; + +} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/ImageCode.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/ImageCode.java deleted file mode 100644 index 1256a5f6..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/ImageCode.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.api.vo; - -import lombok.Data; - -import java.awt.image.BufferedImage; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author lengleng - * @date 2019/2/1 - */ -@Data -public class ImageCode implements Serializable { - - private String code; - - private LocalDateTime expireTime; - - private BufferedImage image; - - public ImageCode(BufferedImage image, String sRand, int defaultImageExpire) { - this.image = image; - this.code = sRand; - this.expireTime = LocalDateTime.now().plusSeconds(defaultImageExpire); - } - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/LogVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/LogVO.java deleted file mode 100644 index a62cf6c5..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/LogVO.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.api.vo; - -import com.pig4cloud.pig.admin.api.entity.SysLog; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author lengleng - * @date 2019/2/1 - */ -@Data -public class LogVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private SysLog sysLog; - - private String username; - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java index ca07f30e..d7f030d3 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java @@ -4,10 +4,10 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.pig4cloud.plugin.excel.annotation.ExcelLine; -import lombok.Data; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import lombok.Data; + import java.io.Serializable; import java.time.LocalDateTime; @@ -24,7 +24,7 @@ public class PostExcelVO implements Serializable { private static final long serialVersionUID = 1L; /** - * excel 行号 + * 导入时候回显行号 */ @ExcelLine @ExcelIgnore diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PreLogVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PreLogVO.java new file mode 100644 index 00000000..de46b1a4 --- /dev/null +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PreLogVO.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author lengleng + * @date 2018/8/27 前端日志vo + */ +@Data +@Schema(description = "前端日志展示对象") +public class PreLogVO { + + /** + * 请求url + */ + @Schema(description = "请求url") + private String url; + + /** + * 请求耗时 + */ + @Schema(description = "请求耗时") + private String time; + + /** + * 请求用户 + */ + @Schema(description = "请求用户") + private String user; + + /** + * 请求结果 + */ + @Schema(description = "请求结果0:成功9:失败") + private String type; + + /** + * 请求传递参数 + */ + @Schema(description = "请求传递参数") + private String message; + + /** + * 异常信息 + */ + @Schema(description = "异常信息") + private String stack; + + /** + * 日志标题 + */ + @Schema(description = "日志标题") + private String info; + +} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java index b53e9fc7..4cd1ced8 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java @@ -4,9 +4,9 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.pig4cloud.plugin.excel.annotation.ExcelLine; +import javax.validation.constraints.NotBlank; import lombok.Data; -import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.time.LocalDateTime; @@ -23,7 +23,7 @@ public class RoleExcelVO implements Serializable { private static final long serialVersionUID = 1L; /** - * excel 行号 + * 导入时候回显行号 */ @ExcelLine @ExcelIgnore diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVO.java new file mode 100644 index 00000000..fde0bbec --- /dev/null +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVO.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author lengleng + * @date 2020/2/10 + */ +@Data +@Schema(description = "前端角色展示对象") +public class RoleVO { + + /** + * 角色id + */ + private Long roleId; + + /** + * 菜单列表 + */ + private String menuIds; + +} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVo.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVo.java deleted file mode 100644 index 89691d54..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleVo.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.api.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -/** - * @author lengleng - * @date 2020/2/10 - */ -@Data -@Schema(description = "前端角色展示对象") -public class RoleVo { - - /** - * 角色id - */ - private Long roleId; - - /** - * 菜单列表 - */ - private String menuIds; - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserExcelVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserExcelVO.java index 255bffbe..a7ad1017 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserExcelVO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserExcelVO.java @@ -4,9 +4,9 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.pig4cloud.plugin.excel.annotation.ExcelLine; +import javax.validation.constraints.NotBlank; import lombok.Data; -import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.time.LocalDateTime; @@ -23,7 +23,7 @@ public class UserExcelVO implements Serializable { private static final long serialVersionUID = 1L; /** - * excel 行号 + * 导入时候回显行号 */ @ExcelLine @ExcelIgnore @@ -49,6 +49,27 @@ public class UserExcelVO implements Serializable { @ExcelProperty("手机号") private String phone; + /** + * 手机号 + */ + @NotBlank(message = "昵称不能为空") + @ExcelProperty("昵称") + private String nickname; + + /** + * 手机号 + */ + @NotBlank(message = "姓名不能为空") + @ExcelProperty("姓名") + private String name; + + /** + * 手机号 + */ + @NotBlank(message = "邮箱不能为空") + @ExcelProperty("邮箱") + private String email; + /** * 部门名称 */ @@ -64,10 +85,10 @@ public class UserExcelVO implements Serializable { private String roleNameList; /** - * 岗位列表 + * 角色列表 */ @NotBlank(message = "岗位不能为空") - @ExcelProperty("岗位") + @ExcelProperty("岗位名称") private String postNameList; /** diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserInfoVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserInfoVO.java deleted file mode 100644 index 32195cc4..00000000 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserInfoVO.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.api.vo; - -import com.pig4cloud.pig.admin.api.entity.SysUser; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author lengleng - * @date 2019/2/1 - *

- * commit('SET_ROLES', data) commit('SET_NAME', data) commit('SET_AVATAR', data) - * commit('SET_INTRODUCTION', data) commit('SET_PERMISSIONS', data) - */ -@Data -public class UserInfoVO implements Serializable { - - /** - * 用户基本信息 - */ - private SysUser sysUser; - - /** - * 权限标识集合 - */ - private String[] permissions; - - /** - * 角色集合 - */ - private Long[] roles; - -} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java index 4692eda5..a42f357a 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java @@ -1,23 +1,27 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.api.vo; import com.pig4cloud.pig.admin.api.entity.SysPost; import com.pig4cloud.pig.admin.api.entity.SysRole; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; @@ -26,9 +30,10 @@ import java.util.List; /** * @author lengleng - * @date 2019/2/1 + * @date 2017/10/29 */ @Data +@Schema(description = "前端用户展示对象") public class UserVO implements Serializable { private static final long serialVersionUID = 1L; @@ -36,66 +41,103 @@ public class UserVO implements Serializable { /** * 主键ID */ + @Schema(description = "主键") private Long userId; /** * 用户名 */ + @Schema(description = "用户名") private String username; /** * 密码 */ + @Schema(description = "密码") private String password; /** * 随机盐 */ + @Schema(description = "随机盐") private String salt; + /** + * 微信openid + */ + @Schema(description = "微信open id") + private String wxOpenid; + + /** + * QQ openid + */ + @Schema(description = "qq open id") + private String qqOpenid; + + /** + * gitee openid + */ + @Schema(description = "gitee open id") + private String giteeOpenId; + + /** + * 开源中国 openid + */ + @Schema(description = "开源中国 open id") + private String oscOpenId; + /** * 创建时间 */ + @Schema(description = "创建时间") private LocalDateTime createTime; /** * 修改时间 */ + @Schema(description = "修改时间") private LocalDateTime updateTime; /** * 0-正常,1-删除 */ + @Schema(description = "删除标记,1:已删除,0:正常") private String delFlag; /** * 锁定标记 */ + @Schema(description = "锁定标记,0:正常,9:已锁定") private String lockFlag; /** - * 简介 + * 手机号 */ + @Schema(description = "手机号") private String phone; /** * 头像 */ + @Schema(description = "头像") private String avatar; /** * 部门ID */ + @Schema(description = "所属部门") private Long deptId; /** * 部门名称 */ + @Schema(description = "所属部门名称") private String deptName; /** * 角色列表 */ + @Schema(description = "拥有的角色列表") private List roleList; /** @@ -103,4 +145,22 @@ public class UserVO implements Serializable { */ private List postList; + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickname; + + /** + * 姓名 + */ + @Schema(description = "姓名") + private String name; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; + } diff --git a/pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports deleted file mode 100644 index 9eca72e4..00000000 --- a/pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ /dev/null @@ -1,7 +0,0 @@ -com.pig4cloud.pig.admin.api.feign.RemoteClientDetailsService -com.pig4cloud.pig.admin.api.feign.RemoteDictService -com.pig4cloud.pig.admin.api.feign.RemoteDeptService -com.pig4cloud.pig.admin.api.feign.RemoteLogService -com.pig4cloud.pig.admin.api.feign.RemoteTokenService -com.pig4cloud.pig.admin.api.feign.RemoteUserService -com.pig4cloud.pig.admin.api.feign.RemoteParamService diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index ce53f69e..fd72d7e6 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.7 + 3.7.0-JDK8 pig-upms-biz @@ -37,8 +37,8 @@ - com.pig4cloud.plugin - oss-spring-boot-starter + com.pig4cloud + pig-common-oss diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java index 219f5011..8d593923 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin; @@ -25,11 +28,13 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author lengleng - * @date 2018年06月21日 用户统一管理系统 + * @date 2018年06月21日 + *

+ * 用户统一管理系统 */ @EnablePigDoc -@EnablePigResourceServer @EnablePigFeignClients +@EnablePigResourceServer @EnableDiscoveryClient @SpringBootApplication public class PigAdminApplication { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/AppController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/AppController.java deleted file mode 100644 index 5e4540ec..00000000 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/AppController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.pig4cloud.pig.admin.controller; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.pig4cloud.pig.admin.api.dto.AppSmsDTO; -import com.pig4cloud.pig.admin.api.dto.UserInfo; -import com.pig4cloud.pig.admin.api.entity.SysUser; -import com.pig4cloud.pig.admin.service.AppService; -import com.pig4cloud.pig.admin.service.SysUserService; -import com.pig4cloud.pig.common.core.exception.ErrorCodes; -import com.pig4cloud.pig.common.core.util.MsgUtils; -import com.pig4cloud.pig.common.core.util.R; -import com.pig4cloud.pig.common.security.annotation.Inner; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * @author lengleng - * @date 2021/9/16 移动端登录 - */ -@RestController -@AllArgsConstructor -@RequestMapping("/app") -@Tag(name = "移动端登录模块") -@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class AppController { - - private final AppService appService; - - private final SysUserService userService; - - /** - * 发送手机验证码 - * @param sms 请求手机对象 - * @return code - */ - @Inner(value = false) - @PostMapping("/sms") - public R sendSmsCode(@Valid @RequestBody AppSmsDTO sms) { - return appService.sendSmsCode(sms); - } - - /** - * 获取指定用户全部信息 - * @param phone 手机号 - * @return 用户信息 - */ - @Inner - @GetMapping("/info/{phone}") - public R infoByMobile(@PathVariable String phone) { - SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, phone)); - if (user == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, phone)); - } - return R.ok(userService.getUserInfo(user)); - } - -} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java similarity index 36% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java index d01aad33..708fa28f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java @@ -1,22 +1,27 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysOauthClientDetails; @@ -24,14 +29,16 @@ import com.pig4cloud.pig.admin.service.SysOauthClientDetailsService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; import com.pig4cloud.pig.common.security.annotation.Inner; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.util.List; /** @@ -43,23 +50,24 @@ import java.util.List; * @since 2018-05-15 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/client") -@Tag(name = "客户端管理模块") +@Tag(description = "client", name = "客户端管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class SysOauthClientDetailsController { +public class SysClientController { - private final SysOauthClientDetailsService sysOauthClientDetailsService; + private final SysOauthClientDetailsService clientDetailsService; /** * 通过ID查询 - * @param clientId 客户端id + * @param clientId clientId * @return SysOauthClientDetails */ @GetMapping("/{clientId}") - public R> getByClientId(@PathVariable String clientId) { - return R.ok(sysOauthClientDetailsService - .list(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId))); + public R getByClientId(@PathVariable String clientId) { + SysOauthClientDetails details = clientDetailsService + .getOne(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId)); + return R.ok(details); } /** @@ -69,60 +77,89 @@ public class SysOauthClientDetailsController { * @return */ @GetMapping("/page") - public R> getOauthClientDetailsPage(Page page, - SysOauthClientDetails sysOauthClientDetails) { - return R.ok(sysOauthClientDetailsService.page(page, Wrappers.query(sysOauthClientDetails))); + public R getOauthClientDetailsPage(@ParameterObject Page page, + @ParameterObject SysOauthClientDetails sysOauthClientDetails) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysOauthClientDetails.getClientId()), SysOauthClientDetails::getClientId, + sysOauthClientDetails.getClientId()) + .like(StrUtil.isNotBlank(sysOauthClientDetails.getClientSecret()), SysOauthClientDetails::getClientSecret, + sysOauthClientDetails.getClientSecret()); + return R.ok(clientDetailsService.page(page, wrapper)); } /** * 添加 - * @param sysOauthClientDetails 实体 + * @param clientDetails 实体 * @return success/false */ @SysLog("添加终端") @PostMapping @PreAuthorize("@pms.hasPermission('sys_client_add')") - public R add(@Valid @RequestBody SysOauthClientDetails sysOauthClientDetails) { - return R.ok(sysOauthClientDetailsService.save(sysOauthClientDetails)); + public R add(@Valid @RequestBody SysOauthClientDetails clientDetails) { + return R.ok(clientDetailsService.saveClient(clientDetails)); } /** * 删除 - * @param id ID + * @param ids ID 列表 * @return success/false */ @SysLog("删除终端") - @DeleteMapping("/{id}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_client_del')") - public R removeById(@PathVariable String id) { - return R.ok(sysOauthClientDetailsService.removeClientDetailsById(id)); + public R removeById(@RequestBody Long[] ids) { + clientDetailsService.removeBatchByIds(CollUtil.toList(ids)); + return R.ok(); } /** * 编辑 - * @param sysOauthClientDetails 实体 + * @param clientDetails 实体 * @return success/false */ @SysLog("编辑终端") @PutMapping @PreAuthorize("@pms.hasPermission('sys_client_edit')") - public R update(@Valid @RequestBody SysOauthClientDetails sysOauthClientDetails) { - return R.ok(sysOauthClientDetailsService.updateClientDetailsById(sysOauthClientDetails)); + public R update(@Valid @RequestBody SysOauthClientDetails clientDetails) { + return R.ok(clientDetailsService.updateClientById(clientDetails)); } - @SysLog("清除终端缓存") - @DeleteMapping("/cache") - @PreAuthorize("@pms.hasPermission('sys_client_del')") - public R clearClientCache() { - sysOauthClientDetailsService.clearClientCache(); - return R.ok(); - } - - @Inner + @Inner(false) @GetMapping("/getClientDetailsById/{clientId}") public R getClientDetailsById(@PathVariable String clientId) { - return R.ok(sysOauthClientDetailsService.getOne( + return R.ok(clientDetailsService.getOne( Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false)); } + /** + * 查询全部客户端 + * @return + */ + @Inner(false) + @GetMapping("/list") + public R listClients() { + return R.ok(clientDetailsService.list()); + } + + /** + * 同步缓存字典 + * @return R + */ + @SysLog("同步终端") + @PutMapping("/sync") + public R sync() { + return clientDetailsService.syncClientCache(); + } + + /** + * 导出所有客户端 + * @return excel + */ + @ResponseExcel + @SysLog("导出excel") + @GetMapping("/export") + public List export(SysOauthClientDetails sysOauthClientDetails) { + return clientDetailsService.list(Wrappers.query(sysOauthClientDetails)); + } + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java index c0e4a2bd..de2fb587 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java @@ -1,35 +1,41 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ + package com.pig4cloud.pig.admin.controller; -import cn.hutool.core.lang.tree.Tree; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.pig4cloud.pig.admin.api.entity.SysDept; +import com.pig4cloud.pig.admin.api.vo.DeptExcelVo; import com.pig4cloud.pig.admin.service.SysDeptService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; -import com.pig4cloud.pig.common.security.annotation.Inner; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; +import java.time.LocalDateTime; import java.util.List; /** @@ -38,12 +44,12 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-01-20 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/dept") -@Tag(name = "部门管理模块") +@Tag(description = "dept", name = "部门管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysDeptController { @@ -54,27 +60,27 @@ public class SysDeptController { * @param id ID * @return SysDept */ - @GetMapping("/{id:\\d+}") - public R getById(@PathVariable Long id) { + @GetMapping("/{id}") + public R getById(@PathVariable Long id) { return R.ok(sysDeptService.getById(id)); } /** - * 返回树形菜单集合 - * @return 树形菜单 + * 查询全部部门 */ - @GetMapping(value = "/tree") - public R>> listDeptTrees() { - return R.ok(sysDeptService.listDeptTrees()); + @GetMapping("/list") + public R list() { + return R.ok(sysDeptService.list()); } /** - * 返回当前用户树形菜单集合 + * 返回树形菜单集合 + * @param deptName 部门名称 * @return 树形菜单 */ - @GetMapping(value = "/user-tree") - public R>> listCurrentUserDeptTrees() { - return R.ok(sysDeptService.listCurrentUserDeptTrees()); + @GetMapping(value = "/tree") + public R getTree(String deptName) { + return R.ok(sysDeptService.selectTree(deptName)); } /** @@ -85,8 +91,8 @@ public class SysDeptController { @SysLog("添加部门") @PostMapping @PreAuthorize("@pms.hasPermission('sys_dept_add')") - public R save(@Valid @RequestBody SysDept sysDept) { - return R.ok(sysDeptService.saveDept(sysDept)); + public R save(@Valid @RequestBody SysDept sysDept) { + return R.ok(sysDeptService.save(sysDept)); } /** @@ -95,9 +101,9 @@ public class SysDeptController { * @return success/false */ @SysLog("删除部门") - @DeleteMapping("/{id:\\d+}") + @DeleteMapping("/{id}") @PreAuthorize("@pms.hasPermission('sys_dept_del')") - public R removeById(@PathVariable Long id) { + public R removeById(@PathVariable Long id) { return R.ok(sysDeptService.removeDeptById(id)); } @@ -109,30 +115,40 @@ public class SysDeptController { @SysLog("编辑部门") @PutMapping @PreAuthorize("@pms.hasPermission('sys_dept_edit')") - public R update(@Valid @RequestBody SysDept sysDept) { - return R.ok(sysDeptService.updateDeptById(sysDept)); + public R update(@Valid @RequestBody SysDept sysDept) { + sysDept.setUpdateTime(LocalDateTime.now()); + return R.ok(sysDeptService.updateById(sysDept)); } /** - * 根据部门名查询部门信息 - * @param deptName 部门名 - * @return SysDept + * 查收子级列表 + * @return 返回子级 */ - @GetMapping("/details/{deptName}") - public R user(@PathVariable String deptName) { - SysDept condition = new SysDept(); - condition.setName(deptName); - return R.ok(sysDeptService.getOne(new QueryWrapper<>(condition))); + @GetMapping(value = "/getDescendantList/{deptId}") + public R getDescendantList(@PathVariable Long deptId) { + return R.ok(sysDeptService.listDescendant(deptId)); } /** - * 查收子级id列表 - * @return 返回子级id列表 + * 导出部门 + * @return */ - @Inner - @GetMapping(value = "/child-id/{deptId:\\d+}") - public R> listChildDeptId(@PathVariable Long deptId) { - return R.ok(sysDeptService.listChildDeptId(deptId)); + @ResponseExcel + @GetMapping("/export") + public List export() { + return sysDeptService.listExcelVo(); + } + + /** + * 导入部门 + * @param excelVOList + * @param bindingResult + * @return + */ + @PostMapping("import") + public R importDept(@RequestExcel List excelVOList, BindingResult bindingResult) { + + return sysDeptService.importDept(excelVOList, bindingResult); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index 02403680..1a30028c 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.controller; @@ -27,16 +30,18 @@ import com.pig4cloud.pig.admin.service.SysDictService; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.util.List; /** @@ -48,52 +53,58 @@ import java.util.List; * @since 2019-03-19 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/dict") -@Tag(name = "字典管理模块") +@Tag(description = "dict", name = "字典管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysDictController { - private final SysDictItemService sysDictItemService; - private final SysDictService sysDictService; + private final SysDictItemService sysDictItemService; + /** * 通过ID查询字典信息 * @param id ID * @return 字典信息 */ - @GetMapping("/{id:\\d+}") - public R getById(@PathVariable Long id) { + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { return R.ok(sysDictService.getById(id)); } + /** + * 查询字典信息 + * @param query 查询信息 + * @return 字典信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysDict query) { + return R.ok(sysDictService.getOne(Wrappers.query(query), false)); + } + /** * 分页查询字典信息 * @param page 分页对象 * @return 分页对象 */ @GetMapping("/page") - public R> getDictPage(Page page, SysDict sysDict) { + public R getDictPage(@ParameterObject Page page, @ParameterObject SysDict sysDict) { return R.ok(sysDictService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()) .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, sysDict.getSystemFlag()) - .orderByDesc(SysDict::getUpdateTime))); + .like(StrUtil.isNotBlank(sysDict.getDictType()), SysDict::getDictType, sysDict.getDictType()))); } /** * 通过字典类型查找字典 - * @param key 类型 + * @param type 类型 * @return 同类型字典 */ - @GetMapping("/key/{key}") - @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#key") - public R> getDictByKey(@PathVariable String key) { - return R.ok(sysDictItemService.list(Wrappers.query() - .lambda() - .eq(SysDictItem::getDictKey, key) - .orderByAsc(SysDictItem::getSortOrder))); + @GetMapping("/type/{type}") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") + public R> getDictByType(@PathVariable String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); } /** @@ -104,21 +115,22 @@ public class SysDictController { @SysLog("添加字典") @PostMapping @PreAuthorize("@pms.hasPermission('sys_dict_add')") - public R save(@Valid @RequestBody SysDict sysDict) { - return R.ok(sysDictService.save(sysDict)); + public R save(@Valid @RequestBody SysDict sysDict) { + sysDictService.save(sysDict); + return R.ok(sysDict); } /** * 删除字典,并且清除字典缓存 - * @param id ID + * @param ids ID * @return R */ @SysLog("删除字典") - @DeleteMapping("/{id:\\d+}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_dict_del')") - public R removeById(@PathVariable Long id) { - sysDictService.removeDict(id); - return R.ok(); + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysDictService.removeDictByIds(ids)); } /** @@ -130,8 +142,20 @@ public class SysDictController { @SysLog("修改字典") @PreAuthorize("@pms.hasPermission('sys_dict_edit')") public R updateById(@Valid @RequestBody SysDict sysDict) { - sysDictService.updateDict(sysDict); - return R.ok(); + return sysDictService.updateDict(sysDict); + } + + /** + * 分页查询 + * @param name 名称或者字典项 + * @return + */ + @GetMapping("/list") + public R getDictList(String name) { + return R.ok(sysDictService.list(Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(name), SysDict::getDictType, name) + .or() + .like(StrUtil.isNotBlank(name), SysDict::getDescription, name))); } /** @@ -141,7 +165,7 @@ public class SysDictController { * @return */ @GetMapping("/item/page") - public R> getSysDictItemPage(Page page, SysDictItem sysDictItem) { + public R getSysDictItemPage(Page page, SysDictItem sysDictItem) { return R.ok(sysDictItemService.page(page, Wrappers.query(sysDictItem))); } @@ -150,11 +174,21 @@ public class SysDictController { * @param id id * @return R */ - @GetMapping("/item/{id:\\d+}") - public R getDictItemById(@PathVariable("id") Long id) { + @GetMapping("/item/details/{id}") + public R getDictItemById(@PathVariable("id") Long id) { return R.ok(sysDictItemService.getById(id)); } + /** + * 查询字典项详情 + * @param query 查询条件 + * @return R + */ + @GetMapping("/item/details") + public R getDictItemDetails(SysDictItem query) { + return R.ok(sysDictItemService.getOne(Wrappers.query(query), false)); + } + /** * 新增字典项 * @param sysDictItem 字典项 @@ -163,7 +197,7 @@ public class SysDictController { @SysLog("新增字典项") @PostMapping("/item") @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public R save(@RequestBody SysDictItem sysDictItem) { + public R save(@RequestBody SysDictItem sysDictItem) { return R.ok(sysDictItemService.save(sysDictItem)); } @@ -175,8 +209,7 @@ public class SysDictController { @SysLog("修改字典项") @PutMapping("/item") public R updateById(@RequestBody SysDictItem sysDictItem) { - sysDictItemService.updateDictItem(sysDictItem); - return R.ok(); + return sysDictItemService.updateDictItem(sysDictItem); } /** @@ -185,18 +218,25 @@ public class SysDictController { * @return R */ @SysLog("删除字典项") - @DeleteMapping("/item/{id:\\d+}") + @DeleteMapping("/item/{id}") public R removeDictItemById(@PathVariable Long id) { - sysDictItemService.removeDictItem(id); - return R.ok(); + return sysDictItemService.removeDictItem(id); } - @SysLog("清除字典缓存") - @DeleteMapping("/cache") - @PreAuthorize("@pms.hasPermission('sys_dict_del')") - public R clearDictCache() { - sysDictService.clearDictCache(); - return R.ok(); + /** + * 同步缓存字典 + * @return R + */ + @SysLog("同步字典") + @PutMapping("/sync") + public R sync() { + return sysDictService.syncDictCache(); + } + + @ResponseExcel + @GetMapping("/export") + public List export(SysDictItem sysDictItem) { + return sysDictItemService.list(Wrappers.query(sysDictItem)); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java index 59ed9868..0b1af97e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java @@ -19,7 +19,7 @@ package com.pig4cloud.pig.admin.controller; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysFile; @@ -30,26 +30,26 @@ import com.pig4cloud.pig.common.security.annotation.Inner; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; import lombok.SneakyThrows; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; - /** * 文件管理 * * @author Luckly - * @date 2021-09-11 + * @date 2019-06-18 17:18:42 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/sys-file") -@Tag(name = "文件管理模块") +@Tag(description = "sys-file", name = "文件管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysFileController { @@ -63,22 +63,26 @@ public class SysFileController { */ @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") - public R> getSysFilePage(Page page, SysFile sysFile) { - return R.ok(sysFileService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysFile.getFileName()), SysFile::getFileName, sysFile.getFileName()))); + public R getSysFilePage(@ParameterObject Page page, @ParameterObject SysFile sysFile) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysFile.getOriginal()), SysFile::getOriginal, sysFile.getOriginal()); + return R.ok(sysFileService.page(page, wrapper)); } /** * 通过id删除文件管理 - * @param id id + * @param ids id 列表 * @return R */ @Operation(summary = "通过id删除文件管理", description = "通过id删除文件管理") @SysLog("删除文件管理") - @DeleteMapping("/{id:\\d+}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_file_del')") - public R removeById(@PathVariable Long id) { - return R.ok(sysFileService.deleteFile(id)); + public R removeById(@RequestBody Long[] ids) { + for (Long id : ids) { + sysFileService.deleteFile(id); + } + return R.ok(); } /** @@ -110,23 +114,11 @@ public class SysFileController { * @param response 本地文件 */ @SneakyThrows - @GetMapping("/local/{fileName}") + @GetMapping("/local/file/{fileName}") public void localFile(@PathVariable String fileName, HttpServletResponse response) { ClassPathResource resource = new ClassPathResource("file/" + fileName); response.setContentType("application/octet-stream; charset=UTF-8"); IoUtil.copy(resource.getInputStream(), response.getOutputStream()); } - /** - * 获取文件外网的访问地址 - * @param bucket - * @param fileName - * @return - */ - @Inner(false) - @GetMapping("/online/{bucket}/{fileName}") - public R onlineFile(@PathVariable String bucket, @PathVariable String fileName) { - return R.ok(sysFileService.onlineFile(bucket, fileName)); - } - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index f33d031d..0cc74fa7 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -1,21 +1,26 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ + package com.pig4cloud.pig.admin.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.dto.SysLogDTO; import com.pig4cloud.pig.admin.api.entity.SysLog; @@ -25,12 +30,13 @@ import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.util.List; /** @@ -39,12 +45,12 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-11-20 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/log") -@Tag(name = "日志管理模块") +@Tag(description = "log", name = "日志管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysLogController { @@ -57,19 +63,19 @@ public class SysLogController { * @return */ @GetMapping("/page") - public R> getLogPage(Page page, SysLogDTO sysLog) { + public R getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { return R.ok(sysLogService.getLogByPage(page, sysLog)); } /** - * 删除日志 - * @param id ID + * 批量删除日志 + * @param ids ID * @return success/false */ - @DeleteMapping("/{id:\\d+}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_log_del')") - public R removeById(@PathVariable Long id) { - return R.ok(sysLogService.removeById(id)); + public R removeByIds(@RequestBody Long[] ids) { + return R.ok(sysLogService.removeBatchByIds(CollUtil.toList(ids))); } /** @@ -78,21 +84,21 @@ public class SysLogController { * @return success/false */ @Inner - @PostMapping - public R save(@Valid @RequestBody SysLog sysLog) { - return R.ok(sysLogService.save(sysLog)); + @PostMapping("/save") + public R save(@Valid @RequestBody SysLog sysLog) { + return R.ok(sysLogService.saveLog(sysLog)); } /** * 导出excel 表格 * @param sysLog 查询条件 - * @return EXCEL + * @return */ @ResponseExcel @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('sys_log_import_export')") - public List export(SysLogDTO sysLog) { - return sysLogService.getLogList(sysLog); + @PreAuthorize("@pms.hasPermission('sys_log_export')") + public List export(SysLog sysLog) { + return sysLogService.list(Wrappers.query(sysLog)); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java index 6b9e057e..1eb3fd1e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java @@ -1,22 +1,24 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.controller; -import cn.hutool.core.lang.tree.Tree; import com.pig4cloud.pig.admin.api.entity.SysMenu; import com.pig4cloud.pig.admin.service.SysMenuService; import com.pig4cloud.pig.common.core.util.R; @@ -24,14 +26,13 @@ import com.pig4cloud.pig.common.log.annotation.SysLog; import com.pig4cloud.pig.common.security.util.SecurityUtils; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -40,9 +41,9 @@ import java.util.stream.Collectors; * @date 2017/10/31 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/menu") -@Tag(name = "菜单管理模块") +@Tag(description = "menu", name = "菜单管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysMenuController { @@ -50,29 +51,27 @@ public class SysMenuController { /** * 返回当前用户的树形菜单集合 + * @param type 类型 * @param parentId 父节点ID * @return 当前用户的树形菜单 */ @GetMapping - public R>> getUserMenu(Long parentId) { + public R getUserMenu(String type, Long parentId) { // 获取符合条件的菜单 - Set menuSet = SecurityUtils.getRoles() - .stream() - .map(sysMenuService::findMenuByRoleId) - .flatMap(Collection::stream) - .collect(Collectors.toSet()); - return R.ok(sysMenuService.filterMenu(menuSet, parentId)); + Set all = new HashSet<>(); + SecurityUtils.getRoles().forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId))); + return R.ok(sysMenuService.filterMenu(all, type, parentId)); } /** * 返回树形菜单集合 - * @param lazy 是否是懒加载 * @param parentId 父节点ID + * @param menuName 菜单名称 * @return 树形菜单 */ @GetMapping(value = "/tree") - public R>> getTree(boolean lazy, Long parentId) { - return R.ok(sysMenuService.treeMenu(lazy, parentId)); + public R getTree(Long parentId, String menuName, String type) { + return R.ok(sysMenuService.treeMenu(parentId, menuName, type)); } /** @@ -81,7 +80,7 @@ public class SysMenuController { * @return 属性集合 */ @GetMapping("/tree/{roleId}") - public R> getRoleTree(@PathVariable Long roleId) { + public R getRoleTree(@PathVariable Long roleId) { return R .ok(sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); } @@ -91,20 +90,20 @@ public class SysMenuController { * @param id 菜单ID * @return 菜单详细信息 */ - @GetMapping("/{id:\\d+}") - public R getById(@PathVariable Long id) { + @GetMapping("/{id}") + public R getById(@PathVariable Long id) { return R.ok(sysMenuService.getById(id)); } /** * 新增菜单 * @param sysMenu 菜单信息 - * @return 含ID 菜单信息 + * @return success/false */ @SysLog("新增菜单") @PostMapping @PreAuthorize("@pms.hasPermission('sys_menu_add')") - public R save(@Valid @RequestBody SysMenu sysMenu) { + public R save(@Valid @RequestBody SysMenu sysMenu) { sysMenuService.save(sysMenu); return R.ok(sysMenu); } @@ -115,10 +114,10 @@ public class SysMenuController { * @return success/false */ @SysLog("删除菜单") - @DeleteMapping("/{id:\\d+}") + @DeleteMapping("/{id}") @PreAuthorize("@pms.hasPermission('sys_menu_del')") - public R removeById(@PathVariable Long id) { - return R.ok(sysMenuService.removeMenuById(id)); + public R removeById(@PathVariable Long id) { + return sysMenuService.removeMenuById(id); } /** @@ -129,19 +128,8 @@ public class SysMenuController { @SysLog("更新菜单") @PutMapping @PreAuthorize("@pms.hasPermission('sys_menu_edit')") - public R update(@Valid @RequestBody SysMenu sysMenu) { + public R update(@Valid @RequestBody SysMenu sysMenu) { return R.ok(sysMenuService.updateMenuById(sysMenu)); } - /** - * 清除菜单缓存 - */ - @SysLog("清除菜单缓存") - @DeleteMapping("/cache") - @PreAuthorize("@pms.hasPermission('sys_menu_del')") - public R clearMenuCache() { - sysMenuService.clearMenuCache(); - return R.ok(); - } - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMobileController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMobileController.java new file mode 100644 index 00000000..31f5d084 --- /dev/null +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMobileController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.admin.controller; + +import com.pig4cloud.pig.admin.service.SysMobileService; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 手机验证码 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/mobile") +@Tag(description = "mobile", name = "手机管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysMobileController { + + private final SysMobileService mobileService; + + @Inner(value = false) + @GetMapping("/{mobile}") + public R sendSmsCode(@PathVariable String mobile) { + return mobileService.sendSmsCode(mobile); + } + +} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java index b8bffb48..3cffca0e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java @@ -17,6 +17,8 @@ package com.pig4cloud.pig.admin.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysPost; @@ -30,6 +32,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.BindingResult; @@ -38,13 +41,15 @@ import org.springframework.web.bind.annotation.*; import java.util.List; /** + * 岗位信息表 + * * @author fxz - * @date 2022-03-15 17:18:40 + * @date 2022-03-26 12:50:43 */ @RestController @RequiredArgsConstructor @RequestMapping("/post") -@Tag(name = "岗位管理模块") +@Tag(description = "post", name = "岗位信息表管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysPostController { @@ -62,13 +67,15 @@ public class SysPostController { /** * 分页查询 * @param page 分页对象 + * @param sysPost 岗位信息表 * @return */ - @Operation(summary = "分页查询", description = "分页查询") + @Operation(description = "分页查询", summary = "分页查询") @GetMapping("/page") - @PreAuthorize("@pms.hasPermission('sys_post_get')") - public R getSysPostPage(Page page) { - return R.ok(sysPostService.page(page, Wrappers.lambdaQuery().orderByAsc(SysPost::getPostSort))); + @PreAuthorize("@pms.hasPermission('sys_post_view')") + public R getSysPostPage(@ParameterObject Page page, @ParameterObject SysPost sysPost) { + return R.ok(sysPostService.page(page, Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysPost.getPostName()), SysPost::getPostName, sysPost.getPostName()))); } /** @@ -76,19 +83,31 @@ public class SysPostController { * @param postId id * @return R */ - @Operation(summary = "通过id查询", description = "通过id查询") - @GetMapping("/{postId}") - @PreAuthorize("@pms.hasPermission('sys_post_get')") + @Operation(description = "通过id查询", summary = "通过id查询") + @GetMapping("/details/{postId}") + @PreAuthorize("@pms.hasPermission('sys_post_view')") public R getById(@PathVariable("postId") Long postId) { return R.ok(sysPostService.getById(postId)); } + /** + * 查询岗位信息信息 + * @param query 查询条件 + * @return R + */ + @Operation(description = "查询角色信息", summary = "查询角色信息") + @GetMapping("/details") + @PreAuthorize("@pms.hasPermission('sys_post_view')") + public R getDetails(SysPost query) { + return R.ok(sysPostService.getOne(Wrappers.query(query), false)); + } + /** * 新增岗位信息表 * @param sysPost 岗位信息表 * @return R */ - @Operation(summary = "新增岗位信息表", description = "新增岗位信息表") + @Operation(description = "新增岗位信息表", summary = "新增岗位信息表") @SysLog("新增岗位信息表") @PostMapping @PreAuthorize("@pms.hasPermission('sys_post_add')") @@ -101,7 +120,7 @@ public class SysPostController { * @param sysPost 岗位信息表 * @return R */ - @Operation(summary = "修改岗位信息表", description = "修改岗位信息表") + @Operation(description = "修改岗位信息表", summary = "修改岗位信息表") @SysLog("修改岗位信息表") @PutMapping @PreAuthorize("@pms.hasPermission('sys_post_edit')") @@ -111,24 +130,24 @@ public class SysPostController { /** * 通过id删除岗位信息表 - * @param postId id + * @param ids id 列表 * @return R */ - @Operation(summary = "通过id删除岗位信息表", description = "通过id删除岗位信息表") + @Operation(description = "通过id删除岗位信息表", summary = "通过id删除岗位信息表") @SysLog("通过id删除岗位信息表") - @DeleteMapping("/{postId}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_post_del')") - public R removeById(@PathVariable Long postId) { - return R.ok(sysPostService.removeById(postId)); + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysPostService.removeBatchByIds(CollUtil.toList(ids))); } /** * 导出excel 表格 - * @return + * @return excel 文件流 */ @ResponseExcel @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('sys_post_import_export')") + @PreAuthorize("@pms.hasPermission('sys_post_export')") public List export() { return sysPostService.listPost(); } @@ -140,7 +159,7 @@ public class SysPostController { * @return ok fail */ @PostMapping("/import") - @PreAuthorize("@pms.hasPermission('sys_post_import_export')") + @PreAuthorize("@pms.hasPermission('sys_post_export')") public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { return sysPostService.importPost(excelVOList, bindingResult); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java index b3975718..0facfc9b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java @@ -18,6 +18,7 @@ package com.pig4cloud.pig.admin.controller; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysPublicParam; @@ -25,14 +26,18 @@ import com.pig4cloud.pig.admin.service.SysPublicParamService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; import com.pig4cloud.pig.common.security.annotation.Inner; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 公共参数 * @@ -40,9 +45,9 @@ import org.springframework.web.bind.annotation.*; * @date 2019-04-29 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/param") -@Tag(name = "公共参数配置") +@Tag(description = "param", name = "公共参数配置") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysPublicParamController { @@ -54,7 +59,7 @@ public class SysPublicParamController { * @return */ @Inner(value = false) - @Operation(summary = "查询公共参数值", description = "根据key查询公共参数值") + @Operation(description = "查询公共参数值", summary = "根据key查询公共参数值") @GetMapping("/publicValue/{publicKey}") public R publicKey(@PathVariable("publicKey") String publicKey) { return R.ok(sysPublicParamService.getSysPublicParamKeyToValue(publicKey)); @@ -66,15 +71,18 @@ public class SysPublicParamController { * @param sysPublicParam 公共参数 * @return */ - @Operation(summary = "分页查询", description = "分页查询") + @Operation(description = "分页查询", summary = "分页查询") @GetMapping("/page") - public R getSysPublicParamPage(Page page, SysPublicParam sysPublicParam) { - return R.ok(sysPublicParamService.page(page, - Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, - sysPublicParam.getPublicName()) - .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, - sysPublicParam.getPublicKey()))); + public R getSysPublicParamPage(@ParameterObject Page page, @ParameterObject SysPublicParam sysPublicParam) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() + .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, + sysPublicParam.getPublicName()) + .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, + sysPublicParam.getPublicKey()) + .eq(StrUtil.isNotBlank(sysPublicParam.getSystemFlag()), SysPublicParam::getSystemFlag, + sysPublicParam.getSystemFlag()); + + return R.ok(sysPublicParamService.page(page, wrapper)); } /** @@ -82,21 +90,26 @@ public class SysPublicParamController { * @param publicId id * @return R */ - @Operation(summary = "通过id查询公共参数", description = "通过id查询公共参数") - @GetMapping("/{publicId}") + @Operation(description = "通过id查询公共参数", summary = "通过id查询公共参数") + @GetMapping("/details/{publicId}") public R getById(@PathVariable("publicId") Long publicId) { return R.ok(sysPublicParamService.getById(publicId)); } + @GetMapping("/details") + public R getDetail(@ParameterObject SysPublicParam param) { + return R.ok(sysPublicParamService.getOne(Wrappers.query(param), false)); + } + /** * 新增公共参数 * @param sysPublicParam 公共参数 * @return R */ - @Operation(summary = "新增公共参数", description = "新增公共参数") + @Operation(description = "新增公共参数", summary = "新增公共参数") @SysLog("新增公共参数") @PostMapping - @PreAuthorize("@pms.hasPermission('sys_publicparam_add')") + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_add')") public R save(@RequestBody SysPublicParam sysPublicParam) { return R.ok(sysPublicParamService.save(sysPublicParam)); } @@ -106,25 +119,36 @@ public class SysPublicParamController { * @param sysPublicParam 公共参数 * @return R */ - @Operation(summary = "修改公共参数", description = "修改公共参数") + @Operation(description = "修改公共参数", summary = "修改公共参数") @SysLog("修改公共参数") @PutMapping - @PreAuthorize("@pms.hasPermission('sys_publicparam_edit')") + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_edit')") public R updateById(@RequestBody SysPublicParam sysPublicParam) { return sysPublicParamService.updateParam(sysPublicParam); } /** * 通过id删除公共参数 - * @param publicId id + * @param ids ids * @return R */ - @Operation(summary = "删除公共参数", description = "删除公共参数") + @Operation(description = "删除公共参数", summary = "删除公共参数") @SysLog("删除公共参数") - @DeleteMapping("/{publicId}") - @PreAuthorize("@pms.hasPermission('sys_publicparam_del')") - public R removeById(@PathVariable Long publicId) { - return sysPublicParamService.removeParam(publicId); + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysPublicParamService.removeParamByIds(ids)); + } + + /** + * 导出excel 表格 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_edit')") + public List export() { + return sysPublicParamService.list(); } /** @@ -133,6 +157,7 @@ public class SysPublicParamController { */ @SysLog("同步参数") @PutMapping("/sync") + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_edit')") public R sync() { return sysPublicParamService.syncParamCache(); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java index 8ee36fec..a73d66be 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; /** * @author lengleng * @date 2022/3/30 - * + *

* 客户端注册功能 register.user = false */ @RestController diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java index fc657136..843152dd 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java @@ -1,69 +1,83 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysRole; import com.pig4cloud.pig.admin.api.vo.RoleExcelVO; -import com.pig4cloud.pig.admin.api.vo.RoleVo; -import com.pig4cloud.pig.admin.service.SysRoleMenuService; +import com.pig4cloud.pig.admin.api.vo.RoleVO; import com.pig4cloud.pig.admin.service.SysRoleService; +import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.util.List; /** * @author lengleng - * @date 2019/2/1 + * @date 2020-02-10 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/role") -@Tag(name = "角色管理模块") +@Tag(description = "role", name = "角色管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysRoleController { private final SysRoleService sysRoleService; - private final SysRoleMenuService sysRoleMenuService; - /** * 通过ID查询角色信息 * @param id ID * @return 角色信息 */ - @GetMapping("/{id:\\d+}") - public R getById(@PathVariable Long id) { + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { return R.ok(sysRoleService.getById(id)); } + /** + * 查询角色信息 + * @param query 查询条件 + * @return 角色信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysRole query) { + return R.ok(sysRoleService.getOne(Wrappers.query(query), false)); + } + /** * 添加角色 * @param sysRole 角色信息 @@ -72,7 +86,8 @@ public class SysRoleController { @SysLog("添加角色") @PostMapping @PreAuthorize("@pms.hasPermission('sys_role_add')") - public R save(@Valid @RequestBody SysRole sysRole) { + @CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true) + public R save(@Valid @RequestBody SysRole sysRole) { return R.ok(sysRoleService.save(sysRole)); } @@ -84,20 +99,22 @@ public class SysRoleController { @SysLog("修改角色") @PutMapping @PreAuthorize("@pms.hasPermission('sys_role_edit')") - public R update(@Valid @RequestBody SysRole sysRole) { + @CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true) + public R update(@Valid @RequestBody SysRole sysRole) { return R.ok(sysRoleService.updateById(sysRole)); } /** * 删除角色 - * @param id + * @param ids * @return */ @SysLog("删除角色") - @DeleteMapping("/{id:\\d+}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_role_del')") - public R removeById(@PathVariable Long id) { - return R.ok(sysRoleService.removeRoleById(id)); + @CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysRoleService.removeRoleByIds(ids)); } /** @@ -105,18 +122,20 @@ public class SysRoleController { * @return 角色列表 */ @GetMapping("/list") - public R> listRoles() { + public R listRoles() { return R.ok(sysRoleService.list(Wrappers.emptyWrapper())); } /** * 分页查询角色信息 * @param page 分页对象 + * @param role 查询条件 * @return 分页对象 */ @GetMapping("/page") - public R> getRolePage(Page page) { - return R.ok(sysRoleService.page(page, Wrappers.emptyWrapper())); + public R getRolePage(Page page, SysRole role) { + return R.ok(sysRoleService.page(page, Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(role.getRoleName()), SysRole::getRoleName, role.getRoleName()))); } /** @@ -127,8 +146,18 @@ public class SysRoleController { @SysLog("更新角色菜单") @PutMapping("/menu") @PreAuthorize("@pms.hasPermission('sys_role_perm')") - public R saveRoleMenus(@RequestBody RoleVo roleVo) { - return R.ok(sysRoleMenuService.saveRoleMenus(roleVo.getRoleId(), roleVo.getMenuIds())); + public R saveRoleMenus(@RequestBody RoleVO roleVo) { + return R.ok(sysRoleService.updateRoleMenus(roleVo)); + } + + /** + * 通过角色ID 查询角色列表 + * @param roleIdList 角色ID + * @return + */ + @PostMapping("/getRoleList") + public R getRoleList(@RequestBody List roleIdList) { + return R.ok(sysRoleService.findRolesByRoleIds(roleIdList, CollUtil.join(roleIdList, StrUtil.UNDERLINE))); } /** @@ -137,7 +166,7 @@ public class SysRoleController { */ @ResponseExcel @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('sys_role_import_export')") + @PreAuthorize("@pms.hasPermission('sys_role_export')") public List export() { return sysRoleService.listRole(); } @@ -149,7 +178,7 @@ public class SysRoleController { * @return ok fail */ @PostMapping("/import") - @PreAuthorize("@pms.hasPermission('sys_role_import_export')") + @PreAuthorize("@pms.hasPermission('sys_role_export')") public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { return sysRoleService.importRole(excelVOList, bindingResult); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysSystemInfoController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysSystemInfoController.java new file mode 100644 index 00000000..4318abc7 --- /dev/null +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysSystemInfoController.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pig.admin.controller; + +import com.pig4cloud.pig.common.core.util.R; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +@RestController +@RequestMapping("/system") +@RequiredArgsConstructor +@Tag(description = "system", name = "系统监控") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysSystemInfoController { + + private final RedisTemplate redisTemplate; + + /** + * 缓存监控 + * @return R + */ + @GetMapping("/cache") + public R cache() { + Properties info = (Properties) redisTemplate.execute((RedisCallback) RedisServerCommands::info); + Properties commandStats = (Properties) redisTemplate + .execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) RedisServerCommands::dbSize); + + if (commandStats == null) { + return R.failed("获取异常"); + } + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + + result.put("commandStats", pieList); + return R.ok(result); + } + +} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/TokenController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java similarity index 32% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/TokenController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java index 3d53f91f..77c31f03 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/TokenController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java @@ -1,29 +1,35 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.controller; import com.pig4cloud.pig.admin.api.feign.RemoteTokenService; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.log.annotation.SysLog; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.Map; @@ -32,11 +38,11 @@ import java.util.Map; * @date 2018/9/4 getTokenPage 管理 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/token") -@Tag(name = "令牌管理模块") +@Tag(description = "token", name = "令牌管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class TokenController { +public class SysTokenController { private final RemoteTokenService remoteTokenService; @@ -45,20 +51,24 @@ public class TokenController { * @param params 参数集 * @return token集合 */ - @GetMapping("/page") - public R token(@RequestParam Map params) { - return remoteTokenService.getTokenPage(params); + @RequestMapping("/page") + public R getTokenPage(@RequestBody Map params) { + return remoteTokenService.getTokenPage(params, SecurityConstants.FROM_IN); } /** * 删除 - * @param id ID + * @param tokens tokens * @return success/false */ - @DeleteMapping("/{id}") + @SysLog("删除用户token") + @DeleteMapping("/delete") @PreAuthorize("@pms.hasPermission('sys_token_del')") - public R delete(@PathVariable String id) { - return remoteTokenService.removeToken(id); + public R removeById(@RequestBody String[] tokens) { + for (String token : tokens) { + remoteTokenService.removeTokenById(token, SecurityConstants.FROM_IN); + } + return R.ok(); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java index ae65ff8f..48f2467f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java @@ -1,109 +1,95 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.controller; -import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.dto.UserDTO; -import com.pig4cloud.pig.admin.api.dto.UserInfo; import com.pig4cloud.pig.admin.api.entity.SysUser; import com.pig4cloud.pig.admin.api.vo.UserExcelVO; -import com.pig4cloud.pig.admin.api.vo.UserInfoVO; -import com.pig4cloud.pig.admin.api.vo.UserVO; import com.pig4cloud.pig.admin.service.SysUserService; +import com.pig4cloud.pig.common.core.constant.CommonConstants; import com.pig4cloud.pig.common.core.exception.ErrorCodes; import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.pig.common.security.util.SecurityUtils; -import com.pig4cloud.pig.common.xss.core.XssCleanIgnore; import com.pig4cloud.plugin.excel.annotation.RequestExcel; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; +import javax.validation.Valid; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; import java.util.List; -import java.util.Set; /** * @author lengleng - * @date 2019/2/1 + * @date 2018/12/16 */ @RestController -@RequiredArgsConstructor +@AllArgsConstructor @RequestMapping("/user") -@Tag(name = "用户管理模块") +@Tag(description = "user", name = "用户管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysUserController { private final SysUserService userService; /** - * 获取当前用户全部信息 + * 获取指定用户全部信息 * @return 用户信息 */ - @GetMapping(value = { "/info" }) - public R info() { - String username = SecurityUtils.getUser().getUsername(); - SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); + @Inner + @GetMapping(value = { "/info/query" }) + public R info(@RequestParam(required = false) String username, @RequestParam(required = false) String phone) { + SysUser user = userService.getOne(Wrappers.query() + .lambda() + .eq(StrUtil.isNotBlank(username), SysUser::getUsername, username) + .eq(StrUtil.isNotBlank(phone), SysUser::getPhone, phone)); if (user == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, username)); } - UserInfo userInfo = userService.getUserInfo(user); - UserInfoVO vo = new UserInfoVO(); - vo.setSysUser(userInfo.getSysUser()); - vo.setRoles(userInfo.getRoles()); - vo.setPermissions(userInfo.getPermissions()); - return R.ok(vo); + return R.ok(userService.findUserInfo(user)); } /** - * 获取指定用户全部信息 + * 获取当前用户全部信息 * @return 用户信息 */ - @Inner - @GetMapping("/info/{username}") - public R info(@PathVariable String username) { + @GetMapping(value = { "/info" }) + public R info() { + String username = SecurityUtils.getUser().getUsername(); SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); if (user == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, username)); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); } - return R.ok(userService.getUserInfo(user)); - } - - /** - * 根据部门id,查询对应的用户 id 集合 - * @param deptIds 部门id 集合 - * @return 用户 id 集合 - */ - @Inner - @GetMapping("/ids") - public R> listUserIdByDeptIds(@RequestParam("deptIds") Set deptIds) { - return R.ok(userService.listUserIdByDeptIds(deptIds)); + return R.ok(userService.findUserInfo(user)); } /** @@ -111,37 +97,34 @@ public class SysUserController { * @param id ID * @return 用户信息 */ - @GetMapping("/{id:\\d+}") - public R user(@PathVariable Long id) { - return R.ok(userService.getUserVoById(id)); + @GetMapping("/details/{id}") + public R user(@PathVariable Long id) { + return R.ok(userService.selectUserVoById(id)); } /** - * 判断用户是否存在 - * @param userDTO 查询条件 - * @return + * 查询用户信息 + * @param query 查询条件 + * @return 不为空返回用户名 */ - @Inner(false) - @GetMapping("/check/exist") - public R isExist(UserDTO userDTO) { - List sysUserList = userService.list(new QueryWrapper<>(userDTO)); - if (CollUtil.isNotEmpty(sysUserList)) { - return R.ok(Boolean.TRUE, MsgUtils.getMessage(ErrorCodes.SYS_USER_EXISTING)); - } - return R.ok(Boolean.FALSE); + @Inner(value = false) + @GetMapping("/details") + public R getDetails(@ParameterObject SysUser query) { + SysUser sysUser = userService.getOne(Wrappers.query(query), false); + return R.ok(sysUser == null ? null : CommonConstants.SUCCESS); } /** * 删除用户信息 - * @param id ID + * @param ids ID * @return R */ @SysLog("删除用户信息") - @DeleteMapping("/{id:\\d+}") + @DeleteMapping @PreAuthorize("@pms.hasPermission('sys_user_del')") - public R userDel(@PathVariable Long id) { - SysUser sysUser = userService.getById(id); - return R.ok(userService.removeUserById(sysUser)); + @Operation(summary = "删除用户", description = "根据ID删除用户") + public R userDel(@RequestBody Long[] ids) { + return R.ok(userService.deleteUserByIds(ids)); } /** @@ -151,23 +134,21 @@ public class SysUserController { */ @SysLog("添加用户") @PostMapping - @XssCleanIgnore({ "password" }) @PreAuthorize("@pms.hasPermission('sys_user_add')") - public R user(@RequestBody UserDTO userDto) { + public R user(@RequestBody UserDTO userDto) { return R.ok(userService.saveUser(userDto)); } /** - * 管理员更新用户信息 + * 更新用户信息 * @param userDto 用户信息 * @return R */ @SysLog("更新用户信息") @PutMapping - @XssCleanIgnore({ "password" }) @PreAuthorize("@pms.hasPermission('sys_user_edit')") - public R updateUser(@Valid @RequestBody UserDTO userDto) { - return userService.updateUser(userDto); + public R updateUser(@Valid @RequestBody UserDTO userDto) { + return R.ok(userService.updateUser(userDto)); } /** @@ -177,32 +158,21 @@ public class SysUserController { * @return 用户集合 */ @GetMapping("/page") - public R> getUserPage(Page page, UserDTO userDTO) { - return R.ok(userService.getUserWithRolePage(page, userDTO)); + public R getUserPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) { + return R.ok(userService.getUsersWithRolePage(page, userDTO)); } /** - * 个人修改个人信息 + * 修改个人信息 * @param userDto userDto * @return success/false */ @SysLog("修改个人信息") @PutMapping("/edit") - @XssCleanIgnore({ "password", "newpassword1" }) - public R updateUserInfo(@Valid @RequestBody UserDTO userDto) { - userDto.setUsername(SecurityUtils.getUser().getUsername()); + public R updateUserInfo(@Valid @RequestBody UserDTO userDto) { return userService.updateUserInfo(userDto); } - /** - * @param username 用户名称 - * @return 上级部门用户列表 - */ - @GetMapping("/ancestor/{username}") - public R> listAncestorUsers(@PathVariable String username) { - return R.ok(userService.listAncestorUsersByUsername(username)); - } - /** * 导出excel 表格 * @param userDTO 查询条件 @@ -210,8 +180,8 @@ public class SysUserController { */ @ResponseExcel @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('sys_user_import_export')") - public List export(UserDTO userDTO) { + @PreAuthorize("@pms.hasPermission('sys_user_export')") + public List export(UserDTO userDTO) { return userService.listUser(userDTO); } @@ -222,9 +192,32 @@ public class SysUserController { * @return R */ @PostMapping("/import") - @PreAuthorize("@pms.hasPermission('sys_user_import_export')") + @PreAuthorize("@pms.hasPermission('sys_user_export')") public R importUser(@RequestExcel List excelVOList, BindingResult bindingResult) { return userService.importUser(excelVOList, bindingResult); } + /** + * 锁定指定用户 + * @param username 用户名 + * @return R + */ + @Inner + @PutMapping("/lock/{username}") + public R lockUser(@PathVariable String username) { + return userService.lockUser(username); + } + + @PutMapping("/password") + public R password(@RequestBody UserDTO userDto) { + String username = SecurityUtils.getUser().getUsername(); + userDto.setUsername(username); + return userService.changePassword(userDto); + } + + @PostMapping("/check") + public R check(String password) { + return userService.checkPassword(password); + } + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptMapper.java index fe8c985a..534eb299 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -20,23 +23,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.pig4cloud.pig.admin.api.entity.SysDept; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - /** *

* 部门管理 Mapper 接口 *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-01-20 */ @Mapper public interface SysDeptMapper extends BaseMapper { - /** - * 关联dept——relation - * @return 数据列表 - */ - List listDepts(); - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptRelationMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptRelationMapper.java deleted file mode 100644 index ed1dd96d..00000000 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDeptRelationMapper.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pig.admin.api.entity.SysDeptRelation; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * Mapper 接口 - *

- * - * @author lengleng - * @since 2019/2/1 - */ -@Mapper -public interface SysDeptRelationMapper extends BaseMapper { - - /** - * 删除部门节点关系 - * @param deptRelation 待删除的某一个部门节点 - */ - void deleteDeptRelations(SysDeptRelation deptRelation); - - /** - * 删除部门节点关系,同时删除所有关联此部门子节点的部门关系 - * @param id 待删除的部门节点ID - */ - void deleteDeptRelationsById(Long id); - - /** - * 新增部门节点关系 - * @param deptRelation 待新增的部门节点关系 - */ - void insertDeptRelations(SysDeptRelation deptRelation); - -} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictItemMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictItemMapper.java index 14b7d1db..90161017 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictItemMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictItemMapper.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.mapper; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictMapper.java index 4993e29e..5f13551a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysDictMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysLogMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysLogMapper.java index 140accba..2f0d8440 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysLogMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysLogMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -26,7 +29,7 @@ import org.apache.ibatis.annotations.Mapper; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-11-20 */ @Mapper public interface SysLogMapper extends BaseMapper { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysMenuMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysMenuMapper.java index 9622ba7f..86c65c2f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysMenuMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysMenuMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -20,7 +23,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.pig4cloud.pig.admin.api.entity.SysMenu; import org.apache.ibatis.annotations.Mapper; -import java.util.Set; +import java.util.List; /** *

@@ -28,7 +31,7 @@ import java.util.Set; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Mapper public interface SysMenuMapper extends BaseMapper { @@ -38,6 +41,6 @@ public interface SysMenuMapper extends BaseMapper { * @param roleId 角色ID * @return */ - Set listMenusByRoleId(Long roleId); + List listMenusByRoleId(Long roleId); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysOauthClientDetailsMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysOauthClientDetailsMapper.java index 124097e7..d1a2c9c8 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysOauthClientDetailsMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysOauthClientDetailsMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -26,7 +29,7 @@ import org.apache.ibatis.annotations.Mapper; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-05-15 */ @Mapper public interface SysOauthClientDetailsMapper extends BaseMapper { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysPostMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysPostMapper.java index 46078d6b..e4824679 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysPostMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysPostMapper.java @@ -24,10 +24,10 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; /** - * 岗位管理表 mapper接口 + * 岗位信息表 * * @author fxz - * @date 2022-03-15 17:18:40 + * @date 2022-03-26 12:50:43 */ @Mapper public interface SysPostMapper extends BaseMapper { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMapper.java index 6779e35a..8bed21e5 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -28,7 +31,7 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Mapper public interface SysRoleMapper extends BaseMapper { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMenuMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMenuMapper.java index b6196ab4..556f5037 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMenuMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysRoleMenuMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -26,7 +29,7 @@ import org.apache.ibatis.annotations.Mapper; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Mapper public interface SysRoleMenuMapper extends BaseMapper { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserMapper.java index 58fdaf1d..99b20667 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -33,7 +36,7 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Mapper public interface SysUserMapper extends BaseMapper { @@ -49,6 +52,7 @@ public interface SysUserMapper extends BaseMapper { * 分页查询用户信息(含角色) * @param page 分页 * @param userDTO 查询参数 + * @param dataScope * @return list */ IPage getUserVosPage(Page page, @Param("query") UserDTO userDTO); @@ -63,6 +67,7 @@ public interface SysUserMapper extends BaseMapper { /** * 查询用户列表 * @param userDTO 查询条件 + * @param dataScope 数据权限声明 * @return */ List selectVoList(@Param("query") UserDTO userDTO); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserRoleMapper.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserRoleMapper.java index e0de4b70..ded96389 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserRoleMapper.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/mapper/SysUserRoleMapper.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.mapper; @@ -19,7 +22,6 @@ package com.pig4cloud.pig.admin.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.pig4cloud.pig.admin.api.entity.SysUserRole; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; /** *

@@ -27,18 +29,9 @@ import org.apache.ibatis.annotations.Param; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Mapper public interface SysUserRoleMapper extends BaseMapper { - /** - * 根据用户Id删除该用户的角色关系 - * @param userId 用户ID - * @return boolean - * @author 寻欢·李 - * @date 2017年12月7日 16:31:38 - */ - Boolean deleteByUserId(@Param("userId") Long userId); - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptRelationService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptRelationService.java deleted file mode 100644 index 72cbb950..00000000 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptRelationService.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pig.admin.api.entity.SysDept; -import com.pig4cloud.pig.admin.api.entity.SysDeptRelation; - -/** - *

- * 服务类 - *

- * - * @author lengleng - * @since 2019/2/1 - */ -public interface SysDeptRelationService extends IService { - - /** - * 新建部门关系 - * @param sysDept 部门 - */ - void saveDeptRelation(SysDept sysDept); - - /** - * 通过ID删除部门关系 - * @param id - */ - void removeDeptRelationById(Long id); - - /** - * 更新部门关系 - * @param relation - */ - void updateDeptRelation(SysDeptRelation relation); - -} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptService.java index 2005be34..4153e6ea 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDeptService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -19,6 +22,9 @@ package com.pig4cloud.pig.admin.service; import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysDept; +import com.pig4cloud.pig.admin.api.vo.DeptExcelVo; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.validation.BindingResult; import java.util.List; @@ -28,28 +34,16 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-01-20 */ public interface SysDeptService extends IService { /** * 查询部门树菜单 + * @param deptName 部门名称 * @return 树 */ - List> listDeptTrees(); - - /** - * 查询用户部门树 - * @return - */ - List> listCurrentUserDeptTrees(); - - /** - * 添加信息部门 - * @param sysDept - * @return - */ - Boolean saveDept(SysDept sysDept); + List> selectTree(String deptName); /** * 删除部门 @@ -58,18 +52,15 @@ public interface SysDeptService extends IService { */ Boolean removeDeptById(Long id); - /** - * 更新部门 - * @param sysDept 部门信息 - * @return 成功、失败 - */ - Boolean updateDeptById(SysDept sysDept); + List listExcelVo(); + + R importDept(List excelVOList, BindingResult bindingResult); /** - * 查找指定部门的子部门id列表 - * @param deptId 部门id - * @return List + * 获取部门的所有后代部门列表 + * @param deptId 部门ID + * @return 后代部门列表 */ - List listChildDeptId(Long deptId); + List listDescendant(Long deptId); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictItemService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictItemService.java index d9af4afe..8963eb3c 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictItemService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictItemService.java @@ -1,22 +1,24 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysDictItem; +import com.pig4cloud.pig.common.core.util.R; /** * 字典项 @@ -31,13 +33,13 @@ public interface SysDictItemService extends IService { * @param id 字典项ID * @return */ - void removeDictItem(Long id); + R removeDictItem(Long id); /** * 更新字典项 * @param item 字典项 * @return */ - void updateDictItem(SysDictItem item); + R updateDictItem(SysDictItem item); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictService.java index 58ff67c4..90779628 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysDictService.java @@ -1,22 +1,24 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysDict; +import com.pig4cloud.pig.common.core.util.R; /** * 字典表 @@ -28,21 +30,22 @@ public interface SysDictService extends IService { /** * 根据ID 删除字典 - * @param id + * @param ids ID列表 * @return */ - void removeDict(Long id); + R removeDictByIds(Long[] ids); /** * 更新字典 * @param sysDict 字典 * @return */ - void updateDict(SysDict sysDict); + R updateDict(SysDict sysDict); /** - * 清除缓存 + * 同步缓存 (清空缓存) + * @return R */ - void clearDictCache(); + R syncDictCache(); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysFileService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysFileService.java index 3d49531e..a203ddb7 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysFileService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysFileService.java @@ -20,9 +20,8 @@ package com.pig4cloud.pig.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysFile; import com.pig4cloud.pig.common.core.util.R; -import org.springframework.web.multipart.MultipartFile; - import javax.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; /** * 文件管理 @@ -54,12 +53,4 @@ public interface SysFileService extends IService { */ Boolean deleteFile(Long id); - /** - * 获取外网访问地址 - * @param bucket - * @param fileName - * @return - */ - String onlineFile(String bucket, String fileName); - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java index e81ccccb..7fe4dc7b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -21,15 +24,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.dto.SysLogDTO; import com.pig4cloud.pig.admin.api.entity.SysLog; -import java.util.List; - /** *

* 日志表 服务类 *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-11-20 */ public interface SysLogService extends IService { @@ -39,13 +40,13 @@ public interface SysLogService extends IService { * @param sysLog * @return */ - Page getLogByPage(Page page, SysLogDTO sysLog); + Page getLogByPage(Page page, SysLogDTO sysLog); /** - * 列表查询日志 - * @param sysLog 查询条件 - * @return List + * 插入日志 + * @param sysLog 日志对象 + * @return true/false */ - List getLogList(SysLogDTO sysLog); + Boolean saveLog(SysLog sysLog); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMenuService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMenuService.java index 6b842e50..c1594d85 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMenuService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMenuService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -19,6 +22,7 @@ package com.pig4cloud.pig.admin.service; import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysMenu; +import com.pig4cloud.pig.common.core.util.R; import java.util.List; import java.util.Set; @@ -29,7 +33,7 @@ import java.util.Set; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ public interface SysMenuService extends IService { @@ -38,14 +42,14 @@ public interface SysMenuService extends IService { * @param roleId 角色ID * @return 菜单列表 */ - Set findMenuByRoleId(Long roleId); + List findMenuByRoleId(Long roleId); /** * 级联删除菜单 * @param id 菜单ID - * @return true成功, false失败 + * @return 成功、失败 */ - Boolean removeMenuById(Long id); + R removeMenuById(Long id); /** * 更新菜单信息 @@ -56,23 +60,18 @@ public interface SysMenuService extends IService { /** * 构建树 - * @param lazy 是否是懒加载 * @param parentId 父节点ID + * @param menuName 菜单名称 * @return */ - List> treeMenu(boolean lazy, Long parentId); + List> treeMenu(Long parentId, String menuName, String type); /** * 查询菜单 - * @param menuSet + * @param voSet * @param parentId * @return */ - List> filterMenu(Set menuSet, Long parentId); - - /** - * 清除菜单缓存 - */ - void clearMenuCache(); + List> filterMenu(Set voSet, String type, Long parentId); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/AppService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMobileService.java similarity index 78% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/AppService.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMobileService.java index 80981864..d102831e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/AppService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysMobileService.java @@ -17,28 +17,19 @@ package com.pig4cloud.pig.admin.service; -import com.pig4cloud.pig.admin.api.dto.AppSmsDTO; import com.pig4cloud.pig.common.core.util.R; /** * @author lengleng * @date 2018/11/14 */ -public interface AppService { +public interface SysMobileService { /** * 发送手机验证码 - * @param sms phone + * @param mobile mobile * @return code */ - R sendSmsCode(AppSmsDTO sms); - - /** - * 校验验证码 - * @param phone 手机号 - * @param code 验证码 - * @return - */ - boolean check(String phone, String code); + R sendSmsCode(String mobile); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysOauthClientDetailsService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysOauthClientDetailsService.java index ce4026c7..110c7c99 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysOauthClientDetailsService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysOauthClientDetailsService.java @@ -1,23 +1,28 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pig.common.core.util.R; /** *

@@ -25,27 +30,36 @@ import com.pig4cloud.pig.admin.api.entity.SysOauthClientDetails; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-05-15 */ public interface SysOauthClientDetailsService extends IService { /** - * 通过ID删除客户端 - * @param id + * 根据客户端信息 + * @param clientDetails + * @return + */ + Boolean updateClientById(SysOauthClientDetails clientDetails); + + /** + * 添加客户端 + * @param clientDetails * @return */ - Boolean removeClientDetailsById(String id); + Boolean saveClient(SysOauthClientDetails clientDetails); /** - * 修改客户端信息 - * @param sysOauthClientDetails + * 分页查询客户端信息 + * @param page + * @param query * @return */ - Boolean updateClientDetailsById(SysOauthClientDetails sysOauthClientDetails); + Page queryPage(Page page, SysOauthClientDetails query); /** - * 清除客户端缓存 + * 同步缓存 (清空缓存) + * @return R */ - void clearClientCache(); + R syncClientCache(); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java index 6bd2ea6c..e7349fa3 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java @@ -26,13 +26,19 @@ import org.springframework.validation.BindingResult; import java.util.List; /** - * 岗位管理 服务类 + * 岗位信息表 * * @author fxz - * @date 2022-03-15 17:18:40 + * @date 2022-03-26 12:50:43 */ public interface SysPostService extends IService { + /** + * 导出excel 表格 + * @return + */ + List listPost(); + /** * 导入岗位 * @param excelVOList 岗位列表 @@ -41,10 +47,4 @@ public interface SysPostService extends IService { */ R importPost(List excelVOList, BindingResult bindingResult); - /** - * 导出excel 表格 - * @return - */ - List listPost(); - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPublicParamService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPublicParamService.java index a834f9f2..e6f50ee4 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPublicParamService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPublicParamService.java @@ -45,10 +45,10 @@ public interface SysPublicParamService extends IService { /** * 删除参数 - * @param publicId + * @param publicIds 参数列表 * @return */ - R removeParam(Long publicId); + R removeParamByIds(Long[] publicIds); /** * 同步缓存 diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleMenuService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleMenuService.java index f8f5c084..73a13c6e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleMenuService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleMenuService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -25,13 +28,13 @@ import com.pig4cloud.pig.admin.api.entity.SysRoleMenu; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ public interface SysRoleMenuService extends IService { /** * 更新角色菜单 - * @param roleId 角色 + * @param roleId 角色ID * @param menuIds 菜单ID拼成的字符串,每个id之间根据逗号分隔 * @return */ diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java index c00b36a1..cbd3e5c1 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -19,6 +22,7 @@ package com.pig4cloud.pig.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysRole; import com.pig4cloud.pig.admin.api.vo.RoleExcelVO; +import com.pig4cloud.pig.admin.api.vo.RoleVO; import com.pig4cloud.pig.common.core.util.R; import org.springframework.validation.BindingResult; @@ -30,16 +34,38 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ public interface SysRoleService extends IService { + /** + * 通过用户ID,查询角色信息 + * @param userId + * @return + */ + List findRolesByUserId(Long userId); + + /** + * 根据角色ID 查询角色列表 + * @param roleIdList 角色ID列表 + * @param key 缓存key + * @return + */ + List findRolesByRoleIds(List roleIdList, String key); + /** * 通过角色ID,删除角色 - * @param id + * @param ids + * @return + */ + Boolean removeRoleByIds(Long[] ids); + + /** + * 根据角色菜单列表 + * @param roleVo 角色&菜单列表 * @return */ - Boolean removeRoleById(Long id); + Boolean updateRoleMenus(RoleVO roleVo); /** * 导入角色 diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserRoleService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserRoleService.java index 6860414f..b86a402a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserRoleService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserRoleService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -25,7 +28,7 @@ import com.pig4cloud.pig.admin.api.entity.SysUserRole; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ public interface SysUserRoleService extends IService { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserService.java index f58f39c5..cfcdfa0a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysUserService.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service; @@ -28,11 +31,10 @@ import com.pig4cloud.pig.common.core.util.R; import org.springframework.validation.BindingResult; import java.util.List; -import java.util.Set; /** * @author lengleng - * @date 2019/2/1 + * @date 2017/10/31 */ public interface SysUserService extends IService { @@ -41,7 +43,7 @@ public interface SysUserService extends IService { * @param sysUser 用户 * @return userInfo */ - UserInfo getUserInfo(SysUser sysUser); + UserInfo findUserInfo(SysUser sysUser); /** * 分页查询用户信息(含有角色信息) @@ -49,19 +51,19 @@ public interface SysUserService extends IService { * @param userDTO 参数列表 * @return */ - IPage getUserWithRolePage(Page page, UserDTO userDTO); + IPage getUsersWithRolePage(Page page, UserDTO userDTO); /** * 删除用户 - * @param sysUser 用户 + * @param ids 用户 * @return boolean */ - Boolean removeUserById(SysUser sysUser); + Boolean deleteUserByIds(Long[] ids); /** * 更新当前用户基本信息 * @param userDto 用户信息 - * @return Boolean 操作成功返回true,操作失败返回false + * @return Boolean */ R updateUserInfo(UserDTO userDto); @@ -70,21 +72,14 @@ public interface SysUserService extends IService { * @param userDto 用户信息 * @return */ - R updateUser(UserDTO userDto); + Boolean updateUser(UserDTO userDto); /** * 通过ID查询用户信息 * @param id 用户ID * @return 用户信息 */ - UserVO getUserVoById(Long id); - - /** - * 查询上级部门的用户信息 - * @param username 用户名 - * @return R - */ - List listAncestorUsersByUsername(String username); + UserVO selectUserVoById(Long id); /** * 保存用户信息 @@ -108,13 +103,6 @@ public interface SysUserService extends IService { */ R importUser(List excelVOList, BindingResult bindingResult); - /** - * 根据部门 id 列表查询对应的用户 id 集合 - * @param deptIds 部门 id 列表 - * @return userIdList - */ - List listUserIdByDeptIds(Set deptIds); - /** * 注册用户 * @param userDto 用户信息 @@ -122,4 +110,25 @@ public interface SysUserService extends IService { */ R registerUser(UserDTO userDto); + /** + * 锁定用户 + * @param username + * @return + */ + R lockUser(String username); + + /** + * 修改密码 + * @param userDto 用户信息 + * @return + */ + R changePassword(UserDTO userDto); + + /** + * 校验密码 + * @param password 密码明文 + * @return + */ + R checkPassword(String password); + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java deleted file mode 100644 index 3f077e3d..00000000 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.admin.service.impl; - -import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pig.admin.api.entity.SysDept; -import com.pig4cloud.pig.admin.api.entity.SysDeptRelation; -import com.pig4cloud.pig.admin.mapper.SysDeptRelationMapper; -import com.pig4cloud.pig.admin.service.SysDeptRelationService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -/** - *

- * 服务实现类 - *

- * - * @author lengleng - * @since 2019/2/1 - */ -@Service -@RequiredArgsConstructor -public class SysDeptRelationServiceImpl extends ServiceImpl - implements SysDeptRelationService { - - private final SysDeptRelationMapper sysDeptRelationMapper; - - /** - * 维护部门关系 - * @param sysDept 部门 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void saveDeptRelation(SysDept sysDept) { - // 增加部门关系表 - List relationList = sysDeptRelationMapper.selectList( - Wrappers.query().lambda().eq(SysDeptRelation::getDescendant, sysDept.getParentId())) - .stream() - .map(relation -> { - relation.setDescendant(sysDept.getDeptId()); - return relation; - }) - .collect(Collectors.toList()); - if (CollUtil.isNotEmpty(relationList)) { - this.saveBatch(relationList); - } - - // 自己也要维护到关系表中 - SysDeptRelation own = new SysDeptRelation(); - own.setDescendant(sysDept.getDeptId()); - own.setAncestor(sysDept.getDeptId()); - sysDeptRelationMapper.insert(own); - } - - /** - * 通过ID删除部门关系 - * @param id - */ - @Override - public void removeDeptRelationById(Long id) { - baseMapper.deleteDeptRelationsById(id); - } - - /** - * 更新部门关系 - * @param relation - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void updateDeptRelation(SysDeptRelation relation) { - baseMapper.deleteDeptRelations(relation); - baseMapper.insertDeptRelations(relation); - } - -} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java index ade640ef..31cd166c 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; @@ -20,17 +23,20 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.admin.api.entity.SysDept; -import com.pig4cloud.pig.admin.api.entity.SysDeptRelation; +import com.pig4cloud.pig.admin.api.vo.DeptExcelVo; import com.pig4cloud.pig.admin.mapper.SysDeptMapper; -import com.pig4cloud.pig.admin.service.SysDeptRelationService; import com.pig4cloud.pig.admin.service.SysDeptService; -import com.pig4cloud.pig.common.security.util.SecurityUtils; -import lombok.RequiredArgsConstructor; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; import java.util.*; import java.util.stream.Collectors; @@ -41,26 +47,13 @@ import java.util.stream.Collectors; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-01-20 */ @Service -@RequiredArgsConstructor +@AllArgsConstructor public class SysDeptServiceImpl extends ServiceImpl implements SysDeptService { - private final SysDeptRelationService sysDeptRelationService; - - /** - * 添加信息部门 - * @param dept 部门 - * @return - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveDept(SysDept dept) { - this.save(dept); - sysDeptRelationService.saveDeptRelation(dept); - return Boolean.TRUE; - } + private final SysDeptMapper deptMapper; /** * 删除部门 @@ -71,85 +64,26 @@ public class SysDeptServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public Boolean removeDeptById(Long id) { // 级联删除部门 - List idList = sysDeptRelationService - .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, id)) - .stream() - .map(SysDeptRelation::getDescendant) - .collect(Collectors.toList()); + List idList = this.listDescendant(id).stream().map(SysDept::getDeptId).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(idList)) { - this.removeByIds(idList); - } + Optional.ofNullable(idList).filter(CollUtil::isNotEmpty).ifPresent(this::removeByIds); - // 删除部门级联关系 - sysDeptRelationService.removeDeptRelationById(id); return Boolean.TRUE; } - /** - * 更新部门 - * @param sysDept 部门信息 - * @return 成功、失败 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateDeptById(SysDept sysDept) { - // 更新部门状态 - this.updateById(sysDept); - // 更新部门关系 - SysDeptRelation relation = new SysDeptRelation(); - relation.setAncestor(sysDept.getParentId()); - relation.setDescendant(sysDept.getDeptId()); - sysDeptRelationService.updateDeptRelation(relation); - return Boolean.TRUE; - } - - @Override - public List listChildDeptId(Long deptId) { - List deptRelations = sysDeptRelationService.list(Wrappers.lambdaQuery() - .eq(SysDeptRelation::getAncestor, deptId) - .ne(SysDeptRelation::getDescendant, deptId)); - if (CollUtil.isNotEmpty(deptRelations)) { - return deptRelations.stream().map(SysDeptRelation::getDescendant).collect(Collectors.toList()); - } - return new ArrayList<>(); - } - /** * 查询全部部门树 - * @return 树 + * @param deptName + * @return 树 部门名称 */ @Override - public List> listDeptTrees() { - return getDeptTree(this.list(Wrappers.emptyWrapper()), 0L); - } + public List> selectTree(String deptName) { + // 查询全部部门 + List deptAllList = deptMapper + .selectList(Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName)); - /** - * 查询用户部门树 - * @return - */ - @Override - public List> listCurrentUserDeptTrees() { - Long deptId = SecurityUtils.getUser().getDeptId(); - List descendantIdList = sysDeptRelationService - .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, deptId)) - .stream() - .map(SysDeptRelation::getDescendant) - .collect(Collectors.toList()); - - List deptList = baseMapper.selectBatchIds(descendantIdList); - Optional dept = deptList.stream().filter(item -> item.getDeptId().intValue() == deptId).findFirst(); - return getDeptTree(deptList, dept.isPresent() ? dept.get().getParentId() : 0L); - } - - /** - * 构建部门树 - * @param depts 部门 - * @param parentId 父级id - * @return - */ - private List> getDeptTree(List depts, Long parentId) { - List> collect = depts.stream() + // 权限内部门 + List> collect = deptAllList.stream() .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) .sorted(Comparator.comparingInt(SysDept::getSortOrder)) .map(dept -> { @@ -158,15 +92,119 @@ public class SysDeptServiceImpl extends ServiceImpl impl treeNode.setParentId(dept.getParentId()); treeNode.setName(dept.getName()); treeNode.setWeight(dept.getSortOrder()); - // 扩展属性 - Map extra = new HashMap<>(2); + // 有权限不返回标识 + Map extra = new HashMap<>(8); extra.put("createTime", dept.getCreateTime()); treeNode.setExtra(extra); return treeNode; }) .collect(Collectors.toList()); - return TreeUtil.build(collect, parentId); + // 模糊查询 不组装树结构 直接返回 表格方便编辑 + if (StrUtil.isNotBlank(deptName)) { + return collect.stream().map(node -> { + Tree tree = new Tree<>(); + tree.putAll(node.getExtra()); + BeanUtils.copyProperties(node, tree); + return tree; + }).collect(Collectors.toList()); + } + + return TreeUtil.build(collect, 0L); + } + + /** + * 导出部门 + * @return + */ + @Override + public List listExcelVo() { + List list = this.list(); + List deptExcelVos = list.stream().map(item -> { + DeptExcelVo deptExcelVo = new DeptExcelVo(); + deptExcelVo.setName(item.getName()); + Optional first = this.list() + .stream() + .filter(it -> item.getParentId().equals(it.getDeptId())) + .map(SysDept::getName) + .findFirst(); + deptExcelVo.setParentName(first.orElse("根部门")); + deptExcelVo.setSortOrder(item.getSortOrder()); + return deptExcelVo; + }).collect(Collectors.toList()); + return deptExcelVos; + } + + @Override + public R importDept(List excelVOList, BindingResult bindingResult) { + List errorMessageList = (List) bindingResult.getTarget(); + + List deptList = this.list(); + for (DeptExcelVo item : excelVOList) { + Set errorMsg = new HashSet<>(); + boolean exsitUsername = deptList.stream().anyMatch(sysDept -> item.getName().equals(sysDept.getName())); + if (exsitUsername) { + errorMsg.add("部门名称已经存在"); + } + SysDept one = this.getOne(Wrappers.lambdaQuery().eq(SysDept::getName, item.getParentName())); + if (item.getParentName().equals("根部门")) { + one = new SysDept(); + one.setDeptId(0L); + } + if (one == null) { + errorMsg.add("上级部门不存在"); + } + if (CollUtil.isEmpty(errorMsg)) { + SysDept sysDept = new SysDept(); + sysDept.setName(item.getName()); + sysDept.setParentId(one.getDeptId()); + sysDept.setSortOrder(item.getSortOrder()); + baseMapper.insert(sysDept); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(null, "部门导入成功"); + } + + /** + * 查询所有子节点 (包含当前节点) + * @param deptId 部门ID 目标部门ID + * @return ID + */ + @Override + public List listDescendant(Long deptId) { + // 查询全部部门 + List allDeptList = baseMapper.selectList(Wrappers.emptyWrapper()); + + // 递归查询所有子节点 + List resDeptList = new ArrayList<>(); + recursiveDept(allDeptList, deptId, resDeptList); + + // 添加当前节点 + resDeptList.addAll(allDeptList.stream() + .filter(sysDept -> deptId.equals(sysDept.getDeptId())) + .collect(Collectors.toList())); + return resDeptList; + } + + /** + * 递归查询所有子节点。 + * @param allDeptList 所有部门列表 + * @param parentId 父部门ID + * @param resDeptList 结果集合 + */ + private void recursiveDept(List allDeptList, Long parentId, List resDeptList) { + // 使用 Stream API 进行筛选和遍历 + allDeptList.stream().filter(sysDept -> sysDept.getParentId().equals(parentId)).forEach(sysDept -> { + resDeptList.add(sysDept); + recursiveDept(allDeptList, sysDept.getDeptId(), resDeptList); + }); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java index b43e6dc6..b265c8cf 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.admin.service.impl; @@ -25,10 +26,10 @@ import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.enums.DictTypeEnum; import com.pig4cloud.pig.common.core.exception.ErrorCodes; import com.pig4cloud.pig.common.core.util.MsgUtils; -import lombok.RequiredArgsConstructor; +import com.pig4cloud.pig.common.core.util.R; +import lombok.AllArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; -import org.springframework.util.Assert; /** * 字典项 @@ -37,7 +38,7 @@ import org.springframework.util.Assert; * @date 2019/03/19 */ @Service -@RequiredArgsConstructor +@AllArgsConstructor public class SysDictItemServiceImpl extends ServiceImpl implements SysDictItemService { private final SysDictService dictService; @@ -49,14 +50,15 @@ public class SysDictItemServiceImpl extends ServiceImpl implements SysDictService { private final SysDictItemMapper dictItemMapper; /** * 根据ID 删除字典 - * @param id 字典ID + * @param ids 字典ID 列表 * @return */ @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public void removeDict(Long id) { - SysDict dict = this.getById(id); - // 系统内置 - Assert.state(!DictTypeEnum.SYSTEM.getType().equals(dict.getSystemFlag()), - MsgUtils.getMessage(ErrorCodes.SYS_DICT_DELETE_SYSTEM)); - baseMapper.deleteById(id); - dictItemMapper.delete(Wrappers.lambdaQuery().eq(SysDictItem::getDictId, id)); + public R removeDictByIds(Long[] ids) { + + List dictIdList = baseMapper.selectBatchIds(CollUtil.toList(ids)) + .stream() + .filter(sysDict -> !sysDict.getSystemFlag().equals(DictTypeEnum.SYSTEM.getType()))// 系统内置类型不删除 + .map(SysDict::getId) + .collect(Collectors.toList()); + + baseMapper.deleteBatchIds(dictIdList); + + dictItemMapper.delete(Wrappers.lambdaQuery().in(SysDictItem::getDictId, dictIdList)); + return R.ok(); } /** @@ -67,19 +77,25 @@ public class SysDictServiceImpl extends ServiceImpl impl * @return */ @Override - @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictKey") - public void updateDict(SysDict dict) { + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictType") + public R updateDict(SysDict dict) { SysDict sysDict = this.getById(dict.getId()); // 系统内置 - Assert.state(!DictTypeEnum.SYSTEM.getType().equals(sysDict.getSystemFlag()), - MsgUtils.getMessage(ErrorCodes.SYS_DICT_UPDATE_SYSTEM)); + if (DictTypeEnum.SYSTEM.getType().equals(sysDict.getSystemFlag())) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_DICT_UPDATE_SYSTEM)); + } this.updateById(dict); + return R.ok(dict); } + /** + * 同步缓存 (清空缓存) + * @return R + */ @Override @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public void clearDictCache() { - + public R syncDictCache() { + return R.ok(); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysFileServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysFileServiceImpl.java index 15973b1c..d9ccb48c 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysFileServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysFileServiceImpl.java @@ -26,8 +26,9 @@ import com.pig4cloud.pig.admin.api.entity.SysFile; import com.pig4cloud.pig.admin.mapper.SysFileMapper; import com.pig4cloud.pig.admin.service.SysFileService; import com.pig4cloud.pig.common.core.util.R; -import com.pig4cloud.plugin.oss.OssProperties; -import com.pig4cloud.plugin.oss.service.OssTemplate; +import com.pig4cloud.pig.common.file.core.FileProperties; +import com.pig4cloud.pig.common.file.core.FileTemplate; +import javax.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -35,11 +36,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; -import java.time.Duration; -import java.time.temporal.ChronoUnit; +import java.io.InputStream; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** * 文件管理 @@ -52,9 +52,9 @@ import java.util.Map; @AllArgsConstructor public class SysFileServiceImpl extends ServiceImpl implements SysFileService { - private final OssProperties ossProperties; + private final FileTemplate fileTemplate; - private final OssTemplate ossTemplate; + private final FileProperties properties; /** * 上传文件 @@ -65,13 +65,12 @@ public class SysFileServiceImpl extends ServiceImpl impl public R uploadFile(MultipartFile file) { String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename()); Map resultMap = new HashMap<>(4); - resultMap.put("bucketName", ossProperties.getBucketName()); + resultMap.put("bucketName", properties.getBucketName()); resultMap.put("fileName", fileName); - resultMap.put("url", String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName)); + resultMap.put("url", String.format("/admin/sys-file/%s/%s", properties.getBucketName(), fileName)); - try { - ossTemplate.putObject(ossProperties.getBucketName(), fileName, file.getContentType(), - file.getInputStream()); + try (InputStream inputStream = file.getInputStream()) { + fileTemplate.putObject(properties.getBucketName(), fileName, inputStream, file.getContentType()); // 文件管理数据记录,收集管理追踪文件 fileLog(file, fileName); } @@ -90,7 +89,7 @@ public class SysFileServiceImpl extends ServiceImpl impl */ @Override public void getFile(String bucket, String fileName, HttpServletResponse response) { - try (S3Object s3Object = ossTemplate.getObject(bucket, fileName)) { + try (S3Object s3Object = fileTemplate.getObject(bucket, fileName)) { response.setContentType("application/octet-stream; charset=UTF-8"); IoUtil.copy(s3Object.getObjectContent(), response.getOutputStream()); } @@ -109,7 +108,10 @@ public class SysFileServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public Boolean deleteFile(Long id) { SysFile file = this.getById(id); - ossTemplate.removeObject(ossProperties.getBucketName(), file.getFileName()); + if (Objects.isNull(file)) { + return Boolean.FALSE; + } + fileTemplate.removeObject(properties.getBucketName(), file.getFileName()); return this.removeById(id); } @@ -124,19 +126,8 @@ public class SysFileServiceImpl extends ServiceImpl impl sysFile.setOriginal(file.getOriginalFilename()); sysFile.setFileSize(file.getSize()); sysFile.setType(FileUtil.extName(file.getOriginalFilename())); - sysFile.setBucketName(ossProperties.getBucketName()); + sysFile.setBucketName(properties.getBucketName()); this.save(sysFile); } - /** - * 默认获取文件的在线地址 - * @param bucket - * @param fileName - * @return - */ - @Override - public String onlineFile(String bucket, String fileName) { - return ossTemplate.getObjectURL(bucket, fileName, Duration.of(7, ChronoUnit.DAYS)); - } - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index eb04d3f6..f956a0ae 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; @@ -27,8 +30,7 @@ import com.pig4cloud.pig.admin.api.entity.SysLog; import com.pig4cloud.pig.admin.mapper.SysLogMapper; import com.pig4cloud.pig.admin.service.SysLogService; import org.springframework.stereotype.Service; - -import java.util.List; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -36,42 +38,37 @@ import java.util.List; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-11-20 */ @Service public class SysLogServiceImpl extends ServiceImpl implements SysLogService { @Override public Page getLogByPage(Page page, SysLogDTO sysLog) { - return baseMapper.selectPage(page, buildQueryWrapper(sysLog)); - } - - /** - * 列表查询日志 - * @param sysLog 查询条件 - * @return List - */ - @Override - public List getLogList(SysLogDTO sysLog) { - return baseMapper.selectList(buildQueryWrapper(sysLog)); - } - /** - * 构建查询的 wrapper - * @param sysLog 查询条件 - * @return LambdaQueryWrapper - */ - private LambdaQueryWrapper buildQueryWrapper(SysLogDTO sysLog) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .eq(StrUtil.isNotBlank(sysLog.getType()), SysLog::getType, sysLog.getType()) - .like(StrUtil.isNotBlank(sysLog.getRemoteAddr()), SysLog::getRemoteAddr, sysLog.getRemoteAddr()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + if (StrUtil.isNotBlank(sysLog.getLogType())) { + wrapper.eq(SysLog::getLogType, sysLog.getLogType()); + } if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); } - return wrapper; + return baseMapper.selectPage(page, wrapper); + } + + /** + * 插入日志 + * @param sysLog 日志对象 + * @return true/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveLog(SysLog sysLog) { + baseMapper.insert(sysLog); + return Boolean.TRUE; } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java index 22663d06..37aa8629 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; @@ -20,6 +23,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -33,19 +37,22 @@ import com.pig4cloud.pig.common.core.constant.CommonConstants; import com.pig4cloud.pig.common.core.constant.enums.MenuTypeEnum; import com.pig4cloud.pig.common.core.exception.ErrorCodes; import com.pig4cloud.pig.common.core.util.MsgUtils; -import lombok.RequiredArgsConstructor; +import com.pig4cloud.pig.common.core.util.R; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; -import javax.validation.constraints.NotNull; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -57,34 +64,31 @@ import java.util.stream.Collectors; * @since 2017-10-29 */ @Service -@RequiredArgsConstructor +@AllArgsConstructor +@Slf4j public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { private final SysRoleMenuMapper sysRoleMenuMapper; @Override - @Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId + '_menu'", unless = "#result == null") - public Set findMenuByRoleId(Long roleId) { + @Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId", unless = "#result.isEmpty()") + public List findMenuByRoleId(Long roleId) { return baseMapper.listMenusByRoleId(roleId); } - /** - * 级联删除菜单 - * @param id 菜单ID - * @return true成功, false失败 - */ @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = CacheConstants.MENU_DETAILS, allEntries = true) - public Boolean removeMenuById(Long id) { + public R removeMenuById(Long id) { // 查询父节点为当前节点的节点 List menuList = this.list(Wrappers.query().lambda().eq(SysMenu::getParentId, id)); - - Assert.isTrue(CollUtil.isEmpty(menuList), MsgUtils.getMessage(ErrorCodes.SYS_MENU_DELETE_EXISTING)); + if (CollUtil.isNotEmpty(menuList)) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_MENU_DELETE_EXISTING)); + } sysRoleMenuMapper.delete(Wrappers.query().lambda().eq(SysRoleMenu::getMenuId, id)); // 删除当前菜单及其子菜单 - return this.removeById(id); + return R.ok(this.removeById(id)); } @Override @@ -95,57 +99,54 @@ public class SysMenuServiceImpl extends ServiceImpl impl /** * 构建树查询 1. 不是懒加载情况,查询全部 2. 是懒加载,根据parentId 查询 2.1 父节点为空,则查询ID -1 - * @param lazy 是否是懒加载 * @param parentId 父节点ID + * @param menuName 菜单名称 * @return */ @Override - public List> treeMenu(boolean lazy, Long parentId) { - if (!lazy) { - List> collect = baseMapper - .selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSortOrder)) - .stream() - .map(getNodeFunction()) - .collect(Collectors.toList()); - - return TreeUtil.build(collect, CommonConstants.MENU_TREE_ROOT_ID); - } - + public List> treeMenu(Long parentId, String menuName, String type) { Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; List> collect = baseMapper - .selectList( - Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent).orderByAsc(SysMenu::getSortOrder)) + .selectList(Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(menuName), SysMenu::getName, menuName) + .eq(StrUtil.isNotBlank(type), SysMenu::getMenuType, type) + .orderByAsc(SysMenu::getSortOrder)) .stream() .map(getNodeFunction()) .collect(Collectors.toList()); + // 模糊查询 不组装树结构 直接返回 表格方便编辑 + if (StrUtil.isNotBlank(menuName)) { + return collect.stream().map(node -> { + Tree tree = new Tree<>(); + tree.putAll(node.getExtra()); + BeanUtils.copyProperties(node, tree); + return tree; + }).collect(Collectors.toList()); + } + return TreeUtil.build(collect, parent); } /** * 查询菜单 * @param all 全部菜单 + * @param type 类型 * @param parentId 父节点ID * @return */ @Override - public List> filterMenu(Set all, Long parentId) { + public List> filterMenu(Set all, String type, Long parentId) { List> collect = all.stream() - .filter(menu -> MenuTypeEnum.LEFT_MENU.getType().equals(menu.getType())) - .filter(menu -> StrUtil.isNotBlank(menu.getPath())) + .filter(menuTypePredicate(type)) .map(getNodeFunction()) .collect(Collectors.toList()); + Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; return TreeUtil.build(collect, parent); } - @Override - @CacheEvict(value = CacheConstants.MENU_DETAILS, allEntries = true) - public void clearMenuCache() { - - } - @NotNull private Function> getNodeFunction() { return menu -> { @@ -156,16 +157,42 @@ public class SysMenuServiceImpl extends ServiceImpl impl node.setWeight(menu.getSortOrder()); // 扩展属性 Map extra = new HashMap<>(); - extra.put("icon", menu.getIcon()); extra.put("path", menu.getPath()); - extra.put("type", menu.getType()); + extra.put("menuType", menu.getMenuType()); extra.put("permission", menu.getPermission()); - extra.put("label", menu.getName()); extra.put("sortOrder", menu.getSortOrder()); - extra.put("keepAlive", menu.getKeepAlive()); + + // 适配 vue3 + Map meta = new HashMap<>(); + meta.put("title", menu.getName()); + meta.put("isLink", menu.getPath() != null && menu.getPath().startsWith("http") ? menu.getPath() : ""); + meta.put("isHide", !BooleanUtil.toBooleanObject(menu.getVisible())); + meta.put("isKeepAlive", BooleanUtil.toBooleanObject(menu.getKeepAlive())); + meta.put("isAffix", false); + meta.put("isIframe", BooleanUtil.toBooleanObject(menu.getEmbedded())); + meta.put("icon", menu.getIcon()); + // 增加英文 + meta.put("enName", menu.getEnName()); + + extra.put("meta", meta); node.setExtra(extra); return node; }; } + /** + * menu 类型断言 + * @param type 类型 + * @return Predicate + */ + private Predicate menuTypePredicate(String type) { + return vo -> { + if (MenuTypeEnum.TOP_MENU.getDescription().equals(type)) { + return MenuTypeEnum.TOP_MENU.getType().equals(vo.getMenuType()); + } + // 其他查询 左侧 + 顶部 + return !MenuTypeEnum.BUTTON.getType().equals(vo.getMenuType()); + }; + } + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java similarity index 64% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java index a68246b5..14876597 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java @@ -17,24 +17,23 @@ package com.pig4cloud.pig.admin.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.pig4cloud.pig.admin.api.dto.AppSmsDTO; import com.pig4cloud.pig.admin.api.entity.SysUser; import com.pig4cloud.pig.admin.mapper.SysUserMapper; -import com.pig4cloud.pig.admin.service.AppService; +import com.pig4cloud.pig.admin.service.SysMobileService; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.exception.ErrorCodes; import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; -import io.springboot.sms.core.SmsClient; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; -import java.util.Objects; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -46,58 +45,39 @@ import java.util.concurrent.TimeUnit; @Slf4j @Service @AllArgsConstructor -public class AppServiceImpl implements AppService { +public class SysMobileServiceImpl implements SysMobileService { private final RedisTemplate redisTemplate; private final SysUserMapper userMapper; - private final SmsClient smsClient; - /** * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端 - * @param sms 手机号 + * @param mobile mobile * @return code */ @Override - public R sendSmsCode(AppSmsDTO sms) { - Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + sms.getPhone()); + public R sendSmsCode(String mobile) { + List userList = userMapper + .selectList(Wrappers.query().lambda().eq(SysUser::getPhone, mobile)); - if (codeObj != null) { - log.info("手机号验证码未过期:{},{}", sms.getPhone(), codeObj); - return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_OFTEN)); + if (CollUtil.isEmpty(userList)) { + log.info("手机号未注册:{}", mobile); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, mobile)); } - // 校验手机号是否存在 sys_user 表 - if (sms.getExist() - && !userMapper.exists(Wrappers.lambdaQuery().eq(SysUser::getPhone, sms.getPhone()))) { - return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, sms.getPhone())); + Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + mobile); + + if (codeObj != null) { + log.info("手机号验证码未过期:{},{}", mobile, codeObj); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_OFTEN)); } String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); - log.info("手机号生成验证码成功:{},{}", sms.getPhone(), code); + log.debug("手机号生成验证码成功:{},{}", mobile, code); redisTemplate.opsForValue() - .set(CacheConstants.DEFAULT_CODE_KEY + sms.getPhone(), code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); - - // 调用短信通道发送 - this.smsClient.sendCode(code, sms.getPhone()); + .set(CacheConstants.DEFAULT_CODE_KEY + mobile, code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); return R.ok(Boolean.TRUE, code); } - /** - * 校验验证码 - * @param phone 手机号 - * @param code 验证码 - * @return - */ - @Override - public boolean check(String phone, String code) { - Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + phone); - - if (Objects.isNull(codeObj)) { - return false; - } - return codeObj.equals(code); - } - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysOauthClientDetailsServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysOauthClientDetailsServiceImpl.java index 60dbdb81..2e267c7a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysOauthClientDetailsServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysOauthClientDetailsServiceImpl.java @@ -1,28 +1,36 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.admin.api.entity.SysOauthClientDetails; import com.pig4cloud.pig.admin.mapper.SysOauthClientDetailsMapper; import com.pig4cloud.pig.admin.service.SysOauthClientDetailsService; import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.util.R; +import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -30,41 +38,64 @@ import org.springframework.stereotype.Service; *

* * @author lengleng - * @since 2019/2/1 + * @since 2018-05-15 */ @Service +@RequiredArgsConstructor public class SysOauthClientDetailsServiceImpl extends ServiceImpl implements SysOauthClientDetailsService { /** - * 通过ID删除客户端 - * @param id + * 根据客户端信息 + * @param clientDetails * @return */ @Override - @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#id") - public Boolean removeClientDetailsById(String id) { - return this.removeById(id); + @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientDetails.clientId") + @Transactional(rollbackFor = Exception.class) + public Boolean updateClientById(SysOauthClientDetails clientDetails) { + this.insertOrUpdate(clientDetails); + return Boolean.TRUE; } /** - * 根据客户端信息 + * 添加客户端 * @param clientDetails * @return */ @Override - @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientDetails.clientId") - public Boolean updateClientDetailsById(SysOauthClientDetails clientDetails) { - return this.updateById(clientDetails); + @Transactional(rollbackFor = Exception.class) + public Boolean saveClient(SysOauthClientDetails clientDetails) { + this.insertOrUpdate(clientDetails); + return Boolean.TRUE; } /** - * 清除客户端缓存 + * 插入或更新客户端对象 + * @param clientDetails + * @return + */ + private SysOauthClientDetails insertOrUpdate(SysOauthClientDetails clientDetails) { + // 更新数据库 + saveOrUpdate(clientDetails); + return clientDetails; + } + + /** + * 分页查询客户端信息 + * @param page + * @param query + * @return */ @Override - @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, allEntries = true) - public void clearClientCache() { + public Page queryPage(Page page, SysOauthClientDetails query) { + return baseMapper.selectPage(page, Wrappers.query(query)); + } + @Override + @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, allEntries = true) + public R syncClientCache() { + return R.ok(); } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java index 925996a2..e9c26076 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java @@ -37,10 +37,10 @@ import java.util.Set; import java.util.stream.Collectors; /** - * 岗位管理表 服务实现类 + * 岗位信息表 * - * @author pig code generator - * @date 2022-03-15 17:18:40 + * @author fxz + * @date 2022-03-26 12:50:43 */ @Service public class SysPostServiceImpl extends ServiceImpl implements SysPostService { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java index 677065fd..2fff4c42 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java @@ -17,6 +17,7 @@ package com.pig4cloud.pig.admin.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.admin.api.entity.SysPublicParam; @@ -32,6 +33,9 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.stream.Collectors; + /** * 公共参数配置 * @@ -73,18 +77,18 @@ public class SysPublicParamServiceImpl extends ServiceImpl idList = this.baseMapper.selectBatchIds(CollUtil.toList(publicIds)) + .stream() + .filter(p -> !p.getSystemFlag().equals(DictTypeEnum.SYSTEM.getType()))// 系统内置的跳过不能删除 + .map(SysPublicParam::getPublicId) + .collect(Collectors.toList()); + return R.ok(this.removeBatchByIds(idList)); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleMenuServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleMenuServiceImpl.java index f57049a7..afdd1016 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleMenuServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleMenuServiceImpl.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; @@ -23,14 +26,14 @@ import com.pig4cloud.pig.admin.api.entity.SysRoleMenu; import com.pig4cloud.pig.admin.mapper.SysRoleMenuMapper; import com.pig4cloud.pig.admin.service.SysRoleMenuService; import com.pig4cloud.pig.common.core.constant.CacheConstants; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; /** @@ -39,10 +42,10 @@ import java.util.stream.Collectors; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Service -@RequiredArgsConstructor +@AllArgsConstructor public class SysRoleMenuServiceImpl extends ServiceImpl implements SysRoleMenuService { private final CacheManager cacheManager; @@ -54,6 +57,7 @@ public class SysRoleMenuServiceImpl extends ServiceImplquery().lambda().eq(SysRoleMenu::getRoleId, roleId)); @@ -68,10 +72,9 @@ public class SysRoleMenuServiceImpl extends ServiceImpl * * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Service -@RequiredArgsConstructor +@AllArgsConstructor public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { - private final SysRoleMenuMapper sysRoleMenuMapper; + private SysRoleMenuService roleMenuService; + + /** + * 通过用户ID,查询角色信息 + * @param userId + * @return + */ + @Override + public List findRolesByUserId(Long userId) { + return baseMapper.listRolesByUserId(userId); + } + + /** + * 根据角色ID 查询角色列表,注意缓存删除 + * @param roleIdList 角色ID列表 + * @param key 缓存key + * @return + */ + @Override + @Cacheable(value = CacheConstants.ROLE_DETAILS, key = "#key", unless = "#result.isEmpty()") + public List findRolesByRoleIds(List roleIdList, String key) { + return baseMapper.selectBatchIds(roleIdList); + } /** * 通过角色ID,删除角色,并清空角色菜单缓存 - * @param id + * @param ids * @return */ @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = CacheConstants.MENU_DETAILS, allEntries = true) - public Boolean removeRoleById(Long id) { - sysRoleMenuMapper.delete(Wrappers.update().lambda().eq(SysRoleMenu::getRoleId, id)); - return this.removeById(id); + public Boolean removeRoleByIds(Long[] ids) { + roleMenuService + .remove(Wrappers.update().lambda().in(SysRoleMenu::getRoleId, CollUtil.toList(ids))); + return this.removeBatchByIds(CollUtil.toList(ids)); + } + + /** + * 根据角色菜单列表 + * @param roleVo 角色&菜单列表 + * @return + */ + @Override + public Boolean updateRoleMenus(RoleVO roleVo) { + return roleMenuService.saveRoleMenus(roleVo.getRoleId(), roleVo.getMenuIds()); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserRoleServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserRoleServiceImpl.java index 4fb064d0..820d420b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserRoleServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserRoleServiceImpl.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; @@ -28,7 +31,7 @@ import org.springframework.stereotype.Service; *

* * @author lengleng - * @since 2019/2/1 + * @since 2017-10-29 */ @Service public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index 136739bd..ba0d1097 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -1,17 +1,20 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package com.pig4cloud.pig.admin.service.impl; @@ -19,6 +22,7 @@ package com.pig4cloud.pig.admin.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -29,26 +33,27 @@ import com.pig4cloud.pig.admin.api.entity.*; import com.pig4cloud.pig.admin.api.util.ParamResolver; import com.pig4cloud.pig.admin.api.vo.UserExcelVO; import com.pig4cloud.pig.admin.api.vo.UserVO; -import com.pig4cloud.pig.admin.mapper.*; -import com.pig4cloud.pig.admin.service.AppService; -import com.pig4cloud.pig.admin.service.SysMenuService; -import com.pig4cloud.pig.admin.service.SysUserService; +import com.pig4cloud.pig.admin.mapper.SysUserMapper; +import com.pig4cloud.pig.admin.mapper.SysUserPostMapper; +import com.pig4cloud.pig.admin.mapper.SysUserRoleMapper; +import com.pig4cloud.pig.admin.service.*; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.CommonConstants; -import com.pig4cloud.pig.common.core.constant.enums.MenuTypeEnum; import com.pig4cloud.pig.common.core.exception.ErrorCodes; import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.security.util.SecurityUtils; import com.pig4cloud.plugin.excel.vo.ErrorMessage; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.validation.BindingResult; import java.time.LocalDateTime; @@ -57,29 +62,29 @@ import java.util.stream.Collectors; /** * @author lengleng - * @date 2019/2/1 + * @date 2017/10/31 */ @Slf4j @Service -@RequiredArgsConstructor +@AllArgsConstructor public class SysUserServiceImpl extends ServiceImpl implements SysUserService { private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); - private final AppService appService; - - private final SysRoleMapper sysRoleMapper; + private final SysMenuService sysMenuService; - private final SysDeptMapper sysDeptMapper; + private final SysRoleService sysRoleService; - private final SysMenuService sysMenuService; + private final SysPostService sysPostService; - private final SysPostMapper sysPostMapper; + private final SysDeptService sysDeptService; private final SysUserRoleMapper sysUserRoleMapper; private final SysUserPostMapper sysUserPostMapper; + private final CacheManager cacheManager; + /** * 保存用户信息 * @param userDto DTO 对象 @@ -91,14 +96,9 @@ public class SysUserServiceImpl extends ServiceImpl impl SysUser sysUser = new SysUser(); BeanUtils.copyProperties(userDto, sysUser); sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); + sysUser.setCreateBy(userDto.getUsername()); sysUser.setPassword(ENCODER.encode(userDto.getPassword())); baseMapper.insert(sysUser); - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(sysUserRoleMapper::insert); // 保存用户岗位信息 Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { posts.stream().map(postId -> { @@ -108,6 +108,24 @@ public class SysUserServiceImpl extends ServiceImpl impl return userPost; }).forEach(sysUserPostMapper::insert); }); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService + .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); return Boolean.TRUE; } @@ -117,28 +135,27 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return */ @Override - public UserInfo getUserInfo(SysUser sysUser) { + public UserInfo findUserInfo(SysUser sysUser) { UserInfo userInfo = new UserInfo(); userInfo.setSysUser(sysUser); - // 设置角色列表 - List roleList = sysRoleMapper.listRolesByUserId(sysUser.getUserId()); - userInfo.setRoleList(roleList); // 设置角色列表 (ID) - List roleIds = roleList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) + .stream() + .map(SysRole::getRoleId) + .collect(Collectors.toList()); userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); - // 设置岗位列表 - List postList = sysPostMapper.listPostsByUserId(sysUser.getUserId()); - userInfo.setPostList(postList); + // 设置权限列表(menu.permission) - Set permissions = roleIds.stream() - .map(sysMenuService::findMenuByRoleId) - .flatMap(Collection::stream) - .filter(m -> MenuTypeEnum.BUTTON.getType().equals(m.getType())) - .map(SysMenu::getPermission) - .filter(StrUtil::isNotBlank) - .collect(Collectors.toSet()); + Set permissions = new HashSet<>(); + roleIds.forEach(roleId -> { + List permissionList = sysMenuService.findMenuByRoleId(roleId) + .stream() + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) + .map(SysMenu::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); - return userInfo; } @@ -149,7 +166,7 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return */ @Override - public IPage getUserWithRolePage(Page page, UserDTO userDTO) { + public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { return baseMapper.getUserVosPage(page, userDTO); } @@ -159,22 +176,27 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return 用户信息 */ @Override - public UserVO getUserVoById(Long id) { + public UserVO selectUserVoById(Long id) { return baseMapper.getUserVoById(id); } /** * 删除用户 - * @param sysUser 用户 + * @param ids 用户ID 列表 * @return Boolean */ @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#sysUser.username") - public Boolean removeUserById(SysUser sysUser) { - sysUserRoleMapper.deleteByUserId(sysUser.getUserId()); - // 删除用户职位关系 - sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, sysUser.getUserId())); - this.removeById(sysUser.getUserId()); + @Transactional(rollbackFor = Exception.class) + public Boolean deleteUserByIds(Long[] ids) { + // 删除 spring cache + List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + for (SysUser sysUser : userList) { + cache.evict(sysUser.getUsername()); + } + + sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); + this.removeBatchByIds(CollUtil.toList(ids)); return Boolean.TRUE; } @@ -183,73 +205,47 @@ public class SysUserServiceImpl extends ServiceImpl impl public R updateUserInfo(UserDTO userDto) { UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername()); - // 判断手机号是否修改,更新手机号校验验证码 - if (!StrUtil.equals(userVO.getPhone(), userDto.getPhone())) { - if (!appService.check(userDto.getPhone(), userDto.getCode())) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_ERROR)); - } - } - - // 修改密码逻辑 SysUser sysUser = new SysUser(); - if (StrUtil.isNotBlank(userDto.getNewpassword1())) { - Assert.isTrue(ENCODER.matches(userDto.getPassword(), userVO.getPassword()), - MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); - sysUser.setPassword(ENCODER.encode(userDto.getNewpassword1())); - } sysUser.setPhone(userDto.getPhone()); sysUser.setUserId(userVO.getUserId()); sysUser.setAvatar(userDto.getAvatar()); + sysUser.setNickname(userDto.getNickname()); + sysUser.setName(userDto.getName()); + sysUser.setEmail(userDto.getEmail()); return R.ok(this.updateById(sysUser)); } @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R updateUser(UserDTO userDto) { + public Boolean updateUser(UserDTO userDto) { + // 更新用户表信息 SysUser sysUser = new SysUser(); BeanUtils.copyProperties(userDto, sysUser); sysUser.setUpdateTime(LocalDateTime.now()); - if (StrUtil.isNotBlank(userDto.getPassword())) { sysUser.setPassword(ENCODER.encode(userDto.getPassword())); } this.updateById(sysUser); - sysUserRoleMapper - .delete(Wrappers.update().lambda().eq(SysUserRole::getUserId, userDto.getUserId())); - userDto.getRole().forEach(roleId -> { + // 更新用户角色表 + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); + userDto.getRole().stream().map(roleId -> { SysUserRole userRole = new SysUserRole(); userRole.setUserId(sysUser.getUserId()); userRole.setRoleId(roleId); - userRole.insert(); - }); + return userRole; + }).forEach(SysUserRole::insert); + + // 更新用户岗位表 sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); - userDto.getPost().forEach(postId -> { + userDto.getPost().stream().map(postId -> { SysUserPost userPost = new SysUserPost(); userPost.setUserId(sysUser.getUserId()); userPost.setPostId(postId); - userPost.insert(); - }); - return R.ok(); - } - - /** - * 查询上级部门的用户信息 - * @param username 用户名 - * @return R - */ - @Override - public List listAncestorUsersByUsername(String username) { - SysUser sysUser = this.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); - - SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId()); - if (sysDept == null) { - return null; - } - - Long parentId = sysDept.getParentId(); - return this.list(Wrappers.query().lambda().eq(SysUser::getDeptId, parentId)); + return userPost; + }).forEach(SysUserPost::insert); + return Boolean.TRUE; } /** @@ -259,6 +255,7 @@ public class SysUserServiceImpl extends ServiceImpl impl */ @Override public List listUser(UserDTO userDTO) { + // 根据数据权限查询全部的用户信息 List voList = baseMapper.selectVoList(userDTO); // 转换成execl 对象输出 List userExcelVOList = voList.stream().map(userVO -> { @@ -289,21 +286,21 @@ public class SysUserServiceImpl extends ServiceImpl impl public R importUser(List excelVOList, BindingResult bindingResult) { // 通用校验获取失败的数据 List errorMessageList = (List) bindingResult.getTarget(); - - // 个性化校验逻辑 - List userList = this.list(); - List deptList = sysDeptMapper.selectList(Wrappers.emptyWrapper()); - List roleList = sysRoleMapper.selectList(Wrappers.emptyWrapper()); - List postList = sysPostMapper.selectList(Wrappers.emptyWrapper()); + List deptList = sysDeptService.list(); + List roleList = sysRoleService.list(); + List postList = sysPostService.list(); // 执行数据插入操作 组装 UserDto for (UserExcelVO excel : excelVOList) { + // 个性化校验逻辑 + List userList = this.list(); + Set errorMsg = new HashSet<>(); // 校验用户名是否存在 - boolean existUserName = userList.stream() + boolean exsitUserName = userList.stream() .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); - if (existUserName) { + if (exsitUserName) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); } @@ -325,7 +322,7 @@ public class SysUserServiceImpl extends ServiceImpl impl errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); } - // 判断输入的岗位名称列表是否合法 + // 判断输入的部门名称列表是否合法 List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); List postCollList = postList.stream() .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) @@ -352,13 +349,6 @@ public class SysUserServiceImpl extends ServiceImpl impl return R.ok(); } - @Override - public List listUserIdByDeptIds(Set deptIds) { - return this.listObjs( - Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId).in(SysUser::getDeptId, deptIds), - Long.class::cast); - } - /** * 插入excel User */ @@ -367,15 +357,19 @@ public class SysUserServiceImpl extends ServiceImpl impl UserDTO userDTO = new UserDTO(); userDTO.setUsername(excel.getUsername()); userDTO.setPhone(excel.getPhone()); + userDTO.setNickname(excel.getNickname()); + userDTO.setName(excel.getName()); + userDTO.setEmail(excel.getEmail()); // 批量导入初始密码为手机号 userDTO.setPassword(userDTO.getPhone()); // 根据部门名称查询部门ID userDTO.setDeptId(deptOptional.get().getDeptId()); + // 插入岗位名称 + List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); + userDTO.setPost(postIdList); // 根据角色名称查询角色ID List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); userDTO.setRole(roleIdList); - List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); - userDTO.setPost(postIdList); // 插入用户 this.saveUser(userDTO); } @@ -386,30 +380,76 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return success/false */ @Override + @Transactional(rollbackFor = Exception.class) public R registerUser(UserDTO userDto) { - // 校验验证码 - if (!appService.check(userDto.getPhone(), userDto.getCode())) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_ERROR)); - } - // 判断用户名是否存在 SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); if (sysUser != null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername())); + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); } + return R.ok(saveUser(userDto)); + } - // 获取默认角色编码 - String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - // 默认角色 - SysRole sysRole = sysRoleMapper - .selectOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + /** + * 锁定用户 + * @param username 用户名 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") + public R lockUser(String username) { + SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - if (sysRole == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_PARAM_CONFIG_ERROR, "USER_DEFAULT_ROLE")); + if (Objects.nonNull(sysUser)) { + sysUser.setLockFlag(CommonConstants.STATUS_LOCK); + baseMapper.updateById(sysUser); } + return R.ok(); + } - userDto.setRole(Collections.singletonList(sysRole.getRoleId())); - return R.ok(saveUser(userDto)); + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R changePassword(UserDTO userDto) { + UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername()); + if (Objects.isNull(userVO)) { + return R.failed("用户不存在"); + } + + if (StrUtil.isEmpty(userDto.getPassword())) { + return R.failed("原密码不能为空"); + } + + if (!ENCODER.matches(userDto.getPassword(), userVO.getPassword())) { + log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); + } + + if (StrUtil.isEmpty(userDto.getNewpassword1())) { + return R.failed("新密码不能为空"); + } + String password = ENCODER.encode(userDto.getNewpassword1()); + + this.update(Wrappers.lambdaUpdate() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, userVO.getUserId())); + return R.ok(); + } + + @Override + public R checkPassword(String password) { + String username = SecurityUtils.getUser().getUsername(); + SysUser condition = new SysUser(); + condition.setUsername(username); + SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); + + if (!ENCODER.matches(password, sysUser.getPassword())) { + log.info("原密码错误"); + return R.failed("密码输入错误"); + } + else { + return R.ok(); + } } } diff --git a/pig-upms/pig-upms-biz/src/main/resources/file/approle.xlsx b/pig-upms/pig-upms-biz/src/main/resources/file/approle.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0c986e8bdee6e584a5648f86436797751f807516 GIT binary patch literal 8834 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 literal 0 HcmV?d00001 diff --git a/pig-upms/pig-upms-biz/src/main/resources/file/dept.xlsx b/pig-upms/pig-upms-biz/src/main/resources/file/dept.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..69439e53fa2a391340e7025f3114c1d9037e4420 GIT binary patch literal 10037 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 literal 0 HcmV?d00001 diff --git a/pig-upms/pig-upms-biz/src/main/resources/file/user.xlsx b/pig-upms/pig-upms-biz/src/main/resources/file/user.xlsx index b67ee8ff3ff2aa22adfc88ec488624edf240ec0c..bb557ba597388091dc88d146ce3385f819b936df 100644 GIT binary patch delta 6881 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 KwT$|o$bSLpTc7>_ diff --git a/pig-upms/pig-upms-biz/src/main/resources/logback-spring.xml b/pig-upms/pig-upms-biz/src/main/resources/logback-spring.xml old mode 100755 new mode 100644 index 58a4eacd..c0ce9c5b --- a/pig-upms/pig-upms-biz/src/main/resources/logback-spring.xml +++ b/pig-upms/pig-upms-biz/src/main/resources/logback-spring.xml @@ -1,77 +1,68 @@ - + 小技巧: 在根pom里面设置统一存放路径,统一管理方便维护 + + /Users/lengleng + + 1. 其他模块加日志输出,直接copy本文件放在resources 目录即可 + 2. 注意修改 的value模块 +--> - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - - + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + - - - ${log.path}/debug.log - - ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + ${CONSOLE_LOG_PATTERN} + + - - - ${log.path}/error.log - - ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - ERROR - - + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + ${CONSOLE_LOG_PATTERN} + + + ERROR + + - - - - + + + + - - - - - - + + + + + + diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptMapper.xml index 69fd6f98..25dcf129 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptMapper.xml +++ b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptMapper.xml @@ -1,48 +1,23 @@ - - - - - - - - - - - - - - - diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptRelationMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptRelationMapper.xml deleted file mode 100644 index 5f5ddcb9..00000000 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysDeptRelationMapper.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - DELETE - FROM sys_dept_relation - WHERE descendant IN (SELECT temp.descendant - FROM (SELECT descendant FROM sys_dept_relation WHERE ancestor = #{descendant}) temp) - AND ancestor IN (SELECT temp.ancestor - FROM (SELECT ancestor - FROM sys_dept_relation - WHERE descendant = #{descendant} - AND ancestor != descendant) temp) - - - - - DELETE - FROM sys_dept_relation - WHERE descendant IN ( - SELECT temp.descendant - FROM ( - SELECT descendant - FROM sys_dept_relation - WHERE ancestor = #{id} - ) temp - ) - - - - - INSERT INTO sys_dept_relation (ancestor, descendant) - SELECT a.ancestor, b.descendant - FROM sys_dept_relation a - CROSS JOIN sys_dept_relation b - WHERE a.descendant = #{ancestor} - AND b.ancestor = #{descendant} - - diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysMenuMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysMenuMapper.xml index 202a6ede..57198f75 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysMenuMapper.xml +++ b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysMenuMapper.xml @@ -1,18 +1,21 @@ @@ -21,40 +24,53 @@ + - + - + - + + + + + diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysPostMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysPostMapper.xml index bbcb22fc..eaf29278 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysPostMapper.xml +++ b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysPostMapper.xml @@ -1,5 +1,4 @@ - @@ -26,27 +29,21 @@ - - - - diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml index ef261cbc..2b3ed9f7 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -1,179 +1,203 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + u.user_id, + u.username, + u.password, + u.salt, + u.phone, + u.avatar, + u.wx_openid, + u.qq_openid, + u.dept_id, + u.del_flag, + u.lock_flag, + u.tenant_id, + u.create_by, + u.create_time ucreate_time, + u.update_time uupdate_time, + r.role_id, + r.role_name, + r.role_code, + r.role_desc, + r.create_time rcreate_time, + r.update_time rupdate_time + - - - - - - - - - - - - - - - - - - - - - - - + + u.user_id, + u.username, + u.password, + u.salt, + u.phone, + u.avatar, + u.wx_openid, + u.qq_openid, + u.gitee_login, + u.osc_id, + u.del_flag, + u.lock_flag, + u.tenant_id, + u.nickname, + u.name, + u.email, + u.create_by, + u.create_time ucreate_time, + u.update_time uupdate_time, + d.name dept_name, + d.dept_id + - - sys_user.user_id, - sys_user.username, - sys_user.`password`, - sys_user.salt, - sys_user.phone, - sys_user.avatar, - sys_user.dept_id, - sys_user.create_time AS ucreate_time, - sys_user.update_time AS uupdate_time, - sys_user.del_flag AS udel_flag, - sys_user.lock_flag AS lock_flag, - sys_user.dept_id AS deptId, - r.role_id, - r.role_name, - r.role_code, - r.role_desc, - r.create_time AS rcreate_time, - r.update_time AS rupdate_time - + - - sys_user.user_id, - sys_user.username, - sys_user.`password`, - sys_user.salt, - sys_user.phone, - sys_user.avatar, - sys_user.create_time AS ucreate_time, - sys_user.update_time AS uupdate_time, - sys_user.del_flag AS udel_flag, - sys_user.lock_flag AS lock_flag, - r.role_id, - r.role_name, - r.role_code, - r.role_desc, - r.create_time AS rcreate_time, - r.update_time AS rupdate_time, - d.name AS deptName, - d.dept_id AS deptId - + - + - SELECT - - FROM sys_user AS sys_user - LEFT JOIN sys_user_role AS ur ON ur.user_id = sys_user.user_id - LEFT JOIN sys_role AS r ON r.role_id = ur.role_id - LEFT JOIN sys_dept AS d ON d.dept_id = sys_user.dept_id - WHERE sys_user.user_id = #{id} - + + ORDER BY u.create_time DESC + + - + - SELECT u.user_id, - u.username, - u.password, - u.salt, - u.phone, - u.avatar, - u.dept_id, - u.create_time ucreate_time, - u.update_time uupdate_time, - u.del_flag, - u.lock_flag, - d.name AS deptName - FROM sys_user u - LEFT JOIN sys_dept d ON d.dept_id = u.dept_id - - u.del_flag = '0' - - - AND u.username LIKE #{usernameLike} - - - AND u.dept_id = #{query.deptId} - - - ORDER BY u.create_time DESC - + + ORDER BY u.create_time DESC + + diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserRoleMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserRoleMapper.xml deleted file mode 100644 index de2a62a7..00000000 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserRoleMapper.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - DELETE FROM sys_user_role WHERE user_id = #{userId} - - - diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index 629b8138..3d2c7258 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.7 + 3.7.0-JDK8 pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index 6c5ebb1e..43d7e552 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.6.7 + 3.7.0-JDK8 pig-codegen @@ -65,6 +65,10 @@ mysql-connector-j + + cn.hutool + hutool-json + com.pig4cloud pig-common-core @@ -95,6 +99,12 @@ velocity-tools-generic ${velocity.tool.version} + + + io.springboot.plugin + screw-spring-boot-starter + ${screw.version} + org.springframework.boot diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java index 53135fe4..9fb7b06e 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen; @@ -19,21 +20,19 @@ package com.pig4cloud.pig.codegen; import com.pig4cloud.pig.common.datasource.annotation.EnableDynamicDataSource; import com.pig4cloud.pig.common.feign.annotation.EnablePigFeignClients; import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; -import com.pig4cloud.pig.common.swagger.annotation.EnablePigDoc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author lengleng - * @date 2020/03/11 代码生成模块 + * @date 2018/07/29 代码生成模块 */ -@EnablePigDoc @EnableDynamicDataSource @EnablePigFeignClients @EnableDiscoveryClient -@SpringBootApplication @EnablePigResourceServer +@SpringBootApplication public class PigCodeGenApplication { public static void main(String[] args) { diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java index 60bd7ae9..ec22c8ed 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java @@ -1,34 +1,42 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.ContentType; +import cn.smallbun.screw.boot.config.Screw; +import cn.smallbun.screw.boot.properties.ScrewProperties; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.codegen.entity.GenDatasourceConf; import com.pig4cloud.pig.codegen.service.GenDatasourceConfService; import com.pig4cloud.pig.common.core.util.R; -import com.pig4cloud.pig.common.log.annotation.SysLog; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.security.annotation.Inner; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; -import java.util.List; +import javax.servlet.http.HttpServletResponse; +import javax.sql.DataSource; /** * 数据源管理 @@ -39,12 +47,12 @@ import java.util.List; @RestController @RequiredArgsConstructor @RequestMapping("/dsconf") -@Tag(name = "数据源管理模块") -@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class GenDsConfController { private final GenDatasourceConfService datasourceConfService; + private final Screw screw; + /** * 分页查询 * @param page 分页对象 @@ -52,8 +60,11 @@ public class GenDsConfController { * @return */ @GetMapping("/page") - public R> getSysDatasourceConfPage(Page page, GenDatasourceConf datasourceConf) { - return R.ok(datasourceConfService.page(page, Wrappers.query(datasourceConf))); + public R getSysDatasourceConfPage(Page page, GenDatasourceConf datasourceConf) { + return R.ok(datasourceConfService.page(page, + Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(datasourceConf.getDsName()), GenDatasourceConf::getDsName, + datasourceConf.getDsName()))); } /** @@ -61,7 +72,8 @@ public class GenDsConfController { * @return */ @GetMapping("/list") - public R> list() { + @Inner(value = false) + public R list() { return R.ok(datasourceConfService.list()); } @@ -71,7 +83,7 @@ public class GenDsConfController { * @return R */ @GetMapping("/{id}") - public R getById(@PathVariable("id") Long id) { + public R getById(@PathVariable("id") Long id) { return R.ok(datasourceConfService.getById(id)); } @@ -80,9 +92,8 @@ public class GenDsConfController { * @param datasourceConf 数据源表 * @return R */ - @SysLog("新增数据源表") @PostMapping - public R save(@RequestBody GenDatasourceConf datasourceConf) { + public R save(@RequestBody GenDatasourceConf datasourceConf) { return R.ok(datasourceConfService.saveDsByEnc(datasourceConf)); } @@ -91,21 +102,42 @@ public class GenDsConfController { * @param conf 数据源表 * @return R */ - @SysLog("修改数据源表") @PutMapping - public R updateById(@RequestBody GenDatasourceConf conf) { + public R updateById(@RequestBody GenDatasourceConf conf) { return R.ok(datasourceConfService.updateDsByEnc(conf)); } /** * 通过id删除数据源表 - * @param id id + * @param ids id * @return R */ - @SysLog("删除数据源表") - @DeleteMapping("/{id}") - public R removeById(@PathVariable Long id) { - return R.ok(datasourceConfService.removeByDsId(id)); + @DeleteMapping + public R removeById(@RequestBody Long[] ids) { + return R.ok(datasourceConfService.removeByDsId(ids)); + } + + /** + * 查询数据源对应的文档 + * @param dsName 数据源名称 + */ + @SneakyThrows + @GetMapping("/doc") + public void generatorDoc(String dsName, HttpServletResponse response) { + // 设置指定的数据源 + DynamicRoutingDataSource dynamicRoutingDataSource = SpringContextHolder.getBean(DynamicRoutingDataSource.class); + DynamicDataSourceContextHolder.push(dsName); + DataSource dataSource = dynamicRoutingDataSource.determineDataSource(); + + // 设置指定的目标表 + ScrewProperties screwProperties = SpringContextHolder.getBean(ScrewProperties.class); + + // 生成 + byte[] data = screw.documentGeneration(dataSource, screwProperties).toByteArray(); + response.reset(); + response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length)); + response.setContentType(ContentType.OCTET_STREAM.getValue()); + IoUtil.write(response.getOutputStream(), Boolean.TRUE, data); } } diff --git a/pig-visual/pig-codegen/src/main/resources/template/Controller.java.vm b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFieldTypeController.java old mode 100755 new mode 100644 similarity index 33% rename from pig-visual/pig-codegen/src/main/resources/template/Controller.java.vm rename to pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFieldTypeController.java index deae73b0..e0b8e8e7 --- a/pig-visual/pig-codegen/src/main/resources/template/Controller.java.vm +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFieldTypeController.java @@ -15,15 +15,17 @@ * Author: lengleng (wangiegie@gmail.com) */ -package ${package}.${moduleName}.controller; +package com.pig4cloud.pig.codegen.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.codegen.entity.GenFieldType; +import com.pig4cloud.pig.codegen.service.GenFieldTypeService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; -import ${package}.${moduleName}.entity.${className}; -import ${package}.${moduleName}.service.${className}Service; -import org.springframework.security.access.prepost.PreAuthorize; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -31,85 +33,105 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; +import java.util.List; /** - * ${comments} + * 列属性 * - * @author ${author} - * @date ${datetime} + * @author pigx code generator + * @date 2023-02-06 20:16:01 */ @RestController @RequiredArgsConstructor -@RequestMapping("/${pathName}" ) -@Tag(name = "${comments}管理") +@RequestMapping("/fieldtype") +@Tag(description = "fieldtype", name = "列属性管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class ${className}Controller { +public class GenFieldTypeController { - private final ${className}Service ${classname}Service; + private final GenFieldTypeService fieldTypeService; - /** - * 分页查询 - * @param page 分页对象 - * @param ${classname} ${comments} - * @return - */ - @Operation(summary = "分页查询", description = "分页查询") - @GetMapping("/page" ) - @PreAuthorize("@pms.hasPermission('${moduleName}_${pathName}_get')" ) - public R get${className}Page(Page page, ${className} ${classname}) { - return R.ok(${classname}Service.page(page, Wrappers.query(${classname}))); - } + /** + * 分页查询 + * @param page 分页对象 + * @param fieldType 列属性 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getFieldTypePage(Page page, GenFieldType fieldType) { + return R.ok(fieldTypeService.page(page, + Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(fieldType.getColumnType()), GenFieldType::getColumnType, + fieldType.getColumnType()))); + } + @Operation(summary = "查询列表", description = "查询列表") + @GetMapping("/list") + public R list(GenFieldType fieldType) { + return R.ok(fieldTypeService.list(Wrappers.query(fieldType))); + } - /** - * 通过id查询${comments} - * @param ${pk.lowerAttrName} id - * @return R - */ - @Operation(summary = "通过id查询", description = "通过id查询") - @GetMapping("/{${pk.lowerAttrName}}" ) - @PreAuthorize("@pms.hasPermission('${moduleName}_${pathName}_get')" ) - public R getById(@PathVariable("${pk.lowerAttrName}" ) ${pk.attrType} ${pk.lowerAttrName}) { - return R.ok(${classname}Service.getById(${pk.lowerAttrName})); - } + /** + * 通过id查询列属性 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/details/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(fieldTypeService.getById(id)); + } - /** - * 新增${comments} - * @param ${classname} ${comments} - * @return R - */ - @Operation(summary = "新增${comments}", description = "新增${comments}") - @SysLog("新增${comments}" ) - @PostMapping - @PreAuthorize("@pms.hasPermission('${moduleName}_${pathName}_add')" ) - public R save(@RequestBody ${className} ${classname}) { - return R.ok(${classname}Service.save(${classname})); - } + @GetMapping("/details") + public R getDetails(GenFieldType query) { + return R.ok(fieldTypeService.getOne(Wrappers.query(query), false)); + } - /** - * 修改${comments} - * @param ${classname} ${comments} - * @return R - */ - @Operation(summary = "修改${comments}", description = "修改${comments}") - @SysLog("修改${comments}" ) - @PutMapping - @PreAuthorize("@pms.hasPermission('${moduleName}_${pathName}_edit')" ) - public R updateById(@RequestBody ${className} ${classname}) { - return R.ok(${classname}Service.updateById(${classname})); - } + /** + * 新增列属性 + * @param fieldType 列属性 + * @return R + */ + @Operation(summary = "新增列属性", description = "新增列属性") + @SysLog("新增列属性") + @PostMapping + public R save(@RequestBody GenFieldType fieldType) { + return R.ok(fieldTypeService.save(fieldType)); + } - /** - * 通过id删除${comments} - * @param ${pk.lowerAttrName} id - * @return R - */ - @Operation(summary = "通过id删除${comments}", description = "通过id删除${comments}") - @SysLog("通过id删除${comments}" ) - @DeleteMapping("/{${pk.lowerAttrName}}" ) - @PreAuthorize("@pms.hasPermission('${moduleName}_${pathName}_del')" ) - public R removeById(@PathVariable ${pk.attrType} ${pk.lowerAttrName}) { - return R.ok(${classname}Service.removeById(${pk.lowerAttrName})); - } + /** + * 修改列属性 + * @param fieldType 列属性 + * @return R + */ + @Operation(summary = "修改列属性", description = "修改列属性") + @SysLog("修改列属性") + @PutMapping + public R updateById(@RequestBody GenFieldType fieldType) { + return R.ok(fieldTypeService.updateById(fieldType)); + } + + /** + * 通过id删除列属性 + * @param ids id + * @return R + */ + @Operation(summary = "通过id删除列属性", description = "通过id删除列属性") + @SysLog("通过id删除列属性") + @DeleteMapping + public R removeById(@RequestBody Long[] ids) { + return R.ok(fieldTypeService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param fieldType 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + public List export(GenFieldType fieldType) { + return fieldTypeService.list(Wrappers.query(fieldType)); + } } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFormConfController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFormConfController.java deleted file mode 100755 index 23c01a28..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenFormConfController.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.codegen.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pig.codegen.entity.GenFormConf; -import com.pig4cloud.pig.codegen.service.GenFormConfService; -import com.pig4cloud.pig.common.core.util.R; -import com.pig4cloud.pig.common.log.annotation.SysLog; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpHeaders; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -/** - * 表单管理 - * - * @author lengleng - * @date 2019-08-12 15:55:35 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/form") -@Tag(name = "表单管理") -@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class GenFormConfController { - - private final GenFormConfService genRecordService; - - /** - * 分页查询 - * @param page 分页对象 - * @param formConf 生成记录 - * @return - */ - @Operation(summary = "分页查询", description = "分页查询") - @GetMapping("/page") - public R> getGenFormConfPage(Page page, GenFormConf formConf) { - return R.ok(genRecordService.page(page, Wrappers.query(formConf))); - } - - /** - * 通过id查询生成记录 - * @param id id - * @return R - */ - @Operation(summary = "通过id查询", description = "通过id查询") - @GetMapping("/{id}") - public R getById(@PathVariable("id") Integer id) { - return R.ok(genRecordService.getById(id)); - } - - /** - * 通过id查询生成记录 - * @param dsName 数据源ID - * @param tableName tableName - * @return R - */ - @Operation(summary = "通过tableName查询表单信息") - @GetMapping("/info") - public R form(String dsName, String tableName) { - return R.ok(genRecordService.getForm(dsName, tableName)); - } - - /** - * 新增生成记录 - * @param formConf 生成记录 - * @return R - */ - @Operation(summary = "新增生成记录", description = "新增生成记录") - @SysLog("新增生成记录") - @PostMapping - @PreAuthorize("@pms.hasPermission('gen_form_add')") - public R save(@RequestBody GenFormConf formConf) { - return R.ok(genRecordService.save(formConf)); - } - - /** - * 通过id删除生成记录 - * @param id id - * @return R - */ - @Operation(summary = "通过id删除生成记录", description = "通过id删除生成记录") - @SysLog("通过id删除生成记录") - @DeleteMapping("/{id}") - @PreAuthorize("@pms.hasPermission('gen_form_del')") - public R removeById(@PathVariable Long id) { - return R.ok(genRecordService.removeById(id)); - } - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java new file mode 100644 index 00000000..c603101f --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; +import com.pig4cloud.pig.codegen.service.GenGroupService; +import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.TemplateGroupDTO; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 模板分组 + * + * @author PIG + * @date 2023-02-21 20:01:53 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/group") +@Tag(description = "group", name = "模板分组管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class GenGroupController { + + private final GenGroupService genGroupService; + + /** + * 分页查询 + * @param page 分页对象 + * @param genGroup 模板分组 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('codegen_group_view')") + public R getgenGroupPage(Page page, GenGroupEntity genGroup) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(genGroup.getId() != null, GenGroupEntity::getId, genGroup.getId()) + .like(StrUtil.isNotEmpty(genGroup.getGroupName()), GenGroupEntity::getGroupName, genGroup.getGroupName()); + return R.ok(genGroupService.page(page, wrapper)); + } + + /** + * 通过id查询模板分组 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('codegen_group_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(genGroupService.getGroupVoById(id)); + } + + /** + * 新增模板分组 + * @param genTemplateGroup 模板分组 + * @return R + */ + @Operation(summary = "新增模板分组", description = "新增模板分组") + @SysLog("新增模板分组") + @PostMapping + @PreAuthorize("@pms.hasPermission('codegen_group_add')") + public R save(@RequestBody TemplateGroupDTO genTemplateGroup) { + genGroupService.saveGenGroup(genTemplateGroup); + return R.ok(); + } + + /** + * 修改模板分组 + * @param groupVo 模板分组 + * @return R + */ + @Operation(summary = "修改模板分组", description = "修改模板分组") + @SysLog("修改模板分组") + @PutMapping + @PreAuthorize("@pms.hasPermission('codegen_group_edit')") + public R updateById(@RequestBody GroupVo groupVo) { + genGroupService.updateGroupAndTemplateById(groupVo); + return R.ok(); + } + + /** + * 通过id删除模板分组 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除模板分组", description = "通过id删除模板分组") + @SysLog("通过id删除模板分组") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('codegen_group_del')") + public R removeById(@RequestBody Long[] ids) { + genGroupService.delGroupAndTemplate(ids); + return R.ok(); + } + + /** + * 导出excel 表格 + * @param genGroup 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('codegen_group_export')") + public List export(GenGroupEntity genGroup) { + return genGroupService.list(Wrappers.query(genGroup)); + } + + @GetMapping("/list") + @Operation(summary = "查询列表", description = "查询列表") + public R list() { + List list = genGroupService.list(); + return R.ok(list); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java new file mode 100644 index 00000000..4ee48193 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.codegen.entity.GenTable; +import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; +import com.pig4cloud.pig.codegen.service.GenTableColumnService; +import com.pig4cloud.pig.codegen.service.GenTableService; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:34:55 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/table") +@Tag(description = "table", name = "列属性管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class GenTableController { + + private final GenTableColumnService tableColumnService; + + private final GenTableService tableService; + + /** + * 分页查询 + * @param page 分页对象 + * @param table 列属性 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getTablePage(Page page, GenTable table) { + + return R.ok(tableService.list(page, table)); + } + + /** + * 通过id查询列属性 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(tableService.getById(id)); + } + + /** + * 新增列属性 + * @param table 列属性 + * @return R + */ + @Operation(summary = "新增列属性", description = "新增列属性") + @SysLog("新增列属性") + @PostMapping + public R save(@RequestBody GenTable table) { + return R.ok(tableService.save(table)); + } + + /** + * 修改列属性 + * @param table 列属性 + * @return R + */ + @Operation(summary = "修改列属性", description = "修改列属性") + @SysLog("修改列属性") + @PutMapping + public R updateById(@RequestBody GenTable table) { + return R.ok(tableService.updateById(table)); + } + + /** + * 通过id删除列属性 + * @param id id + * @return R + */ + @Operation(summary = "通过id删除列属性", description = "通过id删除列属性") + @SysLog("通过id删除列属性") + @DeleteMapping("/{id}") + public R removeById(@PathVariable Long id) { + return R.ok(tableService.removeById(id)); + } + + /** + * 导出excel 表格 + * @param table 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + public List export(GenTable table) { + return tableService.list(Wrappers.query(table)); + } + + @GetMapping("/list/{dsName}") + public R listTable(@PathVariable("dsName") String dsName) { + return R.ok(tableService.queryDsAllTable(dsName)); + } + + @GetMapping("/column/{dsName}/{tableName}") + public R column(@PathVariable("dsName") String dsName, @PathVariable String tableName) { + return R.ok(tableService.queryColumn(dsName, tableName)); + } + + /** + * 获取表信息 + * @param dsName 数据源 + * @param tableName 表名称 + */ + @GetMapping("/{dsName}/{tableName}") + public R info(@PathVariable("dsName") String dsName, @PathVariable String tableName) { + return R.ok(tableService.queryOrBuildTable(dsName, tableName)); + } + + /** + * 同步表信息 + * @param dsName 数据源 + * @param tableName 表名称 + */ + @GetMapping("/sync/{dsName}/{tableName}") + public R sync(@PathVariable("dsName") String dsName, @PathVariable String tableName) { + // 表配置删除 + tableService.remove( + Wrappers.lambdaQuery().eq(GenTable::getDsName, dsName).eq(GenTable::getTableName, tableName)); + // 字段配置删除 + tableColumnService.remove(Wrappers.lambdaQuery() + .eq(GenTableColumnEntity::getDsName, dsName) + .eq(GenTableColumnEntity::getTableName, tableName)); + return R.ok(tableService.queryOrBuildTable(dsName, tableName)); + } + + /** + * 修改表字段数据 + * @param dsName 数据源 + * @param tableName 表名称 + * @param tableFieldList 字段列表 + */ + @PutMapping("/field/{dsName}/{tableName}") + public R updateTableField(@PathVariable("dsName") String dsName, @PathVariable String tableName, + @RequestBody List tableFieldList) { + tableColumnService.updateTableField(dsName, tableName, tableFieldList); + return R.ok(); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java new file mode 100644 index 00000000..4b122c5f --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import com.pig4cloud.pig.codegen.service.GenTemplateService; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 模板 + * + * @author PIG + * @date 2023-02-21 17:15:44 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/template") +@Tag(description = "template", name = "模板管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class GenTemplateController { + + private final GenTemplateService genTemplateService; + + /** + * 分页查询 + * @param page 分页对象 + * @param genTemplate 模板 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('codegen_template_view')") + public R getgenTemplatePage(Page page, GenTemplateEntity genTemplate) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(genTemplate.getId() != null, GenTemplateEntity::getId, genTemplate.getId()) + .like(StrUtil.isNotEmpty(genTemplate.getTemplateName()), GenTemplateEntity::getTemplateName, + genTemplate.getTemplateName()); + return R.ok(genTemplateService.page(page, wrapper)); + } + + /** + * 查询全部模板 + * @return + */ + @Operation(summary = "查询全部", description = "查询全部") + @GetMapping("/list") + @PreAuthorize("@pms.hasPermission('codegen_template_view')") + public R list() { + return R.ok(genTemplateService.list(Wrappers.emptyWrapper())); + } + + /** + * 通过id查询模板 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('codegen_template_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(genTemplateService.getById(id)); + } + + /** + * 新增模板 + * @param genTemplate 模板 + * @return R + */ + @Operation(summary = "新增模板", description = "新增模板") + @SysLog("新增模板") + @PostMapping + @PreAuthorize("@pms.hasPermission('codegen_template_add')") + public R save(@RequestBody GenTemplateEntity genTemplate) { + return R.ok(genTemplateService.save(genTemplate)); + } + + /** + * 修改模板 + * @param genTemplate 模板 + * @return R + */ + @Operation(summary = "修改模板", description = "修改模板") + @SysLog("修改模板") + @PutMapping + @PreAuthorize("@pms.hasPermission('codegen_template_edit')") + public R updateById(@RequestBody GenTemplateEntity genTemplate) { + return R.ok(genTemplateService.updateById(genTemplate)); + } + + /** + * 通过id删除模板 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除模板", description = "通过id删除模板") + @SysLog("通过id删除模板") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('codegen_template_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(genTemplateService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param genTemplate 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('codegen_template_export')") + public List export(GenTemplateEntity genTemplate) { + return genTemplateService.list(Wrappers.query(genTemplate)); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateGroupController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateGroupController.java new file mode 100644 index 00000000..aeba3601 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateGroupController.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.codegen.entity.GenTemplateGroupEntity; +import com.pig4cloud.pig.codegen.service.GenTemplateGroupService; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 模板分组关联表 + * + * @author PIG + * @date 2023-02-22 09:25:15 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/templateGroup") +@Tag(description = "templateGroup", name = "模板分组关联表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class GenTemplateGroupController { + + private final GenTemplateGroupService genTemplateGroupService; + + /** + * 分页查询 + * @param page 分页对象 + * @param genTemplateGroup 模板分组关联表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('codegen_templateGroup_view')") + public R getgenTemplateGroupPage(Page page, GenTemplateGroupEntity genTemplateGroup) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(genTemplateGroupService.page(page, wrapper)); + } + + /** + * 通过id查询模板分组关联表 + * @param groupId id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{groupId}") + @PreAuthorize("@pms.hasPermission('codegen_templateGroup_view')") + public R getById(@PathVariable("groupId") Long groupId) { + return R.ok(genTemplateGroupService.getById(groupId)); + } + + /** + * 新增模板分组关联表 + * @param genTemplateGroup 模板分组关联表 + * @return R + */ + @Operation(summary = "新增模板分组关联表", description = "新增模板分组关联表") + @SysLog("新增模板分组关联表") + @PostMapping + @PreAuthorize("@pms.hasPermission('codegen_templateGroup_add')") + public R save(@RequestBody GenTemplateGroupEntity genTemplateGroup) { + return R.ok(genTemplateGroupService.save(genTemplateGroup)); + } + + /** + * 修改模板分组关联表 + * @param genTemplateGroup 模板分组关联表 + * @return R + */ + @Operation(summary = "修改模板分组关联表", description = "修改模板分组关联表") + @SysLog("修改模板分组关联表") + @PutMapping + @PreAuthorize("@pms.hasPermission('codegen_templateGroup_edit')") + public R updateById(@RequestBody GenTemplateGroupEntity genTemplateGroup) { + return R.ok(genTemplateGroupService.updateById(genTemplateGroup)); + } + + /** + * 通过id删除模板分组关联表 + * @param ids groupId列表 + * @return R + */ + @Operation(summary = "通过id删除模板分组关联表", description = "通过id删除模板分组关联表") + @SysLog("通过id删除模板分组关联表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('codegen_templateGroup_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(genTemplateGroupService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param genTemplateGroup 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('codegen_templateGroup_export')") + public List export(GenTemplateGroupEntity genTemplateGroup) { + return genTemplateGroupService.list(Wrappers.query(genTemplateGroup)); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java index 978e8d30..5d7fa0f1 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java @@ -1,37 +1,39 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.controller; import cn.hutool.core.io.IoUtil; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pig.codegen.entity.GenConfig; +import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.codegen.service.GeneratorService; import com.pig4cloud.pig.common.core.util.R; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; import java.util.List; import java.util.Map; +import java.util.zip.ZipOutputStream; /** * 代码生成器 @@ -42,47 +44,61 @@ import java.util.Map; @RestController @RequiredArgsConstructor @RequestMapping("/generator") -@Tag(name = "代码生成模块") -@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class GeneratorController { private final GeneratorService generatorService; /** - * 列表 - * @param tableName 参数集 - * @param dsName 数据源编号 - * @return 数据库表 + * ZIP 下载生成代码 + * @param tableIds 数据表ID + * @param response 流输出对象 */ - @GetMapping("/page") - public R>>> getPage(Page page, String tableName, String dsName) { - return R.ok(generatorService.getPage(page, tableName, dsName)); + @SneakyThrows + @GetMapping("/download") + public void download(String tableIds, HttpServletResponse response) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + + // 生成代码 + for (String tableId : tableIds.split(StrUtil.COMMA)) { + generatorService.downloadCode(Long.parseLong(tableId), zip); + } + + IoUtil.close(zip); + + // zip压缩包数据 + byte[] data = outputStream.toByteArray(); + + response.reset(); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s.zip", tableIds)); + response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length)); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.write(response.getOutputStream(), false, data); } /** - * 预览代码 - * @param genConfig 数据表配置 - * @return + * 目标目录生成代码 */ - @GetMapping("/preview") - public R> previewCode(GenConfig genConfig) { - return R.ok(generatorService.previewCode(genConfig)); + @ResponseBody + @GetMapping("/code") + public R code(String tableIds) throws Exception { + // 生成代码 + for (String tableId : tableIds.split(StrUtil.COMMA)) { + generatorService.generatorCode(Long.valueOf(tableId)); + } + + return R.ok(); } /** - * 生成代码 + * 预览代码 + * @param tableId 表ID + * @return */ @SneakyThrows - @PostMapping("/code") - public void generatorCode(@RequestBody GenConfig genConfig, HttpServletResponse response) { - byte[] data = generatorService.generatorCode(genConfig); - response.reset(); - response.setHeader(HttpHeaders.CONTENT_DISPOSITION, - String.format("attachment; filename=%s.zip", genConfig.getTableName())); - response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length)); - response.setContentType("application/octet-stream; charset=UTF-8"); - - IoUtil.write(response.getOutputStream(), Boolean.TRUE, data); + @GetMapping("/preview") + public List> preview(Long tableId) { + return generatorService.preview(tableId); } } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/ColumnEntity.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/ColumnEntity.java index 1755b4fa..bcbc8919 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/ColumnEntity.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/ColumnEntity.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.entity; @@ -35,6 +36,11 @@ public class ColumnEntity { */ private String dataType; + /** + * JAVA 数据类型 + */ + private String javaType; + /** * 备注 */ diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenConfig.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenConfig.java index dbbc6173..7a6789fb 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenConfig.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenConfig.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.entity; @@ -61,7 +62,7 @@ public class GenConfig { private String comments; /** - * 代码风格 0 - avue 1 - element + * 代码风格 0 - avue 1 - element 2 - uview */ private String style; diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenDatasourceConf.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenDatasourceConf.java index caec1e5c..ca85bcc8 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenDatasourceConf.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenDatasourceConf.java @@ -1,28 +1,28 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + /** * 数据源表 * @@ -32,7 +32,9 @@ import lombok.EqualsAndHashCode; @Data @TableName("gen_datasource_conf") @EqualsAndHashCode(callSuper = true) -public class GenDatasourceConf extends BaseEntity { +public class GenDatasourceConf extends Model { + + private static final long serialVersionUID = 1L; /** * 主键 @@ -46,10 +48,40 @@ public class GenDatasourceConf extends BaseEntity { private String name; /** - * jdbcurl + * 数据库类型 + */ + private String dsType; + + /** + * 配置类型 (0 主机形式 | 1 url形式) + */ + private Integer confType; + + /** + * 主机地址 + */ + private String host; + + /** + * 端口 + */ + private Integer port; + + /** + * jdbc-url */ private String url; + /** + * 实例 + */ + private String instance; + + /** + * 数据库名称 + */ + private String dsName; + /** * 用户名 */ @@ -61,9 +93,22 @@ public class GenDatasourceConf extends BaseEntity { private String password; /** - * 删除标记 + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 0-正常,1-删除 */ @TableLogic + @TableField(fill = FieldFill.INSERT) private String delFlag; } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFieldType.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFieldType.java new file mode 100644 index 00000000..8a5da8b4 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFieldType.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:16:01 + */ +@Data +@TableName("gen_field_type") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "列属性") +public class GenFieldType extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * 字段类型 + */ + @Schema(description = "字段类型") + private String columnType; + + /** + * 属性类型 + */ + @Schema(description = "属性类型") + private String attrType; + + /** + * 属性包名 + */ + @Schema(description = "属性包名") + private String packageName; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标识(0-正常,1-删除) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFormConf.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFormConf.java deleted file mode 100755 index 2f68a3b8..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenFormConf.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.codegen.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 生成记录 - * - * @author lengleng - * @date 2019-08-12 15:55:35 - */ -@Data -@TableName("gen_form_conf") -@Schema(description = "生成记录") -@EqualsAndHashCode(callSuper = true) -public class GenFormConf extends BaseEntity { - - /** - * ID - */ - @TableId(type = IdType.ASSIGN_ID) - @Schema(description = "ID") - private Long id; - - /** - * 表名称 - */ - @Schema(description = "表名称") - private String tableName; - - /** - * 表单信息 - */ - @Schema(description = "表单信息") - private String formInfo; - - /** - * 删除标记 - */ - @Schema(description = "删除标记") - private String delFlag; - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenGroupEntity.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenGroupEntity.java new file mode 100644 index 00000000..5418808b --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenGroupEntity.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 模板分组 + * + * @author PIG + * @date 2023-02-21 20:01:53 + */ +@Data +@TableName("gen_group") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "模板分组") +public class GenGroupEntity extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * 分组名称 + */ + @Schema(description = "分组名称") + private String groupName; + + /** + * 分组描述 + */ + @Schema(description = "分组描述") + @TableField(fill = FieldFill.INSERT) + private String groupDesc; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标识(0-正常,1-删除) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java new file mode 100644 index 00000000..0ef736ae --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:34:55 + */ +@Data +@TableName("gen_table") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "列属性") +public class GenTable extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * 数据源名称 + */ + @Schema(description = "数据源名称") + private String dsName; + + /** + * 数据源类型 + */ + @Schema(description = "数据源类型") + private String dbType; + + /** + * 表名 + */ + @Schema(description = "表名") + private String tableName; + + /** + * 类名 + */ + @Schema(description = "类名") + private String className; + + /** + * 说明 + */ + @Schema(description = "说明") + private String tableComment; + + /** + * 作者 + */ + @Schema(description = "作者") + private String author; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; + + /** + * 项目包名 + */ + @Schema(description = "项目包名") + private String packageName; + + /** + * 项目版本号 + */ + @Schema(description = "项目版本号") + private String version; + + /** + * 生成方式 0:zip压缩包 1:自定义目录 + */ + @Schema(description = "生成方式 0:zip压缩包 1:自定义目录") + private Integer generatorType; + + /** + * 后端生成路径 + */ + @Schema(description = "后端生成路径") + private String backendPath; + + /** + * 前端生成路径 + */ + @Schema(description = "前端生成路径") + private String frontendPath; + + /** + * 模块名 + */ + @Schema(description = "模块名") + private String moduleName; + + /** + * 功能名 + */ + @Schema(description = "功能名") + private String functionName; + + /** + * 表单布局 1:一列 2:两列 + */ + @Schema(description = "表单布局 1:一列 2:两列") + private Integer formLayout; + + /** + * 基类ID + */ + @Schema(description = "基类ID") + private Long baseclassId; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 代码生成风格 + */ + private Long style; + + /** + * 字段列表 + */ + @TableField(exist = false) + private List fieldList; + + /** + * 代码风格(模版分组信息) + */ + @TableField(exist = false) + private List groupList; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTableColumnEntity.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTableColumnEntity.java new file mode 100755 index 00000000..a54612b7 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTableColumnEntity.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author lengleng + * @date 2023-02-06 + * + * 记录表字段的配置信息 + */ +@Data +@TableName("gen_table_column") +@EqualsAndHashCode(callSuper = true) +public class GenTableColumnEntity extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** + * 数据源名 + */ + private String dsName; + + /** + * 表名称 + */ + private String tableName; + + /** + * 字段名称 + */ + private String fieldName; + + /** + * 排序 + */ + private Integer sort; + + /** + * 字段类型 + */ + private String fieldType; + + /** + * 字段说明 + */ + private String fieldComment; + + /** + * 属性名 + */ + private String attrName; + + /** + * 属性类型 + */ + private String attrType; + + /** + * 属性包名 + */ + private String packageName; + + /** + * 自动填充 + */ + private String autoFill; + + /** + * 主键 0:否 1:是 + */ + private boolean primaryPk; + + /** + * 基类字段 0:否 1:是 + */ + private boolean baseField; + + /** + * 表单项 0:否 1:是 + */ + private boolean formItem; + + /** + * 表单必填 0:否 1:是 + */ + private boolean formRequired; + + /** + * 表单类型 + */ + private String formType; + + /** + * 表单效验 + */ + private String formValidator; + + /** + * 列表项 0:否 1:是 + */ + private boolean gridItem; + + /** + * 列表排序 0:否 1:是 + */ + private boolean gridSort; + + /** + * 查询项 0:否 1:是 + */ + private boolean queryItem; + + /** + * 查询方式 + */ + private String queryType; + + /** + * 查询表单类型 + */ + private String queryFormType; + + /** + * 字段字典类型 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private String fieldDict; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateEntity.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateEntity.java new file mode 100644 index 00000000..10b0f185 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateEntity.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 模板 + * + * @author PIG + * @date 2023-02-21 17:15:44 + */ +@Data +@TableName("gen_template") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "模板") +public class GenTemplateEntity extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 模板名称 + */ + @Schema(description = "模板名称") + private String templateName; + + /** + * 模板路径 + */ + @Schema(description = "模板路径") + private String generatorPath; + + /** + * 模板描述 + */ + @Schema(description = "模板描述") + private String templateDesc; + + /** + * 模板代码 + */ + @Schema(description = "模板代码") + private String templateCode; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标识(0-正常,1-删除) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/pig-visual/pig-codegen/src/main/resources/template/Entity.java.vm b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateGroupEntity.java old mode 100755 new mode 100644 similarity index 53% rename from pig-visual/pig-codegen/src/main/resources/template/Entity.java.vm rename to pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateGroupEntity.java index 8431d722..ebe3e95e --- a/pig-visual/pig-codegen/src/main/resources/template/Entity.java.vm +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTemplateGroupEntity.java @@ -14,45 +14,41 @@ * this software without specific prior written permission. * Author: lengleng (wangiegie@gmail.com) */ -#set($excludeColumns = ["create_time","update_time","create_by","update_by"]) -package ${package}.${moduleName}.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; +package com.pig4cloud.pig.codegen.entity; + import com.baomidou.mybatisplus.annotation.TableName; -import com.pig4cloud.pig.common.mybatis.base.BaseEntity; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -#if(${hasBigDecimal}) -import java.math.BigDecimal; -#end +import lombok.experimental.Accessors; /** - * ${comments} + * 模板分组关联表 * - * @author ${author} - * @date ${datetime} + * @author PIG + * @date 2023-02-22 09:25:15 */ @Data -@TableName("${tableName}") +@TableName("gen_template_group") +@Accessors(chain = true) @EqualsAndHashCode(callSuper = true) -@Schema(description = "${comments}") -public class ${className} extends BaseEntity { +@Schema(description = "模板分组关联表") +public class GenTemplateGroupEntity extends Model { + + private static final long serialVersionUID = 1L; -#foreach ($column in $columns) -## 排除部分字段 -#if(!$excludeColumns.contains($column.columnName)) - /** - * $column.comments - */ -#if($column.columnName == $pk.columnName) - @TableId(type = IdType.ASSIGN_ID) -#end - @Schema(description ="$column.comments"#if($column.hidden),hidden=$column.hidden#end) - private $column.attrType $column.lowerAttrName; + /** + * 分组id + */ + @Schema(description = "分组id") + private Long groupId; -#end -#end + /** + * 模板id + */ + @Schema(description = "模板id") + private Long templateId; } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/TableEntity.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/TableEntity.java index a682efae..b909698c 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/TableEntity.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/TableEntity.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.entity; @@ -57,4 +58,9 @@ public class TableEntity { */ private String lowerClassName; + /** + * 数据库类型 (用于根据数据库个性化) + */ + private String dbType; + } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDatasourceConfMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDatasourceConfMapper.java index be10be26..6192b5ac 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDatasourceConfMapper.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDatasourceConfMapper.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.mapper; diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDynamicMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDynamicMapper.java new file mode 100755 index 00000000..d20c04fc --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenDynamicMapper.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.LinkedHashMap; +import java.util.List; + +/** + * 动态查询 + * + * @author lengleng + * @date 2022-07-09 + */ +@Mapper +public interface GenDynamicMapper { + + @InterceptorIgnore(tenantLine = "true") + List> dynamicQuerySql(@Param("value") String sq); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFieldTypeMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFieldTypeMapper.java new file mode 100644 index 00000000..0d92ab79 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFieldTypeMapper.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.codegen.entity.GenFieldType; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Set; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:16:01 + */ +@Mapper +public interface GenFieldTypeMapper extends BaseMapper { + + /** + * 根据tableId,获取包列表 + * @param dsName 数据源名称 + * @param tableName 表名称 + * @return 返回包列表 + */ + Set getPackageByTableId(@Param("dsName") String dsName, @Param("tableName") String tableName); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFormConfMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFormConfMapper.java deleted file mode 100755 index 6a9da95b..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenFormConfMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.codegen.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.pig4cloud.pig.codegen.entity.GenFormConf; -import org.apache.ibatis.annotations.Mapper; - -/** - * 生成记录 - * - * @author lengleng - * @date 2019-08-12 15:55:35 - */ -@Mapper -public interface GenFormConfMapper extends BaseMapper { - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java new file mode 100644 index 00000000..146e2fa1 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; +import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 模板分组 + * + * @author PIG + * @date 2023-02-21 20:01:53 + */ +@Mapper +public interface GenGroupMapper extends BaseMapper { + + GroupVo getGroupVoById(@Param("id") Long id); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableColumnMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableColumnMapper.java new file mode 100644 index 00000000..3b2a66f7 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableColumnMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:16:01 + */ +@Mapper +public interface GenTableColumnMapper extends BaseMapper { + +} diff --git a/pig-visual/pig-codegen/src/main/resources/template/Mapper.java.vm b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableMapper.java old mode 100755 new mode 100644 similarity index 80% rename from pig-visual/pig-codegen/src/main/resources/template/Mapper.java.vm rename to pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableMapper.java index d5f3d393..27d2698b --- a/pig-visual/pig-codegen/src/main/resources/template/Mapper.java.vm +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTableMapper.java @@ -15,19 +15,19 @@ * Author: lengleng (wangiegie@gmail.com) */ -package ${package}.${moduleName}.mapper; +package com.pig4cloud.pig.codegen.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import ${package}.${moduleName}.entity.${className}; +import com.pig4cloud.pig.codegen.entity.GenTable; import org.apache.ibatis.annotations.Mapper; /** - * ${comments} + * 列属性 * - * @author ${author} - * @date ${datetime} + * @author pigx code generator + * @date 2023-02-06 20:34:55 */ @Mapper -public interface ${className}Mapper extends BaseMapper<${className}> { +public interface GenTableMapper extends BaseMapper { } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateGroupMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateGroupMapper.java new file mode 100644 index 00000000..4be972a4 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateGroupMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.codegen.entity.GenTemplateGroupEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 模板分组关联表 + * + * @author PIG + * @date 2023-02-22 09:25:15 + */ +@Mapper +public interface GenTemplateGroupMapper extends BaseMapper { + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateMapper.java new file mode 100644 index 00000000..be2dc684 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenTemplateMapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 模板 + * + * @author PIG + * @date 2023-02-21 17:15:44 + */ +@Mapper +public interface GenTemplateMapper extends BaseMapper { + + /** + * 根据groupId查询 模板 + * @param groupId + * @return + */ + List listTemplateById(Long groupId); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java index da0c91eb..6952289a 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java @@ -1,25 +1,28 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.mapper; import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Mapper; +import com.pig4cloud.pig.codegen.entity.ColumnEntity; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -31,16 +34,23 @@ import java.util.Map; * @author lengleng * @date 2018-07-30 */ -@Mapper -public interface GeneratorMapper { +public interface GeneratorMapper extends BaseMapper { + + /** + * 查询全部的表 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List> queryTable(); /** * 分页查询表格 - * @param page - * @param tableName + * @param page 分页信息 + * @param tableName 表名称 * @return */ - IPage>> queryList(Page page, @Param("tableName") String tableName); + @InterceptorIgnore(tenantLine = "true") + IPage> queryTable(Page page, @Param("tableName") String tableName); /** * 查询表信息 @@ -49,15 +59,39 @@ public interface GeneratorMapper { * @return */ @DS("#last") + @InterceptorIgnore(tenantLine = "true") Map queryTable(@Param("tableName") String tableName, String dsName); /** - * 查询表列信息 + * 分页查询表分页信息 + * @param page + * @param tableName + * @param dsName + * @return + */ + @DS("#last") + @InterceptorIgnore(tenantLine = "true") + IPage selectTableColumn(Page page, @Param("tableName") String tableName, + @Param("dsName") String dsName); + + /** + * 查询表全部列信息 + * @param tableName + * @param dsName + * @return + */ + @DS("#last") + @InterceptorIgnore(tenantLine = "true") + List selectTableColumn(@Param("tableName") String tableName, @Param("dsName") String dsName); + + /** + * 查询表全部列信息 * @param tableName 表名称 * @param dsName 数据源名称 * @return */ @DS("#last") - List> queryColumns(@Param("tableName") String tableName, String dsName); + @InterceptorIgnore(tenantLine = "true") + List> selectMapTableColumn(@Param("tableName") String tableName, String dsName); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java new file mode 100755 index 00000000..26a7cb63 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.mapper; + +import org.apache.ibatis.annotations.Mapper; + +/** + * 支持 mysql 代码生成器 + * + * @author lengleng + * @date 2020-12-11 + */ +@Mapper +public interface GeneratorMysqlMapper extends GeneratorMapper { + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenCodeService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenCodeService.java deleted file mode 100644 index 4e9f9cd5..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenCodeService.java +++ /dev/null @@ -1,329 +0,0 @@ -package com.pig4cloud.pig.codegen.service; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pig.codegen.entity.ColumnEntity; -import com.pig4cloud.pig.codegen.entity.GenConfig; -import com.pig4cloud.pig.codegen.entity.GenFormConf; -import com.pig4cloud.pig.codegen.entity.TableEntity; -import com.pig4cloud.pig.common.core.constant.CommonConstants; -import com.pig4cloud.pig.common.core.exception.CheckedException; -import lombok.SneakyThrows; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.PropertiesConfiguration; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.WordUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.apache.velocity.tools.generic.DateTool; -import org.apache.velocity.tools.generic.MathTool; - -import java.io.File; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.zip.ZipEntry; -import java.util.zip.ZipException; -import java.util.zip.ZipOutputStream; - -/** - * 生成代码抽象 - * - * @author Fxz - * @date 2022/7/21 02:24 - */ -public interface GenCodeService { - - default Map gen(GenConfig genConfig, Map table, List> columns, - ZipOutputStream zip, GenFormConf formConf) { - // 构建表实体 - TableEntity tableEntity = buildTableEntity(genConfig, table); - - // 处理列相关 - buildColumnEntity(tableEntity, columns); - - // 模板入参 - Map tempModel = buildTempModel(tableEntity, genConfig); - - return renderData(genConfig, zip, tableEntity, tempModel, formConf); - } - - /** - * 渲染数据 - * @param genConfig 用户输入相关 - * @param zip 输出zip流 - * @param tableEntity 表格实体 - * @param map 参数集合 - * @param formConf 表单设计 - */ - @SneakyThrows - default Map renderData(GenConfig genConfig, ZipOutputStream zip, TableEntity tableEntity, - Map map, GenFormConf formConf) { - // 设置velocity资源加载器 - Properties prop = new Properties(); - prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - Velocity.init(prop); - - VelocityContext context = new VelocityContext(map); - // 函数库 - context.put("math", new MathTool()); - context.put("dateTool", new DateTool()); - - // 获取模板列表 - List templates = getTemplates(genConfig); - Map resultMap = new LinkedHashMap<>(8); - - for (String template : templates) { - // 渲染模板 - StringWriter sw = new StringWriter(); - Template tpl = Velocity.getTemplate(template, CharsetUtil.UTF_8); - tpl.merge(context, sw); - - // 添加到zip - String fileName = getFileName(template, tableEntity.getCaseClassName(), map.get("package").toString(), - map.get("moduleName").toString()); - - if (zip != null) { - try { - zip.putNextEntry(new ZipEntry(Objects.requireNonNull(fileName))); - IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString()); - IoUtil.close(sw); - } - catch (ZipException zipException) { - } - zip.closeEntry(); - } - resultMap.put(template, sw.toString()); - } - - return resultMap; - } - - /** - * 注入支持的模板列表 - * @param config 用户输入 - * @return ListString - */ - default List getTemplates(GenConfig config) { - List templates = new ArrayList<>(); - templates.add("template/Entity.java.vm"); - templates.add("template/Mapper.java.vm"); - templates.add("template/Mapper.xml.vm"); - templates.add("template/Service.java.vm"); - templates.add("template/ServiceImpl.java.vm"); - templates.add("template/Controller.java.vm"); - templates.add("template/menu.sql.vm"); - return templates; - } - - /** - * 获取文件名 - */ - default String getFileName(String template, String className, String packageName, String moduleName) { - String packagePath = CommonConstants.BACK_END_PROJECT + File.separator + "src" + File.separator + "main" - + File.separator + "java" + File.separator; - - if (StringUtils.isNotBlank(packageName)) { - packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator; - } - - if (template.contains("Entity.java.vm")) { - return packagePath + "entity" + File.separator + className + ".java"; - } - - if (template.contains("Mapper.java.vm")) { - return packagePath + "mapper" + File.separator + className + "Mapper.java"; - } - - if (template.contains("Service.java.vm")) { - return packagePath + "service" + File.separator + className + "Service.java"; - } - - if (template.contains("ServiceImpl.java.vm")) { - return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java"; - } - - if (template.contains("Controller.java.vm")) { - return packagePath + "controller" + File.separator + className + "Controller.java"; - } - - if (template.contains("Mapper.xml.vm")) { - return CommonConstants.BACK_END_PROJECT + File.separator + "src" + File.separator + "main" + File.separator - + "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml"; - } - - if (template.contains("menu.sql.vm")) { - return className.toLowerCase() + "_menu.sql"; - } - - return null; - } - - default Map buildTempModel(TableEntity tableEntity, GenConfig genConfig) { - // 封装模板数据 - Map map = new HashMap<>(16); - map.put("tableName", tableEntity.getTableName()); - map.put("pk", tableEntity.getPk()); - map.put("className", tableEntity.getCaseClassName()); - map.put("classname", tableEntity.getLowerClassName()); - map.put("pathName", tableEntity.getLowerClassName().toLowerCase()); - map.put("columns", tableEntity.getColumns()); - map.put("datetime", DateUtil.now()); - - if (StrUtil.isNotBlank(genConfig.getComments())) { - map.put("comments", genConfig.getComments()); - } - else { - map.put("comments", tableEntity.getComments()); - } - - if (StrUtil.isNotBlank(genConfig.getAuthor())) { - map.put("author", genConfig.getAuthor()); - } - else { - map.put("author", getConfig().getString("author")); - } - - if (StrUtil.isNotBlank(genConfig.getModuleName())) { - map.put("moduleName", genConfig.getModuleName()); - } - else { - map.put("moduleName", getConfig().getString("moduleName")); - } - - if (StrUtil.isNotBlank(genConfig.getPackageName())) { - map.put("package", genConfig.getPackageName()); - map.put("mainPath", genConfig.getPackageName()); - } - else { - map.put("package", getConfig().getString("package")); - map.put("mainPath", getConfig().getString("mainPath")); - } - - return map; - } - - /** - * 构建 ColumnEntity - * @param columns 列元信息 - */ - default void buildColumnEntity(TableEntity tableEntity, List> columns) { - // 获取需要在swagger文档中隐藏的属性字段 - List hiddenColumns = getConfig().getList("hiddenColumn"); - // 列信息 - List columnList = new ArrayList<>(); - for (Map column : columns) { - ColumnEntity columnEntity = new ColumnEntity(); - columnEntity.setColumnName(column.get("columnName")); - columnEntity.setDataType(column.get("dataType")); - columnEntity.setExtra(column.get("extra")); - columnEntity.setNullable("NO".equals(column.get("isNullable"))); - columnEntity.setColumnType(column.get("columnType")); - // 隐藏不需要的在接口文档中展示的字段 - if (hiddenColumns.contains(column.get("columnName"))) { - columnEntity.setHidden(Boolean.TRUE); - } - else { - columnEntity.setHidden(Boolean.FALSE); - } - // 列名转换成Java属性名 - String attrName = columnToJava(columnEntity.getColumnName()); - columnEntity.setCaseAttrName(attrName); - columnEntity.setLowerAttrName(StringUtils.uncapitalize(attrName)); - - // 判断注释是否为空 - if (StrUtil.isNotBlank(column.get("columnComment"))) { - // 注意去除换行符号 - columnEntity.setComments(StrUtil.removeAllLineBreaks(column.get("columnComment"))); - } - else { - columnEntity.setComments(columnEntity.getLowerAttrName()); - } - - // 列的数据类型,转换成Java类型 - String dataType = StrUtil.subBefore(columnEntity.getDataType(), "(", false); - String attrType = getConfig().getString(dataType, "unknowType"); - columnEntity.setAttrType(attrType); - - // 是否主键 - if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) { - tableEntity.setPk(columnEntity); - } - - columnList.add(columnEntity); - } - tableEntity.setColumns(columnList); - - // 没主键,则第一个字段为主键 - if (tableEntity.getPk() == null) { - tableEntity.setPk(tableEntity.getColumns().get(0)); - } - } - - /** - * 构建 TableEntity - * @param genConfig 用户输入相关 - * @param table 表元信息 - * @return TableEntity - */ - default TableEntity buildTableEntity(GenConfig genConfig, Map table) { - // 表信息 - TableEntity tableEntity = new TableEntity(); - tableEntity.setTableName(table.get("tableName")); - - if (StrUtil.isNotBlank(genConfig.getComments())) { - tableEntity.setComments(genConfig.getComments()); - } - else { - tableEntity.setComments(table.get("tableComment")); - } - - String tablePrefix; - if (StrUtil.isNotBlank(genConfig.getTablePrefix())) { - tablePrefix = genConfig.getTablePrefix(); - } - else { - tablePrefix = getConfig().getString("tablePrefix"); - } - // 表名转换成Java类名 - String className = tableToJava(tableEntity.getTableName(), tablePrefix); - tableEntity.setCaseClassName(className); - tableEntity.setLowerClassName(StringUtils.uncapitalize(className)); - - return tableEntity; - } - - /** - * 获取配置信息 - */ - default Configuration getConfig() { - try { - return new PropertiesConfiguration("generator.properties"); - } - catch (ConfigurationException e) { - throw new CheckedException("获取配置文件失败,", e); - } - } - - /** - * 表名转换成Java类名 - */ - default String tableToJava(String tableName, String tablePrefix) { - if (StringUtils.isNotBlank(tablePrefix)) { - tableName = tableName.replaceFirst(tablePrefix, ""); - } - return columnToJava(tableName); - } - - /** - * 列名转换成Java属性名 - */ - default String columnToJava(String columnName) { - return WordUtils.capitalizeFully(columnName, new char[] { '_' }).replace("_", ""); - } - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenDatasourceConfService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenDatasourceConfService.java index 5965b5b0..01ec1ce4 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenDatasourceConfService.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenDatasourceConfService.java @@ -1,17 +1,18 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.service; @@ -56,9 +57,9 @@ public interface GenDatasourceConfService extends IService { /** * 通过数据源名称删除 - * @param dsId 数据源ID + * @param dsIds 数据源ID * @return */ - Boolean removeByDsId(Long dsId); + Boolean removeByDsId(Long[] dsIds); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFieldTypeService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFieldTypeService.java new file mode 100644 index 00000000..9168cdde --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFieldTypeService.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.codegen.entity.GenFieldType; + +import java.util.Set; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:16:01 + */ +public interface GenFieldTypeService extends IService { + + /** + * 根据tableId,获取包列表 + * @param dsName 数据源名称 + * @param tableName 表名称 + * @return 返回包列表 + */ + Set getPackageByTableId(String dsName, String tableName); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFormConfService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFormConfService.java deleted file mode 100755 index 0b79b535..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenFormConfService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.codegen.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pig.codegen.entity.GenFormConf; - -/** - * 表单管理 - * - * @author lengleng - * @date 2019-08-12 15:55:35 - */ -public interface GenFormConfService extends IService { - - /** - * 获取表单信息 - * @param dsName 数据源ID - * @param tableName 表名称 - * @return - */ - String getForm(String dsName, String tableName); - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java new file mode 100644 index 00000000..555d1405 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; +import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.TemplateGroupDTO; + +/** + * 模板分组 + * + * @author PIG + * @date 2023-02-21 20:01:53 + */ +public interface GenGroupService extends IService { + + void saveGenGroup(TemplateGroupDTO genTemplateGroup); + + /** + * 删除分组关系 + * @param ids + */ + void delGroupAndTemplate(Long[] ids); + + /** + * 查询group数据 + * @param id + */ + GroupVo getGroupVoById(Long id); + + /** + * 更新group数据 + * @param groupVo + */ + void updateGroupAndTemplateById(GroupVo groupVo); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java new file mode 100644 index 00000000..812ab1ba --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; + +import java.util.List; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:16:01 + */ +public interface GenTableColumnService extends IService { + + /** + * 初始化字段列表 + * @param tableFieldList 表字段列表 + */ + void initFieldList(List tableFieldList); + + /** + * 更新表字段 + * @param dsName 数据源名称 + * @param tableName 表名称 + * @param tableFieldList 表字段列表 + */ + void updateTableField(String dsName, String tableName, List tableFieldList); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java new file mode 100644 index 00000000..0b41754d --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.codegen.entity.GenTable; + +import java.util.List; +import java.util.Map; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:34:55 + */ +public interface GenTableService extends IService { + + /** + * 获取默认配置信息 + * @return 默认配置信息 + */ + Map getGeneratorConfig(); + + /** + * 分页查询表格列表 + * @param page 分页对象 + * @param table 查询条件 + * @return 表格列表分页结果 + */ + IPage list(Page page, GenTable table); + + /** + * 根据数据源名称和表名查询或构建表格 + * @param dsName 数据源名称 + * @param tableName 表名 + * @return 查询到的表格信息 + */ + GenTable queryOrBuildTable(String dsName, String tableName); + + /** + * 查询指定数据源下的所有表格 + * @param dsName 数据源名称 + * @return 所有表格的列表 + */ + List> queryDsAllTable(String dsName); + + /** + * 查询指定数据源和表名的列信息 + * @param dsName 数据源名称 + * @param tableName 表名 + * @return 列信息列表 + */ + List> queryColumn(String dsName, String tableName); + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateGroupService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateGroupService.java new file mode 100644 index 00000000..d5241de8 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateGroupService.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.codegen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.codegen.entity.GenTemplateGroupEntity; + +/** + * 模板分组关联表 + * + * @author PIG + * @date 2023-02-22 09:25:15 + */ +public interface GenTemplateGroupService extends IService { + +} diff --git a/pig-visual/pig-codegen/src/main/resources/template/Service.java.vm b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java old mode 100755 new mode 100644 similarity index 79% rename from pig-visual/pig-codegen/src/main/resources/template/Service.java.vm rename to pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java index 5d808ef5..a465dc20 --- a/pig-visual/pig-codegen/src/main/resources/template/Service.java.vm +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java @@ -15,17 +15,17 @@ * Author: lengleng (wangiegie@gmail.com) */ -package ${package}.${moduleName}.service; +package com.pig4cloud.pig.codegen.service; import com.baomidou.mybatisplus.extension.service.IService; -import ${package}.${moduleName}.entity.${className}; +import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; /** - * ${comments} + * 模板 * - * @author ${author} - * @date ${datetime} + * @author PIG + * @date 2023-02-21 17:15:44 */ -public interface ${className}Service extends IService<${className}> { +public interface GenTemplateService extends IService { } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GeneratorService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GeneratorService.java index 380db098..675dc0c9 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GeneratorService.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GeneratorService.java @@ -1,27 +1,25 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.service; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pig.codegen.entity.GenConfig; - import java.util.List; import java.util.Map; +import java.util.zip.ZipOutputStream; /** * @author lengleng @@ -30,26 +28,23 @@ import java.util.Map; public interface GeneratorService { /** - * 生成代码 - * @param tableNames 表名称 - * @return + * 生成代码zip写出 + * @param tableId 表 + * @param zip 输出流 */ - byte[] generatorCode(GenConfig tableNames); + void downloadCode(Long tableId, ZipOutputStream zip); /** - * 分页查询表 - * @param page 分页信息 - * @param tableName 表名 - * @param name 数据源ID - * @return + * 预览代码 + * @param tableId 表 + * @return [{模板名称:渲染结果}] */ - IPage>> getPage(Page page, String tableName, String name); + List> preview(Long tableId); /** - * 预览代码 - * @param genConfig 查询条件 - * @return + * 目标目录写入渲染结果 + * @param tableId 表 */ - Map previewCode(GenConfig genConfig); + void generatorCode(Long tableId); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java index 8dc7da32..5b83efb2 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java @@ -1,35 +1,41 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; -import com.baomidou.dynamic.datasource.creator.DataSourceCreator; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; +import com.baomidou.dynamic.datasource.creator.druid.DruidConfig; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.codegen.entity.GenDatasourceConf; import com.pig4cloud.pig.codegen.mapper.GenDatasourceConfMapper; import com.pig4cloud.pig.codegen.service.GenDatasourceConfService; import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.datasource.enums.DsConfTypeEnum; +import com.pig4cloud.pig.common.datasource.enums.DsJdbcUrlEnum; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jasypt.encryption.StringEncryptor; import org.springframework.stereotype.Service; import javax.sql.DataSource; +import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -47,7 +53,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl dynamicRoutingDataSource.removeDataSource(ds.getName())); + this.baseMapper.deleteBatchIds(CollUtil.toList(dsIds)); return Boolean.TRUE; } @@ -119,10 +126,14 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl + implements GenFieldTypeService { + + /** + * 根据tableId,获取包列表 + * @param dsName 数据源名称 + * @param tableName 表名称 + * @return 返回包列表 + */ + @Override + public Set getPackageByTableId(String dsName, String tableName) { + Set importList = baseMapper.getPackageByTableId(dsName, tableName); + return importList.stream().filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenFormConfServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenFormConfServiceImpl.java deleted file mode 100755 index a7d150e5..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenFormConfServiceImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.pig4cloud.pig.codegen.service.impl; - -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pig.codegen.entity.ColumnEntity; -import com.pig4cloud.pig.codegen.entity.GenFormConf; -import com.pig4cloud.pig.codegen.mapper.GenFormConfMapper; -import com.pig4cloud.pig.codegen.mapper.GeneratorMapper; -import com.pig4cloud.pig.codegen.service.GenCodeService; -import com.pig4cloud.pig.codegen.service.GenFormConfService; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.apache.commons.lang.StringUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; -import org.springframework.stereotype.Service; - -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * 表单管理 - * - * @author lengleng - * @date 2019-08-12 15:55:35 - */ -@Service -@RequiredArgsConstructor -public class GenFormConfServiceImpl extends ServiceImpl implements GenFormConfService { - - private final GeneratorMapper generatorMapper; - - private final GenCodeService avue; - - /** - * 1. 根据数据源、表名称,查询已配置表单信息 2. 不存在调用模板生成 - * @param dsName 数据源ID - * @param tableName 表名称 - * @return - */ - @Override - @SneakyThrows - public String getForm(String dsName, String tableName) { - GenFormConf form = getOne(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, tableName) - .orderByDesc(GenFormConf::getCreateTime), false); - - if (form != null) { - return form.getFormInfo(); - } - - List> columns = generatorMapper.queryColumns(tableName, dsName); - // 设置velocity资源加载器 - Properties prop = new Properties(); - prop.put("file.resource.loader.class", ClasspathResourceLoader.class.getName()); - Velocity.init(prop); - Template template = Velocity.getTemplate("template/avue/crud.js.vm", CharsetUtil.UTF_8); - VelocityContext context = new VelocityContext(); - - List columnList = new ArrayList<>(); - for (Map column : columns) { - ColumnEntity columnEntity = new ColumnEntity(); - columnEntity.setComments(column.get("columnComment")); - columnEntity.setLowerAttrName(StringUtils.uncapitalize(avue.columnToJava(column.get("columnName")))); - columnList.add(columnEntity); - } - context.put("columns", columnList); - StringWriter writer = new StringWriter(); - template.merge(context, writer); - return StrUtil.trim(StrUtil.removePrefix(writer.toString(), "export const tableOption =")); - } - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenGroupServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenGroupServiceImpl.java new file mode 100644 index 00000000..6e92bf76 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenGroupServiceImpl.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pig.codegen.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; +import com.pig4cloud.pig.codegen.entity.GenTemplateGroupEntity; +import com.pig4cloud.pig.codegen.mapper.GenGroupMapper; +import com.pig4cloud.pig.codegen.service.GenGroupService; +import com.pig4cloud.pig.codegen.service.GenTemplateGroupService; +import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.TemplateGroupDTO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.LinkedList; +import java.util.List; + +/** + * 模板分组 + * + * @author PIG + * @date 2023-02-21 20:01:53 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GenGroupServiceImpl extends ServiceImpl implements GenGroupService { + + private final GenTemplateGroupService genTemplateGroupService; + + /** + * 新增模板分组 + * @param genTemplateGroup + */ + @Override + public void saveGenGroup(TemplateGroupDTO genTemplateGroup) { + // 1.保存group + GenGroupEntity groupEntity = new GenGroupEntity(); + BeanUtil.copyProperties(genTemplateGroup, groupEntity); + baseMapper.insert(groupEntity); + // 2.保存关系 + List goals = new LinkedList<>(); + for (Long TemplateId : genTemplateGroup.getTemplateId()) { + GenTemplateGroupEntity templateGroup = new GenTemplateGroupEntity(); + templateGroup.setTemplateId(TemplateId).setGroupId(groupEntity.getId()); + goals.add(templateGroup); + } + genTemplateGroupService.saveBatch(goals); + + } + + /** + * 按照ids删除 + * @param ids groupIds + */ + @Override + public void delGroupAndTemplate(Long[] ids) { + // 删除分组 + this.removeBatchByIds(CollUtil.toList(ids)); + // 删除关系 + genTemplateGroupService + .remove(Wrappers.lambdaQuery().in(GenTemplateGroupEntity::getGroupId, ids)); + } + + /** + * 按照id查询 + * @param id + * @return + */ + @Override + public GroupVo getGroupVoById(Long id) { + return baseMapper.getGroupVoById(id); + } + + /** + * 根据id更新 + * @param groupVo + */ + @Override + public void updateGroupAndTemplateById(GroupVo groupVo) { + // 1.更新自身 + GenGroupEntity groupEntity = new GenGroupEntity(); + BeanUtil.copyProperties(groupVo, groupEntity); + this.updateById(groupEntity); + // 2.更新模板 + // 2.1根据id删除之前的模板 + genTemplateGroupService.remove( + Wrappers.lambdaQuery().eq(GenTemplateGroupEntity::getGroupId, groupVo.getId())); + // 2.2根据ids创建新的模板分组赋值 + List goals = new LinkedList<>(); + for (Long templateId : groupVo.getTemplateId()) { + goals.add(new GenTemplateGroupEntity().setGroupId(groupVo.getId()).setTemplateId(templateId)); + } + genTemplateGroupService.saveBatch(goals); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableColumnServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableColumnServiceImpl.java new file mode 100644 index 00000000..57644d97 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableColumnServiceImpl.java @@ -0,0 +1,88 @@ +package com.pig4cloud.pig.codegen.service.impl; + +import cn.hutool.core.text.NamingCase; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.codegen.entity.GenFieldType; +import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; +import com.pig4cloud.pig.codegen.mapper.GenFieldTypeMapper; +import com.pig4cloud.pig.codegen.mapper.GenTableColumnMapper; +import com.pig4cloud.pig.codegen.service.GenTableColumnService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 表字段信息管理 + * + * @author lengleng + * @date 2020/5/18 + */ +@Service +@RequiredArgsConstructor +public class GenTableColumnServiceImpl extends ServiceImpl + implements GenTableColumnService { + + private final GenFieldTypeMapper fieldTypeMapper; + + /** + * 初始化表单字段列表,主要是将数据库表中的字段转化为表单需要的字段数据格式,并为审计字段排序 + * @param tableFieldList 表单字段列表 + */ + public void initFieldList(List tableFieldList) { + // 字段类型、属性类型映射 + List list = fieldTypeMapper.selectList(Wrappers.emptyWrapper()); + Map fieldTypeMap = new LinkedHashMap<>(list.size()); + list.forEach( + fieldTypeMapping -> fieldTypeMap.put(fieldTypeMapping.getColumnType().toLowerCase(), fieldTypeMapping)); + + // 索引计数器 + AtomicInteger index = new AtomicInteger(0); + tableFieldList.forEach(field -> { + // 将字段名转化为驼峰格式 + field.setAttrName(NamingCase.toCamelCase(field.getFieldName())); + + // 获取字段对应的类型 + GenFieldType fieldTypeMapping = fieldTypeMap.getOrDefault(field.getFieldType().toLowerCase(), null); + if (fieldTypeMapping == null) { + // 没找到对应的类型,则为Object类型 + field.setAttrType("Object"); + } + else { + field.setAttrType(fieldTypeMapping.getAttrType()); + field.setPackageName(fieldTypeMapping.getPackageName()); + } + + // 设置查询类型和表单查询类型都为“=” + field.setQueryType("="); + field.setQueryFormType("text"); + + // 设置表单类型为文本框类型 + field.setFormType("text"); + + // 保证审计字段最后显示 + field.setSort(Objects.isNull(field.getSort()) ? index.getAndIncrement() : field.getSort()); + }); + } + + /** + * 更新指定数据源和表名的表单字段信息 + * @param dsName 数据源名称 + * @param tableName 表名 + * @param tableFieldList 表单字段列表 + */ + @Override + public void updateTableField(String dsName, String tableName, List tableFieldList) { + AtomicInteger sort = new AtomicInteger(); + this.updateBatchById(tableFieldList.stream() + .peek(field -> field.setSort(sort.getAndIncrement())) + .collect(Collectors.toList())); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java new file mode 100644 index 00000000..59b72c5a --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pig.codegen.service.impl; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.text.NamingCase; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; +import com.pig4cloud.pig.codegen.entity.GenTable; +import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; +import com.pig4cloud.pig.codegen.mapper.GenTableMapper; +import com.pig4cloud.pig.codegen.mapper.GeneratorMapper; +import com.pig4cloud.pig.codegen.service.GenGroupService; +import com.pig4cloud.pig.codegen.service.GenTableColumnService; +import com.pig4cloud.pig.codegen.service.GenTableService; +import com.pig4cloud.pig.codegen.util.CommonColumnFiledEnum; +import com.pig4cloud.pig.codegen.util.GenKit; +import com.pig4cloud.pig.codegen.util.GeneratorFileTypeEnum; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 列属性 + * + * @author pigx code generator + * @date 2023-02-06 20:34:55 + */ +@Service +@RequiredArgsConstructor +public class GenTableServiceImpl extends ServiceImpl implements GenTableService { + + /** + * 默认配置信息 + */ + private static final String CONFIG_PATH = "template/config.json"; + + private final GenTableColumnService columnService; + + private final GenGroupService genGroupService; + + /** + * 获取配置信息 + * @return + */ + @Override + public Map getGeneratorConfig() { + ClassPathResource classPathResource = new ClassPathResource(CONFIG_PATH); + JSONObject jsonObject = JSONUtil.parseObj(IoUtil.readUtf8(classPathResource.getStream())); + return jsonObject.getRaw(); + } + + @Override + public List> queryDsAllTable(String dsName) { + GeneratorMapper mapper = GenKit.getMapper(dsName); + // 手动切换数据源 + DynamicDataSourceContextHolder.push(dsName); + return mapper.queryTable(); + } + + @Override + public List> queryColumn(String dsName, String tableName) { + GeneratorMapper mapper = GenKit.getMapper(dsName); + return mapper.selectMapTableColumn(tableName, dsName); + } + + @Override + public IPage list(Page page, GenTable table) { + GeneratorMapper mapper = GenKit.getMapper(table.getDsName()); + // 手动切换数据源 + DynamicDataSourceContextHolder.push(table.getDsName()); + return mapper.queryTable(page, table.getTableName()); + } + + /** + * 获取表信息 + * @param dsName + * @param tableName + * @return + */ + @Override + public GenTable queryOrBuildTable(String dsName, String tableName) { + GenTable genTable = baseMapper.selectOne( + Wrappers.lambdaQuery().eq(GenTable::getTableName, tableName).eq(GenTable::getDsName, dsName)); + // 如果 genTable 为空, 执行导入 + if (Objects.isNull(genTable)) { + genTable = this.tableImport(dsName, tableName); + } + + List fieldList = columnService.list(Wrappers.lambdaQuery() + .eq(GenTableColumnEntity::getDsName, dsName) + .eq(GenTableColumnEntity::getTableName, tableName) + .orderByAsc(GenTableColumnEntity::getSort)); + genTable.setFieldList(fieldList); + + // 查询模板分组信息 + List groupEntities = genGroupService.list(); + genTable.setGroupList(groupEntities); + return genTable; + } + + @Transactional(rollbackFor = Exception.class) + public GenTable tableImport(String dsName, String tableName) { + GeneratorMapper mapper = GenKit.getMapper(dsName); + // 手动切换数据源 + DynamicDataSourceContextHolder.push(dsName); + + // 查询表是否存在 + GenTable table = new GenTable(); + + // 从数据库获取表信息 + Map queryTable = mapper.queryTable(tableName, dsName); + + // 获取默认表配置信息 () + Map generatorConfig = getGeneratorConfig(); + JSONObject project = (JSONObject) generatorConfig.get("project"); + JSONObject developer = (JSONObject) generatorConfig.get("developer"); + + table.setPackageName(project.getStr("packageName")); + table.setVersion(project.getStr("version")); + table.setBackendPath(project.getStr("backendPath")); + table.setFrontendPath(project.getStr("frontendPath")); + table.setAuthor(developer.getStr("author")); + table.setEmail(developer.getStr("email")); + table.setTableName(tableName); + table.setDsName(dsName); + table.setTableComment(MapUtil.getStr(queryTable, "tableComment")); + table.setDbType(MapUtil.getStr(queryTable, "dbType")); + table.setFormLayout(2); + table.setGeneratorType(GeneratorFileTypeEnum.ZIP.ordinal()); + table.setClassName(NamingCase.toPascalCase(tableName)); + table.setModuleName(GenKit.getModuleName(table.getPackageName())); + table.setFunctionName(GenKit.getFunctionName(tableName)); + table.setCreateTime(LocalDateTime.now()); + this.save(table); + + // 获取原生字段数据 + List> queryColumnList = mapper.selectMapTableColumn(tableName, dsName); + List tableFieldList = new ArrayList<>(); + + for (Map columnMap : queryColumnList) { + String columnName = MapUtil.getStr(columnMap, "columnName"); + GenTableColumnEntity genTableColumnEntity = new GenTableColumnEntity(); + genTableColumnEntity.setTableName(tableName); + genTableColumnEntity.setDsName(dsName); + genTableColumnEntity.setFieldName(MapUtil.getStr(columnMap, "columnName")); + genTableColumnEntity.setFieldComment(MapUtil.getStr(columnMap, "comments")); + genTableColumnEntity.setFieldType(MapUtil.getStr(columnMap, "dataType")); + String columnKey = MapUtil.getStr(columnMap, "columnKey"); + genTableColumnEntity.setPrimaryPk(StringUtils.isNotBlank(columnKey) && "PRI".equalsIgnoreCase(columnKey)); + genTableColumnEntity.setAutoFill("DEFAULT"); + genTableColumnEntity.setFormItem(true); + genTableColumnEntity.setGridItem(true); + + // 审计字段处理 + if (EnumUtil.contains(CommonColumnFiledEnum.class, columnName)) { + CommonColumnFiledEnum commonColumnFiledEnum = CommonColumnFiledEnum.valueOf(columnName); + genTableColumnEntity.setFormItem(commonColumnFiledEnum.getFormItem()); + genTableColumnEntity.setGridItem(commonColumnFiledEnum.getGridItem()); + genTableColumnEntity.setAutoFill(commonColumnFiledEnum.getAutoFill()); + genTableColumnEntity.setSort(commonColumnFiledEnum.getSort()); + } + tableFieldList.add(genTableColumnEntity); + } + // 初始化字段数据 + columnService.initFieldList(tableFieldList); + // 保存列数据 + columnService.saveOrUpdateBatch(tableFieldList); + table.setFieldList(tableFieldList); + return table; + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateGroupServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateGroupServiceImpl.java new file mode 100644 index 00000000..e360d0d2 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateGroupServiceImpl.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pig.codegen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.codegen.entity.GenTemplateGroupEntity; +import com.pig4cloud.pig.codegen.mapper.GenTemplateGroupMapper; +import com.pig4cloud.pig.codegen.service.GenTemplateGroupService; +import org.springframework.stereotype.Service; + +/** + * 模板分组关联表 + * + * @author PIG + * @date 2023-02-22 09:25:15 + */ +@Service +public class GenTemplateGroupServiceImpl extends ServiceImpl + implements GenTemplateGroupService { + +} diff --git a/pig-visual/pig-codegen/src/main/resources/template/ServiceImpl.java.vm b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java old mode 100755 new mode 100644 similarity index 69% rename from pig-visual/pig-codegen/src/main/resources/template/ServiceImpl.java.vm rename to pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java index bce38eee..45d4f4d6 --- a/pig-visual/pig-codegen/src/main/resources/template/ServiceImpl.java.vm +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java @@ -14,21 +14,22 @@ * this software without specific prior written permission. * Author: lengleng (wangiegie@gmail.com) */ -package ${package}.${moduleName}.service.impl; +package com.pig4cloud.pig.codegen.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import ${package}.${moduleName}.entity.${className}; -import ${package}.${moduleName}.mapper.${className}Mapper; -import ${package}.${moduleName}.service.${className}Service; +import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import com.pig4cloud.pig.codegen.mapper.GenTemplateMapper; +import com.pig4cloud.pig.codegen.service.GenTemplateService; import org.springframework.stereotype.Service; /** - * ${comments} + * 模板 * - * @author ${author} - * @date ${datetime} + * @author PIG + * @date 2023-02-21 11:08:43 */ @Service -public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements ${className}Service { +public class GenTemplateServiceImpl extends ServiceImpl + implements GenTemplateService { } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java index 9d65392a..7876c094 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java @@ -1,42 +1,46 @@ /* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * Copyright (c) 2018-2025, lengleng All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) */ package com.pig4cloud.pig.codegen.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pig.codegen.entity.GenConfig; -import com.pig4cloud.pig.codegen.entity.GenFormConf; -import com.pig4cloud.pig.codegen.mapper.GenFormConfMapper; -import com.pig4cloud.pig.codegen.mapper.GeneratorMapper; -import com.pig4cloud.pig.codegen.service.GenCodeService; -import com.pig4cloud.pig.codegen.service.GeneratorService; -import com.pig4cloud.pig.codegen.support.StyleTypeEnum; +import cn.hutool.json.JSONObject; +import com.pig4cloud.pig.codegen.entity.GenTable; +import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; +import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import com.pig4cloud.pig.codegen.service.*; +import com.pig4cloud.pig.codegen.util.VelocityKit; +import com.pig4cloud.pig.codegen.util.vo.GroupVo; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.io.ByteArrayOutputStream; +import java.io.File; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** @@ -45,99 +49,206 @@ import java.util.zip.ZipOutputStream; *

* 代码生成器 */ +@Slf4j @Service @RequiredArgsConstructor public class GeneratorServiceImpl implements GeneratorService { - private final GeneratorMapper generatorMapper; + private final GenTableColumnService columnService; + + private final GenFieldTypeService fieldTypeService; - private final GenFormConfMapper genFormConfMapper; + private final GenTableService tableService; - private final Map genCodeServiceMap; + private final GenGroupService genGroupService; + + private final GenTemplateService genTemplateService; /** - * 分页查询表 - * @param tableName 查询条件 - * @param dsName - * @return + * 生成代码zip写出 + * @param tableId 表 + * @param zip 输出流 */ @Override - @DS("#last") - public IPage>> getPage(Page page, String tableName, String dsName) { - page.setOptimizeCountSql(false); - return generatorMapper.queryList(page, tableName); + @SneakyThrows + public void downloadCode(Long tableId, ZipOutputStream zip) { + // 数据模型 + Map dataModel = getDataModel(tableId); + + Long style = (Long) dataModel.get("style"); + + GroupVo groupVo = genGroupService.getGroupVoById(style); + List templateList = groupVo.getTemplateList(); + + Map generatorConfig = tableService.getGeneratorConfig(); + JSONObject project = (JSONObject) generatorConfig.get("project"); + String frontendPath = project.getStr("frontendPath"); + String backendPath = project.getStr("backendPath"); + + for (GenTemplateEntity template : templateList) { + String templateCode = template.getTemplateCode(); + String generatorPath = template.getGeneratorPath(); + + dataModel.put("frontendPath", frontendPath); + dataModel.put("backendPath", backendPath); + String content = VelocityKit.renderStr(templateCode, dataModel); + String path = VelocityKit.renderStr(generatorPath, dataModel); + + // 添加到zip + zip.putNextEntry(new ZipEntry(path)); + IoUtil.writeUtf8(zip, false, content); + zip.flush(); + zip.closeEntry(); + } + } /** - * 预览代码 - * @param genConfig 查询条件 - * @return + * 表达式优化的预览代码方法 + * @param tableId 表 + * @return [{模板名称:渲染结果}] */ @Override - public Map previewCode(GenConfig genConfig) { - // 根据tableName 查询最新的表单配置 - List formConfList = genFormConfMapper.selectList(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, genConfig.getTableName()) - .orderByDesc(GenFormConf::getCreateTime)); - - String tableNames = genConfig.getTableName(); - String dsName = genConfig.getDsName(); - - // 获取实现 - GenCodeService genCodeService = genCodeServiceMap.get(StyleTypeEnum.getDecs(genConfig.getStyle())); - - for (String tableName : StrUtil.split(tableNames, StrUtil.DASHED)) { - // 查询表信息 - Map table = generatorMapper.queryTable(tableName, dsName); - // 查询列信息 - List> columns = generatorMapper.queryColumns(tableName, dsName); - // 生成代码 - if (CollUtil.isNotEmpty(formConfList)) { - return genCodeService.gen(genConfig, table, columns, null, formConfList.get(0)); - } - else { - return genCodeService.gen(genConfig, table, columns, null, null); - } - } - - return MapUtil.empty(); + @SneakyThrows + public List> preview(Long tableId) { + // 数据模型 + Map dataModel = getDataModel(tableId); + + Long style = (Long) dataModel.get("style"); + + // 获取模板列表,Lambda 表达式简化代码 + List templateList = genGroupService.getGroupVoById(style).getTemplateList(); + + Map generatorConfig = tableService.getGeneratorConfig(); + JSONObject project = (JSONObject) generatorConfig.get("project"); + String frontendPath = project.getStr("frontendPath"); + String backendPath = project.getStr("backendPath"); + + return templateList.stream().map(template -> { + String templateCode = template.getTemplateCode(); + String generatorPath = template.getGeneratorPath(); + + // 预览模式下, 使用相对路径展示 + dataModel.put("frontendPath", frontendPath); + dataModel.put("backendPath", backendPath); + String content = VelocityKit.renderStr(templateCode, dataModel); + String path = VelocityKit.renderStr(generatorPath, dataModel); + + // 使用 map 简化代码 + return new HashMap(4) { + { + put("code", content); + put("codePath", path); + } + }; + }).collect(Collectors.toList()); } /** - * 生成代码 - * @param genConfig 生成配置 - * @return + * 目标目录写入渲染结果方法 + * @param tableId 表 */ @Override - public byte[] generatorCode(GenConfig genConfig) { - // 根据tableName 查询最新的表单配置 - List formConfList = genFormConfMapper.selectList(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, genConfig.getTableName()) - .orderByDesc(GenFormConf::getCreateTime)); - - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipOutputStream zip = new ZipOutputStream(outputStream); - - String tableNames = genConfig.getTableName(); - String dsName = genConfig.getDsName(); - - GenCodeService genCodeService = genCodeServiceMap.get(StyleTypeEnum.getDecs(genConfig.getStyle())); - - for (String tableName : StrUtil.split(tableNames, StrUtil.DASHED)) { - // 查询表信息 - Map table = generatorMapper.queryTable(tableName, dsName); - // 查询列信息 - List> columns = generatorMapper.queryColumns(tableName, dsName); - // 生成代码 - if (CollUtil.isNotEmpty(formConfList)) { - genCodeService.gen(genConfig, table, columns, zip, formConfList.get(0)); - } - else { - genCodeService.gen(genConfig, table, columns, zip, null); - } + public void generatorCode(Long tableId) { + // 数据模型 + Map dataModel = getDataModel(tableId); + Long style = (Long) dataModel.get("style"); + + // 获取模板列表,Lambda 表达式简化代码 + List templateList = genGroupService.getGroupVoById(style).getTemplateList(); + + templateList.forEach(template -> { + String templateCode = template.getTemplateCode(); + String generatorPath = template.getGeneratorPath(); + String content = VelocityKit.renderStr(templateCode, dataModel); + String path = VelocityKit.renderStr(generatorPath, dataModel); + FileUtil.writeUtf8String(content, path); + }); + } + + /** + * 通过 Lambda 表达式优化的获取数据模型方法 + * @param tableId 表格 ID + * @return 数据模型 Map 对象 + */ + private Map getDataModel(Long tableId) { + // 获取表格信息 + GenTable table = tableService.getById(tableId); + // 获取字段列表 + List fieldList = columnService.lambdaQuery() + .eq(GenTableColumnEntity::getDsName, table.getDsName()) + .eq(GenTableColumnEntity::getTableName, table.getTableName()) + .orderByAsc(GenTableColumnEntity::getSort) + .list(); + + table.setFieldList(fieldList); + + // 创建数据模型对象 + Map dataModel = new HashMap<>(); + + // 填充数据模型 + dataModel.put("dbType", table.getDbType()); + dataModel.put("package", table.getPackageName()); + dataModel.put("packagePath", table.getPackageName().replace(".", File.separator)); + dataModel.put("version", table.getVersion()); + dataModel.put("moduleName", table.getModuleName()); + dataModel.put("ModuleName", StrUtil.upperFirst(table.getModuleName())); + dataModel.put("functionName", table.getFunctionName()); + dataModel.put("FunctionName", StrUtil.upperFirst(table.getFunctionName())); + dataModel.put("formLayout", table.getFormLayout()); + dataModel.put("style", table.getStyle()); + dataModel.put("author", table.getAuthor()); + dataModel.put("datetime", DateUtil.now()); + dataModel.put("date", DateUtil.today()); + setFieldTypeList(dataModel, table); + + // 获取导入的包列表 + Set importList = fieldTypeService.getPackageByTableId(table.getDsName(), table.getTableName()); + dataModel.put("importList", importList); + dataModel.put("tableName", table.getTableName()); + dataModel.put("tableComment", table.getTableComment()); + dataModel.put("className", StrUtil.lowerFirst(table.getClassName())); + dataModel.put("ClassName", table.getClassName()); + dataModel.put("fieldList", table.getFieldList()); + + dataModel.put("backendPath", table.getBackendPath()); + dataModel.put("frontendPath", table.getFrontendPath()); + return dataModel; + } + + /** + * 将表字段按照类型分组并存储到数据模型中 + * @param dataModel 存储数据的 Map 对象 + * @param table 表信息对象 + */ + private void setFieldTypeList(Map dataModel, GenTable table) { + // 按字段类型分组,使用 Map 存储不同类型的字段列表 + Map> typeMap = table.getFieldList() + .stream() + .collect(Collectors.partitioningBy(GenTableColumnEntity::isPrimaryPk)); + + // 从分组后的 Map 中获取不同类型的字段列表 + List primaryList = typeMap.get(true); + List formList = typeMap.get(false) + .stream() + .filter(GenTableColumnEntity::isFormItem) + .collect(Collectors.toList()); + List gridList = typeMap.get(false) + .stream() + .filter(GenTableColumnEntity::isGridItem) + .collect(Collectors.toList()); + List queryList = typeMap.get(false) + .stream() + .filter(GenTableColumnEntity::isQueryItem) + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(primaryList)) { + dataModel.put("pk", primaryList.get(0)); } - IoUtil.close(zip); - return outputStream.toByteArray(); + dataModel.put("primaryList", primaryList); + dataModel.put("formList", formList); + dataModel.put("gridList", gridList); + dataModel.put("queryList", queryList); } } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/AvueGenCodeServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/AvueGenCodeServiceImpl.java deleted file mode 100644 index d7865f71..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/AvueGenCodeServiceImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.pig4cloud.pig.codegen.service.impl.temp; - -import cn.hutool.core.io.IoUtil; -import com.pig4cloud.pig.codegen.entity.GenConfig; -import com.pig4cloud.pig.codegen.entity.GenFormConf; -import com.pig4cloud.pig.codegen.entity.TableEntity; -import com.pig4cloud.pig.codegen.service.GenCodeService; -import com.pig4cloud.pig.common.core.constant.CommonConstants; -import lombok.SneakyThrows; -import org.springframework.stereotype.Service; - -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * @author Fxz - * @date 2022/7/21 02:45 - */ -@Service("avue") -public class AvueGenCodeServiceImpl implements GenCodeService { - - public final String CRUD_PREFIX = "export const tableOption ="; - - /** - * 注入支持的模板列表 - * @param config 用户输入 - * @return ListString - */ - @Override - public List getTemplates(GenConfig config) { - List templates = GenCodeService.super.getTemplates(config); - templates.add("template/avue/index.vue.vm"); - templates.add("template/avue/crud.js.vm"); - templates.add("template/avue/api.js.vm"); - return templates; - } - - /** - * 获取文件名 - * @param template - * @param className - * @param packageName - * @param moduleName - */ - @Override - public String getFileName(String template, String className, String packageName, String moduleName) { - if (template.contains("avue/index.vue.vm")) { - return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views" - + File.separator + moduleName + File.separator + className.toLowerCase() + File.separator - + "index.vue"; - } - - if (template.contains("avue/api.js.vm")) { - return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "api" + File.separator - + className.toLowerCase() + ".js"; - } - - if (template.contains("avue/crud.js.vm")) { - return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "const" - + File.separator + "crud" + File.separator + className.toLowerCase() + ".js"; - } - - return GenCodeService.super.getFileName(template, className, packageName, moduleName); - } - - /** - * 渲染数据 - * @param genConfig 用户输入相关 - * @param zip 输出zip流 - * @param tableEntity 表格实体 - * @param map 参数集合 - * @param formConf 表单设计 - * @return - */ - @SneakyThrows - public Map renderData(GenConfig genConfig, ZipOutputStream zip, TableEntity tableEntity, - Map map, GenFormConf formConf) { - - Map resultMap = new HashMap<>(); - - if (Objects.nonNull(formConf)) { - // 存在 curd 存在设计好的JSON 则使用Json 覆盖 - String crudTempName = "template/avue/crud.js.vm"; - String fileName = getFileName(crudTempName, tableEntity.getCaseClassName(), map.get("package").toString(), - map.get("moduleName").toString()); - String contents = CRUD_PREFIX + formConf.getFormInfo(); - - if (zip != null) { - zip.putNextEntry(new ZipEntry(Objects.requireNonNull(fileName))); - IoUtil.write(zip, StandardCharsets.UTF_8, false, contents); - zip.closeEntry(); - } - resultMap.putAll(GenCodeService.super.renderData(genConfig, zip, tableEntity, map, formConf)); - resultMap.put(crudTempName, contents); - return resultMap; - } - return GenCodeService.super.renderData(genConfig, zip, tableEntity, map, formConf); - } - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/EleGenCodeServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/EleGenCodeServiceImpl.java deleted file mode 100644 index 680f0406..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/temp/EleGenCodeServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pig4cloud.pig.codegen.service.impl.temp; - -import com.pig4cloud.pig.codegen.entity.GenConfig; -import com.pig4cloud.pig.codegen.service.GenCodeService; -import com.pig4cloud.pig.common.core.constant.CommonConstants; -import org.springframework.stereotype.Service; - -import java.io.File; -import java.util.List; - -/** - * @author Fxz - * @date 2022/7/21 02:46 - */ -@Service("element") -public class EleGenCodeServiceImpl implements GenCodeService { - - /** - * 注入支持的模板列表 - * @param config 用户输入 - * @return ListString - */ - @Override - public List getTemplates(GenConfig config) { - List templates = GenCodeService.super.getTemplates(config); - templates.add("template/element/index.vue.vm"); - templates.add("template/element/form.vue.vm"); - templates.add("template/avue/api.js.vm"); - return templates; - } - - /** - * 获取文件名 - * @param template - * @param className - * @param packageName - * @param moduleName - */ - @Override - public String getFileName(String template, String className, String packageName, String moduleName) { - if (template.contains("element/index.vue.vm")) { - return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views" - + File.separator + moduleName + File.separator + className.toLowerCase() + File.separator - + "index.vue"; - } - - if (template.contains("element/form.vue.vm")) { - return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views" - + File.separator + moduleName + File.separator + className.toLowerCase() + File.separator - + className.toLowerCase() + "-form.vue"; - } - - if (template.contains("avue/api.js.vm")) { - return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "api" + File.separator - + className.toLowerCase() + ".js"; - } - - return GenCodeService.super.getFileName(template, className, packageName, moduleName); - } - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java deleted file mode 100644 index 3de92f7c..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pig4cloud.pig.codegen.support; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * @author lengleng - * @date 2021/7/31 - *

- * 代码生成风格 - */ -@Getter -@AllArgsConstructor -public enum StyleTypeEnum { - - /** - * 前端类型-avue 风格 - */ - AVUE("0", "avue"), - - /** - * 前端类型-element 风格 - */ - ELEMENT("1", "element"); - - /** - * 类型 - */ - private String style; - - /** - * 描述 - */ - private String description; - - public static String getDecs(String style) { - return Arrays.stream(StyleTypeEnum.values()) - .filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style)) - .findFirst() - .orElse(ELEMENT) - .getDescription(); - } - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java new file mode 100644 index 00000000..47cdd843 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java @@ -0,0 +1,62 @@ +package com.pig4cloud.pig.codegen.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2023/3/12 + *

+ * 通用字段的填充策略和显示策略 + */ +@Getter +@AllArgsConstructor +public enum CommonColumnFiledEnum { + + /** + * create_by 字段 + */ + create_by(false, false, "INSERT", 100), + + /** + * create_time 字段 + */ + create_time(false, false, "INSERT", 101), + /** + * update_by 字段 + */ + update_by(false, false, "INSERT_UPDATE", 102), + /** + * update_time 字段 + */ + update_time(false, false, "INSERT_UPDATE", 103), + /** + * del_flag 字段 + */ + del_flag(false, false, "DEFAULT", 104), + /** + * tenant_id 字段 + */ + tenant_id(false, false, "DEFAULT", 105); + + /** + * 表单是否默认显示 + */ + private Boolean formItem; + + /** + * 表格是否默认显示 + */ + private Boolean gridItem; + + /** + * 自动填充策略 + */ + private String autoFill; + + /** + * 排序值 + */ + private Integer sort; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/DictTool.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/DictTool.java new file mode 100644 index 00000000..50eaefb1 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/DictTool.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pig.codegen.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.HashSet; +import java.util.List; + +/** + * @author lengleng + * @date 2023/2/7 + */ +public class DictTool { + + /** + * 将字段列表转换为带有双引号的逗号分隔的字符串 + * @return 带有双引号的逗号分隔的字符串 + */ + public static String quotation(List fields) { + + return CollUtil.join(new HashSet<>(fields), StrUtil.COMMA, s -> String.format("'%s'", s)); + } + + /** + * 将字段列表转换为逗号分隔的字符串 + * @return 逗号分隔的字符串 + */ + public static String format(List fields) { + return CollUtil.join(new HashSet<>(fields), StrUtil.COMMA); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java new file mode 100644 index 00000000..057c4165 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java @@ -0,0 +1,75 @@ +package com.pig4cloud.pig.codegen.util; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pig.codegen.entity.GenDatasourceConf; +import com.pig4cloud.pig.codegen.mapper.GenDatasourceConfMapper; +import com.pig4cloud.pig.codegen.mapper.GeneratorMapper; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.datasource.enums.DsJdbcUrlEnum; +import lombok.experimental.UtilityClass; +import org.springframework.context.ApplicationContext; + +import java.util.Map; + +/** + * 代码生成工具类 + * + * @author lengleng + * @date 2023/2/16 + */ +@UtilityClass +public class GenKit { + + /** + * 获取功能名 sys_a_b sysAb + * @param tableName 表名 + * @return 功能名 + */ + public String getFunctionName(String tableName) { + return StrUtil.toCamelCase(tableName); + } + + /** + * 获取模块名称 + * @param packageName 包名 + * @return 功能名 + */ + public String getModuleName(String packageName) { + return StrUtil.subAfter(packageName, ".", true); + } + + /** + * 获取数据源对应方言的mapper + * @param dsName 数据源名称 + * @return GeneratorMapper + */ + public GeneratorMapper getMapper(String dsName) { + // 获取目标数据源数据库类型 + GenDatasourceConfMapper datasourceConfMapper = SpringContextHolder.getBean(GenDatasourceConfMapper.class); + GenDatasourceConf datasourceConf = datasourceConfMapper + .selectOne(Wrappers.lambdaQuery().eq(GenDatasourceConf::getName, dsName)); + + String dbConfType; + // 默认MYSQL 数据源 + if (datasourceConf == null) { + dbConfType = DsJdbcUrlEnum.MYSQL.getDbName(); + } + else { + dbConfType = datasourceConf.getDsType(); + } + // 获取全部数据实现 + ApplicationContext context = SpringContextHolder.getApplicationContext(); + Map beansOfType = context.getBeansOfType(GeneratorMapper.class); + + // 根据数据类型选择mapper + for (String key : beansOfType.keySet()) { + if (StrUtil.containsIgnoreCase(key, dbConfType)) { + return beansOfType.get(key); + } + } + + throw new IllegalArgumentException("dsName 不合法: " + dsName); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorFileTypeEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorFileTypeEnum.java new file mode 100644 index 00000000..dc744e79 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorFileTypeEnum.java @@ -0,0 +1,14 @@ +package com.pig4cloud.pig.codegen.util; + +public enum GeneratorFileTypeEnum { + + /** + * zip + */ + ZIP, + /** + * 目录直接写入 + */ + DIRECTORY; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/NamingCaseTool.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/NamingCaseTool.java new file mode 100644 index 00000000..afdd446d --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/NamingCaseTool.java @@ -0,0 +1,35 @@ +package com.pig4cloud.pig.codegen.util; + +import cn.hutool.core.text.NamingCase; + +/** + * 命名规则处理,针对驼峰,下划线等处理 + * + * @author lengleng + * @date 2023/1/31 + */ +public class NamingCaseTool { + + /** + * 传入字段获取的get方法 + * @param in 字段名称 + * @return + */ + public static String getProperty(String in) { + return String.format("get%s", NamingCase.toPascalCase(in)); + } + + public static String setProperty(String in) { + return String.format("set%s", NamingCase.toPascalCase(in)); + } + + /** + * 首字母大写 + * @param in 字段 + * @return 首字母大写 + */ + public static String pascalCase(String in) { + return String.format(NamingCase.toPascalCase(in)); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VelocityKit.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VelocityKit.java new file mode 100644 index 00000000..8f7f1301 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VelocityKit.java @@ -0,0 +1,69 @@ +package com.pig4cloud.pig.codegen.util; + +import cn.hutool.core.util.CharsetUtil; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.tools.generic.DateTool; +import org.apache.velocity.tools.generic.MathTool; +import org.springframework.stereotype.Service; + +import java.io.StringWriter; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; + +/** + * 模板引擎工具类 + * + * @author lengleng + * @date 2023/2/7 + */ +@Service +public class VelocityKit { + + /** + * Velocity 模板渲染方法 + * @param template 模板 + * @param map 数据模型 + * @return 渲染结果 + */ + public static String render(String template, Map map) { + // 设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + + VelocityContext context = new VelocityContext(map); + // 函数库,使用 Lambda 表达式简化代码 + Optional.of(new MathTool()).ifPresent(mt -> context.put("math", mt)); + Optional.of(new DateTool()).ifPresent(dt -> context.put("dateTool", dt)); + Optional.of(new DictTool()).ifPresent(dt -> context.put("dict", dt)); + Optional.of(new NamingCaseTool()).ifPresent(nct -> context.put("str", nct)); + + // 渲染模板,使用 Lambda 表达式简化代码 + StringWriter sw = new StringWriter(); + Optional.ofNullable(Velocity.getTemplate(template, CharsetUtil.UTF_8)).ifPresent(tpl -> tpl.merge(context, sw)); + return sw.toString(); + } + + /** + * 渲染文本 + * @param str + * @param dataModel 数据 + * @return + */ + public static String renderStr(String str, Map dataModel) { + // 设置velocity资源加载器 + Velocity.init(); + StringWriter stringWriter = new StringWriter(); + VelocityContext context = new VelocityContext(dataModel); + // 函数库 + context.put("math", new MathTool()); + context.put("dateTool", new DateTool()); + context.put("dict", new DictTool()); + context.put("str", new NamingCaseTool()); + Velocity.evaluate(context, stringWriter, "renderStr", str); + return stringWriter.toString(); + } + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java new file mode 100644 index 00000000..23f6abb5 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java @@ -0,0 +1,45 @@ +package com.pig4cloud.pig.codegen.util.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class GroupVo { + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * 分组名称 + */ + @Schema(description = "分组名称") + private String groupName; + + /** + * 分组描述 + */ + @Schema(description = "分组描述") + private String groupDesc; + + /** + * 模板ids + */ + @Schema(description = "拥有的模板列表") + private Long[] templateId; + + /** + * 模板列表 + */ + @Schema(description = "拥有的模板列表") + private List templateList; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/SqlDto.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/SqlDto.java new file mode 100644 index 00000000..25393e64 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/SqlDto.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pig.codegen.util.vo; + +import lombok.Data; + +/** + * @author lengleng + * @date 2022/5/2 + */ +@Data +public class SqlDto { + + /** + * 数据源ID + */ + private String dsName; + + /** + * sql脚本 + */ + private String sql; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/TemplateGroupDTO.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/TemplateGroupDTO.java new file mode 100644 index 00000000..8ff23058 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/TemplateGroupDTO.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pig.codegen.util.vo; + +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@Schema(description = "模板传输对象") +@EqualsAndHashCode(callSuper = true) +public class TemplateGroupDTO extends GenGroupEntity { + + /** + * 模板id集合 + */ + @Schema(description = "模板id集合") + private List templateId; + +} diff --git a/pig-visual/pig-codegen/src/main/resources/generator.properties b/pig-visual/pig-codegen/src/main/resources/generator.properties deleted file mode 100755 index 5031d40e..00000000 --- a/pig-visual/pig-codegen/src/main/resources/generator.properties +++ /dev/null @@ -1,51 +0,0 @@ -# -# Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F - -mainPath=com.pig4cloud.pig -#\u5305\u540D -package=com.pig4cloud.pig -moduleName=demo -#\u4F5C\u8005 -author=pig code generator - -#\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00) -tablePrefix=table_ - -#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F -tinyint=Integer -smallint=Integer -mediumint=Integer -int=Integer -integer=Integer -bigint=Long -float=Float -double=Double -decimal=BigDecimal -bit=Boolean - -char=String -bpchar=String -varchar=String -tinytext=String -text=String -mediumtext=String -longtext=String - -date=LocalDateTime -datetime=LocalDateTime -timestamp=LocalDateTime diff --git a/pig-visual/pig-codegen/src/main/resources/logback-spring.xml b/pig-visual/pig-codegen/src/main/resources/logback-spring.xml old mode 100755 new mode 100644 index fa238198..a90ada52 --- a/pig-visual/pig-codegen/src/main/resources/logback-spring.xml +++ b/pig-visual/pig-codegen/src/main/resources/logback-spring.xml @@ -1,23 +1,31 @@ + - - + @@ -43,7 +51,7 @@ 30 - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} @@ -56,20 +64,23 @@ 30 - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} ERROR + + + + - - + diff --git a/pig-visual/pig-codegen/src/main/resources/template/Mapper.xml.vm b/pig-visual/pig-codegen/src/main/resources/mapper/GenFieldTypeMapper.xml old mode 100755 new mode 100644 similarity index 57% rename from pig-visual/pig-codegen/src/main/resources/template/Mapper.xml.vm rename to pig-visual/pig-codegen/src/main/resources/mapper/GenFieldTypeMapper.xml index 25c0fa0e..43b07282 --- a/pig-visual/pig-codegen/src/main/resources/template/Mapper.xml.vm +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenFieldTypeMapper.xml @@ -21,15 +21,21 @@ - + - -#foreach($column in $columns) -#if($column.lowerAttrName==$pk.lowerAttrName) - -#else - -#end -#end - + + + + + + + + + diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenFormConfMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenFormConfMapper.xml deleted file mode 100755 index 422acb7c..00000000 --- a/pig-visual/pig-codegen/src/main/resources/mapper/GenFormConfMapper.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml new file mode 100644 index 00000000..83d36147 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml new file mode 100644 index 00000000..e9a64953 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateGroupMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateGroupMapper.xml new file mode 100644 index 00000000..fff11ebc --- /dev/null +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateGroupMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateMapper.xml new file mode 100644 index 00000000..02f10b21 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenTemplateMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMapper.xml deleted file mode 100755 index f226b6fb..00000000 --- a/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMapper.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml new file mode 100755 index 00000000..ca5b9eb9 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + SELECT + column_name columnName, + data_type dataType, + column_comment comments, + column_key columnKey, + extra, + is_nullable AS isNullable, + column_type AS columnType + FROM + information_schema.COLUMNS + WHERE + table_name = #{tableName} and table_schema = (select database()) order by ordinal_position + + + + + + + diff --git a/pig-visual/pig-codegen/src/main/resources/template/avue/api.js.vm b/pig-visual/pig-codegen/src/main/resources/template/avue/api.js.vm deleted file mode 100644 index e257ce76..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/avue/api.js.vm +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -import request from '@/router/axios' - -export function fetchList(query) { - return request({ - url: '/${moduleName}/${pathName}/page', - method: 'get', - params: query - }) -} - -export function addObj(obj) { - return request({ - url: '/${moduleName}/${pathName}', - method: 'post', - data: obj - }) -} - -export function getObj(id) { - return request({ - url: '/${moduleName}/${pathName}/' + id, - method: 'get' - }) -} - -export function delObj(id) { - return request({ - url: '/${moduleName}/${pathName}/' + id, - method: 'delete' - }) -} - -export function putObj(obj) { - return request({ - url: '/${moduleName}/${pathName}', - method: 'put', - data: obj - }) -} diff --git a/pig-visual/pig-codegen/src/main/resources/template/avue/crud.js.vm b/pig-visual/pig-codegen/src/main/resources/template/avue/crud.js.vm deleted file mode 100644 index 05e7fbd3..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/avue/crud.js.vm +++ /dev/null @@ -1,34 +0,0 @@ -export const tableOption = { - "border": true, - "index": true, - "indexLabel": "序号", - "stripe": true, - "menuAlign": "center", - "align": "center", - "searchMenuSpan": 6, - "column": [ -#set($excludeColumns = ["create_time","update_time","create_by","update_by"]) -#foreach ($column in $columns) -## 当列是主键 或者 列是审计字段时候, 新增不显示,编辑的时候显示单不能编辑 -#if($column.columnName == $pk.columnName || $excludeColumns.contains($column.columnName)) - { - "type": "input", - #if($column.comments) - "label": "$column.comments", - #else - "label": "$column.lowerAttrName", - #end - "prop": "$column.lowerAttrName", - "addDisplay": false, - "editDisabled": true - }#if($foreach.hasNext),#end -#else - { - "type": "input", - "label": "$column.comments", - "prop": "$column.lowerAttrName" - }#if($foreach.hasNext),#end -#end -#end - ] -} diff --git a/pig-visual/pig-codegen/src/main/resources/template/avue/index.vue.vm b/pig-visual/pig-codegen/src/main/resources/template/avue/index.vue.vm deleted file mode 100755 index 310aa698..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/avue/index.vue.vm +++ /dev/null @@ -1,130 +0,0 @@ - - - - diff --git a/pig-visual/pig-codegen/src/main/resources/template/config.json b/pig-visual/pig-codegen/src/main/resources/template/config.json new file mode 100644 index 00000000..4f33f5d0 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/resources/template/config.json @@ -0,0 +1,12 @@ +{ + "project": { + "packageName": "com.pig4cloud.pig", + "version": "1.0.0", + "backendPath": "pig", + "frontendPath": "pig-ui" + }, + "developer": { + "author": "pig", + "email": "pig4cloud@qq.com" + } +} diff --git a/pig-visual/pig-codegen/src/main/resources/template/element/form.vue.vm b/pig-visual/pig-codegen/src/main/resources/template/element/form.vue.vm deleted file mode 100644 index f7fbf7f6..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/element/form.vue.vm +++ /dev/null @@ -1,102 +0,0 @@ -#set($excludeColumns = ["create_time","update_time","create_by","update_by"]) - - - diff --git a/pig-visual/pig-codegen/src/main/resources/template/element/index.vue.vm b/pig-visual/pig-codegen/src/main/resources/template/element/index.vue.vm deleted file mode 100644 index 5480a7aa..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/element/index.vue.vm +++ /dev/null @@ -1,130 +0,0 @@ - - - diff --git a/pig-visual/pig-codegen/src/main/resources/template/menu.sql.vm b/pig-visual/pig-codegen/src/main/resources/template/menu.sql.vm deleted file mode 100644 index 565c5d22..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/menu.sql.vm +++ /dev/null @@ -1,20 +0,0 @@ --- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 根节点 -#set($menuId=${dateTool.getSystemTime()}) - --- 菜单SQL -insert into `sys_menu` (`menu_id`, `parent_id`, `path`, `permission`, `type`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`) - values (${menuId}, '-1', '/${moduleName}/${pathName}/index', '', '0', 'icon-bangzhushouji', '0', '2018-01-20 13:17:19', '8', '2018-07-29 13:38:19', '${comments}管理'); - --- 菜单对应按钮SQL -insert into `sys_menu` ( `parent_id`,`menu_id`, `permission`, `type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`) -values(${menuId}, ${math.add($menuId,1)}, '${moduleName}_${pathName}_get', '1', null, '1', '0', '2018-05-15 21:35:18', '0', '2018-07-29 13:38:59', '${comments}查看'); - -insert into `sys_menu` (`parent_id`, `menu_id`, `permission`, `type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`) -values(${menuId}, ${math.add($menuId,2)}, '${moduleName}_${pathName}_add', '1', null, '1', '0', '2018-05-15 21:35:18', '1', '2018-07-29 13:38:59', '${comments}新增'); - -insert into `sys_menu` (`parent_id`, `menu_id`, `permission`, `type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`) -values(${menuId}, ${math.add($menuId,3)}, '${moduleName}_${pathName}_edit', '1', null, '1', '0', '2018-05-15 21:35:18', '2', '2018-07-29 13:38:59', '${comments}修改'); - -insert into `sys_menu` (`parent_id`, `menu_id`, `permission`, `type`, `path`, `icon`, `del_flag`, `create_time`, `sort_order`, `update_time`, `name`) -values(${menuId}, ${math.add($menuId,4)}, '${moduleName}_${pathName}_del', '1', null, '1', '0', '2018-05-15 21:35:18', '3', '2018-07-29 13:38:59', '${comments}删除'); - diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index 1be8a117..d714a164 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.6.7 + 3.7.0-JDK8 pig-monitor diff --git a/pig-visual/pig-xxl-job-admin/Dockerfile b/pig-visual/pig-quartz/Dockerfile similarity index 62% rename from pig-visual/pig-xxl-job-admin/Dockerfile rename to pig-visual/pig-quartz/Dockerfile index dcde5139..270aff8a 100644 --- a/pig-visual/pig-xxl-job-admin/Dockerfile +++ b/pig-visual/pig-quartz/Dockerfile @@ -1,14 +1,14 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-xxl-job-admin +RUN mkdir -p /pig-quartz -WORKDIR /pig-xxl-job-admin +WORKDIR /pig-quartz -ARG JAR_FILE=target/pig-xxl-job-admin.jar +ARG JAR_FILE=target/pig-quartz.jar COPY ${JAR_FILE} app.jar -EXPOSE 5004 +EXPOSE 5001 ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom" diff --git a/pig-visual/pig-quartz/pom.xml b/pig-visual/pig-quartz/pom.xml new file mode 100644 index 00000000..a7476cd0 --- /dev/null +++ b/pig-visual/pig-quartz/pom.xml @@ -0,0 +1,91 @@ + + + + com.pig4cloud + pig-visual + 3.7.0-JDK8 + + 4.0.0 + + pig-quartz + jar + + 基于quartz后台定时任务模块 + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pig-common-log + + + + com.pig4cloud + pig-common-feign + + + + com.pig4cloud + pig-common-mybatis + + + com.baomidou + mybatis-plus-boot-starter + + + + com.mysql + mysql-connector-j + + + + com.pig4cloud + pig-common-swagger + + + + com.pig4cloud + pig-common-security + + + + org.springframework.boot + spring-boot-starter-quartz + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/PigXxlJobAdminApplication.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java similarity index 44% rename from pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/PigXxlJobAdminApplication.java rename to pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java index 3fc5968b..cdcea4f5 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/PigXxlJobAdminApplication.java +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java @@ -1,18 +1,23 @@ -package com.xxl.job.admin; +package com.pig4cloud.pig.daemon.quartz; +import com.pig4cloud.pig.common.feign.annotation.EnablePigFeignClients; +import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** - * @author xuxueli 2018-10-28 00:38:13 + * @author frwcloud + * @date 2023-07-05 */ +@EnablePigFeignClients +@EnablePigResourceServer @EnableDiscoveryClient @SpringBootApplication -public class PigXxlJobAdminApplication { +public class PigQuartzApplication { public static void main(String[] args) { - SpringApplication.run(PigXxlJobAdminApplication.class, args); + SpringApplication.run(PigQuartzApplication.class, args); } -} \ No newline at end of file +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/AutowireCapableBeanJobFactory.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/AutowireCapableBeanJobFactory.java new file mode 100644 index 00000000..679a3a48 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/AutowireCapableBeanJobFactory.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.config; + +import org.quartz.JobKey; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.SpringBeanJobFactory; +import org.springframework.util.Assert; + +/** + * @author 郑健楠 + */ +class AutowireCapableBeanJobFactory extends SpringBeanJobFactory { + + private final AutowireCapableBeanFactory beanFactory; + + AutowireCapableBeanJobFactory(AutowireCapableBeanFactory beanFactory) { + Assert.notNull(beanFactory, "Bean factory must not be null"); + this.beanFactory = beanFactory; + } + + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object jobInstance = super.createJobInstance(bundle); + this.beanFactory.autowireBean(jobInstance); + + // 此处必须注入 beanName 不然sentinel 报错 + JobKey jobKey = bundle.getTrigger().getJobKey(); + String beanName = jobKey + jobKey.getName(); + this.beanFactory.initializeBean(jobInstance, beanName); + return jobInstance; + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigInitQuartzJob.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigInitQuartzJob.java new file mode 100644 index 00000000..feef77e7 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigInitQuartzJob.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.config; + +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.service.SysJobService; +import com.pig4cloud.pig.daemon.quartz.util.TaskUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Scheduler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author 郑健楠 + *

+ * 初始化加载定时任务 + */ +@Slf4j +@Configuration +@AllArgsConstructor +public class PigInitQuartzJob { + + private final SysJobService sysJobService; + + private final TaskUtil taskUtil; + + private final Scheduler scheduler; + + @Bean + public void customize() { + sysJobService.list().forEach(sysjob -> { + if (PigQuartzEnum.JOB_STATUS_RELEASE.getType().equals(sysjob.getJobStatus())) { + taskUtil.removeJob(sysjob, scheduler); + } + else if (PigQuartzEnum.JOB_STATUS_RUNNING.getType().equals(sysjob.getJobStatus())) { + taskUtil.resumeJob(sysjob, scheduler); + } + else if (PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType().equals(sysjob.getJobStatus())) { + taskUtil.pauseJob(sysjob, scheduler); + } + else { + taskUtil.removeJob(sysjob, scheduler); + } + }); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java new file mode 100644 index 00000000..76dfe308 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.config; + +import org.quartz.Calendar; +import org.quartz.JobDetail; +import org.quartz.Scheduler; +import org.quartz.Trigger; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.quartz.QuartzProperties; +import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * @author 郑健楠 + */ +@EnableAsync +@Configuration +@ConditionalOnClass({ Scheduler.class, SchedulerFactoryBean.class }) +@EnableConfigurationProperties({ QuartzProperties.class }) +public class PigQuartzConfig { + + private final QuartzProperties properties; + + private final List customizers; + + private final JobDetail[] jobDetails; + + private final Map calendars; + + private final Trigger[] triggers; + + private final ApplicationContext applicationContext; + + public PigQuartzConfig(QuartzProperties properties, + ObjectProvider> customizers, ObjectProvider jobDetails, + ObjectProvider> calendars, ObjectProvider triggers, + ApplicationContext applicationContext) { + this.properties = properties; + this.customizers = customizers.getIfAvailable(); + this.jobDetails = jobDetails.getIfAvailable(); + this.calendars = calendars.getIfAvailable(); + this.triggers = triggers.getIfAvailable(); + this.applicationContext = applicationContext; + } + + @Bean + @ConditionalOnMissingBean + public SchedulerFactoryBean quartzScheduler() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean + .setJobFactory(new AutowireCapableBeanJobFactory(this.applicationContext.getAutowireCapableBeanFactory())); + if (!this.properties.getProperties().isEmpty()) { + schedulerFactoryBean.setQuartzProperties(this.asProperties(this.properties.getProperties())); + } + + if (this.jobDetails != null && this.jobDetails.length > 0) { + schedulerFactoryBean.setJobDetails(this.jobDetails); + } + + if (this.calendars != null && !this.calendars.isEmpty()) { + schedulerFactoryBean.setCalendars(this.calendars); + } + + if (this.triggers != null && this.triggers.length > 0) { + schedulerFactoryBean.setTriggers(this.triggers); + } + + this.customize(schedulerFactoryBean); + return schedulerFactoryBean; + } + + private Properties asProperties(Map source) { + Properties properties = new Properties(); + properties.putAll(source); + return properties; + } + + private void customize(SchedulerFactoryBean schedulerFactoryBean) { + if (this.customizers != null) { + + for (SchedulerFactoryBeanCustomizer customizer : this.customizers) { + customizer.customize(schedulerFactoryBean); + } + } + + } + + /** + * 通过SchedulerFactoryBean获取Scheduler的实例 + * @return + */ + @Bean + public Scheduler scheduler() { + return quartzScheduler().getScheduler(); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzCustomizerConfig.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzCustomizerConfig.java new file mode 100644 index 00000000..1ef6c1d7 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzCustomizerConfig.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.config; + +import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +/** + * @author 郑健楠 + */ +@Configuration +public class PigQuartzCustomizerConfig implements SchedulerFactoryBeanCustomizer { + + @Override + public void customize(SchedulerFactoryBean schedulerFactoryBean) { + schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzFactory.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzFactory.java new file mode 100644 index 00000000..6617695f --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzFactory.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.config; + +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author 郑健楠 + * + *

+ * 动态任务工厂 + */ +@Slf4j +@DisallowConcurrentExecution +public class PigQuartzFactory implements Job { + + @Autowired + private PigQuartzInvokeFactory pigxQuartzInvokeFactory; + + @Override + @SneakyThrows + public void execute(JobExecutionContext jobExecutionContext) { + SysJob sysJob = (SysJob) jobExecutionContext.getMergedJobDataMap() + .get(PigQuartzEnum.SCHEDULE_JOB_KEY.getType()); + pigxQuartzInvokeFactory.init(sysJob, jobExecutionContext.getTrigger()); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzInvokeFactory.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzInvokeFactory.java new file mode 100644 index 00000000..75e4fa48 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzInvokeFactory.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.config; + +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.event.SysJobEvent; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.annotation.Aspect; +import org.quartz.Trigger; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; + +/** + * @author 郑健楠 + */ +@Slf4j +@Aspect +@Service +@AllArgsConstructor +public class PigQuartzInvokeFactory { + + private final ApplicationEventPublisher publisher; + + @SneakyThrows + void init(SysJob sysJob, Trigger trigger) { + publisher.publishEvent(new SysJobEvent(sysJob, trigger)); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/JobTypeQuartzEnum.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/JobTypeQuartzEnum.java new file mode 100644 index 00000000..b4e597af --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/JobTypeQuartzEnum.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.constants; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2019-03-14 + *

+ * 任务类型枚举 + */ +@Getter +@AllArgsConstructor +public enum JobTypeQuartzEnum { + + /** + * 反射java类 + */ + JAVA("1", "反射java类"), + + /** + * spring bean 的方式 + */ + SPRING_BEAN("2", "spring bean容器实例"), + + /** + * rest 调用 + */ + REST("3", "rest调用"), + + /** + * jar + */ + JAR("4", "jar调用"); + + /** + * 类型 + */ + private final String type; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/PigQuartzEnum.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/PigQuartzEnum.java new file mode 100644 index 00000000..0f12b08b --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/constants/PigQuartzEnum.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.constants; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 郑健楠 + * + *

+ * 定时任务枚举 + */ +@Getter +@AllArgsConstructor +public enum PigQuartzEnum { + + /** + * 错失执行策略默认 + */ + MISFIRE_DEFAULT("0", "默认"), + + /** + * 错失执行策略-立即执行错失任务 + */ + MISFIRE_IGNORE_MISFIRES("1", "立即执行错失任务"), + + /** + * 错失执行策略-触发一次执行周期执行 + */ + MISFIRE_FIRE_AND_PROCEED("2", "触发一次执行周期执行"), + + /** + * 错失执行策略-不触发执行周期执行 + */ + MISFIRE_DO_NOTHING("3", "不触发周期执行"), + + /** + * 任务详细信息的key + */ + SCHEDULE_JOB_KEY("scheduleJob", "获取任务详细信息的key"), + + /** + * JOB执行状态:0执行成功 + */ + JOB_LOG_STATUS_SUCCESS("0", "执行成功"), + /** + * JOB执行状态:1执行失败 + */ + JOB_LOG_STATUS_FAIL("1", "执行失败"), + + /** + * JOB状态:1已发布 + */ + JOB_STATUS_RELEASE("1", "已发布"), + /** + * JOB状态:2运行中 + */ + JOB_STATUS_RUNNING("2", "运行中"), + /** + * JOB状态:3暂停 + */ + JOB_STATUS_NOT_RUNNING("3", "暂停"), + /** + * JOB状态:4删除 + */ + JOB_STATUS_DEL("4", "删除"); + + /** + * 类型 + */ + private final String type; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobController.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobController.java new file mode 100644 index 00000000..dd0dfb64 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobController.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.pig.common.security.util.SecurityUtils; +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import com.pig4cloud.pig.daemon.quartz.service.SysJobLogService; +import com.pig4cloud.pig.daemon.quartz.service.SysJobService; +import com.pig4cloud.pig.daemon.quartz.util.TaskUtil; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.quartz.Scheduler; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author frwcloud + * @date 2019-01-27 10:04:42 + *

+ * 定时任务管理 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sys-job") +@Tag(description = "sys-job", name = "定时任务") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysJobController { + + private final SysJobService sysJobService; + + private final SysJobLogService sysJobLogService; + + private final TaskUtil taskUtil; + + private final Scheduler scheduler; + + /** + * 定时任务分页查询 + * @param page 分页对象 + * @param sysJob 定时任务调度表 + * @return + */ + @GetMapping("/page") + @Operation(description = "分页定时业务查询") + public R getSysJobPage(Page page, SysJob sysJob) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysJob.getJobName()), SysJob::getJobName, sysJob.getJobName()) + .like(StrUtil.isNotBlank(sysJob.getJobGroup()), SysJob::getJobGroup, sysJob.getJobGroup()) + .eq(StrUtil.isNotBlank(sysJob.getJobStatus()), SysJob::getJobStatus, sysJob.getJobGroup()) + .eq(StrUtil.isNotBlank(sysJob.getJobExecuteStatus()), SysJob::getJobExecuteStatus, + sysJob.getJobExecuteStatus()); + return R.ok(sysJobService.page(page, wrapper)); + } + + /** + * 通过id查询定时任务 + * @param id id + * @return R + */ + @GetMapping("/{id}") + @Operation(description = "唯一标识查询定时任务") + public R getById(@PathVariable("id") Long id) { + return R.ok(sysJobService.getById(id)); + } + + /** + * 新增定时任务 + * @param sysJob 定时任务调度表 + * @return R + */ + @SysLog("新增定时任务") + @PostMapping + @PreAuthorize("@pms.hasPermission('job_sys_job_add')") + @Operation(description = "新增定时任务") + public R save(@RequestBody SysJob sysJob) { + sysJob.setJobStatus(PigQuartzEnum.JOB_STATUS_RELEASE.getType()); + sysJob.setCreateBy(SecurityUtils.getUser().getUsername()); + sysJobService.save(sysJob); + // 初始化任务 + taskUtil.addOrUpateJob(sysJob, scheduler); + return R.ok(); + } + + /** + * 修改定时任务 + * @param sysJob 定时任务调度表 + * @return R + */ + @SysLog("修改定时任务") + @PutMapping + @PreAuthorize("@pms.hasPermission('job_sys_job_edit')") + @Operation(description = "修改定时任务") + public R updateById(@RequestBody SysJob sysJob) { + sysJob.setUpdateBy(SecurityUtils.getUser().getUsername()); + SysJob querySysJob = this.sysJobService.getById(sysJob.getJobId()); + if (PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType().equals(querySysJob.getJobStatus())) { + this.taskUtil.addOrUpateJob(sysJob, scheduler); + sysJobService.updateById(sysJob); + } + else if (PigQuartzEnum.JOB_STATUS_RELEASE.getType().equals(querySysJob.getJobStatus())) { + sysJobService.updateById(sysJob); + } + return R.ok(); + } + + /** + * 通过id删除定时任务 + * @param id id + * @return R + */ + @SysLog("删除定时任务") + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('job_sys_job_del')") + @Operation(description = "唯一标识查询定时任务,暂停任务才能删除") + public R removeById(@PathVariable Long id) { + SysJob querySysJob = this.sysJobService.getById(id); + if (PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType().equals(querySysJob.getJobStatus())) { + this.taskUtil.removeJob(querySysJob, scheduler); + this.sysJobService.removeById(id); + } + else if (PigQuartzEnum.JOB_STATUS_RELEASE.getType().equals(querySysJob.getJobStatus())) { + this.sysJobService.removeById(id); + } + return R.ok(); + } + + /** + * 暂停全部定时任务 + * @return + */ + @SysLog("暂停全部定时任务") + @PostMapping("/shutdown-jobs") + @PreAuthorize("@pms.hasPermission('job_sys_job_shutdown_job')") + @Operation(description = "暂停全部定时任务") + public R shutdownJobs() { + taskUtil.pauseJobs(scheduler); + long count = this.sysJobService.count( + new LambdaQueryWrapper().eq(SysJob::getJobStatus, PigQuartzEnum.JOB_STATUS_RUNNING.getType())); + if (count <= 0) { + return R.ok("无正在运行定时任务"); + } + else { + // 更新定时任务状态条件,运行状态2更新为暂停状态2 + this.sysJobService.update( + SysJob.builder().jobStatus(PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType()).build(), + new UpdateWrapper().lambda() + .eq(SysJob::getJobStatus, PigQuartzEnum.JOB_STATUS_RUNNING.getType())); + return R.ok("暂停成功"); + } + } + + /** + * 启动全部定时任务 + * @return + */ + @SysLog("启动全部定时任务") + @PostMapping("/start-jobs") + @PreAuthorize("@pms.hasPermission('job_sys_job_start_job')") + @Operation(description = "启动全部定时任务") + public R startJobs() { + // 更新定时任务状态条件,暂停状态3更新为运行状态2 + this.sysJobService.update(SysJob.builder().jobStatus(PigQuartzEnum.JOB_STATUS_RUNNING.getType()).build(), + new UpdateWrapper().lambda() + .eq(SysJob::getJobStatus, PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType())); + taskUtil.startJobs(scheduler); + return R.ok(); + } + + /** + * 刷新全部定时任务 + * @return + */ + @SysLog("刷新全部定时任务") + @PostMapping("/refresh-jobs") + @PreAuthorize("@pms.hasPermission('job_sys_job_refresh_job')") + @Operation(description = "刷新全部定时任务") + public R refreshJobs() { + sysJobService.list().forEach((sysjob) -> { + if (PigQuartzEnum.JOB_STATUS_RELEASE.getType().equals(sysjob.getJobStatus()) + || PigQuartzEnum.JOB_STATUS_DEL.getType().equals(sysjob.getJobStatus())) { + taskUtil.removeJob(sysjob, scheduler); + } + else if (PigQuartzEnum.JOB_STATUS_RUNNING.getType().equals(sysjob.getJobStatus()) + || PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType().equals(sysjob.getJobStatus())) { + taskUtil.addOrUpateJob(sysjob, scheduler); + } + else { + taskUtil.removeJob(sysjob, scheduler); + } + }); + return R.ok(); + } + + /** + * 启动定时任务 + * @param jobId + * @return + */ + @SysLog("启动定时任务") + @PostMapping("/start-job/{id}") + @PreAuthorize("@pms.hasPermission('job_sys_job_start_job')") + @Operation(description = "启动定时任务") + public R startJob(@PathVariable("id") Long jobId) { + SysJob querySysJob = this.sysJobService.getById(jobId); + if (querySysJob != null && PigQuartzEnum.JOB_LOG_STATUS_FAIL.getType().equals(querySysJob.getJobStatus())) { + taskUtil.addOrUpateJob(querySysJob, scheduler); + } + else { + taskUtil.resumeJob(querySysJob, scheduler); + } + // 更新定时任务状态条件,暂停状态3更新为运行状态2 + this.sysJobService + .updateById(SysJob.builder().jobId(jobId).jobStatus(PigQuartzEnum.JOB_STATUS_RUNNING.getType()).build()); + return R.ok(); + } + + /** + * 启动定时任务 + * @param jobId + * @return + */ + @SysLog("立刻执行定时任务") + @PostMapping("/run-job/{id}") + @PreAuthorize("@pms.hasPermission('job_sys_job_run_job')") + @Operation(description = "立刻执行定时任务") + public R runJob(@PathVariable("id") Long jobId) { + SysJob querySysJob = this.sysJobService.getById(jobId); + return TaskUtil.runOnce(scheduler, querySysJob) ? R.ok() : R.failed(); + } + + /** + * 暂停定时任务 + * @return + */ + @SysLog("暂停定时任务") + @PostMapping("/shutdown-job/{id}") + @PreAuthorize("@pms.hasPermission('job_sys_job_shutdown_job')") + @Operation(description = "暂停定时任务") + public R shutdownJob(@PathVariable("id") Long id) { + SysJob querySysJob = this.sysJobService.getById(id); + // 更新定时任务状态条件,运行状态2更新为暂停状态3 + this.sysJobService.updateById(SysJob.builder() + .jobId(querySysJob.getJobId()) + .jobStatus(PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType()) + .build()); + taskUtil.pauseJob(querySysJob, scheduler); + return R.ok(); + } + + /** + * 唯一标识查询定时执行日志 + * @return + */ + @GetMapping("/job-log") + @Operation(description = "唯一标识查询定时执行日志") + public R getJobLog(Page page, SysJobLog sysJobLog) { + return R.ok(sysJobLogService.page(page, Wrappers.query(sysJobLog))); + } + + /** + * 检验任务名称和任务组联合是否唯一 + * @return + */ + @GetMapping("/is-valid-task-name") + @Operation(description = "检验任务名称和任务组联合是否唯一") + public R isValidTaskName(@RequestParam String jobName, @RequestParam String jobGroup) { + return this.sysJobService + .count(Wrappers.query(SysJob.builder().jobName(jobName).jobGroup(jobGroup).build())) > 0 + ? R.failed("任务重复,请检查此组内是否已包含同名任务") : R.ok(); + } + + /** + * 导出任务 + * @param sysJob + * @return + */ + @ResponseExcel + @GetMapping("/export") + @Operation(description = "导出任务") + public List export(SysJob sysJob) { + return sysJobService.list(Wrappers.query(sysJob)); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobLogController.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobLogController.java new file mode 100644 index 00000000..4392f037 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/controller/SysJobLogController.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import com.pig4cloud.pig.daemon.quartz.service.SysJobLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +/** + * @author frwcloud + *

+ * 定时任务执行日志表 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sys-job-log") +@Tag(description = "sys-job-log", name = "定时任务日志") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysJobLogController { + + private final SysJobLogService sysJobLogService; + + /** + * 分页查询 + * @param page 分页对象 + * @param sysJobLog 定时任务执行日志表 + * @return + */ + @GetMapping("/page") + @Operation(description = "分页定时任务日志查询") + public R getSysJobLogPage(Page page, SysJobLog sysJobLog) { + return R.ok(sysJobLogService.page(page, Wrappers.query(sysJobLog))); + } + + @DeleteMapping + @Operation(description = "批量删除日志") + public R deleteLogs(@RequestBody Long[] ids) { + return R.ok(sysJobLogService.removeBatchByIds(CollUtil.toList(ids))); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJob.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJob.java new file mode 100644 index 00000000..3d3ca844 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJob.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 定时任务调度表 + * + * @author frwcloud + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "定时任务") +public class SysJob extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + @TableId(value = "job_id", type = IdType.ASSIGN_ID) + private Long jobId; + + /** + * 任务名称 + */ + private String jobName; + + /** + * 任务组名 + */ + private String jobGroup; + + /** + * 组内执行顺利,值越大执行优先级越高,最大值9,最小值1 + */ + private String jobOrder; + + /** + * 1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他 + */ + private String jobType; + + /** + * job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空 + */ + private String executePath; + + /** + * job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空 + */ + private String className; + + /** + * 任务方法 + */ + private String methodName; + + /** + * 参数值 + */ + private String methodParamsValue; + + /** + * cron执行表达式 + */ + private String cronExpression; + + /** + * 错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行) + */ + private String misfirePolicy; + + /** + * 1、多租户任务;2、非多租户任务 + */ + private String jobTenantType; + + /** + * 状态(0、未发布;1、已发布;2、运行中;3、暂停;4、删除;) + */ + private String jobStatus; + + /** + * 状态(0正常 1异常) + */ + private String jobExecuteStatus; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 首次执行时间 + */ + private LocalDateTime startTime; + + /** + * 上次执行时间 + */ + private LocalDateTime previousTime; + + /** + * 下次执行时间 + */ + private LocalDateTime nextTime; + + /** + * 备注信息 + */ + private String remark; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJobLog.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJobLog.java new file mode 100644 index 00000000..9418e668 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/entity/SysJobLog.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 定时任务执行日志表 + * + * @author frwcloud + * @date 2019-01-27 13:40:20 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "定时任务日志") +public class SysJobLog extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 任务日志ID + */ + @TableId(value = "job_log_id", type = IdType.ASSIGN_ID) + private Long jobLogId; + + /** + * 任务id + */ + private Long jobId; + + /** + * 任务名称 + */ + private String jobName; + + /** + * 任务组名 + */ + private String jobGroup; + + /** + * 组内执行顺利,值越大执行优先级越高,最大值9,最小值1 + */ + private String jobOrder; + + /** + * 1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他 + */ + private String jobType; + + /** + * job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空 + */ + private String executePath; + + /** + * job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空 + */ + private String className; + + /** + * 任务方法 + */ + private String methodName; + + /** + * 参数值 + */ + private String methodParamsValue; + + /** + * cron执行表达式 + */ + private String cronExpression; + + /** + * 日志信息 + */ + private String jobMessage; + + /** + * 执行状态(0正常 1失败) + */ + private String jobLogStatus; + + /** + * 执行时间 + */ + private String executeTime; + + /** + * 异常信息 + */ + private String exceptionInfo; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobEvent.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobEvent.java new file mode 100644 index 00000000..981f91a9 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobEvent.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.event; + +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.quartz.Trigger; + +/** + * @author frwcloud 定时任务多线程事件 + */ +@Getter +@AllArgsConstructor +public class SysJobEvent { + + private final SysJob sysJob; + + private final Trigger trigger; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobListener.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobListener.java new file mode 100644 index 00000000..27e41402 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobListener.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.event; + +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.util.TaskInvokUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Trigger; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +/** + * @author frwcloud 异步监听定时任务事件 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SysJobListener { + + private final TaskInvokUtil taskInvokUtil; + + @Async + @Order + @EventListener(SysJobEvent.class) + public void comSysJob(SysJobEvent event) { + SysJob sysJob = event.getSysJob(); + Trigger trigger = event.getTrigger(); + taskInvokUtil.invokMethod(sysJob, trigger); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogEvent.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogEvent.java new file mode 100644 index 00000000..0351d36b --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogEvent.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.event; + +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author frwcloud 定时任务日志多线程事件 + */ +@Getter +@AllArgsConstructor +public class SysJobLogEvent { + + private final SysJobLog sysJobLog; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogListener.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogListener.java new file mode 100644 index 00000000..e7f9c370 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/event/SysJobLogListener.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.event; + +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import com.pig4cloud.pig.daemon.quartz.service.SysJobLogService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +/** + * @author frwcloud 异步监听定时任务日志事件 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SysJobLogListener { + + private final SysJobLogService sysJobLogService; + + @Async + @Order + @EventListener(SysJobLogEvent.class) + public void saveSysJobLog(SysJobLogEvent event) { + SysJobLog sysJobLog = event.getSysJobLog(); + sysJobLogService.save(sysJobLog); + log.info("执行定时任务日志"); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/exception/TaskException.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/exception/TaskException.java new file mode 100644 index 00000000..9ed8730f --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/exception/TaskException.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.exception; + +/** + * 定时任务异常 + * + * @author 郑健楠 + */ +public class TaskException extends Exception { + + public TaskException() { + super(); + } + + public TaskException(String msg) { + super(msg); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobLogMapper.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 00000000..9a191498 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * 定时任务执行日志表 + * + * @author frwcloud + * @date 2019-01-27 13:40:20 + */ +@Mapper +public interface SysJobLogMapper extends BaseMapper { + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobMapper.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobMapper.java new file mode 100644 index 00000000..ebb092d5 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/mapper/SysJobMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import org.apache.ibatis.annotations.Mapper; + +/** + * 定时任务调度表 + * + * @author frwcloud + * @date 2019-01-27 10:04:42 + */ +@Mapper +public interface SysJobMapper extends BaseMapper { + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobLogService.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobLogService.java new file mode 100644 index 00000000..5539541b --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobLogService.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; + +/** + * 定时任务执行日志表 + * + * @author frwcloud + * @date 2019-01-27 13:40:20 + */ +public interface SysJobLogService extends IService { + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobService.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobService.java new file mode 100644 index 00000000..fd7e3ad2 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/SysJobService.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; + +/** + * 定时任务调度表 + * + * @author frwcloud + * @date 2019-01-27 10:04:42 + */ +public interface SysJobService extends IService { + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobLogServiceImpl.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 00000000..23093c5f --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import com.pig4cloud.pig.daemon.quartz.mapper.SysJobLogMapper; +import com.pig4cloud.pig.daemon.quartz.service.SysJobLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 定时任务执行日志表 + * + * @author frwcloud + * @date 2019-01-27 13:40:20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysJobLogServiceImpl extends ServiceImpl implements SysJobLogService { + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobServiceImpl.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 00000000..3ccdc261 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.mapper.SysJobMapper; +import com.pig4cloud.pig.daemon.quartz.service.SysJobService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 定时任务调度表 + * + * @author frwcloud + * @date 2019-01-27 10:04:42 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysJobServiceImpl extends ServiceImpl implements SysJobService { + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/RestTaskDemo.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/RestTaskDemo.java new file mode 100644 index 00000000..188769da --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/RestTaskDemo.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pig.daemon.quartz.task; + +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.security.annotation.Inner; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDateTime; + +/** + * 用于测试REST风格调用的demo + * + * @author lishangbu + * @date 2019/3/25 + */ +@Slf4j +@RestController +@RequestMapping("/inner-job") +public class RestTaskDemo { + + /** + * 测试REST风格调用定时任务的演示方法 + */ + @Inner(value = false) + @GetMapping("/{param}") + public R demoMethod(@PathVariable("param") String param) { + log.info("测试于:{},传入参数{}", LocalDateTime.now(), param); + return R.ok(); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/SpringBeanTaskDemo.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/SpringBeanTaskDemo.java new file mode 100644 index 00000000..7167cb45 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/task/SpringBeanTaskDemo.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.task; + +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * @author 郑健楠 + */ +@Slf4j +@Component("demo") +public class SpringBeanTaskDemo { + + /** + * 测试Spring Bean的演示方法 + */ + @SneakyThrows + public String demoMethod(String para) { + log.info("测试于:{},输入参数{}", LocalDateTime.now(), para); + return PigQuartzEnum.JOB_LOG_STATUS_SUCCESS.getType(); + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/ITaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/ITaskInvok.java new file mode 100644 index 00000000..8db5e563 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/ITaskInvok.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.exception.TaskException; + +/** + * 定时任务反射实现接口类 + * + * @author 郑健楠 + */ +public interface ITaskInvok { + + /** + * 执行反射方法 + * @param sysJob 配置类 + * @throws TaskException + */ + void invokMethod(SysJob sysJob) throws TaskException; + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JarTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JarTaskInvok.java new file mode 100644 index 00000000..87c49c3a --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JarTaskInvok.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.exception.TaskException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 定时任务可执行jar反射实现 + * + * @author 郑健楠 + */ +@Slf4j +@Component("jarTaskInvok") +public class JarTaskInvok implements ITaskInvok { + + @Override + public void invokMethod(SysJob sysJob) throws TaskException { + ProcessBuilder processBuilder = new ProcessBuilder(); + File jar = new File(sysJob.getExecutePath()); + processBuilder.directory(jar.getParentFile()); + List commands = new ArrayList<>(); + commands.add("java"); + commands.add("-jar"); + commands.add(sysJob.getExecutePath()); + if (StrUtil.isNotEmpty(sysJob.getMethodParamsValue())) { + commands.add(sysJob.getMethodParamsValue()); + } + processBuilder.command(commands); + try { + processBuilder.start(); + } + catch (IOException e) { + log.error("定时任务jar反射执行异常,执行任务:{}", sysJob.getExecutePath()); + throw new TaskException("定时任务jar反射执行异常,执行任务:" + sysJob.getExecutePath()); + } + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java new file mode 100644 index 00000000..d8206042 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.exception.TaskException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 定时任务java class反射实现 + * + * @author 郑健楠 + */ +@Component("javaClassTaskInvok") +@Slf4j +public class JavaClassTaskInvok implements ITaskInvok { + + @Override + public void invokMethod(SysJob sysJob) throws TaskException { + Object obj; + Class clazz; + Method method; + Object returnValue; + try { + if (StrUtil.isNotEmpty(sysJob.getMethodParamsValue())) { + clazz = Class.forName(sysJob.getClassName()); + obj = clazz.newInstance(); + method = clazz.getDeclaredMethod(sysJob.getMethodName(), String.class); + returnValue = method.invoke(obj, sysJob.getMethodParamsValue()); + } + else { + clazz = Class.forName(sysJob.getClassName()); + obj = clazz.newInstance(); + method = clazz.getDeclaredMethod(sysJob.getMethodName()); + returnValue = method.invoke(obj); + } + if (StrUtil.isEmpty(returnValue.toString()) + || PigQuartzEnum.JOB_LOG_STATUS_FAIL.getType().equals(returnValue.toString())) { + log.error("定时任务javaClassTaskInvok异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务javaClassTaskInvok业务执行失败,任务:" + sysJob.getClassName()); + } + } + catch (ClassNotFoundException e) { + log.error("定时任务java反射类没有找到,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务java反射类没有找到,执行任务:" + sysJob.getClassName()); + } + catch (IllegalAccessException e) { + log.error("定时任务java反射类异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务java反射类异常,执行任务:" + sysJob.getClassName()); + } + catch (InstantiationException e) { + log.error("定时任务java反射类异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务java反射类异常,执行任务:" + sysJob.getClassName()); + } + catch (NoSuchMethodException e) { + log.error("定时任务java反射执行方法名异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务java反射执行方法名异常,执行任务:" + sysJob.getClassName()); + } + catch (InvocationTargetException e) { + log.error("定时任务java反射执行异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务java反射执行异常,执行任务:" + sysJob.getClassName()); + } + + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/RestTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/RestTaskInvok.java new file mode 100644 index 00000000..e4536cfc --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/RestTaskInvok.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.exception.TaskException; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 定时任务rest反射实现 + * + * @author 郑健楠 + */ +@Slf4j +@AllArgsConstructor +@Component("restTaskInvok") +public class RestTaskInvok implements ITaskInvok { + + @Override + public void invokMethod(SysJob sysJob) throws TaskException { + try { + HttpRequest request = HttpUtil.createGet(sysJob.getExecutePath()); + request.execute(); + } + catch (Exception e) { + log.error("定时任务restTaskInvok异常,执行任务:{}", sysJob.getExecutePath()); + throw new TaskException("定时任务restTaskInvok业务执行失败,任务:" + sysJob.getExecutePath()); + } + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/SpringBeanTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/SpringBeanTaskInvok.java new file mode 100644 index 00000000..bb47d46a --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/SpringBeanTaskInvok.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.exception.TaskException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 定时任务spring bean反射实现 + * + * @author 郑健楠 + */ +@Component("springBeanTaskInvok") +@Slf4j +public class SpringBeanTaskInvok implements ITaskInvok { + + @Override + public void invokMethod(SysJob sysJob) throws TaskException { + Object target; + Method method; + Object returnValue; + // 通过Spring上下文去找 也有可能找不到 + target = SpringContextHolder.getBean(sysJob.getClassName()); + try { + if (StrUtil.isNotEmpty(sysJob.getMethodParamsValue())) { + method = target.getClass().getDeclaredMethod(sysJob.getMethodName(), String.class); + ReflectionUtils.makeAccessible(method); + returnValue = method.invoke(target, sysJob.getMethodParamsValue()); + } + else { + method = target.getClass().getDeclaredMethod(sysJob.getMethodName()); + ReflectionUtils.makeAccessible(method); + returnValue = method.invoke(target); + } + if (StrUtil.isEmpty(returnValue.toString()) + || PigQuartzEnum.JOB_LOG_STATUS_FAIL.getType().equals(returnValue.toString())) { + log.error("定时任务springBeanTaskInvok异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务springBeanTaskInvok业务执行失败,任务:" + sysJob.getClassName()); + } + } + catch (NoSuchMethodException e) { + log.error("定时任务spring bean反射异常方法未找到,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务spring bean反射异常方法未找到,执行任务:" + sysJob.getClassName()); + } + catch (IllegalAccessException e) { + log.error("定时任务spring bean反射异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务spring bean反射异常,执行任务:" + sysJob.getClassName()); + } + catch (InvocationTargetException e) { + log.error("定时任务spring bean反射执行异常,执行任务:{}", sysJob.getClassName()); + throw new TaskException("定时任务spring bean反射执行异常,执行任务:" + sysJob.getClassName()); + } + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokFactory.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokFactory.java new file mode 100644 index 00000000..0d0ae0df --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokFactory.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pig.daemon.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.daemon.quartz.constants.JobTypeQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.exception.TaskException; +import lombok.extern.slf4j.Slf4j; + +/** + * @author Hccake + * @version 1.0 + * @date 2019/8/8 15:40 TaskInvok工厂类 + */ +@Slf4j +public class TaskInvokFactory { + + /** + * 根据对应jobType获取对应 invoker + * @param jobType + * @return + * @throws TaskException + */ + public static ITaskInvok getInvoker(String jobType) throws TaskException { + if (StrUtil.isBlank(jobType)) { + log.info("获取TaskInvok传递参数有误,jobType:{}", jobType); + throw new TaskException(""); + } + + ITaskInvok iTaskInvok = null; + if (JobTypeQuartzEnum.JAVA.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("javaClassTaskInvok"); + } + else if (JobTypeQuartzEnum.SPRING_BEAN.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("springBeanTaskInvok"); + } + else if (JobTypeQuartzEnum.REST.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("restTaskInvok"); + } + else if (JobTypeQuartzEnum.JAR.getType().equals(jobType)) { + iTaskInvok = SpringContextHolder.getBean("jarTaskInvok"); + } + else if (StrUtil.isBlank(jobType)) { + log.info("定时任务类型无对应反射方式,反射类型:{}", jobType); + throw new TaskException(""); + } + + return iTaskInvok; + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokUtil.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokUtil.java new file mode 100644 index 00000000..2f5fc2f7 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskInvokUtil.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import com.pig4cloud.pig.daemon.quartz.entity.SysJobLog; +import com.pig4cloud.pig.daemon.quartz.event.SysJobLogEvent; +import com.pig4cloud.pig.daemon.quartz.service.SysJobService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.CronTrigger; +import org.quartz.Trigger; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +import java.time.ZoneId; +import java.util.Date; + +/** + * 定时任务反射工具类 + * + * @author 郑健楠 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class TaskInvokUtil { + + private final ApplicationEventPublisher publisher; + + private final SysJobService sysJobService; + + @SneakyThrows + public void invokMethod(SysJob sysJob, Trigger trigger) { + + // 执行开始时间 + long startTime; + // 执行结束时间 + long endTime; + // 获取执行开始时间 + startTime = System.currentTimeMillis(); + // 更新定时任务表内的状态、执行时间、上次执行时间、下次执行时间等信息 + SysJob updateSysjob = new SysJob(); + updateSysjob.setJobId(sysJob.getJobId()); + // 日志 + SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobId(sysJob.getJobId()); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setJobOrder(sysJob.getJobOrder()); + sysJobLog.setJobType(sysJob.getJobType()); + sysJobLog.setExecutePath(sysJob.getExecutePath()); + sysJobLog.setClassName(sysJob.getClassName()); + sysJobLog.setMethodName(sysJob.getMethodName()); + sysJobLog.setMethodParamsValue(sysJob.getMethodParamsValue()); + sysJobLog.setCronExpression(sysJob.getCronExpression()); + try { + // 执行任务 + ITaskInvok iTaskInvok = TaskInvokFactory.getInvoker(sysJob.getJobType()); + // 确保租户上下文有值,使得当前线程中的多租户特性生效。 + iTaskInvok.invokMethod(sysJob); + // 记录成功状态 + sysJobLog.setJobMessage(PigQuartzEnum.JOB_LOG_STATUS_SUCCESS.getDescription()); + sysJobLog.setJobLogStatus(PigQuartzEnum.JOB_LOG_STATUS_SUCCESS.getType()); + // 任务表信息更新 + updateSysjob.setJobExecuteStatus(PigQuartzEnum.JOB_LOG_STATUS_SUCCESS.getType()); + } + catch (Throwable e) { + log.error("定时任务执行失败,任务名称:{};任务组名:{},cron执行表达式:{},执行时间:{}", sysJob.getJobName(), sysJob.getJobGroup(), + sysJob.getCronExpression(), new Date()); + // 记录失败状态 + sysJobLog.setJobMessage(PigQuartzEnum.JOB_LOG_STATUS_FAIL.getDescription()); + sysJobLog.setJobLogStatus(PigQuartzEnum.JOB_LOG_STATUS_FAIL.getType()); + sysJobLog.setExceptionInfo(StrUtil.sub(e.getMessage(), 0, 2000)); + // 任务表信息更新 + updateSysjob.setJobExecuteStatus(PigQuartzEnum.JOB_LOG_STATUS_FAIL.getType()); + } + finally { + // 记录执行时间 立刻执行使用的是simpleTeigger + if (trigger instanceof CronTrigger) { + updateSysjob + .setStartTime(trigger.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + updateSysjob.setPreviousTime( + trigger.getPreviousFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + updateSysjob.setNextTime( + trigger.getNextFireTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + } + // 记录执行时长 + endTime = System.currentTimeMillis(); + sysJobLog.setExecuteTime(String.valueOf(endTime - startTime)); + + publisher.publishEvent(new SysJobLogEvent(sysJobLog)); + sysJobService.updateById(updateSysjob); + } + } + +} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskUtil.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskUtil.java new file mode 100644 index 00000000..5890de03 --- /dev/null +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/TaskUtil.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pig.daemon.quartz.util; + +import com.pig4cloud.pig.daemon.quartz.config.PigQuartzFactory; +import com.pig4cloud.pig.daemon.quartz.constants.PigQuartzEnum; +import com.pig4cloud.pig.daemon.quartz.entity.SysJob; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.springframework.stereotype.Component; + +/** + * 定时任务的工具类 + * + * @author 郑健楠 + */ +@Slf4j +@Component +public class TaskUtil { + + /** + * 获取定时任务的唯一key + * @param sysjob + * @return + */ + public static JobKey getJobKey(SysJob sysjob) { + return JobKey.jobKey(sysjob.getJobName(), sysjob.getJobGroup()); + } + + /** + * 获取定时任务触发器cron的唯一key + * @param sysjob + * @return + */ + public static TriggerKey getTriggerKey(SysJob sysjob) { + return TriggerKey.triggerKey(sysjob.getJobName(), sysjob.getJobGroup()); + } + + /** + * 添加或更新定时任务 + * @param sysjob + * @param scheduler + */ + public void addOrUpateJob(SysJob sysjob, Scheduler scheduler) { + CronTrigger trigger = null; + try { + JobKey jobKey = getJobKey(sysjob); + // 获得触发器 + TriggerKey triggerKey = getTriggerKey(sysjob); + trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + // 判断触发器是否存在(如果存在说明之前运行过但是在当前被禁用了,如果不存在说明一次都没运行过) + if (trigger == null) { + // 新建一个工作任务 指定任务类型为串接进行的 + JobDetail jobDetail = JobBuilder.newJob(PigQuartzFactory.class).withIdentity(jobKey).build(); + // 将任务信息添加到任务信息中 + jobDetail.getJobDataMap().put(PigQuartzEnum.SCHEDULE_JOB_KEY.getType(), sysjob); + // 将cron表达式进行转换 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysjob.getCronExpression()); + cronScheduleBuilder = this.handleCronScheduleMisfirePolicy(sysjob, cronScheduleBuilder); + // 创建触发器并将cron表达式对象给塞入 + trigger = TriggerBuilder.newTrigger() + .withIdentity(triggerKey) + .withSchedule(cronScheduleBuilder) + .build(); + // 在调度器中将触发器和任务进行组合 + scheduler.scheduleJob(jobDetail, trigger); + } + else { + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysjob.getCronExpression()); + cronScheduleBuilder = this.handleCronScheduleMisfirePolicy(sysjob, cronScheduleBuilder); + // 按照新的规则进行 + trigger = trigger.getTriggerBuilder() + .withIdentity(triggerKey) + .withSchedule(cronScheduleBuilder) + .build(); + // 将任务信息更新到任务信息中 + trigger.getJobDataMap().put(PigQuartzEnum.SCHEDULE_JOB_KEY.getType(), sysjob); + // 重启 + scheduler.rescheduleJob(triggerKey, trigger); + } + // 如任务状态为暂停 + if (sysjob.getJobStatus().equals(PigQuartzEnum.JOB_STATUS_NOT_RUNNING.getType())) { + this.pauseJob(sysjob, scheduler); + } + } + catch (SchedulerException e) { + log.error("添加或更新定时任务,失败信息:{}", e.getMessage()); + } + } + + /** + * 立即执行一次任务 + */ + public static boolean runOnce(Scheduler scheduler, SysJob sysJob) { + try { + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(PigQuartzEnum.SCHEDULE_JOB_KEY.getType(), sysJob); + + scheduler.triggerJob(getJobKey(sysJob), dataMap); + } + catch (SchedulerException e) { + log.error("立刻执行定时任务,失败信息:{}", e.getMessage()); + return false; + } + + return true; + } + + /** + * 暂停定时任务 + * @param sysjob + * @param scheduler + */ + public void pauseJob(SysJob sysjob, Scheduler scheduler) { + try { + if (scheduler != null) { + scheduler.pauseJob(getJobKey(sysjob)); + } + } + catch (SchedulerException e) { + log.error("暂停任务失败,失败信息:{}", e.getMessage()); + } + + } + + /** + * 恢复定时任务 + * @param sysjob + * @param scheduler + */ + public void resumeJob(SysJob sysjob, Scheduler scheduler) { + try { + if (scheduler != null) { + scheduler.resumeJob(getJobKey(sysjob)); + } + } + catch (SchedulerException e) { + log.error("恢复任务失败,失败信息:{}", e.getMessage()); + } + + } + + /** + * 移除定时任务 + * @param sysjob + * @param scheduler + */ + public void removeJob(SysJob sysjob, Scheduler scheduler) { + try { + if (scheduler != null) { + // 停止触发器 + scheduler.pauseTrigger(getTriggerKey(sysjob)); + // 移除触发器 + scheduler.unscheduleJob(getTriggerKey(sysjob)); + // 删除任务 + scheduler.deleteJob(getJobKey(sysjob)); + } + } + catch (Exception e) { + log.error("移除定时任务失败,失败信息:{}", e.getMessage()); + } + } + + /** + * 启动所有运行定时任务 + * @param scheduler + */ + public void startJobs(Scheduler scheduler) { + try { + if (scheduler != null) { + scheduler.resumeAll(); + } + } + catch (SchedulerException e) { + log.error("启动所有运行定时任务失败,失败信息:{}", e.getMessage()); + } + } + + /** + * 停止所有运行定时任务 + * @param scheduler + */ + public void pauseJobs(Scheduler scheduler) { + try { + if (scheduler != null) { + scheduler.pauseAll(); + } + } + catch (Exception e) { + log.error("暂停所有运行定时任务失败,失败信息:{}", e.getMessage()); + } + } + + /** + * 获取错失执行策略方法 + * @param sysJob + * @param cronScheduleBuilder + * @return + */ + private CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob sysJob, + CronScheduleBuilder cronScheduleBuilder) { + if (PigQuartzEnum.MISFIRE_DEFAULT.getType().equals(sysJob.getMisfirePolicy())) { + return cronScheduleBuilder; + } + else if (PigQuartzEnum.MISFIRE_IGNORE_MISFIRES.getType().equals(sysJob.getMisfirePolicy())) { + return cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); + } + else if (PigQuartzEnum.MISFIRE_FIRE_AND_PROCEED.getType().equals(sysJob.getMisfirePolicy())) { + return cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); + } + else if (PigQuartzEnum.MISFIRE_DO_NOTHING.getType().equals(sysJob.getMisfirePolicy())) { + return cronScheduleBuilder.withMisfireHandlingInstructionDoNothing(); + } + else { + return cronScheduleBuilder; + } + } + + /** + * 判断cron表达式是否正确 + * @param cronExpression + * @return + */ + public boolean isValidCron(String cronExpression) { + return CronExpression.isValidExpression(cronExpression); + } + +} diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml b/pig-visual/pig-quartz/src/main/resources/application.yml similarity index 50% rename from pig-visual/pig-xxl-job-admin/src/main/resources/application.yml rename to pig-visual/pig-quartz/src/main/resources/application.yml index 1de05640..8fb381b3 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml +++ b/pig-visual/pig-quartz/src/main/resources/application.yml @@ -1,12 +1,6 @@ - -# 此配置只适合开发测试环境,详细配置参考: http://t.cn/A64RaHJm server: - port: 5004 - servlet: - context-path: /xxl-job-admin - + port: 5007 -# spring spring: application: name: @artifactId@ @@ -16,12 +10,15 @@ spring: password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} - metadata: - management.context-path: ${server.servlet.context-path}/actuator config: server-addr: ${spring.cloud.nacos.discovery.server-addr} config: import: - optional:nacos:application-@profiles.active@.yml - optional:nacos:${spring.application.name}-@profiles.active@.yml - + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: root + url: jdbc:mysql://pig-mysql:3306/pig_job?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/logback-spring.xml b/pig-visual/pig-quartz/src/main/resources/logback-spring.xml old mode 100755 new mode 100644 similarity index 69% rename from pig-visual/pig-xxl-job-admin/src/main/resources/logback-spring.xml rename to pig-visual/pig-quartz/src/main/resources/logback-spring.xml index fa238198..3ad26f7e --- a/pig-visual/pig-xxl-job-admin/src/main/resources/logback-spring.xml +++ b/pig-visual/pig-quartz/src/main/resources/logback-spring.xml @@ -1,23 +1,14 @@ - + 小技巧: 在根pom里面设置统一存放路径,统一管理方便维护 + + /Users/lengleng + + 1. 其他模块加日志输出,直接copy本文件放在resources 目录即可 + 2. 注意修改 的value模块 +--> - - + @@ -43,7 +34,7 @@ 30 - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} @@ -56,20 +47,23 @@ 30 - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + ${CONSOLE_LOG_PATTERN} ERROR + + + + - - + diff --git a/pig-visual/pig-sentinel-dashboard/Dockerfile b/pig-visual/pig-sentinel-dashboard/Dockerfile deleted file mode 100644 index 9b41f802..00000000 --- a/pig-visual/pig-sentinel-dashboard/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM moxm/java:1.8-full - -RUN mkdir -p /pig-sentinel-dashboard - -WORKDIR /pig-sentinel-dashboard - -ARG JAR_FILE=target/pig-sentinel-dashboard.jar - -COPY ${JAR_FILE} app.jar - -EXPOSE 5003 - -ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom" - -CMD sleep 60; java $JAVA_OPTS -jar app.jar diff --git a/pig-visual/pig-sentinel-dashboard/pom.xml b/pig-visual/pig-sentinel-dashboard/pom.xml deleted file mode 100755 index 9a3fb87e..00000000 --- a/pig-visual/pig-sentinel-dashboard/pom.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - 4.0.0 - - - com.pig4cloud - pig-visual - 3.6.7 - - - pig-sentinel-dashboard - jar - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - com.alibaba.csp - sentinel-core - - - com.alibaba.csp - sentinel-web-servlet - - - com.alibaba.csp - sentinel-transport-simple-http - - - com.alibaba.csp - sentinel-parameter-flow-control - - - com.alibaba.csp - sentinel-api-gateway-adapter-common - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-undertow - - - - commons-lang - commons-lang - 2.6 - - - - org.apache.httpcomponents - httpclient - 4.5.3 - - - org.apache.httpcomponents - httpcore - 4.4.5 - - - org.apache.httpcomponents - httpasyncclient - 4.1.3 - - - org.apache.httpcomponents - httpcore-nio - 4.4.6 - - - - - pig-sentinel-dashboard - - - src/main/resources - true - - - src/main/webapp/ - - resources/node_modules/** - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - false - - - - - diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/PigSentinelApplication.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/PigSentinelApplication.java deleted file mode 100755 index 3fdcd68a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/PigSentinelApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard; - -import com.alibaba.csp.sentinel.init.InitExecutor; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Sentinel dashboard application. - * - * @author Carpenter Lee - */ -@SpringBootApplication -public class PigSentinelApplication { - - public static void main(String[] args) { - triggerSentinelInit(); - SpringApplication.run(PigSentinelApplication.class, args); - } - - private static void triggerSentinelInit() { - new Thread(() -> InitExecutor.doInit()).start(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java deleted file mode 100644 index 484540b0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthAction.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import java.lang.annotation.*; - -/** - * @author lkxiaolou 无改动 - * @since 1.7.1 - */ -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Target({ ElementType.METHOD }) -public @interface AuthAction { - - /** - * @return the privilege type - */ - AuthService.PrivilegeType value(); - - /** - * @return the target name to control - */ - String targetName() default "app"; - - /** - * @return the message when permission is denied - */ - String message() default "Permission denied"; - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java deleted file mode 100644 index fe7ee7f8..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthService.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -/** - * Interface for authentication and authorization. 不需要改 - * - * @author Carpenter Lee - * @since 1.5.0 - */ -public interface AuthService { - - /** - * Get the authentication user. - * @param request the request contains the user information - * @return the auth user represent the current user, when the user is illegal, a null - * value will return. - */ - AuthUser getAuthUser(R request); - - /** - * Privilege type. - */ - enum PrivilegeType { - - /** - * Read rule - */ - READ_RULE, - /** - * Create or modify rule - */ - WRITE_RULE, - /** - * Delete rule - */ - DELETE_RULE, - /** - * Read metrics - */ - READ_METRIC, - /** - * Add machine - */ - ADD_MACHINE, - /** - * All privileges above are granted. - */ - ALL - - } - - /** - * Represents the current user. - */ - interface AuthUser { - - /** - * Query whether current user has the specific privilege to the target, the target - * may be an app name or an ip address, or other destination. - *

- * This method will use return value to represent whether user has the specific - * privileges to the target, but to throw a RuntimeException to represent no auth - * is also a good way. - *

- * @param target the target to check - * @param privilegeType the privilege type to check - * @return if current user has the specific privileges to the target, return true, - * otherwise return false. - */ - boolean authTarget(String target, PrivilegeType privilegeType); - - /** - * Check whether current user is a super-user. - * @return if current user is super user return true, else return false. - */ - boolean isSuperUser(); - - /** - * Get current user's nick name. - * @return current user's nick name. - */ - String getNickName(); - - /** - * Get current user's login name. - * @return current user's login name. - */ - String getLoginName(); - - /** - * Get current user's ID. - * @return ID of current user - */ - String getId(); - - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java deleted file mode 100644 index b527ce7c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/AuthorizationInterceptor.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import org.springframework.web.servlet.HandlerInterceptor; - -/** - * The web interceptor for privilege-based authorization. 不需要改 - * - * @author lkxiaolou - * @author wxq - * @since 1.7.1 - */ -public interface AuthorizationInterceptor extends HandlerInterceptor { - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java deleted file mode 100644 index 56c537c0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultAuthorizationInterceptor.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.fastjson.JSON; -import org.springframework.web.method.HandlerMethod; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.lang.reflect.Method; - -/** - * The web interceptor for privilege-based authorization. 不需要 - *

- * move from old {@link AuthorizationInterceptor}. - * - * @author lkxiaolou - * @author wxq - * @since 1.7.1 - */ -public class DefaultAuthorizationInterceptor implements AuthorizationInterceptor { - - private final AuthService authService; - - public DefaultAuthorizationInterceptor(AuthService authService) { - this.authService = authService; - } - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) - throws Exception { - if (handler.getClass().isAssignableFrom(HandlerMethod.class)) { - Method method = ((HandlerMethod) handler).getMethod(); - - AuthAction authAction = method.getAnnotation(AuthAction.class); - if (authAction != null) { - AuthService.AuthUser authUser = authService.getAuthUser(request); - if (authUser == null) { - responseNoPrivilegeMsg(response, authAction.message()); - return false; - } - String target = request.getParameter(authAction.targetName()); - - if (!authUser.authTarget(target, authAction.value())) { - responseNoPrivilegeMsg(response, authAction.message()); - return false; - } - } - } - - return true; - } - - private void responseNoPrivilegeMsg(HttpServletResponse response, String message) throws IOException { - Result result = Result.ofFail(-1, message); - response.addHeader("Content-Type", "application/json;charset=UTF-8"); - response.getOutputStream().write(JSON.toJSONBytes(result)); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java deleted file mode 100644 index af8c6a3d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; -import org.springframework.util.AntPathMatcher; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.List; - -/** - *

- * The Servlet filter for authentication. - *

- * - *

- * Note: some urls are excluded as they needn't auth, such as: - *

- *
    - *
  • index url: {@code /}
  • - *
  • authentication request url: {@code /login}, {@code /logout}
  • - *
  • machine registry: {@code /registry/machine}
  • - *
  • static resources
  • - *
- *

- * The excluded urls and urlSuffixes could be configured in {@code application.properties} - * file. - * - * @author cdfive 不需要 - * @since 1.6.0 - */ -public class DefaultLoginAuthenticationFilter implements LoginAuthenticationFilter { - - private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher(); - - private static final String URL_SUFFIX_DOT = "."; - - /** - * 忽略鉴权的url - */ - @Value("#{'${auth.filter.exclude-urls}'.split(',')}") - private List authFilterExcludeUrls; - - /** - * 根据后缀不需要鉴权的url - */ - @Value("#{'${auth.filter.exclude-url-suffixes}'.split(',')}") - private List authFilterExcludeUrlSuffixes; - - /** - * Authentication using AuthService interface. - */ - private final AuthService authService; - - public DefaultLoginAuthenticationFilter(AuthService authService) { - this.authService = authService; - } - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - - String servletPath = httpRequest.getServletPath(); - - // Exclude the urls which needn't auth - boolean authFilterExcludeMatch = authFilterExcludeUrls.stream() - .anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath)); - if (authFilterExcludeMatch) { - chain.doFilter(request, response); - return; - } - - // Exclude the urls with suffixes which needn't auth - for (String authFilterExcludeUrlSuffix : authFilterExcludeUrlSuffixes) { - if (StringUtils.isBlank(authFilterExcludeUrlSuffix)) { - continue; - } - - // Add . for url suffix so that we needn't add . in property file - if (!authFilterExcludeUrlSuffix.startsWith(URL_SUFFIX_DOT)) { - authFilterExcludeUrlSuffix = URL_SUFFIX_DOT + authFilterExcludeUrlSuffix; - } - - if (servletPath.endsWith(authFilterExcludeUrlSuffix)) { - chain.doFilter(request, response); - return; - } - } - - AuthService.AuthUser authUser = authService.getAuthUser(httpRequest); - - HttpServletResponse httpResponse = (HttpServletResponse) response; - if (authUser == null) { - // If auth fail, set response status code to 401 - httpResponse.setStatus(HttpStatus.UNAUTHORIZED.value()); - } - else { - chain.doFilter(request, response); - } - } - - @Override - public void destroy() { - - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java deleted file mode 100644 index 73c568e1..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/FakeAuthServiceImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletRequest; - -/** - * A fake AuthService implementation, which will pass all user auth checking. - * - * @author Carpenter Lee - * @since 1.5.0 - */ -public class FakeAuthServiceImpl implements AuthService { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public FakeAuthServiceImpl() { - this.logger.warn("there is no auth, use {} by implementation {}", AuthService.class, this.getClass()); - } - - @Override - public AuthUser getAuthUser(HttpServletRequest request) { - return new AuthUserImpl(); - } - - static final class AuthUserImpl implements AuthUser { - - @Override - public boolean authTarget(String target, PrivilegeType privilegeType) { - // fake implementation, always return true - return true; - } - - @Override - public boolean isSuperUser() { - // fake implementation, always return true - return true; - } - - @Override - public String getNickName() { - return "FAKE_NICK_NAME"; - } - - @Override - public String getLoginName() { - return "FAKE_LOGIN_NAME"; - } - - @Override - public String getId() { - return "FAKE_EMP_ID"; - } - - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java deleted file mode 100644 index b44f1119..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/LoginAuthenticationFilter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import javax.servlet.Filter; - -/** - *

- * The Servlet filter for authentication. - *

- * - *

- * Note: some urls are excluded as they needn't auth, such as: - *

- *
    - *
  • index url: {@code /}
  • - *
  • authentication request url: {@code /login}, {@code /logout}
  • - *
  • machine registry: {@code /registry/machine}
  • - *
  • static resources
  • - *
- *

- * The excluded urls and urlSuffixes could be configured in {@code application.properties} - * file. - * - * @author cdfive 不需要 - * @author wxq - * @since 1.6.0 - */ -public interface LoginAuthenticationFilter extends Filter { - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java deleted file mode 100644 index 6bcfb354..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/SimpleWebAuthServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.auth; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; - -/** - * @author cdfive 不需要 - * @since 1.6.0 - */ -public class SimpleWebAuthServiceImpl implements AuthService { - - public static final String WEB_SESSION_KEY = "session_sentinel_admin"; - - @Override - public AuthUser getAuthUser(HttpServletRequest request) { - HttpSession session = request.getSession(); - Object sentinelUserObj = session.getAttribute(SimpleWebAuthServiceImpl.WEB_SESSION_KEY); - if (sentinelUserObj != null && sentinelUserObj instanceof AuthUser) { - return (AuthUser) sentinelUserObj; - } - - return null; - } - - public static final class SimpleWebAuthUserImpl implements AuthUser { - - private String username; - - public SimpleWebAuthUserImpl(String username) { - this.username = username; - } - - @Override - public boolean authTarget(String target, PrivilegeType privilegeType) { - return true; - } - - @Override - public boolean isSuperUser() { - return true; - } - - @Override - public String getNickName() { - return username; - } - - @Override - public String getLoginName() { - return username; - } - - @Override - public String getId() { - return username; - } - - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java deleted file mode 100644 index 7408a6b2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandFailedException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.client; - -/** - * @author Eric Zhao - */ -public class CommandFailedException extends RuntimeException { - - public CommandFailedException() { - } - - public CommandFailedException(String message) { - super(message); - } - - @Override - public synchronized Throwable fillInStackTrace() { - return this; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java deleted file mode 100644 index 375af110..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/CommandNotFoundException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.client; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -public class CommandNotFoundException extends Exception { - - public CommandNotFoundException() { - } - - public CommandNotFoundException(String message) { - super(message); - } - - @Override - public synchronized Throwable fillInStackTrace() { - return this; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java deleted file mode 100644 index 821727f5..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java +++ /dev/null @@ -1,888 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.client; - -import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule; -import com.alibaba.csp.sentinel.command.CommandConstants; -import com.alibaba.csp.sentinel.command.vo.NodeVo; -import com.alibaba.csp.sentinel.config.SentinelConfig; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.*; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterClientInfoVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterServerStateVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterStateSimpleEntity; -import com.alibaba.csp.sentinel.dashboard.util.AsyncUtils; -import com.alibaba.csp.sentinel.dashboard.util.VersionUtils; -import com.alibaba.csp.sentinel.slots.block.Rule; -import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; -import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; -import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; -import com.alibaba.csp.sentinel.slots.system.SystemRule; -import com.alibaba.csp.sentinel.util.AssertUtil; -import com.alibaba.csp.sentinel.util.StringUtil; -import com.alibaba.fastjson.JSON; -import org.apache.http.Consts; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.concurrent.FutureCallback; -import org.apache.http.entity.ContentType; -import org.apache.http.impl.client.DefaultRedirectStrategy; -import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; -import org.apache.http.impl.nio.client.HttpAsyncClients; -import org.apache.http.impl.nio.reactor.IOReactorConfig; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Component; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.util.*; -import java.util.Map.Entry; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; - -/** - * Communicate with Sentinel client. - * - * @author leyou - */ -@Component -public class SentinelApiClient { - - private static Logger logger = LoggerFactory.getLogger(SentinelApiClient.class); - - private static final Charset DEFAULT_CHARSET = Charset.forName(SentinelConfig.charset()); - - private static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type"; - - private static final String HTTP_HEADER_CONTENT_TYPE_URLENCODED = ContentType.create(URLEncodedUtils.CONTENT_TYPE) - .toString(); - - private static final String RESOURCE_URL_PATH = "jsonTree"; - - private static final String CLUSTER_NODE_PATH = "clusterNode"; - - private static final String GET_RULES_PATH = "getRules"; - - private static final String SET_RULES_PATH = "setRules"; - - private static final String GET_PARAM_RULE_PATH = "getParamFlowRules"; - - private static final String SET_PARAM_RULE_PATH = "setParamFlowRules"; - - private static final String FETCH_CLUSTER_MODE_PATH = "getClusterMode"; - - private static final String MODIFY_CLUSTER_MODE_PATH = "setClusterMode"; - - private static final String FETCH_CLUSTER_CLIENT_CONFIG_PATH = "cluster/client/fetchConfig"; - - private static final String MODIFY_CLUSTER_CLIENT_CONFIG_PATH = "cluster/client/modifyConfig"; - - private static final String FETCH_CLUSTER_SERVER_BASIC_INFO_PATH = "cluster/server/info"; - - private static final String MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH = "cluster/server/modifyTransportConfig"; - - private static final String MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH = "cluster/server/modifyFlowConfig"; - - private static final String MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH = "cluster/server/modifyNamespaceSet"; - - private static final String FETCH_GATEWAY_API_PATH = "gateway/getApiDefinitions"; - - private static final String MODIFY_GATEWAY_API_PATH = "gateway/updateApiDefinitions"; - - private static final String FETCH_GATEWAY_FLOW_RULE_PATH = "gateway/getRules"; - - private static final String MODIFY_GATEWAY_FLOW_RULE_PATH = "gateway/updateRules"; - - private static final String FLOW_RULE_TYPE = "flow"; - - private static final String DEGRADE_RULE_TYPE = "degrade"; - - private static final String SYSTEM_RULE_TYPE = "system"; - - private static final String AUTHORITY_TYPE = "authority"; - - private CloseableHttpAsyncClient httpClient; - - private static final SentinelVersion version160 = new SentinelVersion(1, 6, 0); - - private static final SentinelVersion version171 = new SentinelVersion(1, 7, 1); - - @Autowired - private AppManagement appManagement; - - public SentinelApiClient() { - IOReactorConfig ioConfig = IOReactorConfig.custom() - .setConnectTimeout(3000) - .setSoTimeout(10000) - .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2) - .build(); - httpClient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() { - @Override - protected boolean isRedirectable(final String method) { - return false; - } - }).setMaxConnTotal(4000).setMaxConnPerRoute(1000).setDefaultIOReactorConfig(ioConfig).build(); - httpClient.start(); - } - - private boolean isSuccess(int statusCode) { - return statusCode >= 200 && statusCode < 300; - } - - private boolean isCommandNotFound(int statusCode, String body) { - return statusCode == 400 && StringUtil.isNotEmpty(body) - && body.contains(CommandConstants.MSG_UNKNOWN_COMMAND_PREFIX); - } - - protected boolean isSupportPost(String app, String ip, int port) { - return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app)) - .flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version160))) - .orElse(false); - } - - /** - * Check whether target instance (identified by tuple of app-ip:port) supports the - * form of "xxxxx; xx=xx" in "Content-Type" header. - * @param app target app name - * @param ip target node's address - * @param port target node's port - */ - protected boolean isSupportEnhancedContentType(String app, String ip, int port) { - return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app)) - .flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version171))) - .orElse(false); - } - - private StringBuilder queryString(Map params) { - StringBuilder queryStringBuilder = new StringBuilder(); - for (Entry entry : params.entrySet()) { - if (StringUtil.isEmpty(entry.getValue())) { - continue; - } - String name = urlEncode(entry.getKey()); - String value = urlEncode(entry.getValue()); - if (name != null && value != null) { - if (queryStringBuilder.length() > 0) { - queryStringBuilder.append('&'); - } - queryStringBuilder.append(name).append('=').append(value); - } - } - return queryStringBuilder; - } - - /** - * Build an `HttpUriRequest` in POST way. - * @param url - * @param params - * @param supportEnhancedContentType see - * {@link #isSupportEnhancedContentType(String, String, int)} - * @return - */ - protected static HttpUriRequest postRequest(String url, Map params, - boolean supportEnhancedContentType) { - HttpPost httpPost = new HttpPost(url); - if (params != null && params.size() > 0) { - List list = new ArrayList<>(params.size()); - for (Entry entry : params.entrySet()) { - list.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); - } - httpPost.setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)); - if (!supportEnhancedContentType) { - httpPost.setHeader(HTTP_HEADER_CONTENT_TYPE, HTTP_HEADER_CONTENT_TYPE_URLENCODED); - } - } - return httpPost; - } - - private String urlEncode(String str) { - try { - return URLEncoder.encode(str, DEFAULT_CHARSET.name()); - } - catch (UnsupportedEncodingException e) { - logger.info("encode string error: {}", str, e); - return null; - } - } - - private String getBody(HttpResponse response) throws Exception { - Charset charset = null; - try { - String contentTypeStr = response.getFirstHeader(HTTP_HEADER_CONTENT_TYPE).getValue(); - if (StringUtil.isNotEmpty(contentTypeStr)) { - ContentType contentType = ContentType.parse(contentTypeStr); - charset = contentType.getCharset(); - } - } - catch (Exception ignore) { - } - return EntityUtils.toString(response.getEntity(), charset != null ? charset : DEFAULT_CHARSET); - } - - /** - * With no param - * @param ip - * @param port - * @param api - * @return - */ - private CompletableFuture executeCommand(String ip, int port, String api, boolean useHttpPost) { - return executeCommand(ip, port, api, null, useHttpPost); - } - - /** - * No app specified, force to GET - * @param ip - * @param port - * @param api - * @param params - * @return - */ - private CompletableFuture executeCommand(String ip, int port, String api, Map params, - boolean useHttpPost) { - return executeCommand(null, ip, port, api, params, useHttpPost); - } - - /** - * Prefer to execute request using POST - * @param app - * @param ip - * @param port - * @param api - * @param params - * @return - */ - private CompletableFuture executeCommand(String app, String ip, int port, String api, - Map params, boolean useHttpPost) { - CompletableFuture future = new CompletableFuture<>(); - if (StringUtil.isBlank(ip) || StringUtil.isBlank(api)) { - future.completeExceptionally(new IllegalArgumentException("Bad URL or command name")); - return future; - } - StringBuilder urlBuilder = new StringBuilder(); - urlBuilder.append("http://"); - urlBuilder.append(ip).append(':').append(port).append('/').append(api); - if (params == null) { - params = Collections.emptyMap(); - } - if (!useHttpPost || !isSupportPost(app, ip, port)) { - // Using GET in older versions, append parameters after url - if (!params.isEmpty()) { - if (urlBuilder.indexOf("?") == -1) { - urlBuilder.append('?'); - } - else { - urlBuilder.append('&'); - } - urlBuilder.append(queryString(params)); - } - return executeCommand(new HttpGet(urlBuilder.toString())); - } - else { - // Using POST - return executeCommand( - postRequest(urlBuilder.toString(), params, isSupportEnhancedContentType(app, ip, port))); - } - } - - private CompletableFuture executeCommand(HttpUriRequest request) { - CompletableFuture future = new CompletableFuture<>(); - httpClient.execute(request, new FutureCallback() { - @Override - public void completed(final HttpResponse response) { - int statusCode = response.getStatusLine().getStatusCode(); - try { - String value = getBody(response); - if (isSuccess(statusCode)) { - future.complete(value); - } - else { - if (isCommandNotFound(statusCode, value)) { - future.completeExceptionally(new CommandNotFoundException(request.getURI().getPath())); - } - else { - future.completeExceptionally(new CommandFailedException(value)); - } - } - - } - catch (Exception ex) { - future.completeExceptionally(ex); - logger.error("HTTP request failed: {}", request.getURI().toString(), ex); - } - } - - @Override - public void failed(final Exception ex) { - future.completeExceptionally(ex); - logger.error("HTTP request failed: {}", request.getURI().toString(), ex); - } - - @Override - public void cancelled() { - future.complete(null); - } - }); - return future; - } - - public void close() throws Exception { - httpClient.close(); - } - - @Nullable - private CompletableFuture> fetchItemsAsync(String ip, int port, String api, String type, - Class ruleType) { - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - Map params = null; - if (StringUtil.isNotEmpty(type)) { - params = new HashMap<>(2); - params.put("type", type); - } - return executeCommand(ip, port, api, params, false).thenApply(json -> JSON.parseArray(json, ruleType)); - } - - @Nullable - private List fetchItems(String ip, int port, String api, String type, Class ruleType) { - try { - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - return fetchItemsAsync(ip, port, api, type, ruleType).get(); - } - catch (InterruptedException | ExecutionException e) { - logger.error("Error when fetching items from api: {} -> {}", api, type, e); - return null; - } - catch (Exception e) { - logger.error("Error when fetching items: {} -> {}", api, type, e); - return null; - } - } - - private List fetchRules(String ip, int port, String type, Class ruleType) { - return fetchItems(ip, port, GET_RULES_PATH, type, ruleType); - } - - private boolean setRules(String app, String ip, int port, String type, List entities) { - if (entities == null) { - return true; - } - try { - AssertUtil.notEmpty(app, "Bad app name"); - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - String data = JSON.toJSONString(entities.stream().map(r -> r.toRule()).collect(Collectors.toList())); - Map params = new HashMap<>(4); - params.put("type", type); - params.put("data", data); - String result = executeCommand(app, ip, port, SET_RULES_PATH, params, true).get(); - logger.info("setRules result: {}, type={}", result, type); - return true; - } - catch (InterruptedException e) { - logger.warn("setRules API failed: {}", type, e); - return false; - } - catch (ExecutionException e) { - logger.warn("setRules API failed: {}", type, e.getCause()); - return false; - } - catch (Exception e) { - logger.error("setRules API failed, type={}", type, e); - return false; - } - } - - private CompletableFuture setRulesAsync(String app, String ip, int port, String type, - List entities) { - try { - AssertUtil.notNull(entities, "rules cannot be null"); - AssertUtil.notEmpty(app, "Bad app name"); - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - String data = JSON.toJSONString(entities.stream().map(r -> r.toRule()).collect(Collectors.toList())); - Map params = new HashMap<>(4); - params.put("type", type); - params.put("data", data); - return executeCommand(app, ip, port, SET_RULES_PATH, params, true).thenCompose(r -> { - if ("success".equalsIgnoreCase(r.trim())) { - return CompletableFuture.completedFuture(null); - } - return AsyncUtils.newFailedFuture(new CommandFailedException(r)); - }); - } - catch (Exception e) { - logger.error("setRulesAsync API failed, type={}", type, e); - return AsyncUtils.newFailedFuture(e); - } - } - - public List fetchResourceOfMachine(String ip, int port, String type) { - return fetchItems(ip, port, RESOURCE_URL_PATH, type, NodeVo.class); - } - - /** - * Fetch cluster node. - * @param ip ip to fetch - * @param port port of the ip - * @param includeZero whether zero value should in the result list. - * @return - */ - public List fetchClusterNodeOfMachine(String ip, int port, boolean includeZero) { - String type = "notZero"; - if (includeZero) { - type = "zero"; - } - return fetchItems(ip, port, CLUSTER_NODE_PATH, type, NodeVo.class); - } - - public List fetchFlowRuleOfMachine(String app, String ip, int port) { - List rules = fetchRules(ip, port, FLOW_RULE_TYPE, FlowRule.class); - if (rules != null) { - return rules.stream() - .map(rule -> FlowRuleEntity.fromFlowRule(app, ip, port, rule)) - .collect(Collectors.toList()); - } - else { - return null; - } - } - - public List fetchDegradeRuleOfMachine(String app, String ip, int port) { - List rules = fetchRules(ip, port, DEGRADE_RULE_TYPE, DegradeRule.class); - if (rules != null) { - return rules.stream() - .map(rule -> DegradeRuleEntity.fromDegradeRule(app, ip, port, rule)) - .collect(Collectors.toList()); - } - else { - return null; - } - } - - public List fetchSystemRuleOfMachine(String app, String ip, int port) { - List rules = fetchRules(ip, port, SYSTEM_RULE_TYPE, SystemRule.class); - if (rules != null) { - return rules.stream() - .map(rule -> SystemRuleEntity.fromSystemRule(app, ip, port, rule)) - .collect(Collectors.toList()); - } - else { - return null; - } - } - - /** - * Fetch all parameter flow rules from provided machine. - * @param app application name - * @param ip machine client IP - * @param port machine client port - * @return all retrieved parameter flow rules - * @since 0.2.1 - */ - public CompletableFuture> fetchParamFlowRulesOfMachine(String app, String ip, int port) { - try { - AssertUtil.notEmpty(app, "Bad app name"); - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - return fetchItemsAsync(ip, port, GET_PARAM_RULE_PATH, null, ParamFlowRule.class) - .thenApply(rules -> rules.stream() - .map(e -> ParamFlowRuleEntity.fromParamFlowRule(app, ip, port, e)) - .collect(Collectors.toList())); - } - catch (Exception e) { - logger.error("Error when fetching parameter flow rules", e); - return AsyncUtils.newFailedFuture(e); - } - } - - /** - * Fetch all authority rules from provided machine. - * @param app application name - * @param ip machine client IP - * @param port machine client port - * @return all retrieved authority rules - * @since 0.2.1 - */ - public List fetchAuthorityRulesOfMachine(String app, String ip, int port) { - AssertUtil.notEmpty(app, "Bad app name"); - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - Map params = new HashMap<>(2); - params.put("type", AUTHORITY_TYPE); - List rules = fetchRules(ip, port, AUTHORITY_TYPE, AuthorityRule.class); - return Optional.ofNullable(rules) - .map(r -> r.stream() - .map(e -> AuthorityRuleEntity.fromAuthorityRule(app, ip, port, e)) - .collect(Collectors.toList())) - .orElse(null); - } - - /** - * set rules of the machine. rules == null will return immediately; rules.isEmpty() - * means setting the rules to empty. - * @param app - * @param ip - * @param port - * @param rules - * @return whether successfully set the rules. - */ - public boolean setFlowRuleOfMachine(String app, String ip, int port, List rules) { - return setRules(app, ip, port, FLOW_RULE_TYPE, rules); - } - - public CompletableFuture setFlowRuleOfMachineAsync(String app, String ip, int port, - List rules) { - return setRulesAsync(app, ip, port, FLOW_RULE_TYPE, rules); - } - - /** - * set rules of the machine. rules == null will return immediately; rules.isEmpty() - * means setting the rules to empty. - * @param app - * @param ip - * @param port - * @param rules - * @return whether successfully set the rules. - */ - public boolean setDegradeRuleOfMachine(String app, String ip, int port, List rules) { - return setRules(app, ip, port, DEGRADE_RULE_TYPE, rules); - } - - /** - * set rules of the machine. rules == null will return immediately; rules.isEmpty() - * means setting the rules to empty. - * @param app - * @param ip - * @param port - * @param rules - * @return whether successfully set the rules. - */ - public boolean setSystemRuleOfMachine(String app, String ip, int port, List rules) { - return setRules(app, ip, port, SYSTEM_RULE_TYPE, rules); - } - - public boolean setAuthorityRuleOfMachine(String app, String ip, int port, List rules) { - return setRules(app, ip, port, AUTHORITY_TYPE, rules); - } - - public CompletableFuture setParamFlowRuleOfMachine(String app, String ip, int port, - List rules) { - if (rules == null) { - return CompletableFuture.completedFuture(null); - } - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - String data = JSON - .toJSONString(rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())); - Map params = new HashMap<>(2); - params.put("data", data); - return executeCommand(app, ip, port, SET_PARAM_RULE_PATH, params, true).thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Push parameter flow rules to client failed: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); - } - catch (Exception ex) { - logger.warn("Error when setting parameter flow rule", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - // Cluster related - - public CompletableFuture fetchClusterMode(String ip, int port) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - return executeCommand(ip, port, FETCH_CLUSTER_MODE_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterStateSimpleEntity.class)); - } - catch (Exception ex) { - logger.warn("Error when fetching cluster mode", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture modifyClusterMode(String ip, int port, int mode) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - Map params = new HashMap<>(2); - params.put("mode", String.valueOf(mode)); - return executeCommand(ip, port, MODIFY_CLUSTER_MODE_PATH, params, false).thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster mode: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); - } - catch (Exception ex) { - logger.warn("Error when modifying cluster mode", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture fetchClusterClientInfoAndConfig(String ip, int port) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - return executeCommand(ip, port, FETCH_CLUSTER_CLIENT_CONFIG_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterClientInfoVO.class)); - } - catch (Exception ex) { - logger.warn("Error when fetching cluster client config", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture modifyClusterClientConfig(String app, String ip, int port, - ClusterClientConfig config) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - Map params = new HashMap<>(2); - params.put("data", JSON.toJSONString(config)); - return executeCommand(app, ip, port, MODIFY_CLUSTER_CLIENT_CONFIG_PATH, params, true).thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster client config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); - } - catch (Exception ex) { - logger.warn("Error when modifying cluster client config", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture modifyClusterServerFlowConfig(String app, String ip, int port, - ServerFlowConfig config) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - Map params = new HashMap<>(2); - params.put("data", JSON.toJSONString(config)); - return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH, params, true) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server flow config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); - } - catch (Exception ex) { - logger.warn("Error when modifying cluster server flow config", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture modifyClusterServerTransportConfig(String app, String ip, int port, - ServerTransportConfig config) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - Map params = new HashMap<>(4); - params.put("port", config.getPort().toString()); - params.put("idleSeconds", config.getIdleSeconds().toString()); - return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH, params, false) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server transport config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); - } - catch (Exception ex) { - logger.warn("Error when modifying cluster server transport config", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture modifyClusterServerNamespaceSet(String app, String ip, int port, Set set) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - Map params = new HashMap<>(2); - params.put("data", JSON.toJSONString(set)); - return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH, params, true) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server NamespaceSet", e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); - } - catch (Exception ex) { - logger.warn("Error when modifying cluster server NamespaceSet", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture fetchClusterServerBasicInfo(String ip, int port) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - try { - return executeCommand(ip, port, FETCH_CLUSTER_SERVER_BASIC_INFO_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterServerStateVO.class)); - } - catch (Exception ex) { - logger.warn("Error when fetching cluster sever all config and basic info", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public CompletableFuture> fetchApis(String app, String ip, int port) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - - try { - return executeCommand(ip, port, FETCH_GATEWAY_API_PATH, false).thenApply(r -> { - List entities = JSON.parseArray(r, ApiDefinitionEntity.class); - if (entities != null) { - for (ApiDefinitionEntity entity : entities) { - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - } - } - return entities; - }); - } - catch (Exception ex) { - logger.warn("Error when fetching gateway apis", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public boolean modifyApis(String app, String ip, int port, List apis) { - if (apis == null) { - return true; - } - - try { - AssertUtil.notEmpty(app, "Bad app name"); - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - String data = JSON.toJSONString(apis.stream().map(r -> r.toApiDefinition()).collect(Collectors.toList())); - Map params = new HashMap<>(2); - params.put("data", data); - String result = executeCommand(app, ip, port, MODIFY_GATEWAY_API_PATH, params, true).get(); - logger.info("Modify gateway apis: {}", result); - return true; - } - catch (Exception e) { - logger.warn("Error when modifying gateway apis", e); - return false; - } - } - - public CompletableFuture> fetchGatewayFlowRules(String app, String ip, int port) { - if (StringUtil.isBlank(ip) || port <= 0) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); - } - - try { - return executeCommand(ip, port, FETCH_GATEWAY_FLOW_RULE_PATH, false).thenApply(r -> { - List gatewayFlowRules = JSON.parseArray(r, GatewayFlowRule.class); - List entities = gatewayFlowRules.stream() - .map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)) - .collect(Collectors.toList()); - return entities; - }); - } - catch (Exception ex) { - logger.warn("Error when fetching gateway flow rules", ex); - return AsyncUtils.newFailedFuture(ex); - } - } - - public boolean modifyGatewayFlowRules(String app, String ip, int port, List rules) { - if (rules == null) { - return true; - } - - try { - AssertUtil.notEmpty(app, "Bad app name"); - AssertUtil.notEmpty(ip, "Bad machine IP"); - AssertUtil.isTrue(port > 0, "Bad machine port"); - String data = JSON - .toJSONString(rules.stream().map(r -> r.toGatewayFlowRule()).collect(Collectors.toList())); - Map params = new HashMap<>(2); - params.put("data", data); - String result = executeCommand(app, ip, port, MODIFY_GATEWAY_FLOW_RULE_PATH, params, true).get(); - logger.info("Modify gateway flow rules: {}", result); - return true; - } - catch (Exception e) { - logger.warn("Error when modifying gateway apis", e); - return false; - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java deleted file mode 100644 index 63ad89a2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/AuthConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.config; - -import com.alibaba.csp.sentinel.dashboard.auth.*; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.servlet.http.HttpServletRequest; - -@Configuration -@EnableConfigurationProperties(AuthProperties.class) -public class AuthConfiguration { - - private final AuthProperties authProperties; - - public AuthConfiguration(AuthProperties authProperties) { - this.authProperties = authProperties; - } - - @Bean - @ConditionalOnMissingBean - public AuthService httpServletRequestAuthService() { - if (this.authProperties.isEnabled()) { - return new SimpleWebAuthServiceImpl(); - } - return new FakeAuthServiceImpl(); - } - - @Bean - @ConditionalOnMissingBean - public LoginAuthenticationFilter loginAuthenticationFilter( - AuthService httpServletRequestAuthService) { - return new DefaultLoginAuthenticationFilter(httpServletRequestAuthService); - } - - @Bean - @ConditionalOnMissingBean - public AuthorizationInterceptor authorizationInterceptor( - AuthService httpServletRequestAuthService) { - return new DefaultAuthorizationInterceptor(httpServletRequestAuthService); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java deleted file mode 100644 index 1684e5f2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/DashboardConfig.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.config; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.math.NumberUtils; -import org.springframework.lang.NonNull; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - *

- * Dashboard local config support. - *

- *

- * Dashboard supports configuration loading by several ways by order:
- * 1. System.properties
- * 2. Env - *

- * - * @author jason - * @since 1.5.0 - */ -public class DashboardConfig { - - public static final int DEFAULT_MACHINE_HEALTHY_TIMEOUT_MS = 60_000; - - /** - * Login username - */ - public static final String CONFIG_AUTH_USERNAME = "sentinel.dashboard.auth.username"; - - /** - * Login password - */ - public static final String CONFIG_AUTH_PASSWORD = "sentinel.dashboard.auth.password"; - - /** - * Hide application name in sidebar when it has no healthy machines after specific - * period in millisecond. - */ - public static final String CONFIG_HIDE_APP_NO_MACHINE_MILLIS = "sentinel.dashboard.app.hideAppNoMachineMillis"; - - /** - * Remove application when it has no healthy machines after specific period in - * millisecond. - */ - public static final String CONFIG_REMOVE_APP_NO_MACHINE_MILLIS = "sentinel.dashboard.removeAppNoMachineMillis"; - - /** - * Timeout - */ - public static final String CONFIG_UNHEALTHY_MACHINE_MILLIS = "sentinel.dashboard.unhealthyMachineMillis"; - - /** - * Auto remove unhealthy machine after specific period in millisecond. - */ - public static final String CONFIG_AUTO_REMOVE_MACHINE_MILLIS = "sentinel.dashboard.autoRemoveMachineMillis"; - - private static final ConcurrentMap cacheMap = new ConcurrentHashMap<>(); - - @NonNull - private static String getConfig(String name) { - // env - String val = System.getenv(name); - if (StringUtils.isNotEmpty(val)) { - return val; - } - // properties - val = System.getProperty(name); - if (StringUtils.isNotEmpty(val)) { - return val; - } - return ""; - } - - protected static String getConfigStr(String name) { - if (cacheMap.containsKey(name)) { - return (String) cacheMap.get(name); - } - - String val = getConfig(name); - - if (StringUtils.isBlank(val)) { - return null; - } - - cacheMap.put(name, val); - return val; - } - - protected static int getConfigInt(String name, int defaultVal, int minVal) { - if (cacheMap.containsKey(name)) { - return (int) cacheMap.get(name); - } - int val = NumberUtils.toInt(getConfig(name)); - if (val == 0) { - val = defaultVal; - } - else if (val < minVal) { - val = minVal; - } - cacheMap.put(name, val); - return val; - } - - public static String getAuthUsername() { - return getConfigStr(CONFIG_AUTH_USERNAME); - } - - public static String getAuthPassword() { - return getConfigStr(CONFIG_AUTH_PASSWORD); - } - - public static int getHideAppNoMachineMillis() { - return getConfigInt(CONFIG_HIDE_APP_NO_MACHINE_MILLIS, 0, 60000); - } - - public static int getRemoveAppNoMachineMillis() { - return getConfigInt(CONFIG_REMOVE_APP_NO_MACHINE_MILLIS, 0, 120000); - } - - public static int getAutoRemoveMachineMillis() { - return getConfigInt(CONFIG_AUTO_REMOVE_MACHINE_MILLIS, 0, 300000); - } - - public static int getUnhealthyMachineMillis() { - return getConfigInt(CONFIG_UNHEALTHY_MACHINE_MILLIS, DEFAULT_MACHINE_HEALTHY_TIMEOUT_MS, 30000); - } - - public static void clearCache() { - cacheMap.clear(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java deleted file mode 100644 index 1ec063f9..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/WebConfig.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.config; - -import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; -import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager; -import com.alibaba.csp.sentinel.dashboard.auth.AuthorizationInterceptor; -import com.alibaba.csp.sentinel.dashboard.auth.LoginAuthenticationFilter; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import javax.annotation.PostConstruct; -import javax.servlet.Filter; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * @author leyou - */ -@Configuration -public class WebConfig implements WebMvcConfigurer { - - private final Logger logger = LoggerFactory.getLogger(WebConfig.class); - - @Autowired - private LoginAuthenticationFilter loginAuthenticationFilter; - - @Autowired - private AuthorizationInterceptor authorizationInterceptor; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(authorizationInterceptor).addPathPatterns("/**"); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/**").addResourceLocations("classpath:/resources/"); - } - - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/").setViewName("forward:/index.htm"); - } - - /** - * Add {@link CommonFilter} to the server, this is the simplest way to use Sentinel - * for Web application. - */ - @Bean - public FilterRegistrationBean sentinelFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean<>(); - registration.setFilter(new CommonFilter()); - registration.addUrlPatterns("/*"); - registration.setName("sentinelFilter"); - registration.setOrder(1); - // If this is enabled, the entrance of all Web URL resources will be unified as a - // single context name. - // In most scenarios that's enough, and it could reduce the memory footprint. - registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "true"); - - logger.info("Sentinel servlet CommonFilter registered"); - - return registration; - } - - @PostConstruct - public void doInit() { - Set suffixSet = new HashSet<>(Arrays.asList(".js", ".css", ".html", ".ico", ".txt", ".woff", ".woff2")); - // Example: register a UrlCleaner to exclude URLs of common static resources. - WebCallbackManager.setUrlCleaner(url -> { - if (StringUtil.isEmpty(url)) { - return url; - } - if (suffixSet.stream().anyMatch(url::endsWith)) { - return null; - } - return url; - }); - } - - @Bean - public FilterRegistrationBean authenticationFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean<>(); - registration.setFilter(loginAuthenticationFilter); - registration.addUrlPatterns("/*"); - registration.setName("authenticationFilter"); - registration.setOrder(0); - return registration; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java deleted file mode 100644 index 1efc019e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.vo.MachineInfoVo; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author Carpenter Lee - */ -@RestController -@RequestMapping(value = "/app") -public class AppController { - - @Autowired - private AppManagement appManagement; - - @GetMapping("/names.json") - public Result> queryApps(HttpServletRequest request) { - return Result.ofSuccess(appManagement.getAppNames()); - } - - @GetMapping("/briefinfos.json") - public Result> queryAppInfos(HttpServletRequest request) { - List list = new ArrayList<>(appManagement.getBriefApps()); - Collections.sort(list, Comparator.comparing(AppInfo::getApp)); - return Result.ofSuccess(list); - } - - @GetMapping(value = "/{app}/machines.json") - public Result> getMachinesByApp(@PathVariable("app") String app) { - AppInfo appInfo = appManagement.getDetailApp(app); - if (appInfo == null) { - return Result.ofSuccess(null); - } - List list = new ArrayList<>(appInfo.getMachines()); - Collections.sort(list, - Comparator.comparing(MachineInfo::getApp) - .thenComparing(MachineInfo::getIp) - .thenComparingInt(MachineInfo::getPort)); - return Result.ofSuccess(MachineInfoVo.fromMachineInfoList(list)); - } - - @RequestMapping(value = "/{app}/machine/remove.json") - public Result removeMachineById(@PathVariable("app") String app, @RequestParam(name = "ip") String ip, - @RequestParam(name = "port") int port) { - AppInfo appInfo = appManagement.getDetailApp(app); - if (appInfo == null) { - return Result.ofSuccess(null); - } - if (appManagement.removeMachine(app, ip, port)) { - return Result.ofSuccessMsg("success"); - } - else { - return Result.ofFail(1, "remove failed"); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java deleted file mode 100644 index 0954f38a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthController.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthService; -import com.alibaba.csp.sentinel.dashboard.auth.SimpleWebAuthServiceImpl; -import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; - -/** - * @author cdfive - * @since 1.6.0 - */ -@RestController -@RequestMapping("/auth") -public class AuthController { - - private static final Logger LOGGER = LoggerFactory.getLogger(AuthController.class); - - @Value("${auth.username:sentinel}") - private String authUsername; - - @Value("${auth.password:sentinel}") - private String authPassword; - - @Autowired - private AuthService authService; - - @PostMapping("/login") - public Result login(HttpServletRequest request, String username, String password) { - if (StringUtils.isNotBlank(DashboardConfig.getAuthUsername())) { - authUsername = DashboardConfig.getAuthUsername(); - } - - if (StringUtils.isNotBlank(DashboardConfig.getAuthPassword())) { - authPassword = DashboardConfig.getAuthPassword(); - } - - /* - * If auth.username or auth.password is blank(set in application.properties or VM - * arguments), auth will pass, as the front side validate the input which can't be - * blank, so user can input any username or password(both are not blank) to login - * in that case. - */ - if (StringUtils.isNotBlank(authUsername) && !authUsername.equals(username) - || StringUtils.isNotBlank(authPassword) && !authPassword.equals(password)) { - LOGGER.error("Login failed: Invalid username or password, username=" + username); - return Result.ofFail(-1, "Invalid username or password"); - } - - AuthService.AuthUser authUser = new SimpleWebAuthServiceImpl.SimpleWebAuthUserImpl(username); - request.getSession().setAttribute(SimpleWebAuthServiceImpl.WEB_SESSION_KEY, authUser); - return Result.ofSuccess(authUser); - } - - @PostMapping(value = "/logout") - public Result logout(HttpServletRequest request) { - request.getSession().invalidate(); - return Result.ofSuccess(null); - } - - @PostMapping(value = "/check") - public Result check(HttpServletRequest request) { - AuthService.AuthUser authUser = authService.getAuthUser(request); - if (authUser == null) { - return Result.ofFail(-1, "Not logged in"); - } - return Result.ofSuccess(authUser); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java deleted file mode 100644 index 1d14a88d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository; -import com.alibaba.csp.sentinel.slots.block.RuleConstant; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Date; -import java.util.List; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -@RestController -@RequestMapping(value = "/authority") -public class AuthorityRuleController { - - private final Logger logger = LoggerFactory.getLogger(AuthorityRuleController.class); - - @Autowired - private SentinelApiClient sentinelApiClient; - - @Autowired - private RuleRepository repository; - - @GetMapping("/rules") - @AuthAction(PrivilegeType.READ_RULE) - public Result> apiQueryAllRulesForMachine(@RequestParam String app, - @RequestParam String ip, @RequestParam Integer port) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip cannot be null or empty"); - } - if (port == null || port <= 0) { - return Result.ofFail(-1, "Invalid parameter: port"); - } - try { - List rules = sentinelApiClient.fetchAuthorityRulesOfMachine(app, ip, port); - rules = repository.saveAll(rules); - return Result.ofSuccess(rules); - } - catch (Throwable throwable) { - logger.error("Error when querying authority rules", throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - private Result checkEntityInternal(AuthorityRuleEntity entity) { - if (entity == null) { - return Result.ofFail(-1, "bad rule body"); - } - if (StringUtil.isBlank(entity.getApp())) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isBlank(entity.getIp())) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (entity.getPort() == null || entity.getPort() <= 0) { - return Result.ofFail(-1, "port can't be null"); - } - if (entity.getRule() == null) { - return Result.ofFail(-1, "rule can't be null"); - } - if (StringUtil.isBlank(entity.getResource())) { - return Result.ofFail(-1, "resource name cannot be null or empty"); - } - if (StringUtil.isBlank(entity.getLimitApp())) { - return Result.ofFail(-1, "limitApp should be valid"); - } - if (entity.getStrategy() != RuleConstant.AUTHORITY_WHITE - && entity.getStrategy() != RuleConstant.AUTHORITY_BLACK) { - return Result.ofFail(-1, "Unknown strategy (must be blacklist or whitelist)"); - } - return null; - } - - @PostMapping("/rule") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiAddAuthorityRule(@RequestBody AuthorityRuleEntity entity) { - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - entity.setId(null); - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("Failed to add authority rule", throwable); - return Result.ofThrowable(-1, throwable); - } - if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) { - logger.info("Publish authority rules failed after rule add"); - } - return Result.ofSuccess(entity); - } - - @PutMapping("/rule/{id}") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiUpdateParamFlowRule(@PathVariable("id") Long id, - @RequestBody AuthorityRuleEntity entity) { - if (id == null || id <= 0) { - return Result.ofFail(-1, "Invalid id"); - } - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - entity.setId(id); - Date date = new Date(); - entity.setGmtCreate(null); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - if (entity == null) { - return Result.ofFail(-1, "Failed to save authority rule"); - } - } - catch (Throwable throwable) { - logger.error("Failed to save authority rule", throwable); - return Result.ofThrowable(-1, throwable); - } - if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) { - logger.info("Publish authority rules failed after rule update"); - } - return Result.ofSuccess(entity); - } - - @DeleteMapping("/rule/{id}") - @AuthAction(PrivilegeType.DELETE_RULE) - public Result apiDeleteRule(@PathVariable("id") Long id) { - if (id == null) { - return Result.ofFail(-1, "id cannot be null"); - } - AuthorityRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - try { - repository.delete(id); - } - catch (Exception e) { - return Result.ofFail(-1, e.getMessage()); - } - if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) { - logger.error("Publish authority rules failed after rule delete"); - } - return Result.ofSuccess(id); - } - - private boolean publishRules(String app, String ip, Integer port) { - List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.setAuthorityRuleOfMachine(app, ip, port, rules); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java deleted file mode 100644 index 3c0cc843..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository; -import com.alibaba.csp.sentinel.slots.block.RuleConstant; -import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreakerStrategy; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Date; -import java.util.List; - -/** - * Controller regarding APIs of degrade rules. Refactored since 1.8.0. - * - * @author Carpenter Lee - * @author Eric Zhao - */ -@RestController -@RequestMapping("/degrade") -public class DegradeController { - - private final Logger logger = LoggerFactory.getLogger(DegradeController.class); - - @Autowired - private RuleRepository repository; - - @Autowired - private SentinelApiClient sentinelApiClient; - - @GetMapping("/rules.json") - @AuthAction(PrivilegeType.READ_RULE) - public Result> apiQueryMachineRules(String app, String ip, Integer port) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - try { - List rules = sentinelApiClient.fetchDegradeRuleOfMachine(app, ip, port); - rules = repository.saveAll(rules); - return Result.ofSuccess(rules); - } - catch (Throwable throwable) { - logger.error("queryApps error:", throwable); - return Result.ofThrowable(-1, throwable); - } - } - - @PostMapping("/rule") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiAddRule(@RequestBody DegradeRuleEntity entity) { - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - } - catch (Throwable t) { - logger.error("Failed to add new degrade rule, app={}, ip={}", entity.getApp(), entity.getIp(), t); - return Result.ofThrowable(-1, t); - } - if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) { - logger.warn("Publish degrade rules failed, app={}", entity.getApp()); - } - return Result.ofSuccess(entity); - } - - @PutMapping("/rule/{id}") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiUpdateRule(@PathVariable("id") Long id, @RequestBody DegradeRuleEntity entity) { - if (id == null || id <= 0) { - return Result.ofFail(-1, "id can't be null or negative"); - } - DegradeRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofFail(-1, "Degrade rule does not exist, id=" + id); - } - entity.setApp(oldEntity.getApp()); - entity.setIp(oldEntity.getIp()); - entity.setPort(oldEntity.getPort()); - entity.setId(oldEntity.getId()); - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - - entity.setGmtCreate(oldEntity.getGmtCreate()); - entity.setGmtModified(new Date()); - try { - entity = repository.save(entity); - } - catch (Throwable t) { - logger.error("Failed to save degrade rule, id={}, rule={}", id, entity, t); - return Result.ofThrowable(-1, t); - } - if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) { - logger.warn("Publish degrade rules failed, app={}", entity.getApp()); - } - return Result.ofSuccess(entity); - } - - @DeleteMapping("/rule/{id}") - @AuthAction(PrivilegeType.DELETE_RULE) - public Result delete(@PathVariable("id") Long id) { - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - - DegradeRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - - try { - repository.delete(id); - } - catch (Throwable throwable) { - logger.error("Failed to delete degrade rule, id={}", id, throwable); - return Result.ofThrowable(-1, throwable); - } - if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) { - logger.warn("Publish degrade rules failed, app={}", oldEntity.getApp()); - } - return Result.ofSuccess(id); - } - - private boolean publishRules(String app, String ip, Integer port) { - List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.setDegradeRuleOfMachine(app, ip, port, rules); - } - - private Result checkEntityInternal(DegradeRuleEntity entity) { - if (StringUtil.isBlank(entity.getApp())) { - return Result.ofFail(-1, "app can't be blank"); - } - if (StringUtil.isBlank(entity.getIp())) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (entity.getPort() == null || entity.getPort() <= 0) { - return Result.ofFail(-1, "invalid port: " + entity.getPort()); - } - if (StringUtil.isBlank(entity.getLimitApp())) { - return Result.ofFail(-1, "limitApp can't be null or empty"); - } - if (StringUtil.isBlank(entity.getResource())) { - return Result.ofFail(-1, "resource can't be null or empty"); - } - Double threshold = entity.getCount(); - if (threshold == null || threshold < 0) { - return Result.ofFail(-1, "invalid threshold: " + threshold); - } - Integer recoveryTimeoutSec = entity.getTimeWindow(); - if (recoveryTimeoutSec == null || recoveryTimeoutSec <= 0) { - return Result.ofFail(-1, "recoveryTimeout should be positive"); - } - Integer strategy = entity.getGrade(); - if (strategy == null) { - return Result.ofFail(-1, "circuit breaker strategy cannot be null"); - } - if (strategy < CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType() - || strategy > RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) { - return Result.ofFail(-1, "Invalid circuit breaker strategy: " + strategy); - } - if (entity.getMinRequestAmount() == null || entity.getMinRequestAmount() <= 0) { - return Result.ofFail(-1, "Invalid minRequestAmount"); - } - if (entity.getStatIntervalMs() == null || entity.getStatIntervalMs() <= 0) { - return Result.ofFail(-1, "Invalid statInterval"); - } - if (strategy == RuleConstant.DEGRADE_GRADE_RT) { - Double slowRatio = entity.getSlowRatioThreshold(); - if (slowRatio == null) { - return Result.ofFail(-1, "SlowRatioThreshold is required for slow request ratio strategy"); - } - else if (slowRatio < 0 || slowRatio > 1) { - return Result.ofFail(-1, "SlowRatioThreshold should be in range: [0.0, 1.0]"); - } - } - else if (strategy == RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) { - if (threshold > 1) { - return Result.ofFail(-1, "Ratio threshold should be in range: [0.0, 1.0]"); - } - } - return null; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java deleted file mode 100644 index 0a620738..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.Entry; -import com.alibaba.csp.sentinel.EntryType; -import com.alibaba.csp.sentinel.SphU; -import com.alibaba.csp.sentinel.context.ContextUtil; -import com.alibaba.csp.sentinel.slots.block.BlockException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.Random; -import java.util.concurrent.TimeUnit; - -@Controller -@RequestMapping(value = "/demo", produces = MediaType.APPLICATION_JSON_VALUE) -public class DemoController { - - Logger logger = LoggerFactory.getLogger(MachineRegistryController.class); - - @RequestMapping("/greeting") - public String greeting() { - return "index"; - } - - @RequestMapping("/link") - @ResponseBody - public String link() throws BlockException { - - Entry entry = SphU.entry("head1", EntryType.IN); - - Entry entry1 = SphU.entry("head2", EntryType.IN); - Entry entry2 = SphU.entry("head3", EntryType.IN); - Entry entry3 = SphU.entry("head4", EntryType.IN); - - entry3.exit(); - entry2.exit(); - entry1.exit(); - entry.exit(); - return "successfully create a call link"; - } - - @RequestMapping("/loop") - @ResponseBody - public String loop(String name, int time) throws BlockException { - for (int i = 0; i < 10; i++) { - Thread timer = new Thread(new RunTask(name, time, false)); - timer.setName("false"); - timer.start(); - } - return "successfully create a loop thread"; - } - - @RequestMapping("/slow") - @ResponseBody - public String slow(String name, int time) throws BlockException { - for (int i = 0; i < 10; i++) { - Thread timer = new Thread(new RunTask(name, time, true)); - timer.setName("false"); - timer.start(); - } - return "successfully create a loop thread"; - } - - static class RunTask implements Runnable { - - int time; - - boolean stop = false; - - String name; - - boolean slow = false; - - public RunTask(String name, int time, boolean slow) { - super(); - this.time = time; - this.name = name; - this.slow = slow; - } - - @Override - public void run() { - long startTime = System.currentTimeMillis(); - ContextUtil.enter(String.valueOf(startTime)); - while (!stop) { - - long now = System.currentTimeMillis(); - if (now - startTime > time * 1000) { - stop = true; - } - Entry e1 = null; - try { - e1 = SphU.entry(name); - - if (slow) { - TimeUnit.MILLISECONDS.sleep(3000); - } - - } - catch (Exception e) { - } - finally { - if (e1 != null) { - e1.exit(); - } - } - Random random2 = new Random(); - try { - TimeUnit.MILLISECONDS.sleep(random2.nextInt(200)); - } - catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - ContextUtil.exit(); - } - - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java deleted file mode 100644 index 47d8d1c0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Date; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - -/** - * Flow rule controller. - * - * @author leyou - * @author Eric Zhao - */ -@RestController -@RequestMapping(value = "/v1/flow") -public class FlowControllerV1 { - - private final Logger logger = LoggerFactory.getLogger(FlowControllerV1.class); - - @Autowired - private InMemoryRuleRepositoryAdapter repository; - - @Autowired - private SentinelApiClient sentinelApiClient; - - @GetMapping("/rules") - @AuthAction(PrivilegeType.READ_RULE) - public Result> apiQueryMachineRules(@RequestParam String app, @RequestParam String ip, - @RequestParam Integer port) { - - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - try { - List rules = sentinelApiClient.fetchFlowRuleOfMachine(app, ip, port); - rules = repository.saveAll(rules); - return Result.ofSuccess(rules); - } - catch (Throwable throwable) { - logger.error("Error when querying flow rules", throwable); - return Result.ofThrowable(-1, throwable); - } - } - - private Result checkEntityInternal(FlowRuleEntity entity) { - if (StringUtil.isBlank(entity.getApp())) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isBlank(entity.getIp())) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (entity.getPort() == null) { - return Result.ofFail(-1, "port can't be null"); - } - if (StringUtil.isBlank(entity.getLimitApp())) { - return Result.ofFail(-1, "limitApp can't be null or empty"); - } - if (StringUtil.isBlank(entity.getResource())) { - return Result.ofFail(-1, "resource can't be null or empty"); - } - if (entity.getGrade() == null) { - return Result.ofFail(-1, "grade can't be null"); - } - if (entity.getGrade() != 0 && entity.getGrade() != 1) { - return Result.ofFail(-1, "grade must be 0 or 1, but " + entity.getGrade() + " got"); - } - if (entity.getCount() == null || entity.getCount() < 0) { - return Result.ofFail(-1, "count should be at lease zero"); - } - if (entity.getStrategy() == null) { - return Result.ofFail(-1, "strategy can't be null"); - } - if (entity.getStrategy() != 0 && StringUtil.isBlank(entity.getRefResource())) { - return Result.ofFail(-1, "refResource can't be null or empty when strategy!=0"); - } - if (entity.getControlBehavior() == null) { - return Result.ofFail(-1, "controlBehavior can't be null"); - } - int controlBehavior = entity.getControlBehavior(); - if (controlBehavior == 1 && entity.getWarmUpPeriodSec() == null) { - return Result.ofFail(-1, "warmUpPeriodSec can't be null when controlBehavior==1"); - } - if (controlBehavior == 2 && entity.getMaxQueueingTimeMs() == null) { - return Result.ofFail(-1, "maxQueueingTimeMs can't be null when controlBehavior==2"); - } - if (entity.isClusterMode() && entity.getClusterConfig() == null) { - return Result.ofFail(-1, "cluster config should be valid"); - } - return null; - } - - @PostMapping("/rule") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiAddFlowRule(@RequestBody FlowRuleEntity entity) { - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - entity.setId(null); - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - entity.setLimitApp(entity.getLimitApp().trim()); - entity.setResource(entity.getResource().trim()); - try { - entity = repository.save(entity); - - publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS); - return Result.ofSuccess(entity); - } - catch (Throwable t) { - Throwable e = t instanceof ExecutionException ? t.getCause() : t; - logger.error("Failed to add new flow rule, app={}, ip={}", entity.getApp(), entity.getIp(), e); - return Result.ofFail(-1, e.getMessage()); - } - } - - @PutMapping("/save.json") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiUpdateFlowRule(Long id, String app, String limitApp, String resource, - Integer grade, Double count, Integer strategy, String refResource, Integer controlBehavior, - Integer warmUpPeriodSec, Integer maxQueueingTimeMs) { - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - FlowRuleEntity entity = repository.findById(id); - if (entity == null) { - return Result.ofFail(-1, "id " + id + " dose not exist"); - } - if (StringUtil.isNotBlank(app)) { - entity.setApp(app.trim()); - } - if (StringUtil.isNotBlank(limitApp)) { - entity.setLimitApp(limitApp.trim()); - } - if (StringUtil.isNotBlank(resource)) { - entity.setResource(resource.trim()); - } - if (grade != null) { - if (grade != 0 && grade != 1) { - return Result.ofFail(-1, "grade must be 0 or 1, but " + grade + " got"); - } - entity.setGrade(grade); - } - if (count != null) { - entity.setCount(count); - } - if (strategy != null) { - if (strategy != 0 && strategy != 1 && strategy != 2) { - return Result.ofFail(-1, "strategy must be in [0, 1, 2], but " + strategy + " got"); - } - entity.setStrategy(strategy); - if (strategy != 0) { - if (StringUtil.isBlank(refResource)) { - return Result.ofFail(-1, "refResource can't be null or empty when strategy!=0"); - } - entity.setRefResource(refResource.trim()); - } - } - if (controlBehavior != null) { - if (controlBehavior != 0 && controlBehavior != 1 && controlBehavior != 2) { - return Result.ofFail(-1, "controlBehavior must be in [0, 1, 2], but " + controlBehavior + " got"); - } - if (controlBehavior == 1 && warmUpPeriodSec == null) { - return Result.ofFail(-1, "warmUpPeriodSec can't be null when controlBehavior==1"); - } - if (controlBehavior == 2 && maxQueueingTimeMs == null) { - return Result.ofFail(-1, "maxQueueingTimeMs can't be null when controlBehavior==2"); - } - entity.setControlBehavior(controlBehavior); - if (warmUpPeriodSec != null) { - entity.setWarmUpPeriodSec(warmUpPeriodSec); - } - if (maxQueueingTimeMs != null) { - entity.setMaxQueueingTimeMs(maxQueueingTimeMs); - } - } - Date date = new Date(); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - if (entity == null) { - return Result.ofFail(-1, "save entity fail: null"); - } - - publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS); - return Result.ofSuccess(entity); - } - catch (Throwable t) { - Throwable e = t instanceof ExecutionException ? t.getCause() : t; - logger.error("Error when updating flow rules, app={}, ip={}, ruleId={}", entity.getApp(), entity.getIp(), - id, e); - return Result.ofFail(-1, e.getMessage()); - } - } - - @DeleteMapping("/delete.json") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiDeleteFlowRule(Long id) { - - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - FlowRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - - try { - repository.delete(id); - } - catch (Exception e) { - return Result.ofFail(-1, e.getMessage()); - } - try { - publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get(5000, TimeUnit.MILLISECONDS); - return Result.ofSuccess(id); - } - catch (Throwable t) { - Throwable e = t instanceof ExecutionException ? t.getCause() : t; - logger.error("Error when deleting flow rules, app={}, ip={}, id={}", oldEntity.getApp(), oldEntity.getIp(), - id, e); - return Result.ofFail(-1, e.getMessage()); - } - } - - private CompletableFuture publishRules(String app, String ip, Integer port) { - List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.setFlowRuleOfMachineAsync(app, ip, port, rules); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java deleted file mode 100644 index d6641c6a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.apache.http.conn.util.InetAddressUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -@RequestMapping(value = "/registry", produces = MediaType.APPLICATION_JSON_VALUE) -public class MachineRegistryController { - - private final Logger logger = LoggerFactory.getLogger(MachineRegistryController.class); - - @Autowired - private AppManagement appManagement; - - @ResponseBody - @RequestMapping("/machine") - public Result receiveHeartBeat(String app, - @RequestParam(value = "app_type", required = false, defaultValue = "0") Integer appType, Long version, - String v, String hostname, String ip, Integer port) { - if (StringUtil.isBlank(app) || app.length() > 256) { - return Result.ofFail(-1, "invalid appName"); - } - if (StringUtil.isBlank(ip) || ip.length() > 128) { - return Result.ofFail(-1, "invalid ip: " + ip); - } - if (!InetAddressUtils.isIPv4Address(ip) && !InetAddressUtils.isIPv6Address(ip)) { - return Result.ofFail(-1, "invalid ip: " + ip); - } - if (port == null || port < -1) { - return Result.ofFail(-1, "invalid port"); - } - if (hostname != null && hostname.length() > 256) { - return Result.ofFail(-1, "hostname too long"); - } - if (port == -1) { - logger.warn("Receive heartbeat from " + ip + " but port not set yet"); - return Result.ofFail(-1, "your port not set yet"); - } - String sentinelVersion = StringUtil.isBlank(v) ? "unknown" : v; - - version = version == null ? System.currentTimeMillis() : version; - try { - MachineInfo machineInfo = new MachineInfo(); - machineInfo.setApp(app); - machineInfo.setAppType(appType); - machineInfo.setHostname(hostname); - machineInfo.setIp(ip); - machineInfo.setPort(port); - machineInfo.setHeartbeatVersion(version); - machineInfo.setLastHeartbeat(System.currentTimeMillis()); - machineInfo.setVersion(sentinelVersion); - appManagement.addMachine(machineInfo); - return Result.ofSuccessMsg("success"); - } - catch (Exception e) { - logger.error("Receive heartbeat error", e); - return Result.ofFail(-1, e.getMessage()); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java deleted file mode 100644 index 18e6ecdb..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.vo.MetricVo; -import com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author leyou - */ -@Controller -@RequestMapping(value = "/metric", produces = MediaType.APPLICATION_JSON_VALUE) -public class MetricController { - - private static Logger logger = LoggerFactory.getLogger(MetricController.class); - - private static final long maxQueryIntervalMs = 1000 * 60 * 60; - - @Autowired - private MetricsRepository metricStore; - - @ResponseBody - @RequestMapping("/queryTopResourceMetric.json") - public Result queryTopResourceMetric(final String app, Integer pageIndex, Integer pageSize, Boolean desc, - Long startTime, Long endTime, String searchKey) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (pageIndex == null || pageIndex <= 0) { - pageIndex = 1; - } - if (pageSize == null) { - pageSize = 6; - } - if (pageSize >= 20) { - pageSize = 20; - } - if (desc == null) { - desc = true; - } - if (endTime == null) { - endTime = System.currentTimeMillis(); - } - if (startTime == null) { - startTime = endTime - 1000 * 60 * 5; - } - if (endTime - startTime > maxQueryIntervalMs) { - return Result.ofFail(-1, "time intervalMs is too big, must <= 1h"); - } - List resources = metricStore.listResourcesOfApp(app); - logger.debug("queryTopResourceMetric(), resources.size()={}", resources.size()); - - if (resources == null || resources.isEmpty()) { - return Result.ofSuccess(null); - } - if (!desc) { - Collections.reverse(resources); - } - if (StringUtil.isNotEmpty(searchKey)) { - List searched = new ArrayList<>(); - for (String resource : resources) { - if (resource.contains(searchKey)) { - searched.add(resource); - } - } - resources = searched; - } - int totalPage = (resources.size() + pageSize - 1) / pageSize; - List topResource = new ArrayList<>(); - if (pageIndex <= totalPage) { - topResource = resources.subList((pageIndex - 1) * pageSize, - Math.min(pageIndex * pageSize, resources.size())); - } - final Map> map = new ConcurrentHashMap<>(); - logger.debug("topResource={}", topResource); - long time = System.currentTimeMillis(); - for (final String resource : topResource) { - List entities = metricStore.queryByAppAndResourceBetween(app, resource, startTime, endTime); - logger.debug("resource={}, entities.size()={}", resource, entities == null ? "null" : entities.size()); - List vos = MetricVo.fromMetricEntities(entities, resource); - Iterable vosSorted = sortMetricVoAndDistinct(vos); - map.put(resource, vosSorted); - } - logger.debug("queryTopResourceMetric() total query time={} ms", System.currentTimeMillis() - time); - Map resultMap = new HashMap<>(16); - resultMap.put("totalCount", resources.size()); - resultMap.put("totalPage", totalPage); - resultMap.put("pageIndex", pageIndex); - resultMap.put("pageSize", pageSize); - - Map> map2 = new LinkedHashMap<>(); - // order matters. - for (String identity : topResource) { - map2.put(identity, map.get(identity)); - } - resultMap.put("metric", map2); - return Result.ofSuccess(resultMap); - } - - @ResponseBody - @RequestMapping("/queryByAppAndResource.json") - public Result queryByAppAndResource(String app, String identity, Long startTime, Long endTime) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isEmpty(identity)) { - return Result.ofFail(-1, "identity can't be null or empty"); - } - if (endTime == null) { - endTime = System.currentTimeMillis(); - } - if (startTime == null) { - startTime = endTime - 1000 * 60; - } - if (endTime - startTime > maxQueryIntervalMs) { - return Result.ofFail(-1, "time intervalMs is too big, must <= 1h"); - } - List entities = metricStore.queryByAppAndResourceBetween(app, identity, startTime, endTime); - List vos = MetricVo.fromMetricEntities(entities, identity); - return Result.ofSuccess(sortMetricVoAndDistinct(vos)); - } - - private Iterable sortMetricVoAndDistinct(List vos) { - if (vos == null) { - return null; - } - Map map = new TreeMap<>(); - for (MetricVo vo : vos) { - MetricVo oldVo = map.get(vo.getTimestamp()); - if (oldVo == null || vo.getGmtCreate() > oldVo.getGmtCreate()) { - map.put(vo.getTimestamp(), vo); - } - } - return map.values(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java deleted file mode 100644 index 72ddaf3b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository; -import com.alibaba.csp.sentinel.dashboard.util.VersionUtils; -import com.alibaba.csp.sentinel.slots.block.RuleConstant; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Date; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -@RestController -@RequestMapping(value = "/paramFlow") -public class ParamFlowRuleController { - - private final Logger logger = LoggerFactory.getLogger(ParamFlowRuleController.class); - - @Autowired - private SentinelApiClient sentinelApiClient; - - @Autowired - private AppManagement appManagement; - - @Autowired - private RuleRepository repository; - - private boolean checkIfSupported(String app, String ip, int port) { - try { - return Optional.ofNullable(appManagement.getDetailApp(app)) - .flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version020))) - .orElse(true); - // If error occurred or cannot retrieve machine info, return true. - } - catch (Exception ex) { - return true; - } - } - - @GetMapping("/rules") - @AuthAction(PrivilegeType.READ_RULE) - public Result> apiQueryAllRulesForMachine(@RequestParam String app, - @RequestParam String ip, @RequestParam Integer port) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip cannot be null or empty"); - } - if (port == null || port <= 0) { - return Result.ofFail(-1, "Invalid parameter: port"); - } - if (!checkIfSupported(app, ip, port)) { - return unsupportedVersion(); - } - try { - return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port) - .thenApply(repository::saveAll) - .thenApply(Result::ofSuccess) - .get(); - } - catch (ExecutionException ex) { - logger.error("Error when querying parameter flow rules", ex.getCause()); - if (isNotSupported(ex.getCause())) { - return unsupportedVersion(); - } - else { - return Result.ofThrowable(-1, ex.getCause()); - } - } - catch (Throwable throwable) { - logger.error("Error when querying parameter flow rules", throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - private boolean isNotSupported(Throwable ex) { - return ex instanceof CommandNotFoundException; - } - - @PostMapping("/rule") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiAddParamFlowRule(@RequestBody ParamFlowRuleEntity entity) { - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - if (!checkIfSupported(entity.getApp(), entity.getIp(), entity.getPort())) { - return unsupportedVersion(); - } - entity.setId(null); - entity.getRule().setResource(entity.getResource().trim()); - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(); - return Result.ofSuccess(entity); - } - catch (ExecutionException ex) { - logger.error("Error when adding new parameter flow rules", ex.getCause()); - if (isNotSupported(ex.getCause())) { - return unsupportedVersion(); - } - else { - return Result.ofThrowable(-1, ex.getCause()); - } - } - catch (Throwable throwable) { - logger.error("Error when adding new parameter flow rules", throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - private Result checkEntityInternal(ParamFlowRuleEntity entity) { - if (entity == null) { - return Result.ofFail(-1, "bad rule body"); - } - if (StringUtil.isBlank(entity.getApp())) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isBlank(entity.getIp())) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (entity.getPort() == null || entity.getPort() <= 0) { - return Result.ofFail(-1, "port can't be null"); - } - if (entity.getRule() == null) { - return Result.ofFail(-1, "rule can't be null"); - } - if (StringUtil.isBlank(entity.getResource())) { - return Result.ofFail(-1, "resource name cannot be null or empty"); - } - if (entity.getCount() < 0) { - return Result.ofFail(-1, "count should be valid"); - } - if (entity.getGrade() != RuleConstant.FLOW_GRADE_QPS) { - return Result.ofFail(-1, "Unknown mode (blockGrade) for parameter flow control"); - } - if (entity.getParamIdx() == null || entity.getParamIdx() < 0) { - return Result.ofFail(-1, "paramIdx should be valid"); - } - if (entity.getDurationInSec() <= 0) { - return Result.ofFail(-1, "durationInSec should be valid"); - } - if (entity.getControlBehavior() < 0) { - return Result.ofFail(-1, "controlBehavior should be valid"); - } - return null; - } - - @PutMapping("/rule/{id}") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiUpdateParamFlowRule(@PathVariable("id") Long id, - @RequestBody ParamFlowRuleEntity entity) { - if (id == null || id <= 0) { - return Result.ofFail(-1, "Invalid id"); - } - ParamFlowRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofFail(-1, "id " + id + " does not exist"); - } - - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - if (!checkIfSupported(entity.getApp(), entity.getIp(), entity.getPort())) { - return unsupportedVersion(); - } - entity.setId(id); - Date date = new Date(); - entity.setGmtCreate(oldEntity.getGmtCreate()); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(); - return Result.ofSuccess(entity); - } - catch (ExecutionException ex) { - logger.error("Error when updating parameter flow rules, id=" + id, ex.getCause()); - if (isNotSupported(ex.getCause())) { - return unsupportedVersion(); - } - else { - return Result.ofThrowable(-1, ex.getCause()); - } - } - catch (Throwable throwable) { - logger.error("Error when updating parameter flow rules, id=" + id, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - @DeleteMapping("/rule/{id}") - @AuthAction(PrivilegeType.DELETE_RULE) - public Result apiDeleteRule(@PathVariable("id") Long id) { - if (id == null) { - return Result.ofFail(-1, "id cannot be null"); - } - ParamFlowRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - - try { - repository.delete(id); - publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get(); - return Result.ofSuccess(id); - } - catch (ExecutionException ex) { - logger.error("Error when deleting parameter flow rules", ex.getCause()); - if (isNotSupported(ex.getCause())) { - return unsupportedVersion(); - } - else { - return Result.ofThrowable(-1, ex.getCause()); - } - } - catch (Throwable throwable) { - logger.error("Error when deleting parameter flow rules", throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - private CompletableFuture publishRules(String app, String ip, Integer port) { - List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.setParamFlowRuleOfMachine(app, ip, port, rules); - } - - private Result unsupportedVersion() { - return Result.ofFail(4041, - "Sentinel client not supported for parameter flow control (unsupported version or dependency absent)"); - } - - private final SentinelVersion version020 = new SentinelVersion().setMinorVersion(2); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java deleted file mode 100644 index c342d546..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.command.vo.NodeVo; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.domain.ResourceTreeNode; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.vo.ResourceVo; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Carpenter Lee - */ -@RestController -@RequestMapping(value = "/resource") -public class ResourceController { - - private static Logger logger = LoggerFactory.getLogger(ResourceController.class); - - @Autowired - private SentinelApiClient httpFetcher; - - /** - * Fetch real time statistics info of the machine. - * @param ip ip to fetch - * @param port port of the ip - * @param type one of [root, default, cluster], 'root' means fetching from tree root - * node, 'default' means fetching from tree default node, 'cluster' means fetching - * from cluster node. - * @param searchKey key to search - * @return node statistics info. - */ - @GetMapping("/machineResource.json") - public Result> fetchResourceChainListOfMachine(String ip, Integer port, String type, - String searchKey) { - if (StringUtil.isEmpty(ip) || port == null) { - return Result.ofFail(-1, "invalid param, give ip, port"); - } - final String ROOT = "root"; - final String DEFAULT = "default"; - if (StringUtil.isEmpty(type)) { - type = ROOT; - } - if (ROOT.equalsIgnoreCase(type) || DEFAULT.equalsIgnoreCase(type)) { - List nodeVos = httpFetcher.fetchResourceOfMachine(ip, port, type); - if (nodeVos == null) { - return Result.ofSuccess(null); - } - ResourceTreeNode treeNode = ResourceTreeNode.fromNodeVoList(nodeVos); - treeNode.searchIgnoreCase(searchKey); - return Result.ofSuccess(ResourceVo.fromResourceTreeNode(treeNode)); - } - else { - // Normal (cluster node). - List nodeVos = httpFetcher.fetchClusterNodeOfMachine(ip, port, true); - if (nodeVos == null) { - return Result.ofSuccess(null); - } - if (StringUtil.isNotEmpty(searchKey)) { - nodeVos = nodeVos.stream() - .filter(node -> node.getResource().toLowerCase().contains(searchKey.toLowerCase())) - .collect(Collectors.toList()); - } - return Result.ofSuccess(ResourceVo.fromNodeVoList(nodeVos)); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java deleted file mode 100644 index 58323f02..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Date; -import java.util.List; - -/** - * @author leyou(lihao) - */ -@RestController -@RequestMapping("/system") -public class SystemController { - - private final Logger logger = LoggerFactory.getLogger(SystemController.class); - - @Autowired - private RuleRepository repository; - - @Autowired - private SentinelApiClient sentinelApiClient; - - private Result checkBasicParams(String app, String ip, Integer port) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - if (port <= 0 || port > 65535) { - return Result.ofFail(-1, "port should be in (0, 65535)"); - } - return null; - } - - @GetMapping("/rules.json") - @AuthAction(PrivilegeType.READ_RULE) - public Result> apiQueryMachineRules(String app, String ip, Integer port) { - Result> checkResult = checkBasicParams(app, ip, port); - if (checkResult != null) { - return checkResult; - } - try { - List rules = sentinelApiClient.fetchSystemRuleOfMachine(app, ip, port); - rules = repository.saveAll(rules); - return Result.ofSuccess(rules); - } - catch (Throwable throwable) { - logger.error("Query machine system rules error", throwable); - return Result.ofThrowable(-1, throwable); - } - } - - private int countNotNullAndNotNegative(Number... values) { - int notNullCount = 0; - for (int i = 0; i < values.length; i++) { - if (values[i] != null && values[i].doubleValue() >= 0) { - notNullCount++; - } - } - return notNullCount; - } - - @RequestMapping("/new.json") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiAdd(String app, String ip, Integer port, Double highestSystemLoad, - Double highestCpuUsage, Long avgRt, Long maxThread, Double qps) { - - Result checkResult = checkBasicParams(app, ip, port); - if (checkResult != null) { - return checkResult; - } - - int notNullCount = countNotNullAndNotNegative(highestSystemLoad, avgRt, maxThread, qps, highestCpuUsage); - if (notNullCount != 1) { - return Result.ofFail(-1, "only one of [highestSystemLoad, avgRt, maxThread, qps,highestCpuUsage] " - + "value must be set > 0, but " + notNullCount + " values get"); - } - if (null != highestCpuUsage && highestCpuUsage > 1) { - return Result.ofFail(-1, "highestCpuUsage must between [0.0, 1.0]"); - } - SystemRuleEntity entity = new SystemRuleEntity(); - entity.setApp(app.trim()); - entity.setIp(ip.trim()); - entity.setPort(port); - // -1 is a fake value - if (null != highestSystemLoad) { - entity.setHighestSystemLoad(highestSystemLoad); - } - else { - entity.setHighestSystemLoad(-1D); - } - - if (null != highestCpuUsage) { - entity.setHighestCpuUsage(highestCpuUsage); - } - else { - entity.setHighestCpuUsage(-1D); - } - - if (avgRt != null) { - entity.setAvgRt(avgRt); - } - else { - entity.setAvgRt(-1L); - } - if (maxThread != null) { - entity.setMaxThread(maxThread); - } - else { - entity.setMaxThread(-1L); - } - if (qps != null) { - entity.setQps(qps); - } - else { - entity.setQps(-1D); - } - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("Add SystemRule error", throwable); - return Result.ofThrowable(-1, throwable); - } - if (!publishRules(app, ip, port)) { - logger.warn("Publish system rules fail after rule add"); - } - return Result.ofSuccess(entity); - } - - @GetMapping("/save.json") - @AuthAction(PrivilegeType.WRITE_RULE) - public Result apiUpdateIfNotNull(Long id, String app, Double highestSystemLoad, - Double highestCpuUsage, Long avgRt, Long maxThread, Double qps) { - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - SystemRuleEntity entity = repository.findById(id); - if (entity == null) { - return Result.ofFail(-1, "id " + id + " dose not exist"); - } - - if (StringUtil.isNotBlank(app)) { - entity.setApp(app.trim()); - } - if (highestSystemLoad != null) { - if (highestSystemLoad < 0) { - return Result.ofFail(-1, "highestSystemLoad must >= 0"); - } - entity.setHighestSystemLoad(highestSystemLoad); - } - if (highestCpuUsage != null) { - if (highestCpuUsage < 0) { - return Result.ofFail(-1, "highestCpuUsage must >= 0"); - } - if (highestCpuUsage > 1) { - return Result.ofFail(-1, "highestCpuUsage must <= 1"); - } - entity.setHighestCpuUsage(highestCpuUsage); - } - if (avgRt != null) { - if (avgRt < 0) { - return Result.ofFail(-1, "avgRt must >= 0"); - } - entity.setAvgRt(avgRt); - } - if (maxThread != null) { - if (maxThread < 0) { - return Result.ofFail(-1, "maxThread must >= 0"); - } - entity.setMaxThread(maxThread); - } - if (qps != null) { - if (qps < 0) { - return Result.ofFail(-1, "qps must >= 0"); - } - entity.setQps(qps); - } - Date date = new Date(); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("save error:", throwable); - return Result.ofThrowable(-1, throwable); - } - if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) { - logger.info("publish system rules fail after rule update"); - } - return Result.ofSuccess(entity); - } - - @RequestMapping("/delete.json") - @AuthAction(PrivilegeType.DELETE_RULE) - public Result delete(Long id) { - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - SystemRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - try { - repository.delete(id); - } - catch (Throwable throwable) { - logger.error("delete error:", throwable); - return Result.ofThrowable(-1, throwable); - } - if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) { - logger.info("publish system rules fail after rule delete"); - } - return Result.ofSuccess(id); - } - - private boolean publishRules(String app, String ip, Integer port) { - List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.setSystemRuleOfMachine(app, ip, port, rules); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java deleted file mode 100644 index ada7f51d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller; - -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author hisenyuan - * @since 1.7.0 - */ -@RestController -public class VersionController { - - private static final String VERSION_PATTERN = "-"; - - @Value("${sentinel.dashboard.version:}") - private String sentinelDashboardVersion; - - @GetMapping("/version") - public Result apiGetVersion() { - if (StringUtil.isNotBlank(sentinelDashboardVersion)) { - String res = sentinelDashboardVersion; - if (sentinelDashboardVersion.contains(VERSION_PATTERN)) { - res = sentinelDashboardVersion.substring(0, sentinelDashboardVersion.indexOf(VERSION_PATTERN)); - } - return Result.ofSuccess(res); - } - else { - return Result.ofFail(1, "getVersion failed: empty version"); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java deleted file mode 100644 index 42c306f8..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller.cluster; - -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppFullAssignRequest; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppSingleServerAssignRequest; -import com.alibaba.csp.sentinel.dashboard.service.ClusterAssignService; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -@RestController -@RequestMapping("/cluster/assign") -public class ClusterAssignController { - - private final Logger logger = LoggerFactory.getLogger(ClusterAssignController.class); - - @Autowired - private ClusterAssignService clusterAssignService; - - @PostMapping("/all_server/{app}") - public Result apiAssignAllClusterServersOfApp(@PathVariable String app, - @RequestBody ClusterAppFullAssignRequest assignRequest) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - if (assignRequest == null || assignRequest.getClusterMap() == null - || assignRequest.getRemainingList() == null) { - return Result.ofFail(-1, "bad request body"); - } - try { - return Result.ofSuccess(clusterAssignService.applyAssignToApp(app, assignRequest.getClusterMap(), - assignRequest.getRemainingList())); - } - catch (Throwable throwable) { - logger.error("Error when assigning full cluster servers for app: " + app, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - @PostMapping("/single_server/{app}") - public Result apiAssignSingleClusterServersOfApp(@PathVariable String app, - @RequestBody ClusterAppSingleServerAssignRequest assignRequest) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - if (assignRequest == null || assignRequest.getClusterMap() == null) { - return Result.ofFail(-1, "bad request body"); - } - try { - return Result.ofSuccess(clusterAssignService.applyAssignToApp(app, - Collections.singletonList(assignRequest.getClusterMap()), assignRequest.getRemainingList())); - } - catch (Throwable throwable) { - logger.error("Error when assigning single cluster servers for app: " + app, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - @PostMapping("/unbind_server/{app}") - public Result apiUnbindClusterServersOfApp(@PathVariable String app, - @RequestBody Set machineIds) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - if (machineIds == null || machineIds.isEmpty()) { - return Result.ofFail(-1, "bad request body"); - } - try { - return Result.ofSuccess(clusterAssignService.unbindClusterServers(app, machineIds)); - } - catch (Throwable throwable) { - logger.error("Error when unbinding cluster server {} for app <{}>", machineIds, app, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java deleted file mode 100644 index d15dee28..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller.cluster; - -import com.alibaba.csp.sentinel.cluster.ClusterStateManager; -import com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterModifyRequest; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.AppClusterClientStateWrapVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.AppClusterServerStateWrapVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO; -import com.alibaba.csp.sentinel.dashboard.service.ClusterConfigService; -import com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils; -import com.alibaba.csp.sentinel.dashboard.util.VersionUtils; -import com.alibaba.csp.sentinel.util.StringUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ExecutionException; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@RestController -@RequestMapping(value = "/cluster") -public class ClusterConfigController { - - private final Logger logger = LoggerFactory.getLogger(ClusterConfigController.class); - - private final SentinelVersion version140 = new SentinelVersion().setMajorVersion(1).setMinorVersion(4); - - @Autowired - private AppManagement appManagement; - - @Autowired - private ClusterConfigService clusterConfigService; - - @PostMapping("/config/modify_single") - public Result apiModifyClusterConfig(@RequestBody String payload) { - if (StringUtil.isBlank(payload)) { - return Result.ofFail(-1, "empty request body"); - } - try { - JSONObject body = JSON.parseObject(payload); - if (body.containsKey(KEY_MODE)) { - int mode = body.getInteger(KEY_MODE); - switch (mode) { - case ClusterStateManager.CLUSTER_CLIENT: - ClusterClientModifyRequest data = JSON.parseObject(payload, ClusterClientModifyRequest.class); - Result res = checkValidRequest(data); - if (res != null) { - return res; - } - clusterConfigService.modifyClusterClientConfig(data).get(); - return Result.ofSuccess(true); - case ClusterStateManager.CLUSTER_SERVER: - ClusterServerModifyRequest d = JSON.parseObject(payload, ClusterServerModifyRequest.class); - Result r = checkValidRequest(d); - if (r != null) { - return r; - } - // TODO: bad design here, should refactor! - clusterConfigService.modifyClusterServerConfig(d).get(); - return Result.ofSuccess(true); - default: - return Result.ofFail(-1, "invalid mode"); - } - } - return Result.ofFail(-1, "invalid parameter"); - } - catch (ExecutionException ex) { - logger.error("Error when modifying cluster config", ex.getCause()); - return errorResponse(ex); - } - catch (Throwable ex) { - logger.error("Error when modifying cluster config", ex); - return Result.ofFail(-1, ex.getMessage()); - } - } - - private Result errorResponse(ExecutionException ex) { - if (isNotSupported(ex.getCause())) { - return unsupportedVersion(); - } - else { - return Result.ofThrowable(-1, ex.getCause()); - } - } - - @GetMapping("/state_single") - public Result apiGetClusterState(@RequestParam String app, @RequestParam String ip, - @RequestParam Integer port) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip cannot be null or empty"); - } - if (port == null || port <= 0) { - return Result.ofFail(-1, "Invalid parameter: port"); - } - if (!checkIfSupported(app, ip, port)) { - return unsupportedVersion(); - } - try { - return clusterConfigService.getClusterUniversalState(app, ip, port).thenApply(Result::ofSuccess).get(); - } - catch (ExecutionException ex) { - logger.error("Error when fetching cluster state", ex.getCause()); - return errorResponse(ex); - } - catch (Throwable throwable) { - logger.error("Error when fetching cluster state", throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - @GetMapping("/server_state/{app}") - public Result> apiGetClusterServerStateOfApp(@PathVariable String app) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - try { - return clusterConfigService.getClusterUniversalState(app) - .thenApply(ClusterEntityUtils::wrapToAppClusterServerState) - .thenApply(Result::ofSuccess) - .get(); - } - catch (ExecutionException ex) { - logger.error("Error when fetching cluster server state of app: " + app, ex.getCause()); - return errorResponse(ex); - } - catch (Throwable throwable) { - logger.error("Error when fetching cluster server state of app: " + app, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - @GetMapping("/client_state/{app}") - public Result> apiGetClusterClientStateOfApp(@PathVariable String app) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - try { - return clusterConfigService.getClusterUniversalState(app) - .thenApply(ClusterEntityUtils::wrapToAppClusterClientState) - .thenApply(Result::ofSuccess) - .get(); - } - catch (ExecutionException ex) { - logger.error("Error when fetching cluster token client state of app: " + app, ex.getCause()); - return errorResponse(ex); - } - catch (Throwable throwable) { - logger.error("Error when fetching cluster token client state of app: " + app, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - @GetMapping("/state/{app}") - public Result> apiGetClusterStateOfApp(@PathVariable String app) { - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app cannot be null or empty"); - } - try { - return clusterConfigService.getClusterUniversalState(app).thenApply(Result::ofSuccess).get(); - } - catch (ExecutionException ex) { - logger.error("Error when fetching cluster state of app: " + app, ex.getCause()); - return errorResponse(ex); - } - catch (Throwable throwable) { - logger.error("Error when fetching cluster state of app: " + app, throwable); - return Result.ofFail(-1, throwable.getMessage()); - } - } - - private boolean isNotSupported(Throwable ex) { - return ex instanceof CommandNotFoundException; - } - - private boolean checkIfSupported(String app, String ip, int port) { - try { - return Optional.ofNullable(appManagement.getDetailApp(app)) - .flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version140))) - .orElse(true); - // If error occurred or cannot retrieve machine info, return true. - } - catch (Exception ex) { - return true; - } - } - - private Result checkValidRequest(ClusterModifyRequest request) { - if (StringUtil.isEmpty(request.getApp())) { - return Result.ofFail(-1, "app cannot be empty"); - } - if (StringUtil.isEmpty(request.getIp())) { - return Result.ofFail(-1, "ip cannot be empty"); - } - if (request.getPort() == null || request.getPort() < 0) { - return Result.ofFail(-1, "invalid port"); - } - if (request.getMode() == null || request.getMode() < 0) { - return Result.ofFail(-1, "invalid mode"); - } - if (!checkIfSupported(request.getApp(), request.getIp(), request.getPort())) { - return unsupportedVersion(); - } - return null; - } - - private Result unsupportedVersion() { - return Result.ofFail(4041, - "Sentinel client not supported for cluster flow control (unsupported version or dependency absent)"); - } - - private static final String KEY_MODE = "mode"; - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java deleted file mode 100644 index 9415b577..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller.gateway; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiPredicateItemEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.AddApiReqVo; -import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.ApiPredicateItemVo; -import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.UpdateApiReqVo; -import com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemApiDefinitionStore; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import java.util.*; - -import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*; - -/** - * Gateway api Controller for manage gateway api definitions. - * - * @author cdfive - * @since 1.7.0 - */ -@RestController -@RequestMapping(value = "/gateway/api") -public class GatewayApiController { - - private final Logger logger = LoggerFactory.getLogger(GatewayApiController.class); - - @Autowired - private InMemApiDefinitionStore repository; - - @Autowired - private SentinelApiClient sentinelApiClient; - - @GetMapping("/list.json") - @AuthAction(AuthService.PrivilegeType.READ_RULE) - public Result> queryApis(String app, String ip, Integer port) { - - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - - try { - List apis = sentinelApiClient.fetchApis(app, ip, port).get(); - repository.saveAll(apis); - return Result.ofSuccess(apis); - } - catch (Throwable throwable) { - logger.error("queryApis error:", throwable); - return Result.ofThrowable(-1, throwable); - } - } - - @PostMapping("/new.json") - @AuthAction(AuthService.PrivilegeType.WRITE_RULE) - public Result addApi(HttpServletRequest request, @RequestBody AddApiReqVo reqVo) { - - String app = reqVo.getApp(); - if (StringUtil.isBlank(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - - ApiDefinitionEntity entity = new ApiDefinitionEntity(); - entity.setApp(app.trim()); - - String ip = reqVo.getIp(); - if (StringUtil.isBlank(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - entity.setIp(ip.trim()); - - Integer port = reqVo.getPort(); - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - entity.setPort(port); - - // API名称 - String apiName = reqVo.getApiName(); - if (StringUtil.isBlank(apiName)) { - return Result.ofFail(-1, "apiName can't be null or empty"); - } - entity.setApiName(apiName.trim()); - - // 匹配规则列表 - List predicateItems = reqVo.getPredicateItems(); - if (CollectionUtils.isEmpty(predicateItems)) { - return Result.ofFail(-1, "predicateItems can't empty"); - } - - List predicateItemEntities = new ArrayList<>(); - for (ApiPredicateItemVo predicateItem : predicateItems) { - ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity(); - - // 匹配模式 - Integer matchStrategy = predicateItem.getMatchStrategy(); - if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { - return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); - } - predicateItemEntity.setMatchStrategy(matchStrategy); - - // 匹配串 - String pattern = predicateItem.getPattern(); - if (StringUtil.isBlank(pattern)) { - return Result.ofFail(-1, "pattern can't be null or empty"); - } - predicateItemEntity.setPattern(pattern); - - predicateItemEntities.add(predicateItemEntity); - } - entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities)); - - // 检查API名称不能重复 - List allApis = repository.findAllByMachine(MachineInfo.of(app.trim(), ip.trim(), port)); - if (allApis.stream().map(o -> o.getApiName()).anyMatch(o -> o.equals(apiName.trim()))) { - return Result.ofFail(-1, "apiName exists: " + apiName); - } - - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("add gateway api error:", throwable); - return Result.ofThrowable(-1, throwable); - } - - if (!publishApis(app, ip, port)) { - logger.warn("publish gateway apis fail after add"); - } - - return Result.ofSuccess(entity); - } - - @PostMapping("/save.json") - @AuthAction(AuthService.PrivilegeType.WRITE_RULE) - public Result updateApi(@RequestBody UpdateApiReqVo reqVo) { - String app = reqVo.getApp(); - if (StringUtil.isBlank(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - - Long id = reqVo.getId(); - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - - ApiDefinitionEntity entity = repository.findById(id); - if (entity == null) { - return Result.ofFail(-1, "api does not exist, id=" + id); - } - - // 匹配规则列表 - List predicateItems = reqVo.getPredicateItems(); - if (CollectionUtils.isEmpty(predicateItems)) { - return Result.ofFail(-1, "predicateItems can't empty"); - } - - List predicateItemEntities = new ArrayList<>(); - for (ApiPredicateItemVo predicateItem : predicateItems) { - ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity(); - - // 匹配模式 - int matchStrategy = predicateItem.getMatchStrategy(); - if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { - return Result.ofFail(-1, "Invalid matchStrategy: " + matchStrategy); - } - predicateItemEntity.setMatchStrategy(matchStrategy); - - // 匹配串 - String pattern = predicateItem.getPattern(); - if (StringUtil.isBlank(pattern)) { - return Result.ofFail(-1, "pattern can't be null or empty"); - } - predicateItemEntity.setPattern(pattern); - - predicateItemEntities.add(predicateItemEntity); - } - entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities)); - - Date date = new Date(); - entity.setGmtModified(date); - - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("update gateway api error:", throwable); - return Result.ofThrowable(-1, throwable); - } - - if (!publishApis(app, entity.getIp(), entity.getPort())) { - logger.warn("publish gateway apis fail after update"); - } - - return Result.ofSuccess(entity); - } - - @PostMapping("/delete.json") - @AuthAction(AuthService.PrivilegeType.DELETE_RULE) - - public Result deleteApi(Long id) { - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - - ApiDefinitionEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - - try { - repository.delete(id); - } - catch (Throwable throwable) { - logger.error("delete gateway api error:", throwable); - return Result.ofThrowable(-1, throwable); - } - - if (!publishApis(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) { - logger.warn("publish gateway apis fail after delete"); - } - - return Result.ofSuccess(id); - } - - private boolean publishApis(String app, String ip, Integer port) { - List apis = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.modifyApis(app, ip, port, apis); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java deleted file mode 100644 index 5a9907c4..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller.gateway; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayParamFlowItemEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.AddFlowRuleReqVo; -import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.GatewayParamFlowItemVo; -import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.UpdateFlowRuleReqVo; -import com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemGatewayFlowRuleStore; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.Date; -import java.util.List; - -import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*; -import static com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity.*; -import static com.alibaba.csp.sentinel.slots.block.RuleConstant.*; - -/** - * Gateway flow rule Controller for manage gateway flow rules. - * - * @author cdfive - * @since 1.7.0 - */ -@RestController -@RequestMapping(value = "/gateway/flow") -public class GatewayFlowRuleController { - - private final Logger logger = LoggerFactory.getLogger(GatewayFlowRuleController.class); - - @Autowired - private InMemGatewayFlowRuleStore repository; - - @Autowired - private SentinelApiClient sentinelApiClient; - - @GetMapping("/list.json") - @AuthAction(AuthService.PrivilegeType.READ_RULE) - public Result> queryFlowRules(String app, String ip, Integer port) { - - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isEmpty(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - - try { - List rules = sentinelApiClient.fetchGatewayFlowRules(app, ip, port).get(); - repository.saveAll(rules); - return Result.ofSuccess(rules); - } - catch (Throwable throwable) { - logger.error("query gateway flow rules error:", throwable); - return Result.ofThrowable(-1, throwable); - } - } - - @PostMapping("/new.json") - @AuthAction(AuthService.PrivilegeType.WRITE_RULE) - public Result addFlowRule(@RequestBody AddFlowRuleReqVo reqVo) { - - String app = reqVo.getApp(); - if (StringUtil.isBlank(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - - GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity(); - entity.setApp(app.trim()); - - String ip = reqVo.getIp(); - if (StringUtil.isBlank(ip)) { - return Result.ofFail(-1, "ip can't be null or empty"); - } - entity.setIp(ip.trim()); - - Integer port = reqVo.getPort(); - if (port == null) { - return Result.ofFail(-1, "port can't be null"); - } - entity.setPort(port); - - // API类型, Route ID或API分组 - Integer resourceMode = reqVo.getResourceMode(); - if (resourceMode == null) { - return Result.ofFail(-1, "resourceMode can't be null"); - } - if (!Arrays.asList(RESOURCE_MODE_ROUTE_ID, RESOURCE_MODE_CUSTOM_API_NAME).contains(resourceMode)) { - return Result.ofFail(-1, "invalid resourceMode: " + resourceMode); - } - entity.setResourceMode(resourceMode); - - // API名称 - String resource = reqVo.getResource(); - if (StringUtil.isBlank(resource)) { - return Result.ofFail(-1, "resource can't be null or empty"); - } - entity.setResource(resource.trim()); - - // 针对请求属性 - GatewayParamFlowItemVo paramItem = reqVo.getParamItem(); - if (paramItem != null) { - GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity(); - entity.setParamItem(itemEntity); - - // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie - Integer parseStrategy = paramItem.getParseStrategy(); - if (!Arrays - .asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, - PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { - return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy); - } - itemEntity.setParseStrategy(paramItem.getParseStrategy()); - - // 当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填 - if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { - // 参数名称 - String fieldName = paramItem.getFieldName(); - if (StringUtil.isBlank(fieldName)) { - return Result.ofFail(-1, "fieldName can't be null or empty"); - } - itemEntity.setFieldName(paramItem.getFieldName()); - } - - String pattern = paramItem.getPattern(); - // 如果匹配串不为空,验证匹配模式 - if (StringUtil.isNotEmpty(pattern)) { - itemEntity.setPattern(pattern); - Integer matchStrategy = paramItem.getMatchStrategy(); - if (!Arrays - .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { - return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); - } - itemEntity.setMatchStrategy(matchStrategy); - } - } - - // 阈值类型 0-线程数 1-QPS - Integer grade = reqVo.getGrade(); - if (grade == null) { - return Result.ofFail(-1, "grade can't be null"); - } - if (!Arrays.asList(FLOW_GRADE_THREAD, FLOW_GRADE_QPS).contains(grade)) { - return Result.ofFail(-1, "invalid grade: " + grade); - } - entity.setGrade(grade); - - // QPS阈值 - Double count = reqVo.getCount(); - if (count == null) { - return Result.ofFail(-1, "count can't be null"); - } - if (count < 0) { - return Result.ofFail(-1, "count should be at lease zero"); - } - entity.setCount(count); - - // 间隔 - Long interval = reqVo.getInterval(); - if (interval == null) { - return Result.ofFail(-1, "interval can't be null"); - } - if (interval <= 0) { - return Result.ofFail(-1, "interval should be greater than zero"); - } - entity.setInterval(interval); - - // 间隔单位 - Integer intervalUnit = reqVo.getIntervalUnit(); - if (intervalUnit == null) { - return Result.ofFail(-1, "intervalUnit can't be null"); - } - if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY) - .contains(intervalUnit)) { - return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit); - } - entity.setIntervalUnit(intervalUnit); - - // 流控方式 0-快速失败 2-匀速排队 - Integer controlBehavior = reqVo.getControlBehavior(); - if (controlBehavior == null) { - return Result.ofFail(-1, "controlBehavior can't be null"); - } - if (!Arrays.asList(CONTROL_BEHAVIOR_DEFAULT, CONTROL_BEHAVIOR_RATE_LIMITER).contains(controlBehavior)) { - return Result.ofFail(-1, "invalid controlBehavior: " + controlBehavior); - } - entity.setControlBehavior(controlBehavior); - - if (CONTROL_BEHAVIOR_DEFAULT == controlBehavior) { - // 0-快速失败, 则Burst size必填 - Integer burst = reqVo.getBurst(); - if (burst == null) { - return Result.ofFail(-1, "burst can't be null"); - } - if (burst < 0) { - return Result.ofFail(-1, "invalid burst: " + burst); - } - entity.setBurst(burst); - } - else if (CONTROL_BEHAVIOR_RATE_LIMITER == controlBehavior) { - // 1-匀速排队, 则超时时间必填 - Integer maxQueueingTimeoutMs = reqVo.getMaxQueueingTimeoutMs(); - if (maxQueueingTimeoutMs == null) { - return Result.ofFail(-1, "maxQueueingTimeoutMs can't be null"); - } - if (maxQueueingTimeoutMs < 0) { - return Result.ofFail(-1, "invalid maxQueueingTimeoutMs: " + maxQueueingTimeoutMs); - } - entity.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs); - } - - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("add gateway flow rule error:", throwable); - return Result.ofThrowable(-1, throwable); - } - - if (!publishRules(app, ip, port)) { - logger.warn("publish gateway flow rules fail after add"); - } - - return Result.ofSuccess(entity); - } - - @PostMapping("/save.json") - @AuthAction(AuthService.PrivilegeType.WRITE_RULE) - public Result updateFlowRule(@RequestBody UpdateFlowRuleReqVo reqVo) { - - String app = reqVo.getApp(); - if (StringUtil.isBlank(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - - Long id = reqVo.getId(); - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - - GatewayFlowRuleEntity entity = repository.findById(id); - if (entity == null) { - return Result.ofFail(-1, "gateway flow rule does not exist, id=" + id); - } - - // 针对请求属性 - GatewayParamFlowItemVo paramItem = reqVo.getParamItem(); - if (paramItem != null) { - GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity(); - entity.setParamItem(itemEntity); - - // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie - Integer parseStrategy = paramItem.getParseStrategy(); - if (!Arrays - .asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, - PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { - return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy); - } - itemEntity.setParseStrategy(paramItem.getParseStrategy()); - - // 当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填 - if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { - // 参数名称 - String fieldName = paramItem.getFieldName(); - if (StringUtil.isBlank(fieldName)) { - return Result.ofFail(-1, "fieldName can't be null or empty"); - } - itemEntity.setFieldName(paramItem.getFieldName()); - } - - String pattern = paramItem.getPattern(); - // 如果匹配串不为空,验证匹配模式 - if (StringUtil.isNotEmpty(pattern)) { - itemEntity.setPattern(pattern); - Integer matchStrategy = paramItem.getMatchStrategy(); - if (!Arrays - .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { - return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); - } - itemEntity.setMatchStrategy(matchStrategy); - } - } - else { - entity.setParamItem(null); - } - - // 阈值类型 0-线程数 1-QPS - Integer grade = reqVo.getGrade(); - if (grade == null) { - return Result.ofFail(-1, "grade can't be null"); - } - if (!Arrays.asList(FLOW_GRADE_THREAD, FLOW_GRADE_QPS).contains(grade)) { - return Result.ofFail(-1, "invalid grade: " + grade); - } - entity.setGrade(grade); - - // QPS阈值 - Double count = reqVo.getCount(); - if (count == null) { - return Result.ofFail(-1, "count can't be null"); - } - if (count < 0) { - return Result.ofFail(-1, "count should be at lease zero"); - } - entity.setCount(count); - - // 间隔 - Long interval = reqVo.getInterval(); - if (interval == null) { - return Result.ofFail(-1, "interval can't be null"); - } - if (interval <= 0) { - return Result.ofFail(-1, "interval should be greater than zero"); - } - entity.setInterval(interval); - - // 间隔单位 - Integer intervalUnit = reqVo.getIntervalUnit(); - if (intervalUnit == null) { - return Result.ofFail(-1, "intervalUnit can't be null"); - } - if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY) - .contains(intervalUnit)) { - return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit); - } - entity.setIntervalUnit(intervalUnit); - - // 流控方式 0-快速失败 2-匀速排队 - Integer controlBehavior = reqVo.getControlBehavior(); - if (controlBehavior == null) { - return Result.ofFail(-1, "controlBehavior can't be null"); - } - if (!Arrays.asList(CONTROL_BEHAVIOR_DEFAULT, CONTROL_BEHAVIOR_RATE_LIMITER).contains(controlBehavior)) { - return Result.ofFail(-1, "invalid controlBehavior: " + controlBehavior); - } - entity.setControlBehavior(controlBehavior); - - if (CONTROL_BEHAVIOR_DEFAULT == controlBehavior) { - // 0-快速失败, 则Burst size必填 - Integer burst = reqVo.getBurst(); - if (burst == null) { - return Result.ofFail(-1, "burst can't be null"); - } - if (burst < 0) { - return Result.ofFail(-1, "invalid burst: " + burst); - } - entity.setBurst(burst); - } - else if (CONTROL_BEHAVIOR_RATE_LIMITER == controlBehavior) { - // 2-匀速排队, 则超时时间必填 - Integer maxQueueingTimeoutMs = reqVo.getMaxQueueingTimeoutMs(); - if (maxQueueingTimeoutMs == null) { - return Result.ofFail(-1, "maxQueueingTimeoutMs can't be null"); - } - if (maxQueueingTimeoutMs < 0) { - return Result.ofFail(-1, "invalid maxQueueingTimeoutMs: " + maxQueueingTimeoutMs); - } - entity.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs); - } - - Date date = new Date(); - entity.setGmtModified(date); - - try { - entity = repository.save(entity); - } - catch (Throwable throwable) { - logger.error("update gateway flow rule error:", throwable); - return Result.ofThrowable(-1, throwable); - } - - if (!publishRules(app, entity.getIp(), entity.getPort())) { - logger.warn("publish gateway flow rules fail after update"); - } - - return Result.ofSuccess(entity); - } - - @PostMapping("/delete.json") - @AuthAction(AuthService.PrivilegeType.DELETE_RULE) - public Result deleteFlowRule(Long id) { - - if (id == null) { - return Result.ofFail(-1, "id can't be null"); - } - - GatewayFlowRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - - try { - repository.delete(id); - } - catch (Throwable throwable) { - logger.error("delete gateway flow rule error:", throwable); - return Result.ofThrowable(-1, throwable); - } - - if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) { - logger.warn("publish gateway flow rules fail after delete"); - } - - return Result.ofSuccess(id); - } - - private boolean publishRules(String app, String ip, Integer port) { - List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); - return sentinelApiClient.modifyGatewayFlowRules(app, ip, port, rules); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java deleted file mode 100644 index 99b595bb..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.controller.v2; - -import com.alibaba.csp.sentinel.dashboard.auth.AuthAction; -import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.domain.Result; -import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter; -import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider; -import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.web.bind.annotation.*; - -import java.util.Date; -import java.util.List; - -/** - * Flow rule controller (v2). - * - * @author Eric Zhao - * @since 1.4.0 - */ -@RestController -@RequestMapping(value = "/v2/flow") -public class FlowControllerV2 { - - private final Logger logger = LoggerFactory.getLogger(FlowControllerV2.class); - - @Autowired - private InMemoryRuleRepositoryAdapter repository; - - @Autowired - @Qualifier("flowRuleDefaultProvider") - private DynamicRuleProvider> ruleProvider; - - @Autowired - @Qualifier("flowRuleDefaultPublisher") - private DynamicRulePublisher> rulePublisher; - - @GetMapping("/rules") - @AuthAction(PrivilegeType.READ_RULE) - public Result> apiQueryMachineRules(@RequestParam String app) { - - if (StringUtil.isEmpty(app)) { - return Result.ofFail(-1, "app can't be null or empty"); - } - try { - List rules = ruleProvider.getRules(app); - if (rules != null && !rules.isEmpty()) { - for (FlowRuleEntity entity : rules) { - entity.setApp(app); - if (entity.getClusterConfig() != null && entity.getClusterConfig().getFlowId() != null) { - entity.setId(entity.getClusterConfig().getFlowId()); - } - } - } - rules = repository.saveAll(rules); - return Result.ofSuccess(rules); - } - catch (Throwable throwable) { - logger.error("Error when querying flow rules", throwable); - return Result.ofThrowable(-1, throwable); - } - } - - private Result checkEntityInternal(FlowRuleEntity entity) { - if (entity == null) { - return Result.ofFail(-1, "invalid body"); - } - if (StringUtil.isBlank(entity.getApp())) { - return Result.ofFail(-1, "app can't be null or empty"); - } - if (StringUtil.isBlank(entity.getLimitApp())) { - return Result.ofFail(-1, "limitApp can't be null or empty"); - } - if (StringUtil.isBlank(entity.getResource())) { - return Result.ofFail(-1, "resource can't be null or empty"); - } - if (entity.getGrade() == null) { - return Result.ofFail(-1, "grade can't be null"); - } - if (entity.getGrade() != 0 && entity.getGrade() != 1) { - return Result.ofFail(-1, "grade must be 0 or 1, but " + entity.getGrade() + " got"); - } - if (entity.getCount() == null || entity.getCount() < 0) { - return Result.ofFail(-1, "count should be at lease zero"); - } - if (entity.getStrategy() == null) { - return Result.ofFail(-1, "strategy can't be null"); - } - if (entity.getStrategy() != 0 && StringUtil.isBlank(entity.getRefResource())) { - return Result.ofFail(-1, "refResource can't be null or empty when strategy!=0"); - } - if (entity.getControlBehavior() == null) { - return Result.ofFail(-1, "controlBehavior can't be null"); - } - int controlBehavior = entity.getControlBehavior(); - if (controlBehavior == 1 && entity.getWarmUpPeriodSec() == null) { - return Result.ofFail(-1, "warmUpPeriodSec can't be null when controlBehavior==1"); - } - if (controlBehavior == 2 && entity.getMaxQueueingTimeMs() == null) { - return Result.ofFail(-1, "maxQueueingTimeMs can't be null when controlBehavior==2"); - } - if (entity.isClusterMode() && entity.getClusterConfig() == null) { - return Result.ofFail(-1, "cluster config should be valid"); - } - return null; - } - - @PostMapping("/rule") - @AuthAction(value = PrivilegeType.WRITE_RULE) - public Result apiAddFlowRule(@RequestBody FlowRuleEntity entity) { - - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - entity.setId(null); - Date date = new Date(); - entity.setGmtCreate(date); - entity.setGmtModified(date); - entity.setLimitApp(entity.getLimitApp().trim()); - entity.setResource(entity.getResource().trim()); - try { - entity = repository.save(entity); - publishRules(entity.getApp()); - } - catch (Throwable throwable) { - logger.error("Failed to add flow rule", throwable); - return Result.ofThrowable(-1, throwable); - } - return Result.ofSuccess(entity); - } - - @PutMapping("/rule/{id}") - @AuthAction(PrivilegeType.WRITE_RULE) - - public Result apiUpdateFlowRule(@PathVariable("id") Long id, @RequestBody FlowRuleEntity entity) { - if (id == null || id <= 0) { - return Result.ofFail(-1, "Invalid id"); - } - FlowRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofFail(-1, "id " + id + " does not exist"); - } - if (entity == null) { - return Result.ofFail(-1, "invalid body"); - } - - entity.setApp(oldEntity.getApp()); - entity.setIp(oldEntity.getIp()); - entity.setPort(oldEntity.getPort()); - Result checkResult = checkEntityInternal(entity); - if (checkResult != null) { - return checkResult; - } - - entity.setId(id); - Date date = new Date(); - entity.setGmtCreate(oldEntity.getGmtCreate()); - entity.setGmtModified(date); - try { - entity = repository.save(entity); - if (entity == null) { - return Result.ofFail(-1, "save entity fail"); - } - publishRules(oldEntity.getApp()); - } - catch (Throwable throwable) { - logger.error("Failed to update flow rule", throwable); - return Result.ofThrowable(-1, throwable); - } - return Result.ofSuccess(entity); - } - - @DeleteMapping("/rule/{id}") - @AuthAction(PrivilegeType.DELETE_RULE) - public Result apiDeleteRule(@PathVariable("id") Long id) { - if (id == null || id <= 0) { - return Result.ofFail(-1, "Invalid id"); - } - FlowRuleEntity oldEntity = repository.findById(id); - if (oldEntity == null) { - return Result.ofSuccess(null); - } - - try { - repository.delete(id); - publishRules(oldEntity.getApp()); - } - catch (Exception e) { - return Result.ofFail(-1, e.getMessage()); - } - return Result.ofSuccess(id); - } - - private void publishRules(/* @NonNull */ String app) throws Exception { - List rules = repository.findAllByApp(app); - rulePublisher.publish(app, rules); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java deleted file mode 100644 index 953c7849..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/ApplicationEntity.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity; - -import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo; - -import java.util.Date; - -/** - * @author leyou - */ -public class ApplicationEntity { - - private Long id; - - private Date gmtCreate; - - private Date gmtModified; - - private String app; - - private Integer appType; - - private String activeConsole; - - private Date lastFetch; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Integer getAppType() { - return appType; - } - - public void setAppType(Integer appType) { - this.appType = appType; - } - - public String getActiveConsole() { - return activeConsole; - } - - public Date getLastFetch() { - return lastFetch; - } - - public void setLastFetch(Date lastFetch) { - this.lastFetch = lastFetch; - } - - public void setActiveConsole(String activeConsole) { - this.activeConsole = activeConsole; - } - - public AppInfo toAppInfo() { - return new AppInfo(app, appType); - } - - @Override - public String toString() { - return "ApplicationEntity{" + "id=" + id + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified - + ", app='" + app + '\'' + ", activeConsole='" + activeConsole + '\'' + ", lastFetch=" + lastFetch - + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java deleted file mode 100644 index 79d8a7ff..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MachineEntity.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity; - -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; - -import java.util.Date; - -/** - * @author leyou - */ -public class MachineEntity { - - private Long id; - - private Date gmtCreate; - - private Date gmtModified; - - private String app; - - private String ip; - - private String hostname; - - private Date timestamp; - - private Integer port; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public Date getTimestamp() { - return timestamp; - } - - public void setTimestamp(Date timestamp) { - this.timestamp = timestamp; - } - - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - public MachineInfo toMachineInfo() { - MachineInfo machineInfo = new MachineInfo(); - - machineInfo.setApp(app); - machineInfo.setHostname(hostname); - machineInfo.setIp(ip); - machineInfo.setPort(port); - machineInfo.setLastHeartbeat(timestamp.getTime()); - machineInfo.setHeartbeatVersion(timestamp.getTime()); - - return machineInfo; - } - - @Override - public String toString() { - return "MachineEntity{" + "id=" + id + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + ", app='" - + app + '\'' + ", ip='" + ip + '\'' + ", hostname='" + hostname + '\'' + ", timestamp=" + timestamp - + ", port=" + port + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java deleted file mode 100644 index 0f90f945..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricEntity.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity; - -import java.util.Date; - -/** - * @author leyou - */ -public class MetricEntity { - - private Long id; - - private Date gmtCreate; - - private Date gmtModified; - - private String app; - - /** - * 监控信息的时间戳 - */ - private Date timestamp; - - private String resource; - - private Long passQps; - - private Long successQps; - - private Long blockQps; - - private Long exceptionQps; - - /** - * summary rt of all success exit qps. - */ - private double rt; - - /** - * 本次聚合的总条数 - */ - private int count; - - private int resourceCode; - - public static MetricEntity copyOf(MetricEntity oldEntity) { - MetricEntity entity = new MetricEntity(); - entity.setId(oldEntity.getId()); - entity.setGmtCreate(oldEntity.getGmtCreate()); - entity.setGmtModified(oldEntity.getGmtModified()); - entity.setApp(oldEntity.getApp()); - entity.setTimestamp(oldEntity.getTimestamp()); - entity.setResource(oldEntity.getResource()); - entity.setPassQps(oldEntity.getPassQps()); - entity.setBlockQps(oldEntity.getBlockQps()); - entity.setSuccessQps(oldEntity.getSuccessQps()); - entity.setExceptionQps(oldEntity.getExceptionQps()); - entity.setRt(oldEntity.getRt()); - entity.setCount(oldEntity.getCount()); - return entity; - } - - public synchronized void addPassQps(Long passQps) { - this.passQps += passQps; - } - - public synchronized void addBlockQps(Long blockQps) { - this.blockQps += blockQps; - } - - public synchronized void addExceptionQps(Long exceptionQps) { - this.exceptionQps += exceptionQps; - } - - public synchronized void addCount(int count) { - this.count += count; - } - - public synchronized void addRtAndSuccessQps(double avgRt, Long successQps) { - this.rt += avgRt * successQps; - this.successQps += successQps; - } - - /** - * {@link #rt} = {@code avgRt * successQps} - * @param avgRt average rt of {@code successQps} - * @param successQps - */ - public synchronized void setRtAndSuccessQps(double avgRt, Long successQps) { - this.rt = avgRt * successQps; - this.successQps = successQps; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Date getTimestamp() { - return timestamp; - } - - public void setTimestamp(Date timestamp) { - this.timestamp = timestamp; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - this.resourceCode = resource.hashCode(); - } - - public Long getPassQps() { - return passQps; - } - - public void setPassQps(Long passQps) { - this.passQps = passQps; - } - - public Long getBlockQps() { - return blockQps; - } - - public void setBlockQps(Long blockQps) { - this.blockQps = blockQps; - } - - public Long getExceptionQps() { - return exceptionQps; - } - - public void setExceptionQps(Long exceptionQps) { - this.exceptionQps = exceptionQps; - } - - public double getRt() { - return rt; - } - - public void setRt(double rt) { - this.rt = rt; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getResourceCode() { - return resourceCode; - } - - public Long getSuccessQps() { - return successQps; - } - - public void setSuccessQps(Long successQps) { - this.successQps = successQps; - } - - @Override - public String toString() { - return "MetricEntity{" + "id=" + id + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + ", app='" - + app + '\'' + ", timestamp=" + timestamp + ", resource='" + resource + '\'' + ", passQps=" + passQps - + ", blockQps=" + blockQps + ", successQps=" + successQps + ", exceptionQps=" + exceptionQps + ", rt=" - + rt + ", count=" + count + ", resourceCode=" + resourceCode + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java deleted file mode 100644 index b01b68a6..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/MetricPositionEntity.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity; - -import java.util.Date; - -/** - * @author leyou - */ -public class MetricPositionEntity { - - private long id; - - private Date gmtCreate; - - private Date gmtModified; - - private String app; - - private String ip; - - /** - * Sentinel在该应用上使用的端口 - */ - private int port; - - /** - * 机器名,冗余字段 - */ - private String hostname; - - /** - * 上一次拉取的最晚时间戳 - */ - private Date lastFetch; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public Date getLastFetch() { - return lastFetch; - } - - public void setLastFetch(Date lastFetch) { - this.lastFetch = lastFetch; - } - - @Override - public String toString() { - return "MetricPositionEntity{" + "id=" + id + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified - + ", app='" + app + '\'' + ", ip='" + ip + '\'' + ", port=" + port + ", hostname='" + hostname + '\'' - + ", lastFetch=" + lastFetch + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java deleted file mode 100644 index 7dddb8f3..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/SentinelVersion.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -public class SentinelVersion { - - private int majorVersion; - - private int minorVersion; - - private int fixVersion; - - private String postfix; - - public SentinelVersion() { - this(0, 0, 0); - } - - public SentinelVersion(int major, int minor, int fix) { - this(major, minor, fix, null); - } - - public SentinelVersion(int major, int minor, int fix, String postfix) { - this.majorVersion = major; - this.minorVersion = minor; - this.fixVersion = fix; - this.postfix = postfix; - } - - /** - * 000, 000, 000 - */ - public int getFullVersion() { - return majorVersion * 1000000 + minorVersion * 1000 + fixVersion; - } - - public int getMajorVersion() { - return majorVersion; - } - - public SentinelVersion setMajorVersion(int majorVersion) { - this.majorVersion = majorVersion; - return this; - } - - public int getMinorVersion() { - return minorVersion; - } - - public SentinelVersion setMinorVersion(int minorVersion) { - this.minorVersion = minorVersion; - return this; - } - - public int getFixVersion() { - return fixVersion; - } - - public SentinelVersion setFixVersion(int fixVersion) { - this.fixVersion = fixVersion; - return this; - } - - public String getPostfix() { - return postfix; - } - - public SentinelVersion setPostfix(String postfix) { - this.postfix = postfix; - return this; - } - - public boolean greaterThan(SentinelVersion version) { - if (version == null) { - return true; - } - return getFullVersion() > version.getFullVersion(); - } - - public boolean greaterOrEqual(SentinelVersion version) { - if (version == null) { - return true; - } - return getFullVersion() >= version.getFullVersion(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - SentinelVersion that = (SentinelVersion) o; - - if (getFullVersion() != that.getFullVersion()) { - return false; - } - return postfix != null ? postfix.equals(that.postfix) : that.postfix == null; - } - - @Override - public int hashCode() { - int result = majorVersion; - result = 31 * result + minorVersion; - result = 31 * result + fixVersion; - result = 31 * result + (postfix != null ? postfix.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "SentinelVersion{" + "majorVersion=" + majorVersion + ", minorVersion=" + minorVersion + ", fixVersion=" - + fixVersion + ", postfix='" + postfix + '\'' + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java deleted file mode 100644 index dde2b193..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiDefinitionEntity.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway; - -import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition; -import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem; -import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity; -import com.alibaba.csp.sentinel.slots.block.Rule; - -import java.util.Date; -import java.util.LinkedHashSet; -import java.util.Objects; -import java.util.Set; - -/** - * Entity for {@link ApiDefinition}. - * - * @author cdfive - * @since 1.7.0 - */ -public class ApiDefinitionEntity implements RuleEntity { - - private Long id; - - private String app; - - private String ip; - - private Integer port; - - private Date gmtCreate; - - private Date gmtModified; - - private String apiName; - - private Set predicateItems; - - public static ApiDefinitionEntity fromApiDefinition(String app, String ip, Integer port, - ApiDefinition apiDefinition) { - ApiDefinitionEntity entity = new ApiDefinitionEntity(); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - entity.setApiName(apiDefinition.getApiName()); - - Set predicateItems = new LinkedHashSet<>(); - entity.setPredicateItems(predicateItems); - - Set apiPredicateItems = apiDefinition.getPredicateItems(); - if (apiPredicateItems != null) { - for (ApiPredicateItem apiPredicateItem : apiPredicateItems) { - ApiPredicateItemEntity itemEntity = new ApiPredicateItemEntity(); - predicateItems.add(itemEntity); - ApiPathPredicateItem pathPredicateItem = (ApiPathPredicateItem) apiPredicateItem; - itemEntity.setPattern(pathPredicateItem.getPattern()); - itemEntity.setMatchStrategy(pathPredicateItem.getMatchStrategy()); - } - } - - return entity; - } - - public ApiDefinition toApiDefinition() { - ApiDefinition apiDefinition = new ApiDefinition(); - apiDefinition.setApiName(apiName); - - Set apiPredicateItems = new LinkedHashSet<>(); - apiDefinition.setPredicateItems(apiPredicateItems); - - if (predicateItems != null) { - for (ApiPredicateItemEntity predicateItem : predicateItems) { - ApiPathPredicateItem apiPredicateItem = new ApiPathPredicateItem(); - apiPredicateItems.add(apiPredicateItem); - apiPredicateItem.setMatchStrategy(predicateItem.getMatchStrategy()); - apiPredicateItem.setPattern(predicateItem.getPattern()); - } - } - - return apiDefinition; - } - - public ApiDefinitionEntity() { - - } - - public ApiDefinitionEntity(String apiName, Set predicateItems) { - this.apiName = apiName; - this.predicateItems = predicateItems; - } - - public String getApiName() { - return apiName; - } - - public void setApiName(String apiName) { - this.apiName = apiName; - } - - public Set getPredicateItems() { - return predicateItems; - } - - public void setPredicateItems(Set predicateItems) { - this.predicateItems = predicateItems; - } - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - @Override - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - @Override - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - @Override - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - @Override - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - @Override - public Rule toRule() { - return null; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ApiDefinitionEntity entity = (ApiDefinitionEntity) o; - return Objects.equals(id, entity.id) && Objects.equals(app, entity.app) && Objects.equals(ip, entity.ip) - && Objects.equals(port, entity.port) && Objects.equals(gmtCreate, entity.gmtCreate) - && Objects.equals(gmtModified, entity.gmtModified) && Objects.equals(apiName, entity.apiName) - && Objects.equals(predicateItems, entity.predicateItems); - } - - @Override - public int hashCode() { - return Objects.hash(id, app, ip, port, gmtCreate, gmtModified, apiName, predicateItems); - } - - @Override - public String toString() { - return "ApiDefinitionEntity{" + "id=" + id + ", app='" + app + '\'' + ", ip='" + ip + '\'' + ", port=" + port - + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + ", apiName='" + apiName + '\'' - + ", predicateItems=" + predicateItems + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java deleted file mode 100644 index 62a93c34..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/ApiPredicateItemEntity.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway; - -import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem; - -import java.util.Objects; - -/** - * Entity for {@link ApiPredicateItem}. - * - * @author cdfive - * @since 1.7.0 - */ -public class ApiPredicateItemEntity { - - private String pattern; - - private Integer matchStrategy; - - public ApiPredicateItemEntity() { - } - - public ApiPredicateItemEntity(String pattern, int matchStrategy) { - this.pattern = pattern; - this.matchStrategy = matchStrategy; - } - - public String getPattern() { - return pattern; - } - - public void setPattern(String pattern) { - this.pattern = pattern; - } - - public Integer getMatchStrategy() { - return matchStrategy; - } - - public void setMatchStrategy(Integer matchStrategy) { - this.matchStrategy = matchStrategy; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ApiPredicateItemEntity that = (ApiPredicateItemEntity) o; - return Objects.equals(pattern, that.pattern) && Objects.equals(matchStrategy, that.matchStrategy); - } - - @Override - public int hashCode() { - return Objects.hash(pattern, matchStrategy); - } - - @Override - public String toString() { - return "ApiPredicateItemEntity{" + "pattern='" + pattern + '\'' + ", matchStrategy=" + matchStrategy + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java deleted file mode 100644 index eed4463f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayFlowRuleEntity.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway; - -import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule; -import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity; -import com.alibaba.csp.sentinel.slots.block.Rule; - -import java.util.Date; -import java.util.Objects; - -/** - * Entity for {@link GatewayFlowRule}. - * - * @author cdfive - * @since 1.7.0 - */ -public class GatewayFlowRuleEntity implements RuleEntity { - - /** 间隔单位 */ - /** 0-秒 */ - public static final int INTERVAL_UNIT_SECOND = 0; - - /** 1-分 */ - public static final int INTERVAL_UNIT_MINUTE = 1; - - /** 2-时 */ - public static final int INTERVAL_UNIT_HOUR = 2; - - /** 3-天 */ - public static final int INTERVAL_UNIT_DAY = 3; - - private Long id; - - private String app; - - private String ip; - - private Integer port; - - private Date gmtCreate; - - private Date gmtModified; - - private String resource; - - private Integer resourceMode; - - private Integer grade; - - private Double count; - - private Long interval; - - private Integer intervalUnit; - - private Integer controlBehavior; - - private Integer burst; - - private Integer maxQueueingTimeoutMs; - - private GatewayParamFlowItemEntity paramItem; - - public static Long calIntervalSec(Long interval, Integer intervalUnit) { - switch (intervalUnit) { - case INTERVAL_UNIT_SECOND: - return interval; - case INTERVAL_UNIT_MINUTE: - return interval * 60; - case INTERVAL_UNIT_HOUR: - return interval * 60 * 60; - case INTERVAL_UNIT_DAY: - return interval * 60 * 60 * 24; - default: - break; - } - - throw new IllegalArgumentException("Invalid intervalUnit: " + intervalUnit); - } - - public static Object[] parseIntervalSec(Long intervalSec) { - if (intervalSec % (60 * 60 * 24) == 0) { - return new Object[] { intervalSec / (60 * 60 * 24), INTERVAL_UNIT_DAY }; - } - - if (intervalSec % (60 * 60) == 0) { - return new Object[] { intervalSec / (60 * 60), INTERVAL_UNIT_HOUR }; - } - - if (intervalSec % 60 == 0) { - return new Object[] { intervalSec / 60, INTERVAL_UNIT_MINUTE }; - } - - return new Object[] { intervalSec, INTERVAL_UNIT_SECOND }; - } - - public GatewayFlowRule toGatewayFlowRule() { - GatewayFlowRule rule = new GatewayFlowRule(); - rule.setResource(resource); - rule.setResourceMode(resourceMode); - - rule.setGrade(grade); - rule.setCount(count); - rule.setIntervalSec(calIntervalSec(interval, intervalUnit)); - - rule.setControlBehavior(controlBehavior); - - if (burst != null) { - rule.setBurst(burst); - } - - if (maxQueueingTimeoutMs != null) { - rule.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs); - } - - if (paramItem != null) { - GatewayParamFlowItem ruleItem = new GatewayParamFlowItem(); - rule.setParamItem(ruleItem); - ruleItem.setParseStrategy(paramItem.getParseStrategy()); - ruleItem.setFieldName(paramItem.getFieldName()); - ruleItem.setPattern(paramItem.getPattern()); - - if (paramItem.getMatchStrategy() != null) { - ruleItem.setMatchStrategy(paramItem.getMatchStrategy()); - } - } - - return rule; - } - - public static GatewayFlowRuleEntity fromGatewayFlowRule(String app, String ip, Integer port, GatewayFlowRule rule) { - GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity(); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - - entity.setResource(rule.getResource()); - entity.setResourceMode(rule.getResourceMode()); - - entity.setGrade(rule.getGrade()); - entity.setCount(rule.getCount()); - Object[] intervalSecResult = parseIntervalSec(rule.getIntervalSec()); - entity.setInterval((Long) intervalSecResult[0]); - entity.setIntervalUnit((Integer) intervalSecResult[1]); - - entity.setControlBehavior(rule.getControlBehavior()); - entity.setBurst(rule.getBurst()); - entity.setMaxQueueingTimeoutMs(rule.getMaxQueueingTimeoutMs()); - - GatewayParamFlowItem paramItem = rule.getParamItem(); - if (paramItem != null) { - GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity(); - entity.setParamItem(itemEntity); - itemEntity.setParseStrategy(paramItem.getParseStrategy()); - itemEntity.setFieldName(paramItem.getFieldName()); - itemEntity.setPattern(paramItem.getPattern()); - itemEntity.setMatchStrategy(paramItem.getMatchStrategy()); - } - - return entity; - } - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - @Override - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - @Override - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - @Override - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - @Override - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - @Override - public Rule toRule() { - return null; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - public GatewayParamFlowItemEntity getParamItem() { - return paramItem; - } - - public void setParamItem(GatewayParamFlowItemEntity paramItem) { - this.paramItem = paramItem; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public Integer getResourceMode() { - return resourceMode; - } - - public void setResourceMode(Integer resourceMode) { - this.resourceMode = resourceMode; - } - - public Integer getGrade() { - return grade; - } - - public void setGrade(Integer grade) { - this.grade = grade; - } - - public Double getCount() { - return count; - } - - public void setCount(Double count) { - this.count = count; - } - - public Long getInterval() { - return interval; - } - - public void setInterval(Long interval) { - this.interval = interval; - } - - public Integer getIntervalUnit() { - return intervalUnit; - } - - public void setIntervalUnit(Integer intervalUnit) { - this.intervalUnit = intervalUnit; - } - - public Integer getControlBehavior() { - return controlBehavior; - } - - public void setControlBehavior(Integer controlBehavior) { - this.controlBehavior = controlBehavior; - } - - public Integer getBurst() { - return burst; - } - - public void setBurst(Integer burst) { - this.burst = burst; - } - - public Integer getMaxQueueingTimeoutMs() { - return maxQueueingTimeoutMs; - } - - public void setMaxQueueingTimeoutMs(Integer maxQueueingTimeoutMs) { - this.maxQueueingTimeoutMs = maxQueueingTimeoutMs; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - GatewayFlowRuleEntity that = (GatewayFlowRuleEntity) o; - return Objects.equals(id, that.id) && Objects.equals(app, that.app) && Objects.equals(ip, that.ip) - && Objects.equals(port, that.port) && Objects.equals(gmtCreate, that.gmtCreate) - && Objects.equals(gmtModified, that.gmtModified) && Objects.equals(resource, that.resource) - && Objects.equals(resourceMode, that.resourceMode) && Objects.equals(grade, that.grade) - && Objects.equals(count, that.count) && Objects.equals(interval, that.interval) - && Objects.equals(intervalUnit, that.intervalUnit) - && Objects.equals(controlBehavior, that.controlBehavior) && Objects.equals(burst, that.burst) - && Objects.equals(maxQueueingTimeoutMs, that.maxQueueingTimeoutMs) - && Objects.equals(paramItem, that.paramItem); - } - - @Override - public int hashCode() { - return Objects.hash(id, app, ip, port, gmtCreate, gmtModified, resource, resourceMode, grade, count, interval, - intervalUnit, controlBehavior, burst, maxQueueingTimeoutMs, paramItem); - } - - @Override - public String toString() { - return "GatewayFlowRuleEntity{" + "id=" + id + ", app='" + app + '\'' + ", ip='" + ip + '\'' + ", port=" + port - + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + ", resource='" + resource + '\'' - + ", resourceMode=" + resourceMode + ", grade=" + grade + ", count=" + count + ", interval=" + interval - + ", intervalUnit=" + intervalUnit + ", controlBehavior=" + controlBehavior + ", burst=" + burst - + ", maxQueueingTimeoutMs=" + maxQueueingTimeoutMs + ", paramItem=" + paramItem + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java deleted file mode 100644 index 2f36601e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/gateway/GatewayParamFlowItemEntity.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway; - -import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem; - -import java.util.Objects; - -/** - * Entity for {@link GatewayParamFlowItem}. - * - * @author cdfive - * @since 1.7.0 - */ -public class GatewayParamFlowItemEntity { - - private Integer parseStrategy; - - private String fieldName; - - private String pattern; - - private Integer matchStrategy; - - public Integer getParseStrategy() { - return parseStrategy; - } - - public void setParseStrategy(Integer parseStrategy) { - this.parseStrategy = parseStrategy; - } - - public String getFieldName() { - return fieldName; - } - - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - - public String getPattern() { - return pattern; - } - - public void setPattern(String pattern) { - this.pattern = pattern; - } - - public Integer getMatchStrategy() { - return matchStrategy; - } - - public void setMatchStrategy(Integer matchStrategy) { - this.matchStrategy = matchStrategy; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - GatewayParamFlowItemEntity that = (GatewayParamFlowItemEntity) o; - return Objects.equals(parseStrategy, that.parseStrategy) && Objects.equals(fieldName, that.fieldName) - && Objects.equals(pattern, that.pattern) && Objects.equals(matchStrategy, that.matchStrategy); - } - - @Override - public int hashCode() { - return Objects.hash(parseStrategy, fieldName, pattern, matchStrategy); - } - - @Override - public String toString() { - return "GatewayParamFlowItemEntity{" + "parseStrategy=" + parseStrategy + ", fieldName='" + fieldName + '\'' - + ", pattern='" + pattern + '\'' + ", matchStrategy=" + matchStrategy + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java deleted file mode 100644 index 43fb72f7..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AbstractRuleEntity.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.block.AbstractRule; - -import java.util.Date; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -public abstract class AbstractRuleEntity implements RuleEntity { - - protected Long id; - - protected String app; - - protected String ip; - - protected Integer port; - - protected T rule; - - private Date gmtCreate; - - private Date gmtModified; - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - @Override - public String getApp() { - return app; - } - - public AbstractRuleEntity setApp(String app) { - this.app = app; - return this; - } - - @Override - public String getIp() { - return ip; - } - - public AbstractRuleEntity setIp(String ip) { - this.ip = ip; - return this; - } - - @Override - public Integer getPort() { - return port; - } - - public AbstractRuleEntity setPort(Integer port) { - this.port = port; - return this; - } - - public T getRule() { - return rule; - } - - public AbstractRuleEntity setRule(T rule) { - this.rule = rule; - return this; - } - - @Override - public Date getGmtCreate() { - return gmtCreate; - } - - public AbstractRuleEntity setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - return this; - } - - public Date getGmtModified() { - return gmtModified; - } - - public AbstractRuleEntity setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - return this; - } - - @Override - public T toRule() { - return rule; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java deleted file mode 100644 index a66cb9ad..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/AuthorityRuleEntity.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; -import com.alibaba.csp.sentinel.util.AssertUtil; -import com.alibaba.fastjson.annotation.JSONField; -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -public class AuthorityRuleEntity extends AbstractRuleEntity { - - public AuthorityRuleEntity() { - } - - public AuthorityRuleEntity(AuthorityRule authorityRule) { - AssertUtil.notNull(authorityRule, "Authority rule should not be null"); - this.rule = authorityRule; - } - - public static AuthorityRuleEntity fromAuthorityRule(String app, String ip, Integer port, AuthorityRule rule) { - AuthorityRuleEntity entity = new AuthorityRuleEntity(rule); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - return entity; - } - - @JsonIgnore - @JSONField(serialize = false) - public String getLimitApp() { - return rule.getLimitApp(); - } - - @JsonIgnore - @JSONField(serialize = false) - public String getResource() { - return rule.getResource(); - } - - @JsonIgnore - @JSONField(serialize = false) - public int getStrategy() { - return rule.getStrategy(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java deleted file mode 100644 index 4804f0e2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/DegradeRuleEntity.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; - -import java.util.Date; - -/** - * @author leyou - */ -public class DegradeRuleEntity implements RuleEntity { - - private Long id; - - private String app; - - private String ip; - - private Integer port; - - private String resource; - - private String limitApp; - - private Double count; - - private Integer timeWindow; - - private Integer grade; - - private Integer minRequestAmount; - - private Double slowRatioThreshold; - - private Integer statIntervalMs; - - private Date gmtCreate; - - private Date gmtModified; - - public static DegradeRuleEntity fromDegradeRule(String app, String ip, Integer port, DegradeRule rule) { - DegradeRuleEntity entity = new DegradeRuleEntity(); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - entity.setResource(rule.getResource()); - entity.setLimitApp(rule.getLimitApp()); - entity.setCount(rule.getCount()); - entity.setTimeWindow(rule.getTimeWindow()); - entity.setGrade(rule.getGrade()); - entity.setMinRequestAmount(rule.getMinRequestAmount()); - entity.setSlowRatioThreshold(rule.getSlowRatioThreshold()); - entity.setStatIntervalMs(rule.getStatIntervalMs()); - return entity; - } - - @Override - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - @Override - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - @Override - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public String getLimitApp() { - return limitApp; - } - - public void setLimitApp(String limitApp) { - this.limitApp = limitApp; - } - - public Double getCount() { - return count; - } - - public void setCount(Double count) { - this.count = count; - } - - public Integer getTimeWindow() { - return timeWindow; - } - - public void setTimeWindow(Integer timeWindow) { - this.timeWindow = timeWindow; - } - - public Integer getGrade() { - return grade; - } - - public void setGrade(Integer grade) { - this.grade = grade; - } - - public Integer getMinRequestAmount() { - return minRequestAmount; - } - - public DegradeRuleEntity setMinRequestAmount(Integer minRequestAmount) { - this.minRequestAmount = minRequestAmount; - return this; - } - - public Double getSlowRatioThreshold() { - return slowRatioThreshold; - } - - public DegradeRuleEntity setSlowRatioThreshold(Double slowRatioThreshold) { - this.slowRatioThreshold = slowRatioThreshold; - return this; - } - - public Integer getStatIntervalMs() { - return statIntervalMs; - } - - public DegradeRuleEntity setStatIntervalMs(Integer statIntervalMs) { - this.statIntervalMs = statIntervalMs; - return this; - } - - @Override - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - @Override - public DegradeRule toRule() { - DegradeRule rule = new DegradeRule(); - rule.setResource(resource); - rule.setLimitApp(limitApp); - rule.setCount(count); - rule.setTimeWindow(timeWindow); - rule.setGrade(grade); - if (minRequestAmount != null) { - rule.setMinRequestAmount(minRequestAmount); - } - if (slowRatioThreshold != null) { - rule.setSlowRatioThreshold(slowRatioThreshold); - } - if (statIntervalMs != null) { - rule.setStatIntervalMs(statIntervalMs); - } - - return rule; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java deleted file mode 100644 index c83cb8ce..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/FlowRuleEntity.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.block.flow.ClusterFlowConfig; -import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; - -import java.util.Date; - -/** - * @author leyou - */ -public class FlowRuleEntity implements RuleEntity { - - private Long id; - - private String app; - - private String ip; - - private Integer port; - - private String limitApp; - - private String resource; - - /** - * 0为线程数;1为qps - */ - private Integer grade; - - private Double count; - - /** - * 0为直接限流;1为关联限流;2为链路限流 - ***/ - private Integer strategy; - - private String refResource; - - /** - * 0. default, 1. warm up, 2. rate limiter - */ - private Integer controlBehavior; - - private Integer warmUpPeriodSec; - - /** - * max queueing time in rate limiter behavior - */ - private Integer maxQueueingTimeMs; - - private boolean clusterMode; - - /** - * Flow rule config for cluster mode. - */ - private ClusterFlowConfig clusterConfig; - - private Date gmtCreate; - - private Date gmtModified; - - public static FlowRuleEntity fromFlowRule(String app, String ip, Integer port, FlowRule rule) { - FlowRuleEntity entity = new FlowRuleEntity(); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - entity.setLimitApp(rule.getLimitApp()); - entity.setResource(rule.getResource()); - entity.setGrade(rule.getGrade()); - entity.setCount(rule.getCount()); - entity.setStrategy(rule.getStrategy()); - entity.setRefResource(rule.getRefResource()); - entity.setControlBehavior(rule.getControlBehavior()); - entity.setWarmUpPeriodSec(rule.getWarmUpPeriodSec()); - entity.setMaxQueueingTimeMs(rule.getMaxQueueingTimeMs()); - entity.setClusterMode(rule.isClusterMode()); - entity.setClusterConfig(rule.getClusterConfig()); - return entity; - } - - @Override - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - @Override - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - @Override - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - public String getLimitApp() { - return limitApp; - } - - public void setLimitApp(String limitApp) { - this.limitApp = limitApp; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public Integer getGrade() { - return grade; - } - - public void setGrade(Integer grade) { - this.grade = grade; - } - - public Double getCount() { - return count; - } - - public void setCount(Double count) { - this.count = count; - } - - public Integer getStrategy() { - return strategy; - } - - public void setStrategy(Integer strategy) { - this.strategy = strategy; - } - - public String getRefResource() { - return refResource; - } - - public void setRefResource(String refResource) { - this.refResource = refResource; - } - - public Integer getControlBehavior() { - return controlBehavior; - } - - public void setControlBehavior(Integer controlBehavior) { - this.controlBehavior = controlBehavior; - } - - public Integer getWarmUpPeriodSec() { - return warmUpPeriodSec; - } - - public void setWarmUpPeriodSec(Integer warmUpPeriodSec) { - this.warmUpPeriodSec = warmUpPeriodSec; - } - - public Integer getMaxQueueingTimeMs() { - return maxQueueingTimeMs; - } - - public void setMaxQueueingTimeMs(Integer maxQueueingTimeMs) { - this.maxQueueingTimeMs = maxQueueingTimeMs; - } - - public boolean isClusterMode() { - return clusterMode; - } - - public FlowRuleEntity setClusterMode(boolean clusterMode) { - this.clusterMode = clusterMode; - return this; - } - - public ClusterFlowConfig getClusterConfig() { - return clusterConfig; - } - - public FlowRuleEntity setClusterConfig(ClusterFlowConfig clusterConfig) { - this.clusterConfig = clusterConfig; - return this; - } - - @Override - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - @Override - public FlowRule toRule() { - FlowRule flowRule = new FlowRule(); - flowRule.setCount(this.count); - flowRule.setGrade(this.grade); - flowRule.setResource(this.resource); - flowRule.setLimitApp(this.limitApp); - flowRule.setRefResource(this.refResource); - flowRule.setStrategy(this.strategy); - if (this.controlBehavior != null) { - flowRule.setControlBehavior(controlBehavior); - } - if (this.warmUpPeriodSec != null) { - flowRule.setWarmUpPeriodSec(warmUpPeriodSec); - } - if (this.maxQueueingTimeMs != null) { - flowRule.setMaxQueueingTimeMs(maxQueueingTimeMs); - } - flowRule.setClusterMode(clusterMode); - flowRule.setClusterConfig(clusterConfig); - return flowRule; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java deleted file mode 100644 index c90ef913..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/ParamFlowRuleEntity.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowClusterConfig; -import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem; -import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; -import com.alibaba.csp.sentinel.util.AssertUtil; -import com.alibaba.fastjson.annotation.JSONField; -import com.fasterxml.jackson.annotation.JsonIgnore; - -import java.util.List; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -public class ParamFlowRuleEntity extends AbstractRuleEntity { - - public ParamFlowRuleEntity() { - } - - public ParamFlowRuleEntity(ParamFlowRule rule) { - AssertUtil.notNull(rule, "Authority rule should not be null"); - this.rule = rule; - } - - public static ParamFlowRuleEntity fromParamFlowRule(String app, String ip, Integer port, ParamFlowRule rule) { - ParamFlowRuleEntity entity = new ParamFlowRuleEntity(rule); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - return entity; - } - - @JsonIgnore - @JSONField(serialize = false) - public String getLimitApp() { - return rule.getLimitApp(); - } - - @JsonIgnore - @JSONField(serialize = false) - public String getResource() { - return rule.getResource(); - } - - @JsonIgnore - @JSONField(serialize = false) - public int getGrade() { - return rule.getGrade(); - } - - @JsonIgnore - @JSONField(serialize = false) - public Integer getParamIdx() { - return rule.getParamIdx(); - } - - @JsonIgnore - @JSONField(serialize = false) - public double getCount() { - return rule.getCount(); - } - - @JsonIgnore - @JSONField(serialize = false) - public List getParamFlowItemList() { - return rule.getParamFlowItemList(); - } - - @JsonIgnore - @JSONField(serialize = false) - public int getControlBehavior() { - return rule.getControlBehavior(); - } - - @JsonIgnore - @JSONField(serialize = false) - public int getMaxQueueingTimeMs() { - return rule.getMaxQueueingTimeMs(); - } - - @JsonIgnore - @JSONField(serialize = false) - public int getBurstCount() { - return rule.getBurstCount(); - } - - @JsonIgnore - @JSONField(serialize = false) - public long getDurationInSec() { - return rule.getDurationInSec(); - } - - @JsonIgnore - @JSONField(serialize = false) - public boolean isClusterMode() { - return rule.isClusterMode(); - } - - @JsonIgnore - @JSONField(serialize = false) - public ParamFlowClusterConfig getClusterConfig() { - return rule.getClusterConfig(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java deleted file mode 100644 index 52d7e0f6..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/RuleEntity.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.block.Rule; - -import java.util.Date; - -/** - * @author leyou - */ -public interface RuleEntity { - - Long getId(); - - void setId(Long id); - - String getApp(); - - String getIp(); - - Integer getPort(); - - Date getGmtCreate(); - - Rule toRule(); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java deleted file mode 100644 index a147d3fa..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/datasource/entity/rule/SystemRuleEntity.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.datasource.entity.rule; - -import com.alibaba.csp.sentinel.slots.system.SystemRule; - -import java.util.Date; - -/** - * @author leyou - */ -public class SystemRuleEntity implements RuleEntity { - - private Long id; - - private String app; - - private String ip; - - private Integer port; - - private Double highestSystemLoad; - - private Long avgRt; - - private Long maxThread; - - private Double qps; - - private Double highestCpuUsage; - - private Date gmtCreate; - - private Date gmtModified; - - public static SystemRuleEntity fromSystemRule(String app, String ip, Integer port, SystemRule rule) { - SystemRuleEntity entity = new SystemRuleEntity(); - entity.setApp(app); - entity.setIp(ip); - entity.setPort(port); - entity.setHighestSystemLoad(rule.getHighestSystemLoad()); - entity.setHighestCpuUsage(rule.getHighestCpuUsage()); - entity.setAvgRt(rule.getAvgRt()); - entity.setMaxThread(rule.getMaxThread()); - entity.setQps(rule.getQps()); - return entity; - } - - @Override - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - @Override - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - @Override - public Long getId() { - return id; - } - - @Override - public void setId(Long id) { - this.id = id; - } - - @Override - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Double getHighestSystemLoad() { - return highestSystemLoad; - } - - public void setHighestSystemLoad(Double highestSystemLoad) { - this.highestSystemLoad = highestSystemLoad; - } - - public Long getAvgRt() { - return avgRt; - } - - public void setAvgRt(Long avgRt) { - this.avgRt = avgRt; - } - - public Long getMaxThread() { - return maxThread; - } - - public void setMaxThread(Long maxThread) { - this.maxThread = maxThread; - } - - public Double getQps() { - return qps; - } - - public void setQps(Double qps) { - this.qps = qps; - } - - public Double getHighestCpuUsage() { - return highestCpuUsage; - } - - public void setHighestCpuUsage(Double highestCpuUsage) { - this.highestCpuUsage = highestCpuUsage; - } - - @Override - public Date getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Date gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public Date getGmtModified() { - return gmtModified; - } - - public void setGmtModified(Date gmtModified) { - this.gmtModified = gmtModified; - } - - @Override - public SystemRule toRule() { - SystemRule rule = new SystemRule(); - rule.setHighestSystemLoad(highestSystemLoad); - rule.setAvgRt(avgRt); - rule.setMaxThread(maxThread); - rule.setQps(qps); - rule.setHighestCpuUsage(highestCpuUsage); - return rule; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java deleted file mode 100644 index 33bfc2bb..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.discovery; - -import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class AppInfo { - - private String app = ""; - - private Integer appType = 0; - - private Set machines = ConcurrentHashMap.newKeySet(); - - public AppInfo() { - } - - public AppInfo(String app) { - this.app = app; - } - - public AppInfo(String app, Integer appType) { - this.app = app; - this.appType = appType; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Integer getAppType() { - return appType; - } - - public void setAppType(Integer appType) { - this.appType = appType; - } - - /** - * Get the current machines. - * @return a new copy of the current machines. - */ - public Set getMachines() { - return new HashSet<>(machines); - } - - @Override - public String toString() { - return "AppInfo{" + "app='" + app + ", machines=" + machines + '}'; - } - - public boolean addMachine(MachineInfo machineInfo) { - machines.remove(machineInfo); - return machines.add(machineInfo); - } - - public synchronized boolean removeMachine(String ip, int port) { - Iterator it = machines.iterator(); - while (it.hasNext()) { - MachineInfo machine = it.next(); - if (machine.getIp().equals(ip) && machine.getPort() == port) { - it.remove(); - return true; - } - } - return false; - } - - public Optional getMachine(String ip, int port) { - return machines.stream().filter(e -> e.getIp().equals(ip) && e.getPort().equals(port)).findFirst(); - } - - private boolean heartbeatJudge(final int threshold) { - if (machines.size() == 0) { - return false; - } - if (threshold > 0) { - long healthyCount = machines.stream().filter(MachineInfo::isHealthy).count(); - if (healthyCount == 0) { - // No healthy machines. - return machines.stream() - .max(Comparator.comparingLong(MachineInfo::getLastHeartbeat)) - .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold) - .orElse(false); - } - } - return true; - } - - /** - * Check whether current application has no healthy machines and should not be - * displayed. - * @return true if the application should be displayed in the sidebar, otherwise false - */ - public boolean isShown() { - return heartbeatJudge(DashboardConfig.getHideAppNoMachineMillis()); - } - - /** - * Check whether current application has no healthy machines and should be removed. - * @return true if the application is dead and should be removed, otherwise false - */ - public boolean isDead() { - return !heartbeatJudge(DashboardConfig.getRemoveAppNoMachineMillis()); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java deleted file mode 100644 index 7733a516..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppManagement.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.discovery; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.List; -import java.util.Set; - -@Component -public class AppManagement implements MachineDiscovery { - - @Autowired - private ApplicationContext context; - - private MachineDiscovery machineDiscovery; - - @PostConstruct - public void init() { - machineDiscovery = context.getBean(SimpleMachineDiscovery.class); - } - - @Override - public Set getBriefApps() { - return machineDiscovery.getBriefApps(); - } - - @Override - public long addMachine(MachineInfo machineInfo) { - return machineDiscovery.addMachine(machineInfo); - } - - @Override - public boolean removeMachine(String app, String ip, int port) { - return machineDiscovery.removeMachine(app, ip, port); - } - - @Override - public List getAppNames() { - return machineDiscovery.getAppNames(); - } - - @Override - public AppInfo getDetailApp(String app) { - return machineDiscovery.getDetailApp(app); - } - - @Override - public void removeApp(String app) { - machineDiscovery.removeApp(app); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java deleted file mode 100644 index 454e55a2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineDiscovery.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.discovery; - -import java.util.List; -import java.util.Set; - -public interface MachineDiscovery { - - String UNKNOWN_APP_NAME = "CLUSTER_NOT_STARTED"; - - List getAppNames(); - - Set getBriefApps(); - - AppInfo getDetailApp(String app); - - /** - * Remove the given app from the application registry. - * @param app application name - * @since 1.5.0 - */ - void removeApp(String app); - - long addMachine(MachineInfo machineInfo); - - /** - * Remove the given machine instance from the application registry. - * @param app the application name of the machine - * @param ip machine IP - * @param port machine port - * @return true if removed, otherwise false - * @since 1.5.0 - */ - boolean removeMachine(String app, String ip, int port); - -} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java deleted file mode 100644 index 357ed599..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.discovery; - -import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig; -import com.alibaba.csp.sentinel.util.StringUtil; - -import java.util.Objects; - -public class MachineInfo implements Comparable { - - private String app = ""; - - private Integer appType = 0; - - private String hostname = ""; - - private String ip = ""; - - private Integer port = -1; - - private long lastHeartbeat; - - private long heartbeatVersion; - - /** - * Indicates the version of Sentinel client (since 0.2.0). - */ - private String version; - - public static MachineInfo of(String app, String ip, Integer port) { - MachineInfo machineInfo = new MachineInfo(); - machineInfo.setApp(app); - machineInfo.setIp(ip); - machineInfo.setPort(port); - return machineInfo; - } - - public String toHostPort() { - return ip + ":" + port; - } - - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Integer getAppType() { - return appType; - } - - public void setAppType(Integer appType) { - this.appType = appType; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public long getHeartbeatVersion() { - return heartbeatVersion; - } - - public void setHeartbeatVersion(long heartbeatVersion) { - this.heartbeatVersion = heartbeatVersion; - } - - public String getVersion() { - return version; - } - - public MachineInfo setVersion(String version) { - this.version = version; - return this; - } - - public boolean isHealthy() { - long delta = System.currentTimeMillis() - lastHeartbeat; - return delta < DashboardConfig.getUnhealthyMachineMillis(); - } - - /** - * whether dead should be removed - * @return - */ - public boolean isDead() { - if (DashboardConfig.getAutoRemoveMachineMillis() > 0) { - long delta = System.currentTimeMillis() - lastHeartbeat; - return delta > DashboardConfig.getAutoRemoveMachineMillis(); - } - return false; - } - - public long getLastHeartbeat() { - return lastHeartbeat; - } - - public void setLastHeartbeat(long lastHeartbeat) { - this.lastHeartbeat = lastHeartbeat; - } - - @Override - public int compareTo(MachineInfo o) { - if (this == o) { - return 0; - } - if (!port.equals(o.getPort())) { - return port.compareTo(o.getPort()); - } - if (!StringUtil.equals(app, o.getApp())) { - return app.compareToIgnoreCase(o.getApp()); - } - return ip.compareToIgnoreCase(o.getIp()); - } - - @Override - public String toString() { - return new StringBuilder("MachineInfo {").append("app='") - .append(app) - .append('\'') - .append(",appType='") - .append(appType) - .append('\'') - .append(", hostname='") - .append(hostname) - .append('\'') - .append(", ip='") - .append(ip) - .append('\'') - .append(", port=") - .append(port) - .append(", heartbeatVersion=") - .append(heartbeatVersion) - .append(", lastHeartbeat=") - .append(lastHeartbeat) - .append(", version='") - .append(version) - .append('\'') - .append(", healthy=") - .append(isHealthy()) - .append('}') - .toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof MachineInfo)) { - return false; - } - MachineInfo that = (MachineInfo) o; - return Objects.equals(app, that.app) && Objects.equals(ip, that.ip) && Objects.equals(port, that.port); - } - - @Override - public int hashCode() { - return Objects.hash(app, ip, port); - } - - /** - * Information for log - * @return - */ - public String toLogString() { - return app + "|" + ip + "|" + port + "|" + version; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java deleted file mode 100644 index 5d06c5f9..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/SimpleMachineDiscovery.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.discovery; - -import com.alibaba.csp.sentinel.util.AssertUtil; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * @author leyou - */ -@Component -public class SimpleMachineDiscovery implements MachineDiscovery { - - private final ConcurrentMap apps = new ConcurrentHashMap<>(); - - @Override - public long addMachine(MachineInfo machineInfo) { - AssertUtil.notNull(machineInfo, "machineInfo cannot be null"); - AppInfo appInfo = apps.computeIfAbsent(machineInfo.getApp(), - o -> new AppInfo(machineInfo.getApp(), machineInfo.getAppType())); - appInfo.addMachine(machineInfo); - return 1; - } - - @Override - public boolean removeMachine(String app, String ip, int port) { - AssertUtil.assertNotBlank(app, "app name cannot be blank"); - AppInfo appInfo = apps.get(app); - if (appInfo != null) { - return appInfo.removeMachine(ip, port); - } - return false; - } - - @Override - public List getAppNames() { - return new ArrayList<>(apps.keySet()); - } - - @Override - public AppInfo getDetailApp(String app) { - AssertUtil.assertNotBlank(app, "app name cannot be blank"); - return apps.get(app); - } - - @Override - public Set getBriefApps() { - return new HashSet<>(apps.values()); - } - - @Override - public void removeApp(String app) { - AssertUtil.assertNotBlank(app, "app name cannot be blank"); - apps.remove(app); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java deleted file mode 100644 index bb6dead7..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/ResourceTreeNode.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain; - -import com.alibaba.csp.sentinel.command.vo.NodeVo; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author leyou - */ -public class ResourceTreeNode { - - private String id; - - private String parentId; - - private String resource; - - private Integer threadNum; - - private Long passQps; - - private Long blockQps; - - private Long totalQps; - - private Long averageRt; - - private Long successQps; - - private Long exceptionQps; - - private Long oneMinutePass; - - private Long oneMinuteBlock; - - private Long oneMinuteException; - - private Long oneMinuteTotal; - - private boolean visible = true; - - private List children = new ArrayList<>(); - - public static ResourceTreeNode fromNodeVoList(List nodeVos) { - if (nodeVos == null || nodeVos.isEmpty()) { - return null; - } - ResourceTreeNode root = null; - Map map = new HashMap<>(); - for (NodeVo vo : nodeVos) { - ResourceTreeNode node = fromNodeVo(vo); - map.put(node.id, node); - // real root - if (node.parentId == null || node.parentId.isEmpty()) { - root = node; - } - else if (map.containsKey(node.parentId)) { - map.get(node.parentId).children.add(node); - } - else { - // impossible - } - } - return root; - } - - public static ResourceTreeNode fromNodeVo(NodeVo vo) { - ResourceTreeNode node = new ResourceTreeNode(); - node.id = vo.getId(); - node.parentId = vo.getParentId(); - node.resource = vo.getResource(); - node.threadNum = vo.getThreadNum(); - node.passQps = vo.getPassQps(); - node.blockQps = vo.getBlockQps(); - node.totalQps = vo.getTotalQps(); - node.averageRt = vo.getAverageRt(); - node.successQps = vo.getSuccessQps(); - node.exceptionQps = vo.getExceptionQps(); - node.oneMinutePass = vo.getOneMinutePass(); - node.oneMinuteBlock = vo.getOneMinuteBlock(); - node.oneMinuteException = vo.getOneMinuteException(); - node.oneMinuteTotal = vo.getOneMinuteTotal(); - return node; - } - - public void searchIgnoreCase(String searchKey) { - search(this, searchKey); - } - - /** - * This node is visible only when searchKey matches this.resource or at least one of - * this's children is visible - */ - private boolean search(ResourceTreeNode node, String searchKey) { - // empty matches all - if (searchKey == null || searchKey.isEmpty() || node.resource.toLowerCase().contains(searchKey.toLowerCase())) { - node.visible = true; - } - else { - node.visible = false; - } - - boolean found = false; - for (ResourceTreeNode c : node.children) { - found |= search(c, searchKey); - } - node.visible |= found; - return node.visible; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getParentId() { - return parentId; - } - - public void setParentId(String parentId) { - this.parentId = parentId; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public Integer getThreadNum() { - return threadNum; - } - - public void setThreadNum(Integer threadNum) { - this.threadNum = threadNum; - } - - public Long getPassQps() { - return passQps; - } - - public void setPassQps(Long passQps) { - this.passQps = passQps; - } - - public Long getBlockQps() { - return blockQps; - } - - public void setBlockQps(Long blockQps) { - this.blockQps = blockQps; - } - - public Long getTotalQps() { - return totalQps; - } - - public void setTotalQps(Long totalQps) { - this.totalQps = totalQps; - } - - public Long getAverageRt() { - return averageRt; - } - - public void setAverageRt(Long averageRt) { - this.averageRt = averageRt; - } - - public Long getSuccessQps() { - return successQps; - } - - public void setSuccessQps(Long successQps) { - this.successQps = successQps; - } - - public Long getExceptionQps() { - return exceptionQps; - } - - public void setExceptionQps(Long exceptionQps) { - this.exceptionQps = exceptionQps; - } - - public Long getOneMinutePass() { - return oneMinutePass; - } - - public void setOneMinutePass(Long oneMinutePass) { - this.oneMinutePass = oneMinutePass; - } - - public Long getOneMinuteBlock() { - return oneMinuteBlock; - } - - public void setOneMinuteBlock(Long oneMinuteBlock) { - this.oneMinuteBlock = oneMinuteBlock; - } - - public Long getOneMinuteException() { - return oneMinuteException; - } - - public void setOneMinuteException(Long oneMinuteException) { - this.oneMinuteException = oneMinuteException; - } - - public Long getOneMinuteTotal() { - return oneMinuteTotal; - } - - public void setOneMinuteTotal(Long oneMinuteTotal) { - this.oneMinuteTotal = oneMinuteTotal; - } - - public boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } - - public List getChildren() { - return children; - } - - public void setChildren(List children) { - this.children = children; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java deleted file mode 100644 index ca8246d4..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/Result.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain; - -/** - * @author leyou - * @author Eric Zhao - */ -public class Result { - - private boolean success; - - private int code; - - private String msg; - - private R data; - - public static Result ofSuccess(R data) { - return new Result().setSuccess(true).setMsg("success").setData(data); - } - - public static Result ofSuccessMsg(String msg) { - return new Result().setSuccess(true).setMsg(msg); - } - - public static Result ofFail(int code, String msg) { - Result result = new Result<>(); - result.setSuccess(false); - result.setCode(code); - result.setMsg(msg); - return result; - } - - public static Result ofThrowable(int code, Throwable throwable) { - Result result = new Result<>(); - result.setSuccess(false); - result.setCode(code); - result.setMsg(throwable.getClass().getName() + ", " + throwable.getMessage()); - return result; - } - - public boolean isSuccess() { - return success; - } - - public Result setSuccess(boolean success) { - this.success = success; - return this; - } - - public int getCode() { - return code; - } - - public Result setCode(int code) { - this.code = code; - return this; - } - - public String getMsg() { - return msg; - } - - public Result setMsg(String msg) { - this.msg = msg; - return this; - } - - public R getData() { - return data; - } - - public Result setData(R data) { - this.data = data; - return this; - } - - @Override - public String toString() { - return "Result{" + "success=" + success + ", code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java deleted file mode 100644 index 74467f7e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppAssignResultVO.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterAppAssignResultVO { - - private Set failedServerSet; - - private Set failedClientSet; - - private Integer totalCount; - - public Set getFailedServerSet() { - return failedServerSet; - } - - public ClusterAppAssignResultVO setFailedServerSet(Set failedServerSet) { - this.failedServerSet = failedServerSet; - return this; - } - - public Set getFailedClientSet() { - return failedClientSet; - } - - public ClusterAppAssignResultVO setFailedClientSet(Set failedClientSet) { - this.failedClientSet = failedClientSet; - return this; - } - - public Integer getTotalCount() { - return totalCount; - } - - public ClusterAppAssignResultVO setTotalCount(Integer totalCount) { - this.totalCount = totalCount; - return this; - } - - @Override - public String toString() { - return "ClusterAppAssignResultVO{" + "failedServerSet=" + failedServerSet + ", failedClientSet=" - + failedClientSet + ", totalCount=" + totalCount + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java deleted file mode 100644 index 2e096080..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppFullAssignRequest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap; - -import java.util.List; -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterAppFullAssignRequest { - - private List clusterMap; - - private Set remainingList; - - public List getClusterMap() { - return clusterMap; - } - - public ClusterAppFullAssignRequest setClusterMap(List clusterMap) { - this.clusterMap = clusterMap; - return this; - } - - public Set getRemainingList() { - return remainingList; - } - - public ClusterAppFullAssignRequest setRemainingList(Set remainingList) { - this.remainingList = remainingList; - return this; - } - - @Override - public String toString() { - return "ClusterAppFullAssignRequest{" + "clusterMap=" + clusterMap + ", remainingList=" + remainingList + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java deleted file mode 100644 index 3b5b2ac9..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterAppSingleServerAssignRequest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap; - -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterAppSingleServerAssignRequest { - - private ClusterAppAssignMap clusterMap; - - private Set remainingList; - - public ClusterAppAssignMap getClusterMap() { - return clusterMap; - } - - public ClusterAppSingleServerAssignRequest setClusterMap(ClusterAppAssignMap clusterMap) { - this.clusterMap = clusterMap; - return this; - } - - public Set getRemainingList() { - return remainingList; - } - - public ClusterAppSingleServerAssignRequest setRemainingList(Set remainingList) { - this.remainingList = remainingList; - return this; - } - - @Override - public String toString() { - return "ClusterAppSingleServerAssignRequest{" + "clusterMap=" + clusterMap + ", remainingList=" + remainingList - + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java deleted file mode 100644 index b2c6299b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterClientInfoVO.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterClientInfoVO { - - private String serverHost; - - private Integer serverPort; - - private Integer clientState; - - private Integer requestTimeout; - - public String getServerHost() { - return serverHost; - } - - public ClusterClientInfoVO setServerHost(String serverHost) { - this.serverHost = serverHost; - return this; - } - - public Integer getServerPort() { - return serverPort; - } - - public ClusterClientInfoVO setServerPort(Integer serverPort) { - this.serverPort = serverPort; - return this; - } - - public Integer getClientState() { - return clientState; - } - - public ClusterClientInfoVO setClientState(Integer clientState) { - this.clientState = clientState; - return this; - } - - public Integer getRequestTimeout() { - return requestTimeout; - } - - public ClusterClientInfoVO setRequestTimeout(Integer requestTimeout) { - this.requestTimeout = requestTimeout; - return this; - } - - @Override - public String toString() { - return "ClusterClientInfoVO{" + "serverHost='" + serverHost + '\'' + ", serverPort=" + serverPort - + ", clientState=" + clientState + ", requestTimeout=" + requestTimeout + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java deleted file mode 100644 index 99150f56..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterGroupEntity.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterGroupEntity { - - private String machineId; - - private String ip; - - private Integer port; - - private Set clientSet = new HashSet<>(); - - private Boolean belongToApp; - - public String getMachineId() { - return machineId; - } - - public ClusterGroupEntity setMachineId(String machineId) { - this.machineId = machineId; - return this; - } - - public String getIp() { - return ip; - } - - public ClusterGroupEntity setIp(String ip) { - this.ip = ip; - return this; - } - - public Integer getPort() { - return port; - } - - public ClusterGroupEntity setPort(Integer port) { - this.port = port; - return this; - } - - public Set getClientSet() { - return clientSet; - } - - public ClusterGroupEntity setClientSet(Set clientSet) { - this.clientSet = clientSet; - return this; - } - - public Boolean getBelongToApp() { - return belongToApp; - } - - public ClusterGroupEntity setBelongToApp(Boolean belongToApp) { - this.belongToApp = belongToApp; - return this; - } - - @Override - public String toString() { - return "ClusterGroupEntity{" + "machineId='" + machineId + '\'' + ", ip='" + ip + '\'' + ", port=" + port - + ", clientSet=" + clientSet + ", belongToApp=" + belongToApp + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java deleted file mode 100644 index 032efa0a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ClusterStateSingleVO.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterStateSingleVO { - - private String address; - - private Integer mode; - - private String target; - - public String getAddress() { - return address; - } - - public ClusterStateSingleVO setAddress(String address) { - this.address = address; - return this; - } - - public Integer getMode() { - return mode; - } - - public ClusterStateSingleVO setMode(Integer mode) { - this.mode = mode; - return this; - } - - public String getTarget() { - return target; - } - - public ClusterStateSingleVO setTarget(String target) { - this.target = target; - return this; - } - - @Override - public String toString() { - return "ClusterStateSingleVO{" + "address='" + address + '\'' + ", mode=" + mode + ", target='" + target + '\'' - + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java deleted file mode 100644 index 3ac35a70..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionDescriptorVO.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ConnectionDescriptorVO { - - private String address; - - private String host; - - public String getAddress() { - return address; - } - - public ConnectionDescriptorVO setAddress(String address) { - this.address = address; - return this; - } - - public String getHost() { - return host; - } - - public ConnectionDescriptorVO setHost(String host) { - this.host = host; - return this; - } - - @Override - public String toString() { - return "ConnectionDescriptorVO{" + "address='" + address + '\'' + ", host='" + host + '\'' + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java deleted file mode 100644 index d75a07c4..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/ConnectionGroupVO.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster; - -import java.util.List; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ConnectionGroupVO { - - private String namespace; - - private List connectionSet; - - private Integer connectedCount; - - public String getNamespace() { - return namespace; - } - - public ConnectionGroupVO setNamespace(String namespace) { - this.namespace = namespace; - return this; - } - - public List getConnectionSet() { - return connectionSet; - } - - public ConnectionGroupVO setConnectionSet(List connectionSet) { - this.connectionSet = connectionSet; - return this; - } - - public Integer getConnectedCount() { - return connectedCount; - } - - public ConnectionGroupVO setConnectedCount(Integer connectedCount) { - this.connectedCount = connectedCount; - return this; - } - - @Override - public String toString() { - return "ConnectionGroupVO{" + "namespace='" + namespace + '\'' + ", connectionSet=" + connectionSet - + ", connectedCount=" + connectedCount + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java deleted file mode 100644 index e626bac4..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ClusterClientConfig.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.config; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterClientConfig { - - private String serverHost; - - private Integer serverPort; - - private Integer requestTimeout; - - private Integer connectTimeout; - - public String getServerHost() { - return serverHost; - } - - public ClusterClientConfig setServerHost(String serverHost) { - this.serverHost = serverHost; - return this; - } - - public Integer getServerPort() { - return serverPort; - } - - public ClusterClientConfig setServerPort(Integer serverPort) { - this.serverPort = serverPort; - return this; - } - - public Integer getRequestTimeout() { - return requestTimeout; - } - - public ClusterClientConfig setRequestTimeout(Integer requestTimeout) { - this.requestTimeout = requestTimeout; - return this; - } - - public Integer getConnectTimeout() { - return connectTimeout; - } - - public ClusterClientConfig setConnectTimeout(Integer connectTimeout) { - this.connectTimeout = connectTimeout; - return this; - } - - @Override - public String toString() { - return "ClusterClientConfig{" + "serverHost='" + serverHost + '\'' + ", serverPort=" + serverPort - + ", requestTimeout=" + requestTimeout + ", connectTimeout=" + connectTimeout + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java deleted file mode 100644 index 578266d2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerFlowConfig.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.config; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ServerFlowConfig { - - public static final double DEFAULT_EXCEED_COUNT = 1.0d; - - public static final double DEFAULT_MAX_OCCUPY_RATIO = 1.0d; - - public static final int DEFAULT_INTERVAL_MS = 1000; - - public static final int DEFAULT_SAMPLE_COUNT = 10; - - public static final double DEFAULT_MAX_ALLOWED_QPS = 30000; - - private final String namespace; - - private Double exceedCount = DEFAULT_EXCEED_COUNT; - - private Double maxOccupyRatio = DEFAULT_MAX_OCCUPY_RATIO; - - private Integer intervalMs = DEFAULT_INTERVAL_MS; - - private Integer sampleCount = DEFAULT_SAMPLE_COUNT; - - private Double maxAllowedQps = DEFAULT_MAX_ALLOWED_QPS; - - public ServerFlowConfig() { - this("default"); - } - - public ServerFlowConfig(String namespace) { - this.namespace = namespace; - } - - public String getNamespace() { - return namespace; - } - - public Double getExceedCount() { - return exceedCount; - } - - public ServerFlowConfig setExceedCount(Double exceedCount) { - this.exceedCount = exceedCount; - return this; - } - - public Double getMaxOccupyRatio() { - return maxOccupyRatio; - } - - public ServerFlowConfig setMaxOccupyRatio(Double maxOccupyRatio) { - this.maxOccupyRatio = maxOccupyRatio; - return this; - } - - public Integer getIntervalMs() { - return intervalMs; - } - - public ServerFlowConfig setIntervalMs(Integer intervalMs) { - this.intervalMs = intervalMs; - return this; - } - - public Integer getSampleCount() { - return sampleCount; - } - - public ServerFlowConfig setSampleCount(Integer sampleCount) { - this.sampleCount = sampleCount; - return this; - } - - public Double getMaxAllowedQps() { - return maxAllowedQps; - } - - public ServerFlowConfig setMaxAllowedQps(Double maxAllowedQps) { - this.maxAllowedQps = maxAllowedQps; - return this; - } - - @Override - public String toString() { - return "ServerFlowConfig{" + "namespace='" + namespace + '\'' + ", exceedCount=" + exceedCount - + ", maxOccupyRatio=" + maxOccupyRatio + ", intervalMs=" + intervalMs + ", sampleCount=" + sampleCount - + ", maxAllowedQps=" + maxAllowedQps + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java deleted file mode 100644 index 76891ab7..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/config/ServerTransportConfig.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.config; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ServerTransportConfig { - - public static final int DEFAULT_PORT = 18730; - - public static final int DEFAULT_IDLE_SECONDS = 600; - - private Integer port; - - private Integer idleSeconds; - - public ServerTransportConfig() { - this(DEFAULT_PORT, DEFAULT_IDLE_SECONDS); - } - - public ServerTransportConfig(Integer port, Integer idleSeconds) { - this.port = port; - this.idleSeconds = idleSeconds; - } - - public Integer getPort() { - return port; - } - - public ServerTransportConfig setPort(Integer port) { - this.port = port; - return this; - } - - public Integer getIdleSeconds() { - return idleSeconds; - } - - public ServerTransportConfig setIdleSeconds(Integer idleSeconds) { - this.idleSeconds = idleSeconds; - return this; - } - - @Override - public String toString() { - return "ServerTransportConfig{" + "port=" + port + ", idleSeconds=" + idleSeconds + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java deleted file mode 100644 index 23c78c97..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterAppAssignMap.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.request; - -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterAppAssignMap { - - private String machineId; - - private String ip; - - private Integer port; - - private Boolean belongToApp; - - private Set clientSet; - - private Set namespaceSet; - - private Double maxAllowedQps; - - public String getMachineId() { - return machineId; - } - - public ClusterAppAssignMap setMachineId(String machineId) { - this.machineId = machineId; - return this; - } - - public String getIp() { - return ip; - } - - public ClusterAppAssignMap setIp(String ip) { - this.ip = ip; - return this; - } - - public Integer getPort() { - return port; - } - - public ClusterAppAssignMap setPort(Integer port) { - this.port = port; - return this; - } - - public Set getClientSet() { - return clientSet; - } - - public ClusterAppAssignMap setClientSet(Set clientSet) { - this.clientSet = clientSet; - return this; - } - - public Set getNamespaceSet() { - return namespaceSet; - } - - public ClusterAppAssignMap setNamespaceSet(Set namespaceSet) { - this.namespaceSet = namespaceSet; - return this; - } - - public Boolean getBelongToApp() { - return belongToApp; - } - - public ClusterAppAssignMap setBelongToApp(Boolean belongToApp) { - this.belongToApp = belongToApp; - return this; - } - - public Double getMaxAllowedQps() { - return maxAllowedQps; - } - - public ClusterAppAssignMap setMaxAllowedQps(Double maxAllowedQps) { - this.maxAllowedQps = maxAllowedQps; - return this; - } - - @Override - public String toString() { - return "ClusterAppAssignMap{" + "machineId='" + machineId + '\'' + ", ip='" + ip + '\'' + ", port=" + port - + ", belongToApp=" + belongToApp + ", clientSet=" + clientSet + ", namespaceSet=" + namespaceSet - + ", maxAllowedQps=" + maxAllowedQps + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java deleted file mode 100644 index 9a7608ae..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterClientModifyRequest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.request; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterClientModifyRequest implements ClusterModifyRequest { - - private String app; - - private String ip; - - private Integer port; - - private Integer mode; - - private ClusterClientConfig clientConfig; - - @Override - public String getApp() { - return app; - } - - public ClusterClientModifyRequest setApp(String app) { - this.app = app; - return this; - } - - @Override - public String getIp() { - return ip; - } - - public ClusterClientModifyRequest setIp(String ip) { - this.ip = ip; - return this; - } - - @Override - public Integer getPort() { - return port; - } - - public ClusterClientModifyRequest setPort(Integer port) { - this.port = port; - return this; - } - - @Override - public Integer getMode() { - return mode; - } - - public ClusterClientModifyRequest setMode(Integer mode) { - this.mode = mode; - return this; - } - - public ClusterClientConfig getClientConfig() { - return clientConfig; - } - - public ClusterClientModifyRequest setClientConfig(ClusterClientConfig clientConfig) { - this.clientConfig = clientConfig; - return this; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java deleted file mode 100644 index e0d48e6b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterModifyRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.request; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public interface ClusterModifyRequest { - - String getApp(); - - String getIp(); - - Integer getPort(); - - Integer getMode(); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java deleted file mode 100644 index 02c96c27..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/request/ClusterServerModifyRequest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.request; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig; - -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterServerModifyRequest implements ClusterModifyRequest { - - private String app; - - private String ip; - - private Integer port; - - private Integer mode; - - private ServerFlowConfig flowConfig; - - private ServerTransportConfig transportConfig; - - private Set namespaceSet; - - @Override - public String getApp() { - return app; - } - - public ClusterServerModifyRequest setApp(String app) { - this.app = app; - return this; - } - - @Override - public String getIp() { - return ip; - } - - public ClusterServerModifyRequest setIp(String ip) { - this.ip = ip; - return this; - } - - @Override - public Integer getPort() { - return port; - } - - public ClusterServerModifyRequest setPort(Integer port) { - this.port = port; - return this; - } - - @Override - public Integer getMode() { - return mode; - } - - public ClusterServerModifyRequest setMode(Integer mode) { - this.mode = mode; - return this; - } - - public ServerFlowConfig getFlowConfig() { - return flowConfig; - } - - public ClusterServerModifyRequest setFlowConfig(ServerFlowConfig flowConfig) { - this.flowConfig = flowConfig; - return this; - } - - public ServerTransportConfig getTransportConfig() { - return transportConfig; - } - - public ClusterServerModifyRequest setTransportConfig(ServerTransportConfig transportConfig) { - this.transportConfig = transportConfig; - return this; - } - - public Set getNamespaceSet() { - return namespaceSet; - } - - public ClusterServerModifyRequest setNamespaceSet(Set namespaceSet) { - this.namespaceSet = namespaceSet; - return this; - } - - @Override - public String toString() { - return "ClusterServerModifyRequest{" + "app='" + app + '\'' + ", ip='" + ip + '\'' + ", port=" + port - + ", mode=" + mode + ", flowConfig=" + flowConfig + ", transportConfig=" + transportConfig - + ", namespaceSet=" + namespaceSet + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java deleted file mode 100644 index 19daa986..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterClientStateWrapVO.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class AppClusterClientStateWrapVO { - - /** - * {ip}@{transport_command_port}. - */ - private String id; - - private Integer commandPort; - - private String ip; - - private ClusterClientStateVO state; - - public String getId() { - return id; - } - - public AppClusterClientStateWrapVO setId(String id) { - this.id = id; - return this; - } - - public String getIp() { - return ip; - } - - public AppClusterClientStateWrapVO setIp(String ip) { - this.ip = ip; - return this; - } - - public ClusterClientStateVO getState() { - return state; - } - - public AppClusterClientStateWrapVO setState(ClusterClientStateVO state) { - this.state = state; - return this; - } - - public Integer getCommandPort() { - return commandPort; - } - - public AppClusterClientStateWrapVO setCommandPort(Integer commandPort) { - this.commandPort = commandPort; - return this; - } - - @Override - public String toString() { - return "AppClusterClientStateWrapVO{" + "id='" + id + '\'' + ", commandPort=" + commandPort + ", ip='" + ip - + '\'' + ", state=" + state + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java deleted file mode 100644 index 4f3bbb41..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/AppClusterServerStateWrapVO.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class AppClusterServerStateWrapVO { - - /** - * {ip}@{transport_command_port}. - */ - private String id; - - private String ip; - - private Integer port; - - private Integer connectedCount; - - private Boolean belongToApp; - - private ClusterServerStateVO state; - - public String getId() { - return id; - } - - public AppClusterServerStateWrapVO setId(String id) { - this.id = id; - return this; - } - - public String getIp() { - return ip; - } - - public AppClusterServerStateWrapVO setIp(String ip) { - this.ip = ip; - return this; - } - - public Integer getPort() { - return port; - } - - public AppClusterServerStateWrapVO setPort(Integer port) { - this.port = port; - return this; - } - - public Boolean getBelongToApp() { - return belongToApp; - } - - public AppClusterServerStateWrapVO setBelongToApp(Boolean belongToApp) { - this.belongToApp = belongToApp; - return this; - } - - public Integer getConnectedCount() { - return connectedCount; - } - - public AppClusterServerStateWrapVO setConnectedCount(Integer connectedCount) { - this.connectedCount = connectedCount; - return this; - } - - public ClusterServerStateVO getState() { - return state; - } - - public AppClusterServerStateWrapVO setState(ClusterServerStateVO state) { - this.state = state; - return this; - } - - @Override - public String toString() { - return "AppClusterServerStateWrapVO{" + "id='" + id + '\'' + ", ip='" + ip + '\'' + ", port='" + port + '\'' - + ", belongToApp=" + belongToApp + ", state=" + state + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java deleted file mode 100644 index fd2df5f4..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterClientStateVO.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterClientInfoVO; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterClientStateVO { - - /** - * Cluster token client state. - */ - private ClusterClientInfoVO clientConfig; - - public ClusterClientInfoVO getClientConfig() { - return clientConfig; - } - - public ClusterClientStateVO setClientConfig(ClusterClientInfoVO clientConfig) { - this.clientConfig = clientConfig; - return this; - } - - @Override - public String toString() { - return "ClusterClientStateVO{" + "clientConfig=" + clientConfig + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java deleted file mode 100644 index aaf10dc5..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterRequestLimitVO.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterRequestLimitVO { - - private String namespace; - - private Double currentQps; - - private Double maxAllowedQps; - - public String getNamespace() { - return namespace; - } - - public ClusterRequestLimitVO setNamespace(String namespace) { - this.namespace = namespace; - return this; - } - - public Double getCurrentQps() { - return currentQps; - } - - public ClusterRequestLimitVO setCurrentQps(Double currentQps) { - this.currentQps = currentQps; - return this; - } - - public Double getMaxAllowedQps() { - return maxAllowedQps; - } - - public ClusterRequestLimitVO setMaxAllowedQps(Double maxAllowedQps) { - this.maxAllowedQps = maxAllowedQps; - return this; - } - - @Override - public String toString() { - return "ClusterRequestLimitVO{" + "namespace='" + namespace + '\'' + ", currentQps=" + currentQps - + ", maxAllowedQps=" + maxAllowedQps + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java deleted file mode 100644 index dbd61607..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterServerStateVO.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ConnectionGroupVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig; - -import java.util.List; -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterServerStateVO { - - private String appName; - - private ServerTransportConfig transport; - - private ServerFlowConfig flow; - - private Set namespaceSet; - - private Integer port; - - private List connection; - - private List requestLimitData; - - private Boolean embedded; - - public String getAppName() { - return appName; - } - - public ClusterServerStateVO setAppName(String appName) { - this.appName = appName; - return this; - } - - public ServerTransportConfig getTransport() { - return transport; - } - - public ClusterServerStateVO setTransport(ServerTransportConfig transport) { - this.transport = transport; - return this; - } - - public ServerFlowConfig getFlow() { - return flow; - } - - public ClusterServerStateVO setFlow(ServerFlowConfig flow) { - this.flow = flow; - return this; - } - - public Set getNamespaceSet() { - return namespaceSet; - } - - public ClusterServerStateVO setNamespaceSet(Set namespaceSet) { - this.namespaceSet = namespaceSet; - return this; - } - - public Integer getPort() { - return port; - } - - public ClusterServerStateVO setPort(Integer port) { - this.port = port; - return this; - } - - public List getConnection() { - return connection; - } - - public ClusterServerStateVO setConnection(List connection) { - this.connection = connection; - return this; - } - - public List getRequestLimitData() { - return requestLimitData; - } - - public ClusterServerStateVO setRequestLimitData(List requestLimitData) { - this.requestLimitData = requestLimitData; - return this; - } - - public Boolean getEmbedded() { - return embedded; - } - - public ClusterServerStateVO setEmbedded(Boolean embedded) { - this.embedded = embedded; - return this; - } - - @Override - public String toString() { - return "ClusterServerStateVO{" + "appName='" + appName + '\'' + ", transport=" + transport + ", flow=" + flow - + ", namespaceSet=" + namespaceSet + ", port=" + port + ", connection=" + connection - + ", requestLimitData=" + requestLimitData + ", embedded=" + embedded + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java deleted file mode 100644 index d0b28523..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterStateSimpleEntity.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterStateSimpleEntity { - - private Integer mode; - - private Long lastModified; - - private Boolean clientAvailable; - - private Boolean serverAvailable; - - public Integer getMode() { - return mode; - } - - public ClusterStateSimpleEntity setMode(Integer mode) { - this.mode = mode; - return this; - } - - public Long getLastModified() { - return lastModified; - } - - public ClusterStateSimpleEntity setLastModified(Long lastModified) { - this.lastModified = lastModified; - return this; - } - - public Boolean getClientAvailable() { - return clientAvailable; - } - - public ClusterStateSimpleEntity setClientAvailable(Boolean clientAvailable) { - this.clientAvailable = clientAvailable; - return this; - } - - public Boolean getServerAvailable() { - return serverAvailable; - } - - public ClusterStateSimpleEntity setServerAvailable(Boolean serverAvailable) { - this.serverAvailable = serverAvailable; - return this; - } - - @Override - public String toString() { - return "ClusterStateSimpleEntity{" + "mode=" + mode + ", lastModified=" + lastModified + ", clientAvailable=" - + clientAvailable + ", serverAvailable=" + serverAvailable + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java deleted file mode 100644 index 73af2841..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStatePairVO.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public class ClusterUniversalStatePairVO { - - private String ip; - - private Integer commandPort; - - private ClusterUniversalStateVO state; - - public ClusterUniversalStatePairVO() { - } - - public ClusterUniversalStatePairVO(String ip, Integer commandPort, ClusterUniversalStateVO state) { - this.ip = ip; - this.commandPort = commandPort; - this.state = state; - } - - public String getIp() { - return ip; - } - - public ClusterUniversalStatePairVO setIp(String ip) { - this.ip = ip; - return this; - } - - public Integer getCommandPort() { - return commandPort; - } - - public ClusterUniversalStatePairVO setCommandPort(Integer commandPort) { - this.commandPort = commandPort; - return this; - } - - public ClusterUniversalStateVO getState() { - return state; - } - - public ClusterUniversalStatePairVO setState(ClusterUniversalStateVO state) { - this.state = state; - return this; - } - - @Override - public String toString() { - return "ClusterUniversalStatePairVO{" + "ip='" + ip + '\'' + ", commandPort=" + commandPort + ", state=" + state - + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java deleted file mode 100644 index 75ef4e3c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/cluster/state/ClusterUniversalStateVO.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.cluster.state; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public class ClusterUniversalStateVO { - - private ClusterStateSimpleEntity stateInfo; - - private ClusterClientStateVO client; - - private ClusterServerStateVO server; - - public ClusterClientStateVO getClient() { - return client; - } - - public ClusterUniversalStateVO setClient(ClusterClientStateVO client) { - this.client = client; - return this; - } - - public ClusterServerStateVO getServer() { - return server; - } - - public ClusterUniversalStateVO setServer(ClusterServerStateVO server) { - this.server = server; - return this; - } - - public ClusterStateSimpleEntity getStateInfo() { - return stateInfo; - } - - public ClusterUniversalStateVO setStateInfo(ClusterStateSimpleEntity stateInfo) { - this.stateInfo = stateInfo; - return this; - } - - @Override - public String toString() { - return "ClusterUniversalStateVO{" + "stateInfo=" + stateInfo + ", client=" + client + ", server=" + server - + '}'; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java deleted file mode 100644 index 65a7fd95..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MachineInfoVo.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo; - -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author leyou - */ -public class MachineInfoVo { - - private String app; - - private String hostname; - - private String ip; - - private int port; - - private long heartbeatVersion; - - private long lastHeartbeat; - - private boolean healthy; - - private String version; - - public static List fromMachineInfoList(List machines) { - List list = new ArrayList<>(); - for (MachineInfo machine : machines) { - list.add(fromMachineInfo(machine)); - } - return list; - } - - public static MachineInfoVo fromMachineInfo(MachineInfo machine) { - MachineInfoVo vo = new MachineInfoVo(); - vo.setApp(machine.getApp()); - vo.setHostname(machine.getHostname()); - vo.setIp(machine.getIp()); - vo.setPort(machine.getPort()); - vo.setLastHeartbeat(machine.getLastHeartbeat()); - vo.setHeartbeatVersion(machine.getHeartbeatVersion()); - vo.setVersion(machine.getVersion()); - vo.setHealthy(machine.isHealthy()); - return vo; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public long getLastHeartbeat() { - return lastHeartbeat; - } - - public void setLastHeartbeat(long lastHeartbeat) { - this.lastHeartbeat = lastHeartbeat; - } - - public void setHeartbeatVersion(long heartbeatVersion) { - this.heartbeatVersion = heartbeatVersion; - } - - public long getHeartbeatVersion() { - return heartbeatVersion; - } - - public String getVersion() { - return version; - } - - public MachineInfoVo setVersion(String version) { - this.version = version; - return this; - } - - public boolean isHealthy() { - return healthy; - } - - public void setHealthy(boolean healthy) { - this.healthy = healthy; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java deleted file mode 100644 index cdd5040e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/MetricVo.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * @author leyou - */ -public class MetricVo implements Comparable { - - private Long id; - - private String app; - - private Long timestamp; - - private Long gmtCreate = System.currentTimeMillis(); - - private String resource; - - private Long passQps; - - private Long blockQps; - - private Long successQps; - - private Long exceptionQps; - - /** - * average rt - */ - private Double rt; - - private Integer count; - - public MetricVo() { - } - - public static List fromMetricEntities(Collection entities) { - List list = new ArrayList<>(); - if (entities != null) { - for (MetricEntity entity : entities) { - list.add(fromMetricEntity(entity)); - } - } - return list; - } - - /** - * 保留资源名为identity的结果。 - * @param entities 通过hashCode查找到的MetricEntities - * @param identity 真正需要查找的资源名 - * @return - */ - public static List fromMetricEntities(Collection entities, String identity) { - List list = new ArrayList<>(); - if (entities != null) { - for (MetricEntity entity : entities) { - if (entity.getResource().equals(identity)) { - list.add(fromMetricEntity(entity)); - } - } - } - return list; - } - - public static MetricVo fromMetricEntity(MetricEntity entity) { - MetricVo vo = new MetricVo(); - vo.id = entity.getId(); - vo.app = entity.getApp(); - vo.timestamp = entity.getTimestamp().getTime(); - vo.gmtCreate = entity.getGmtCreate().getTime(); - vo.resource = entity.getResource(); - vo.passQps = entity.getPassQps(); - vo.blockQps = entity.getBlockQps(); - vo.successQps = entity.getSuccessQps(); - vo.exceptionQps = entity.getExceptionQps(); - if (entity.getSuccessQps() != 0) { - vo.rt = entity.getRt() / entity.getSuccessQps(); - } - else { - vo.rt = 0D; - } - vo.count = entity.getCount(); - return vo; - } - - public static MetricVo parse(String line) { - String[] strs = line.split("\\|"); - long timestamp = Long.parseLong(strs[0]); - String identity = strs[1]; - long passQps = Long.parseLong(strs[2]); - long blockQps = Long.parseLong(strs[3]); - long exception = Long.parseLong(strs[4]); - double rt = Double.parseDouble(strs[5]); - long successQps = Long.parseLong(strs[6]); - MetricVo vo = new MetricVo(); - vo.timestamp = timestamp; - vo.resource = identity; - vo.passQps = passQps; - vo.blockQps = blockQps; - vo.successQps = successQps; - vo.exceptionQps = exception; - vo.rt = rt; - vo.count = 1; - return vo; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Long getTimestamp() { - return timestamp; - } - - public void setTimestamp(Long timestamp) { - this.timestamp = timestamp; - } - - public Long getGmtCreate() { - return gmtCreate; - } - - public void setGmtCreate(Long gmtCreate) { - this.gmtCreate = gmtCreate; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public Long getPassQps() { - return passQps; - } - - public void setPassQps(Long passQps) { - this.passQps = passQps; - } - - public Long getBlockQps() { - return blockQps; - } - - public void setBlockQps(Long blockQps) { - this.blockQps = blockQps; - } - - public Long getSuccessQps() { - return successQps; - } - - public void setSuccessQps(Long successQps) { - this.successQps = successQps; - } - - public Long getExceptionQps() { - return exceptionQps; - } - - public void setExceptionQps(Long exceptionQps) { - this.exceptionQps = exceptionQps; - } - - public Double getRt() { - return rt; - } - - public void setRt(Double rt) { - this.rt = rt; - } - - public Integer getCount() { - return count; - } - - public void setCount(Integer count) { - this.count = count; - } - - @Override - public int compareTo(MetricVo o) { - return Long.compare(this.timestamp, o.timestamp); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java deleted file mode 100644 index 4fd4c2c0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/ResourceVo.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo; - -import com.alibaba.csp.sentinel.command.vo.NodeVo; -import com.alibaba.csp.sentinel.dashboard.domain.ResourceTreeNode; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author leyou - */ -public class ResourceVo { - - private String parentTtId; - - private String ttId; - - private String resource; - - private Integer threadNum; - - private Long passQps; - - private Long blockQps; - - private Long totalQps; - - private Long averageRt; - - private Long passRequestQps; - - private Long exceptionQps; - - private Long oneMinutePass; - - private Long oneMinuteBlock; - - private Long oneMinuteException; - - private Long oneMinuteTotal; - - private boolean visible = true; - - public ResourceVo() { - } - - public static List fromNodeVoList(List nodeVos) { - if (nodeVos == null) { - return null; - } - List list = new ArrayList<>(); - for (NodeVo nodeVo : nodeVos) { - ResourceVo vo = new ResourceVo(); - vo.parentTtId = nodeVo.getParentId(); - vo.ttId = nodeVo.getId(); - vo.resource = nodeVo.getResource(); - vo.threadNum = nodeVo.getThreadNum(); - vo.passQps = nodeVo.getPassQps(); - vo.blockQps = nodeVo.getBlockQps(); - vo.totalQps = nodeVo.getTotalQps(); - vo.averageRt = nodeVo.getAverageRt(); - vo.exceptionQps = nodeVo.getExceptionQps(); - vo.oneMinutePass = nodeVo.getOneMinutePass(); - vo.oneMinuteBlock = nodeVo.getOneMinuteBlock(); - vo.oneMinuteException = nodeVo.getOneMinuteException(); - vo.oneMinuteTotal = nodeVo.getOneMinuteTotal(); - list.add(vo); - } - return list; - } - - public static List fromResourceTreeNode(ResourceTreeNode root) { - if (root == null) { - return null; - } - List list = new ArrayList<>(); - visit(root, list, false, true); - // if(!list.isEmpty()){ - // list.remove(0); - // } - return list; - } - - /** - * This node is visible when this.visible==true or one of this's parents is visible, - * root node is always invisible. - */ - private static void visit(ResourceTreeNode node, List list, boolean parentVisible, boolean isRoot) { - boolean visible = !isRoot && (node.isVisible() || parentVisible); - // boolean visible = node.isVisible(); - if (visible) { - ResourceVo vo = new ResourceVo(); - vo.parentTtId = node.getParentId(); - vo.ttId = node.getId(); - vo.resource = node.getResource(); - vo.threadNum = node.getThreadNum(); - vo.passQps = node.getPassQps(); - vo.blockQps = node.getBlockQps(); - vo.totalQps = node.getTotalQps(); - vo.averageRt = node.getAverageRt(); - vo.exceptionQps = node.getExceptionQps(); - vo.oneMinutePass = node.getOneMinutePass(); - vo.oneMinuteBlock = node.getOneMinuteBlock(); - vo.oneMinuteException = node.getOneMinuteException(); - vo.oneMinuteTotal = node.getOneMinuteTotal(); - vo.visible = node.isVisible(); - list.add(vo); - } - for (ResourceTreeNode c : node.getChildren()) { - visit(c, list, visible, false); - } - } - - public String getParentTtId() { - return parentTtId; - } - - public void setParentTtId(String parentTtId) { - this.parentTtId = parentTtId; - } - - public String getTtId() { - return ttId; - } - - public void setTtId(String ttId) { - this.ttId = ttId; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public Integer getThreadNum() { - return threadNum; - } - - public void setThreadNum(Integer threadNum) { - this.threadNum = threadNum; - } - - public Long getPassQps() { - return passQps; - } - - public void setPassQps(Long passQps) { - this.passQps = passQps; - } - - public Long getBlockQps() { - return blockQps; - } - - public void setBlockQps(Long blockQps) { - this.blockQps = blockQps; - } - - public Long getTotalQps() { - return totalQps; - } - - public void setTotalQps(Long totalQps) { - this.totalQps = totalQps; - } - - public Long getAverageRt() { - return averageRt; - } - - public void setAverageRt(Long averageRt) { - this.averageRt = averageRt; - } - - public Long getPassRequestQps() { - return passRequestQps; - } - - public void setPassRequestQps(Long passRequestQps) { - this.passRequestQps = passRequestQps; - } - - public Long getExceptionQps() { - return exceptionQps; - } - - public void setExceptionQps(Long exceptionQps) { - this.exceptionQps = exceptionQps; - } - - public Long getOneMinuteException() { - return oneMinuteException; - } - - public void setOneMinuteException(Long oneMinuteException) { - this.oneMinuteException = oneMinuteException; - } - - public Long getOneMinutePass() { - return oneMinutePass; - } - - public void setOneMinutePass(Long oneMinutePass) { - this.oneMinutePass = oneMinutePass; - } - - public Long getOneMinuteBlock() { - return oneMinuteBlock; - } - - public void setOneMinuteBlock(Long oneMinuteBlock) { - this.oneMinuteBlock = oneMinuteBlock; - } - - public Long getOneMinuteTotal() { - return oneMinuteTotal; - } - - public void setOneMinuteTotal(Long oneMinuteTotal) { - this.oneMinuteTotal = oneMinuteTotal; - } - - public boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java deleted file mode 100644 index 22888f73..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/AddApiReqVo.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api; - -import java.util.List; - -/** - * Value Object for add gateway api. - * - * @author cdfive - * @since 1.7.0 - */ -public class AddApiReqVo { - - private String app; - - private String ip; - - private Integer port; - - private String apiName; - - private List predicateItems; - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - public String getApiName() { - return apiName; - } - - public void setApiName(String apiName) { - this.apiName = apiName; - } - - public List getPredicateItems() { - return predicateItems; - } - - public void setPredicateItems(List predicateItems) { - this.predicateItems = predicateItems; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java deleted file mode 100644 index 52300d95..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/ApiPredicateItemVo.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api; - -/** - * Value Object for add or update gateway api. - * - * @author cdfive - * @since 1.7.0 - */ -public class ApiPredicateItemVo { - - /** - * The pattern for matching url. - */ - private String pattern; - - /** - * The matching Strategy in url. Constants are defined in class - * SentinelGatewayConstants.\ - * - *
    - *
  • 0(URL_MATCH_STRATEGY_EXACT): exact match mode
  • - *
  • 1(URL_MATCH_STRATEGY_PREFIX): prefix match mode
  • - *
  • 2(URL_MATCH_STRATEGY_REGEX): regex match mode
  • - *
- */ - private Integer matchStrategy; - - public String getPattern() { - return pattern; - } - - public void setPattern(String pattern) { - this.pattern = pattern; - } - - public Integer getMatchStrategy() { - return matchStrategy; - } - - public void setMatchStrategy(Integer matchStrategy) { - this.matchStrategy = matchStrategy; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java deleted file mode 100644 index f41e329c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/api/UpdateApiReqVo.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api; - -import java.util.List; - -/** - * Value Object for update gateway api. - * - * @author cdfive - * @since 1.7.0 - */ -public class UpdateApiReqVo { - - private Long id; - - private String app; - - private List predicateItems; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public List getPredicateItems() { - return predicateItems; - } - - public void setPredicateItems(List predicateItems) { - this.predicateItems = predicateItems; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java deleted file mode 100644 index 08ac0c65..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/AddFlowRuleReqVo.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule; - -/** - * Value Object for add gateway flow rule. - * - * @author cdfive - * @since 1.7.0 - */ -public class AddFlowRuleReqVo { - - private String app; - - private String ip; - - private Integer port; - - private String resource; - - private Integer resourceMode; - - private Integer grade; - - private Double count; - - private Long interval; - - private Integer intervalUnit; - - private Integer controlBehavior; - - private Integer burst; - - private Integer maxQueueingTimeoutMs; - - private GatewayParamFlowItemVo paramItem; - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - public String getResource() { - return resource; - } - - public void setResource(String resource) { - this.resource = resource; - } - - public Integer getResourceMode() { - return resourceMode; - } - - public void setResourceMode(Integer resourceMode) { - this.resourceMode = resourceMode; - } - - public Integer getGrade() { - return grade; - } - - public void setGrade(Integer grade) { - this.grade = grade; - } - - public Double getCount() { - return count; - } - - public void setCount(Double count) { - this.count = count; - } - - public Long getInterval() { - return interval; - } - - public void setInterval(Long interval) { - this.interval = interval; - } - - public Integer getIntervalUnit() { - return intervalUnit; - } - - public void setIntervalUnit(Integer intervalUnit) { - this.intervalUnit = intervalUnit; - } - - public Integer getControlBehavior() { - return controlBehavior; - } - - public void setControlBehavior(Integer controlBehavior) { - this.controlBehavior = controlBehavior; - } - - public Integer getBurst() { - return burst; - } - - public void setBurst(Integer burst) { - this.burst = burst; - } - - public Integer getMaxQueueingTimeoutMs() { - return maxQueueingTimeoutMs; - } - - public void setMaxQueueingTimeoutMs(Integer maxQueueingTimeoutMs) { - this.maxQueueingTimeoutMs = maxQueueingTimeoutMs; - } - - public GatewayParamFlowItemVo getParamItem() { - return paramItem; - } - - public void setParamItem(GatewayParamFlowItemVo paramItem) { - this.paramItem = paramItem; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java deleted file mode 100644 index 07c5a91a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/GatewayParamFlowItemVo.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule; - -/** - * Value Object for add or update gateway flow rule. - * - * @author cdfive - * @since 1.7.0 - */ -public class GatewayParamFlowItemVo { - - private Integer parseStrategy; - - private String fieldName; - - private String pattern; - - private Integer matchStrategy; - - public Integer getParseStrategy() { - return parseStrategy; - } - - public void setParseStrategy(Integer parseStrategy) { - this.parseStrategy = parseStrategy; - } - - public String getFieldName() { - return fieldName; - } - - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - - public String getPattern() { - return pattern; - } - - public void setPattern(String pattern) { - this.pattern = pattern; - } - - public Integer getMatchStrategy() { - return matchStrategy; - } - - public void setMatchStrategy(Integer matchStrategy) { - this.matchStrategy = matchStrategy; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java deleted file mode 100644 index ebc7b10a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/domain/vo/gateway/rule/UpdateFlowRuleReqVo.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule; - -/** - * Value Object for update gateway flow rule. - * - * @author cdfive - * @since 1.7.0 - */ -public class UpdateFlowRuleReqVo { - - private Long id; - - private String app; - - private Integer grade; - - private Double count; - - private Long interval; - - private Integer intervalUnit; - - private Integer controlBehavior; - - private Integer burst; - - private Integer maxQueueingTimeoutMs; - - private GatewayParamFlowItemVo paramItem; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getApp() { - return app; - } - - public void setApp(String app) { - this.app = app; - } - - public Integer getGrade() { - return grade; - } - - public void setGrade(Integer grade) { - this.grade = grade; - } - - public Double getCount() { - return count; - } - - public void setCount(Double count) { - this.count = count; - } - - public Long getInterval() { - return interval; - } - - public void setInterval(Long interval) { - this.interval = interval; - } - - public Integer getIntervalUnit() { - return intervalUnit; - } - - public void setIntervalUnit(Integer intervalUnit) { - this.intervalUnit = intervalUnit; - } - - public Integer getControlBehavior() { - return controlBehavior; - } - - public void setControlBehavior(Integer controlBehavior) { - this.controlBehavior = controlBehavior; - } - - public Integer getBurst() { - return burst; - } - - public void setBurst(Integer burst) { - this.burst = burst; - } - - public Integer getMaxQueueingTimeoutMs() { - return maxQueueingTimeoutMs; - } - - public void setMaxQueueingTimeoutMs(Integer maxQueueingTimeoutMs) { - this.maxQueueingTimeoutMs = maxQueueingTimeoutMs; - } - - public GatewayParamFlowItemVo getParamItem() { - return paramItem; - } - - public void setParamItem(GatewayParamFlowItemVo paramItem) { - this.paramItem = paramItem; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java deleted file mode 100644 index 2b4cc788..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.metric; - -import com.alibaba.csp.sentinel.Constants; -import com.alibaba.csp.sentinel.concurrent.NamedThreadFactory; -import com.alibaba.csp.sentinel.config.SentinelConfig; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository; -import com.alibaba.csp.sentinel.node.metric.MetricNode; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.concurrent.FutureCallback; -import org.apache.http.entity.ContentType; -import org.apache.http.impl.client.DefaultRedirectStrategy; -import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; -import org.apache.http.impl.nio.client.HttpAsyncClients; -import org.apache.http.impl.nio.reactor.IOReactorConfig; -import org.apache.http.protocol.HTTP; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.net.ConnectException; -import java.net.SocketTimeoutException; -import java.nio.charset.Charset; -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy; -import java.util.concurrent.atomic.AtomicLong; - -/** - * Fetch metric of machines. - * - * @author leyou - */ -@Component -public class MetricFetcher { - - public static final String NO_METRICS = "No metrics"; - - private static final int HTTP_OK = 200; - - private static final long MAX_LAST_FETCH_INTERVAL_MS = 1000 * 15; - - private static final long FETCH_INTERVAL_SECOND = 6; - - private static final Charset DEFAULT_CHARSET = Charset.forName(SentinelConfig.charset()); - - private final static String METRIC_URL_PATH = "metric"; - - private static Logger logger = LoggerFactory.getLogger(MetricFetcher.class); - - private final long intervalSecond = 1; - - private Map appLastFetchTime = new ConcurrentHashMap<>(); - - @Autowired - private MetricsRepository metricStore; - - @Autowired - private AppManagement appManagement; - - private CloseableHttpAsyncClient httpclient; - - @SuppressWarnings("PMD.ThreadPoolCreationRule") - private ScheduledExecutorService fetchScheduleService = Executors.newScheduledThreadPool(1, - new NamedThreadFactory("sentinel-dashboard-metrics-fetch-task", true)); - - private ExecutorService fetchService; - - private ExecutorService fetchWorker; - - public MetricFetcher() { - int cores = Runtime.getRuntime().availableProcessors() * 2; - long keepAliveTime = 0; - int queueSize = 2048; - RejectedExecutionHandler handler = new DiscardPolicy(); - fetchService = new ThreadPoolExecutor(cores, cores, keepAliveTime, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(queueSize), - new NamedThreadFactory("sentinel-dashboard-metrics-fetchService", true), handler); - fetchWorker = new ThreadPoolExecutor(cores, cores, keepAliveTime, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(queueSize), - new NamedThreadFactory("sentinel-dashboard-metrics-fetchWorker", true), handler); - IOReactorConfig ioConfig = IOReactorConfig.custom() - .setConnectTimeout(3000) - .setSoTimeout(3000) - .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2) - .build(); - - httpclient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() { - @Override - protected boolean isRedirectable(final String method) { - return false; - } - }).setMaxConnTotal(4000).setMaxConnPerRoute(1000).setDefaultIOReactorConfig(ioConfig).build(); - httpclient.start(); - start(); - } - - private void start() { - fetchScheduleService.scheduleAtFixedRate(() -> { - try { - fetchAllApp(); - } - catch (Exception e) { - logger.info("fetchAllApp error:", e); - } - }, 10, intervalSecond, TimeUnit.SECONDS); - } - - private void writeMetric(Map map) { - if (map.isEmpty()) { - return; - } - Date date = new Date(); - for (MetricEntity entity : map.values()) { - entity.setGmtCreate(date); - entity.setGmtModified(date); - } - metricStore.saveAll(map.values()); - } - - /** - * Traverse each APP, and then pull the metric of all machines for that APP. - */ - private void fetchAllApp() { - List apps = appManagement.getAppNames(); - if (apps == null) { - return; - } - for (final String app : apps) { - fetchService.submit(() -> { - try { - doFetchAppMetric(app); - } - catch (Exception e) { - logger.error("fetchAppMetric error", e); - } - }); - } - } - - /** - * fetch metric between [startTime, endTime], both side inclusive - */ - private void fetchOnce(String app, long startTime, long endTime, int maxWaitSeconds) { - if (maxWaitSeconds <= 0) { - throw new IllegalArgumentException("maxWaitSeconds must > 0, but " + maxWaitSeconds); - } - AppInfo appInfo = appManagement.getDetailApp(app); - // auto remove for app - if (appInfo.isDead()) { - logger.info("Dead app removed: {}", app); - appManagement.removeApp(app); - return; - } - Set machines = appInfo.getMachines(); - logger.debug("enter fetchOnce(" + app + "), machines.size()=" + machines.size() + ", time intervalMs [" - + startTime + ", " + endTime + "]"); - if (machines.isEmpty()) { - return; - } - final String msg = "fetch"; - AtomicLong unhealthy = new AtomicLong(); - final AtomicLong success = new AtomicLong(); - final AtomicLong fail = new AtomicLong(); - - long start = System.currentTimeMillis(); - /** app_resource_timeSecond -> metric */ - final Map metricMap = new ConcurrentHashMap<>(16); - final CountDownLatch latch = new CountDownLatch(machines.size()); - for (final MachineInfo machine : machines) { - // auto remove - if (machine.isDead()) { - latch.countDown(); - appManagement.getDetailApp(app).removeMachine(machine.getIp(), machine.getPort()); - logger.info("Dead machine removed: {}:{} of {}", machine.getIp(), machine.getPort(), app); - continue; - } - if (!machine.isHealthy()) { - latch.countDown(); - unhealthy.incrementAndGet(); - continue; - } - final String url = "http://" + machine.getIp() + ":" + machine.getPort() + "/" + METRIC_URL_PATH - + "?startTime=" + startTime + "&endTime=" + endTime + "&refetch=" + false; - final HttpGet httpGet = new HttpGet(url); - httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE); - httpclient.execute(httpGet, new FutureCallback() { - @Override - public void completed(final HttpResponse response) { - try { - handleResponse(response, machine, metricMap); - success.incrementAndGet(); - } - catch (Exception e) { - logger.error(msg + " metric " + url + " error:", e); - } - finally { - latch.countDown(); - } - } - - @Override - public void failed(final Exception ex) { - latch.countDown(); - fail.incrementAndGet(); - httpGet.abort(); - if (ex instanceof SocketTimeoutException) { - logger.error("Failed to fetch metric from <{}>: socket timeout", url); - } - else if (ex instanceof ConnectException) { - logger.error("Failed to fetch metric from <{}> (ConnectionException: {})", url, - ex.getMessage()); - } - else { - logger.error(msg + " metric " + url + " error", ex); - } - } - - @Override - public void cancelled() { - latch.countDown(); - fail.incrementAndGet(); - httpGet.abort(); - } - }); - } - try { - latch.await(maxWaitSeconds, TimeUnit.SECONDS); - } - catch (Exception e) { - logger.info(msg + " metric, wait http client error:", e); - } - // long cost = System.currentTimeMillis() - start; - // logger.info("finished " + msg + " metric for " + app + ", time intervalMs [" + - // startTime + ", " + endTime - // + "], total machines=" + machines.size() + ", dead=" + dead + ", fetch - // success=" - // + success + ", fetch fail=" + fail + ", time cost=" + cost + " ms"); - writeMetric(metricMap); - } - - private void doFetchAppMetric(final String app) { - long now = System.currentTimeMillis(); - long lastFetchMs = now - MAX_LAST_FETCH_INTERVAL_MS; - if (appLastFetchTime.containsKey(app)) { - lastFetchMs = Math.max(lastFetchMs, appLastFetchTime.get(app).get() + 1000); - } - // trim milliseconds - lastFetchMs = lastFetchMs / 1000 * 1000; - long endTime = lastFetchMs + FETCH_INTERVAL_SECOND * 1000; - if (endTime > now - 1000 * 2) { - // too near - return; - } - // update last_fetch in advance. - appLastFetchTime.computeIfAbsent(app, a -> new AtomicLong()).set(endTime); - final long finalLastFetchMs = lastFetchMs; - final long finalEndTime = endTime; - try { - // do real fetch async - fetchWorker.submit(() -> { - try { - fetchOnce(app, finalLastFetchMs, finalEndTime, 5); - } - catch (Exception e) { - logger.info("fetchOnce(" + app + ") error", e); - } - }); - } - catch (Exception e) { - logger.info("submit fetchOnce(" + app + ") fail, intervalMs [" + lastFetchMs + ", " + endTime + "]", e); - } - } - - private void handleResponse(final HttpResponse response, MachineInfo machine, Map metricMap) - throws Exception { - int code = response.getStatusLine().getStatusCode(); - if (code != HTTP_OK) { - return; - } - Charset charset = null; - try { - String contentTypeStr = response.getFirstHeader("Content-type").getValue(); - if (StringUtil.isNotEmpty(contentTypeStr)) { - ContentType contentType = ContentType.parse(contentTypeStr); - charset = contentType.getCharset(); - } - } - catch (Exception ignore) { - } - String body = EntityUtils.toString(response.getEntity(), charset != null ? charset : DEFAULT_CHARSET); - if (StringUtil.isEmpty(body) || body.startsWith(NO_METRICS)) { - // logger.info(machine.getApp() + ":" + machine.getIp() + ":" + - // machine.getPort() + ", bodyStr is empty"); - return; - } - String[] lines = body.split("\n"); - // logger.info(machine.getApp() + ":" + machine.getIp() + ":" + machine.getPort() - // + - // ", bodyStr.length()=" + body.length() + ", lines=" + lines.length); - handleBody(lines, machine, metricMap); - } - - private void handleBody(String[] lines, MachineInfo machine, Map map) { - // logger.info("handleBody() lines=" + lines.length + ", machine=" + machine); - if (lines.length < 1) { - return; - } - - for (String line : lines) { - try { - MetricNode node = MetricNode.fromThinString(line); - if (shouldFilterOut(node.getResource())) { - continue; - } - /* - * aggregation metrics by app_resource_timeSecond, ignore ip and port. - */ - String key = buildMetricKey(machine.getApp(), node.getResource(), node.getTimestamp()); - - MetricEntity metricEntity = map.computeIfAbsent(key, s -> { - MetricEntity initMetricEntity = new MetricEntity(); - initMetricEntity.setApp(machine.getApp()); - initMetricEntity.setTimestamp(new Date(node.getTimestamp())); - initMetricEntity.setPassQps(0L); - initMetricEntity.setBlockQps(0L); - initMetricEntity.setRtAndSuccessQps(0, 0L); - initMetricEntity.setExceptionQps(0L); - initMetricEntity.setCount(0); - initMetricEntity.setResource(node.getResource()); - return initMetricEntity; - }); - metricEntity.addPassQps(node.getPassQps()); - metricEntity.addBlockQps(node.getBlockQps()); - metricEntity.addRtAndSuccessQps(node.getRt(), node.getSuccessQps()); - metricEntity.addExceptionQps(node.getExceptionQps()); - metricEntity.addCount(1); - } - catch (Exception e) { - logger.warn("handleBody line exception, machine: {}, line: {}", machine.toLogString(), line); - } - } - } - - private String buildMetricKey(String app, String resource, long timestamp) { - return app + "__" + resource + "__" + (timestamp / 1000); - } - - private boolean shouldFilterOut(String resource) { - return RES_EXCLUSION_SET.contains(resource); - } - - private static final Set RES_EXCLUSION_SET = new HashSet() { - { - add(Constants.TOTAL_IN_RESOURCE_NAME); - add(Constants.SYSTEM_LOAD_RESOURCE_NAME); - add(Constants.CPU_USAGE_RESOURCE_NAME); - } - }; - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java deleted file mode 100644 index 2e516d85..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemApiDefinitionStore.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.gateway; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; -import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * Store {@link ApiDefinitionEntity} in memory. - * - * @author cdfive - * @since 1.7.0 - */ -@Component -public class InMemApiDefinitionStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java deleted file mode 100644 index a793ef63..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/gateway/InMemGatewayFlowRuleStore.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.gateway; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * Store {@link GatewayFlowRuleEntity} in memory. - * - * @author cdfive - * @since 1.7.0 - */ -@Component -public class InMemGatewayFlowRuleStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java deleted file mode 100644 index 7968851a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.metric; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity; -import com.alibaba.csp.sentinel.util.StringUtil; -import com.alibaba.csp.sentinel.util.TimeUtil; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.stream.Collectors; - -/** - * Caches metrics data in a period of time in memory. - * - * @author Carpenter Lee - * @author Eric Zhao - */ -@Component -public class InMemoryMetricsRepository implements MetricsRepository { - - private static final long MAX_METRIC_LIVE_TIME_MS = 1000 * 60 * 5; - - /** - * {@code app -> resource -> timestamp -> metric} - */ - private Map>> allMetrics = new ConcurrentHashMap<>(); - - private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - - @Override - public void save(MetricEntity entity) { - if (entity == null || StringUtil.isBlank(entity.getApp())) { - return; - } - readWriteLock.writeLock().lock(); - try { - allMetrics.computeIfAbsent(entity.getApp(), e -> new HashMap<>(16)) - .computeIfAbsent(entity.getResource(), e -> new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Entry eldest) { - // Metric older than {@link #MAX_METRIC_LIVE_TIME_MS} will be - // removed. - return eldest.getKey() < TimeUtil.currentTimeMillis() - MAX_METRIC_LIVE_TIME_MS; - } - }) - .put(entity.getTimestamp().getTime(), entity); - } - finally { - readWriteLock.writeLock().unlock(); - } - - } - - @Override - public void saveAll(Iterable metrics) { - if (metrics == null) { - return; - } - readWriteLock.writeLock().lock(); - try { - metrics.forEach(this::save); - } - finally { - readWriteLock.writeLock().unlock(); - } - } - - @Override - public List queryByAppAndResourceBetween(String app, String resource, long startTime, long endTime) { - List results = new ArrayList<>(); - if (StringUtil.isBlank(app)) { - return results; - } - Map> resourceMap = allMetrics.get(app); - if (resourceMap == null) { - return results; - } - LinkedHashMap metricsMap = resourceMap.get(resource); - if (metricsMap == null) { - return results; - } - readWriteLock.readLock().lock(); - try { - for (Entry entry : metricsMap.entrySet()) { - if (entry.getKey() >= startTime && entry.getKey() <= endTime) { - results.add(entry.getValue()); - } - } - return results; - } - finally { - readWriteLock.readLock().unlock(); - } - } - - @Override - public List listResourcesOfApp(String app) { - List results = new ArrayList<>(); - if (StringUtil.isBlank(app)) { - return results; - } - // resource -> timestamp -> metric - Map> resourceMap = allMetrics.get(app); - if (resourceMap == null) { - return results; - } - final long minTimeMs = System.currentTimeMillis() - 1000 * 60; - Map resourceCount = new ConcurrentHashMap<>(32); - - readWriteLock.readLock().lock(); - try { - for (Entry> resourceMetrics : resourceMap.entrySet()) { - for (Entry metrics : resourceMetrics.getValue().entrySet()) { - if (metrics.getKey() < minTimeMs) { - continue; - } - MetricEntity newEntity = metrics.getValue(); - if (resourceCount.containsKey(resourceMetrics.getKey())) { - MetricEntity oldEntity = resourceCount.get(resourceMetrics.getKey()); - oldEntity.addPassQps(newEntity.getPassQps()); - oldEntity.addRtAndSuccessQps(newEntity.getRt(), newEntity.getSuccessQps()); - oldEntity.addBlockQps(newEntity.getBlockQps()); - oldEntity.addExceptionQps(newEntity.getExceptionQps()); - oldEntity.addCount(1); - } - else { - resourceCount.put(resourceMetrics.getKey(), MetricEntity.copyOf(newEntity)); - } - } - } - // Order by last minute b_qps DESC. - return resourceCount.entrySet().stream().sorted((o1, o2) -> { - MetricEntity e1 = o1.getValue(); - MetricEntity e2 = o2.getValue(); - int t = e2.getBlockQps().compareTo(e1.getBlockQps()); - if (t != 0) { - return t; - } - return e2.getPassQps().compareTo(e1.getPassQps()); - }).map(Entry::getKey).collect(Collectors.toList()); - } - finally { - readWriteLock.readLock().unlock(); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java deleted file mode 100644 index 6676145b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/MetricsRepository.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.metric; - -import java.util.List; - -/** - * Repository interface for aggregated metrics data. - * - * @param type of metrics - * @author Eric Zhao - */ -public interface MetricsRepository { - - /** - * Save the metric to the storage repository. - * @param metric metric data to save - */ - void save(T metric); - - /** - * Save all metrics to the storage repository. - * @param metrics metrics to save - */ - void saveAll(Iterable metrics); - - /** - * Get all metrics by {@code appName} and {@code resourceName} between a period of - * time. - * @param app application name for Sentinel - * @param resource resource name - * @param startTime start timestamp - * @param endTime end timestamp - * @return all metrics in query conditions - */ - List queryByAppAndResourceBetween(String app, String resource, long startTime, long endTime); - - /** - * List resource name of provided application name. - * @param app application name - * @return list of resources - */ - List listResourcesOfApp(String app); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java deleted file mode 100644 index 422e0e61..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemAuthorityRuleStore.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * In-memory storage for authority rules. - * - * @author Eric Zhao - * @since 0.2.1 - */ -@Component -public class InMemAuthorityRuleStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java deleted file mode 100644 index 7891924d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemDegradeRuleStore.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * @author leyou - */ -@Component -public class InMemDegradeRuleStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java deleted file mode 100644 index c54fdb2d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemFlowRuleStore.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; -import com.alibaba.csp.sentinel.slots.block.flow.ClusterFlowConfig; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * Store {@link FlowRuleEntity} in memory. - * - * @author leyou - */ -@Component -public class InMemFlowRuleStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - - @Override - protected FlowRuleEntity preProcess(FlowRuleEntity entity) { - if (entity != null && entity.isClusterMode()) { - ClusterFlowConfig config = entity.getClusterConfig(); - if (config == null) { - config = new ClusterFlowConfig(); - entity.setClusterConfig(config); - } - // Set cluster rule id. - config.setFlowId(entity.getId()); - } - return entity; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java deleted file mode 100644 index 6ca20401..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemParamFlowRuleStore.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity; -import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowClusterConfig; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * @author Eric Zhao - * @since 0.2.1 - */ -@Component -public class InMemParamFlowRuleStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - - @Override - protected ParamFlowRuleEntity preProcess(ParamFlowRuleEntity entity) { - if (entity != null && entity.isClusterMode()) { - ParamFlowClusterConfig config = entity.getClusterConfig(); - if (config == null) { - config = new ParamFlowClusterConfig(); - } - // Set cluster rule id. - config.setFlowId(entity.getId()); - } - return entity; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java deleted file mode 100644 index 7a4e9433..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemSystemRuleStore.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * @author leyou - */ -@Component -public class InMemSystemRuleStore extends InMemoryRuleRepositoryAdapter { - - private static AtomicLong ids = new AtomicLong(0); - - @Override - protected long nextId() { - return ids.incrementAndGet(); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java deleted file mode 100644 index d3be5f88..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.util.AssertUtil; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author leyou - */ -public abstract class InMemoryRuleRepositoryAdapter implements RuleRepository { - - /** - * {@code >} - */ - private Map> machineRules = new ConcurrentHashMap<>(16); - - private Map allRules = new ConcurrentHashMap<>(16); - - private Map> appRules = new ConcurrentHashMap<>(16); - - private static final int MAX_RULES_SIZE = 10000; - - @Override - public T save(T entity) { - if (entity.getId() == null) { - entity.setId(nextId()); - } - T processedEntity = preProcess(entity); - if (processedEntity != null) { - allRules.put(processedEntity.getId(), processedEntity); - machineRules - .computeIfAbsent( - MachineInfo.of(processedEntity.getApp(), processedEntity.getIp(), processedEntity.getPort()), - e -> new ConcurrentHashMap<>(32)) - .put(processedEntity.getId(), processedEntity); - appRules.computeIfAbsent(processedEntity.getApp(), v -> new ConcurrentHashMap<>(32)) - .put(processedEntity.getId(), processedEntity); - } - - return processedEntity; - } - - @Override - public List saveAll(List rules) { - // TODO: check here. - allRules.clear(); - machineRules.clear(); - appRules.clear(); - - if (rules == null) { - return null; - } - List savedRules = new ArrayList<>(rules.size()); - for (T rule : rules) { - savedRules.add(save(rule)); - } - return savedRules; - } - - @Override - public T delete(Long id) { - T entity = allRules.remove(id); - if (entity != null) { - if (appRules.get(entity.getApp()) != null) { - appRules.get(entity.getApp()).remove(id); - } - machineRules.get(MachineInfo.of(entity.getApp(), entity.getIp(), entity.getPort())).remove(id); - } - return entity; - } - - @Override - public T findById(Long id) { - return allRules.get(id); - } - - @Override - public List findAllByMachine(MachineInfo machineInfo) { - Map entities = machineRules.get(machineInfo); - if (entities == null) { - return new ArrayList<>(); - } - return new ArrayList<>(entities.values()); - } - - @Override - public List findAllByApp(String appName) { - AssertUtil.notEmpty(appName, "appName cannot be empty"); - Map entities = appRules.get(appName); - if (entities == null) { - return new ArrayList<>(); - } - return new ArrayList<>(entities.values()); - } - - public void clearAll() { - allRules.clear(); - machineRules.clear(); - appRules.clear(); - } - - protected T preProcess(T entity) { - return entity; - } - - /** - * Get next unused id. - * @return next unused id - */ - abstract protected long nextId(); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java deleted file mode 100644 index 26f19d42..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/RuleRepository.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.repository.rule; - -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; - -import java.util.List; - -/** - * Interface to store and find rules. - * - * @author leyou - */ -public interface RuleRepository { - - /** - * Save one. - * @param entity - * @return - */ - T save(T entity); - - /** - * Save all. - * @param rules - * @return rules saved. - */ - List saveAll(List rules); - - /** - * Delete by id - * @param id - * @return entity deleted - */ - T delete(ID id); - - /** - * Find by id. - * @param id - * @return - */ - T findById(ID id); - - /** - * Find all by machine. - * @param machineInfo - * @return - */ - List findAllByMachine(MachineInfo machineInfo); - - /** - * Find all by application. - * @param appName valid app name - * @return all rules of the application - * @since 1.4.0 - */ - List findAllByApp(String appName); - - /// ** - // * Find all by app and enable switch. - // * @param app - // * @param enable - // * @return - // */ - // List findAllByAppAndEnable(String app, boolean enable); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java deleted file mode 100644 index 11544951..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRuleProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.rule; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public interface DynamicRuleProvider { - - T getRules(String appName) throws Exception; - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java deleted file mode 100644 index b49e0dff..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/DynamicRulePublisher.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.rule; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -public interface DynamicRulePublisher { - - /** - * Publish rules to remote rule configuration center for given application name. - * @param app app name - * @param rules list of rules to push - * @throws Exception if some error occurs - */ - void publish(String app, T rules) throws Exception; - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java deleted file mode 100644 index eabafdd2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.rule; - -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Eric Zhao - */ -@Component("flowRuleDefaultProvider") -public class FlowRuleApiProvider implements DynamicRuleProvider> { - - @Autowired - private SentinelApiClient sentinelApiClient; - - @Autowired - private AppManagement appManagement; - - @Override - public List getRules(String appName) throws Exception { - if (StringUtil.isBlank(appName)) { - return new ArrayList<>(); - } - List list = appManagement.getDetailApp(appName) - .getMachines() - .stream() - .filter(MachineInfo::isHealthy) - .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())) - .collect(Collectors.toList()); - if (list.isEmpty()) { - return new ArrayList<>(); - } - else { - MachineInfo machine = list.get(0); - return sentinelApiClient.fetchFlowRuleOfMachine(machine.getApp(), machine.getIp(), machine.getPort()); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java deleted file mode 100644 index a5d8ac83..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiPublisher.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.rule; - -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@Component("flowRuleDefaultPublisher") -public class FlowRuleApiPublisher implements DynamicRulePublisher> { - - @Autowired - private SentinelApiClient sentinelApiClient; - - @Autowired - private AppManagement appManagement; - - @Override - public void publish(String app, List rules) throws Exception { - if (StringUtil.isBlank(app)) { - return; - } - if (rules == null) { - return; - } - Set set = appManagement.getDetailApp(app).getMachines(); - - for (MachineInfo machine : set) { - if (!machine.isHealthy()) { - continue; - } - // TODO: parse the results - sentinelApiClient.setFlowRuleOfMachine(app, machine.getIp(), machine.getPort(), rules); - } - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java deleted file mode 100644 index 26be98d7..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignService.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.service; - -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap; - -import java.util.List; -import java.util.Set; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public interface ClusterAssignService { - - /** - * Unbind a specific cluster server and its clients. - * @param app app name - * @param machineId valid machine ID ({@code host@commandPort}) - * @return assign result - */ - ClusterAppAssignResultVO unbindClusterServer(String app, String machineId); - - /** - * Unbind a set of cluster servers and its clients. - * @param app app name - * @param machineIdSet set of valid machine ID ({@code host@commandPort}) - * @return assign result - */ - ClusterAppAssignResultVO unbindClusterServers(String app, Set machineIdSet); - - /** - * Apply cluster server and client assignment for provided app. - * @param app app name - * @param clusterMap cluster assign map (server -> clients) - * @param remainingSet unassigned set of machine ID - * @return assign result - */ - ClusterAppAssignResultVO applyAssignToApp(String app, List clusterMap, - Set remainingSet); - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java deleted file mode 100644 index 53a046af..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.service; - -import com.alibaba.csp.sentinel.cluster.ClusterStateManager; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterAppAssignMap; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO; -import com.alibaba.csp.sentinel.dashboard.util.MachineUtils; -import com.alibaba.csp.sentinel.util.AssertUtil; -import com.alibaba.csp.sentinel.util.function.Tuple2; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -@Service -public class ClusterAssignServiceImpl implements ClusterAssignService { - - private final Logger LOGGER = LoggerFactory.getLogger(ClusterAssignServiceImpl.class); - - @Autowired - private SentinelApiClient sentinelApiClient; - - @Autowired - private ClusterConfigService clusterConfigService; - - private boolean isMachineInApp(/* @NonEmpty */ String machineId) { - return machineId.contains(":"); - } - - private ClusterAppAssignResultVO handleUnbindClusterServerNotInApp(String app, String machineId) { - Set failedSet = new HashSet<>(); - try { - List list = clusterConfigService.getClusterUniversalState(app) - .get(10, TimeUnit.SECONDS); - Set toModifySet = list.stream() - .filter(e -> e.getState().getStateInfo().getMode() == ClusterStateManager.CLUSTER_CLIENT) - .filter(e -> machineId.equals(e.getState().getClient().getClientConfig().getServerHost() + ':' - + e.getState().getClient().getClientConfig().getServerPort())) - .map(e -> e.getIp() + '@' + e.getCommandPort()) - .collect(Collectors.toSet()); - // Modify mode to NOT-STARTED for all associated token clients. - modifyToNonStarted(toModifySet, failedSet); - } - catch (Exception ex) { - Throwable e = ex instanceof ExecutionException ? ex.getCause() : ex; - LOGGER.error("Failed to unbind machine <{}>", machineId, e); - failedSet.add(machineId); - } - return new ClusterAppAssignResultVO().setFailedClientSet(failedSet).setFailedServerSet(new HashSet<>()); - } - - private void modifyToNonStarted(Set toModifySet, Set failedSet) { - toModifySet.parallelStream() - .map(MachineUtils::parseCommandIpAndPort) - .filter(Optional::isPresent) - .map(Optional::get) - .map(e -> { - CompletableFuture f = modifyMode(e.r1, e.r2, ClusterStateManager.CLUSTER_NOT_STARTED); - return Tuple2.of(e.r1 + '@' + e.r2, f); - }) - .forEach(f -> handleFutureSync(f, failedSet)); - } - - @Override - public ClusterAppAssignResultVO unbindClusterServer(String app, String machineId) { - AssertUtil.assertNotBlank(app, "app cannot be blank"); - AssertUtil.assertNotBlank(machineId, "machineId cannot be blank"); - - if (isMachineInApp(machineId)) { - return handleUnbindClusterServerNotInApp(app, machineId); - } - Set failedSet = new HashSet<>(); - try { - ClusterGroupEntity entity = clusterConfigService.getClusterUniversalStateForAppMachine(app, machineId) - .get(10, TimeUnit.SECONDS); - Set toModifySet = new HashSet<>(); - toModifySet.add(machineId); - if (entity.getClientSet() != null) { - toModifySet.addAll(entity.getClientSet()); - } - // Modify mode to NOT-STARTED for all chosen token servers and associated - // token clients. - modifyToNonStarted(toModifySet, failedSet); - } - catch (Exception ex) { - Throwable e = ex instanceof ExecutionException ? ex.getCause() : ex; - LOGGER.error("Failed to unbind machine <{}>", machineId, e); - failedSet.add(machineId); - } - return new ClusterAppAssignResultVO().setFailedClientSet(failedSet).setFailedServerSet(new HashSet<>()); - } - - @Override - public ClusterAppAssignResultVO unbindClusterServers(String app, Set machineIdSet) { - AssertUtil.assertNotBlank(app, "app cannot be blank"); - AssertUtil.isTrue(machineIdSet != null && !machineIdSet.isEmpty(), "machineIdSet cannot be empty"); - ClusterAppAssignResultVO result = new ClusterAppAssignResultVO().setFailedClientSet(new HashSet<>()) - .setFailedServerSet(new HashSet<>()); - for (String machineId : machineIdSet) { - ClusterAppAssignResultVO resultVO = unbindClusterServer(app, machineId); - result.getFailedClientSet().addAll(resultVO.getFailedClientSet()); - result.getFailedServerSet().addAll(resultVO.getFailedServerSet()); - } - return result; - } - - @Override - public ClusterAppAssignResultVO applyAssignToApp(String app, List clusterMap, - Set remainingSet) { - AssertUtil.assertNotBlank(app, "app cannot be blank"); - AssertUtil.notNull(clusterMap, "clusterMap cannot be null"); - Set failedServerSet = new HashSet<>(); - Set failedClientSet = new HashSet<>(); - - // Assign server and apply config. - clusterMap.stream().filter(Objects::nonNull).filter(ClusterAppAssignMap::getBelongToApp).map(e -> { - String ip = e.getIp(); - int commandPort = parsePort(e); - CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_SERVER) - .thenCompose(v -> applyServerConfigChange(app, ip, commandPort, e)); - return Tuple2.of(e.getMachineId(), f); - }).forEach(t -> handleFutureSync(t, failedServerSet)); - - // Assign client of servers and apply config. - clusterMap.parallelStream() - .filter(Objects::nonNull) - .forEach(e -> applyAllClientConfigChange(app, e, failedClientSet)); - - // Unbind remaining (unassigned) machines. - applyAllRemainingMachineSet(app, remainingSet, failedClientSet); - - return new ClusterAppAssignResultVO().setFailedClientSet(failedClientSet).setFailedServerSet(failedServerSet); - } - - private void applyAllRemainingMachineSet(String app, Set remainingSet, Set failedSet) { - if (remainingSet == null || remainingSet.isEmpty()) { - return; - } - remainingSet.parallelStream() - .filter(Objects::nonNull) - .map(MachineUtils::parseCommandIpAndPort) - .filter(Optional::isPresent) - .map(Optional::get) - .map(ipPort -> { - String ip = ipPort.r1; - int commandPort = ipPort.r2; - CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_NOT_STARTED); - return Tuple2.of(ip + '@' + commandPort, f); - }) - .forEach(t -> handleFutureSync(t, failedSet)); - } - - private void applyAllClientConfigChange(String app, ClusterAppAssignMap assignMap, Set failedSet) { - Set clientSet = assignMap.getClientSet(); - if (clientSet == null || clientSet.isEmpty()) { - return; - } - final String serverIp = assignMap.getIp(); - final int serverPort = assignMap.getPort(); - clientSet.stream() - .map(MachineUtils::parseCommandIpAndPort) - .filter(Optional::isPresent) - .map(Optional::get) - .map(ipPort -> { - CompletableFuture f = sentinelApiClient - .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT) - .thenCompose(v -> sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2, - new ClusterClientConfig().setRequestTimeout(20) - .setServerHost(serverIp) - .setServerPort(serverPort))); - return Tuple2.of(ipPort.r1 + '@' + ipPort.r2, f); - }) - .forEach(t -> handleFutureSync(t, failedSet)); - } - - private void handleFutureSync(Tuple2> t, Set failedSet) { - try { - t.r2.get(10, TimeUnit.SECONDS); - } - catch (Exception ex) { - if (ex instanceof ExecutionException) { - LOGGER.error("Request for <{}> failed", t.r1, ex.getCause()); - } - else { - LOGGER.error("Request for <{}> failed", t.r1, ex); - } - failedSet.add(t.r1); - } - } - - private CompletableFuture applyServerConfigChange(String app, String ip, int commandPort, - ClusterAppAssignMap assignMap) { - ServerTransportConfig transportConfig = new ServerTransportConfig().setPort(assignMap.getPort()) - .setIdleSeconds(600); - return sentinelApiClient.modifyClusterServerTransportConfig(app, ip, commandPort, transportConfig) - .thenCompose(v -> applyServerFlowConfigChange(app, ip, commandPort, assignMap)) - .thenCompose(v -> applyServerNamespaceSetConfig(app, ip, commandPort, assignMap)); - } - - private CompletableFuture applyServerFlowConfigChange(String app, String ip, int commandPort, - ClusterAppAssignMap assignMap) { - Double maxAllowedQps = assignMap.getMaxAllowedQps(); - if (maxAllowedQps == null || maxAllowedQps <= 0 || maxAllowedQps > 20_0000) { - return CompletableFuture.completedFuture(null); - } - return sentinelApiClient.modifyClusterServerFlowConfig(app, ip, commandPort, - new ServerFlowConfig().setMaxAllowedQps(maxAllowedQps)); - } - - private CompletableFuture applyServerNamespaceSetConfig(String app, String ip, int commandPort, - ClusterAppAssignMap assignMap) { - Set namespaceSet = assignMap.getNamespaceSet(); - if (namespaceSet == null || namespaceSet.isEmpty()) { - return CompletableFuture.completedFuture(null); - } - return sentinelApiClient.modifyClusterServerNamespaceSet(app, ip, commandPort, namespaceSet); - } - - private CompletableFuture modifyMode(String ip, int port, int mode) { - return sentinelApiClient.modifyClusterMode(ip, port, mode); - } - - private int parsePort(ClusterAppAssignMap assignMap) { - return MachineUtils.parseCommandPort(assignMap.getMachineId()).orElse(ServerTransportConfig.DEFAULT_PORT); - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java deleted file mode 100644 index d8850631..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.service; - -import com.alibaba.csp.sentinel.cluster.ClusterStateManager; -import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; -import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo; -import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterClientStateVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO; -import com.alibaba.csp.sentinel.dashboard.util.AsyncUtils; -import com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils; -import com.alibaba.csp.sentinel.util.StringUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@Service -public class ClusterConfigService { - - @Autowired - private SentinelApiClient sentinelApiClient; - - @Autowired - private AppManagement appManagement; - - public CompletableFuture modifyClusterClientConfig(ClusterClientModifyRequest request) { - if (notClientRequestValid(request)) { - throw new IllegalArgumentException("Invalid request"); - } - String app = request.getApp(); - String ip = request.getIp(); - int port = request.getPort(); - return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig()) - .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT)); - } - - private boolean notClientRequestValid(/* @NonNull */ ClusterClientModifyRequest request) { - ClusterClientConfig config = request.getClientConfig(); - return config == null || StringUtil.isEmpty(config.getServerHost()) || config.getServerPort() == null - || config.getServerPort() <= 0 || config.getRequestTimeout() == null || config.getRequestTimeout() <= 0; - } - - public CompletableFuture modifyClusterServerConfig(ClusterServerModifyRequest request) { - ServerTransportConfig transportConfig = request.getTransportConfig(); - ServerFlowConfig flowConfig = request.getFlowConfig(); - Set namespaceSet = request.getNamespaceSet(); - if (invalidTransportConfig(transportConfig)) { - throw new IllegalArgumentException("Invalid transport config in request"); - } - if (invalidFlowConfig(flowConfig)) { - throw new IllegalArgumentException("Invalid flow config in request"); - } - if (namespaceSet == null) { - throw new IllegalArgumentException("namespace set cannot be null"); - } - String app = request.getApp(); - String ip = request.getIp(); - int port = request.getPort(); - return sentinelApiClient.modifyClusterServerNamespaceSet(app, ip, port, namespaceSet) - .thenCompose(v -> sentinelApiClient.modifyClusterServerTransportConfig(app, ip, port, transportConfig)) - .thenCompose(v -> sentinelApiClient.modifyClusterServerFlowConfig(app, ip, port, flowConfig)) - .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_SERVER)); - } - - /** - * Get cluster state list of all available machines of provided application. - * @param app application name - * @return cluster state list of all available machines of the application - * @since 1.4.1 - */ - public CompletableFuture> getClusterUniversalState(String app) { - if (StringUtil.isBlank(app)) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty")); - } - AppInfo appInfo = appManagement.getDetailApp(app); - if (appInfo == null || appInfo.getMachines() == null) { - return CompletableFuture.completedFuture(new ArrayList<>()); - } - - List> futures = appInfo.getMachines() - .stream() - .filter(e -> e.isHealthy()) - .map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort()) - .thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e))) - .collect(Collectors.toList()); - - return AsyncUtils.sequenceSuccessFuture(futures); - } - - public CompletableFuture getClusterUniversalStateForAppMachine(String app, String machineId) { - if (StringUtil.isBlank(app)) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty")); - } - AppInfo appInfo = appManagement.getDetailApp(app); - if (appInfo == null || appInfo.getMachines() == null) { - return AsyncUtils.newFailedFuture(new IllegalArgumentException("app does not have machines")); - } - - boolean machineOk = appInfo.getMachines() - .stream() - .filter(e -> e.isHealthy()) - .map(e -> e.getIp() + '@' + e.getPort()) - .anyMatch(e -> e.equals(machineId)); - if (!machineOk) { - return AsyncUtils.newFailedFuture(new IllegalStateException("machine does not exist or disconnected")); - } - - return getClusterUniversalState(app).thenApply(ClusterEntityUtils::wrapToClusterGroup) - .thenCompose(e -> e.stream() - .filter(e1 -> e1.getMachineId().equals(machineId)) - .findAny() - .map(CompletableFuture::completedFuture) - .orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId)))); - } - - public CompletableFuture getClusterUniversalState(String app, String ip, int port) { - return sentinelApiClient.fetchClusterMode(ip, port) - .thenApply(e -> new ClusterUniversalStateVO().setStateInfo(e)) - .thenCompose(vo -> { - if (vo.getStateInfo().getClientAvailable()) { - return sentinelApiClient.fetchClusterClientInfoAndConfig(ip, port) - .thenApply(cc -> vo.setClient(new ClusterClientStateVO().setClientConfig(cc))); - } - else { - return CompletableFuture.completedFuture(vo); - } - }) - .thenCompose(vo -> { - if (vo.getStateInfo().getServerAvailable()) { - return sentinelApiClient.fetchClusterServerBasicInfo(ip, port).thenApply(vo::setServer); - } - else { - return CompletableFuture.completedFuture(vo); - } - }); - } - - private boolean invalidTransportConfig(ServerTransportConfig transportConfig) { - return transportConfig == null || transportConfig.getPort() == null || transportConfig.getPort() <= 0 - || transportConfig.getIdleSeconds() == null || transportConfig.getIdleSeconds() <= 0; - } - - private boolean invalidFlowConfig(ServerFlowConfig flowConfig) { - return flowConfig == null || flowConfig.getSampleCount() == null || flowConfig.getSampleCount() <= 0 - || flowConfig.getIntervalMs() == null || flowConfig.getIntervalMs() <= 0 - || flowConfig.getIntervalMs() % flowConfig.getSampleCount() != 0 - || flowConfig.getMaxAllowedQps() == null || flowConfig.getMaxAllowedQps() < 0; - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java deleted file mode 100644 index 2cf15bbc..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public final class AsyncUtils { - - private static final Logger LOG = LoggerFactory.getLogger(AsyncUtils.class); - - public static CompletableFuture newFailedFuture(Throwable ex) { - CompletableFuture future = new CompletableFuture<>(); - future.completeExceptionally(ex); - return future; - } - - public static CompletableFuture> sequenceFuture(List> futures) { - return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) - .thenApply(v -> futures.stream() - .map(AsyncUtils::getValue) - .filter(Objects::nonNull) - .collect(Collectors.toList())); - } - - public static CompletableFuture> sequenceSuccessFuture(List> futures) { - return CompletableFuture.supplyAsync(() -> futures.parallelStream() - .map(AsyncUtils::getValue) - .filter(Objects::nonNull) - .collect(Collectors.toList())); - } - - public static T getValue(CompletableFuture future) { - try { - return future.get(10, TimeUnit.SECONDS); - } - catch (Exception ex) { - LOG.error("getValue for async result failed", ex); - } - return null; - } - - public static boolean isSuccessFuture(CompletableFuture future) { - return future.isDone() && !future.isCompletedExceptionally() && !future.isCancelled(); - } - - private AsyncUtils() { - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java deleted file mode 100644 index de2ed0c5..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.util; - -import com.alibaba.csp.sentinel.cluster.ClusterStateManager; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.ConnectionGroupVO; -import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.*; -import com.alibaba.csp.sentinel.util.StringUtil; - -import java.util.*; - -/** - * @author Eric Zhao - * @since 1.4.1 - */ -public final class ClusterEntityUtils { - - public static List wrapToAppClusterServerState( - List list) { - if (list == null || list.isEmpty()) { - return new ArrayList<>(); - } - Map map = new HashMap<>(); - Set tokenServerSet = new HashSet<>(); - // Handle token servers that belong to current app. - for (ClusterUniversalStatePairVO stateVO : list) { - int mode = stateVO.getState().getStateInfo().getMode(); - - if (mode == ClusterStateManager.CLUSTER_SERVER) { - String ip = stateVO.getIp(); - String serverId = ip + '@' + stateVO.getCommandPort(); - ClusterServerStateVO serverStateVO = stateVO.getState().getServer(); - map.computeIfAbsent(serverId, - v -> new AppClusterServerStateWrapVO().setId(serverId) - .setIp(ip) - .setPort(serverStateVO.getPort()) - .setState(serverStateVO) - .setBelongToApp(true) - .setConnectedCount(serverStateVO.getConnection() - .stream() - .mapToInt(ConnectionGroupVO::getConnectedCount) - .sum())); - tokenServerSet.add(ip + ":" + serverStateVO.getPort()); - } - } - // Handle token servers from other app. - for (ClusterUniversalStatePairVO stateVO : list) { - int mode = stateVO.getState().getStateInfo().getMode(); - - if (mode == ClusterStateManager.CLUSTER_CLIENT) { - ClusterClientStateVO clientState = stateVO.getState().getClient(); - if (clientState == null) { - continue; - } - String serverIp = clientState.getClientConfig().getServerHost(); - int serverPort = clientState.getClientConfig().getServerPort(); - if (tokenServerSet.contains(serverIp + ":" + serverPort)) { - continue; - } - // We are not able to get the commandPort of foreign token server - // directly. - String serverId = String.format("%s:%d", serverIp, serverPort); - map.computeIfAbsent(serverId, - v -> new AppClusterServerStateWrapVO().setId(serverId) - .setIp(serverIp) - .setPort(serverPort) - .setBelongToApp(false)); - } - } - return new ArrayList<>(map.values()); - } - - public static List wrapToAppClusterClientState( - List list) { - if (list == null || list.isEmpty()) { - return new ArrayList<>(); - } - Map map = new HashMap<>(); - for (ClusterUniversalStatePairVO stateVO : list) { - int mode = stateVO.getState().getStateInfo().getMode(); - - if (mode == ClusterStateManager.CLUSTER_CLIENT) { - String ip = stateVO.getIp(); - String clientId = ip + '@' + stateVO.getCommandPort(); - ClusterClientStateVO clientStateVO = stateVO.getState().getClient(); - map.computeIfAbsent(clientId, - v -> new AppClusterClientStateWrapVO().setId(clientId) - .setIp(ip) - .setState(clientStateVO) - .setCommandPort(stateVO.getCommandPort())); - } - } - return new ArrayList<>(map.values()); - } - - public static List wrapToClusterGroup(List list) { - if (list == null || list.isEmpty()) { - return new ArrayList<>(); - } - Map map = new HashMap<>(); - for (ClusterUniversalStatePairVO stateVO : list) { - int mode = stateVO.getState().getStateInfo().getMode(); - String ip = stateVO.getIp(); - if (mode == ClusterStateManager.CLUSTER_SERVER) { - String serverAddress = getIp(ip); - int port = stateVO.getState().getServer().getPort(); - String targetAddress = serverAddress + ":" + port; - map.computeIfAbsent(targetAddress, - v -> new ClusterGroupEntity().setBelongToApp(true) - .setMachineId(ip + '@' + stateVO.getCommandPort()) - .setIp(ip) - .setPort(port)); - } - } - for (ClusterUniversalStatePairVO stateVO : list) { - int mode = stateVO.getState().getStateInfo().getMode(); - String ip = stateVO.getIp(); - if (mode == ClusterStateManager.CLUSTER_CLIENT) { - String targetServer = stateVO.getState().getClient().getClientConfig().getServerHost(); - Integer targetPort = stateVO.getState().getClient().getClientConfig().getServerPort(); - if (StringUtil.isBlank(targetServer) || targetPort == null || targetPort <= 0) { - continue; - } - String targetAddress = targetServer + ":" + targetPort; - ClusterGroupEntity group = map.computeIfAbsent(targetAddress, - v -> new ClusterGroupEntity().setBelongToApp(true) - .setMachineId(targetServer) - .setIp(targetServer) - .setPort(targetPort)); - group.getClientSet().add(ip + '@' + stateVO.getCommandPort()); - } - } - return new ArrayList<>(map.values()); - } - - private static String getIp(String str) { - if (str.contains(":")) { - return str.split(":")[0]; - } - return str; - } - - private ClusterEntityUtils() { - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java deleted file mode 100644 index c124aee0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/MachineUtils.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.util; - -import com.alibaba.csp.sentinel.util.StringUtil; -import com.alibaba.csp.sentinel.util.function.Tuple2; - -import java.util.Optional; - -/** - * @author Eric Zhao - */ -public final class MachineUtils { - - public static Optional parseCommandPort(String machineIp) { - try { - if (!machineIp.contains("@")) { - return Optional.empty(); - } - String[] str = machineIp.split("@"); - if (str.length <= 1) { - return Optional.empty(); - } - return Optional.of(Integer.parseInt(str[1])); - } - catch (Exception ex) { - return Optional.empty(); - } - } - - public static Optional> parseCommandIpAndPort(String machineIp) { - try { - if (StringUtil.isEmpty(machineIp) || !machineIp.contains("@")) { - return Optional.empty(); - } - String[] str = machineIp.split("@"); - if (str.length <= 1) { - return Optional.empty(); - } - return Optional.of(Tuple2.of(str[0], Integer.parseInt(str[1]))); - } - catch (Exception ex) { - return Optional.empty(); - } - } - - private MachineUtils() { - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java deleted file mode 100644 index c7daea6a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/VersionUtils.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.csp.sentinel.dashboard.util; - -import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion; -import com.alibaba.csp.sentinel.util.StringUtil; - -import java.util.Optional; - -/** - * Util class for parsing version. - * - * @author Eric Zhao - * @since 0.2.1 - */ -public final class VersionUtils { - - /** - * Parse version of Sentinel from raw string. - * @param verStr version string - * @return parsed {@link SentinelVersion} if the version is valid; empty if there is - * something wrong with the format - */ - public static Optional parseVersion(String verStr) { - if (StringUtil.isBlank(verStr)) { - return Optional.empty(); - } - try { - String versionFull = verStr; - SentinelVersion version = new SentinelVersion(); - - // postfix - int index = versionFull.indexOf("-"); - if (index == 0) { - // Start with "-" - return Optional.empty(); - } - if (index == versionFull.length() - 1) { - // End with "-" - } - else if (index > 0) { - version.setPostfix(versionFull.substring(index + 1)); - } - - if (index >= 0) { - versionFull = versionFull.substring(0, index); - } - - // x.x.x - int segment = 0; - int[] ver = new int[3]; - while (segment < ver.length) { - index = versionFull.indexOf('.'); - if (index < 0) { - if (versionFull.length() > 0) { - ver[segment] = Integer.valueOf(versionFull); - } - break; - } - ver[segment] = Integer.valueOf(versionFull.substring(0, index)); - versionFull = versionFull.substring(index + 1); - segment++; - } - - if (ver[0] < 1) { - // Wrong format, return empty. - return Optional.empty(); - } - else { - return Optional.of(version.setMajorVersion(ver[0]).setMinorVersion(ver[1]).setFixVersion(ver[2])); - } - } - catch (Exception ex) { - // Parse fail, return empty. - return Optional.empty(); - } - } - - private VersionUtils() { - } - -} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml b/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml deleted file mode 100755 index d88c2d1b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml +++ /dev/null @@ -1,44 +0,0 @@ -server: - port: 5003 - servlet: - encoding: - force: true - -spring: - application: - name: @artifactId@ - cloud: - nacos: - username: @nacos.username@ - password: @nacos.password@ - discovery: - server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} - -management: - endpoints: - web: - exposure: - include: '*' - endpoint: - health: - show-details: ALWAYS -logging: - level: - org: - springframework: - web: info - file: - name: ${user.home}/logs/csp/sentinel-dashboard.log - pattern: - file: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n' - -auth: - username: sentinel - password: sentinel - filter: - exclude-urls: /,/auth/login,/auth/logout,/registry/machine,/version,/actuator/**,/details - exclude-url-suffixes: htm,html,js,css,map,ico,ttf,woff,png - -sentinel: - dashboard: - version: @project.version@ diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.gitignore b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.gitignore deleted file mode 100644 index 104d9996..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -tmp/ \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.jshintrc b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.jshintrc deleted file mode 100644 index 6c66001a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/.jshintrc +++ /dev/null @@ -1,67 +0,0 @@ -{ - /* - * ENVIRONMENTS - * ================= - */ - - // Define globals exposed by modern browsers. - "browser": true, - - // Define globals exposed by jQuery. - "jquery": true, - - // Define globals exposed by Node.js. - "node": true, - - // Allow ES6. - "esversion": 6, - - /* - * ENFORCING OPTIONS - * ================= - */ - - // Force all variable names to use either camelCase style or UPPER_CASE - // with underscores. - "camelcase": true, - - // Prohibit use of == and != in favor of === and !==. - "eqeqeq": true, - - // Enforce tab width of 2 spaces. - "indent": 2, - - // Prohibit use of a variable before it is defined. - "latedef": true, - - // Enforce line length to 100 characters - "maxlen": 100, - - // Require capitalized names for constructor functions. - "newcap": true, - - // Enforce use of single quotation marks for strings. - "quotmark": "single", - - // Enforce placing 'use strict' at the top function scope - // 前端项目中外层使用 strict 即可,覆盖此条规则 - "strict": false, - - // Prohibit use of explicitly undeclared variables. - "undef": true, - - // Warn when variables are defined but never used. - "unused": true, - - /* - * RELAXING OPTIONS - * ================= - */ - - // Suppress warnings about == null comparisons. - "eqnull": true, - "globals": { - "$": false, - "angular": false - } -} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README.md b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README.md deleted file mode 100644 index c88ea68c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Sentinel Dashboard Frontend - -## Env Requirement - -- Node.js > 6.x - -## Code Guide - -- [Code Style Guide for HTML/CSS](https://codeguide.bootcss.com/) -- [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript/tree/es5-deprecated/es5) - -## Install Packages - -``` -npm install -``` - -## Start Development - -``` -npm start -``` - -## Build for production - -``` -npm run build -``` - -## Credit - -- [sb-admin-angular](https://github.com/start-angular/sb-admin-angular) \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README_zh.md b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README_zh.md deleted file mode 100644 index 5daf33ef..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/README_zh.md +++ /dev/null @@ -1,32 +0,0 @@ -# Sentinel Dashboard Frontend - -## 环境要求 - -- Node.js > 6.x - -## 编码规范 - -- HTML/CSS 遵循 [Bootstrap 编码规范](https://codeguide.bootcss.com/) -- JavaScript 遵循 [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript/tree/es5-deprecated/es5) 以及最新的 ES 6 标准 - -## 安装依赖 - -``` -npm i -``` - -## 开始本地开发 - -``` -npm start -``` - -## 构建前端资源 - -``` -npm run build -``` - -## Credit - -- [sb-admin-angular](https://github.com/start-angular/sb-admin-angular) \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js deleted file mode 100644 index bc3747af..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/app.js +++ /dev/null @@ -1,365 +0,0 @@ -'use strict'; - -/** - * @ngdoc overview - * @name sentinelDashboardApp - * @description - * # sentinelDashboardApp - * - * Main module of the application. - */ - -angular - .module('sentinelDashboardApp', [ - 'oc.lazyLoad', - 'ui.router', - 'ui.bootstrap', - 'angular-loading-bar', - 'ngDialog', - 'ui.bootstrap.datetimepicker', - 'ui-notification', - 'rzTable', - 'angular-clipboard', - 'selectize', - 'angularUtils.directives.dirPagination' - ]) - .factory('AuthInterceptor', ['$window', '$state', function ($window, $state) { - var authInterceptor = { - 'responseError' : function(response) { - if (response.status === 401) { - // If not auth, clear session in localStorage and jump to the login page - $window.localStorage.removeItem('session_sentinel_admin'); - $state.go('login'); - } - - return response; - }, - 'response' : function(response) { - return response; - }, - 'request' : function(config) { - return config; - }, - 'requestError' : function(config){ - return config; - } - }; - return authInterceptor; - }]) - .config(['$stateProvider', '$urlRouterProvider', '$ocLazyLoadProvider', '$httpProvider', - function ($stateProvider, $urlRouterProvider, $ocLazyLoadProvider, $httpProvider) { - $httpProvider.interceptors.push('AuthInterceptor'); - - $ocLazyLoadProvider.config({ - debug: false, - events: true, - }); - - $urlRouterProvider.otherwise('/dashboard/home'); - - $stateProvider - .state('login', { - url: '/login', - templateUrl: 'app/views/login.html', - controller: 'LoginCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/login.js', - ] - }); - }] - } - }) - - .state('dashboard', { - url: '/dashboard', - templateUrl: 'app/views/dashboard/main.html', - resolve: { - loadMyDirectives: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load( - { - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/directives/header/header.js', - 'app/scripts/directives/sidebar/sidebar.js', - 'app/scripts/directives/sidebar/sidebar-search/sidebar-search.js', - ] - }); - }] - } - }) - - .state('dashboard.home', { - url: '/home', - templateUrl: 'app/views/dashboard/home.html', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/main.js', - ] - }); - }] - } - }) - - .state('dashboard.flowV1', { - templateUrl: 'app/views/flow_v1.html', - url: '/flow/:app', - controller: 'FlowControllerV1', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/flow_v1.js', - ] - }); - }] - } - }) - - .state('dashboard.flow', { - templateUrl: 'app/views/flow_v2.html', - url: '/v2/flow/:app', - controller: 'FlowControllerV2', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/flow_v2.js', - ] - }); - }] - } - }) - - .state('dashboard.paramFlow', { - templateUrl: 'app/views/param_flow.html', - url: '/paramFlow/:app', - controller: 'ParamFlowController', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/param_flow.js', - ] - }); - }] - } - }) - - .state('dashboard.clusterAppAssignManage', { - templateUrl: 'app/views/cluster_app_assign_manage.html', - url: '/cluster/assign_manage/:app', - controller: 'SentinelClusterAppAssignManageController', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/cluster_app_assign_manage.js', - ] - }); - }] - } - }) - - .state('dashboard.clusterAppServerList', { - templateUrl: 'app/views/cluster_app_server_list.html', - url: '/cluster/server/:app', - controller: 'SentinelClusterAppServerListController', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/cluster_app_server_list.js', - ] - }); - }] - } - }) - - .state('dashboard.clusterAppClientList', { - templateUrl: 'app/views/cluster_app_client_list.html', - url: '/cluster/client/:app', - controller: 'SentinelClusterAppTokenClientListController', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/cluster_app_token_client_list.js', - ] - }); - }] - } - }) - - .state('dashboard.clusterSingle', { - templateUrl: 'app/views/cluster_single_config.html', - url: '/cluster/single/:app', - controller: 'SentinelClusterSingleController', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/cluster_single.js', - ] - }); - }] - } - }) - - .state('dashboard.authority', { - templateUrl: 'app/views/authority.html', - url: '/authority/:app', - controller: 'AuthorityRuleController', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/authority.js', - ] - }); - }] - } - }) - - .state('dashboard.degrade', { - templateUrl: 'app/views/degrade.html', - url: '/degrade/:app', - controller: 'DegradeCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/degrade.js', - ] - }); - }] - } - }) - - .state('dashboard.system', { - templateUrl: 'app/views/system.html', - url: '/system/:app', - controller: 'SystemCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/system.js', - ] - }); - }] - } - }) - - .state('dashboard.machine', { - templateUrl: 'app/views/machine.html', - url: '/app/:app', - controller: 'MachineCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/machine.js', - ] - }); - }] - } - }) - - .state('dashboard.identity', { - templateUrl: 'app/views/identity.html', - url: '/identity/:app', - controller: 'IdentityCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/identity.js', - ] - }); - }] - } - }) - - .state('dashboard.gatewayIdentity', { - templateUrl: 'app/views/gateway/identity.html', - url: '/gateway/identity/:app', - controller: 'GatewayIdentityCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/gateway/identity.js', - ] - }); - }] - } - }) - - .state('dashboard.metric', { - templateUrl: 'app/views/metric.html', - url: '/metric/:app', - controller: 'MetricCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/metric.js', - ] - }); - }] - } - }) - - .state('dashboard.gatewayApi', { - templateUrl: 'app/views/gateway/api.html', - url: '/gateway/api/:app', - controller: 'GatewayApiCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/gateway/api.js', - ] - }); - }] - } - }) - - .state('dashboard.gatewayFlow', { - templateUrl: 'app/views/gateway/flow.html', - url: '/gateway/flow/:app', - controller: 'GatewayFlowCtl', - resolve: { - loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { - return $ocLazyLoad.load({ - name: 'sentinelDashboardApp', - files: [ - 'app/scripts/controllers/gateway/flow.js', - ] - }); - }] - } - }); - }]); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js deleted file mode 100644 index 3d86302f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/authority.js +++ /dev/null @@ -1,227 +0,0 @@ -/** - * Authority rule controller. - */ -angular.module('sentinelDashboardApp').controller('AuthorityRuleController', ['$scope', '$stateParams', 'AuthorityRuleService', 'ngDialog', - 'MachineService', - function ($scope, $stateParams, AuthorityRuleService, ngDialog, - MachineService) { - $scope.app = $stateParams.app; - - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - AuthorityRuleService.queryMachineRules($scope.app, mac[0], mac[1]) - .success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.rules = data.data; - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - $scope.loadError = {message: data.msg}; - } - }) - .error((data, header, config, status) => { - $scope.loadError = {message: "未知错误"}; - }); - }; - $scope.getMachineRules = getMachineRules; - getMachineRules(); - - var authorityRuleDialog; - - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - $scope.authorityRuleDialog = { - title: '编辑授权规则', - type: 'edit', - confirmBtnText: '保存', - }; - authorityRuleDialog = ngDialog.open({ - template: '/app/views/dialog/authority-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - app: $scope.app, - ip: mac[0], - port: mac[1], - rule: { - strategy: 0, - limitApp: '', - } - }; - $scope.authorityRuleDialog = { - title: '新增授权规则', - type: 'add', - confirmBtnText: '新增', - showAdvanceButton: true, - }; - authorityRuleDialog = ngDialog.open({ - template: '/app/views/dialog/authority-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.saveRule = function () { - if (!AuthorityRuleService.checkRuleValid($scope.currentRule.rule)) { - return; - } - if ($scope.authorityRuleDialog.type === 'add') { - addNewRuleAndPush($scope.currentRule); - } else if ($scope.authorityRuleDialog.type === 'edit') { - saveRuleAndPush($scope.currentRule, true); - } - }; - - function addNewRuleAndPush(rule) { - AuthorityRuleService.addNewRule(rule).success((data) => { - if (data.success) { - getMachineRules(); - authorityRuleDialog.close(); - } else { - alert('添加规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('添加规则失败:' + data.msg); - } else { - alert("添加规则失败:未知错误"); - } - }); - } - - function saveRuleAndPush(rule, edit) { - AuthorityRuleService.saveRule(rule).success(function (data) { - if (data.success) { - alert("修改规则成功"); - getMachineRules(); - if (edit) { - authorityRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('修改规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('修改规则失败:' + data.msg); - } else { - alert("修改规则失败:未知错误"); - } - }); - } - - function deleteRuleAndPush(entity) { - if (entity.id === undefined || isNaN(entity.id)) { - alert('规则 ID 不合法!'); - return; - } - AuthorityRuleService.deleteRule(entity).success((data) => { - if (data.code == 0) { - getMachineRules(); - confirmDialog.close(); - } else { - alert('删除规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('删除规则失败:' + data.msg); - } else { - alert("删除规则失败:未知错误"); - } - }); - }; - - var confirmDialog; - $scope.deleteRule = function (ruleEntity) { - $scope.currentRule = ruleEntity; - $scope.confirmDialog = { - title: '删除授权规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下授权限流规则', - attention: '资源名: ' + ruleEntity.rule.resource + ', 流控应用: ' + ruleEntity.rule.limitApp + - ', 类型: ' + (ruleEntity.rule.strategy === 0 ? '白名单' : '黑名单'), - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type === 'delete_rule') { - deleteRuleAndPush($scope.currentRule); - } else { - console.error('error'); - } - }; - - queryAppMachines(); - - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - } - }); - }]); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js deleted file mode 100644 index 6f9367d6..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_assign_manage.js +++ /dev/null @@ -1,283 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SentinelClusterAppAssignManageController', ['$scope', '$stateParams', 'ngDialog', - 'MachineService', 'ClusterStateService', - function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { - $scope.app = $stateParams.app; - const UNSUPPORTED_CODE = 4041; - - const CLUSTER_MODE_CLIENT = 0; - const CLUSTER_MODE_SERVER = 1; - const DEFAULT_CLUSTER_SERVER_PORT = 18730; - - $scope.tmp = { - curClientChosen: [], - curRemainingClientChosen: [], - curChosenServer: {}, - }; - - function convertSetToString(set) { - if (set === undefined) { - return ''; - } - let s = ''; - for (let i = 0; i < set.length; i++) { - s = s + set[i]; - if (i < set.length - 1) { - s = s + ','; - } - } - return s; - } - - function convertStrToNamespaceSet(str) { - if (str === undefined || str === '') { - return []; - } - let arr = []; - let spliced = str.split(','); - spliced.forEach((v) => { - arr.push(v.trim()); - }); - return arr; - } - - function processAppSingleData(data) { - if (data.state.server && data.state.server.namespaceSet) { - data.state.server.namespaceSetStr = convertSetToString(data.state.server.namespaceSet); - data.mode = data.state.stateInfo.mode; - } - } - - function removeFromArr(arr, v) { - for (let i = 0; i < arr.length; i++) { - if (arr[i] === v) { - arr.splice(i, 1); - break; - } - } - } - - function resetChosen() { - $scope.tmp.curClientChosen = []; - $scope.tmp.curRemainingClientChosen = []; - } - - function generateMachineId(e) { - return e.ip + '@' + e.commandPort; - } - - function applyClusterMap(appClusterMachineList) { - if (!appClusterMachineList) { - return; - } - let tmpMap = new Map(); - $scope.clusterMap = []; - $scope.remainingClientAddressList = []; - let tmpServerList = []; - let tmpClientList = []; - appClusterMachineList.forEach((e) => { - if (e.mode === CLUSTER_MODE_CLIENT) { - tmpClientList.push(e); - } else if (e.mode === CLUSTER_MODE_SERVER) { - tmpServerList.push(e); - } else { - $scope.remainingClientAddressList.push(generateMachineId(e)); - } - }); - tmpServerList.forEach((e) => { - let ip = e.ip; - let machineId = ip + '@' + e.commandPort; - let group = { - ip: ip, - machineId: machineId, - port: e.state.server.port, - clientSet: [], - namespaceSetStr: e.state.server.namespaceSetStr, - belongToApp: true, - }; - if (!tmpMap.has(ip)) { - tmpMap.set(ip, group); - } - }); - tmpClientList.forEach((e) => { - let ip = e.ip; - let machineId = ip + '@' + e.commandPort; - - let targetServer = e.state.client.clientConfig.serverHost; - let targetPort = e.state.client.clientConfig.serverPort; - if (targetServer === undefined || targetServer === '' || - targetPort === undefined || targetPort <= 0) { - $scope.remainingClientAddressList.push(generateMachineId(e)); - return; - } - - if (!tmpMap.has(targetServer)) { - let group = { - ip: targetServer, - machineId: targetServer, - port: targetPort, - clientSet: [machineId], - belongToApp: false, - }; - tmpMap.set(targetServer, group); - } else { - let g = tmpMap.get(targetServer); - g.clientSet.push(machineId); - } - }); - tmpMap.forEach((v) => { - if (v !== undefined) { - $scope.clusterMap.push(v); - } - }); - } - - $scope.onCurrentServerChange = () => { - resetChosen(); - }; - - $scope.remainingClientAddressList = []; - - $scope.moveToServerGroup = () => { - let chosenServer = $scope.tmp.curChosenServer; - if (!chosenServer || !chosenServer.machineId) { - return; - } - $scope.tmp.curRemainingClientChosen.forEach(e => { - chosenServer.clientSet.push(e); - removeFromArr($scope.remainingClientAddressList, e); - }); - resetChosen(); - }; - - $scope.moveToRemainingSharePool = () => { - $scope.tmp.curClientChosen.forEach(e => { - $scope.remainingClientAddressList.push(e); - removeFromArr($scope.tmp.curChosenServer.clientSet, e); - }); - resetChosen(); - }; - - function parseIpFromMachineId(machineId) { - if (machineId.indexOf('@') === -1) { - return machineId; - } - let arr = machineId.split('@'); - return arr[0]; - } - - $scope.addToServerList = () => { - let group; - $scope.tmp.curRemainingClientChosen.forEach(e => { - group = { - machineId: e, - ip: parseIpFromMachineId(e), - port: DEFAULT_CLUSTER_SERVER_PORT, - clientSet: [], - namespaceSetStr: 'default,' + $scope.app, - belongToApp: true, - }; - $scope.clusterMap.push(group); - removeFromArr($scope.remainingClientAddressList, e); - $scope.tmp.curChosenServer = group; - }); - resetChosen(); - }; - - $scope.removeFromServerList = () => { - let chosenServer = $scope.tmp.curChosenServer; - if (!chosenServer || !chosenServer.machineId) { - return; - } - chosenServer.clientSet.forEach((e) => { - if (e !== undefined) { - $scope.remainingClientAddressList.push(e); - } - }); - - if (chosenServer.belongToApp || chosenServer.machineId.indexOf('@') !== -1) { - $scope.remainingClientAddressList.push(chosenServer.machineId); - } else { - alert('提示:非本应用内机器将不会置回空闲列表中'); - } - - removeFromArr($scope.clusterMap, chosenServer); - - resetChosen(); - - if ($scope.clusterMap.length > 0) { - $scope.tmp.curChosenServer = $scope.clusterMap[0]; - $scope.onCurrentServerChange(); - } else { - $scope.tmp.curChosenServer = {}; - } - }; - - function retrieveClusterAppInfo() { - ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.appClusterMachineList = data.data; - $scope.appClusterMachineList.forEach(processAppSingleData); - applyClusterMap($scope.appClusterMachineList); - if ($scope.clusterMap.length > 0) { - $scope.tmp.curChosenServer = $scope.clusterMap[0]; - $scope.onCurrentServerChange(); - } - } else { - $scope.appClusterMachineList = {}; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error(() => { - $scope.loadError = {message: '未知错误'}; - }); - } - - retrieveClusterAppInfo(); - - $scope.saveAndApplyAssign = () => { - let ok = confirm('是否确认执行变更?'); - if (!ok) { - return; - } - let cm = $scope.clusterMap; - if (!cm) { - cm = []; - } - cm.forEach((e) => { - e.namespaceSet = convertStrToNamespaceSet(e.namespaceSetStr); - }); - cm.namespaceSet = convertStrToNamespaceSet(cm.namespaceSetStr); - let request = { - clusterMap: cm, - remainingList: $scope.remainingClientAddressList, - }; - ClusterStateService.applyClusterFullAssignOfApp($scope.app, request).success((data) => { - if (data.code === 0 && data.data) { - let failedServerSet = data.data.failedServerSet; - let failedClientSet = data.data.failedClientSet; - if (failedClientSet.length === 0 && failedServerSet.length === 0) { - alert('全部推送成功'); - } else { - alert('推送完毕。token server 失败列表:' + JSON.stringify(failedServerSet) + - '; token client 失败列表:' + JSON.stringify(failedClientSet)); - } - - retrieveClusterAppInfo(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('推送失败:' + data.msg); - } - } - }).error(() => { - alert('未知错误'); - }); - }; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js deleted file mode 100644 index 7e1708c0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_list.js +++ /dev/null @@ -1,570 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SentinelClusterAppServerListController', ['$scope', '$stateParams', 'ngDialog', - 'MachineService', 'ClusterStateService', - function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { - $scope.app = $stateParams.app; - const UNSUPPORTED_CODE = 4041; - - const CLUSTER_MODE_CLIENT = 0; - const CLUSTER_MODE_SERVER = 1; - const DEFAULT_CLUSTER_SERVER_PORT = 18730; - const DEFAULT_NAMESPACE = 'default'; - const DEFAULT_MAX_ALLOWED_QPS = 20000; - - // tmp for dialog temporary data. - $scope.tmp = { - curClientChosen: [], - curRemainingClientChosen: [], - curChosenServer: {}, - }; - - $scope.remainingMachineList = []; - - function convertSetToString(set) { - if (set === undefined) { - return ''; - } - if (set.length === 1 && set[0] === DEFAULT_NAMESPACE) { - return DEFAULT_NAMESPACE; - } - let s = ''; - for (let i = 0; i < set.length; i++) { - let ns = set[i]; - if (ns !== DEFAULT_NAMESPACE) { - s = s + ns; - if (i < set.length - 1) { - s = s + ','; - } - } - } - return s; - } - - function convertStrToNamespaceSet(str) { - if (str === undefined || str === '') { - return []; - } - let arr = []; - let spliced = str.split(','); - spliced.forEach((v) => { - arr.push(v.trim()); - }); - return arr; - } - - function processAppSingleData(data) { - if (data.state.server && data.state.server.namespaceSet) { - data.state.server.namespaceSetStr = convertSetToString(data.state.server.namespaceSet); - data.mode = data.state.stateInfo.mode; - } - } - - function removeFromArr(arr, v) { - for (let i = 0; i < arr.length; i++) { - if (arr[i] === v) { - arr.splice(i, 1); - break; - } - } - } - - function removeFromArrIf(arr, f) { - for (let i = 0; i < arr.length; i++) { - if (f(arr[i]) === true) { - arr.splice(i, 1); - break; - } - } - } - - function resetAssignDialogChosen() { - $scope.tmp.curClientChosen = []; - $scope.tmp.curRemainingClientChosen = []; - } - - function generateMachineId(e) { - return e.ip + '@' + e.commandPort; - } - - function applyClusterMap(appClusterMachineList) { - if (!appClusterMachineList) { - return; - } - let tmpMap = new Map(); - let serverCommandPortMap = new Map(); - $scope.clusterMap = []; - $scope.remainingMachineList = []; - let tmpServerList = []; - let tmpClientList = []; - appClusterMachineList.forEach((e) => { - if (e.mode === CLUSTER_MODE_CLIENT) { - tmpClientList.push(e); - } else if (e.mode === CLUSTER_MODE_SERVER) { - tmpServerList.push(e); - } else { - $scope.remainingMachineList.push(generateMachineId(e)); - } - }); - tmpServerList.forEach((e) => { - let ip = e.ip; - let machineId = ip + '@' + e.commandPort; - let group = { - ip: ip, - machineId: machineId, - port: e.state.server.port, - clientSet: [], - namespaceSetStr: e.state.server.namespaceSetStr, - maxAllowedQps: e.state.server.flow.maxAllowedQps, - belongToApp: true, - }; - if (!tmpMap.has(machineId)) { - tmpMap.set(machineId, group); - } - serverCommandPortMap.set(ip + ':' + e.state.server.port, e.commandPort); - }); - tmpClientList.forEach((e) => { - let ip = e.ip; - let machineId = ip + '@' + e.commandPort; - - let targetServer = e.state.client.clientConfig.serverHost; - let targetPort = e.state.client.clientConfig.serverPort; - if (targetServer === undefined || targetServer === '' || - targetPort === undefined || targetPort <= 0) { - $scope.remainingMachineList.push(generateMachineId(e)); - return; - } - - let serverHostPort = targetServer + ':' + targetPort; - - if (serverCommandPortMap.has(serverHostPort)) { - let serverCommandPort = serverCommandPortMap.get(serverHostPort); - let g; - if (serverCommandPort < 0) { - // Not belong to this app. - g = tmpMap.get(serverHostPort); - } else { - // Belong to this app. - g = tmpMap.get(targetServer + '@' + serverCommandPort); - } - g.clientSet.push(machineId); - } else { - let group = { - ip: targetServer, - machineId: serverHostPort, - port: targetPort, - clientSet: [machineId], - belongToApp: false, - }; - tmpMap.set(serverHostPort, group); - // Indicates that it's not belonging to current app. - serverCommandPortMap.set(serverHostPort, -1); - } - - // if (!tmpMap.has(serverHostPort)) { - // let group = { - // ip: targetServer, - // machineId: targetServer, - // port: targetPort, - // clientSet: [machineId], - // belongToApp: false, - // }; - // tmpMap.set(targetServer, group); - // } else { - // let g = tmpMap.get(targetServer); - // g.clientSet.push(machineId); - // } - }); - tmpMap.forEach((v) => { - if (v !== undefined) { - $scope.clusterMap.push(v); - } - }); - } - - $scope.notChosenServer = (id) => { - return id !== $scope.serverAssignDialogData.serverData.currentServer; - }; - - $scope.onCurrentServerChange = () => { - resetAssignDialogChosen(); - }; - - $scope.moveToServerGroup = () => { - $scope.tmp.curRemainingClientChosen.forEach(e => { - $scope.serverAssignDialogData.serverData.clientSet.push(e); - removeFromArr($scope.remainingMachineList, e); - }); - resetAssignDialogChosen(); - }; - - $scope.moveToRemainingSharePool = () => { - $scope.tmp.curClientChosen.forEach(e => { - $scope.remainingMachineList.push(e); - removeFromArr($scope.serverAssignDialogData.serverData.clientSet, e); - }); - resetAssignDialogChosen(); - }; - - function parseIpFromMachineId(machineId) { - if (machineId.indexOf(':') !== -1) { - return machineId.split(':')[0]; - } - if (machineId.indexOf('@') === -1) { - return machineId; - } - let arr = machineId.split('@'); - return arr[0]; - } - - function retrieveClusterAssignInfoOfApp() { - ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.appClusterMachineList = data.data; - $scope.appClusterMachineList.forEach(processAppSingleData); - applyClusterMap($scope.appClusterMachineList); - } else { - $scope.appClusterMachineList = {}; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error(() => { - $scope.loadError = {message: '未知错误'}; - }); - } - - - $scope.newServerDialog = () => { - retrieveClusterAssignInfoOfApp(); - $scope.serverAssignDialogData = { - title: '新增 Token Server', - type: 'add', - confirmBtnText: '保存', - serverData: { - serverType: 0, - clientSet: [], - serverPort: DEFAULT_CLUSTER_SERVER_PORT, - maxAllowedQps: DEFAULT_MAX_ALLOWED_QPS, - } - }; - $scope.serverAssignDialog = ngDialog.open({ - template: '/app/views/dialog/cluster/cluster-server-assign-dialog.html', - width: 1000, - overlay: true, - scope: $scope - }); - }; - - $scope.modifyServerAssignConfig = (serverVO) => { - let id = serverVO.id; - ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.appClusterMachineList = data.data; - $scope.appClusterMachineList.forEach(processAppSingleData); - applyClusterMap($scope.appClusterMachineList); - let clusterMap = $scope.clusterMap; - let d; - for (let i = 0; i < clusterMap.length; i++) { - if (clusterMap[i].machineId === id) { - d = clusterMap[i]; - } - } - if (!d) { - alert('状态错误'); - return; - } - $scope.serverAssignDialogData = { - title: 'Token Server 分配编辑', - type: 'edit', - confirmBtnText: '保存', - serverData: { - currentServer: d.machineId, - belongToApp: serverVO.belongToApp, - serverPort: d.port, - clientSet: d.clientSet, - } - }; - if (d.maxAllowedQps !== undefined) { - $scope.serverAssignDialogData.serverData.maxAllowedQps = d.maxAllowedQps; - } - $scope.serverAssignDialog = ngDialog.open({ - template: '/app/views/dialog/cluster/cluster-server-assign-dialog.html', - width: 1000, - overlay: true, - scope: $scope - }); - } else { - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error(() => { - $scope.loadError = {message: '未知错误'}; - }); - }; - - function getRemainingMachineList() { - return $scope.remainingMachineList.filter((e) => $scope.notChosenServer(e)); - } - - function doApplyNewSingleServerAssign() { - let ok = confirm('是否确认执行变更?'); - if (!ok) { - return; - } - let serverData = $scope.serverAssignDialogData.serverData; - let belongToApp = serverData.serverType == 0; // don't modify here! - let machineId = serverData.currentServer; - let request = { - clusterMap: { - machineId: machineId, - ip: parseIpFromMachineId(machineId), - port: serverData.serverPort, - clientSet: serverData.clientSet, - belongToApp: belongToApp, - maxAllowedQps: serverData.maxAllowedQps, - }, - remainingList: getRemainingMachineList(), - }; - ClusterStateService.applyClusterSingleServerAssignOfApp($scope.app, request).success((data) => { - if (data.code === 0 && data.data) { - let failedServerSet = data.data.failedServerSet; - let failedClientSet = data.data.failedClientSet; - if (failedClientSet.length === 0 && failedServerSet.length === 0) { - alert('全部推送成功'); - } else { - let failedSet = []; - if (failedServerSet) { - failedServerSet.forEach((e) => { - failedSet.push(e); - }); - } - if (failedClientSet) { - failedClientSet.forEach((e) => { - failedSet.push(e); - }); - } - - alert('推送完毕。失败机器列表:' + JSON.stringify(failedSet)); - } - - location.reload(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('推送失败:' + data.msg); - } - } - }).error(() => { - alert('未知错误'); - }); - } - - function doApplySingleServerAssignEdit() { - let ok = confirm('是否确认执行变更?'); - if (!ok) { - return; - } - let serverData = $scope.serverAssignDialogData.serverData; - let machineId = serverData.currentServer; - let request = { - clusterMap: { - machineId: machineId, - ip: parseIpFromMachineId(machineId), - port: serverData.serverPort, - clientSet: serverData.clientSet, - belongToApp: serverData.belongToApp, - }, - remainingList: $scope.remainingMachineList, - }; - if (serverData.maxAllowedQps !== undefined) { - request.clusterMap.maxAllowedQps = serverData.maxAllowedQps; - } - ClusterStateService.applyClusterSingleServerAssignOfApp($scope.app, request).success((data) => { - if (data.code === 0 && data.data) { - let failedServerSet = data.data.failedServerSet; - let failedClientSet = data.data.failedClientSet; - if (failedClientSet.length === 0 && failedServerSet.length === 0) { - alert('全部推送成功'); - } else { - let failedSet = []; - failedServerSet.forEach(failedSet.push); - failedClientSet.forEach(failedSet.push); - alert('推送完毕。失败机器列表:' + JSON.stringify(failedSet)); - } - - location.reload(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('推送失败:' + data.msg); - } - } - }).error(() => { - alert('未知错误'); - }); - } - - $scope.saveAssignForDialog = () => { - if (!checkAssignDialogValid()) { - return; - } - if ($scope.serverAssignDialogData.type === 'add') { - doApplyNewSingleServerAssign(); - } else if ($scope.serverAssignDialogData.type === 'edit') { - doApplySingleServerAssignEdit(); - } else { - alert('未知的操作'); - } - }; - - function checkAssignDialogValid() { - let serverData = $scope.serverAssignDialogData.serverData; - if (serverData.currentServer === undefined || serverData.currentServer === '') { - alert('请指定有效的 Token Server'); - return false; - } - if (serverData.serverPort === undefined || serverData.serverPort <= 0 || serverData.serverPort > 65535) { - alert('请输入合法的端口值'); - return false; - } - if (serverData.maxAllowedQps !== undefined && serverData.maxAllowedQps < 0) { - alert('请输入合法的最大允许 QPS'); - return false; - } - return true; - } - - $scope.viewConnectionDetail = (serverVO) => { - $scope.connectionDetailDialogData = { - serverData: serverVO - }; - $scope.connectionDetailDialog = ngDialog.open({ - template: '/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html', - width: 700, - overlay: true, - scope: $scope - }); - }; - - function generateRequestLimitDataStr(limitData) { - if (limitData.length === 1 && limitData[0].namespace === DEFAULT_NAMESPACE) { - return 'default: ' + limitData[0].currentQps + ' / ' + limitData[0].maxAllowedQps; - } - for (let i = 0; i < limitData.length; i++) { - let crl = limitData[i]; - if (crl.namespace === $scope.app) { - return '' + crl.currentQps + ' / ' + crl.maxAllowedQps; - } - } - return '0'; - } - - function processServerListData(serverVO) { - if (serverVO.state && serverVO.state.namespaceSet) { - serverVO.state.namespaceSetStr = convertSetToString(serverVO.state.namespaceSet); - } - if (serverVO.state && serverVO.state.requestLimitData) { - serverVO.state.requestLimitDataStr = generateRequestLimitDataStr(serverVO.state.requestLimitData); - } - } - - $scope.generateConnectionSet = (data) => { - let connectionSet = data; - let s = ''; - if (connectionSet) { - s = s + '['; - for (let i = 0; i < connectionSet.length; i++) { - s = s + connectionSet[i].address; - if (i < connectionSet.length - 1) { - s = s + ', '; - } - } - s = s + ']'; - } else { - s = '[]'; - } - return s; - }; - - function retrieveClusterServerInfo() { - ClusterStateService.fetchClusterServerStateOfApp($scope.app).success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.serverVOList = data.data; - $scope.serverVOList.forEach(processServerListData); - } else { - $scope.serverVOList = {}; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error(() => { - $scope.loadError = {message: '未知错误'}; - }); - } - - retrieveClusterServerInfo(); - - let confirmUnbindServerDialog; - $scope.unbindServer = (id) => { - $scope.pendingUnbindIds = [id]; - $scope.confirmDialog = { - title: '移除 Token Server', - type: 'unbind_token_server', - attentionTitle: '请确认是否移除以下 Token Server(该 server 下的 client 也会解除分配)', - attention: id + '', - confirmBtnText: '移除', - }; - confirmUnbindServerDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - function apiUnbindServerAssign(ids) { - ClusterStateService.applyClusterServerBatchUnbind($scope.app, ids).success((data) => { - if (data.code === 0 && data.data) { - let failedServerSet = data.data.failedServerSet; - let failedClientSet = data.data.failedClientSet; - if (failedClientSet.length === 0 && failedServerSet.length === 0) { - alert('成功'); - } else { - alert('操作推送完毕,部分失败机器列表:' + JSON.stringify(failedClientSet)); - } - - location.reload(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('推送失败:' + data.msg); - } - } - }).error(() => { - alert('未知错误'); - }); - // confirmUnbindServerDialog.close(); - } - - // Confirm function for confirm dialog. - $scope.confirm = () => { - if ($scope.confirmDialog.type === 'unbind_token_server') { - apiUnbindServerAssign($scope.pendingUnbindIds); - } else { - console.error('Error dialog when unbinding token server'); - } - }; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js deleted file mode 100644 index 6f9367d6..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_manage.js +++ /dev/null @@ -1,283 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SentinelClusterAppAssignManageController', ['$scope', '$stateParams', 'ngDialog', - 'MachineService', 'ClusterStateService', - function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { - $scope.app = $stateParams.app; - const UNSUPPORTED_CODE = 4041; - - const CLUSTER_MODE_CLIENT = 0; - const CLUSTER_MODE_SERVER = 1; - const DEFAULT_CLUSTER_SERVER_PORT = 18730; - - $scope.tmp = { - curClientChosen: [], - curRemainingClientChosen: [], - curChosenServer: {}, - }; - - function convertSetToString(set) { - if (set === undefined) { - return ''; - } - let s = ''; - for (let i = 0; i < set.length; i++) { - s = s + set[i]; - if (i < set.length - 1) { - s = s + ','; - } - } - return s; - } - - function convertStrToNamespaceSet(str) { - if (str === undefined || str === '') { - return []; - } - let arr = []; - let spliced = str.split(','); - spliced.forEach((v) => { - arr.push(v.trim()); - }); - return arr; - } - - function processAppSingleData(data) { - if (data.state.server && data.state.server.namespaceSet) { - data.state.server.namespaceSetStr = convertSetToString(data.state.server.namespaceSet); - data.mode = data.state.stateInfo.mode; - } - } - - function removeFromArr(arr, v) { - for (let i = 0; i < arr.length; i++) { - if (arr[i] === v) { - arr.splice(i, 1); - break; - } - } - } - - function resetChosen() { - $scope.tmp.curClientChosen = []; - $scope.tmp.curRemainingClientChosen = []; - } - - function generateMachineId(e) { - return e.ip + '@' + e.commandPort; - } - - function applyClusterMap(appClusterMachineList) { - if (!appClusterMachineList) { - return; - } - let tmpMap = new Map(); - $scope.clusterMap = []; - $scope.remainingClientAddressList = []; - let tmpServerList = []; - let tmpClientList = []; - appClusterMachineList.forEach((e) => { - if (e.mode === CLUSTER_MODE_CLIENT) { - tmpClientList.push(e); - } else if (e.mode === CLUSTER_MODE_SERVER) { - tmpServerList.push(e); - } else { - $scope.remainingClientAddressList.push(generateMachineId(e)); - } - }); - tmpServerList.forEach((e) => { - let ip = e.ip; - let machineId = ip + '@' + e.commandPort; - let group = { - ip: ip, - machineId: machineId, - port: e.state.server.port, - clientSet: [], - namespaceSetStr: e.state.server.namespaceSetStr, - belongToApp: true, - }; - if (!tmpMap.has(ip)) { - tmpMap.set(ip, group); - } - }); - tmpClientList.forEach((e) => { - let ip = e.ip; - let machineId = ip + '@' + e.commandPort; - - let targetServer = e.state.client.clientConfig.serverHost; - let targetPort = e.state.client.clientConfig.serverPort; - if (targetServer === undefined || targetServer === '' || - targetPort === undefined || targetPort <= 0) { - $scope.remainingClientAddressList.push(generateMachineId(e)); - return; - } - - if (!tmpMap.has(targetServer)) { - let group = { - ip: targetServer, - machineId: targetServer, - port: targetPort, - clientSet: [machineId], - belongToApp: false, - }; - tmpMap.set(targetServer, group); - } else { - let g = tmpMap.get(targetServer); - g.clientSet.push(machineId); - } - }); - tmpMap.forEach((v) => { - if (v !== undefined) { - $scope.clusterMap.push(v); - } - }); - } - - $scope.onCurrentServerChange = () => { - resetChosen(); - }; - - $scope.remainingClientAddressList = []; - - $scope.moveToServerGroup = () => { - let chosenServer = $scope.tmp.curChosenServer; - if (!chosenServer || !chosenServer.machineId) { - return; - } - $scope.tmp.curRemainingClientChosen.forEach(e => { - chosenServer.clientSet.push(e); - removeFromArr($scope.remainingClientAddressList, e); - }); - resetChosen(); - }; - - $scope.moveToRemainingSharePool = () => { - $scope.tmp.curClientChosen.forEach(e => { - $scope.remainingClientAddressList.push(e); - removeFromArr($scope.tmp.curChosenServer.clientSet, e); - }); - resetChosen(); - }; - - function parseIpFromMachineId(machineId) { - if (machineId.indexOf('@') === -1) { - return machineId; - } - let arr = machineId.split('@'); - return arr[0]; - } - - $scope.addToServerList = () => { - let group; - $scope.tmp.curRemainingClientChosen.forEach(e => { - group = { - machineId: e, - ip: parseIpFromMachineId(e), - port: DEFAULT_CLUSTER_SERVER_PORT, - clientSet: [], - namespaceSetStr: 'default,' + $scope.app, - belongToApp: true, - }; - $scope.clusterMap.push(group); - removeFromArr($scope.remainingClientAddressList, e); - $scope.tmp.curChosenServer = group; - }); - resetChosen(); - }; - - $scope.removeFromServerList = () => { - let chosenServer = $scope.tmp.curChosenServer; - if (!chosenServer || !chosenServer.machineId) { - return; - } - chosenServer.clientSet.forEach((e) => { - if (e !== undefined) { - $scope.remainingClientAddressList.push(e); - } - }); - - if (chosenServer.belongToApp || chosenServer.machineId.indexOf('@') !== -1) { - $scope.remainingClientAddressList.push(chosenServer.machineId); - } else { - alert('提示:非本应用内机器将不会置回空闲列表中'); - } - - removeFromArr($scope.clusterMap, chosenServer); - - resetChosen(); - - if ($scope.clusterMap.length > 0) { - $scope.tmp.curChosenServer = $scope.clusterMap[0]; - $scope.onCurrentServerChange(); - } else { - $scope.tmp.curChosenServer = {}; - } - }; - - function retrieveClusterAppInfo() { - ClusterStateService.fetchClusterUniversalStateOfApp($scope.app).success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.appClusterMachineList = data.data; - $scope.appClusterMachineList.forEach(processAppSingleData); - applyClusterMap($scope.appClusterMachineList); - if ($scope.clusterMap.length > 0) { - $scope.tmp.curChosenServer = $scope.clusterMap[0]; - $scope.onCurrentServerChange(); - } - } else { - $scope.appClusterMachineList = {}; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error(() => { - $scope.loadError = {message: '未知错误'}; - }); - } - - retrieveClusterAppInfo(); - - $scope.saveAndApplyAssign = () => { - let ok = confirm('是否确认执行变更?'); - if (!ok) { - return; - } - let cm = $scope.clusterMap; - if (!cm) { - cm = []; - } - cm.forEach((e) => { - e.namespaceSet = convertStrToNamespaceSet(e.namespaceSetStr); - }); - cm.namespaceSet = convertStrToNamespaceSet(cm.namespaceSetStr); - let request = { - clusterMap: cm, - remainingList: $scope.remainingClientAddressList, - }; - ClusterStateService.applyClusterFullAssignOfApp($scope.app, request).success((data) => { - if (data.code === 0 && data.data) { - let failedServerSet = data.data.failedServerSet; - let failedClientSet = data.data.failedClientSet; - if (failedClientSet.length === 0 && failedServerSet.length === 0) { - alert('全部推送成功'); - } else { - alert('推送完毕。token server 失败列表:' + JSON.stringify(failedServerSet) + - '; token client 失败列表:' + JSON.stringify(failedClientSet)); - } - - retrieveClusterAppInfo(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('推送失败:' + data.msg); - } - } - }).error(() => { - alert('未知错误'); - }); - }; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js deleted file mode 100644 index 202fca1b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_server_monitor.js +++ /dev/null @@ -1,97 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SentinelClusterAppServerMonitorController', ['$scope', '$stateParams', 'ngDialog', - 'MachineService', 'ClusterStateService', - function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { - $scope.app = $stateParams.app; - const UNSUPPORTED_CODE = 4041; - - const CLUSTER_MODE_SERVER = 1; - - $scope.tmp = { - curChosenServer: {}, - }; - - function convertSetToString(set) { - if (set === undefined) { - return ''; - } - let s = ''; - for (let i = 0; i < set.length; i++) { - s = s + set[i]; - if (i < set.length - 1) { - s = s + ','; - } - } - return s; - } - - function processServerData(serverVO) { - if (serverVO.state && serverVO.state.namespaceSet) { - serverVO.state.namespaceSetStr = convertSetToString(serverVO.state.namespaceSet); - } - } - - $scope.generateConnectionSet = (data) => { - let connectionSet = data; - let s = ''; - if (connectionSet) { - s = s + '['; - for (let i = 0; i < connectionSet.length; i++) { - s = s + connectionSet[i].address; - if (i < connectionSet.length - 1) { - s = s + ', '; - } - } - s = s + ']'; - } else { - s = '[]'; - } - return s; - }; - - $scope.onChosenServerChange = () => { - - }; - - function retrieveClusterServerInfo() { - ClusterStateService.fetchClusterServerStateOfApp($scope.app).success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.serverVOList = data.data; - $scope.serverVOList.forEach(processServerData); - - if ($scope.serverVOList.length > 0) { - $scope.tmp.curChosenServer = $scope.serverVOList[0]; - $scope.onChosenServerChange(); - } - } else { - $scope.serverVOList = {}; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error(() => { - $scope.loadError = {message: '未知错误'}; - }); - } - - retrieveClusterServerInfo(); - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js deleted file mode 100644 index 177161b8..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_app_token_client_list.js +++ /dev/null @@ -1,121 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SentinelClusterAppTokenClientListController', ['$scope', '$stateParams', 'ngDialog', - 'MachineService', 'ClusterStateService', - function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { - $scope.app = $stateParams.app; - - const UNSUPPORTED_CODE = 4041; - const CLUSTER_MODE_CLIENT = 0; - const CLUSTER_MODE_SERVER = 1; - - function processClientData(clientVO) { - - } - - $scope.modifyClientConfigDialog = (clientVO) => { - if (!clientVO) { - return; - } - $scope.ccDialogData = { - ip: clientVO.ip, - commandPort: clientVO.commandPort, - clientId: clientVO.id, - serverHost: clientVO.state.clientConfig.serverHost, - serverPort: clientVO.state.clientConfig.serverPort, - requestTimeout: clientVO.state.clientConfig.requestTimeout, - }; - $scope.ccDialog = ngDialog.open({ - template: '/app/views/dialog/cluster/cluster-client-config-dialog.html', - width: 700, - overlay: true, - scope: $scope - }); - }; - - function checkValidClientConfig(config) { - if (!config.serverHost || config.serverHost.trim() == '') { - alert('请输入有效的 Token Server IP'); - return false; - } - if (config.serverPort === undefined || config.serverPort <= 0 || config.serverPort > 65535) { - alert('请输入有效的 Token Server 端口'); - return false; - } - if (config.requestTimeout === undefined || config.requestTimeout <= 0) { - alert('请输入有效的请求超时时长'); - return false; - } - return true; - } - - $scope.doModifyClientConfig = () => { - if (!checkValidClientConfig($scope.ccDialogData)) { - return; - } - let id = $scope.ccDialogData.id; - let request = { - app: $scope.app, - ip: $scope.ccDialogData.ip, - port: $scope.ccDialogData.commandPort, - mode: CLUSTER_MODE_CLIENT, - clientConfig: { - serverHost: $scope.ccDialogData.serverHost, - serverPort: $scope.ccDialogData.serverPort, - requestTimeout: $scope.ccDialogData.requestTimeout, - } - }; - ClusterStateService.modifyClusterConfig(request).success((data) => { - if (data.code === 0 && data.data) { - alert('修改 Token Client 配置成功'); - window.location.reload(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('机器 ' + id + ' 的 Sentinel 没有引入集群限流客户端,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('修改失败:' + data.msg); - } - } - }).error((data, header, config, status) => { - alert('未知错误'); - }); - }; - - function retrieveClusterTokenClientInfo() { - ClusterStateService.fetchClusterClientStateOfApp($scope.app) - .success((data) => { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.clientVOList = data.data; - $scope.clientVOList.forEach(processClientData); - } else { - $scope.clientVOList = []; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '该应用的 Sentinel 客户端不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }) - .error(() => { - $scope.loadError = {message: '未知错误'}; - }); - } - - retrieveClusterTokenClientInfo(); - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js deleted file mode 100644 index 7392229d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/cluster_single.js +++ /dev/null @@ -1,262 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SentinelClusterSingleController', ['$scope', '$stateParams', 'ngDialog', - 'MachineService', 'ClusterStateService', - function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) { - $scope.app = $stateParams.app; - const UNSUPPORTED_CODE = 4041; - - const CLUSTER_MODE_CLIENT = 0; - const CLUSTER_MODE_SERVER = 1; - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - function convertSetToString(set) { - if (set === undefined) { - return ''; - } - let s = ''; - for (let i = 0; i < set.length; i++) { - s = s + set[i]; - if (i < set.length - 1) { - s = s + ','; - } - } - return s; - } - - function convertStrToNamespaceSet(str) { - if (str === undefined || str === '') { - return []; - } - let arr = []; - let spliced = str.split(','); - spliced.forEach((v) => { - arr.push(v.trim()); - }); - return arr; - } - - function fetchMachineClusterState() { - if (!$scope.macInputModel || $scope.macInputModel === '') { - return; - } - let mac = $scope.macInputModel.split(':'); - ClusterStateService.fetchClusterUniversalStateSingle($scope.app, mac[0], mac[1]).success(function (data) { - if (data.code == 0 && data.data) { - $scope.loadError = undefined; - $scope.stateVO = data.data; - $scope.stateVO.currentMode = $scope.stateVO.stateInfo.mode; - if ($scope.stateVO.server && $scope.stateVO.server.namespaceSet) { - $scope.stateVO.server.namespaceSetStr = convertSetToString($scope.stateVO.server.namespaceSet); - } - } else { - $scope.stateVO = {}; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: '机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'} - } else { - $scope.loadError = {message: data.msg}; - } - } - }).error((data, header, config, status) => { - $scope.loadError = {message: '未知错误'}; - }); - } - - fetchMachineClusterState(); - - function checkValidClientConfig(stateVO) { - if (!stateVO.client || !stateVO.client.clientConfig) { - alert('不合法的配置'); - return false; - } - let config = stateVO.client.clientConfig; - if (!config.serverHost || config.serverHost.trim() == '') { - alert('请输入有效的 Token Server IP'); - return false; - } - if (config.serverPort === undefined || config.serverPort <= 0 || config.serverPort > 65535) { - alert('请输入有效的 Token Server 端口'); - return false; - } - if (config.requestTimeout === undefined || config.requestTimeout <= 0) { - alert('请输入有效的请求超时时长'); - return false; - } - return true; - } - - function sendClusterClientRequest(stateVO) { - if (!checkValidClientConfig(stateVO)) { - return; - } - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - let request = { - app: $scope.app, - ip: mac[0], - port: mac[1], - }; - request.mode = CLUSTER_MODE_CLIENT; - request.clientConfig = stateVO.client.clientConfig; - ClusterStateService.modifyClusterConfig(request).success(function (data) { - if (data.code == 0 && data.data) { - alert('修改集群限流客户端配置成功'); - window.location.reload(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流客户端,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('修改失败:' + data.msg); - } - } - }).error((data, header, config, status) => { - alert('未知错误'); - }); - } - - function checkValidServerConfig(stateVO) { - if (!stateVO.server || !stateVO.server.transport) { - alert('不合法的配置'); - return false; - } - if (stateVO.server.namespaceSetStr === undefined || stateVO.server.namespaceSetStr == '') { - alert('请输入有效的命名空间集合(多个 namespace 以 , 分隔)'); - return false; - } - let transportConfig = stateVO.server.transport; - if (transportConfig.port === undefined || transportConfig.port <= 0 || transportConfig.port > 65535) { - alert('请输入有效的 Token Server 端口'); - return false; - } - let flowConfig = stateVO.server.flow; - if (flowConfig.maxAllowedQps === undefined || flowConfig.maxAllowedQps < 0) { - alert('请输入有效的最大允许 QPS'); - return false; - } - // if (transportConfig.idleSeconds === undefined || transportConfig.idleSeconds <= 0) { - // alert('请输入有效的连接清理时长 (idleSeconds)'); - // return false; - // } - return true; - } - - function sendClusterServerRequest(stateVO) { - if (!checkValidServerConfig(stateVO)) { - return; - } - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - let request = { - app: $scope.app, - ip: mac[0], - port: mac[1], - }; - request.mode = CLUSTER_MODE_SERVER; - request.flowConfig = stateVO.server.flow; - request.transportConfig = stateVO.server.transport; - request.namespaceSet = convertStrToNamespaceSet(stateVO.server.namespaceSetStr); - ClusterStateService.modifyClusterConfig(request).success(function (data) { - if (data.code == 0 && data.data) { - alert('修改集群限流服务端配置成功'); - window.location.reload(); - } else { - if (data.code === UNSUPPORTED_CODE) { - alert('机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流服务端,请升级至 1.4.0 以上版本并引入相关依赖。'); - } else { - alert('修改失败:' + data.msg); - } - } - }).error((data, header, config, status) => { - alert('未知错误'); - }); - } - - - $scope.saveConfig = () => { - let ok = confirm('是否确定修改集群限流配置?'); - if (!ok) { - return; - } - let mode = $scope.stateVO.stateInfo.mode; - if (mode != 1 && mode != 0) { - alert('未知的集群限流模式'); - return; - } - if (mode == 0) { - sendClusterClientRequest($scope.stateVO); - } else { - sendClusterServerRequest($scope.stateVO); - } - }; - - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code === 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptionsOrigin = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptionsOrigin.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - $scope.macsInputOptions = $scope.macsInputOptionsOrigin; - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - } - queryAppMachines(); - - $scope.$watch('searchKey', function () { - if (!$scope.macsInputOptions) { - return; - } - if ($scope.searchKey) { - $scope.macsInputOptions = $scope.macsInputOptionsOrigin - .filter((e) => e.value.indexOf($scope.searchKey) !== -1); - } else { - $scope.macsInputOptions = $scope.macsInputOptionsOrigin; - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } else { - $scope.macInputModel = ''; - } - }); - - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - fetchMachineClusterState(); - } - }); - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js deleted file mode 100644 index d2eac6da..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/degrade.js +++ /dev/null @@ -1,204 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('DegradeCtl', ['$scope', '$stateParams', 'DegradeService', 'ngDialog', 'MachineService', - function ($scope, $stateParams, DegradeService, ngDialog, MachineService) { - //初始化 - $scope.app = $stateParams.app; - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - getMachineRules(); - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - DegradeService.queryMachineRules($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.rules = data.data; - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - } - }); - }; - $scope.getMachineRules = getMachineRules; - - var degradeRuleDialog; - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - $scope.degradeRuleDialog = { - title: '编辑降级规则', - type: 'edit', - confirmBtnText: '保存' - }; - degradeRuleDialog = ngDialog.open({ - template: '/app/views/dialog/degrade-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - grade: 0, - app: $scope.app, - ip: mac[0], - port: mac[1], - limitApp: 'default', - minRequestAmount: 5, - statIntervalMs: 1000, - }; - $scope.degradeRuleDialog = { - title: '新增降级规则', - type: 'add', - confirmBtnText: '新增' - }; - degradeRuleDialog = ngDialog.open({ - template: '/app/views/dialog/degrade-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.saveRule = function () { - if (!DegradeService.checkRuleValid($scope.currentRule)) { - return; - } - if ($scope.degradeRuleDialog.type === 'add') { - addNewRule($scope.currentRule); - } else if ($scope.degradeRuleDialog.type === 'edit') { - saveRule($scope.currentRule, true); - } - }; - - function parseDegradeMode(grade) { - switch (grade) { - case 0: - return '慢调用比例'; - case 1: - return '异常比例'; - case 2: - return '异常数'; - default: - return '未知'; - } - } - - var confirmDialog; - $scope.deleteRule = function (rule) { - $scope.currentRule = rule; - $scope.confirmDialog = { - title: '删除降级规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下降级规则', - attention: '资源名: ' + rule.resource + - ', 降级模式: ' + parseDegradeMode(rule.grade) + ', 阈值: ' + rule.count, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type == 'delete_rule') { - deleteRule($scope.currentRule); - } else { - console.error('error'); - } - }; - - function deleteRule(rule) { - DegradeService.deleteRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - confirmDialog.close(); - } else { - alert('失败:' + data.msg); - } - }); - }; - - function addNewRule(rule) { - DegradeService.newRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - degradeRuleDialog.close(); - } else { - alert('失败:' + data.msg); - } - }); - }; - - function saveRule(rule, edit) { - DegradeService.saveRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - if (edit) { - degradeRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('失败:' + data.msg); - } - }); - } - queryAppMachines(); - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - } - }); - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js deleted file mode 100644 index 3c644937..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v1.js +++ /dev/null @@ -1,220 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('FlowControllerV1', ['$scope', '$stateParams', 'FlowServiceV1', 'ngDialog', - 'MachineService', - function ($scope, $stateParams, FlowService, ngDialog, - MachineService) { - $scope.app = $stateParams.app; - - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - $scope.generateThresholdTypeShow = (rule) => { - if (!rule.clusterMode) { - return '单机'; - } - if (rule.clusterConfig.thresholdType === 0) { - return '集群均摊'; - } else if (rule.clusterConfig.thresholdType === 1) { - return '集群总体'; - } else { - return '集群'; - } - }; - - getMachineRules(); - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - FlowService.queryMachineRules($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.rules = data.data; - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - } - }); - }; - $scope.getMachineRules = getMachineRules; - - var flowRuleDialog; - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - $scope.flowRuleDialog = { - title: '编辑流控规则', - type: 'edit', - confirmBtnText: '保存', - showAdvanceButton: rule.controlBehavior == 0 && rule.strategy == 0 - }; - flowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/flow-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - grade: 1, - strategy: 0, - controlBehavior: 0, - app: $scope.app, - ip: mac[0], - port: mac[1], - limitApp: 'default', - clusterMode: false, - clusterConfig: { - thresholdType: 0 - } - }; - $scope.flowRuleDialog = { - title: '新增流控规则', - type: 'add', - confirmBtnText: '新增', - showAdvanceButton: true, - }; - flowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/flow-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.saveRule = function () { - if (!FlowService.checkRuleValid($scope.currentRule)) { - return; - } - if ($scope.flowRuleDialog.type === 'add') { - addNewRule($scope.currentRule); - } else if ($scope.flowRuleDialog.type === 'edit') { - saveRule($scope.currentRule, true); - } - }; - - var confirmDialog; - $scope.deleteRule = function (rule) { - $scope.currentRule = rule; - $scope.confirmDialog = { - title: '删除流控规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下流控规则', - attention: '资源名: ' + rule.resource + ', 流控应用: ' + rule.limitApp - + ', 阈值类型: ' + (rule.grade == 0 ? '线程数' : 'QPS') + ', 阈值: ' + rule.count, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type === 'delete_rule') { - deleteRule($scope.currentRule); - } else { - console.error('error'); - } - }; - - function deleteRule(rule) { - FlowService.deleteRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - confirmDialog.close(); - } else { - alert('失败:' + data.msg); - } - }); - }; - - function addNewRule(rule) { - FlowService.newRule(rule).success(function (data) { - if (data.code === 0) { - getMachineRules(); - flowRuleDialog.close(); - } else { - alert('失败:' + data.msg); - } - }); - }; - - $scope.onOpenAdvanceClick = function () { - $scope.flowRuleDialog.showAdvanceButton = false; - }; - $scope.onCloseAdvanceClick = function () { - $scope.flowRuleDialog.showAdvanceButton = true; - }; - - function saveRule(rule, edit) { - FlowService.saveRule(rule).success(function (data) { - if (data.code === 0) { - getMachineRules(); - if (edit) { - flowRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('失败:' + data.msg); - } - }); - } - queryAppMachines(); - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - } - }); - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js deleted file mode 100644 index 3280675b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/flow_v2.js +++ /dev/null @@ -1,221 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('FlowControllerV2', ['$scope', '$stateParams', 'FlowServiceV2', 'ngDialog', - 'MachineService', - function ($scope, $stateParams, FlowService, ngDialog, - MachineService) { - $scope.app = $stateParams.app; - - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - $scope.generateThresholdTypeShow = (rule) => { - if (!rule.clusterMode) { - return '单机'; - } - if (rule.clusterConfig.thresholdType === 0) { - return '集群均摊'; - } else if (rule.clusterConfig.thresholdType === 1) { - return '集群总体'; - } else { - return '集群'; - } - }; - - getMachineRules(); - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - FlowService.queryMachineRules($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.rules = data.data; - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - } - }); - }; - $scope.getMachineRules = getMachineRules; - - var flowRuleDialog; - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - $scope.flowRuleDialog = { - title: '编辑流控规则', - type: 'edit', - confirmBtnText: '保存', - showAdvanceButton: rule.controlBehavior == 0 && rule.strategy == 0 - }; - flowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/flow-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - grade: 1, - strategy: 0, - controlBehavior: 0, - app: $scope.app, - ip: mac[0], - port: mac[1], - limitApp: 'default', - clusterMode: false, - clusterConfig: { - thresholdType: 0, - fallbackToLocalWhenFail: true - } - }; - $scope.flowRuleDialog = { - title: '新增流控规则', - type: 'add', - confirmBtnText: '新增', - showAdvanceButton: true, - }; - flowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/flow-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.saveRule = function () { - if (!FlowService.checkRuleValid($scope.currentRule)) { - return; - } - if ($scope.flowRuleDialog.type === 'add') { - addNewRule($scope.currentRule); - } else if ($scope.flowRuleDialog.type === 'edit') { - saveRule($scope.currentRule, true); - } - }; - - var confirmDialog; - $scope.deleteRule = function (rule) { - $scope.currentRule = rule; - $scope.confirmDialog = { - title: '删除流控规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下流控规则', - attention: '资源名: ' + rule.resource + ', 流控应用: ' + rule.limitApp - + ', 阈值类型: ' + (rule.grade == 0 ? '线程数' : 'QPS') + ', 阈值: ' + rule.count, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type === 'delete_rule') { - deleteRule($scope.currentRule); - } else { - console.error('error'); - } - }; - - function deleteRule(rule) { - FlowService.deleteRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - confirmDialog.close(); - } else { - alert('失败!'); - } - }); - }; - - function addNewRule(rule) { - FlowService.newRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - flowRuleDialog.close(); - } else { - alert('失败!'); - } - }); - }; - - $scope.onOpenAdvanceClick = function () { - $scope.flowRuleDialog.showAdvanceButton = false; - }; - $scope.onCloseAdvanceClick = function () { - $scope.flowRuleDialog.showAdvanceButton = true; - }; - - function saveRule(rule, edit) { - FlowService.saveRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - if (edit) { - flowRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('失败!'); - } - }); - } - queryAppMachines(); - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - } - }); - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js deleted file mode 100644 index ccf2497c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/api.js +++ /dev/null @@ -1,245 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('GatewayApiCtl', ['$scope', '$stateParams', 'GatewayApiService', 'ngDialog', 'MachineService', - function ($scope, $stateParams, GatewayApiService, ngDialog, MachineService) { - $scope.app = $stateParams.app; - - $scope.apisPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - getApis(); - function getApis() { - if (!$scope.macInputModel) { - return; - } - - var mac = $scope.macInputModel.split(':'); - GatewayApiService.queryApis($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - // To merge rows for api who has more than one predicateItems, here we build data manually - $scope.apis = []; - - data.data.forEach(function(api) { - api["predicateItems"].forEach(function (item, index) { - var newItem = {}; - newItem["id"] = api["id"]; - newItem["app"] = api["app"]; - newItem["ip"] = api["ip"]; - newItem["port"] = api["port"]; - newItem["apiName"] = api["apiName"]; - newItem["pattern"] = item["pattern"]; - newItem["matchStrategy"] = item["matchStrategy"]; - // The itemSize indicates how many rows to merge, by using rowspan="{{api.itemSize}}" in tag - newItem["itemSize"] = api["predicateItems"].length; - // Mark the flag of first item to zero, indicates the start row to merge - newItem["firstFlag"] = index == 0 ? 0 : 1; - // Still hold the data of predicateItems, in order to bind data in edit dialog html - newItem["predicateItems"] = api["predicateItems"]; - $scope.apis.push(newItem); - }); - }); - - $scope.apisPageConfig.totalCount = data.data.length; - } else { - $scope.apis = []; - $scope.apisPageConfig.totalCount = 0; - } - }); - }; - $scope.getApis = getApis; - - var gatewayApiDialog; - $scope.editApi = function (api) { - $scope.currentApi = angular.copy(api); - $scope.gatewayApiDialog = { - title: '编辑自定义 API', - type: 'edit', - confirmBtnText: '保存' - }; - gatewayApiDialog = ngDialog.open({ - template: '/app/views/dialog/gateway/api-dialog.html', - width: 900, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewApi = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentApi = { - grade: 0, - app: $scope.app, - ip: mac[0], - port: mac[1], - predicateItems: [{matchStrategy: 0, pattern: ''}] - }; - $scope.gatewayApiDialog = { - title: '新增自定义 API', - type: 'add', - confirmBtnText: '新增' - }; - gatewayApiDialog = ngDialog.open({ - template: '/app/views/dialog/gateway/api-dialog.html', - width: 900, - overlay: true, - scope: $scope - }); - }; - - $scope.saveApi = function () { - var apiNames = []; - if ($scope.gatewayApiDialog.type === 'add') { - apiNames = $scope.apis.map(function (item, index, array) { - return item["apiName"]; - }).filter(function (item, index, array) { - return array.indexOf(item) === index; - }); - } - - if (!GatewayApiService.checkApiValid($scope.currentApi, apiNames)) { - return; - } - - if ($scope.gatewayApiDialog.type === 'add') { - addNewApi($scope.currentApi); - } else if ($scope.gatewayApiDialog.type === 'edit') { - saveApi($scope.currentApi, true); - } - }; - - function addNewApi(api) { - GatewayApiService.newApi(api).success(function (data) { - if (data.code == 0) { - getApis(); - gatewayApiDialog.close(); - } else { - alert('新增自定义API失败!' + data.msg); - } - }); - }; - - function saveApi(api, edit) { - GatewayApiService.saveApi(api).success(function (data) { - if (data.code == 0) { - getApis(); - if (edit) { - gatewayApiDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('修改自定义API失败!' + data.msg); - } - }); - }; - - var confirmDialog; - $scope.deleteApi = function (api) { - $scope.currentApi = api; - $scope.confirmDialog = { - title: '删除自定义API', - type: 'delete_api', - attentionTitle: '请确认是否删除如下自定义API', - attention: 'API名称: ' + api.apiName, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type == 'delete_api') { - deleteApi($scope.currentApi); - } else { - console.error('error'); - } - }; - - function deleteApi(api) { - GatewayApiService.deleteApi(api).success(function (data) { - if (data.code == 0) { - getApis(); - confirmDialog.close(); - } else { - alert('删除自定义API失败!' + data.msg); - } - }); - }; - - $scope.addNewMatchPattern = function() { - var total; - if ($scope.currentApi.predicateItems == null) { - $scope.currentApi.predicateItems = []; - total = 0; - } else { - total = $scope.currentApi.predicateItems.length; - } - $scope.currentApi.predicateItems.splice(total + 1, 0, {matchStrategy: 0, pattern: ''}); - }; - - $scope.removeMatchPattern = function($index) { - if ($scope.currentApi.predicateItems.length <= 1) { - // Should never happen since no remove button will display when only one predicateItem. - alert('至少有一个匹配规则'); - return; - } - $scope.currentApi.predicateItems.splice($index, 1); - }; - - queryAppMachines(); - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getApis(); - } - }); - }] -); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js deleted file mode 100644 index c492cf9c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/flow.js +++ /dev/null @@ -1,251 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('GatewayFlowCtl', ['$scope', '$stateParams', 'GatewayFlowService', 'GatewayApiService', 'ngDialog', 'MachineService', - function ($scope, $stateParams, GatewayFlowService, GatewayApiService, ngDialog, MachineService) { - $scope.app = $stateParams.app; - - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - getMachineRules(); - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - - var mac = $scope.macInputModel.split(':'); - GatewayFlowService.queryRules($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.rules = data.data; - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - } - }); - }; - $scope.getMachineRules = getMachineRules; - - getApiNames(); - function getApiNames() { - if (!$scope.macInputModel) { - return; - } - - var mac = $scope.macInputModel.split(':'); - GatewayApiService.queryApis($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.apiNames = []; - - data.data.forEach(function (api) { - $scope.apiNames.push(api["apiName"]); - }); - } - }); - } - - $scope.intervalUnits = [{val: 0, desc: '秒'}, {val: 1, desc: '分'}, {val: 2, desc: '时'}, {val: 3, desc: '天'}]; - - var gatewayFlowRuleDialog; - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - $scope.gatewayFlowRuleDialog = { - title: '编辑网关流控规则', - type: 'edit', - confirmBtnText: '保存' - }; - gatewayFlowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/gateway/flow-rule-dialog.html', - width: 780, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - grade: 1, - app: $scope.app, - ip: mac[0], - port: mac[1], - resourceMode: 0, - interval: 1, - intervalUnit: 0, - controlBehavior: 0, - burst: 0, - maxQueueingTimeoutMs: 0 - }; - - $scope.gatewayFlowRuleDialog = { - title: '新增网关流控规则', - type: 'add', - confirmBtnText: '新增' - }; - - gatewayFlowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/gateway/flow-rule-dialog.html', - width: 780, - overlay: true, - scope: $scope - }); - }; - - $scope.saveRule = function () { - if (!GatewayFlowService.checkRuleValid($scope.currentRule)) { - return; - } - if ($scope.gatewayFlowRuleDialog.type === 'add') { - addNewRule($scope.currentRule); - } else if ($scope.gatewayFlowRuleDialog.type === 'edit') { - saveRule($scope.currentRule, true); - } - }; - - $scope.useRouteID = function() { - $scope.currentRule.resource = ''; - }; - - $scope.useCustormAPI = function() { - $scope.currentRule.resource = ''; - }; - - $scope.useParamItem = function () { - $scope.currentRule.paramItem = { - parseStrategy: 0, - matchStrategy: 0 - }; - }; - - $scope.notUseParamItem = function () { - $scope.currentRule.paramItem = null; - }; - - $scope.useParamItemVal = function() { - $scope.currentRule.paramItem.pattern = ""; - $scope.currentRule.paramItem.matchStrategy = 0; - }; - - $scope.notUseParamItemVal = function() { - $scope.currentRule.paramItem.pattern = null; - $scope.currentRule.paramItem.matchStrategy = null; - }; - - function addNewRule(rule) { - GatewayFlowService.newRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - gatewayFlowRuleDialog.close(); - } else { - alert('新增网关流控规则失败!' + data.msg); - } - }); - }; - - function saveRule(rule, edit) { - GatewayFlowService.saveRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - if (edit) { - gatewayFlowRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('修改网关流控规则失败!' + data.msg); - } - }); - }; - - var confirmDialog; - $scope.deleteRule = function (rule) { - $scope.currentRule = rule; - $scope.confirmDialog = { - title: '删除网关流控规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下规则', - attention: 'API名称: ' + rule.resource + ', ' + (rule.grade == 1 ? 'QPS阈值' : '线程数') + ': ' + rule.count, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type == 'delete_rule') { - deleteRule($scope.currentRule); - } else { - console.error('error'); - } - }; - - function deleteRule(rule) { - GatewayFlowService.deleteRule(rule).success(function (data) { - if (data.code == 0) { - getMachineRules(); - confirmDialog.close(); - } else { - alert('删除网关流控规则失败!' + data.msg); - } - }); - }; - - queryAppMachines(); - - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - getApiNames(); - } - }); - }] -); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js deleted file mode 100644 index 52871b4a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/gateway/identity.js +++ /dev/null @@ -1,299 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('GatewayIdentityCtl', ['$scope', '$stateParams', 'IdentityService', - 'ngDialog', 'GatewayFlowService', 'GatewayApiService', 'DegradeService', 'MachineService', - '$interval', '$location', '$timeout', - function ($scope, $stateParams, IdentityService, ngDialog, - GatewayFlowService, GatewayApiService, DegradeService, MachineService, $interval, $location, $timeout) { - - $scope.app = $stateParams.app; - - $scope.currentPage = 1; - $scope.pageSize = 16; - $scope.totalPage = 1; - $scope.totalCount = 0; - $scope.identities = []; - - $scope.searchKey = ''; - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - $scope.table = null; - - getApiNames(); - function getApiNames() { - if (!$scope.macInputModel) { - return; - } - - var mac = $scope.macInputModel.split(':'); - GatewayApiService.queryApis($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.apiNames = []; - - data.data.forEach(function (api) { - $scope.apiNames.push(api["apiName"]); - }); - } - }); - } - - var gatewayFlowRuleDialog; - var gatewayFlowRuleDialogScope; - $scope.addNewGatewayFlowRule = function (resource) { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - gatewayFlowRuleDialogScope = $scope.$new(true); - - gatewayFlowRuleDialogScope.apiNames = $scope.apiNames; - - gatewayFlowRuleDialogScope.intervalUnits = [{val: 0, desc: '秒'}, {val: 1, desc: '分'}, {val: 2, desc: '时'}, {val: 3, desc: '天'}]; - - gatewayFlowRuleDialogScope.currentRule = { - grade: 1, - app: $scope.app, - ip: mac[0], - port: mac[1], - resourceMode: gatewayFlowRuleDialogScope.apiNames.indexOf(resource) == -1 ? 0 : 1, - resource: resource, - interval: 1, - intervalUnit: 0, - controlBehavior: 0, - burst: 0, - maxQueueingTimeoutMs: 0 - }; - - gatewayFlowRuleDialogScope.gatewayFlowRuleDialog = { - title: '新增网关流控规则', - type: 'add', - confirmBtnText: '新增', - saveAndContinueBtnText: '新增并继续添加', - showAdvanceButton: true - }; - - gatewayFlowRuleDialogScope.useRouteID = function() { - gatewayFlowRuleDialogScope.currentRule.resource = ''; - }; - - gatewayFlowRuleDialogScope.useCustormAPI = function() { - gatewayFlowRuleDialogScope.currentRule.resource = ''; - }; - - gatewayFlowRuleDialogScope.useParamItem = function () { - gatewayFlowRuleDialogScope.currentRule.paramItem = { - parseStrategy: 0, - matchStrategy: 0 - }; - }; - - gatewayFlowRuleDialogScope.notUseParamItem = function () { - gatewayFlowRuleDialogScope.currentRule.paramItem = null; - }; - - gatewayFlowRuleDialogScope.useParamItemVal = function() { - gatewayFlowRuleDialogScope.currentRule.paramItem.pattern = ""; - }; - - gatewayFlowRuleDialogScope.notUseParamItemVal = function() { - gatewayFlowRuleDialogScope.currentRule.paramItem.pattern = null; - }; - - gatewayFlowRuleDialogScope.saveRule = saveGatewayFlowRule; - gatewayFlowRuleDialogScope.saveRuleAndContinue = saveGatewayFlowRuleAndContinue; - gatewayFlowRuleDialogScope.onOpenAdvanceClick = function () { - gatewayFlowRuleDialogScope.gatewayFlowRuleDialog.showAdvanceButton = false; - }; - gatewayFlowRuleDialogScope.onCloseAdvanceClick = function () { - gatewayFlowRuleDialogScope.gatewayFlowRuleDialog.showAdvanceButton = true; - }; - - gatewayFlowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/gateway/flow-rule-dialog.html', - width: 780, - overlay: true, - scope: gatewayFlowRuleDialogScope - }); - }; - - function saveGatewayFlowRule() { - if (!GatewayFlowService.checkRuleValid(gatewayFlowRuleDialogScope.currentRule)) { - return; - } - GatewayFlowService.newRule(gatewayFlowRuleDialogScope.currentRule).success(function (data) { - if (data.code === 0) { - gatewayFlowRuleDialog.close(); - let url = '/dashboard/gateway/flow/' + $scope.app; - $location.path(url); - } else { - alert('失败!'); - } - }).error((data, header, config, status) => { - alert('未知错误'); - }); - } - - function saveGatewayFlowRuleAndContinue() { - if (!GatewayFlowService.checkRuleValid(gatewayFlowRuleDialogScope.currentRule)) { - return; - } - GatewayFlowService.newRule(gatewayFlowRuleDialogScope.currentRule).success(function (data) { - if (data.code == 0) { - gatewayFlowRuleDialog.close(); - } else { - alert('失败!'); - } - }); - } - - var degradeRuleDialog; - $scope.addNewDegradeRule = function (resource) { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - degradeRuleDialogScope = $scope.$new(true); - degradeRuleDialogScope.currentRule = { - enable: false, - grade: 0, - strategy: 0, - resource: resource, - limitApp: 'default', - app: $scope.app, - ip: mac[0], - port: mac[1] - }; - - degradeRuleDialogScope.degradeRuleDialog = { - title: '新增降级规则', - type: 'add', - confirmBtnText: '新增', - saveAndContinueBtnText: '新增并继续添加' - }; - degradeRuleDialogScope.saveRule = saveDegradeRule; - degradeRuleDialogScope.saveRuleAndContinue = saveDegradeRuleAndContinue; - - degradeRuleDialog = ngDialog.open({ - template: '/app/views/dialog/degrade-rule-dialog.html', - width: 680, - overlay: true, - scope: degradeRuleDialogScope - }); - }; - - function saveDegradeRule() { - if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) { - return; - } - DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) { - if (data.code == 0) { - degradeRuleDialog.close(); - var url = '/dashboard/degrade/' + $scope.app; - $location.path(url); - } else { - alert('失败!'); - } - }); - } - - function saveDegradeRuleAndContinue() { - if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) { - return; - } - DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) { - if (data.code == 0) { - degradeRuleDialog.close(); - } else { - alert('失败!'); - } - }); - } - - var searchHandler; - $scope.searchChange = function (searchKey) { - $timeout.cancel(searchHandler); - searchHandler = $timeout(function () { - $scope.searchKey = searchKey; - reInitIdentityDatas(); - }, 600); - }; - - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code === 0) { - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - } - - // Fetch all machines by current app name. - queryAppMachines(); - - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - reInitIdentityDatas(); - } - }); - - $scope.$on('$destroy', function () { - $interval.cancel(intervalId); - }); - - var intervalId; - function reInitIdentityDatas() { - getApiNames(); - queryIdentities(); - }; - - function queryIdentities() { - var mac = $scope.macInputModel.split(':'); - if (mac == null || mac.length < 2) { - return; - } - - IdentityService.fetchClusterNodeOfMachine(mac[0], mac[1], $scope.searchKey).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.identities = data.data; - $scope.totalCount = $scope.identities.length; - } else { - $scope.identities = []; - $scope.totalCount = 0; - } - } - ); - }; - $scope.queryIdentities = queryIdentities; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js deleted file mode 100644 index 1df5862c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/home.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @ngdoc function - * @name sentinelDashboardApp.controller:MainCtrl - * @description - * # MainCtrl - * Controller of the sentinelDashboardApp - */ -angular.module('sentinelDashboardApp') - .controller('HomeCtrl', ['$scope', '$position', function ($scope, $position) { - // do noting - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js deleted file mode 100644 index 2a14eb1e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/identity.js +++ /dev/null @@ -1,478 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService', - 'ngDialog', 'FlowServiceV1', 'DegradeService', 'AuthorityRuleService', 'ParamFlowService', 'MachineService', - '$interval', '$location', '$timeout', - function ($scope, $stateParams, IdentityService, ngDialog, - FlowService, DegradeService, AuthorityRuleService, ParamFlowService, MachineService, $interval, $location, $timeout) { - - $scope.app = $stateParams.app; - - $scope.currentPage = 1; - $scope.pageSize = 16; - $scope.totalPage = 1; - $scope.totalCount = 0; - $scope.identities = []; - // 数据自动刷新频率, 默认10s - var DATA_REFRESH_INTERVAL = 30; - - $scope.isExpand = true; - $scope.searchKey = ''; - $scope.firstExpandAll = false; - $scope.isTreeView = true; - - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - $scope.table = null; - - var flowRuleDialog; - var flowRuleDialogScope; - $scope.addNewFlowRule = function (resource) { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - flowRuleDialogScope = $scope.$new(true); - flowRuleDialogScope.currentRule = { - enable: false, - strategy: 0, - grade: 1, - controlBehavior: 0, - resource: resource, - limitApp: 'default', - clusterMode: false, - clusterConfig: { - thresholdType: 0 - }, - app: $scope.app, - ip: mac[0], - port: mac[1] - }; - - flowRuleDialogScope.flowRuleDialog = { - title: '新增流控规则', - type: 'add', - confirmBtnText: '新增', - saveAndContinueBtnText: '新增并继续添加', - showAdvanceButton: true - }; - // $scope.flowRuleDialog = { - // showAdvanceButton : true - // }; - flowRuleDialogScope.saveRule = saveFlowRule; - flowRuleDialogScope.saveRuleAndContinue = saveFlowRuleAndContinue; - flowRuleDialogScope.onOpenAdvanceClick = function () { - flowRuleDialogScope.flowRuleDialog.showAdvanceButton = false; - }; - flowRuleDialogScope.onCloseAdvanceClick = function () { - flowRuleDialogScope.flowRuleDialog.showAdvanceButton = true; - }; - - flowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/flow-rule-dialog.html', - width: 680, - overlay: true, - scope: flowRuleDialogScope - }); - }; - - function saveFlowRule() { - if (!FlowService.checkRuleValid(flowRuleDialogScope.currentRule)) { - return; - } - FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) { - if (data.code === 0) { - flowRuleDialog.close(); - let url = '/dashboard/flow/' + $scope.app; - $location.path(url); - } else { - alert('失败:' + data.msg); - } - }).error((data, header, config, status) => { - alert('未知错误'); - }); - } - - function saveFlowRuleAndContinue() { - if (!FlowService.checkRuleValid(flowRuleDialogScope.currentRule)) { - return; - } - FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) { - if (data.code === 0) { - flowRuleDialog.close(); - } else { - alert('失败:' + data.msg); - } - }); - } - - var degradeRuleDialog; - var degradeRuleDialogScope; - $scope.addNewDegradeRule = function (resource) { - if (!$scope.macInputModel) { - return; - } - var mac = $scope.macInputModel.split(':'); - degradeRuleDialogScope = $scope.$new(true); - degradeRuleDialogScope.currentRule = { - enable: false, - grade: 0, - strategy: 0, - resource: resource, - limitApp: 'default', - minRequestAmount: 5, - statIntervalMs: 1000, - app: $scope.app, - ip: mac[0], - port: mac[1] - }; - - degradeRuleDialogScope.degradeRuleDialog = { - title: '新增降级规则', - type: 'add', - confirmBtnText: '新增', - saveAndContinueBtnText: '新增并继续添加' - }; - degradeRuleDialogScope.saveRule = saveDegradeRule; - degradeRuleDialogScope.saveRuleAndContinue = saveDegradeRuleAndContinue; - - degradeRuleDialog = ngDialog.open({ - template: '/app/views/dialog/degrade-rule-dialog.html', - width: 680, - overlay: true, - scope: degradeRuleDialogScope - }); - }; - - function saveDegradeRule() { - if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) { - return; - } - DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) { - if (data.code === 0) { - degradeRuleDialog.close(); - var url = '/dashboard/degrade/' + $scope.app; - $location.path(url); - } else { - alert('失败:' + data.msg); - } - }); - } - - function saveDegradeRuleAndContinue() { - if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) { - return; - } - DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) { - if (data.code === 0) { - degradeRuleDialog.close(); - } else { - alert('失败:' + data.msg); - } - }); - } - - let authorityRuleDialog; - let authorityRuleDialogScope; - - function saveAuthorityRule() { - let ruleEntity = authorityRuleDialogScope.currentRule; - if (!AuthorityRuleService.checkRuleValid(ruleEntity.rule)) { - return; - } - AuthorityRuleService.addNewRule(ruleEntity).success((data) => { - if (data.success) { - authorityRuleDialog.close(); - let url = '/dashboard/authority/' + $scope.app; - $location.path(url); - } else { - alert('添加规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('添加规则失败:' + data.msg); - } else { - alert("添加规则失败:未知错误"); - } - }); - } - - function saveAuthorityRuleAndContinue() { - let ruleEntity = authorityRuleDialogScope.currentRule; - if (!AuthorityRuleService.checkRuleValid(ruleEntity.rule)) { - return; - } - AuthorityRuleService.addNewRule(ruleEntity).success((data) => { - if (data.success) { - authorityRuleDialog.close(); - } else { - alert('添加规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('添加规则失败:' + data.msg); - } else { - alert("添加规则失败:未知错误"); - } - }); - } - - $scope.addNewAuthorityRule = function (resource) { - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - authorityRuleDialogScope = $scope.$new(true); - authorityRuleDialogScope.currentRule = { - app: $scope.app, - ip: mac[0], - port: mac[1], - rule: { - resource: resource, - strategy: 0, - limitApp: '', - } - }; - - authorityRuleDialogScope.authorityRuleDialog = { - title: '新增授权规则', - type: 'add', - confirmBtnText: '新增', - saveAndContinueBtnText: '新增并继续添加' - }; - authorityRuleDialogScope.saveRule = saveAuthorityRule; - authorityRuleDialogScope.saveRuleAndContinue = saveAuthorityRuleAndContinue; - - authorityRuleDialog = ngDialog.open({ - template: '/app/views/dialog/authority-rule-dialog.html', - width: 680, - overlay: true, - scope: authorityRuleDialogScope - }); - }; - - let paramFlowRuleDialog; - let paramFlowRuleDialogScope; - - function saveParamFlowRule() { - let ruleEntity = paramFlowRuleDialogScope.currentRule; - if (!ParamFlowService.checkRuleValid(ruleEntity.rule)) { - return; - } - ParamFlowService.addNewRule(ruleEntity).success((data) => { - if (data.success) { - paramFlowRuleDialog.close(); - let url = '/dashboard/paramFlow/' + $scope.app; - $location.path(url); - } else { - alert('添加热点规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('添加热点规则失败:' + data.msg); - } else { - alert("添加热点规则失败:未知错误"); - } - }); - } - - function saveParamFlowRuleAndContinue() { - let ruleEntity = paramFlowRuleDialogScope.currentRule; - if (!ParamFlowService.checkRuleValid(ruleEntity.rule)) { - return; - } - ParamFlowService.addNewRule(ruleEntity).success((data) => { - if (data.success) { - paramFlowRuleDialog.close(); - } else { - alert('添加热点规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('添加热点规则失败:' + data.msg); - } else { - alert("添加热点规则失败:未知错误"); - } - }); - } - - $scope.addNewParamFlowRule = function (resource) { - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - paramFlowRuleDialogScope = $scope.$new(true); - paramFlowRuleDialogScope.currentRule = { - app: $scope.app, - ip: mac[0], - port: mac[1], - rule: { - resource: resource, - grade: 1, - paramFlowItemList: [], - count: 0, - limitApp: 'default', - controlBehavior: 0, - durationInSec: 1, - burstCount: 0, - maxQueueingTimeMs: 0, - clusterMode: false, - clusterConfig: { - thresholdType: 0, - fallbackToLocalWhenFail: true, - } - } - }; - - paramFlowRuleDialogScope.paramFlowRuleDialog = { - title: '新增热点规则', - type: 'add', - confirmBtnText: '新增', - saveAndContinueBtnText: '新增并继续添加', - supportAdvanced: false, - showAdvanceButton: true - }; - paramFlowRuleDialogScope.saveRule = saveParamFlowRule; - paramFlowRuleDialogScope.saveRuleAndContinue = saveParamFlowRuleAndContinue; - // paramFlowRuleDialogScope.onOpenAdvanceClick = function () { - // paramFlowRuleDialogScope.paramFlowRuleDialog.showAdvanceButton = false; - // }; - // paramFlowRuleDialogScope.onCloseAdvanceClick = function () { - // paramFlowRuleDialogScope.paramFlowRuleDialog.showAdvanceButton = true; - // }; - - paramFlowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/param-flow-rule-dialog.html', - width: 680, - overlay: true, - scope: paramFlowRuleDialogScope - }); - }; - - var searchHandler; - $scope.searchChange = function (searchKey) { - $timeout.cancel(searchHandler); - searchHandler = $timeout(function () { - $scope.searchKey = searchKey; - $scope.isExpand = true; - $scope.firstExpandAll = true; - reInitIdentityDatas(); - $scope.firstExpandAll = false; - }, 600); - }; - - $scope.initTreeTable = function () { - // if (!$scope.table) { - com_github_culmat_jsTreeTable.register(window); - $scope.table = window.treeTable($('#identities')); - // } - }; - - $scope.expandAll = function () { - $scope.isExpand = true; - }; - $scope.collapseAll = function () { - $scope.isExpand = false; - }; - $scope.treeView = function () { - $scope.isTreeView = true; - queryIdentities(); - }; - $scope.listView = function () { - $scope.isTreeView = false; - queryIdentities(); - }; - - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code === 0) { - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - } - - // Fetch all machines by current app name. - queryAppMachines(); - - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - reInitIdentityDatas(); - } - }); - - $scope.$on('$destroy', function () { - $interval.cancel(intervalId); - }); - - var intervalId; - function reInitIdentityDatas() { - // $interval.cancel(intervalId); - queryIdentities(); - // intervalId = $interval(function () { - // queryIdentities(); - // }, DATA_REFRESH_INTERVAL * 1000); - }; - - function queryIdentities() { - var mac = $scope.macInputModel.split(':'); - if (mac == null || mac.length < 2) { - return; - } - if ($scope.isTreeView) { - IdentityService.fetchIdentityOfMachine(mac[0], mac[1], $scope.searchKey).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.identities = data.data; - $scope.totalCount = $scope.identities.length; - } else { - $scope.identities = []; - $scope.totalCount = 0; - } - } - ); - } else { - IdentityService.fetchClusterNodeOfMachine(mac[0], mac[1], $scope.searchKey).success( - function (data) { - if (data.code == 0 && data.data) { - $scope.identities = data.data; - $scope.totalCount = $scope.identities.length; - } else { - $scope.identities = []; - $scope.totalCount = 0; - } - } - ); - } - }; - $scope.queryIdentities = queryIdentities; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js deleted file mode 100644 index 3d49d3c1..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/login.js +++ /dev/null @@ -1,33 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('LoginCtl', ['$scope', '$state', '$window', 'AuthService', - function ($scope, $state, $window, AuthService) { - // If auth passed, jump to the index page directly - if ($window.localStorage.getItem('session_sentinel_admin')) { - $state.go('dashboard'); - } - - $scope.login = function () { - if (!$scope.username) { - alert('请输入用户名'); - return; - } - - if (!$scope.password) { - alert('请输入密码'); - return; - } - - var param = {"username": $scope.username, "password": $scope.password}; - - AuthService.login(param).success(function (data) { - if (data.code == 0) { - $window.localStorage.setItem('session_sentinel_admin', JSON.stringify(data.data)); - $state.go('dashboard'); - } else { - alert(data.msg); - } - }); - }; - }] -); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js deleted file mode 100644 index 16180470..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/machine.js +++ /dev/null @@ -1,65 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('MachineCtl', ['$scope', '$stateParams', 'MachineService', - function ($scope, $stateParams, MachineService) { - $scope.app = $stateParams.app; - $scope.propertyName = ''; - $scope.reverse = false; - $scope.currentPage = 1; - $scope.machines = []; - $scope.machinesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - - $scope.sortBy = function (propertyName) { - // console.log('machine sortBy ' + propertyName); - $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false; - $scope.propertyName = propertyName; - }; - - $scope.reloadMachines = function() { - MachineService.getAppMachines($scope.app).success( - function (data) { - // console.log('get machines: ' + data.data[0].hostname) - if (data.code == 0 && data.data) { - $scope.machines = data.data; - var healthy = 0; - $scope.machines.forEach(function (item) { - if (item.healthy) { - healthy++; - } - if (!item.hostname) { - item.hostname = '未知' - } - }) - $scope.healthyCount = healthy; - $scope.machinesPageConfig.totalCount = $scope.machines.length; - } else { - $scope.machines = []; - $scope.healthyCount = 0; - } - } - ); - }; - - $scope.removeMachine = function(ip, port) { - if (!confirm("confirm to remove machine [" + ip + ":" + port + "]?")) { - return; - } - MachineService.removeAppMachine($scope.app, ip, port).success( - function(data) { - if (data.code == 0) { - $scope.reloadMachines(); - } else { - alert("remove failed"); - } - } - ); - }; - - $scope.reloadMachines(); - - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js deleted file mode 100644 index 37500f7e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/main.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @ngdoc function - * @name sentinelDashboardApp.controller:MainCtrl - * @description - * # MainCtrl - * Controller of the sentinelDashboardApp - */ -angular.module('sentinelDashboardApp') - .controller('DashboardCtrl', ['$scope', '$position', function ($scope, $position) { - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js deleted file mode 100644 index b7e2539d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/metric.js +++ /dev/null @@ -1,263 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('MetricCtl', ['$scope', '$stateParams', 'MetricService', '$interval', '$timeout', - function ($scope, $stateParams, MetricService, $interval, $timeout) { - - $scope.endTime = new Date(); - $scope.startTime = new Date(); - $scope.startTime.setMinutes($scope.endTime.getMinutes() - 30); - $scope.startTimeFmt = formatDate($scope.startTime); - $scope.endTimeFmt = formatDate($scope.endTime); - function formatDate(date) { - return moment(date).format('YYYY/MM/DD HH:mm:ss'); - } - $scope.changeStartTime = function (startTime) { - $scope.startTime = new Date(startTime); - $scope.startTimeFmt = formatDate(startTime); - }; - $scope.changeEndTime = function (endTime) { - $scope.endTime = new Date(endTime); - $scope.endTimeFmt = formatDate(endTime); - }; - - $scope.app = $stateParams.app; - // 数据自动刷新频率 - var DATA_REFRESH_INTERVAL = 1000 * 10; - - $scope.servicePageConfig = { - pageSize: 6, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.servicesChartConfigs = []; - - $scope.pageChanged = function (newPageNumber) { - $scope.servicePageConfig.currentPageIndex = newPageNumber; - reInitIdentityDatas(); - }; - - var searchT; - $scope.searchService = function () { - $timeout.cancel(searchT); - searchT = $timeout(function () { - reInitIdentityDatas(); - }, 600); - } - - var intervalId; - reInitIdentityDatas(); - function reInitIdentityDatas() { - $interval.cancel(intervalId); - queryIdentityDatas(); - intervalId = $interval(function () { - queryIdentityDatas(); - }, DATA_REFRESH_INTERVAL); - }; - - $scope.$on('$destroy', function () { - $interval.cancel(intervalId); - }); - $scope.initAllChart = function () { - $.each($scope.metrics, function (idx, metric) { - if (idx == $scope.metrics.length - 1) { - return; - } - const chart = new G2.Chart({ - container: 'chart' + idx, - forceFit: true, - width: 100, - height: 250, - padding: [10, 30, 70, 50] - }); - var maxQps = 0; - for (var i in metric.data) { - var item = metric.data[i]; - if (item.passQps > maxQps) { - maxQps = item.passQps; - } - if (item.blockQps > maxQps) { - maxQps = item.blockQps; - } - } - chart.source(metric.data); - chart.scale('timestamp', { - type: 'time', - mask: 'YYYY-MM-DD HH:mm:ss' - }); - chart.scale('passQps', { - min: 0, - max: maxQps, - fine: true, - alias: '通过 QPS' - // max: 10 - }); - chart.scale('blockQps', { - min: 0, - max: maxQps, - fine: true, - alias: '拒绝 QPS', - }); - chart.scale('rt', { - min: 0, - fine: true, - }); - chart.axis('rt', { - grid: null, - label: null - }); - chart.axis('blockQps', { - grid: null, - label: null - }); - - chart.axis('timestamp', { - label: { - textStyle: { - textAlign: 'center', // 文本对齐方向,可取值为: start center end - fill: '#404040', // 文本的颜色 - fontSize: '11', // 文本大小 - //textBaseline: 'top', // 文本基准线,可取 top middle bottom,默认为middle - }, - autoRotate: false, - formatter: function (text, item, index) { - return text.substring(11, 11 + 5); - } - } - }); - chart.legend({ - custom: true, - position: 'bottom', - allowAllCanceled: true, - itemFormatter: function (val) { - if ('passQps' === val) { - return '通过 QPS'; - } - if ('blockQps' === val) { - return '拒绝 QPS'; - } - return val; - }, - items: [ - { value: 'passQps', marker: { symbol: 'hyphen', stroke: 'green', radius: 5, lineWidth: 2 } }, - { value: 'blockQps', marker: { symbol: 'hyphen', stroke: 'blue', radius: 5, lineWidth: 2 } }, - //{ value: 'rt', marker: {symbol: 'hyphen', stroke: 'gray', radius: 5, lineWidth: 2} }, - ], - onClick: function (ev) { - const item = ev.item; - const value = item.value; - const checked = ev.checked; - const geoms = chart.getAllGeoms(); - for (var i = 0; i < geoms.length; i++) { - const geom = geoms[i]; - if (geom.getYScale().field === value) { - if (checked) { - geom.show(); - } else { - geom.hide(); - } - } - } - } - }); - chart.line().position('timestamp*passQps').size(1).color('green').shape('smooth'); - chart.line().position('timestamp*blockQps').size(1).color('blue').shape('smooth'); - //chart.line().position('timestamp*rt').size(1).color('gray').shape('smooth'); - G2.track(false); - chart.render(); - }); - }; - - $scope.metrics = []; - $scope.emptyObjs = []; - function queryIdentityDatas() { - var params = { - app: $scope.app, - pageIndex: $scope.servicePageConfig.currentPageIndex, - pageSize: $scope.servicePageConfig.pageSize, - desc: $scope.isDescOrder, - searchKey: $scope.serviceQuery - }; - MetricService.queryAppSortedIdentities(params).success(function (data) { - $scope.metrics = []; - $scope.emptyObjs = []; - if (data.code === 0 && data.data) { - var metricsObj = data.data.metric; - var identityNames = Object.keys(metricsObj); - if (identityNames.length < 1) { - $scope.emptyServices = true; - } else { - $scope.emptyServices = false; - } - $scope.servicePageConfig.totalPage = data.data.totalPage; - $scope.servicePageConfig.pageSize = data.data.pageSize; - var totalCount = data.data.totalCount; - $scope.servicePageConfig.totalCount = totalCount; - for (i = 0; i < totalCount; i++) { - $scope.emptyObjs.push({}); - } - $.each(identityNames, function (idx, identityName) { - var identityDatas = metricsObj[identityName]; - var metrics = {}; - metrics.resource = identityName; - // metrics.data = identityDatas; - metrics.data = fillZeros(identityDatas); - metrics.shortData = lastOfArray(identityDatas, 6); - $scope.metrics.push(metrics); - }); - // push an empty element in the last, for ng-init reasons. - $scope.metrics.push([]); - } else { - $scope.emptyServices = true; - console.log(data.msg); - } - }); - }; - function fillZeros(metricData) { - if (!metricData || metricData.length == 0) { - return []; - } - var filledData = []; - filledData.push(metricData[0]); - var lastTime = metricData[0].timestamp / 1000; - for (var i = 1; i < metricData.length; i++) { - var curTime = metricData[i].timestamp / 1000; - if (curTime > lastTime + 1) { - for (var j = lastTime + 1; j < curTime; j++) { - filledData.push({ - "timestamp": j * 1000, - "passQps": 0, - "blockQps": 0, - "successQps": 0, - "exception": 0, - "rt": 0, - "count": 0 - }) - } - } - filledData.push(metricData[i]); - lastTime = curTime; - } - return filledData; - } - function lastOfArray(arr, n) { - if (!arr.length) { - return []; - } - var rs = []; - for (i = 0; i < n && i < arr.length; i++) { - rs.push(arr[arr.length - 1 - i]); - } - return rs; - } - - $scope.isDescOrder = true; - $scope.setDescOrder = function () { - $scope.isDescOrder = true; - reInitIdentityDatas(); - } - $scope.setAscOrder = function () { - $scope.isDescOrder = false; - reInitIdentityDatas(); - } - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js deleted file mode 100644 index 65d868a8..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/param_flow.js +++ /dev/null @@ -1,328 +0,0 @@ -/** - * Parameter flow control controller. - * - * @author Eric Zhao - */ -angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scope', '$stateParams', 'ParamFlowService', 'ngDialog', - 'MachineService', - function ($scope, $stateParams, ParamFlowService, ngDialog, - MachineService) { - const UNSUPPORTED_CODE = 4041; - $scope.app = $stateParams.app; - $scope.curExItem = {}; - - $scope.paramItemClassTypeList = [ - 'int', 'double', 'java.lang.String', 'long', 'float', 'char', 'byte' - ]; - - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - function updateSingleParamItem(arr, v, t, c) { - for (let i = 0; i < arr.length; i++) { - if (arr[i].object === v && arr[i].classType === t) { - arr[i].count = c; - return; - } - } - arr.push({object: v, classType: t, count: c}); - } - - function removeSingleParamItem(arr, v, t) { - for (let i = 0; i < arr.length; i++) { - if (arr[i].object === v && arr[i].classType === t) { - arr.splice(i, 1); - break; - } - } - } - - function isNumberClass(classType) { - return classType === 'int' || classType === 'double' || - classType === 'float' || classType === 'long' || classType === 'short'; - } - - function isByteClass(classType) { - return classType === 'byte'; - } - - function notNumberAtLeastZero(num) { - return num === undefined || num === '' || isNaN(num) || num < 0; - } - - function notGoodNumber(num) { - return num === undefined || num === '' || isNaN(num); - } - - function notGoodNumberBetweenExclusive(num, l ,r) { - return num === undefined || num === '' || isNaN(num) || num < l || num > r; - } - - $scope.notValidParamItem = (curExItem) => { - if (isNumberClass(curExItem.classType) && notGoodNumber(curExItem.object)) { - return true; - } - if (isByteClass(curExItem.classType) && notGoodNumberBetweenExclusive(curExItem.object, -128, 127)) { - return true; - } - return curExItem.object === undefined || curExItem.classType === undefined || - notNumberAtLeastZero(curExItem.count); - }; - - $scope.addParamItem = () => { - updateSingleParamItem($scope.currentRule.rule.paramFlowItemList, - $scope.curExItem.object, $scope.curExItem.classType, $scope.curExItem.count); - let oldItem = $scope.curExItem; - $scope.curExItem = {classType: oldItem.classType}; - }; - - $scope.removeParamItem = (v, t) => { - removeSingleParamItem($scope.currentRule.rule.paramFlowItemList, v, t); - }; - - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - ParamFlowService.queryMachineRules($scope.app, mac[0], mac[1]) - .success(function (data) { - if (data.code === 0 && data.data) { - $scope.loadError = undefined; - $scope.rules = data.data; - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - if (data.code === UNSUPPORTED_CODE) { - $scope.loadError = {message: "机器 " + mac[0] + ":" + mac[1] + " 的 Sentinel 客户端版本不支持热点参数限流功能,请升级至 0.2.0 以上版本并引入 sentinel-parameter-flow-control 依赖。"} - } else { - $scope.loadError = {message: data.msg} - } - } - }) - .error((data, header, config, status) => { - $scope.loadError = {message: "未知错误"} - }); - } - $scope.getMachineRules = getMachineRules; - getMachineRules(); - - var paramFlowRuleDialog; - - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - if ($scope.currentRule.rule && $scope.currentRule.rule.durationInSec === undefined) { - $scope.currentRule.rule.durationInSec = 1; - } - $scope.paramFlowRuleDialog = { - title: '编辑热点规则', - type: 'edit', - confirmBtnText: '保存', - supportAdvanced: true, - showAdvanceButton: rule.rule.paramFlowItemList === undefined || rule.rule.paramFlowItemList.length <= 0 - }; - paramFlowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/param-flow-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - $scope.curExItem = {}; - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - app: $scope.app, - ip: mac[0], - port: mac[1], - rule: { - grade: 1, - paramFlowItemList: [], - count: 0, - limitApp: 'default', - controlBehavior: 0, - durationInSec: 1, - burstCount: 0, - maxQueueingTimeMs: 0, - clusterMode: false, - clusterConfig: { - thresholdType: 0, - fallbackToLocalWhenFail: true, - } - } - }; - $scope.paramFlowRuleDialog = { - title: '新增热点规则', - type: 'add', - confirmBtnText: '新增', - supportAdvanced: true, - showAdvanceButton: true, - }; - paramFlowRuleDialog = ngDialog.open({ - template: '/app/views/dialog/param-flow-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - $scope.curExItem = {}; - }; - - $scope.onOpenAdvanceClick = function () { - $scope.paramFlowRuleDialog.showAdvanceButton = false; - }; - $scope.onCloseAdvanceClick = function () { - $scope.paramFlowRuleDialog.showAdvanceButton = true; - }; - - $scope.saveRule = function () { - if (!ParamFlowService.checkRuleValid($scope.currentRule.rule)) { - return; - } - if ($scope.paramFlowRuleDialog.type === 'add') { - addNewRuleAndPush($scope.currentRule); - } else if ($scope.paramFlowRuleDialog.type === 'edit') { - saveRuleAndPush($scope.currentRule, true); - } - }; - - function addNewRuleAndPush(rule) { - ParamFlowService.addNewRule(rule).success((data) => { - if (data.success) { - getMachineRules(); - paramFlowRuleDialog.close(); - } else { - alert('添加规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('添加规则失败:' + data.msg); - } else { - alert("添加规则失败:未知错误"); - } - }); - } - - function saveRuleAndPush(rule, edit) { - ParamFlowService.saveRule(rule).success(function (data) { - if (data.success) { - alert("修改规则成功"); - getMachineRules(); - if (edit) { - paramFlowRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else { - alert('修改规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('修改规则失败:' + data.msg); - } else { - alert("修改规则失败:未知错误"); - } - }); - } - - function deleteRuleAndPush(entity) { - if (entity.id === undefined || isNaN(entity.id)) { - alert('规则 ID 不合法!'); - return; - } - ParamFlowService.deleteRule(entity).success((data) => { - if (data.code == 0) { - getMachineRules(); - confirmDialog.close(); - } else { - alert('删除规则失败:' + data.msg); - } - }).error((data) => { - if (data) { - alert('删除规则失败:' + data.msg); - } else { - alert("删除规则失败:未知错误"); - } - }); - }; - - var confirmDialog; - $scope.deleteRule = function (ruleEntity) { - $scope.currentRule = ruleEntity; - console.log('deleting: ' + ruleEntity); - $scope.confirmDialog = { - title: '删除热点规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下热点参数限流规则', - attention: '资源名: ' + ruleEntity.rule.resource + ', 热点参数索引: ' + ruleEntity.rule.paramIdx + - ', 限流模式: ' + (ruleEntity.rule.grade === 1 ? 'QPS' : '未知') + ', 限流阈值: ' + ruleEntity.rule.count, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - $scope.confirm = function () { - if ($scope.confirmDialog.type === 'delete_rule') { - deleteRuleAndPush($scope.currentRule); - } else { - console.error('error'); - } - }; - - queryAppMachines(); - - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code == 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - } - }); - }]); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js deleted file mode 100644 index 5b3107ff..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/controllers/system.js +++ /dev/null @@ -1,239 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.controller('SystemCtl', ['$scope', '$stateParams', 'SystemService', 'ngDialog', 'MachineService', - function ($scope, $stateParams, SystemService, - ngDialog, MachineService) { - //初始化 - $scope.app = $stateParams.app; - $scope.rulesPageConfig = { - pageSize: 10, - currentPageIndex: 1, - totalPage: 1, - totalCount: 0, - }; - $scope.macsInputConfig = { - searchField: ['text', 'value'], - persist: true, - create: false, - maxItems: 1, - render: { - item: function (data, escape) { - return '
' + escape(data.text) + '
'; - } - }, - onChange: function (value, oldValue) { - $scope.macInputModel = value; - } - }; - - getMachineRules(); - function getMachineRules() { - if (!$scope.macInputModel) { - return; - } - let mac = $scope.macInputModel.split(':'); - SystemService.queryMachineRules($scope.app, mac[0], mac[1]).success( - function (data) { - if (data.code === 0 && data.data) { - $scope.rules = data.data; - $.each($scope.rules, function (idx, rule) { - if (rule.highestSystemLoad >= 0) { - rule.grade = 0; - } else if (rule.avgRt >= 0) { - rule.grade = 1; - } else if (rule.maxThread >= 0) { - rule.grade = 2; - } else if (rule.qps >= 0) { - rule.grade = 3; - } else if (rule.highestCpuUsage >= 0) { - rule.grade = 4; - } - }); - $scope.rulesPageConfig.totalCount = $scope.rules.length; - } else { - $scope.rules = []; - $scope.rulesPageConfig.totalCount = 0; - } - }); - } - - $scope.getMachineRules = getMachineRules; - var systemRuleDialog; - $scope.editRule = function (rule) { - $scope.currentRule = angular.copy(rule); - $scope.systemRuleDialog = { - title: '编辑系统保护规则', - type: 'edit', - confirmBtnText: '保存' - }; - systemRuleDialog = ngDialog.open({ - template: '/app/views/dialog/system-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.addNewRule = function () { - var mac = $scope.macInputModel.split(':'); - $scope.currentRule = { - grade: 0, - app: $scope.app, - ip: mac[0], - port: mac[1], - }; - $scope.systemRuleDialog = { - title: '新增系统保护规则', - type: 'add', - confirmBtnText: '新增' - }; - systemRuleDialog = ngDialog.open({ - template: '/app/views/dialog/system-rule-dialog.html', - width: 680, - overlay: true, - scope: $scope - }); - }; - - $scope.saveRule = function () { - if ($scope.systemRuleDialog.type === 'add') { - addNewRule($scope.currentRule); - } else if ($scope.systemRuleDialog.type === 'edit') { - saveRule($scope.currentRule, true); - } - }; - - var confirmDialog; - $scope.deleteRule = function (rule) { - $scope.currentRule = rule; - var ruleTypeDesc = ''; - var ruleTypeCount = null; - if (rule.highestSystemLoad != -1) { - ruleTypeDesc = 'LOAD'; - ruleTypeCount = rule.highestSystemLoad; - } else if (rule.avgRt != -1) { - ruleTypeDesc = 'RT'; - ruleTypeCount = rule.avgRt; - } else if (rule.maxThread != -1) { - ruleTypeDesc = '线程数'; - ruleTypeCount = rule.maxThread; - } else if (rule.qps != -1) { - ruleTypeDesc = 'QPS'; - ruleTypeCount = rule.qps; - }else if (rule.highestCpuUsage != -1) { - ruleTypeDesc = 'CPU 使用率'; - ruleTypeCount = rule.highestCpuUsage; - } - - $scope.confirmDialog = { - title: '删除系统保护规则', - type: 'delete_rule', - attentionTitle: '请确认是否删除如下系统保护规则', - attention: '阈值类型: ' + ruleTypeDesc + ', 阈值: ' + ruleTypeCount, - confirmBtnText: '删除', - }; - confirmDialog = ngDialog.open({ - template: '/app/views/dialog/confirm-dialog.html', - scope: $scope, - overlay: true - }); - }; - - - $scope.confirm = function () { - if ($scope.confirmDialog.type === 'delete_rule') { - deleteRule($scope.currentRule); - // } else if ($scope.confirmDialog.type == 'enable_rule') { - // $scope.currentRule.enable = true; - // saveRule($scope.currentRule); - // } else if ($scope.confirmDialog.type == 'disable_rule') { - // $scope.currentRule.enable = false; - // saveRule($scope.currentRule); - // } else if ($scope.confirmDialog.type == 'enable_all') { - // enableAll($scope.app); - // } else if ($scope.confirmDialog.type == 'disable_all') { - // disableAll($scope.app); - } else { - console.error('error'); - } - }; - - function deleteRule(rule) { - SystemService.deleteRule(rule).success(function (data) { - if (data.code === 0) { - getMachineRules(); - confirmDialog.close(); - } else if (data.msg != null) { - alert('失败:' + data.msg); - } else { - alert('失败:未知错误'); - } - }); - } - - function addNewRule(rule) { - if (rule.grade == 4 && (rule.highestCpuUsage < 0 || rule.highestCpuUsage > 1)) { - alert('CPU 使用率模式的取值范围应为 [0.0, 1.0],对应 0% - 100%'); - return; - } - SystemService.newRule(rule).success(function (data) { - if (data.code === 0) { - getMachineRules(); - systemRuleDialog.close(); - } else if (data.msg != null) { - alert('失败:' + data.msg); - } else { - alert('失败:未知错误'); - } - }); - } - - function saveRule(rule, edit) { - SystemService.saveRule(rule).success(function (data) { - if (data.code === 0) { - getMachineRules(); - if (edit) { - systemRuleDialog.close(); - } else { - confirmDialog.close(); - } - } else if (data.msg != null) { - alert('失败:' + data.msg); - } else { - alert('失败:未知错误'); - } - }); - } - queryAppMachines(); - function queryAppMachines() { - MachineService.getAppMachines($scope.app).success( - function (data) { - if (data.code === 0) { - // $scope.machines = data.data; - if (data.data) { - $scope.machines = []; - $scope.macsInputOptions = []; - data.data.forEach(function (item) { - if (item.healthy) { - $scope.macsInputOptions.push({ - text: item.ip + ':' + item.port, - value: item.ip + ':' + item.port - }); - } - }); - } - if ($scope.macsInputOptions.length > 0) { - $scope.macInputModel = $scope.macsInputOptions[0].value; - } - } else { - $scope.macsInputOptions = []; - } - } - ); - }; - $scope.$watch('macInputModel', function () { - if ($scope.macInputModel) { - getMachineRules(); - } - }); - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html deleted file mode 100644 index 4584e89b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.html +++ /dev/null @@ -1,15 +0,0 @@ -
- - - -
\ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js deleted file mode 100644 index 4e6c8f2c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/header/header.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @ngdoc directive - * @name izzyposWebApp.directive:adminPosHeader - * @description - * # adminPosHeader - */ -angular.module('sentinelDashboardApp') - .directive('header', ['VersionService', 'AuthService', function () { - return { - templateUrl: 'app/scripts/directives/header/header.html', - restrict: 'E', - replace: true, - controller: function ($scope, $state, $window, VersionService, AuthService) { - VersionService.version().success(function (data) { - if (data.code == 0) { - $scope.dashboardVersion = data.data; - } - }); - - if (!$window.localStorage.getItem("session_sentinel_admin")) { - AuthService.check().success(function (data) { - if (data.code == 0) { - $window.localStorage.setItem('session_sentinel_admin', JSON.stringify(data.data)); - handleLogout($scope, data.data.id) - } else { - $state.go('login'); - } - }); - } else { - try { - var id = JSON.parse($window.localStorage.getItem("session_sentinel_admin")).id; - handleLogout($scope, id); - } catch (e) { - // Historical version compatibility processing, fixes issue-1449 - // If error happens while parsing, remove item in localStorage and redirect to login page. - $window.localStorage.removeItem("session_sentinel_admin"); - $state.go('login'); - } - } - - function handleLogout($scope, id) { - if (id == 'FAKE_EMP_ID') { - $scope.showLogout = false; - } else { - $scope.showLogout = true; - } - } - - $scope.logout = function () { - AuthService.logout().success(function (data) { - if (data.code == 0) { - $window.localStorage.removeItem("session_sentinel_admin"); - $state.go('login'); - } else { - alert('logout error'); - } - }); - } - } - } - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html deleted file mode 100644 index 18b2b3a9..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.html +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js deleted file mode 100644 index 31acca6e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar-search/sidebar-search.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @ngdoc directive - * @name izzyposWebApp.directive:adminPosHeader - * @description - * # adminPosHeader - */ - -angular.module('sentinelDashboardApp') - .directive('sidebarSearch', function () { - return { - templateUrl: 'app/scripts/directives/sidebar/sidebar-search/sidebar-search.html', - restrict: 'E', - replace: true, - scope: { - }, - controller: function ($scope) { - $scope.selectedMenu = 'home'; - } - } - }); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html deleted file mode 100644 index a7212629..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html +++ /dev/null @@ -1,91 +0,0 @@ - \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js deleted file mode 100644 index 7ef57401..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.js +++ /dev/null @@ -1,71 +0,0 @@ -angular.module('sentinelDashboardApp') - .directive('sidebar', ['$location', '$stateParams', 'AppService', function () { - return { - templateUrl: 'app/scripts/directives/sidebar/sidebar.html', - restrict: 'E', - replace: true, - scope: { - }, - controller: function ($scope, $stateParams, $location, AppService) { - $scope.app = $stateParams.app; - $scope.collapseVar = 0; - - // app - AppService.getApps().success( - function (data) { - if (data.code === 0) { - let path = $location.path().split('/'); - let initHashApp = path[path.length - 1]; - $scope.apps = data.data; - $scope.apps = $scope.apps.map(function (item) { - if (item.app === initHashApp) { - item.active = true; - } - let healthyCount = 0; - for (let i in item.machines) { - if (item.machines[i].healthy) { - healthyCount++; - } - } - item.healthyCount = healthyCount; - // Handle appType - item.isGateway = item.appType === 1 || item.appType === 11 || item.appType === 12; - - if (item.shown) { - return item; - } - }); - } - } - ); - - // toggle side bar - $scope.click = function ($event) { - let entry = angular.element($event.target).scope().entry; - entry.active = !entry.active;// toggle this clicked app bar - - $scope.apps.forEach(function (item) { // collapse other app bars - if (item !== entry) { - item.active = false; - } - }); - }; - - /** - * @deprecated - */ - $scope.addSearchApp = function () { - let findApp = false; - for (let i = 0; i < $scope.apps.length; i++) { - if ($scope.apps[i].app === $scope.searchApp) { - findApp = true; - break; - } - } - if (!findApp) { - $scope.apps.push({ app: $scope.searchApp }); - } - }; - } - }; - }]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js deleted file mode 100644 index f39b08f7..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/filters/filters.js +++ /dev/null @@ -1,17 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.filter('range', [function () { - return function (input, length) { - if (isNaN(length) || length <= 0) { - return []; - } - - input = []; - for (var index = 1; index <= length; index++) { - input.push(index); - } - - return input; - }; - -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js deleted file mode 100644 index 1eff197d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/libs/treeTable.js +++ /dev/null @@ -1,292 +0,0 @@ -var com_github_culmat_jsTreeTable = (function(){ - - function depthFirst(tree, func, childrenAttr) { - childrenAttr = childrenAttr || 'children' - function i_depthFirst(node) { - if (node[childrenAttr]) { - $.each(node[childrenAttr], function(i, child) { - i_depthFirst(child) - }) - } - func(node) - } - $.each(tree, function(i, root) { - i_depthFirst(root) - }) - return tree - } - - /* - * make a deep copy of the object - */ - function copy(data){ - return JSON.parse(JSON.stringify(data)) - } - - function makeTree (data, idAttr, refAttr, childrenAttr) { - var data_tmp = data - idAttr = idAttr || 'id' - refAttr = refAttr || 'parent' - childrenAttr = childrenAttr || 'children' - - var byName = [] - $.each(data_tmp, function(i, entry) { - byName[entry[idAttr]] = entry - }) - var tree = [] - $.each(data_tmp, function(i, entry) { - var parents = entry[refAttr] - if(!$.isArray(parents)){ - parents = [parents] - } - if(parents.length == 0){ - tree.push(entry) - } else { - var inTree = false; - $.each(parents, function(i,parentID){ - var parent = byName[parentID] - if (parent) { - if (!parent[childrenAttr]) { - parent[childrenAttr] = [] - } - if($.inArray(entry, parent[childrenAttr])< 0) - parent[childrenAttr].push(entry) - inTree = true - } - }) - if(!inTree){ - tree.push(entry) - } - } - }) - return tree - } - - function renderTree(tree, childrenAttr, idAttr, attrs, renderer, tableAttributes) { - childrenAttr = childrenAttr || 'children' - idAttr = idAttr || 'id' - tableAttributes = tableAttributes || {} - var maxLevel = 0; - var ret = [] - - var table = $("") - $.each(tableAttributes, function(key, value){ - if(key == 'class' && value != 'jsTT') { - table.addClass(value) - } else { - table.attr(key, value) - } - }) - var thead = $("") - var tr = $("") - var tbody = $("") - - table.append(thead) - thead.append(tr) - table.append(tbody) - if (attrs) { - $.each(attrs, function(attr, desc) { - $(tr).append($('')) - }) - } else { - $(tr).append($('')) - $.each(tree[0], function(key, value) { - if (key != childrenAttr && key != idAttr) - $(tr).append($('')) - }) - } - - function render(node, parent) { - var tr = $("") - $(tr).attr('data-tt-id', node[idAttr]) - $(tr).attr('data-tt-level', node['data-tt-level']) - if(!node[childrenAttr] || node[childrenAttr].length == 0) - $(tr).attr('data-tt-isleaf', true) - else - $(tr).attr('data-tt-isnode', true) - if (parent) { - $(tr).attr('data-tt-parent-id', parent[idAttr]) - } - if (renderer) { - renderer($(tr), node) - }else if (attrs) { - $.each(attrs, function(attr, desc) { - $(tr).append($('')) - }) - } else { - $(tr).append($('')) - $.each(node, function(key, value) { - if (key != childrenAttr && key != idAttr && key != 'data-tt-level') - $(tr).append($('')) - }) - } - tbody.append(tr) - } - - function i_renderTree(subTree, childrenAttr, level, parent) { - maxLevel = Math.max(maxLevel, level) - $.each(subTree, function(i, node) { - node['data-tt-level'] = level - render(node, parent) - if (node[childrenAttr]) { - $.each(node[childrenAttr], function(i, child) { - i_renderTree([ child ], childrenAttr, level + 1, node) - }) - } - }) - } - i_renderTree(tree, childrenAttr, 1) - if (tree[0]) - tree[0].maxLevel = maxLevel - return table - } - - function attr2attr(nodes, attrs){ - $.each(nodes, function(i, node) { - $.each(attrs, function(j, at) { - node[at] = $(node).attr(at) - }) - }) - return nodes - } - - function treeTable(table){ - table.addClass('jsTT') - table.expandLevel = function (n) { - $("tr[data-tt-level]", table).each(function(index) { - var level = parseInt($(this).attr('data-tt-level')) - if (level > n-1) { - this.trCollapse(true) - } else if (level == n-1){ - this.trExpand(true) - } - }) - } - function getLevel(node){ - var level = node.attr('data-tt-level') - if(level != undefined ) return parseInt(level) - var parentID = node.attr('data-tt-parent-id') - if( parentID == undefined){ - return 0 - } else { - return getLevel($('tr[data-tt-id="'+parentID+'"]', table).first()) + 1 - } - } - $("tr[data-tt-id]", table).each(function(i,node){ - node = $(node) - node.attr('data-tt-level', getLevel(node)) - }) - var dat = $("tr[data-tt-level]", table).get() - $.each(dat, function(j, d) { - d.trChildrenVisible = true - d.trChildren = [] - }) - dat = attr2attr(dat, ['data-tt-id', 'data-tt-parent-id']) - dat = makeTree(dat, 'data-tt-id', 'data-tt-parent-id', 'trChildren') - - var imgExpand = "data:image/png;base64,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" - var imgCollapse = "data:image/png;base64,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" - $("tr[data-tt-level]", table).each(function(index, tr) { - var level = $(tr).attr('data-tt-level') - var td = $("td",tr).first() - if(tr.trChildren.length>0){ - td.prepend($('')) - } else { - td.prepend($('')) - } - td.prepend($('')) - // td.css('white-space','nowrap') - tr.trExpand = function(changeState){ - if(this.trChildren.length < 1) return - if(changeState) { - this.trChildrenVisible = true - $('#state', this).get(0).src= imgCollapse - } - var doit = changeState || this.trChildrenVisible - $.each(this.trChildren, function(i, ctr) { - if(doit) $(ctr).css('display', 'table-row') - ctr.trExpand() - }) - } - tr.trCollapse = function(changeState){ - if(this.trChildren.length < 1) return - if(changeState) { - this.trChildrenVisible = false - $('#state', this).get(0).src= imgExpand - } - $.each(this.trChildren, function(i, ctr) { - $(ctr).css('display', 'none') - ctr.trCollapse() - }) - } - $(tr).click(function() { - this.trChildrenVisible ? this.trCollapse(true) : this.trExpand(true) - }) - }) - return table - } - - function appendTreetable(tree, options) { - function inALine(nodes) { - var tr = $('') - $.each(nodes, function(i, node){ - tr.append($('
' + desc + '' + idAttr + '' + key + '
' + node[attr] + '' + node[idAttr] + '' + value + '
').append(node)) - }) - return $('').append(tr) - - } - options = options || {} - options.idAttr = (options.idAttr || 'id') - options.childrenAttr = (options.childrenAttr || 'children') - var controls = (options.controls || []) - - if (!options.mountPoint) - options.mountPoint = $('body') - - if (options.depthFirst) - depthFirst(tree, options.depthFirst, options.childrenAttr) - var rendered = renderTree(tree, options.childrenAttr, options.idAttr, - options.renderedAttr, options.renderer, options.tableAttributes) - - treeTable(rendered) - if (options.replaceContent) { - options.mountPoint.html('') - } - var initialExpandLevel = options.initialExpandLevel ? parseInt(options.initialExpandLevel) : -1 - initialExpandLevel = Math.min(initialExpandLevel, tree[0].maxLevel) - rendered.expandLevel(initialExpandLevel) - if(options.slider){ - var slider = $('
') - slider.width('200px') - slider.slider({ - min : 1, - max : tree[0].maxLevel, - range : "min", - value : initialExpandLevel, - slide : function(event, ui) { - rendered.expandLevel(ui.value) - } - }) - controls = [slider].concat(options.controls) - } - - if(controls.length >0){ - options.mountPoint.append(inALine(controls)) - } - options.mountPoint.append(rendered) - return rendered - } - - return { - depthFirst : depthFirst, - makeTree : makeTree, - renderTree : renderTree, - attr2attr : attr2attr, - treeTable : treeTable, - appendTreetable : appendTreetable, - jsTreeTable : '1.0', - register : function(target){ - $.each(this, function(key, value){ if(key != 'register') target[key] = value}) - } - } -})(); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js deleted file mode 100644 index 47705836..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/appservice.js +++ /dev/null @@ -1,12 +0,0 @@ - -var app = angular.module('sentinelDashboardApp'); - -app.service('AppService', ['$http', function ($http) { - this.getApps = function () { - return $http({ - // url: 'app/mock_infos', - url: 'app/briefinfos.json', - method: 'GET' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js deleted file mode 100644 index fec1cf4a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/auth_service.js +++ /dev/null @@ -1,25 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('AuthService', ['$http', function ($http) { - this.check = function () { - return $http({ - url: '/auth/check', - method: 'POST' - }); - }; - - this.login = function (param) { - return $http({ - url: '/auth/login', - params: param, - method: 'POST' - }); - }; - - this.logout = function () { - return $http({ - url: '/auth/logout', - method: 'POST' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js deleted file mode 100644 index 42a61012..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/authority_service.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Authority rule service. - */ -angular.module('sentinelDashboardApp').service('AuthorityRuleService', ['$http', function ($http) { - this.queryMachineRules = function(app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: '/authority/rules', - params: param, - method: 'GET' - }); - }; - - this.addNewRule = function(rule) { - return $http({ - url: '/authority/rule', - data: rule, - method: 'POST' - }); - }; - - this.saveRule = function (entity) { - return $http({ - url: '/authority/rule/' + entity.id, - data: entity, - method: 'PUT' - }); - }; - - this.deleteRule = function (entity) { - return $http({ - url: '/authority/rule/' + entity.id, - method: 'DELETE' - }); - }; - - this.checkRuleValid = function checkRuleValid(rule) { - if (rule.resource === undefined || rule.resource === '') { - alert('资源名称不能为空'); - return false; - } - if (rule.limitApp === undefined || rule.limitApp === '') { - alert('流控针对应用不能为空'); - return false; - } - if (rule.strategy === undefined) { - alert('必须选择黑白名单模式'); - return false; - } - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js deleted file mode 100644 index 7bca8161..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/cluster_state_service.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Cluster state control service. - * - * @author Eric Zhao - */ -angular.module('sentinelDashboardApp').service('ClusterStateService', ['$http', function ($http) { - - this.fetchClusterUniversalStateSingle = function(app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: '/cluster/state_single', - params: param, - method: 'GET' - }); - }; - - this.fetchClusterUniversalStateOfApp = function(app) { - return $http({ - url: '/cluster/state/' + app, - method: 'GET' - }); - }; - - this.fetchClusterServerStateOfApp = function(app) { - return $http({ - url: '/cluster/server_state/' + app, - method: 'GET' - }); - }; - - this.fetchClusterClientStateOfApp = function(app) { - return $http({ - url: '/cluster/client_state/' + app, - method: 'GET' - }); - }; - - this.modifyClusterConfig = function(config) { - return $http({ - url: '/cluster/config/modify_single', - data: config, - method: 'POST' - }); - }; - - this.applyClusterFullAssignOfApp = function(app, clusterMap) { - return $http({ - url: '/cluster/assign/all_server/' + app, - data: clusterMap, - method: 'POST' - }); - }; - - this.applyClusterSingleServerAssignOfApp = function(app, request) { - return $http({ - url: '/cluster/assign/single_server/' + app, - data: request, - method: 'POST' - }); - }; - - this.applyClusterServerBatchUnbind = function(app, machineSet) { - return $http({ - url: '/cluster/assign/unbind_server/' + app, - data: machineSet, - method: 'POST' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js deleted file mode 100644 index a242b22a..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/degrade_service.js +++ /dev/null @@ -1,97 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('DegradeService', ['$http', function ($http) { - this.queryMachineRules = function (app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: 'degrade/rules.json', - params: param, - method: 'GET' - }); - }; - - this.newRule = function (rule) { - return $http({ - url: '/degrade/rule', - data: rule, - method: 'POST' - }); - }; - - this.saveRule = function (rule) { - var param = { - id: rule.id, - resource: rule.resource, - limitApp: rule.limitApp, - grade: rule.grade, - count: rule.count, - timeWindow: rule.timeWindow, - statIntervalMs: rule.statIntervalMs, - minRequestAmount: rule.minRequestAmount, - slowRatioThreshold: rule.slowRatioThreshold, - }; - return $http({ - url: '/degrade/rule/' + rule.id, - data: param, - method: 'PUT' - }); - }; - - this.deleteRule = function (rule) { - return $http({ - url: '/degrade/rule/' + rule.id, - method: 'DELETE' - }); - }; - - this.checkRuleValid = function (rule) { - if (rule.resource === undefined || rule.resource === '') { - alert('资源名称不能为空'); - return false; - } - if (rule.grade === undefined || rule.grade < 0) { - alert('未知的降级策略'); - return false; - } - if (rule.count === undefined || rule.count === '' || rule.count < 0) { - alert('降级阈值不能为空或小于 0'); - return false; - } - if (rule.timeWindow == undefined || rule.timeWindow === '' || rule.timeWindow <= 0) { - alert('熔断时长必须大于 0s'); - return false; - } - if (rule.minRequestAmount == undefined || rule.minRequestAmount <= 0) { - alert('最小请求数目需大于 0'); - return false; - } - if (rule.statIntervalMs == undefined || rule.statIntervalMs <= 0) { - alert('统计窗口时长需大于 0s'); - return false; - } - if (rule.statIntervalMs !== undefined && rule.statIntervalMs > 60 * 1000 * 2) { - alert('统计窗口时长不能超过 120 分钟'); - return false; - } - // 异常比率类型. - if (rule.grade == 1 && rule.count > 1) { - alert('异常比率超出范围:[0.0 - 1.0]'); - return false; - } - if (rule.grade == 0) { - if (rule.slowRatioThreshold == undefined) { - alert('慢调用比率不能为空'); - return false; - } - if (rule.slowRatioThreshold < 0 || rule.slowRatioThreshold > 1) { - alert('慢调用比率超出范围:[0.0 - 1.0]'); - return false; - } - } - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js deleted file mode 100644 index 051a3c71..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v1.js +++ /dev/null @@ -1,119 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('FlowServiceV1', ['$http', function ($http) { - this.queryMachineRules = function (app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: '/v1/flow/rules', - params: param, - method: 'GET' - }); - }; - - this.newRule = function (rule) { - var param = { - resource: rule.resource, - limitApp: rule.limitApp, - grade: rule.grade, - count: rule.count, - strategy: rule.strategy, - refResource: rule.refResource, - controlBehavior: rule.controlBehavior, - warmUpPeriodSec: rule.warmUpPeriodSec, - maxQueueingTimeMs: rule.maxQueueingTimeMs, - app: rule.app, - ip: rule.ip, - port: rule.port - }; - - return $http({ - url: '/v1/flow/rule', - data: rule, - method: 'POST' - }); - }; - - this.saveRule = function (rule) { - var param = { - id: rule.id, - resource: rule.resource, - limitApp: rule.limitApp, - grade: rule.grade, - count: rule.count, - strategy: rule.strategy, - refResource: rule.refResource, - controlBehavior: rule.controlBehavior, - warmUpPeriodSec: rule.warmUpPeriodSec, - maxQueueingTimeMs: rule.maxQueueingTimeMs, - }; - - return $http({ - url: '/v1/flow/save.json', - params: param, - method: 'PUT' - }); - }; - - this.deleteRule = function (rule) { - var param = { - id: rule.id, - app: rule.app - }; - - return $http({ - url: '/v1/flow/delete.json', - params: param, - method: 'DELETE' - }); - }; - - function notNumberAtLeastZero(num) { - return num === undefined || num === '' || isNaN(num) || num < 0; - } - - function notNumberGreaterThanZero(num) { - return num === undefined || num === '' || isNaN(num) || num <= 0; - } - - this.checkRuleValid = function (rule) { - if (rule.resource === undefined || rule.resource === '') { - alert('资源名称不能为空'); - return false; - } - if (rule.count === undefined || rule.count < 0) { - alert('限流阈值必须大于等于 0'); - return false; - } - if (rule.strategy === undefined || rule.strategy < 0) { - alert('无效的流控模式'); - return false; - } - if (rule.strategy == 1 || rule.strategy == 2) { - if (rule.refResource === undefined || rule.refResource == '') { - alert('请填写关联资源或入口'); - return false; - } - } - if (rule.controlBehavior === undefined || rule.controlBehavior < 0) { - alert('无效的流控整形方式'); - return false; - } - if (rule.controlBehavior == 1 && notNumberGreaterThanZero(rule.warmUpPeriodSec)) { - alert('预热时长必须大于 0'); - return false; - } - if (rule.controlBehavior == 2 && notNumberGreaterThanZero(rule.maxQueueingTimeMs)) { - alert('排队超时时间必须大于 0'); - return false; - } - if (rule.clusterMode && (rule.clusterConfig === undefined || rule.clusterConfig.thresholdType === undefined)) { - alert('集群限流配置不正确'); - return false; - } - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js deleted file mode 100644 index 716d66d2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/flow_service_v2.js +++ /dev/null @@ -1,85 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('FlowServiceV2', ['$http', function ($http) { - this.queryMachineRules = function (app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: '/v2/flow/rules', - params: param, - method: 'GET' - }); - }; - - this.newRule = function (rule) { - return $http({ - url: '/v2/flow/rule', - data: rule, - method: 'POST' - }); - }; - - this.saveRule = function (rule) { - return $http({ - url: '/v2/flow/rule/' + rule.id, - data: rule, - method: 'PUT' - }); - }; - - this.deleteRule = function (rule) { - return $http({ - url: '/v2/flow/rule/' + rule.id, - method: 'DELETE' - }); - }; - - function notNumberAtLeastZero(num) { - return num === undefined || num === '' || isNaN(num) || num < 0; - } - - function notNumberGreaterThanZero(num) { - return num === undefined || num === '' || isNaN(num) || num <= 0; - } - - this.checkRuleValid = function (rule) { - if (rule.resource === undefined || rule.resource === '') { - alert('资源名称不能为空'); - return false; - } - if (rule.count === undefined || rule.count < 0) { - alert('限流阈值必须大于等于 0'); - return false; - } - if (rule.strategy === undefined || rule.strategy < 0) { - alert('无效的流控模式'); - return false; - } - if (rule.strategy == 1 || rule.strategy == 2) { - if (rule.refResource === undefined || rule.refResource == '') { - alert('请填写关联资源或入口'); - return false; - } - } - if (rule.controlBehavior === undefined || rule.controlBehavior < 0) { - alert('无效的流控整形方式'); - return false; - } - if (rule.controlBehavior == 1 && notNumberGreaterThanZero(rule.warmUpPeriodSec)) { - alert('预热时长必须大于 0'); - return false; - } - if (rule.controlBehavior == 2 && notNumberGreaterThanZero(rule.maxQueueingTimeMs)) { - alert('排队超时时间必须大于 0'); - return false; - } - if (rule.clusterMode && (rule.clusterConfig === undefined || rule.clusterConfig.thresholdType === undefined)) { - alert('集群限流配置不正确'); - return false; - } - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js deleted file mode 100644 index 373f71db..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/api_service.js +++ /dev/null @@ -1,73 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('GatewayApiService', ['$http', function ($http) { - this.queryApis = function (app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: '/gateway/api/list.json', - params: param, - method: 'GET' - }); - }; - - this.newApi = function (api) { - return $http({ - url: '/gateway/api/new.json', - data: api, - method: 'POST' - }); - }; - - this.saveApi = function (api) { - return $http({ - url: '/gateway/api/save.json', - data: api, - method: 'POST' - }); - }; - - this.deleteApi = function (api) { - var param = { - id: api.id, - app: api.app - }; - return $http({ - url: '/gateway/api/delete.json', - params: param, - method: 'POST' - }); - }; - - this.checkApiValid = function (api, apiNames) { - if (api.apiName === undefined || api.apiName === '') { - alert('API名称不能为空'); - return false; - } - - if (api.predicateItems == null || api.predicateItems.length === 0) { - // Should never happen since no remove button will display when only one predicateItem. - alert('至少有一个匹配规则'); - return false; - } - - for (var i = 0; i < api.predicateItems.length; i++) { - var predicateItem = api.predicateItems[i]; - var pattern = predicateItem.pattern; - if (pattern === undefined || pattern === '') { - alert('匹配串不能为空,请检查'); - return false; - } - } - - if (apiNames.indexOf(api.apiName) !== -1) { - alert('API名称(' + api.apiName + ')已存在'); - return false; - } - - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js deleted file mode 100644 index b026b32f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/gateway/flow_service.js +++ /dev/null @@ -1,76 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('GatewayFlowService', ['$http', function ($http) { - this.queryRules = function (app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - - return $http({ - url: '/gateway/flow/list.json', - params: param, - method: 'GET' - }); - }; - - this.newRule = function (rule) { - return $http({ - url: '/gateway/flow/new.json', - data: rule, - method: 'POST' - }); - }; - - this.saveRule = function (rule) { - return $http({ - url: '/gateway/flow/save.json', - data: rule, - method: 'POST' - }); - }; - - this.deleteRule = function (rule) { - var param = { - id: rule.id, - app: rule.app - }; - - return $http({ - url: '/gateway/flow/delete.json', - params: param, - method: 'POST' - }); - }; - - this.checkRuleValid = function (rule) { - if (rule.resource === undefined || rule.resource === '') { - alert('API名称不能为空'); - return false; - } - - if (rule.paramItem != null) { - if (rule.paramItem.parseStrategy == 2 || - rule.paramItem.parseStrategy == 3 || - rule.paramItem.parseStrategy == 4) { - if (rule.paramItem.fieldName === undefined || rule.paramItem.fieldName === '') { - alert('当参数属性为Header、URL参数、Cookie时,参数名称不能为空'); - return false; - } - - if (rule.paramItem.pattern === '') { - alert('匹配串不能为空'); - return false; - } - } - } - - if (rule.count === undefined || rule.count < 0) { - alert((rule.grade === 1 ? 'QPS阈值' : '线程数') + '必须大于等于 0'); - return false; - } - - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js deleted file mode 100644 index 926c0021..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/identityservice.js +++ /dev/null @@ -1,30 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('IdentityService', ['$http', function ($http) { - - this.fetchIdentityOfMachine = function (ip, port, searchKey) { - var param = { - ip: ip, - port: port, - searchKey: searchKey - }; - return $http({ - url: 'resource/machineResource.json', - params: param, - method: 'GET' - }); - }; - this.fetchClusterNodeOfMachine = function (ip, port, searchKey) { - var param = { - ip: ip, - port: port, - type: 'cluster', - searchKey: searchKey - }; - return $http({ - url: 'resource/machineResource.json', - params: param, - method: 'GET' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js deleted file mode 100644 index 2d3b5e8b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/machineservice.js +++ /dev/null @@ -1,25 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('MachineService', ['$http', '$httpParamSerializerJQLike', - function ($http, $httpParamSerializerJQLike) { - this.getAppMachines = function (app) { - return $http({ - url: 'app/' + app + '/machines.json', - method: 'GET' - }); - }; - this.removeAppMachine = function (app, ip, port) { - return $http({ - url: 'app/' + app + '/machine/remove.json', - method: 'POST', - headers: { - 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - data: $httpParamSerializerJQLike({ - ip: ip, - port: port - }) - }); - }; - }] -); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js deleted file mode 100644 index 8d8a38e0..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/metricservice.js +++ /dev/null @@ -1,36 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('MetricService', ['$http', function ($http) { - - this.queryAppSortedIdentities = function (params) { - return $http({ - url: '/metric/queryTopResourceMetric.json', - params: params, - method: 'GET' - }); - }; - - this.queryByAppAndIdentity = function (params) { - return $http({ - url: '/metric/queryByAppAndResource.json', - params: params, - method: 'GET' - }); - }; - - this.queryByMachineAndIdentity = function (ip, port, identity, startTime, endTime) { - var param = { - ip: ip, - port: port, - identity: identity, - startTime: startTime.getTime(), - endTime: endTime.getTime() - }; - - return $http({ - url: '/metric/queryByAppAndResource.json', - params: param, - method: 'GET' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js deleted file mode 100644 index 2e235554..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/param_flow_service.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Parameter flow control service. - * - * @author Eric Zhao - */ -angular.module('sentinelDashboardApp').service('ParamFlowService', ['$http', function ($http) { - this.queryMachineRules = function(app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: '/paramFlow/rules', - params: param, - method: 'GET' - }); - }; - - this.addNewRule = function(rule) { - return $http({ - url: '/paramFlow/rule', - data: rule, - method: 'POST' - }); - }; - - this.saveRule = function (entity) { - return $http({ - url: '/paramFlow/rule/' + entity.id, - data: entity, - method: 'PUT' - }); - }; - - this.deleteRule = function (entity) { - return $http({ - url: '/paramFlow/rule/' + entity.id, - method: 'DELETE' - }); - }; - - function isNumberClass(classType) { - return classType === 'int' || classType === 'double' || - classType === 'float' || classType === 'long' || classType === 'short'; - } - - function isByteClass(classType) { - return classType === 'byte'; - } - - function notNumberAtLeastZero(num) { - return num === undefined || num === '' || isNaN(num) || num < 0; - } - - function notGoodNumber(num) { - return num === undefined || num === '' || isNaN(num); - } - - function notGoodNumberBetweenExclusive(num, l ,r) { - return num === undefined || num === '' || isNaN(num) || num < l || num > r; - } - - function notValidParamItem(curExItem) { - if (isNumberClass(curExItem.classType) && notGoodNumber(curExItem.object)) { - return true; - } - if (isByteClass(curExItem.classType) && notGoodNumberBetweenExclusive(curExItem.object, -128, 127)) { - return true; - } - return curExItem.object === undefined || curExItem.classType === undefined || - notNumberAtLeastZero(curExItem.count); - } - - this.checkRuleValid = function (rule) { - if (!rule.resource || rule.resource === '') { - alert('资源名称不能为空'); - return false; - } - if (rule.grade != 1) { - alert('未知的限流模式'); - return false; - } - if (rule.count < 0) { - alert('限流阈值必须大于等于 0'); - return false; - } - if (rule.paramIdx === undefined || rule.paramIdx === '' || isNaN(rule.paramIdx) || rule.paramIdx < 0) { - alert('热点参数索引必须大于等于 0'); - return false; - } - if (rule.paramFlowItemList !== undefined) { - for (var i = 0; i < rule.paramFlowItemList.length; i++) { - var item = rule.paramFlowItemList[i]; - if (notValidParamItem(item)) { - alert('热点参数例外项不合法,请检查值和类型是否正确:参数为 ' + item.object + ', 类型为 ' + - item.classType + ', 限流阈值为 ' + item.count); - return false; - } - } - } - return true; - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js deleted file mode 100644 index 8b476793..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/systemservice.js +++ /dev/null @@ -1,77 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('SystemService', ['$http', function ($http) { - this.queryMachineRules = function (app, ip, port) { - var param = { - app: app, - ip: ip, - port: port - }; - return $http({ - url: 'system/rules.json', - params: param, - method: 'GET' - }); - }; - - this.newRule = function (rule) { - var param = { - app: rule.app, - ip: rule.ip, - port: rule.port - }; - if (rule.grade == 0) {// avgLoad - param.highestSystemLoad = rule.highestSystemLoad; - } else if (rule.grade == 1) {// avgRt - param.avgRt = rule.avgRt; - } else if (rule.grade == 2) {// maxThread - param.maxThread = rule.maxThread; - } else if (rule.grade == 3) {// qps - param.qps = rule.qps; - } else if (rule.grade == 4) {// cpu - param.highestCpuUsage = rule.highestCpuUsage; - } - - return $http({ - url: '/system/new.json', - params: param, - method: 'GET' - }); - }; - - this.saveRule = function (rule) { - var param = { - id: rule.id, - }; - if (rule.grade == 0) {// avgLoad - param.highestSystemLoad = rule.highestSystemLoad; - } else if (rule.grade == 1) {// avgRt - param.avgRt = rule.avgRt; - } else if (rule.grade == 2) {// maxThread - param.maxThread = rule.maxThread; - } else if (rule.grade == 3) {// qps - param.qps = rule.qps; - } else if (rule.grade == 4) {// cpu - param.highestCpuUsage = rule.highestCpuUsage; - } - - return $http({ - url: '/system/save.json', - params: param, - method: 'GET' - }); - }; - - this.deleteRule = function (rule) { - var param = { - id: rule.id, - app: rule.app - }; - - return $http({ - url: '/system/delete.json', - params: param, - method: 'GET' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js deleted file mode 100644 index 1322f563..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/scripts/services/version_service.js +++ /dev/null @@ -1,10 +0,0 @@ -var app = angular.module('sentinelDashboardApp'); - -app.service('VersionService', ['$http', function ($http) { - this.version = function () { - return $http({ - url: '/version', - method: 'GET' - }); - }; -}]); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css deleted file mode 100644 index bb1db2bf..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/main.css +++ /dev/null @@ -1,1756 +0,0 @@ -.browsehappy { - margin: 0.2em 0; - background: #ccc; - color: #000; - padding: 0.2em 0; -} - -body { - padding: 0; -} - -/* Everything but the jumbotron gets side spacing for mobile first views */ - -.header, -.marketing, -.footer { - padding-left: 15px; - padding-right: 15px; -} - - -/* Custom page header */ - -.header { - border-bottom: 1px solid #e5e5e5; - margin-bottom: 10px; -} - - -/* Make the masthead heading the same height as the navigation */ - -.header h3 { - margin-top: 0; - margin-bottom: 0; - line-height: 40px; - padding-bottom: 19px; -} - - -/* Custom page footer */ - -.footer { - padding-top: 19px; - color: #777; - border-top: 1px solid #e5e5e5; -} - -.container-narrow > hr { - margin: 30px 0; -} - - -/* Main marketing message and sign up button */ - -.jumbotron { - text-align: center; - border-bottom: 1px solid #e5e5e5; -} - -.jumbotron .btn { - font-size: 21px; - padding: 14px 24px; -} - - -/* Supporting marketing content */ - -.marketing { - margin: 40px 0; -} - -.marketing p + h4 { - margin-top: 28px; -} - - -/* Responsive: Portrait tablets and up */ - -@media screen and (min-width: 768px) { - .container { - width: inherit; - margin-left: 60px; - margin-right: 5px; - } - /* Remove the padding we set earlier */ - .header, - .marketing, - .footer { - padding-left: 0; - padding-right: 0; - } - /* Space out the masthead */ - .header { - margin-bottom: 30px; - } - /* Remove the bottom border on the jumbotron for visual effect */ - .jumbotron { - border-bottom: 0; - } -} - -.navbar-inverse { - background-color: #1d9d74; - border-color: #1b926c; -} - -.navbar-inverse .navbar-nav > li > a { - color: #b0ddce; - font-size: 15px; -} - -.navbar-inverse .navbar-nav>.open>a, -.navbar-inverse .navbar-nav>.open>a:focus, -.navbar-inverse .navbar-nav>.open>a:hover { - background-color: #1b926c; -} - -@media (min-width: 900px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: 0%; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} - -.dropdown-menu { - min-width: 100px !important; -} - -.nav-sidebar li.active a { - background: #DDD; -} - -.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus { - background: #1d9d74; - /*background: #d9d9d9;*/ - color: white; -} - -.broadcast-message, -.broadcast-message-preview { - padding: 10px; - text-align: center; - background: #555; - color: #BBB; - margin-top: 50px; -} - -.card { - position: relative; - border: 1px solid #d9d9d9; - border-radius: 3px; - color: #666; - background-color: #fff; - width: 100%; - border-radius: 5px; -} - -.card .card-header { - padding: 9px 0; - height: 40px; - background: #555; - color: #fff; - text-align: center; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.card .card-body { - padding: 12px 10px; -} - -.card .card-footer { - height: 20px; - font-size: 10px; - color: #777; - margin-top: -15px; - margin-bottom: 5px; - margin-left: 20px; - margin-right: 20px; -} - -.card .detail-brand { - float: left; - width: 30%; - line-height: 98px; - font-size: 30px; - text-align: center; - color: white; -} - -.card .default { - background: #1d9d74; -} - -.card .info { - background: #6EBEE7; -} - -.card .warn { - background: #ED7F54; -} - -.card .danger { - background: #6583BE; -} - -.card .detail .text-default { - color: #1d9d74; -} - -.card .detail .text-info { - color: #6EBEE7; -} - -.card .detail .text-warn { - color: #ED7F54; -} - -.card .detail .text-danger { - color: #6583BE; -} - -.card .detail { - float: right; - width: 70%; - line-height: 98px; - text-align: center; -} - -.card .detail .text { - font-size: 12px; -} - -.card .detail .number { - font-size: 30px; - font-weight: 500; -} - -.h100 { - height: 100px; -} - -.inline { - display: inline; -} - -.separator { - height: 1px; - background-color: #e5e5e5; - margin-top: 10px; -} - -.card > .card-body > table > thead > tr > td, -.card > .card-body > table > tbody > tr > td { - word-wrap: break-word; - word-break: break-all; -} - -.card > .card-body > table > thead > tr > td { - font-weight: 500; - font-size: 13px; - text-align: center; -} - -.card > .card-body > table > thead > tr > td > span { - font-weight: 500; - font-size: 10px; -} - -.card > .card-body > table > tbody > tr > td { - font-size: 12px; - text-align: center; -} - -.card > .card-body > table > tbody > tr > td > a { - color: #666; -} - -.thumbnails > .card > .card-body > table > thead > tr > td, -.thumbnails > .card > .card-body > table > tbody > tr > td { - font-size: 12px; - color: #777; - word-wrap: break-word; - word-break: break-all; -} - -.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(n+2) { - text-align: center; -} - -.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(n+2) { - font-weight: 700; - text-align: center; -} - -.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(1), -.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(1) { - text-align: left; -} - -.tools-header { - background: whitesmoke; - padding: 9px 0; - height: 40px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.tools-header .brand { - font-size: 13px; - margin: 2px 10px; - font-weight: 700; - float: left; -} - -.tools-header .brand > a { - color: #666; -} - -.tools-header > button, -.tools-header > select, -.tools-header > a { - float: right; - max-width: 80px; - margin: 1px 10px; - height: 25px; - padding: 0 10px; - line-height: 25px; - color: #666; -} - -.tools-header .paged { - margin-right: 0px; -} - -.btn { - height: 32px; -} - -.btn.btn-main { - color: #ffffff; - background-color: #337ab7; - border-color: #337ab7; -} - -.btn:focus, -.btn:active { - outline: none !important; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active { - color: #1d9d74; - border-color: #1d9d74; - background: white; -} - - -.btn.btn-danger-tag { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; - line-height: 1px; - font-size: 11px; - padding: 4px 4px; -} - -.btn.btn-danger { - color: #333; - background-color: #fff; - border-color: #ccc; -} - -.btn.btn-danger:hover, -.btn.btn-danger:focus, -.btn.btn-danger:active { - color: #d9534f; - border-color: #d9534f; - background: white; -} - -.form-control { - height : 32px; -} - -.form-control:focus { - border-color: #337ab7; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1); -} - -.form-control { - border-radius: 8px; -} - -.input-label:before { - display: inline-block; - content: "*"; - color: #f44336; - font-family: SimSun; - font-size: 12px; - -webkit-transform: TranslateX(-10px); - -ms-transform: TranslateX(-10px); - transform: TranslateX(-10px); -} - -.label.label-main { - color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74; -} - -.badge-main { - color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74; -} - -.bootstrap-tagsinput { - background-color: #fff; - border: 1px solid #ccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - display: inline-block; - padding: 4px 6px; - color: #555; - vertical-align: middle; - border-radius: 4px; - /* max-width: 100%; */ - width: 85%; - height: 100px; - line-height: 20px; - cursor: text; -} - -.bootstrap-tagsinput > .dropdown-menu { - min-width: 40px; - font-size: 12px; -} - -.bootstrap-tagsinput > .dropdown-menu>.active>a, -.bootstrap-tagsinput > .dropdown-menu>.active>a:focus, -.bootstrap-tagsinput > .dropdown-menu>.active>a:hover { - background-color: #1d9d74; - background-image: -webkit-linear-gradient(top, #1d9d74 0, #1d9d74 100%); - background-image: -o-linear-gradient(top, #1d9d74 0, #1d9d74 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#1d9d74), to(#1d9d74)); - background-image: linear-gradient(to bottom, #1d9d74 0, #1d9d74 100%); - filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#1d9d74', endColorstr='#1d9d74', GradientType=0); - background-repeat: repeat-x; -} - -.bootstrap-tagsinput > .dropdown-menu>.active>a, -.bootstrap-tagsinput > .dropdown-menu>.active>a:focus, -.bootstrap-tagsinput > .dropdown-menu>.active>a:hover { - color: #fff; - text-decoration: none; - background-color: #1d9d74; - outline: 0; -} - -.bootstrap-tagsinput > .dropdown-menu>.active>a, -.bootstrap-tagsinput > .dropdown-menu>.active>a:hover, -.bootstrap-tagsinput > .dropdown-menu>.active>a:focus { - color: white; - text-decoration: none; - outline: 0; - background-color: #1d9d74; -} - -.inputs-header { - padding: 9px 0; - height: 50px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.inputs-header .brand { - font-size: 13px; - margin: 2px 10px; - font-weight: 700; - float: left; -} - -.inputs-header .brand > a { - color: #666; -} - -.inputs-header > input { - float: right; - margin: 1px 10px; - height: 30px; - padding: 0 10px; - color: #666; -} - -.inputs-header > a { - float: right; - margin: 1px 10px; - height: 30px; - padding: 5 5px; -} - -.inputs-header > select { - float: right; - max-width: 80px; - margin: 1px 10px; - height: 30px; - padding: 0 10px; - color: #666; - height: 25px; - font-size: 12px; -} - -.witdh-150 { - max-width: 150px; -} - -.witdh-200 { - max-width: 200px; -} - -.width-200 { - max-width: 200px; -} - -.witdh-300 { - max-width: 300px; -} - -.width-300 { - max-width: 300px; -} - -.card.highlight { - border-color: #d9534f; -} - -.card .pagination-footer { - height: 40px; - font-size: 10px; - color: #777; - margin-top: -15px; - margin-bottom: 5px; - margin-left: 20px; - margin-right: 20px; -} - -.card .pagination-footer .tools { - font-size: 12px; - margin: 11px 0; - float: right; - display: inline; - margin-right: 20px; -} - -.card > .pagination-footer > .tools > span > input { - height: 25px; - max-width: 50px; - display: inline; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 8px 0; - float: right; - border-radius: 4px; -} - - -.pagination > a { - margin-right: 5px; - height: 28px; - width: 28px; - padding: 5px 0px; -} - -.pagination > .btn.active { - color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74; -} - - - - -.datepicker > .table > thead > tr > td, .datepicker > .table > tbody > tr > td, -.timepicker > .table > thead > tr > td, .timepicker > .table > tbody > tr > td { - padding: 5px 3px; -} - -.datepicker > .table > thead > tr > td > .btn, .datepicker > .table > tbody > tr > td > .btn, -.timepicker > .table > thead > tr > td > .btn, .timepicker > .table > tbody > tr > td > .btn { - border: 1px solid #FFFDFD; -} - -.datepicker > .table > thead > tr > td > .btn-default:hover, -.datepicker > .table > thead > tr > td > .btn-default:focus, -.datepicker > .table > thead > tr > td > .btn-default:active, -.datepicker > .table > tbody > tr > td > .btn-default:hover, -.datepicker > .table > tbody > tr > td > .btn-default:focus, -.datepicker > .table > tbody > tr > td > .btn-default:active, -.timepicker > .table > thead > tr > td > .btn-default:hover, -.timepicker > .table > thead > tr > td > .btn-default:focus, -.timepicker > .table > thead > tr > td > .btn-default:active, -.timepicker > .table > tbody > tr > td > .btn-default:hover, -.timepicker > .table > tbody > tr > td > .btn-default:focus, -.timepicker > .table > tbody > tr > td > .btn-default:active { - color: #1d9d74; - border-color: #1d9d74; - background: white; -} - -.datepicker > .table > thead > tr > td > a, .datepicker > .table > tbody > tr > td > a, -.timepicker > .table > thead > tr > td > a, .timepicker > .table > tbody > tr > td > a { - height: 25px; - width: 25px; - padding: 3px 0px; -} - -.datepicker > .table > tbody > tr:first-child > td > a { - padding: 4px 0px; -} - -.datepicker > .table > thead > tr > td > a.btn.active, -.datepicker > .table > tbody > tr > td > a.btn.active, -.timepicker > .table > thead > tr > td > a.btn.active, -.timepicker > .table > tbody > tr > td > a.btn.active { -/* color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74;*/ - color: #1d9d74; - border-color: #1d9d74; - background: white; - box-shadow: inset 0 0px 0px rgba(0,0,0,0.125); -} - -.datepicker > .table > thead > tr > td:not(:first-child):last-child > a, -.timepicker > .table > thead > tr > td:not(:first-child):last-child > a { - height: 25px; - width: 50px; - padding: 5px 0px; -} - -.datepicker > .table > tbody > tr > td > a, -.timepicker > .table > tbody > tr > td > a { - margin-left: 8px; -} - - -.selectize-input-200 > .selectize-input { - min-width: 250px; -} - -.highlight-border { - border-color: #337ab7; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1); -}.browsehappy { - margin: 0.2em 0; - background: #ccc; - color: #000; - padding: 0.2em 0; -} - -body { - padding: 0; -} - - -/* Everything but the jumbotron gets side spacing for mobile first views */ - -.header, -.marketing, -.footer { - padding-left: 15px; - padding-right: 15px; -} - - -/* Custom page header */ - -.header { - border-bottom: 1px solid #e5e5e5; - margin-bottom: 10px; -} - - -/* Make the masthead heading the same height as the navigation */ - -.header h3 { - margin-top: 0; - margin-bottom: 0; - line-height: 40px; - padding-bottom: 19px; -} - - -/* Custom page footer */ - -.footer { - padding-top: 19px; - color: #777; - border-top: 1px solid #e5e5e5; -} - -.container-narrow > hr { - margin: 30px 0; -} - - -/* Main marketing message and sign up button */ - -.jumbotron { - text-align: center; - border-bottom: 1px solid #e5e5e5; -} - -.jumbotron .btn { - font-size: 21px; - padding: 14px 24px; -} - - -/* Supporting marketing content */ - -.marketing { - margin: 40px 0; -} - -.marketing p + h4 { - margin-top: 28px; -} - - -/* Responsive: Portrait tablets and up */ - -@media screen and (min-width: 768px) { - .container { - width: inherit; - margin-left: 60px; - margin-right: 5px; - } - /* Remove the padding we set earlier */ - .header, - .marketing, - .footer { - padding-left: 0; - padding-right: 0; - } - /* Space out the masthead */ - .header { - margin-bottom: 30px; - } - /* Remove the bottom border on the jumbotron for visual effect */ - .jumbotron { - border-bottom: 0; - } -} - -.navbar-inverse { - background-color: #1d9d74; - border-color: #1b926c; -} - -.navbar-inverse .navbar-nav > li > a { - color: #b0ddce; - font-size: 15px; -} - -.navbar-inverse .navbar-nav>.open>a, -.navbar-inverse .navbar-nav>.open>a:focus, -.navbar-inverse .navbar-nav>.open>a:hover { - background-color: #1b926c; -} - -@media (min-width: 900px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: 0%; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} - -.dropdown-menu { - min-width: 100px !important; -} - -.nav-sidebar li.active a { - background: #DDD; -} - -.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus { - background: #1d9d74; - /*background: #d9d9d9;*/ - color: white; -} - -.broadcast-message, -.broadcast-message-preview { - padding: 10px; - text-align: center; - background: #555; - color: #BBB; - margin-top: 50px; -} - -.card { - position: relative; - border: 1px solid #d9d9d9; - border-radius: 3px; - color: #666; - background-color: #fff; - width: 100%; - border-radius: 5px; -} - -.card .card-header { - padding: 9px 0; - height: 40px; - background: #555; - color: #fff; - text-align: center; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.card .card-body { - padding: 12px 10px; -} - -.card .card-footer { - height: 20px; - font-size: 10px; - color: #777; - margin-top: -15px; - margin-bottom: 5px; - margin-left: 20px; - margin-right: 20px; -} - -.card .detail-brand { - float: left; - width: 30%; - line-height: 98px; - font-size: 30px; - text-align: center; - color: white; -} - -.card .default { - background: #1d9d74; -} - -.card .info { - background: #6EBEE7; -} - -.card .warn { - background: #ED7F54; -} - -.card .danger { - background: #6583BE; -} - -.card .detail .text-default { - color: #1d9d74; -} - -.card .detail .text-info { - color: #6EBEE7; -} - -.card .detail .text-warn { - color: #ED7F54; -} - -.card .detail .text-danger { - color: #6583BE; -} - -.card .detail { - float: right; - width: 70%; - line-height: 98px; - text-align: center; -} - -.card .detail .text { - font-size: 12px; -} - -.card .detail .number { - font-size: 30px; - font-weight: 500; -} - -.h100 { - height: 100px; -} - -.inline { - display: inline; -} - -.separator { - height: 1px; - background-color: #e5e5e5; - margin-top: 10px; -} - -.card > .card-body > table > thead > tr > td, -.card > .card-body > table > tbody > tr > td { - word-wrap: break-word; - word-break: break-all; -} - -.card > .card-body > table > thead > tr > td { - font-weight: 500; - font-size: 13px; - text-align: center; -} - -.card > .card-body > table > thead > tr > td > span { - font-weight: 500; - font-size: 10px; -} - -.card > .card-body > table > tbody > tr > td { - font-size: 12px; - text-align: center; -} - -.card > .card-body > table > tbody > tr > td > a { - color: #666; -} - -.thumbnails > .card > .card-body > table > thead > tr > td, -.thumbnails > .card > .card-body > table > tbody > tr > td { - font-size: 12px; - color: #777; - word-wrap: break-word; - word-break: break-all; -} - -.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(n+2) { - text-align: center; -} - -.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(n+2) { - font-weight: 700; - text-align: center; -} - -.thumbnails > .card > .card-body > table > thead > tr > td:nth-child(1), -.thumbnails > .card > .card-body > table > tbody > tr > td:nth-child(1) { - text-align: left; -} - -.tools-header { - background: whitesmoke; - padding: 9px 0; - height: 40px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.tools-header .brand { - font-size: 13px; - margin: 2px 10px; - font-weight: 700; - float: left; -} - -.tools-header .brand > a { - color: #666; -} - -.tools-header > button, -.tools-header > select, -.tools-header > a { - float: right; - max-width: 80px; - margin: 1px 10px; - height: 25px; - padding: 0 10px; - line-height: 25px; - color: #666; -} - -.tools-header .paged { - margin-right: 0px; -} - -.btn.btn-main { - color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74; -} - -.btn:focus, -.btn:active { - outline: none !important; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active { - color: #1d9d74; - border-color: #1d9d74; - background: white; -} - -.btn-default-inverse { - color: #1d9d74; - border-color: #1d9d74; - background: white; -} - -.btn-default-inverse:hover, -.btn-default-inverse:focus, -.btn-default:active { - color: #1d9d74; - border-color: #1d9d74; - background: white; -} - -.btn.btn-danger-tag { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; - line-height: 1px; - font-size: 11px; - padding: 4px 4px; -} - -.btn.btn-danger { - color: #333; - background-color: #fff; - border-color: #ccc; -} - -.btn.btn-danger:hover, -.btn.btn-danger:focus, -.btn.btn-danger:active { - color: #d9534f; - border-color: #d9534f; - background: white; -} - -.form-control { - height : 32px; -} - -.form-control:focus { - border-color: #1d9d74; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1); -} - -.form-control { - border-radius: 8px; -} - -.input-label:before { - display: inline-block; - content: "*"; - color: #f44336; - font-family: SimSun; - font-size: 12px; - -webkit-transform: TranslateX(-10px); - -ms-transform: TranslateX(-10px); - transform: TranslateX(-10px); -} - -.label.label-main { - color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74; -} - -.badge-main { - color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74; -} - -.bootstrap-tagsinput { - background-color: #fff; - border: 1px solid #ccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - display: inline-block; - padding: 4px 6px; - color: #555; - vertical-align: middle; - border-radius: 4px; - /* max-width: 100%; */ - width: 85%; - height: 100px; - line-height: 20px; - cursor: text; -} - -.bootstrap-tagsinput > .dropdown-menu { - min-width: 40px; - font-size: 12px; -} - -.bootstrap-tagsinput > .dropdown-menu>.active>a, -.bootstrap-tagsinput > .dropdown-menu>.active>a:focus, -.bootstrap-tagsinput > .dropdown-menu>.active>a:hover { - background-color: #1d9d74; - background-image: -webkit-linear-gradient(top, #1d9d74 0, #1d9d74 100%); - background-image: -o-linear-gradient(top, #1d9d74 0, #1d9d74 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#1d9d74), to(#1d9d74)); - background-image: linear-gradient(to bottom, #1d9d74 0, #1d9d74 100%); - filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#1d9d74', endColorstr='#1d9d74', GradientType=0); - background-repeat: repeat-x; -} - -.bootstrap-tagsinput > .dropdown-menu>.active>a, -.bootstrap-tagsinput > .dropdown-menu>.active>a:focus, -.bootstrap-tagsinput > .dropdown-menu>.active>a:hover { - color: #fff; - text-decoration: none; - background-color: #1d9d74; - outline: 0; -} - -.bootstrap-tagsinput > .dropdown-menu>.active>a, -.bootstrap-tagsinput > .dropdown-menu>.active>a:hover, -.bootstrap-tagsinput > .dropdown-menu>.active>a:focus { - color: white; - text-decoration: none; - outline: 0; - background-color: #1d9d74; -} - -.inputs-header { - padding: 9px 0; - height: 50px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.inputs-header .brand { - font-size: 13px; - margin: 2px 10px; - font-weight: 700; - float: left; -} - -.inputs-header .brand > a { - color: #666; -} - -.inputs-header > input { - float: right; - margin: 1px 10px; - height: 30px; - padding: 0 10px; - color: #666; -} - -.inputs-header > a { - float: right; - margin: 1px 10px; - height: 30px; - padding: 5 5px; -} - -.inputs-header > select { - float: right; - max-width: 80px; - margin: 1px 10px; - height: 30px; - padding: 0 10px; - color: #666; - height: 25px; - font-size: 12px; -} - -.witdh-150 { - max-width: 150px; -} - -.witdh-200 { - max-width: 200px; -} - -.card.highlight { - border-color: #d9534f; -} - -.card .pagination-footer { - height: 40px; - font-size: 10px; - color: #777; - margin-top: -15px; - margin-bottom: 5px; - margin-left: 20px; - margin-right: 20px; -} - -.card .pagination-footer .tools { - font-size: 12px; - margin: 11px 0; - float: right; - display: inline; - margin-right: 20px; -} - -.card > .pagination-footer > .tools > span > input { - height: 25px; - max-width: 50px; - display: inline; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 8px 0; - float: right; - border-radius: 4px; -} - - -.pagination > a { - margin-right: 5px; - height: 28px; - width: 28px; - padding: 5px 0px; -} - -.pagination > .btn.active { - color: #ffffff; - background-color: #449d44; - border-color: #449d44; -} - - - - -.datepicker > .table > thead > tr > td, .datepicker > .table > tbody > tr > td, -.timepicker > .table > thead > tr > td, .timepicker > .table > tbody > tr > td { - padding: 5px 3px; -} - -.datepicker > .table > thead > tr > td > .btn, .datepicker > .table > tbody > tr > td > .btn, -.timepicker > .table > thead > tr > td > .btn, .timepicker > .table > tbody > tr > td > .btn { - border: 1px solid #FFFDFD; -} - -.datepicker > .table > thead > tr > td > .btn-default:hover, -.datepicker > .table > thead > tr > td > .btn-default:focus, -.datepicker > .table > thead > tr > td > .btn-default:active, -.datepicker > .table > tbody > tr > td > .btn-default:hover, -.datepicker > .table > tbody > tr > td > .btn-default:focus, -.datepicker > .table > tbody > tr > td > .btn-default:active, -.timepicker > .table > thead > tr > td > .btn-default:hover, -.timepicker > .table > thead > tr > td > .btn-default:focus, -.timepicker > .table > thead > tr > td > .btn-default:active, -.timepicker > .table > tbody > tr > td > .btn-default:hover, -.timepicker > .table > tbody > tr > td > .btn-default:focus, -.timepicker > .table > tbody > tr > td > .btn-default:active { - color: #1d9d74; - border-color: #1d9d74; - background: white; -} - -.datepicker > .table > thead > tr > td > a, .datepicker > .table > tbody > tr > td > a, -.timepicker > .table > thead > tr > td > a, .timepicker > .table > tbody > tr > td > a { - height: 25px; - width: 25px; - padding: 3px 0px; -} - -.datepicker > .table > tbody > tr:first-child > td > a { - padding: 4px 0px; -} - -.datepicker > .table > thead > tr > td > a.btn.active, -.datepicker > .table > tbody > tr > td > a.btn.active, -.timepicker > .table > thead > tr > td > a.btn.active, -.timepicker > .table > tbody > tr > td > a.btn.active { -/* color: #ffffff; - background-color: #1d9d74; - border-color: #1d9d74;*/ - color: #1d9d74; - border-color: #1d9d74; - background: white; - box-shadow: inset 0 0px 0px rgba(0,0,0,0.125); -} - -.datepicker > .table > thead > tr > td:not(:first-child):last-child > a, -.timepicker > .table > thead > tr > td:not(:first-child):last-child > a { - height: 25px; - width: 50px; - padding: 5px 0px; -} - -.datepicker > .table > tbody > tr > td > a, -.timepicker > .table > tbody > tr > td > a { - margin-left: 8px; -} - - -.selectize-input-200 > .selectize-input { - min-width: 250px; -} - -.highlight-border { - border-color: #1d9d74; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1); -} - - -.sortorder:after { - content: '\25b2'; -} -.sortorder.reverse:after { - content: '\25bc'; -} - - - -.input-control select { - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - position: relative; - border: 1px #d9d9d9 solid; - width: 100%; - height: 100%; - padding: .3125rem; - z-index: 0; -} - -.navbar-inverse { - background-color: #337ab7; - border-color: #337ab7; -} - -.sidebar { - z-index: 1; - width: 220px; - /*position: fixed;*/ - top: 0; - left: 0; - height: 100%; -} - -#page-wrapper { - position: inherit; - margin: 70px 0 0 220px; - padding: 12px 30px; - border-left: 0px solid #e7e7e7; -} - -.sidebar .sidebar-nav.navbar-collapse { - padding-right: 0; - padding-left: 0; - background-color: #F5F5F5; - position: relative; - color: black; - width: 100%; - padding: 0; - margin: 0; - list-style: none inside none; -} - -.sidebar a { - color: #555; -} - -.sidebar ul li:hover { - color:red; -} - -.form-control { - border-radius: 8px; -} - -.form-control:focus { - border-color: #337ab7; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1); -} - -.highlight-border { - border-color: #337ab7; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.075) inset, 0px 0px 0px rgba(29, 157, 116, 1); -}.browsehappy { - margin: 0.2em 0; - background: #ccc; - color: #000; - padding: 0.2em 0; -} - -.btn.btn-main { - color: #ffffff; - background-color: #337ab7; - border-color: #337ab7; -} - -.btn-default-inverse { - color: #337ab7; - border-color: #337ab7; - background: white; -} - -.btn-default-inverse:hover, -.btn-default-inverse:focus, -.btn-default:active { - color: #337ab7; - border-color: #337ab7; - background: white; -} - -.btn-danger-inverse { - color: #d9534f; - border-color: #d9534f; - background: white; -} - -.btn-danger-inverse:hover, -.btn-danger-inverse:focus, -.btn-danger:active { - color: #d9534f; - border-color: #d9534f; - background: white; -} - -.btn-tab-active, -.btn-tab-active:hover, -.btn-tab-active:focus, -.btn-tab-default:hover, -.btn-tab-default:focus, -.btn-tab-default:active { - color: #337ab7; - border-color: #337ab7; - background: white; - font-weight: 600; -} -.btn-tab-default { - color: #777; - background: white; - font-weight: 600; -} - -.pagination > .btn.active { - color: #ffffff; - background-color: #337ab7; - border-color: #337ab7; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active { - color: #337ab7; - border-color: #337ab7; - background: white; -} - -.bootstrap-switch.bootstrap-switch-on { - border-color: #337ab7; -} - -.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success { - color: #fff; - background: #337ab7; -} - -.selectize-input-200 > .selectize-input { - min-width: 200px; - border-color: #337ab7; -} - -.btn-outline-primary { - color: #007bff; - background-color: transparent; - background-image: none; - border-color: #007bff; -} - -.btn-outline-primary:hover { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:focus, .btn-outline-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-primary.disabled, .btn-outline-primary:disabled { - color: #007bff; - background-color: transparent; -} - -.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, -.show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-secondary { - color: #6c757d; - background-color: transparent; - background-image: none; - border-color: #6c757d; -} - -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:focus, .btn-outline-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { - color: #6c757d; - background-color: transparent; -} - -.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, -.show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-success { - color: #28a745; - background-color: transparent; - background-image: none; - border-color: #28a745; -} - -.btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:focus, .btn-outline-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-success.disabled, .btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} - -.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, -.show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-info { - color: #17a2b8; - background-color: transparent; - background-image: none; - border-color: #17a2b8; -} - -.btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:focus, .btn-outline-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-info.disabled, .btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} - -.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, -.show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-warning { - color: #ffc107; - background-color: transparent; - background-image: none; - border-color: #ffc107; -} - -.btn-outline-warning:hover { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:focus, .btn-outline-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-warning.disabled, .btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} - -.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, -.show > .btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-danger { - color: #dc3545; - background-color: transparent; - background-image: none; - border-color: #dc3545; -} - -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:focus, .btn-outline-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-danger.disabled, .btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} - -.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, -.show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-light { - color: #f8f9fa; - background-color: transparent; - background-image: none; - border-color: #f8f9fa; -} - -.btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:focus, .btn-outline-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-light.disabled, .btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} - -.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, -.show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-dark { - color: #343a40; - background-color: transparent; - background-image: none; - border-color: #343a40; -} - -.btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:focus, .btn-outline-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-outline-dark.disabled, .btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} - -.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, -.show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css deleted file mode 100644 index af3ba447..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/page.css +++ /dev/null @@ -1,399 +0,0 @@ -/*! - * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com) - * Code licensed under the Apache License v2.0. - * For details, see http://www.apache.org/licenses/LICENSE-2.0. - */ - -body { - background-color: #f8f8f8; -} - -.example { - padding: .625rem 1.825rem .625rem 2.5rem; - border: 1px #ccc dashed; - position: relative; - margin: 0 0 .625rem 0; - background-color: #ffffff; -} - -dl dt, -dl dd { - line-height: 1.25rem; -} -dl dt { - font-style: normal; - font-weight: 700; -} -dl dd { - margin-left: .9375rem; -} -dl.horizontal dt { - float: left; - width: 10rem; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} -dl.horizontal dd { - margin-left: 11.25rem; -} - -#wrapper { - width: 100%; -} - -#page-wrapper { - padding: 0 15px; - min-height: 568px; - background-color: #fff; -} - -@media(min-width:768px) { - #page-wrapper { - position: inherit; - margin: 0 0 0 250px; - padding: 0 30px; - border-left: 1px solid #e7e7e7; - } -} - -.navbar-top-links { - margin-right: 0; -} - -.navbar-top-links li { - display: inline-block; -} - -.navbar-top-links li:last-child { - margin-right: 15px; -} - -.navbar-top-links li a { - padding: 15px; - min-height: 50px; -} - -.navbar-top-links .dropdown-menu li { - display: block; -} - -.navbar-top-links .dropdown-menu li:last-child { - margin-right: 0; -} - -.navbar-top-links .dropdown-menu li a { - padding: 3px 20px; - min-height: 0; -} - -.navbar-top-links .dropdown-menu li a div { - white-space: normal; -} - -.navbar-top-links .dropdown-messages, -.navbar-top-links .dropdown-tasks, -.navbar-top-links .dropdown-alerts { - width: 310px; - min-width: 0; -} - -.navbar-top-links .dropdown-messages { - margin-left: 5px; -} - -.navbar-top-links .dropdown-tasks { - margin-left: -59px; -} - -.navbar-top-links .dropdown-alerts { - margin-left: -123px; -} - -.navbar-top-links .dropdown-user { - right: 0; - left: auto; -} - -.sidebar .sidebar-nav.navbar-collapse { - padding-right: 0; - padding-left: 0; - background-color: #71b1d1; - color: #ffffff; - position: relative; - width: 100%; - padding: 0; - margin: 0; - list-style: none inside none; -} - -.sidebar .sidebar-search { - padding: 15px; -} - -.sidebar ul li { - border-bottom: 1px solid #e7e7e7; -} - -.sidebar ul li a.active { - background-color: #ffffff; - color: #ffffff; -} - -.sidebar a{ - color: #fff; -} - -.sidebar .arrow { - float: right; -} - -.sidebar .fa.arrow:before { - content: "\f104"; -} - -.sidebar .active>a>.fa.arrow:before { - content: "\f107"; -} - -.sidebar .nav-second-level li, -.sidebar .nav-third-level li { - border-bottom: 0!important; -} - -.sidebar .nav-second-level li a { - padding-left: 37px; -} - -.sidebar .nav-third-level li a { - padding-left: 52px; -} - -@media(min-width:768px) { - .sidebar { - z-index: 1; - position: absolute; - width: 250px; - margin-top: 51px; - } - - .navbar-top-links .dropdown-messages, - .navbar-top-links .dropdown-tasks, - .navbar-top-links .dropdown-alerts { - margin-left: auto; - } -} - - -.btn-outline { - color: inherit; - background-color: transparent; - transition: all .5s; -} - -.btn-primary.btn-outline { - color: #428bca; -} - -.btn-success.btn-outline { - color: #5cb85c; -} - -.btn-info.btn-outline { - color: #5bc0de; -} - -.btn-warning.btn-outline { - color: #f0ad4e; -} - -.btn-danger.btn-outline { - color: #d9534f; -} - -.btn-primary.btn-outline:hover, -.btn-success.btn-outline:hover, -.btn-info.btn-outline:hover, -.btn-warning.btn-outline:hover, -.btn-danger.btn-outline:hover { - color: #fff; -} - -.chat { - margin: 0; - padding: 0; - list-style: none; -} - -.chat li { - margin-bottom: 10px; - padding-bottom: 5px; - border-bottom: 1px dotted #999; -} - -.chat li.left .chat-body { - margin-left: 60px; -} - -.chat li.right .chat-body { - margin-right: 60px; -} - -.chat li .chat-body p { - margin: 0; -} - -.panel .slidedown .glyphicon, -.chat .glyphicon { - margin-right: 5px; -} - -.chat-panel .panel-body { - height: 350px; - overflow-y: scroll; -} - -.login-panel { - margin-top: 25%; -} - -.flot-chart { - display: block; - height: 400px; -} - -.flot-chart-content { - width: 100%; - height: 100%; -} - -.dataTables_wrapper { - position: relative; - clear: both; -} - -table.dataTable thead .sorting, -table.dataTable thead .sorting_asc, -table.dataTable thead .sorting_desc, -table.dataTable thead .sorting_asc_disabled, -table.dataTable thead .sorting_desc_disabled { - background: 0 0; -} - -table.dataTable thead .sorting_asc:after { - content: "\f0de"; - float: right; - font-family: fontawesome; -} - -table.dataTable thead .sorting_desc:after { - content: "\f0dd"; - float: right; - font-family: fontawesome; -} - -table.dataTable thead .sorting:after { - content: "\f0dc"; - float: right; - font-family: fontawesome; - color: rgba(50,50,50,.5); -} - -.btn-circle { - width: 30px; - height: 30px; - padding: 6px 0; - border-radius: 15px; - text-align: center; - font-size: 12px; - line-height: 1.428571429; -} - -.btn-circle.btn-lg { - width: 50px; - height: 50px; - padding: 10px 16px; - border-radius: 25px; - font-size: 18px; - line-height: 1.33; -} - -.btn-circle.btn-xl { - width: 70px; - height: 70px; - padding: 10px 16px; - border-radius: 35px; - font-size: 24px; - line-height: 1.33; -} - -.show-grid [class^=col-] { - padding-top: 10px; - padding-bottom: 10px; - border: 1px solid #ddd; - background-color: #eee!important; -} - -.show-grid { - margin: 15px 0; -} - -.huge { - font-size: 40px; -} - -.panel-green { - border-color: #5cb85c; -} - -.panel-green .panel-heading { - border-color: #5cb85c; - color: #fff; - background-color: #5cb85c; -} - -.panel-green a { - color: #5cb85c; -} - -.panel-green a:hover { - color: #3d8b3d; -} - -.panel-red { - border-color: #d9534f; -} - -.panel-red .panel-heading { - border-color: #d9534f; - color: #fff; - background-color: #d9534f; -} - -.panel-red a { - color: #d9534f; -} - -.panel-red a:hover { - color: #b52b27; -} - -.panel-yellow { - border-color: #f0ad4e; -} - -.panel-yellow .panel-heading { - border-color: #f0ad4e; - color: #fff; - background-color: #f0ad4e; -} - -.panel-yellow a { - color: #f0ad4e; -} - -.panel-yellow a:hover { - color: #df8a13; -} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css deleted file mode 100644 index 92161ebe..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/styles/timeline.css +++ /dev/null @@ -1,180 +0,0 @@ -.timeline { - position: relative; - padding: 20px 0 20px; - list-style: none; -} - -.timeline:before { - content: " "; - position: absolute; - top: 0; - bottom: 0; - left: 50%; - width: 3px; - margin-left: -1.5px; - background-color: #eeeeee; -} - -.timeline > li { - position: relative; - margin-bottom: 20px; -} - -.timeline > li:before, -.timeline > li:after { - content: " "; - display: table; -} - -.timeline > li:after { - clear: both; -} - -.timeline > li:before, -.timeline > li:after { - content: " "; - display: table; -} - -.timeline > li:after { - clear: both; -} - -.timeline > li > .timeline-panel { - float: left; - position: relative; - width: 46%; - padding: 20px; - border: 1px solid #d4d4d4; - border-radius: 2px; - -webkit-box-shadow: 0 1px 6px rgba(0,0,0,0.175); - box-shadow: 0 1px 6px rgba(0,0,0,0.175); -} - -.timeline > li > .timeline-panel:before { - content: " "; - display: inline-block; - position: absolute; - top: 26px; - right: -15px; - border-top: 15px solid transparent; - border-right: 0 solid #ccc; - border-bottom: 15px solid transparent; - border-left: 15px solid #ccc; -} - -.timeline > li > .timeline-panel:after { - content: " "; - display: inline-block; - position: absolute; - top: 27px; - right: -14px; - border-top: 14px solid transparent; - border-right: 0 solid #fff; - border-bottom: 14px solid transparent; - border-left: 14px solid #fff; -} - -.timeline > li > .timeline-badge { - z-index: 100; - position: absolute; - top: 16px; - left: 50%; - width: 50px; - height: 50px; - margin-left: -25px; - border-radius: 50% 50% 50% 50%; - text-align: center; - font-size: 1.4em; - line-height: 50px; - color: #fff; - background-color: #999999; -} - -.timeline > li.timeline-inverted > .timeline-panel { - float: right; -} - -.timeline > li.timeline-inverted > .timeline-panel:before { - right: auto; - left: -15px; - border-right-width: 15px; - border-left-width: 0; -} - -.timeline > li.timeline-inverted > .timeline-panel:after { - right: auto; - left: -14px; - border-right-width: 14px; - border-left-width: 0; -} - -.timeline-badge.primary { - background-color: #2e6da4 !important; -} - -.timeline-badge.success { - background-color: #3f903f !important; -} - -.timeline-badge.warning { - background-color: #f0ad4e !important; -} - -.timeline-badge.danger { - background-color: #d9534f !important; -} - -.timeline-badge.info { - background-color: #5bc0de !important; -} - -.timeline-title { - margin-top: 0; - color: inherit; -} - -.timeline-body > p, -.timeline-body > ul { - margin-bottom: 0; -} - -.timeline-body > p + p { - margin-top: 5px; -} - -@media(max-width:767px) { - ul.timeline:before { - left: 40px; - } - - ul.timeline > li > .timeline-panel { - width: calc(100% - 90px); - width: -moz-calc(100% - 90px); - width: -webkit-calc(100% - 90px); - } - - ul.timeline > li > .timeline-badge { - top: 16px; - left: 15px; - margin-left: 0; - } - - ul.timeline > li > .timeline-panel { - float: right; - } - - ul.timeline > li > .timeline-panel:before { - right: auto; - left: -15px; - border-right-width: 15px; - border-left-width: 0; - } - - ul.timeline > li > .timeline-panel:after { - right: auto; - left: -14px; - border-right-width: 14px; - border-left-width: 0; - } -} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html deleted file mode 100644 index 5dbddedd..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/authority.html +++ /dev/null @@ -1,85 +0,0 @@ -
-
- {{app}} -
-
- -
-
- -
- -
-
-
-
-
- 授权规则 - - -
- -
-
- - -
-
- - - - - - - - - - - - - - - - -
- 资源名 - - 流控应用 - - 授权类型 - - 操作 -
{{ruleEntity.rule.resource}}{{ruleEntity.rule.limitApp }} - 白名单 - 黑名单 - - - -
- - - - - - - - - - - - diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html deleted file mode 100644 index 7fc751da..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/client.html +++ /dev/null @@ -1,30 +0,0 @@ -
-
-
- -
-

未连接

-

连接中

-

已连接

-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
\ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html deleted file mode 100644 index 8c045876..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster/server.html +++ /dev/null @@ -1,29 +0,0 @@ -
-
-
- -
-

独立模式 (Alone)

-

嵌入模式 (Embedded)

-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
\ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html deleted file mode 100644 index 550ff230..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_assign_manage.html +++ /dev/null @@ -1,118 +0,0 @@ -
-
- {{app}} -
-
- -
-
-
-
-
-
- 集群限流 - 机器分配/管控 -
- - -
-
-
-
-
-

{{loadError.message}}

-
-
-
-
-
- - -
-
-
- -
- -
- -
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
- - -
- -
-
-
- - -
-
- -
-
- -
- -
-
-
-
-
- -
-
-
-
-
-
- -
-
- -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html deleted file mode 100644 index b779e30e..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_client_list.html +++ /dev/null @@ -1,73 +0,0 @@ -
-
- {{app}} -
- -
- -
-
-
-
-
-
- 集群限流 - Token Client 列表 -
- - -
-
-
-
-
-

{{loadError.message}}

-
-
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - - -
Client IDServer IPServer 端口连接状态操作
{{clientVO.id}}{{clientVO.state.clientConfig.serverHost}}{{clientVO.state.clientConfig.serverPort}} - 未连接 - 连接中 - 已连接 - - -
-
- -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html deleted file mode 100644 index d47b31f7..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_list.html +++ /dev/null @@ -1,96 +0,0 @@ -
-
- {{app}} -
-
- - - Token Client 列表 - -
-
- -
-
-
-
-
-
- 集群限流 - Token Server 列表 - -
- - -
-
-
-
-
-

{{loadError.message}}

-
-
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - -
Server IDPort命名空间集合运行模式总连接数QPS 总览操作
- {{serverVO.id}} - {{serverVO.id}}(自主指定) - {{serverVO.port}} - {{serverVO.state.namespaceSetStr}} - 未知 - - 未知 - 嵌入模式 - 独立模式 - - {{serverVO.connectedCount}} - 未知 - - {{serverVO.state.requestLimitDataStr}} - 未知 - - - - -
-
- -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html deleted file mode 100644 index 4e411a2b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_app_server_overview.html +++ /dev/null @@ -1,88 +0,0 @@ -
-
- {{app}} -
-
- -
-
-
-
-
-
- 集群限流 - Token Server 总览 -
- - -
-
-
-
-
-

{{loadError.message}}

-
-
-
-
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
Server IDPort命名空间集合总连接数连接情况QPS 总览
{{serverVO.id}}{{serverVO.port}} - {{serverVO.state.namespaceSetStr}} - - {{serverVO.connectedCount}} - -

- namespace: {{cg.namespace}}, 连接数: {{cg.connectedCount}}, clients: - {{generateConnectionSet(cg.connectionSet)}} -

-
-

- namespace: {{crl.namespace}}, 当前 QPS: {{crl.currentQps}}, 最大允许 QPS: - {{crl.maxAllowedQps}} -

-
-
- -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html deleted file mode 100644 index a82f1ab3..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/cluster_single_config.html +++ /dev/null @@ -1,95 +0,0 @@ - -
-
- {{app}} -
-
- -
-
-
-
-
-
- 集群限流 - -
- -
-
- - -
-
-
-
-
-

{{loadError.message}}

-
-
-
-
-
- - -
-
-
- -

Client

-

Server

-

未开启

-
-
- -
-
-  Client   -  Server -
-
-
-
- -
- -
-
-
-
-
-

该机器未引入 Sentinel 集群限流客户端或服务端的相关依赖,请引入相关依赖。

-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
- -
-
- -
- -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html deleted file mode 100644 index 9a81bf5b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/home.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-

欢迎使用 Sentinel 控制台

-
- -
- - -
-
- -
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html deleted file mode 100644 index c5abed5d..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dashboard/main.html +++ /dev/null @@ -1,10 +0,0 @@ -
- -
- - -
-
-
- -
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html deleted file mode 100644 index c2b67528..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/degrade.html +++ /dev/null @@ -1,98 +0,0 @@ -
-
- {{app}} -
-
- -
-
- -
- -
-
-
-
-
- 降级规则 - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - -
- 资源名 - - 降级策略 - - 阈值 - - 熔断时长(s) - - 操作 -
{{rule.resource}} - 慢调用比例 - 异常比例 - 异常数 - - {{rule.count}} - - {{rule.timeWindow}}s - - - -
-
- - - -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html deleted file mode 100644 index bd69085f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/authority-rule-dialog.html +++ /dev/null @@ -1,46 +0,0 @@ -
- {{authorityRuleDialog.title}} -
-
-
-
-
- -
- - -
-
- -
- -
- -
-
- -
- -
-
-  白名单   -  黑名单 -
-
-
- -
-
-
-
- - - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html deleted file mode 100644 index 128ab785..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-client-config-dialog.html +++ /dev/null @@ -1,40 +0,0 @@ -
- 修改 Token Client 配置 -
-
-
-
-
- -
-

{{ccDialogData.clientId}}

-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
- - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html deleted file mode 100644 index 350c2e41..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-assign-dialog.html +++ /dev/null @@ -1,139 +0,0 @@ -
- {{serverAssignDialogData.title}} -
-
-
-
-
-
- -
-

{{serverAssignDialogData.serverData.currentServer}}

-
- - -
- -
-
-
- -
- -
-
-
- -
-
- -
-
-  应用内机器   -  外部指定机器 -
-
- -
-
-

若指定外部 server,请先在相应页面对外部 server 进行配置,然后在此页面指定。

-
-
-
- -
-
- -
- -
- - -
- -
-
-
- -
- -
-
-
- -
-
- -
- -
- - -
- -
-
-
-
-
- - -
-
-
-
- -
- -
-
-
- -
-
- - - -
-
- -
-
- -
- -
-
-
-
-
-
-
-
- - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html deleted file mode 100644 index afbf29ad..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/cluster/cluster-server-connection-detail-dialog.html +++ /dev/null @@ -1,37 +0,0 @@ -
- 连接详情 -
-
-
-
-
- -
-

{{connectionDetailDialogData.serverData.id}}

-
-
-
- -
- - - - - - - - - - - - - - - - -
命名空间连接数连接详情
{{cg.namespace}}{{cg.connectedCount}}{{generateConnectionSet(cg.connectionSet)}}
-
-
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html deleted file mode 100644 index b7bf3d67..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/confirm-dialog.html +++ /dev/null @@ -1,20 +0,0 @@ -
- {{confirmDialog.title}} -
-
-
-

- {{confirmDialog.attentionTitle}}: -
-
- {{confirmDialog.attention}} -

-
-
-
- - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html deleted file mode 100644 index df241ec1..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/degrade-rule-dialog.html +++ /dev/null @@ -1,83 +0,0 @@ -
- {{degradeRuleDialog.title}} -
-
-
-
-
- -
- - -
-
- - - - - - - - -
- -
-
-  慢调用比例   -  异常比例   -  异常数 -
-
-
- -
- - - -
- - - -
-
- -
- -
-
-
- -
- -
-
- - s -
-
- - -
- -
-
- - -
-
-
-
- - - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html deleted file mode 100644 index e68fb6b4..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/flow-rule-dialog.html +++ /dev/null @@ -1,148 +0,0 @@ -
- {{flowRuleDialog.title}} -
-
-
-
-
- -
- - -
-
- -
- -
- -
-
- -
- -
-
-  QPS   -  线程数 -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- -
-
- -
-
-  单机均摊   -  总体阈值 -
-
-
-
- -
- -
- -
-
- -
-
- -
-
-  直接   -  关联   -  链路   -
-
-
- -
- -
- -
-
-
- -
- -
-
-
-
-
- -
-
-  快速失败   -  Warm Up   -  排队等待 -
-
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
- -
-
-
-
- - - -
-
-
-
\ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html deleted file mode 100644 index 8c8d4615..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/api-dialog.html +++ /dev/null @@ -1,49 +0,0 @@ -
- {{gatewayApiDialog.title}} -
-
-
-
- -
- - -
-
- -
- -
-
-  精确   -  前缀   -  正则   -
-
- -
- -
-
- -
-
- -
- -
-
-
-
- - - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html deleted file mode 100644 index ea744a71..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/gateway/flow-rule-dialog.html +++ /dev/null @@ -1,172 +0,0 @@ -
- {{gatewayFlowRuleDialog.title}} -
-
-
-
-
- -
-
-  Route ID   -  Route ID   -  API 分组   -  API 分组   -
-
-
- -
- -
- - - - - -
-
- -
- -
- -
-
- -
- -
-
-  Client IP   -  Remote Host   -  Header   -  URL 参数   -  Cookie   -
-
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
-
-  精确   -  子串   -  正则   -
-
- -
- -
-
- -
- -
-
-  QPS   -  线程数   -
-
-
- -
-
- -
- -
-
-
- -
-
- -
- -
-
- -
-
-
- -
- -
-
-  快速失败   -  匀速排队   -
-
-
- -
-
- -
- -
-
-
- -
-
- -
- -
-
-
-
-
-
-
- - - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html deleted file mode 100644 index 02f00b08..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/param-flow-rule-dialog.html +++ /dev/null @@ -1,166 +0,0 @@ -
- {{paramFlowRuleDialog.title}} -
-
-
-
-
- -
- - -
-
- -
- -

QPS 模式

-
- -
- -
- -
-
- -
-
- -
- -
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- -
-
- -
-
-  单机均摊   -  总体阈值 -
-
-
-
- -
- -
-
- -  若选择,则 Token Server 不可用时将退化到单机限流 -
-
-
- - -
-
-
-
- -
- -
- -
- -
-
- -
- -
- -
- - -
- -
- -
- -
-
- -
-
- - - - - - - - - - - - - - - -
参数值参数类型限流阈值操作
-

{{paramItem.classType}}

-
- - - -
-
-
- -
-
- - - -
-
-
-
- - - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html deleted file mode 100644 index 3dd9cd97..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/dialog/system-rule-dialog.html +++ /dev/null @@ -1,58 +0,0 @@ -
- {{systemRuleDialog.title}} -
-
-
-
- -
- -
-
- -  LOAD   - -  RT   - -  线程数   - -  入口 QPS   - -  CPU 使用率   - -
-
- -  LOAD   - -  RT   - -  线程数   - -  入口 QPS   - -  CPU 使用率   - -
-
-
-
- -
- - - - - -
-
-
-
-
-
- - -
-
-
-
diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html deleted file mode 100644 index 22b79c6f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v1.html +++ /dev/null @@ -1,117 +0,0 @@ -
-
- {{app}} -
-
- - - -
-
- -
- -
-
-
-
-
- 流控规则 - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- 资源名 - - 来源应用 - - 流控模式 - - 阈值类型 - - 阈值 - - 阈值模式 - - 流控效果 - - 操作 -
{{rule.resource}}{{rule.limitApp }} - 直接 - 关联 - 链路 - - {{rule.grade==0 ? '线程数' : 'QPS'}} - - {{rule.count}} - - {{generateThresholdTypeShow(rule)}} - - 快速失败 - Warm Up - 排队等待 - 预热排队 - - - -
-
- - - -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html deleted file mode 100644 index 7e0dcc81..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html +++ /dev/null @@ -1,113 +0,0 @@ -
-
- {{app}} -
-
- - - 回到单机页面 - -
-
- -
- -
-
-
-
-
- 流控规则 - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- 资源名 - - 来源应用 - - 流控模式 - - 阈值类型 - - 阈值 - - 阈值模式 - - 流控效果 - - 操作 -
{{rule.resource}}{{rule.limitApp }} - 直接 - 关联 - 链路 - - {{rule.grade == 0 ? '线程数' : 'QPS'}} - - {{rule.count}} - - {{generateThresholdTypeShow(rule)}} - - 快速失败 - Warm Up - 排队等待 - 预热排队 - - - -
-
- - - -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html deleted file mode 100644 index b4e101c9..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/api.html +++ /dev/null @@ -1,87 +0,0 @@ -
-
- {{app}} -
-
- -
-
- -
- -
-
-
-
-
- API 分组管理 - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - -
- API 名称 - - 匹配模式 - - 匹配串 - - 操作 -
{{api.apiName}} - 精确 - 前缀 - 正则 - {{api.pattern}} - - -
-
- - - -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html deleted file mode 100644 index 62708c41..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/flow.html +++ /dev/null @@ -1,94 +0,0 @@ -
-
- {{app}} -
-
- -
-
- -
- -
-
-
-
-
- 网关流控规则 - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - -
- API 名称 - - API 类型 - - 阈值类型 - - 单机阈值 - - 操作 -
{{rule.resource}} - Route ID - API 分组 - - QPS - 线程数 - {{rule.count}} - - -
-
- - - -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html deleted file mode 100644 index 0736adc2..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/gateway/identity.html +++ /dev/null @@ -1,98 +0,0 @@ -
-
- {{app}} -
-
- -
- -
-
-
-
-
- 请求链路 - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- API 名称 - - API 类型 - 通过 QPS拒绝 QPS线程数平均 RT分钟通过分钟拒绝操作
- {{resource.resource}} - - Route ID - 自定义 API - {{resource.passQps}}{{resource.blockQps}}{{resource.threadNum}}{{resource.averageRt}}{{resource.oneMinutePass}} - {{resource.oneMinuteBlock}} {{resource.oneMinuteBlock}} -
- - -
-
-
- - - -
- -
- -
- -
- \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html deleted file mode 100644 index 1dcf6e92..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/identity.html +++ /dev/null @@ -1,110 +0,0 @@ -
-
- {{app}} -
-
- - -
-
- - -
-
- -
- -
-
-
-
-
- 簇点链路 - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 资源名 - 通过QPS拒绝QPS线程数平均RT分钟通过分钟拒绝操作
- - - {{resource.resource}} - - {{resource.passQps}}{{resource.blockQps}}{{resource.threadNum}}{{resource.averageRt}}{{resource.oneMinutePass}} - {{resource.oneMinuteBlock}} {{resource.oneMinuteBlock}} -
- - - - -
-
-
- - - -
- -
- -
- -
- \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/login.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/login.html deleted file mode 100644 index b5079789..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/login.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
- Sentinel Logo - -
-
-
-
-
-
-
- -
- -
-
- -
- -
- -
-
-
- - -
-
-
-
-
\ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html deleted file mode 100644 index 6cfcff9c..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/machine.html +++ /dev/null @@ -1,76 +0,0 @@ -
-
- {{app}} -
-
- - - - - -
-
-
-
-
-
- 机器列表 - 实例总数 {{machines.length}}, 健康 {{healthyCount}}, 失联 {{machines.length - healthyCount}}. - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - -
机器名IP 地址端口号Sentinel 客户端版本健康状态心跳时间操作
{{entry.hostname}}{{entry.ip}} {{entry.port}} {{entry.version}} 健康失联{{entry.lastHeartbeat | date: 'yyyy/MM/dd HH:mm:ss'}} - -
-
- - - -
- -
- -
- -
- diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html deleted file mode 100644 index 4f0fc7f5..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/metric.html +++ /dev/null @@ -1,117 +0,0 @@ -
-
- {{app}} -
-
- -
-
-
-
-
-
- - - - {{metricTypeDesc}} 实时监控 - - - - - -
- - -
-
-
-
- - -
-
-  {{metric.resource}} - - - -
- - -
-
-
- - -
-
-
- - - - - - - - - - - - - - - - - - - - - - -
时间通过 QPS拒绝QPS响应时间(ms)
{{tableObj.timestamp | date: 'HH:mm:ss'}}{{tableObj.passQps | number : 1}}{{tableObj.blockQps | number : 1}}{{tableObj.rt | number : 1}}
-
-
-
-
- -
- -
- - -
- -
- -
- -
-
  • -
    - - - -
    -
    - -
    - -
    - -
    diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html deleted file mode 100644 index 6ebbee2f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/pagination.tpl.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html deleted file mode 100644 index c94219b6..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/param_flow.html +++ /dev/null @@ -1,118 +0,0 @@ -
    -
    - {{app}} -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -
    - 热点参数限流规则 - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -

    {{loadError.message}}

    -
    -
    -
    -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    - 资源名 - - 参数索引 - - 流控模式 - - 阈值 - - 是否集群 - - 例外项数目 - - 操作 -
    {{ruleEntity.rule.resource}}{{ruleEntity.rule.paramIdx}} - {{ruleEntity.rule.grade == 1 ? 'QPS' : '未知'}} - - {{ruleEntity.rule.count}} - - - - - {{ruleEntity.rule.paramFlowItemList == undefined ? 0 : ruleEntity.rule.paramFlowItemList.length}} - - - -
    -
    - - - - - -
    - -
    - -
    - -
    - - \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/system.html b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/system.html deleted file mode 100644 index 6f4e4b84..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/app/views/system.html +++ /dev/null @@ -1,92 +0,0 @@ -
    -
    - {{app}} -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -
    - 系统规则 - - - -
    - -
    -
    - - -
    - - - - - - - - - - - - - - - -
    - 阈值类型 - - 单机阈值 - - 操作 -
    - 系统 load - 平均 RT - 并发数 - 入口 QPS - CPU 使用率 - - {{rule.highestSystemLoad}} - {{rule.avgRt}} - {{rule.maxThread}} - {{rule.qps}} - {{rule.highestCpuUsage}} - - - -
    -
    - - - -
    - -
    - -
    - -
    - diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/assets/img/sentinel-logo.png deleted file mode 100644 index 60e8826c1aa983cd835daa3b78bc8f5d0e097387..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28346 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 TE1yp=Ob1brRh220G7b4Z*B#*5 diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css deleted file mode 100644 index a9e9075f..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/css/app.css +++ /dev/null @@ -1,5 +0,0 @@ -.chat,.timeline{list-style:none}#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:4px;border:1px solid #ccc;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:4px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:table-cell;vertical-align:middle;padding:6px 12px;font-size:14px;line-height:20px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on{text-align:center;z-index:1}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary{color:#fff;background:#337ab7}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info{color:#fff;background:#5bc0de}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning{background:#f0ad4e;color:#fff}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger{color:#fff;background:#d9534f}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default{color:#000;background:#eee}.bootstrap-switch .bootstrap-switch-label{text-align:center;margin-top:-1px;margin-bottom:-1px;z-index:100;color:#333;background:#fff}.bootstrap-switch span::before{content:"\200b"}.bootstrap-switch .bootstrap-switch-handle-on{border-bottom-left-radius:3px;border-top-left-radius:3px}.bootstrap-switch .bootstrap-switch-handle-off{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch input[type=radio],.bootstrap-switch input[type=checkbox]{position:absolute!important;top:0;left:0;margin:0;z-index:-1;opacity:0;filter:alpha(opacity=0);visibility:hidden}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{padding:1px 5px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{padding:5px 10px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{padding:6px 16px;font-size:18px;line-height:1.3333333}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-indeterminate,.bootstrap-switch.bootstrap-switch-readonly{cursor:default!important}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label{opacity:.5;filter:alpha(opacity=50);cursor:default!important}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;-o-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on{border-radius:0 3px 3px 0}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off{border-radius:3px 0 0 3px}.bootstrap-switch.bootstrap-switch-focused{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label{border-bottom-left-radius:3px;border-top-left-radius:3px}.ngdialog,.ngdialog-overlay{position:fixed;top:0;right:0;bottom:0;left:0}@-webkit-keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{box-sizing:border-box;overflow:auto;-webkit-overflow-scrolling:touch;z-index:10000}.ngdialog *,.ngdialog :after,.ngdialog :before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation,.ngdialog.ngdialog-disabled-animation .ngdialog-content,.ngdialog.ngdialog-disabled-animation .ngdialog-overlay{-webkit-animation:none!important;animation:none!important}.ngdialog-overlay{background:rgba(0,0,0,.4);-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s}.ngdialog-no-overlay{pointer-events:none}.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadeout .5s;animation:ngdialog-fadeout .5s}.ngdialog-content{background:#fff;-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s;pointer-events:all}.ngdialog.ngdialog-closing .ngdialog-content{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadeout .5s;animation:ngdialog-fadeout .5s}.ngdialog-close:before{font-family:Helvetica,Arial,sans-serif;content:'\00D7';cursor:pointer}body.ngdialog-open,html.ngdialog-open{overflow:hidden}@-webkit-keyframes ngdialog-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes ngdialog-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes ngdialog-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes ngdialog-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}.ngdialog.ngdialog-theme-default{padding-bottom:160px;padding-top:160px}.ngdialog.ngdialog-theme-default.ngdialog-closing .ngdialog-content{-webkit-animation:ngdialog-flyout .5s;animation:ngdialog-flyout .5s}.ngdialog.ngdialog-theme-default .ngdialog-content{-webkit-animation:ngdialog-flyin .5s;animation:ngdialog-flyin .5s;background:#f0f0f0;border-radius:5px;color:#444;font-family:Helvetica,sans-serif;font-size:1.1em;line-height:1.5em;margin:0 auto;max-width:100%;padding:1em;position:relative;width:450px}.ngdialog.ngdialog-theme-default .ngdialog-close{border-radius:5px;cursor:pointer;position:absolute;right:0;top:0}.ngdialog.ngdialog-theme-default .ngdialog-close:before{background:0 0;border-radius:3px;color:#bbb;content:'\00D7';font-size:26px;font-weight:400;height:30px;line-height:26px;position:absolute;right:3px;text-align:center;top:3px;width:30px}.ngdialog.ngdialog-theme-default .ngdialog-close:active:before,.ngdialog.ngdialog-theme-default .ngdialog-close:hover:before{color:#777}.ngdialog.ngdialog-theme-default .ngdialog-message{margin-bottom:.5em}.ngdialog.ngdialog-theme-default .ngdialog-input{margin-bottom:1em}.ngdialog.ngdialog-theme-default .ngdialog-input input[type=text],.ngdialog.ngdialog-theme-default .ngdialog-input input[type=password],.ngdialog.ngdialog-theme-default .ngdialog-input input[type=email],.ngdialog.ngdialog-theme-default .ngdialog-input input[type=url],.ngdialog.ngdialog-theme-default .ngdialog-input textarea{background:#fff;border:0;border-radius:3px;font-family:inherit;font-size:inherit;font-weight:inherit;margin:0 0 .25em;min-height:2.5em;padding:.25em .67em;width:100%}.ngdialog.ngdialog-theme-default .ngdialog-input input[type=text]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input input[type=password]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input input[type=email]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input input[type=url]:focus,.ngdialog.ngdialog-theme-default .ngdialog-input textarea:focus{box-shadow:inset 0 0 0 2px #8dbdf1;outline:0}.ngdialog.ngdialog-theme-default .ngdialog-buttons:after{content:'';display:table;clear:both}.ngdialog.ngdialog-theme-default .ngdialog-button{border:0;border-radius:3px;cursor:pointer;float:right;font-family:inherit;font-size:.8em;letter-spacing:.1em;line-height:1em;margin:0 0 0 .5em;padding:.75em 2em;text-transform:uppercase}.ngdialog.ngdialog-theme-default .ngdialog-button:focus{-webkit-animation:ngdialog-pulse 1.1s infinite;animation:ngdialog-pulse 1.1s infinite;outline:0}.btn:active,.btn:focus,.selectize-input>input:focus{outline:0!important}@media (max-width:568px){.ngdialog.ngdialog-theme-default .ngdialog-button:focus{-webkit-animation:none;animation:none}}.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-primary{background:#3288e6;color:#fff}.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-secondary{background:#e0e0e0;color:#777}.datetimepicker{border-radius:4px;direction:ltr;display:block;margin-top:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:320px}.datetimepicker>div{display:none}.datetimepicker .hour,.datetimepicker .minute{height:34px;line-height:34px;margin:0;width:25%}.datetimepicker .table{margin:0}.datetimepicker .table td,.datetimepicker .table th{border:0;border-radius:4px;height:20px;text-align:center}.datetimepicker .day:hover,.datetimepicker .hour:hover,.datetimepicker .left:hover,.datetimepicker .minute:hover,.datetimepicker .right:hover,.datetimepicker .switch:hover{background:#eee;cursor:pointer}.datetimepicker .disabled,.datetimepicker .disabled:hover{background:0 0;color:#ebebeb;cursor:default}.datetimepicker .active,.datetimepicker .active.disabled,.datetimepicker .active.disabled:hover,.datetimepicker .active:hover{background-color:#04c;background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;color:#fff;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#08c', endColorstr='#04c', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datetimepicker .current,.datetimepicker .current.disabled,.datetimepicker .current.disabled:hover,.datetimepicker .current:hover{background-color:#e5e5e5}.datetimepicker .active.active,.datetimepicker .active.disabled,.datetimepicker .active.disabled.active,.datetimepicker .active.disabled.disabled,.datetimepicker .active.disabled:active,.datetimepicker .active.disabled:hover,.datetimepicker .active.disabled:hover.active,.datetimepicker .active.disabled:hover.disabled,.datetimepicker .active.disabled:hover:active,.datetimepicker .active.disabled:hover:hover,.datetimepicker .active:active,.datetimepicker .active:hover,.datetimepicker .active:hover.active,.datetimepicker .active:hover.disabled,.datetimepicker .active:hover:active,.datetimepicker .active:hover:hover,.datetimepicker span.active.disabled:hover[disabled],.datetimepicker span.active.disabled[disabled],.datetimepicker span.active:hover[disabled],.datetimepicker span.active[disabled],.datetimepicker td.active.disabled:hover[disabled],.datetimepicker td.active.disabled[disabled],.datetimepicker td.active:hover[disabled],.datetimepicker td.active[disabled]{background-color:#04c}.datetimepicker span{border-radius:4px;cursor:pointer;display:block;float:left;height:54px;line-height:54px;margin:1%;width:23%}.datetimepicker span:hover{background:#eee}.datetimepicker .future,.datetimepicker .past{color:#999}.ui-notification{position:fixed;z-index:9999;width:300px;-webkit-transition:all ease .5s;-o-transition:all ease .5s;transition:all ease .5s;color:#fff;border-radius:0;background:#337ab7;box-shadow:5px 5px 10px rgba(0,0,0,.3)}.ui-notification.clickable{cursor:pointer}.ui-notification.clickable:hover{opacity:.7}.ui-notification.killed{-webkit-transition:opacity ease 1s;-o-transition:opacity ease 1s;transition:opacity ease 1s;opacity:0}.ui-notification>h3{font-size:14px;font-weight:700;display:block;margin:10px 10px 0;padding:0 0 5px;text-align:left;border-bottom:1px solid rgba(255,255,255,.3)}.ui-notification a{color:#fff}.ui-notification a:hover{text-decoration:underline}.ui-notification>.message{margin:10px}.ui-notification.warning{color:#fff;background:#f0ad4e}.ui-notification.error{color:#fff;background:#d9534f}.ui-notification.success{color:#fff;background:#5cb85c}.ui-notification.info{color:#fff;background:#5bc0de}table.rz-table{table-layout:fixed;border-collapse:collapse}table.rz-table th{position:relative;min-width:25px}table.rz-table th .rz-handle{width:10px;height:100%;position:absolute;top:0;right:0;cursor:ew-resize!important}table.rz-table th .rz-handle.rz-handle-active{border-right:1px dotted #000}.selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder{visibility:visible!important;background:#f2f2f2!important;background:rgba(0,0,0,.06)!important;border:0!important;-webkit-box-shadow:inset 0 0 12px 4px #fff;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:'!';visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{-webkit-box-shadow:0 2px 5px rgba(0,0,0,.2);box-shadow:0 2px 5px rgba(0,0,0,.2)}.selectize-dropdown-header{position:relative;padding:5px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.selectize-dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove,.selectize-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;display:inline-block}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:24px!important}.selectize-control.plugin-remove_button [data-value] .remove{z-index:1;position:absolute;top:0;right:0;bottom:0;width:17px;text-align:center;font-weight:700;font-size:12px;color:inherit;text-decoration:none;vertical-align:middle;padding:2px 0 0;border-left:1px solid #d0d0d0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove:hover{background:rgba(0,0,0,.05)}.selectize-control.plugin-remove_button [data-value].active .remove{border-left-color:#cacaca}.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .remove{border-left-color:#fff}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control,.selectize-input{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px;width:100%;overflow:hidden;z-index:1;box-sizing:border-box;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.15)}.selectize-input.dropdown-active{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-input>*{vertical-align:baseline;display:-moz-inline-stack;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#7d7d7d;background:#fff;border:0 solid #fff}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0!important;text-indent:0!important;border:0!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important;-webkit-box-shadow:none!important;box-shadow:none!important}.selectize-input>input::-ms-clear{display:none}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0;border-top:0 none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1);-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,.2);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.selectize-dropdown .optgroup-header,.selectize-dropdown .option{padding:5px 8px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:grey transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent grey}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}/*! - * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com) - * Code licensed under the Apache License v2.0. - * For details, see http://www.apache.org/licenses/LICENSE-2.0. - */body{background-color:#f8f8f8}.example{padding:.625rem 1.825rem .625rem 2.5rem;border:1px dashed #ccc;position:relative;margin:0 0 .625rem;background-color:#fff}dl dd,dl dt{line-height:1.25rem}dl dt{font-style:normal;font-weight:700}dl dd{margin-left:.9375rem}dl.horizontal dt{float:left;width:10rem;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}dl.horizontal dd{margin-left:11.25rem}#wrapper{width:100%}#page-wrapper{min-height:568px;background-color:#fff}@media(min-width:768px){#page-wrapper{position:inherit;margin:0 0 0 250px;padding:0 30px;border-left:1px solid #e7e7e7}}.navbar-top-links{margin-right:0}.navbar-top-links li{display:inline-block}.flot-chart,.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links li:last-child{margin-right:15px}.navbar-top-links li a{padding:15px;min-height:50px}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.sidebar .sidebar-search{padding:15px}.sidebar ul li{border-bottom:1px solid #e7e7e7}.sidebar ul li a.active{background-color:#fff;color:#fff}.sidebar .arrow{float:right}.sidebar .fa.arrow:before{content:"\f104"}.sidebar .active>a>.fa.arrow:before{content:"\f107"}.sidebar .nav-second-level li,.sidebar .nav-third-level li{border-bottom:0!important}.sidebar .nav-second-level li a{padding-left:37px}.sidebar .nav-third-level li a{padding-left:52px}@media(min-width:768px){.sidebar{z-index:1;position:absolute;width:250px;margin-top:51px}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{margin-left:auto}}.btn-outline{color:inherit;background-color:transparent;transition:all .5s}.btn-primary.btn-outline{color:#428bca}.btn-success.btn-outline{color:#5cb85c}.btn-info.btn-outline{color:#5bc0de}.btn-warning.btn-outline{color:#f0ad4e}.btn-danger.btn-outline{color:#d9534f}.btn-danger.btn-outline:hover,.btn-info.btn-outline:hover,.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-warning.btn-outline:hover{color:#fff}.chat{margin:0;padding:0}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #999}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0}.chat .glyphicon,.panel .slidedown .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}.login-panel{margin-top:25%}.flot-chart{height:400px}.flot-chart-content{width:100%;height:100%}.dataTables_wrapper{position:relative;clear:both}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{background:0 0}table.dataTable thead .sorting_asc:after{content:"\f0de";float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,.5)}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.huge{font-size:40px}.panel-green{border-color:#5cb85c}.panel-green .panel-heading{border-color:#5cb85c;color:#fff;background-color:#5cb85c}.panel-green a{color:#5cb85c}.panel-green a:hover{color:#3d8b3d}.panel-red{border-color:#d9534f}.panel-red .panel-heading{border-color:#d9534f;color:#fff;background-color:#d9534f}.panel-red a{color:#d9534f}.panel-red a:hover{color:#b52b27}.panel-yellow{border-color:#f0ad4e}.panel-yellow .panel-heading{border-color:#f0ad4e;color:#fff;background-color:#f0ad4e}.panel-yellow a{color:#f0ad4e}.panel-yellow a:hover{color:#df8a13}.timeline{position:relative;padding:20px 0}.timeline:before{content:" ";position:absolute;top:0;bottom:0;left:50%;width:3px;margin-left:-1.5px;background-color:#eee}.timeline>li{position:relative;margin-bottom:20px}.timeline>li:after,.timeline>li:before{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{float:left;position:relative;width:46%;padding:20px;border:1px solid #d4d4d4;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.175);box-shadow:0 1px 6px rgba(0,0,0,.175)}.timeline>li>.timeline-panel:before{content:" ";display:inline-block;position:absolute;top:26px;right:-15px;border-top:15px solid transparent;border-right:0 solid #ccc;border-bottom:15px solid transparent;border-left:15px solid #ccc}.timeline>li>.timeline-panel:after{content:" ";display:inline-block;position:absolute;top:27px;right:-14px;border-top:14px solid transparent;border-right:0 solid #fff;border-bottom:14px solid transparent;border-left:14px solid #fff}.timeline>li>.timeline-badge{z-index:100;position:absolute;top:16px;left:50%;width:50px;height:50px;margin-left:-25px;border-radius:50%;text-align:center;font-size:1.4em;line-height:50px;color:#fff;background-color:#999}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{right:auto;left:-15px;border-right-width:15px;border-left-width:0}.timeline>li.timeline-inverted>.timeline-panel:after{right:auto;left:-14px;border-right-width:14px;border-left-width:0}.timeline-badge.primary{background-color:#2e6da4!important}.timeline-badge.success{background-color:#3f903f!important}.timeline-badge.warning{background-color:#f0ad4e!important}.timeline-badge.danger{background-color:#d9534f!important}.timeline-badge.info{background-color:#5bc0de!important}.timeline-title{margin-top:0;color:inherit}.timeline-body>p,.timeline-body>ul{margin-bottom:0}.timeline-body>p+p{margin-top:5px}@media(max-width:767px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(100% - 90px);width:-moz-calc(100% - 90px);width:-webkit-calc(100% - 90px);float:right}ul.timeline>li>.timeline-badge{top:16px;left:15px;margin-left:0}ul.timeline>li>.timeline-panel:before{right:auto;left:-15px;border-right-width:15px;border-left-width:0}ul.timeline>li>.timeline-panel:after{right:auto;left:-14px;border-right-width:14px;border-left-width:0}}.header,.jumbotron{border-bottom:1px solid #e5e5e5}.btn{height:32px}.width-200{max-width:200px}.width-300,.witdh-300{max-width:300px}body{padding:0}.footer,.header,.marketing{padding-left:15px;padding-right:15px}.header{margin-bottom:10px}.header h3{margin-top:0;margin-bottom:0;line-height:40px;padding-bottom:19px}.card .detail,.card .detail-brand{line-height:98px;text-align:center}.footer{padding-top:19px;color:#777;border-top:1px solid #e5e5e5}.container-narrow>hr{margin:30px 0}.jumbotron{text-align:center}.jumbotron .btn{font-size:21px;padding:14px 24px}.marketing{margin:40px 0}.marketing p+h4{margin-top:28px}@media screen and (min-width:768px){.container{width:inherit;margin-left:60px;margin-right:5px}.footer,.header,.marketing{padding-left:0;padding-right:0}.header{margin-bottom:30px}.jumbotron{border-bottom:0}}.navbar-inverse .navbar-nav>li>a{color:#b0ddce;font-size:15px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#1b926c}@media (min-width:900px){.navbar-right,.navbar-right~.navbar-right{margin-right:0}.navbar-left{float:left!important}.navbar-right{float:right!important}}.dropdown-menu{min-width:100px!important}.nav-sidebar li.active a{background:#DDD}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background:#1d9d74;color:#fff}.broadcast-message,.broadcast-message-preview{padding:10px;text-align:center;background:#555;color:#BBB;margin-top:50px}.card{position:relative;border:1px solid #d9d9d9;color:#666;background-color:#fff;width:100%;border-radius:5px}.card .card-header,.tools-header{border-top-left-radius:4px;border-top-right-radius:4px}.card .card-header{padding:9px 0;height:40px;background:#555;color:#fff;text-align:center}.card .card-body{padding:12px 10px}.card .card-footer{height:20px;font-size:10px;color:#777;margin:-15px 20px 5px}.card .detail-brand{float:left;width:30%;font-size:30px;color:#fff}.card .default{background:#1d9d74}.card .info{background:#6EBEE7}.card .warn{background:#ED7F54}.card .danger{background:#6583BE}.card .detail .text-default{color:#1d9d74}.card .detail .text-info{color:#6EBEE7}.card .detail .text-warn{color:#ED7F54}.card .detail .text-danger{color:#6583BE}.card .detail{float:right;width:70%}.card .detail .text{font-size:12px}.card .detail .number{font-size:30px;font-weight:500}.h100{height:100px}.inline{display:inline}.separator{height:1px;background-color:#e5e5e5;margin-top:10px}.card>.card-body>table>tbody>tr>td,.card>.card-body>table>thead>tr>td{word-wrap:break-word;word-break:break-all}.card>.card-body>table>thead>tr>td{font-weight:500;font-size:13px;text-align:center}.card>.card-body>table>thead>tr>td>span{font-weight:500;font-size:10px}.card>.card-body>table>tbody>tr>td{font-size:12px;text-align:center}.card>.card-body>table>tbody>tr>td>a{color:#666}.thumbnails>.card>.card-body>table>tbody>tr>td,.thumbnails>.card>.card-body>table>thead>tr>td{font-size:12px;color:#777;word-wrap:break-word;word-break:break-all}.thumbnails>.card>.card-body>table>thead>tr>td:nth-child(n+2){text-align:center}.thumbnails>.card>.card-body>table>tbody>tr>td:nth-child(n+2){font-weight:700;text-align:center}.thumbnails>.card>.card-body>table>tbody>tr>td:nth-child(1),.thumbnails>.card>.card-body>table>thead>tr>td:nth-child(1){text-align:left}.tools-header{background:#f5f5f5;padding:9px 0;height:40px}.tools-header .brand{font-size:13px;margin:2px 10px;font-weight:700;float:left}.tools-header .brand>a{color:#666}.tools-header>a,.tools-header>button,.tools-header>select{float:right;max-width:80px;margin:1px 10px;height:25px;padding:0 10px;line-height:25px;color:#666}.tools-header .paged{margin-right:0}.btn.btn-danger-tag{color:#fff;background-color:#d9534f;border-color:#d43f3a;line-height:1px;font-size:11px;padding:4px}.btn.btn-danger{color:#333;background-color:#fff;border-color:#ccc}.btn.btn-danger:active,.btn.btn-danger:focus,.btn.btn-danger:hover{color:#d9534f;border-color:#d9534f;background:#fff}.form-control{height:32px}.input-label:before{display:inline-block;content:"*";color:#f44336;font-family:SimSun;font-size:12px;-webkit-transform:TranslateX(-10px);-ms-transform:TranslateX(-10px);transform:TranslateX(-10px)}.badge-main,.label.label-main{color:#fff;background-color:#1d9d74;border-color:#1d9d74}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);display:inline-block;padding:4px 6px;color:#555;vertical-align:middle;border-radius:4px;width:85%;height:100px;line-height:20px;cursor:text}.bootstrap-tagsinput>.dropdown-menu{min-width:40px;font-size:12px}.bootstrap-tagsinput>.dropdown-menu>.active>a,.bootstrap-tagsinput>.dropdown-menu>.active>a:focus,.bootstrap-tagsinput>.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#1d9d74 0,#1d9d74 100%);background-image:-o-linear-gradient(top,#1d9d74 0,#1d9d74 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#1d9d74),to(#1d9d74));background-image:linear-gradient(to bottom,#1d9d74 0,#1d9d74 100%);filter:progid: DXImageTransform.Microsoft.gradient(startColorstr='#1d9d74', endColorstr='#1d9d74', GradientType=0);background-repeat:repeat-x;color:#fff;text-decoration:none;outline:0;background-color:#1d9d74}.inputs-header{padding:9px 0;height:50px;border-top-left-radius:4px;border-top-right-radius:4px}.inputs-header .brand{font-size:13px;margin:2px 10px;font-weight:700;float:left}.inputs-header .brand>a{color:#666}.inputs-header>input{float:right;margin:1px 10px;height:30px;padding:0 10px;color:#666}.inputs-header>a{float:right;margin:1px 10px;height:30px;padding:5 5px}.inputs-header>select{float:right;max-width:80px;margin:1px 10px;padding:0 10px;color:#666;height:25px;font-size:12px}.witdh-150{max-width:150px}.witdh-200{max-width:200px}.card.highlight{border-color:#d9534f}.card .pagination-footer{height:40px;font-size:10px;color:#777;margin:-15px 20px 5px}.card .pagination-footer .tools{font-size:12px;margin:11px 20px 11px 0;float:right;display:inline}.card>.pagination-footer>.tools>span>input{height:25px;max-width:50px;display:inline}.pagination{display:inline-block;padding-left:0;margin:8px 0;float:right;border-radius:4px}.pagination>a{margin-right:5px;height:28px;width:28px;padding:5px 0}.datepicker>.table>tbody>tr>td,.datepicker>.table>thead>tr>td,.timepicker>.table>tbody>tr>td,.timepicker>.table>thead>tr>td{padding:5px 3px}.datepicker>.table>tbody>tr>td>.btn,.datepicker>.table>thead>tr>td>.btn,.timepicker>.table>tbody>tr>td>.btn,.timepicker>.table>thead>tr>td>.btn{border:1px solid #FFFDFD}.datepicker>.table>tbody>tr>td>.btn-default:active,.datepicker>.table>tbody>tr>td>.btn-default:focus,.datepicker>.table>tbody>tr>td>.btn-default:hover,.datepicker>.table>thead>tr>td>.btn-default:active,.datepicker>.table>thead>tr>td>.btn-default:focus,.datepicker>.table>thead>tr>td>.btn-default:hover,.timepicker>.table>tbody>tr>td>.btn-default:active,.timepicker>.table>tbody>tr>td>.btn-default:focus,.timepicker>.table>tbody>tr>td>.btn-default:hover,.timepicker>.table>thead>tr>td>.btn-default:active,.timepicker>.table>thead>tr>td>.btn-default:focus,.timepicker>.table>thead>tr>td>.btn-default:hover{color:#1d9d74;border-color:#1d9d74;background:#fff}.datepicker>.table>tbody>tr>td>a,.datepicker>.table>thead>tr>td>a,.timepicker>.table>tbody>tr>td>a,.timepicker>.table>thead>tr>td>a{height:25px;width:25px;padding:3px 0}.datepicker>.table>tbody>tr:first-child>td>a{padding:4px 0}.datepicker>.table>tbody>tr>td>a.btn.active,.datepicker>.table>thead>tr>td>a.btn.active,.timepicker>.table>tbody>tr>td>a.btn.active,.timepicker>.table>thead>tr>td>a.btn.active{color:#1d9d74;border-color:#1d9d74;background:#fff;box-shadow:inset 0 0 0 rgba(0,0,0,.125)}.datepicker>.table>thead>tr>td:not(:first-child):last-child>a,.timepicker>.table>thead>tr>td:not(:first-child):last-child>a{height:25px;width:50px;padding:5px 0}.datepicker>.table>tbody>tr>td>a,.timepicker>.table>tbody>tr>td>a{margin-left:8px}.sortorder:after{content:'\25b2'}.sortorder.reverse:after{content:'\25bc'}.input-control select{-moz-appearance:none;-webkit-appearance:none;appearance:none;position:relative;border:1px solid #d9d9d9;width:100%;height:100%;padding:.3125rem;z-index:0}.navbar-inverse{background-color:#337ab7;border-color:#337ab7}.sidebar{z-index:1;width:220px;top:0;left:0;height:100%}#page-wrapper{position:inherit;margin:70px 0 0 220px;padding:12px 30px;border-left:0 solid #e7e7e7}.sidebar .sidebar-nav.navbar-collapse{background-color:#F5F5F5;position:relative;color:#000;width:100%;padding:0;margin:0;list-style:none inside}.sidebar a{color:#555}.sidebar ul li:hover{color:red}.form-control{border-radius:8px}.form-control:focus,.highlight-border{border-color:#337ab7;box-shadow:0 0 0 rgba(0,0,0,.075) inset,0 0 0 rgba(29,157,116,1)}.btn-outline-primary.focus,.btn-outline-primary:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.browsehappy{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.btn.btn-main{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-default-inverse,.btn-default-inverse:focus,.btn-default-inverse:hover,.btn-default:active{color:#337ab7;border-color:#337ab7;background:#fff}.btn-danger-inverse,.btn-danger-inverse:focus,.btn-danger-inverse:hover,.btn-danger:active{color:#d9534f;border-color:#d9534f;background:#fff}.btn-tab-active,.btn-tab-active:focus,.btn-tab-active:hover,.btn-tab-default:active,.btn-tab-default:focus,.btn-tab-default:hover{color:#337ab7;border-color:#337ab7;background:#fff;font-weight:600}.btn-tab-default{color:#777;background:#fff;font-weight:600}.pagination>.btn.active{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-default:active,.btn-default:focus,.btn-default:hover{color:#337ab7;border-color:#337ab7;background:#fff}.bootstrap-switch.bootstrap-switch-on{border-color:#337ab7}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success{color:#fff;background:#337ab7}.selectize-input-200>.selectize-input{min-width:200px;border-color:#337ab7}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary.focus,.btn-outline-secondary:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-success.focus,.btn-outline-success:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info.focus,.btn-outline-info:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning.focus,.btn-outline-warning:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger.focus,.btn-outline-danger:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light.focus,.btn-outline-light:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark.focus,.btn-outline-dark:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js deleted file mode 100644 index ccab2f61..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/dist/js/app.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var app;angular.module("sentinelDashboardApp",["oc.lazyLoad","ui.router","ui.bootstrap","angular-loading-bar","ngDialog","ui.bootstrap.datetimepicker","ui-notification","rzTable","angular-clipboard","selectize","angularUtils.directives.dirPagination"]).factory("AuthInterceptor",["$window","$state",function(t,r){return{responseError:function(e){return 401===e.status&&(t.localStorage.removeItem("session_sentinel_admin"),r.go("login")),e},response:function(e){return e},request:function(e){return e},requestError:function(e){return e}}}]).config(["$stateProvider","$urlRouterProvider","$ocLazyLoadProvider","$httpProvider",function(e,t,r,a){a.interceptors.push("AuthInterceptor"),r.config({debug:!1,events:!0}),t.otherwise("/dashboard/home"),e.state("login",{url:"/login",templateUrl:"app/views/login.html",controller:"LoginCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/login.js"]})}]}}).state("dashboard",{url:"/dashboard",templateUrl:"app/views/dashboard/main.html",resolve:{loadMyDirectives:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/directives/header/header.js","app/scripts/directives/sidebar/sidebar.js","app/scripts/directives/sidebar/sidebar-search/sidebar-search.js"]})}]}}).state("dashboard.home",{url:"/home",templateUrl:"app/views/dashboard/home.html",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/main.js"]})}]}}).state("dashboard.flowV1",{templateUrl:"app/views/flow_v1.html",url:"/flow/:app",controller:"FlowControllerV1",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/flow_v1.js"]})}]}}).state("dashboard.flow",{templateUrl:"app/views/flow_v2.html",url:"/v2/flow/:app",controller:"FlowControllerV2",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/flow_v2.js"]})}]}}).state("dashboard.paramFlow",{templateUrl:"app/views/param_flow.html",url:"/paramFlow/:app",controller:"ParamFlowController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/param_flow.js"]})}]}}).state("dashboard.clusterAppAssignManage",{templateUrl:"app/views/cluster_app_assign_manage.html",url:"/cluster/assign_manage/:app",controller:"SentinelClusterAppAssignManageController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_app_assign_manage.js"]})}]}}).state("dashboard.clusterAppServerList",{templateUrl:"app/views/cluster_app_server_list.html",url:"/cluster/server/:app",controller:"SentinelClusterAppServerListController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_app_server_list.js"]})}]}}).state("dashboard.clusterAppClientList",{templateUrl:"app/views/cluster_app_client_list.html",url:"/cluster/client/:app",controller:"SentinelClusterAppTokenClientListController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_app_token_client_list.js"]})}]}}).state("dashboard.clusterSingle",{templateUrl:"app/views/cluster_single_config.html",url:"/cluster/single/:app",controller:"SentinelClusterSingleController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/cluster_single.js"]})}]}}).state("dashboard.authority",{templateUrl:"app/views/authority.html",url:"/authority/:app",controller:"AuthorityRuleController",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/authority.js"]})}]}}).state("dashboard.degrade",{templateUrl:"app/views/degrade.html",url:"/degrade/:app",controller:"DegradeCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/degrade.js"]})}]}}).state("dashboard.system",{templateUrl:"app/views/system.html",url:"/system/:app",controller:"SystemCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/system.js"]})}]}}).state("dashboard.machine",{templateUrl:"app/views/machine.html",url:"/app/:app",controller:"MachineCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/machine.js"]})}]}}).state("dashboard.identity",{templateUrl:"app/views/identity.html",url:"/identity/:app",controller:"IdentityCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/identity.js"]})}]}}).state("dashboard.gatewayIdentity",{templateUrl:"app/views/gateway/identity.html",url:"/gateway/identity/:app",controller:"GatewayIdentityCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/gateway/identity.js"]})}]}}).state("dashboard.metric",{templateUrl:"app/views/metric.html",url:"/metric/:app",controller:"MetricCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/metric.js"]})}]}}).state("dashboard.gatewayApi",{templateUrl:"app/views/gateway/api.html",url:"/gateway/api/:app",controller:"GatewayApiCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/gateway/api.js"]})}]}}).state("dashboard.gatewayFlow",{templateUrl:"app/views/gateway/flow.html",url:"/gateway/flow/:app",controller:"GatewayFlowCtl",resolve:{loadMyFiles:["$ocLazyLoad",function(e){return e.load({name:"sentinelDashboardApp",files:["app/scripts/controllers/gateway/flow.js"]})}]}})}]),(app=angular.module("sentinelDashboardApp")).filter("range",[function(){return function(e,t){if(isNaN(t)||t<=0)return[];e=[];for(var r=1;r<=t;r++)e.push(r);return e}}]),(app=angular.module("sentinelDashboardApp")).service("VersionService",["$http",function(e){this.version=function(){return e({url:"/version",method:"GET"})}}]),(app=angular.module("sentinelDashboardApp")).service("AuthService",["$http",function(t){this.check=function(){return t({url:"/auth/check",method:"POST"})},this.login=function(e){return t({url:"/auth/login",params:e,method:"POST"})},this.logout=function(){return t({url:"/auth/logout",method:"POST"})}}]),(app=angular.module("sentinelDashboardApp")).service("AppService",["$http",function(e){this.getApps=function(){return e({url:"app/briefinfos.json",method:"GET"})}}]),(app=angular.module("sentinelDashboardApp")).service("FlowServiceV1",["$http",function(a){function t(e){return void 0===e||""===e||isNaN(e)||e<=0}this.queryMachineRules=function(e,t,r){return a({url:"/v1/flow/rules",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){e.resource,e.limitApp,e.grade,e.count,e.strategy,e.refResource,e.controlBehavior,e.warmUpPeriodSec,e.maxQueueingTimeMs,e.app,e.ip,e.port;return a({url:"/v1/flow/rule",data:e,method:"POST"})},this.saveRule=function(e){var t={id:e.id,resource:e.resource,limitApp:e.limitApp,grade:e.grade,count:e.count,strategy:e.strategy,refResource:e.refResource,controlBehavior:e.controlBehavior,warmUpPeriodSec:e.warmUpPeriodSec,maxQueueingTimeMs:e.maxQueueingTimeMs};return a({url:"/v1/flow/save.json",params:t,method:"PUT"})},this.deleteRule=function(e){var t={id:e.id,app:e.app};return a({url:"/v1/flow/delete.json",params:t,method:"DELETE"})},this.checkRuleValid=function(e){return void 0===e.resource||""===e.resource?(alert("资源名称不能为空"),!1):void 0===e.count||e.count<0?(alert("限流阈值必须大于等于 0"),!1):void 0===e.strategy||e.strategy<0?(alert("无效的流控模式"),!1):1!=e.strategy&&2!=e.strategy||void 0!==e.refResource&&""!=e.refResource?void 0===e.controlBehavior||e.controlBehavior<0?(alert("无效的流控整形方式"),!1):1==e.controlBehavior&&t(e.warmUpPeriodSec)?(alert("预热时长必须大于 0"),!1):2==e.controlBehavior&&t(e.maxQueueingTimeMs)?(alert("排队超时时间必须大于 0"),!1):!e.clusterMode||void 0!==e.clusterConfig&&void 0!==e.clusterConfig.thresholdType||(alert("集群限流配置不正确"),!1):(alert("请填写关联资源或入口"),!1)}}]),(app=angular.module("sentinelDashboardApp")).service("FlowServiceV2",["$http",function(a){function t(e){return void 0===e||""===e||isNaN(e)||e<=0}this.queryMachineRules=function(e,t,r){return a({url:"/v2/flow/rules",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){return a({url:"/v2/flow/rule",data:e,method:"POST"})},this.saveRule=function(e){return a({url:"/v2/flow/rule/"+e.id,data:e,method:"PUT"})},this.deleteRule=function(e){return a({url:"/v2/flow/rule/"+e.id,method:"DELETE"})},this.checkRuleValid=function(e){return void 0===e.resource||""===e.resource?(alert("资源名称不能为空"),!1):void 0===e.count||e.count<0?(alert("限流阈值必须大于等于 0"),!1):void 0===e.strategy||e.strategy<0?(alert("无效的流控模式"),!1):1!=e.strategy&&2!=e.strategy||void 0!==e.refResource&&""!=e.refResource?void 0===e.controlBehavior||e.controlBehavior<0?(alert("无效的流控整形方式"),!1):1==e.controlBehavior&&t(e.warmUpPeriodSec)?(alert("预热时长必须大于 0"),!1):2==e.controlBehavior&&t(e.maxQueueingTimeMs)?(alert("排队超时时间必须大于 0"),!1):!e.clusterMode||void 0!==e.clusterConfig&&void 0!==e.clusterConfig.thresholdType||(alert("集群限流配置不正确"),!1):(alert("请填写关联资源或入口"),!1)}}]),(app=angular.module("sentinelDashboardApp")).service("DegradeService",["$http",function(a){this.queryMachineRules=function(e,t,r){return a({url:"degrade/rules.json",params:{app:e,ip:t,port:r},method:"GET"})},this.newRule=function(e){return a({url:"/degrade/rule",data:e,method:"POST"})},this.saveRule=function(e){var t={id:e.id,resource:e.resource,limitApp:e.limitApp,grade:e.grade,count:e.count,timeWindow:e.timeWindow,statIntervalMs:e.statIntervalMs,minRequestAmount:e.minRequestAmount,slowRatioThreshold:e.slowRatioThreshold};return a({url:"/degrade/rule/"+e.id,data:t,method:"PUT"})},this.deleteRule=function(e){return a({url:"/degrade/rule/"+e.id,method:"DELETE"})},this.checkRuleValid=function(e){if(void 0===e.resource||""===e.resource)return alert("资源名称不能为空"),!1;if(void 0===e.grade||e.grade<0)return alert("未知的降级策略"),!1;if(void 0===e.count||""===e.count||e.count<0)return alert("降级阈值不能为空或小于 0"),!1;if(null==e.timeWindow||""===e.timeWindow||e.timeWindow<=0)return alert("熔断时长必须大于 0s"),!1;if(null==e.minRequestAmount||e.minRequestAmount<=0)return alert("最小请求数目需大于 0"),!1;if(null==e.statIntervalMs||e.statIntervalMs<=0)return alert("统计窗口时长需大于 0s"),!1;if(void 0!==e.statIntervalMs&&12e4=r?n.apply(null,t):function(){return e(t.concat([].slice.apply(arguments)))}}(e)}function n(){var n=arguments,r=n.length-1;return function(){for(var e=r,t=n[r].apply(this,arguments);e--;)t=n[e].call(this,t);return t}}function l(){for(var e=[],t=0;tthis._limit&&this.evict(),e},e.prototype.evict=function(){var t=this._items.shift();return this._evictListeners.forEach(function(e){return e(t)}),t},e.prototype.dequeue=function(){if(this.size())return this._items.splice(0,1)[0]},e.prototype.clear=function(){var e=this._items;return this._items=[],e},e.prototype.size=function(){return this._items.length},e.prototype.remove=function(e){var t=this._items.indexOf(e);return-1 "+Ue(e))},e.prototype.traceTransitionIgnored=function(e){this.enabled(g.Category.TRANSITION)&&console.log(st(e)+": Ignored <> "+Ue(e))},e.prototype.traceHookInvocation=function(e,t,n){if(this.enabled(g.Category.HOOK)){var r=S("traceData.hookType")(n)||"internal",i=S("traceData.context.state.name")(n)||S("traceData.context")(n)||"unknown",o=He(e.registeredHook.callback);console.log(st(t)+": Hook -> "+r+" context: "+i+", "+Fe(200,o))}},e.prototype.traceHookResult=function(e,t,n){this.enabled(g.Category.HOOK)&&console.log(st(t)+": <- Hook returned: "+Fe(200,Ue(e)))},e.prototype.traceResolvePath=function(e,t,n){this.enabled(g.Category.RESOLVE)&&console.log(st(n)+": Resolving "+e+" ("+t+")")},e.prototype.traceResolvableResolved=function(e,t){this.enabled(g.Category.RESOLVE)&&console.log(st(t)+": <- Resolved "+e+" to: "+Fe(200,Ue(e.data)))},e.prototype.traceError=function(e,t){this.enabled(g.Category.TRANSITION)&&console.log(st(t)+": <- Rejected "+Ue(t)+", reason: "+e)},e.prototype.traceSuccess=function(e,t){this.enabled(g.Category.TRANSITION)&&console.log(st(t)+": <- Success "+Ue(t)+", final state: "+e.name)},e.prototype.traceUIViewEvent=function(e,t,n){void 0===n&&(n=""),this.enabled(g.Category.UIVIEW)&&console.log("ui-view: "+Le(30,e)+" "+et(t)+n)},e.prototype.traceUIViewConfigUpdated=function(e,t){this.enabled(g.Category.UIVIEW)&&this.traceUIViewEvent("Updating",e," with ViewConfig from context='"+t+"'")},e.prototype.traceUIViewFill=function(e,t){this.enabled(g.Category.UIVIEW)&&this.traceUIViewEvent("Fill",e," with: "+Fe(200,t))},e.prototype.traceViewSync=function(e){if(this.enabled(g.Category.VIEWCONFIG)){var a="uiview component fqn",t=e.map(function(e){var t,n=e.uiView,r=e.viewConfig,i=n&&n.fqn,o=r&&r.viewDecl.$context.name+": ("+r.viewDecl.$name+")";return(t={})[a]=i,t["view config state (view name)"]=o,t}).sort(function(e,t){return(e[a]||"").localeCompare(t[a]||"")});it(t)}},e.prototype.traceViewServiceEvent=function(e,t){var n,r,i;this.enabled(g.Category.VIEWCONFIG)&&console.log("VIEWCONFIG: "+e+" "+(r=(n=t).viewDecl,i=r.$context.name||"(root)","[View#"+n.$id+" from '"+i+"' state]: target ui-view: '"+r.$uiViewName+"@"+r.$uiViewContextAnchor+"'"))},e.prototype.traceViewServiceUIViewEvent=function(e,t){this.enabled(g.Category.VIEWCONFIG)&&console.log("VIEWCONFIG: "+e+" "+et(t))},e}(),ut=new lt,ct=function(){function e(e){this.pattern=/.*/,this.inherit=!0,N(this,e)}return e.prototype.is=function(e,t){return!0},e.prototype.encode=function(e,t){return e},e.prototype.decode=function(e,t){return e},e.prototype.equals=function(e,t){return e==t},e.prototype.$subPattern=function(){var e=this.pattern.toString();return e.substr(1,e.length-2)},e.prototype.toString=function(){return"{ParamType:"+this.name+"}"},e.prototype.$normalize=function(e){return this.is(e)?e:this.decode(e)},e.prototype.$asArray=function(e,t){if(!e)return this;if("auto"===e&&!t)throw new Error("'auto' array mode is for query parameters only");return new dt(this,e)},e}();function dt(r,i){var o=this;function a(e){return E(e)?e:k(e)?[e]:[]}function s(n,r){return function(e){if(E(e)&&0===e.length)return e;var t=ce(a(e),n);return!0===r?0===se(t,function(e){return!e}).length:function(e){switch(e.length){case 0:return;case 1:return"auto"===i?e[0]:e;default:return e}}(t)}}function l(o){return function(e,t){var n=a(e),r=a(t);if(n.length!==r.length)return!1;for(var i=0;i=n.invokeLimit&&n.deregister()}}},o.prototype.handleHookResult=function(e){var t=this,n=this.getNotCurrentRejection();return n||(R(e)?e.then(function(e){return t.handleHookResult(e)}):(ut.traceHookResult(e,this.transition,this.options),!1===e?Ve.aborted("Hook aborted transition").toPromise():h($t)(e)?Ve.redirected(e).toPromise():void 0))},o.prototype.getNotCurrentRejection=function(){var e=this.transition.router;return e._disposed?Ve.aborted("UIRouter instance #"+e.$id+" has been stopped (disposed)").toPromise():this.transition._aborted?Ve.aborted().toPromise():this.isSuperseded()?Ve.superseded(this.options.current()).toPromise():void 0},o.prototype.toString=function(){var e=this.options,t=this.registeredHook;return(S("traceData.hookType")(e)||"internal")+" context: "+(S("traceData.context.state.name")(e)||S("traceData.context")(e)||"unknown")+", "+Fe(200,Ye(t.callback))},o.HANDLE_RESULT=function(t){return function(e){return t.handleHookResult(e)}},o.LOG_REJECTED_RESULT=function(t){return function(e){R(e)&&e.catch(function(e){return t.logError(Ve.normalize(e))})}},o.LOG_ERROR=function(t){return function(e){return t.logError(e)}},o.REJECT_ERROR=function(e){return function(e){return Pe(e)}},o.THROW_ERROR=function(e){return function(e){throw e}},o}();function Gt(e,t){var i=O(t)?[t]:t;return!!(D(i)?i:function(e){for(var t=i,n=0;n "+(this.valid()?"":"(X) ")+"'"+(T(t)?t.name:t)+"'"+Ue(n(this.params()))+" )"},t.diToken=t}();function en(e,t){var n=["",""],r=e.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!t)return r;switch(t.squash){case!1:n=["(",")"+(t.isOptional?"?":"")];break;case!0:r=r.replace(/\/$/,""),n=["(?:/(",")|/)?"];break;default:n=["("+t.squash+"|",")?"]}return r+n[0]+t.type.pattern.source+n[1]}var tn=Xe("/"),nn={state:{params:{}},strict:!0,caseInsensitive:!0},rn=function(){function m(o,a,e,t){var s=this;this._cache={path:[this]},this._children=[],this._params=[],this._segments=[],this._compiled=[],this.config=t=te(t,nn),this.pattern=o;for(var n,r,i,l=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,u=/([:]?)([\w\[\].-]+)|\{([\w\[\].-]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,c=[],d=0,p=function(e){if(!m.nameValidator.test(e))throw new Error("Invalid parameter name '"+e+"' in pattern '"+o+"'");if(le(s._params,v("id",e)))throw new Error("Duplicate parameter name '"+e+"' in pattern '"+o+"'")},h=function(e,t){var n,r=e[2]||e[3],i=t?e[4]:e[4]||("*"===e[1]?"[\\s\\S]*":null);return{id:r,regexp:i,segment:o.substring(d,e.index),type:i?a.type(i)||(n=i,W(a.type(t?"query":"path"),{pattern:new RegExp(n,s.config.caseInsensitive?"i":void 0)})):null}};(n=l.exec(o))&&!(0<=(r=h(n,!1)).segment.indexOf("?"));)p(r.id),this._params.push(e.fromPath(r.id,r.type,t.state)),this._segments.push(r.segment),c.push([r.segment,De(this._params)]),d=l.lastIndex;var f=(i=o.substring(d)).indexOf("?");if(0<=f){var g=i.substring(f);if(i=i.substring(0,f),0r.weight?s:r}return r},t.prototype.sync=function(e){if(!e||!e.defaultPrevented){var t=this._router,n=t.urlService,r=t.stateService,i={path:n.path(),search:n.search(),hash:n.hash()},o=this.match(i);m([[O,function(e){return n.url(e,!0)}],[$t.isDef,function(e){return r.go(e.state,e.params,e.options)}],[h($t),function(e){return r.go(e.state(),e.params(),e.options())}]])(o&&o.rule.handler(o.match,i,t))}},t.prototype.listen=function(e){var t=this;if(!1!==e)return this._stopFn=this._stopFn||this._router.urlService.onChange(function(e){return t.sync(e)});this._stopFn&&this._stopFn(),delete this._stopFn},t.prototype.update=function(e){var t=this._router.locationService;e?this.location=t.url():t.url()!==this.location&&t.url(this.location,!0)},t.prototype.push=function(e,t,n){var r=n&&!!n.replace;this._router.urlService.url(e.format(t||{}),r)},t.prototype.href=function(e,t,n){var r=e.format(t);if(null==r)return null;n=n||{absolute:!1};var i,o,a,s,l=this._router.urlService.config,u=l.html5Mode();if(u||null===r||(r="#"+l.hashPrefix()+r),i=r,o=u,a=n.absolute,r="/"===(s=l.baseHref())?i:o?We(s)+i:a?s.slice(1)+i:i,!n.absolute||!r)return r;var c=!u&&r?"/":"",d=l.port(),p=80===d||443===d?"":":"+d;return[l.protocol(),"://",l.host(),p,c,r].join("")},t.prototype.rule=function(e){var t=this;if(!ln.isUrlRule(e))throw new Error("invalid rule");return e.$id=this._id++,e.priority=e.priority||0,this._rules.push(e),this._sorted=!1,function(){return t.removeRule(e)}},t.prototype.removeRule=function(e){Q(this._rules,e)},t.prototype.rules=function(){return this.ensureSorted(),this._rules.slice()},t.prototype.otherwise=function(e){var t=pn(e);this._otherwiseFn=this.urlRuleFactory.create(f(!0),t),this._sorted=!1},t.prototype.initial=function(e){var t=pn(e);this.rule(this.urlRuleFactory.create(function(e,t){return 0===t.globals.transitionHistory.size()&&!!/^\/?$/.exec(e.path)},t))},t.prototype.when=function(e,t,n){var r=this.urlRuleFactory.create(e,t);return k(n&&n.priority)&&(r.priority=n.priority),this.rule(r),r},t.prototype.deferIntercept=function(e){void 0===e&&(e=!0),this.interceptDeferred=e},t}();function pn(e){if(!(D(e)||O(e)||h($t)(e)||$t.isDef(e)))throw new Error("'handler' must be a string, function, TargetState, or have a state: 'newtarget' property");return D(e)?e:f(e)}var hn=function(){function l(e){var n=this;this.router=e,this._uiViews=[],this._viewConfigs=[],this._viewConfigFactories={},this._listeners=[],this._pluginapi={_rootViewContext:this._rootViewContext.bind(this),_viewConfigFactory:this._viewConfigFactory.bind(this),_registeredUIView:function(t){return le(n._uiViews,function(e){return n.router.$id+"."+e.id===t})},_registeredUIViews:function(){return n._uiViews},_activeViewConfigs:function(){return n._viewConfigs},_onSync:function(e){return n._listeners.push(e),function(){return Q(n._listeners,e)}}}}return l.normalizeUIViewTarget=function(e,t){void 0===t&&(t="");var n=t.split("@"),r=n[0]||"$default",i=O(n[1])?n[1]:"^",o=/^(\^(?:\.\^)*)\.(.*$)/.exec(r);o&&(i=o[1],r=o[2]),"!"===r.charAt(0)&&(r=r.substr(1),i="");/^(\^(?:\.\^)*)$/.exec(i)?i=i.split(".").reduce(function(e,t){return e.parent},e).name:"."===i&&(i=e.name);return{uiViewName:r,uiViewContextAnchor:i}},l.prototype._rootViewContext=function(e){return this._rootContext=e||this._rootContext},l.prototype._viewConfigFactory=function(e,t){this._viewConfigFactories[e]=t},l.prototype.createViewConfig=function(e,t){var n=this._viewConfigFactories[t.$type];if(!n)throw new Error("ViewService: No view config factory registered for type "+t.$type);var r=n(e,t);return E(r)?r:[r]},l.prototype.deactivateViewConfig=function(e){ut.traceViewServiceEvent("<- Removing",e),Q(this._viewConfigs,e)},l.prototype.activateViewConfig=function(e){ut.traceViewServiceEvent("-> Registering",e),this._viewConfigs.push(e)},l.prototype.sync=function(){var n=this,r=this._uiViews.map(function(e){return[e.fqn,e]}).reduce(ke,{});function i(e){for(var t=e.viewDecl.$context,n=0;++n&&t.parent;)t=t.parent;return n}var o=u(function(e,t,n,r){return t*(e(n)-e(r))}),e=this._uiViews.sort(o(function(e){var t=function(e){return e&&e.parent?t(e.parent)+1:1};return 1e4*e.fqn.split(".").length+t(e.creationContext)},1)).map(function(e){var t=n._viewConfigs.filter(l.matches(r,e));return 1 Registering",t);var e=this._uiViews;return e.filter(function(e){return e.fqn===t.fqn&&e.$type===t.$type}).length&&ut.traceViewServiceUIViewEvent("!!!! duplicate uiView named:",t),e.push(t),this.sync(),function(){-1!==e.indexOf(t)?(ut.traceViewServiceUIViewEvent("<- Deregistering",t),Q(e)(t)):ut.traceViewServiceUIViewEvent("Tried removing non-registered uiView",t)}},l.prototype.available=function(){return this._uiViews.map(w("fqn"))},l.prototype.active=function(){return this._uiViews.filter(w("$config")).map(w("name"))},l.matches=function(s,l){return function(e){if(l.$type!==e.viewDecl.$type)return!1;var t=e.viewDecl,n=t.$uiViewName.split("."),r=l.fqn.split(".");if(!q(n,r.slice(0-n.length)))return!1;var i=1-n.length||void 0,o=r.slice(0,i).join("."),a=s[o].creationContext;return t.$uiViewContextAnchor===(a&&a.name)}},l}(),fn=function(){function e(){this.params=new wt,this.lastStartedTransitionId=-1,this.transitionHistory=new Re([],1),this.successfulTransitions=new Re([],1)}return e.prototype.dispose=function(){this.transitionHistory.clear(),this.successfulTransitions.clear(),this.transition=null},e}(),gn=function(e){return e.reduce(function(e,t){return e[t]=I(t),e},{dispose:z})},mn=["url","path","search","hash","onChange"],vn=["port","protocol","host","baseHref","html5Mode","hashPrefix"],yn=["type","caseInsensitive","strictMode","defaultSquashPolicy"],wn=["sort","when","initial","otherwise","rules","rule","removeRule"],bn=["deferIntercept","listen","sync","match"],$n=function(){function e(e,t){void 0===t&&(t=!0),this.router=e,this.rules={},this.config={};var n=function(){return e.locationService};B(n,this,n,mn,t);var r=function(){return e.locationConfig};B(r,this.config,r,vn,t);var i=function(){return e.urlMatcherFactory};B(i,this.config,i,yn);var o=function(){return e.urlRouter};B(o,this.rules,o,wn),B(o,this,o,bn)}return e.prototype.url=function(e,t,n){},e.prototype.path=function(){},e.prototype.search=function(){},e.prototype.hash=function(){},e.prototype.onChange=function(e){},e.prototype.parts=function(){return{path:this.path(),search:this.search(),hash:this.hash()}},e.prototype.dispose=function(){},e.prototype.sync=function(e){},e.prototype.listen=function(e){},e.prototype.deferIntercept=function(e){},e.prototype.match=function(e){},e.locationServiceStub=gn(mn),e.locationConfigStub=gn(vn),e}(),_n=0,Cn=function(){function e(e,t){void 0===e&&(e=$n.locationServiceStub),void 0===t&&(t=$n.locationConfigStub),this.locationService=e,this.locationConfig=t,this.$id=_n++,this._disposed=!1,this._disposables=[],this.trace=ut,this.viewService=new hn(this),this.globals=new fn,this.transitionService=new zn(this),this.urlMatcherFactory=new sn,this.urlRouter=new dn(this),this.stateRegistry=new zt(this),this.stateService=new Bn(this),this.urlService=new $n(this),this._plugins={},this.viewService._pluginapi._rootViewContext(this.stateRegistry.root()),this.globals.$current=this.stateRegistry.root(),this.globals.current=this.globals.$current.self,this.disposable(this.globals),this.disposable(this.stateService),this.disposable(this.stateRegistry),this.disposable(this.transitionService),this.disposable(this.urlRouter),this.disposable(e),this.disposable(t)}return e.prototype.disposable=function(e){this._disposables.push(e)},e.prototype.dispose=function(e){var t=this;e&&D(e.dispose)?e.dispose(this):(this._disposed=!0,this._disposables.slice().forEach(function(e){try{"function"==typeof e.dispose&&e.dispose(t),Q(t._disposables,e)}catch(e){}}))},e.prototype.plugin=function(e,t){void 0===t&&(t={});var n=new e(this,t);if(!n.name)throw new Error("Required property `name` missing on plugin: "+n);return this._disposables.push(n),this._plugins[n.name]=n},e.prototype.getPlugin=function(e){return e?this._plugins[e]:de(this._plugins)},e}();function Sn(t){t.addResolvable(kt.fromData(Cn,t.router),""),t.addResolvable(kt.fromData(Jt,t),""),t.addResolvable(kt.fromData("$transition$",t),""),t.addResolvable(kt.fromData("$stateParams",t.params()),""),t.entering().forEach(function(e){t.addResolvable(kt.fromData("$state$",e),e)})}var kn=G(["$transition$",Jt]),Dn=function(e){var t=de(e.treeChanges()).reduce(fe,[]).reduce(ve,[]),n=function(e){return kn(e.token)?kt.fromData(e.token,null):e};t.forEach(function(e){e.resolvables=e.resolvables.map(n)})},xn=function(t){var e=t.to().redirectTo;if(e){var n=t.router.stateService;return D(e)?V.$q.when(e(t)).then(r):r(e)}function r(e){if(e)return e instanceof $t?e:O(e)?n.target(e,t.params(),t.options()):e.state||e.params?n.target(e.state||t.to(),e.params||t.params(),t.options()):void 0}};function On(n){return function(e,t){return(0,t.$$state()[n])(e,t)}}var Tn=On("onExit"),En=On("onRetain"),An=On("onEnter"),Pn=function(e){return new Et(e.treeChanges().to).resolvePath("EAGER",e).then(z)},Mn=function(e,t){return new Et(e.treeChanges().to).subContext(t.$$state()).resolvePath("LAZY",e).then(z)},Rn=function(e){return new Et(e.treeChanges().to).resolvePath("LAZY",e).then(z)},In=function(e){var t=V.$q,n=e.views("entering");if(n.length)return t.all(n.map(function(e){return t.when(e.load())})).then(z)},Vn=function(e){var t=e.views("entering"),n=e.views("exiting");if(t.length||n.length){var r=e.router.viewService;n.forEach(function(e){return r.deactivateViewConfig(e)}),t.forEach(function(e){return r.activateViewConfig(e)}),r.sync()}},Fn=function(e){var t=e.router.globals,n=function(){t.transition===e&&(t.transition=null)};e.onSuccess({},function(){t.successfulTransitions.enqueue(e),t.$current=e.$to(),t.current=t.$current.self,xe(e.params(),t.params)},{priority:1e4}),e.promise.then(n,n)},Ln=function(e){var t=e.options(),n=e.router.stateService,r=e.router.urlRouter;if("url"!==t.source&&t.location&&n.$current.navigable){var i={replace:"replace"===t.location};r.push(n.$current.navigable.url,n.params,i)}r.update(!0)},jn=function(a){var s=a.router;var e=a.entering().filter(function(e){return!!e.$$state().lazyLoad}).map(function(e){return Hn(a,e)});return V.$q.all(e).then(function(){if("url"!==a.originalTransition().options().source){var e=a.targetState();return s.stateService.target(e.identifier(),e.params(),e.options())}var t=s.urlService,n=t.match(t.parts()),r=n&&n.rule;if(r&&"STATE"===r.type){var i=r.state,o=n.match;return s.stateService.target(i,o,a.options())}s.urlService.sync()})};function Hn(t,n){var r=n.$$state().lazyLoad,e=r._promise;if(!e){e=r._promise=V.$q.when(r(t,n)).then(function(e){e&&Array.isArray(e.states)&&e.states.forEach(function(e){return t.router.stateRegistry.register(e)});return e}).then(function(e){return delete n.lazyLoad,delete n.$$state().lazyLoad,delete r._promise,e},function(e){return delete r._promise,V.$q.reject(e)})}return e}var Yn=function(e,t,n,r,i,o,a,s){void 0===i&&(i=!1),void 0===o&&(o=Wt.HANDLE_RESULT),void 0===a&&(a=Wt.REJECT_ERROR),void 0===s&&(s=!1),this.name=e,this.hookPhase=t,this.hookOrder=n,this.criteriaMatchPath=r,this.reverseSort=i,this.getResultHandler=o,this.getErrorHandler=a,this.synchronous=s};function Nn(e){var t=e._ignoredReason();if(t){ut.traceTransitionIgnored(e);var n=e.router.globals.transition;return"SameAsCurrent"===t&&n&&n.abort(),Ve.ignored().toPromise()}}function qn(e){if(!e.valid())throw new Error(e.error().toString())}var Un={location:!0,relative:null,inherit:!1,notify:!0,reload:!1,custom:{},current:function(){return null},source:"unknown"},zn=function(){function e(e){this._transitionCount=0,this._eventTypes=[],this._registeredHooks={},this._criteriaPaths={},this._router=e,this.$view=e.viewService,this._deregisterHookFns={},this._pluginapi=B(f(this),{},f(this),["_definePathType","_defineEvent","_getPathTypes","_getEvents","getHooks"]),this._defineCorePaths(),this._defineCoreEvents(),this._registerCoreTransitionHooks(),e.globals.successfulTransitions.onEvict(Dn)}return e.prototype.onCreate=function(e,t,n){},e.prototype.onBefore=function(e,t,n){},e.prototype.onStart=function(e,t,n){},e.prototype.onExit=function(e,t,n){},e.prototype.onRetain=function(e,t,n){},e.prototype.onEnter=function(e,t,n){},e.prototype.onFinish=function(e,t,n){},e.prototype.onSuccess=function(e,t,n){},e.prototype.onError=function(e,t,n){},e.prototype.dispose=function(e){de(this._registeredHooks).forEach(function(t){return t.forEach(function(e){e._deregistered=!0,Q(t,e)})})},e.prototype.create=function(e,t){return new Jt(e,t,this._router)},e.prototype._defineCoreEvents=function(){var e=g.TransitionHookPhase,t=Wt,n=this._criteriaPaths;this._defineEvent("onCreate",e.CREATE,0,n.to,!1,t.LOG_REJECTED_RESULT,t.THROW_ERROR,!0),this._defineEvent("onBefore",e.BEFORE,0,n.to),this._defineEvent("onStart",e.RUN,0,n.to),this._defineEvent("onExit",e.RUN,100,n.exiting,!0),this._defineEvent("onRetain",e.RUN,200,n.retained),this._defineEvent("onEnter",e.RUN,300,n.entering),this._defineEvent("onFinish",e.RUN,400,n.to),this._defineEvent("onSuccess",e.SUCCESS,0,n.to,!1,t.LOG_REJECTED_RESULT,t.LOG_ERROR,!0),this._defineEvent("onError",e.ERROR,0,n.to,!1,t.LOG_REJECTED_RESULT,t.LOG_ERROR,!0)},e.prototype._defineCorePaths=function(){var e=g.TransitionHookScope.STATE,t=g.TransitionHookScope.TRANSITION;this._definePathType("to",t),this._definePathType("from",t),this._definePathType("exiting",e),this._definePathType("retained",e),this._definePathType("entering",e)},e.prototype._defineEvent=function(e,t,n,r,i,o,a,s){void 0===i&&(i=!1),void 0===o&&(o=Wt.HANDLE_RESULT),void 0===a&&(a=Wt.REJECT_ERROR),void 0===s&&(s=!1);var l=new Yn(e,t,n,r,i,o,a,s);this._eventTypes.push(l),Qt(this,this,l)},e.prototype._getEvents=function(t){return(k(t)?this._eventTypes.filter(function(e){return e.hookPhase===t}):this._eventTypes.slice()).sort(function(e,t){var n=e.hookPhase-t.hookPhase;return 0===n?e.hookOrder-t.hookOrder:n})},e.prototype._definePathType=function(e,t){this._criteriaPaths[e]={name:e,scope:t}},e.prototype._getPathTypes=function(){return this._criteriaPaths},e.prototype.getHooks=function(e){return this._registeredHooks[e]},e.prototype._registerCoreTransitionHooks=function(){var e=this._deregisterHookFns;e.addCoreResolves=this.onCreate({},Sn),e.ignored=this.onBefore({},Nn,{priority:-9999}),e.invalid=this.onBefore({},qn,{priority:-1e4}),e.redirectTo=this.onStart({to:function(e){return!!e.redirectTo}},xn),e.onExit=this.onExit({exiting:function(e){return!!e.onExit}},Tn),e.onRetain=this.onRetain({retained:function(e){return!!e.onRetain}},En),e.onEnter=this.onEnter({entering:function(e){return!!e.onEnter}},An),e.eagerResolve=this.onStart({},Pn,{priority:1e3}),e.lazyResolve=this.onEnter({entering:f(!0)},Mn,{priority:1e3}),e.resolveAll=this.onFinish({},Rn,{priority:1e3}),e.loadViews=this.onFinish({},In),e.activateViews=this.onSuccess({},Vn),e.updateGlobals=this.onCreate({},Fn),e.updateUrl=this.onSuccess({},Ln,{priority:9999}),e.lazyLoad=this.onBefore({entering:function(e){return!!e.lazyLoad}},jn)},e}(),Bn=function(){function n(e){this.router=e,this.invalidCallbacks=[],this._defaultErrorHandler=function(e){e instanceof Error&&e.stack?(console.error(e),console.error(e.stack)):e instanceof Ve?(console.error(e.toString()),e.detail&&e.detail.stack&&console.error(e.detail.stack)):console.error(e)};var t=Object.keys(n.prototype).filter(d(G(["current","$current","params","transition"])));B(f(n.prototype),this,f(this),t)}return Object.defineProperty(n.prototype,"transition",{get:function(){return this.router.globals.transition},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"params",{get:function(){return this.router.globals.params},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"current",{get:function(){return this.router.globals.current},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"$current",{get:function(){return this.router.globals.$current},enumerable:!0,configurable:!0}),n.prototype.dispose=function(){this.defaultErrorHandler(z),this.invalidCallbacks=[]},n.prototype._handleInvalidTargetState=function(e,n){var r=this,i=_t.makeTargetState(this.router.stateRegistry,e),t=this.router.globals,o=function(){return t.transitionHistory.peekTail()},a=o(),s=new Re(this.invalidCallbacks.slice()),l=new Et(e).injector(),u=function(e){if(e instanceof $t){var t=e;return(t=r.target(t.identifier(),t.params(),t.options())).valid()?o()!==a?Ve.superseded().toPromise():r.transitionTo(t.identifier(),t.params(),t.options()):Ve.invalid(t.error()).toPromise()}};return function t(){var e=s.dequeue();return void 0===e?Ve.invalid(n.error()).toPromise():V.$q.when(e(n,i,l)).then(u).then(function(e){return e||t()})}()},n.prototype.onInvalid=function(e){return this.invalidCallbacks.push(e),function(){Q(this.invalidCallbacks)(e)}.bind(this)},n.prototype.reload=function(e){return this.transitionTo(this.current,this.params,{reload:!k(e)||e,inherit:!1,notify:!1})},n.prototype.go=function(e,t,n){var r=te(n,{relative:this.$current,inherit:!0},Un);return this.transitionTo(e,t,r)},n.prototype.target=function(e,t,n){if(void 0===n&&(n={}),T(n.reload)&&!n.reload.name)throw new Error("Invalid reload state object");var r=this.router.stateRegistry;if(n.reloadState=!0===n.reload?r.root():r.matcher.find(n.reload,n.relative),n.reload&&!n.reloadState)throw new Error("No such reload state '"+(O(n.reload)?n.reload:n.reload.name)+"'");return new $t(this.router.stateRegistry,e,t,n)},n.prototype.getCurrentPath=function(){var e=this,t=this.router.globals.successfulTransitions.peekTail();return t?t.treeChanges().to:[new bt(e.router.stateRegistry.root())]},n.prototype.transitionTo=function(e,t,n){var o=this;void 0===t&&(t={}),void 0===n&&(n={});var a=this.router,s=a.globals;n=te(n,Un);n=N(n,{current:function(){return s.transition}});var r=this.target(e,t,n),i=this.getCurrentPath();if(!r.exists())return this._handleInvalidTargetState(i,r);if(!r.valid())return Pe(r.error());var l=function(i){return function(e){if(e instanceof Ve){var t=a.globals.lastStartedTransitionId===i.$id;if(e.type===g.RejectType.IGNORED)return t&&a.urlRouter.update(),V.$q.when(s.current);var n=e.detail;if(e.type===g.RejectType.SUPERSEDED&&e.redirected&&n instanceof $t){var r=i.redirect(n);return r.run().catch(l(r))}if(e.type===g.RejectType.ABORTED)return t&&a.urlRouter.update(),V.$q.reject(e)}return o.defaultErrorHandler()(e),V.$q.reject(e)}},u=this.router.transitionService.create(i,r),c=u.run().catch(l(u));return Ae(c),N(c,{transition:u})},n.prototype.is=function(e,t,n){n=te(n,{relative:this.$current});var r=this.router.stateRegistry.matcher.find(e,n.relative);if(k(r)){if(this.$current!==r)return!1;if(!t)return!0;var i=r.parameters({inherit:!0,matchingKeys:t});return vt.equals(i,vt.values(i,t),this.params)}},n.prototype.includes=function(e,t,n){n=te(n,{relative:this.$current});var r=O(e)&&Me.fromString(e);if(r){if(!r.matches(this.$current.name))return!1;e=this.$current.name}var i=this.router.stateRegistry.matcher.find(e,n.relative),o=this.$current.includes;if(k(i)){if(!k(o[i.name]))return!1;if(!t)return!0;var a=i.parameters({inherit:!0,matchingKeys:t});return vt.equals(a,vt.values(a,t),this.params)}},n.prototype.href=function(e,t,n){n=te(n,{lossy:!0,inherit:!0,absolute:!1,relative:this.$current}),t=t||{};var r=this.router.stateRegistry.matcher.find(e,n.relative);if(!k(r))return null;n.inherit&&(t=this.params.$inherit(t,this.$current,r));var i=r&&n.lossy?r.navigable:r;return i&&void 0!==i.url&&null!==i.url?this.router.urlRouter.href(i.url,t,{absolute:n.absolute}):null},n.prototype.defaultErrorHandler=function(e){return this._defaultErrorHandler=e||this._defaultErrorHandler},n.prototype.get=function(e,t){var n=this.router.stateRegistry;return 0===arguments.length?n.get():n.get(e,t||this.$current)},n.prototype.lazyLoad=function(e,t){var n=this.get(e);if(!n||!n.lazyLoad)throw new Error("Can not lazy load "+e);var r=this.getCurrentPath(),i=_t.makeTargetState(this.router.stateRegistry,r);return Hn(t=t||this.router.transitionService.create(r,i),n)},n}(),Wn={when:function(n){return new Promise(function(e,t){return e(n)})},reject:function(n){return new Promise(function(e,t){t(n)})},defer:function(){var n={};return n.promise=new Promise(function(e,t){n.resolve=e,n.reject=t}),n},all:function(e){if(E(e))return Promise.all(e);if(T(e)){var t=Object.keys(e).map(function(t){return e[t].then(function(e){return{key:t,val:e}})});return Wn.all(t).then(function(e){return e.reduce(function(e,t){return e[t.key]=t.val,e},{})})}}},Gn={},Kn=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Qn=/([^\s,]+)/g,Zn={get:function(e){return Gn[e]},has:function(e){return null!=Zn.get(e)},invoke:function(e,t,n){var r=N({},Gn,n||{}),i=Zn.annotate(e),o=be(function(e){return r.hasOwnProperty(e)},function(e){return"DI can't find injectable: '"+e+"'"}),a=i.filter(o).map(function(e){return r[e]});return D(e)?e.apply(t,a):e.slice(-1)[0].apply(t,a)},annotate:function(e){if(!M(e))throw new Error("Not an injectable function: "+e);if(e&&e.$inject)return e.$inject;if(E(e))return e.slice(0,-1);var t=e.toString().replace(Kn,"");return t.slice(t.indexOf("(")+1,t.indexOf(")")).match(Qn)||[]}},Xn=function(e,t){var n=t[0],r=t[1];return e.hasOwnProperty(n)?E(e[n])?e[n].push(r):e[n]=[e[n],r]:e[n]=r,e},Jn=function(e){return e.split("&").filter(U).map(Qe).reduce(Xn,{})};function er(e){var t=function(e){return e||""},n=Ge(e).map(t),r=n[0],i=n[1],o=Ke(r).map(t);return{path:o[0],search:o[1],hash:i,url:e}}var tr=function(e){var t=e.path(),n=e.search(),r=e.hash(),i=Object.keys(n).map(function(t){var e=n[t];return(E(e)?e:[e]).map(function(e){return t+"="+e})}).reduce(fe,[]).join("&");return t+(i?"?"+i:"")+(r?"#"+r:"")};function nr(r,i,o,a){return function(e){var t=e.locationService=new o(e),n=e.locationConfig=new a(e,i);return{name:r,service:t,configuration:n,dispose:function(e){e.dispose(t),e.dispose(n)}}}}var rr,ir,or,ar=function(){function e(e,t){var n=this;this.fireAfterUpdate=t,this._listeners=[],this._listener=function(t){return n._listeners.forEach(function(e){return e(t)})},this.hash=function(){return er(n._get()).hash},this.path=function(){return er(n._get()).path},this.search=function(){return Jn(er(n._get()).search)},this._location=F.location,this._history=F.history}return e.prototype.url=function(t,e){return void 0===e&&(e=!0),k(t)&&t!==this._get()&&(this._set(null,null,t,e),this.fireAfterUpdate&&this._listeners.forEach(function(e){return e({url:t})})),tr(this)},e.prototype.onChange=function(e){var t=this;return this._listeners.push(e),function(){return Q(t._listeners,e)}},e.prototype.dispose=function(e){ee(this._listeners)},e}(),sr=(rr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}rr(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),lr=function(n){function e(e){var t=n.call(this,e,!1)||this;return F.addEventListener("hashchange",t._listener,!1),t}return sr(e,n),e.prototype._get=function(){return Ze(this._location.hash)},e.prototype._set=function(e,t,n,r){this._location.hash=n},e.prototype.dispose=function(e){n.prototype.dispose.call(this,e),F.removeEventListener("hashchange",this._listener)},e}(ar),ur=(ir=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}ir(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),cr=function(t){function e(e){return t.call(this,e,!0)||this}return ur(e,t),e.prototype._get=function(){return this._url},e.prototype._set=function(e,t,n,r){this._url=n},e}(ar),dr=(or=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},function(e,t){function n(){this.constructor=e}or(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),pr=function(n){function e(e){var t=n.call(this,e,!0)||this;return t._config=e.urlService.config,F.addEventListener("popstate",t._listener,!1),t}return dr(e,n),e.prototype._getBasePrefix=function(){return We(this._config.baseHref())},e.prototype._get=function(){var e=this._location,t=e.pathname,n=e.hash,r=e.search;r=Ke(r)[1],n=Ge(n)[1];var i=this._getBasePrefix(),o=t===this._config.baseHref(),a=t.substr(0,i.length)===i;return(t=o?"/":a?t.substring(i.length):t)+(r?"?"+r:"")+(n?"#"+n:"")},e.prototype._set=function(e,t,n,r){var i=this._getBasePrefix(),o=n&&"/"!==n[0]?"/":"",a=""===n||"/"===n?this._config.baseHref():i+o+n;r?this._history.replaceState(e,t,a):this._history.pushState(e,t,a)},e.prototype.dispose=function(e){n.prototype.dispose.call(this,e),F.removeEventListener("popstate",this._listener)},e}(ar),hr=function(){var t=this;this.dispose=z,this._baseHref="",this._port=80,this._protocol="http",this._host="localhost",this._hashPrefix="",this.port=function(){return t._port},this.protocol=function(){return t._protocol},this.host=function(){return t._host},this.baseHref=function(){return t._baseHref},this.html5Mode=function(){return!1},this.hashPrefix=function(e){return k(e)?t._hashPrefix=e:t._hashPrefix}},fr=function(){function e(e,t){void 0===t&&(t=!1),this._isHtml5=t,this._baseHref=void 0,this._hashPrefix=""}return e.prototype.port=function(){return location.port?Number(location.port):"https"===this.protocol()?443:80},e.prototype.protocol=function(){return location.protocol.replace(/:/g,"")},e.prototype.host=function(){return location.hostname},e.prototype.html5Mode=function(){return this._isHtml5},e.prototype.hashPrefix=function(e){return k(e)?this._hashPrefix=e:this._hashPrefix},e.prototype.baseHref=function(e){return k(e)&&(this._baseHref=e),b(this._baseHref)&&(this._baseHref=this.getBaseHref()),this._baseHref},e.prototype.getBaseHref=function(){var e=document.getElementsByTagName("base")[0];return e&&e.href?e.href.replace(/^(https?:)?\/\/[^/]*/,""):location.pathname||"/"},e.prototype.dispose=function(){},e}();function gr(e){return V.$injector=Zn,{name:"vanilla.services",$q:V.$q=Wn,$injector:Zn,dispose:function(){return null}}}var mr=nr("vanilla.hashBangLocation",!1,lr,fr),vr=nr("vanilla.pushStateLocation",!0,pr,fr),yr=nr("vanilla.memoryLocation",!1,cr,hr),wr=function(){function e(){}return e.prototype.dispose=function(e){},e}(),br=Object.freeze({root:F,fromJson:j,toJson:H,forEach:Y,extend:N,equals:q,identity:U,noop:z,createProxyFunctions:B,inherit:W,inArray:G,_inArray:K,removeFrom:Q,_removeFrom:Z,pushTo:X,_pushTo:J,deregAll:ee,defaults:te,mergeR:ne,ancestors:re,pick:ie,omit:oe,pluck:ae,filter:se,find:le,mapObj:ue,map:ce,values:de,allTrueR:pe,anyTrueR:he,unnestR:fe,flattenR:ge,pushR:me,uniqR:ve,unnest:ye,flatten:we,assertPredicate:be,assertMap:$e,assertFn:_e,pairs:Ce,arrayTuples:Se,applyPairs:ke,tail:De,copy:xe,_extend:Oe,silenceUncaughtInPromise:Ae,silentRejection:Pe,notImplemented:I,services:V,Glob:Me,curry:u,compose:n,pipe:l,prop:w,propEq:v,parse:S,not:d,and:r,or:i,all:c,any:p,is:h,eq:o,val:f,invoke:a,pattern:m,isUndefined:b,isDefined:k,isNull:$,isNullOrUndefined:_,isFunction:D,isNumber:x,isString:O,isObject:T,isArray:E,isDate:A,isRegExp:P,isInjectable:M,isPromise:R,Queue:Re,maxLength:Fe,padString:Le,kebobString:je,functionToString:He,fnToString:Ye,stringify:Ue,beforeAfterSubstr:ze,hostRegex:Be,stripLastPathElement:We,splitHash:Ge,splitQuery:Ke,splitEqual:Qe,trimHashVal:Ze,splitOnDelim:Xe,joinNeighborsR:Je,get Category(){return g.Category},Trace:lt,trace:ut,get DefType(){return g.DefType},Param:vt,ParamTypes:yt,StateParams:wt,ParamType:ct,PathNode:bt,PathUtils:_t,resolvePolicies:Ct,defaultResolvePolicy:St,Resolvable:kt,NATIVE_INJECTOR_TOKEN:Tt,ResolveContext:Et,resolvablesBuilder:Lt,StateBuilder:Yt,StateObject:Nt,StateMatcher:qt,StateQueueManager:Ut,StateRegistry:zt,StateService:Bn,TargetState:$t,get TransitionHookPhase(){return g.TransitionHookPhase},get TransitionHookScope(){return g.TransitionHookScope},HookBuilder:Zt,matchState:Gt,RegisteredHook:Kt,makeEvent:Qt,get RejectType(){return g.RejectType},Rejection:Ve,Transition:Jt,TransitionHook:Wt,TransitionEventType:Yn,defaultTransOpts:Un,TransitionService:zn,UrlMatcher:rn,ParamFactory:an,UrlMatcherFactory:sn,UrlRouter:dn,UrlRuleFactory:ln,BaseUrlRule:un,UrlService:$n,ViewService:hn,UIRouterGlobals:fn,UIRouter:Cn,$q:Wn,$injector:Zn,BaseLocationServices:ar,HashLocationService:lr,MemoryLocationService:cr,PushStateLocationService:pr,MemoryLocationConfig:hr,BrowserLocationConfig:fr,keyValsToObjectR:Xn,getParams:Jn,parseUrl:er,buildUrl:tr,locationPluginFactory:nr,servicesPlugin:gr,hashLocationPlugin:mr,pushStateLocationPlugin:vr,memoryLocationPlugin:yr,UIRouterPluginBase:wr});function $r(){var n=null;return function(e,t){return n=n||V.$injector.get("$templateFactory"),[new kr(e,t,n)]}}var _r=function(e,n){return e.reduce(function(e,t){return e||k(n[t])},!1)};function Cr(r){if(!r.parent)return{};var i=["component","bindings","componentProvider"],o=["templateProvider","templateUrl","template","notify","async"].concat(["controller","controllerProvider","controllerAs","resolveAs"]),e=i.concat(o);if(k(r.views)&&_r(e,r))throw new Error("State '"+r.name+"' has a 'views' object. It cannot also have \"view properties\" at the state level. Move the following properties into a view (in the 'views' object): "+e.filter(function(e){return k(r[e])}).join(", "));var a={},t=r.views||{$default:ie(r,e)};return Y(t,function(e,t){if(t=t||"$default",O(e)&&(e={component:e}),e=N({},e),_r(i,e)&&_r(o,e))throw new Error("Cannot combine: "+i.join("|")+" with: "+o.join("|")+" in stateview: '"+t+"@"+r.name+"'");e.resolveAs=e.resolveAs||"$resolve",e.$type="ng1",e.$context=r,e.$name=t;var n=hn.normalizeUIViewTarget(e.$context,e.$name);e.$uiViewName=n.uiViewName,e.$uiViewContextAnchor=n.uiViewContextAnchor,a[t]=e}),a}var Sr=0,kr=function(){function e(e,t,n){var r=this;this.path=e,this.viewDecl=t,this.factory=n,this.$id=Sr++,this.loaded=!1,this.getTemplate=function(e,t){return r.component?r.factory.makeComponentTemplate(e,t,r.component,r.viewDecl.bindings):r.template}}return e.prototype.load=function(){var t=this,e=V.$q,n=new Et(this.path),r=this.path.reduce(function(e,t){return N(e,t.paramValues)},{}),i={template:e.when(this.factory.fromConfig(this.viewDecl,r,n)),controller:e.when(this.getController(n))};return e.all(i).then(function(e){return ut.traceViewServiceEvent("Loaded",t),t.controller=e.controller,N(t,e.template),t})},e.prototype.getController=function(e){var t=this.viewDecl.controllerProvider;if(!M(t))return this.viewDecl.controller;var n=V.$injector.annotate(t),r=E(t)?De(t):t;return new kt("",r,n).get(e)},e}(),Dr=function(){function e(){var r=this;this._useHttp=C.version.minor<3,this.$get=["$http","$templateCache","$injector",function(e,t,n){return r.$templateRequest=n.has&&n.has("$templateRequest")&&n.get("$templateRequest"),r.$http=e,r.$templateCache=t,r}]}return e.prototype.useHttpService=function(e){this._useHttp=e},e.prototype.fromConfig=function(e,t,n){var r=function(e){return V.$q.when(e).then(function(e){return{template:e}})},i=function(e){return V.$q.when(e).then(function(e){return{component:e}})};return k(e.template)?r(this.fromString(e.template,t)):k(e.templateUrl)?r(this.fromUrl(e.templateUrl,t)):k(e.templateProvider)?r(this.fromProvider(e.templateProvider,t,n)):k(e.component)?i(e.component):k(e.componentProvider)?i(this.fromComponentProvider(e.componentProvider,t,n)):r("")},e.prototype.fromString=function(e,t){return D(e)?e(t):e},e.prototype.fromUrl=function(e,t){return D(e)&&(e=e(t)),null==e?null:this._useHttp?this.$http.get(e,{cache:this.$templateCache,headers:{Accept:"text/html"}}).then(function(e){return e.data}):this.$templateRequest(e)},e.prototype.fromProvider=function(e,t,n){var r=V.$injector.annotate(e),i=E(e)?De(e):e;return new kt("",i,r).get(n)},e.prototype.fromComponentProvider=function(e,t,n){var r=V.$injector.annotate(e),i=E(e)?De(e):e;return new kt("",i,r).get(n)},e.prototype.makeComponentTemplate=function(l,u,e,c){c=c||{};var d=3<=C.version.minor?"::":"",p=function(e){var t=je(e);return/^(x|data)-/.exec(t)?"x-"+t:t},t=function(e){var t=V.$injector.get(e+"Directive");if(!t||!t.length)throw new Error("Unable to find component named '"+e+"'");return t.map(xr).reduce(fe,[])}(e).map(function(e){var t=e.name,n=e.type,r=p(t);if(l.attr(r)&&!c[t])return r+"='"+l.attr(r)+"'";var i=c[t]||t;if("@"===n)return r+"='{{"+d+"$resolve."+i+"}}'";if("&"!==n)return r+"='"+d+"$resolve."+i+"'";var o=u.getResolvable(i),a=o&&o.data,s=a&&V.$injector.annotate(a)||[];return r+"='$resolve."+i+(E(a)?"["+(a.length-1)+"]":"")+"("+s.join(",")+")'"}).join(" "),n=p(e);return"<"+n+" "+t+">"},e}();var xr=function(e){return T(e.bindToController)?Or(e.bindToController):Or(e.scope)},Or=function(t){return Object.keys(t||{}).map(function(e){return[e,/^([=<@&])[?]?(.*)/.exec(t[e])]}).filter(function(e){return k(e)&&E(e[1])}).map(function(e){return{name:e[1][2]||e[0],type:e[1][1]}})},Tr=function(){function n(e,t){this.stateRegistry=e,this.stateService=t,B(f(n.prototype),this,f(this))}return n.prototype.decorator=function(e,t){return this.stateRegistry.decorator(e,t)||this},n.prototype.state=function(e,t){return T(e)?t=e:t.name=e,this.stateRegistry.register(t),this},n.prototype.onInvalid=function(e){return this.stateService.onInvalid(e)},n}(),Er=function(n){return function(e,t){var i=e[n],o="onExit"===n?"from":"to";return i?function(e,t){var n=new Et(e.treeChanges(o)).subContext(t.$$state()),r=N(Wr(n),{$state$:t,$transition$:e});return V.$injector.invoke(i,this,r)}:void 0}},Ar=function(){function e(e){this._urlListeners=[],this.$locationProvider=e;var t=f(e);B(t,this,t,["hashPrefix"])}return e.monkeyPatchPathParameterType=function(e){var t=e.urlMatcherFactory.type("path");t.encode=function(e){return null!=e?e.toString().replace(/(~|\/)/g,function(e){return{"~":"~~","/":"~2F"}[e]}):e},t.decode=function(e){return null!=e?e.toString().replace(/(~~|~2F)/g,function(e){return{"~~":"~","~2F":"/"}[e]}):e}},e.prototype.dispose=function(){},e.prototype.onChange=function(e){var t=this;return this._urlListeners.push(e),function(){return Q(t._urlListeners)(e)}},e.prototype.html5Mode=function(){var e=this.$locationProvider.html5Mode();return(e=T(e)?e.enabled:e)&&this.$sniffer.history},e.prototype.baseHref=function(){return this._baseHref||(this._baseHref=this.$browser.baseHref()||this.$window.location.pathname)},e.prototype.url=function(e,t,n){return void 0===t&&(t=!1),k(e)&&this.$location.url(e),t&&this.$location.replace(),n&&this.$location.state(n),this.$location.url()},e.prototype._runtimeServices=function(e,t,n,r,i){var o=this;this.$location=t,this.$sniffer=n,this.$browser=r,this.$window=i,e.$on("$locationChangeSuccess",function(t){return o._urlListeners.forEach(function(e){return e(t)})});var a=f(t);B(a,this,a,["replace","path","search","hash"]),B(a,this,a,["port","protocol","host"])},e}(),Pr=function(){function n(e){this._router=e,this._urlRouter=e.urlRouter}return n.injectableHandler=function(t,n){return function(e){return V.$injector.invoke(n,null,{$match:e,$stateParams:t.globals.params})}},n.prototype.$get=function(){var e=this._urlRouter;return e.update(!0),e.interceptDeferred||e.listen(),e},n.prototype.rule=function(e){var t=this;if(!D(e))throw new Error("'rule' must be a function");var n=new un(function(){return e(V.$injector,t._router.locationService)},U);return this._urlRouter.rule(n),this},n.prototype.otherwise=function(e){var t=this,n=this._urlRouter;if(O(e))n.otherwise(e);else{if(!D(e))throw new Error("'rule' must be a string or function");n.otherwise(function(){return e(V.$injector,t._router.locationService)})}return this},n.prototype.when=function(e,t){return(E(t)||D(t))&&(t=n.injectableHandler(this._router,t)),this._urlRouter.when(e,t),this},n.prototype.deferIntercept=function(e){this._urlRouter.deferIntercept(e)},n}();C.module("ui.router.angular1",[]);var Mr=C.module("ui.router.init",["ng"]),Rr=C.module("ui.router.util",["ui.router.init"]),Ir=C.module("ui.router.router",["ui.router.util"]),Vr=C.module("ui.router.state",["ui.router.router","ui.router.util","ui.router.angular1"]),Fr=C.module("ui.router",["ui.router.init","ui.router.state","ui.router.angular1"]),Lr=(C.module("ui.router.compat",["ui.router"]),null);function jr(e){(Lr=this.router=new Cn).stateProvider=new Tr(Lr.stateRegistry,Lr.stateService),Lr.stateRegistry.decorator("views",Cr),Lr.stateRegistry.decorator("onExit",Er("onExit")),Lr.stateRegistry.decorator("onRetain",Er("onRetain")),Lr.stateRegistry.decorator("onEnter",Er("onEnter")),Lr.viewService._pluginapi._viewConfigFactory("ng1",$r());var s=Lr.locationService=Lr.locationConfig=new Ar(e);function t(e,t,n,r,i,o,a){return s._runtimeServices(i,e,r,t,n),delete Lr.router,delete Lr.$get,Lr}return Ar.monkeyPatchPathParameterType(Lr),((Lr.router=Lr).$get=t).$inject=["$location","$browser","$window","$sniffer","$rootScope","$http","$templateCache"],Lr}jr.$inject=["$locationProvider"];var Hr=function(n){return["$uiRouterProvider",function(e){var t=e.router[n];return t.$get=function(){return t},t}]};function Yr(t,e,n){if(V.$injector=t,V.$q=e,!t.hasOwnProperty("strictDi"))try{t.invoke(function(e){})}catch(e){t.strictDi=!!/strict mode/.exec(e&&e.toString())}n.stateRegistry.get().map(function(e){return e.$$state().resolvables}).reduce(fe,[]).filter(function(e){return"deferred"===e.deps}).forEach(function(e){return e.deps=t.annotate(e.resolveFn,t.strictDi)})}Yr.$inject=["$injector","$q","$uiRouter"];function Nr(e){e.$watch(function(){ut.approximateDigests++})}Nr.$inject=["$rootScope"],Mr.provider("$uiRouter",jr),Ir.provider("$urlRouter",["$uiRouterProvider",function(e){return e.urlRouterProvider=new Pr(e)}]),Rr.provider("$urlService",Hr("urlService")),Rr.provider("$urlMatcherFactory",["$uiRouterProvider",function(){return Lr.urlMatcherFactory}]),Rr.provider("$templateFactory",function(){return new Dr}),Vr.provider("$stateRegistry",Hr("stateRegistry")),Vr.provider("$uiRouterGlobals",Hr("globals")),Vr.provider("$transitions",Hr("transitionService")),Vr.provider("$state",["$uiRouterProvider",function(){return N(Lr.stateProvider,{$get:function(){return Lr.stateService}})}]),Vr.factory("$stateParams",["$uiRouter",function(e){return e.globals.params}]),Fr.factory("$view",function(){return Lr.viewService}),Fr.service("$trace",function(){return ut}),Fr.run(Nr),Rr.run(["$urlMatcherFactory",function(e){}]),Vr.run(["$state",function(e){}]),Ir.run(["$urlRouter",function(e){}]),Mr.run(Yr);var qr,Ur,zr,Br,Wr=function(n){return n.getTokens().filter(O).map(function(e){var t=n.getResolvable(e);return[e,"NOWAIT"===n.getPolicy(t).async?t.promise:t.data]}).reduce(ke,{})};function Gr(e){var t,n=e.match(/^\s*({[^}]*})\s*$/);if(n&&(e="("+n[1]+")"),!(t=e.replace(/\n/g," ").match(/^\s*([^(]*?)\s*(\((.*)\))?\s*$/))||4!==t.length)throw new Error("Invalid state ref '"+e+"'");return{state:t[1]||null,paramExpr:t[3]||null}}function Kr(e){var t=e.parent().inheritedData("$uiView"),n=S("$cfg.path")(t);return n?De(n).state.name:void 0}function Qr(e,t,n){var r,i=n.uiState||e.current.name,o=N((r=e,{relative:Kr(t)||r.$current,inherit:!0,source:"sref"}),n.uiStateOpts||{}),a=e.href(i,n.uiStateParams,o);return{uiState:i,uiStateParams:n.uiStateParams,uiStateOpts:o,href:a}}function Zr(e){var t="[object SVGAnimatedString]"===Object.prototype.toString.call(e.prop("href")),n="FORM"===e[0].nodeName;return{attr:n?"action":t?"xlink:href":"href",isAnchor:"A"===e.prop("tagName").toUpperCase(),clickable:!n}}function Xr(o,a,s,l,u){return function(e){var t=e.which||e.button,n=u();if(!(1>>0;if(0===i)return-1;var o=+t||0;if(Math.abs(o)===1/0&&(o=0),i<=o)return-1;for(n=Math.max(0<=o?o:i-Math.abs(o),0);n

    ',this.loadingBarTemplate='
    ',this.$get=["$injector","$document","$timeout","$rootScope",function(i,o,a,s){function l(e){if(m){var t=100*e+"%";f.css("width",t),v=e,y&&(a.cancel(c),c=a(function(){n()},250))}}function n(){if(!(1<=r())){var e,t=r();e=0<=t&&t<.25?(3*Math.random()+3)/100:.25<=t&&t<.65?3*Math.random()/100:.65<=t&&t<.9?2*Math.random()/100:.9<=t&&t<.99?.005:0,l(r()+e)}}function r(){return v}function t(){v=0,m=!1}var u,c,d,p=this.parentSelector,h=angular.element(this.loadingBarTemplate),f=h.find("div").eq(0),g=angular.element(this.spinnerTemplate),m=!1,v=0,y=this.autoIncrement,w=this.includeSpinner,b=this.includeBar,$=this.startSize;return{start:function(){if(u||(u=i.get("$animate")),a.cancel(d),!m){var e=o[0],t=e.querySelector?e.querySelector(p):o.find(p)[0];t||(t=e.getElementsByTagName("body")[0]);var n=angular.element(t),r=t.lastChild&&angular.element(t.lastChild);s.$broadcast("cfpLoadingBar:started"),m=!0,b&&u.enter(h,n,r),w&&u.enter(g,n,h),l($)}},set:l,status:r,inc:n,complete:function(){u||(u=i.get("$animate")),s.$broadcast("cfpLoadingBar:completed"),l(1),a.cancel(d),d=a(function(){var e=u.leave(h,t);e&&e.then&&e.then(t),u.leave(g)},500)},autoIncrement:this.autoIncrement,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}(),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,s,l){function e(e){for(var t in e)if(void 0!==n.style[t])return e[t]}var u=function(e,t,n){n=n||{};var r=a.defer(),i=u[n.animation?"animationEndEventName":"transitionEndEventName"],o=function(){l.$apply(function(){e.unbind(i,o),r.resolve(e)})};return i&&e.bind(i,o),s(function(){angular.isString(t)?e.addClass(t):angular.isFunction(t)?t(e):angular.isObject(t)&&e.css(t),i||r.resolve(e)}),r.promise.cancel=function(){i&&e.unbind(i,o),r.reject("Transition cancelled")},r.promise},n=document.createElement("trans");return u.transitionEndEventName=e({WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}),u.animationEndEventName=e({WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"}),u}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(l){return{link:function(e,r,t){function n(e){function t(){a===n&&(a=void 0)}var n=l(r,e);return a&&a.cancel(),(a=n).then(t,t),n}function i(){r.removeClass("collapsing"),r.addClass("collapse in"),r.css({height:"auto"})}function o(){r.removeClass("collapsing"),r.addClass("collapse")}var a,s=!0;e.$watch(t.collapse,function(e){e?s?(s=!1,o(),r.css({height:0})):(r.css({height:r[0].scrollHeight+"px"}),r[0].offsetWidth,r.removeClass("collapse in").addClass("collapsing"),n({height:0}).then(o)):s?(s=!1,i()):(r.removeClass("collapse").addClass("collapsing"),n({height:r[0].scrollHeight+"px"}).then(i))})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(e,n,r){this.groups=[],this.closeOthers=function(t){(angular.isDefined(n.closeOthers)?e.$eval(n.closeOthers):r.closeOthers)&&angular.forEach(this.groups,function(e){e!==t&&(e.isOpen=!1)})},this.addGroup=function(e){var t=this;this.groups.push(e),e.$on("$destroy",function(){t.removeGroup(e)})},this.removeGroup=function(e){var t=this.groups.indexOf(e);-1!==t&&this.groups.splice(t,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(e){this.heading=e}},link:function(t,e,n,r){r.addGroup(t),t.$watch("isOpen",function(e){e&&r.closeOthers(t)}),t.toggleOpen=function(){t.isDisabled||(t.isOpen=!t.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(e,t,n,r,i){r.setHeading(i(e,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(e,t,n,r){e.$watch(function(){return r[n.accordionTransclude]},function(e){e&&(t.html(""),t.append(e))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(e,t){e.closeable="close"in t,this.close=e.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(i){return{require:"alert",link:function(e,t,n,r){i(function(){r.close()},parseInt(n.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(e,t,n){t.addClass("ng-binding").data("$binding",n.bindHtmlUnsafe),e.$watch(n.bindHtmlUnsafe,function(e){t.html(e||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(e){this.activeClass=e.activeClass||"active",this.toggleEvent=e.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(t,n,r,e){var i=e[0],o=e[1];o.$render=function(){n.toggleClass(i.activeClass,angular.equals(o.$modelValue,t.$eval(r.btnRadio)))},n.bind(i.toggleEvent,function(){var e=n.hasClass(i.activeClass);(!e||angular.isDefined(r.uncheckable))&&t.$apply(function(){o.$setViewValue(e?null:t.$eval(r.btnRadio)),o.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(r,e,t,n){function i(){return o(t.btnCheckboxTrue,!0)}function o(e,t){var n=r.$eval(e);return angular.isDefined(n)?n:t}var a=n[0],s=n[1];s.$render=function(){e.toggleClass(a.activeClass,angular.equals(s.$modelValue,i()))},e.bind(a.toggleEvent,function(){r.$apply(function(){s.$setViewValue(e.hasClass(a.activeClass)?o(t.btnCheckboxFalse,!1):i()),s.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$interval","$transition",function(a,t,n,s){function l(){r();var e=+a.interval;!isNaN(e)&&0=d.length?d[t-1]:d[t]):t
    ");e.attr({"ng-model":"date","ng-change":"dateSelection()"});var c=angular.element(e.children()[0]);i.datepickerOptions&&angular.forEach(r.$parent.$eval(i.datepickerOptions),function(e,t){c.attr(o(t),e)}),r.watchData={},angular.forEach(["minDate","maxDate","datepickerMode"],function(t){if(i[t]){var e=g(i[t]);if(r.$parent.$watch(e,function(e){r.watchData[t]=e}),c.attr(o(t),"watchData."+t),"datepickerMode"===t){var n=e.assign;r.$watch("watchData."+t,function(e,t){e!==t&&n(r.$parent,e)})}}}),i.dateDisabled&&c.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),n.$parsers.unshift(a),r.dateSelection=function(e){angular.isDefined(e)&&(r.date=e),n.$setViewValue(r.date),n.$render(),l&&(r.isOpen=!1,t[0].focus())},t.bind("input change keyup",function(){r.$apply(function(){r.date=n.$modelValue})}),n.$render=function(){var e=n.$viewValue?y(n.$viewValue,s):"";t.val(e),r.date=a(n.$modelValue)};var d=function(e){r.isOpen&&e.target!==t[0]&&r.$apply(function(){r.isOpen=!1})},p=function(e){r.keydown(e)};t.bind("keydown",p),r.keydown=function(e){27===e.which?(e.preventDefault(),e.stopPropagation(),r.close()):40!==e.which||r.isOpen||(r.isOpen=!0)},r.$watch("isOpen",function(e){e?(r.$broadcast("datepicker.focus"),r.position=u?v.offset(t):v.position(t),r.position.top=r.position.top+t.prop("offsetHeight"),m.bind("click",d)):m.unbind("click",d)}),r.select=function(e){if("today"===e){var t=new Date;angular.isDate(n.$modelValue)?(e=new Date(n.$modelValue)).setFullYear(t.getFullYear(),t.getMonth(),t.getDate()):e=new Date(t.setHours(0,0,0,0))}r.dateSelection(e)},r.close=function(){r.isOpen=!1,t[0].focus()};var h=f(e)(r);e.remove(),u?m.find("body").append(h):t.after(h),r.$on("$destroy",function(){h.remove(),t.unbind("keydown",p),m.unbind("click",d)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(e,t){t.bind("click",function(e){e.preventDefault(),e.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(t){var n=null;this.open=function(e){n||(t.bind("click",r),t.bind("keydown",i)),n&&n!==e&&(n.isOpen=!1),n=e},this.close=function(e){n===e&&(n=null,t.unbind("click",r),t.unbind("keydown",i))};var r=function(e){if(n){var t=n.getToggleElement();e&&t&&t[0].contains(e.target)||n.$apply(function(){n.isOpen=!1})}},i=function(e){27===e.which&&(n.focusToggleElement(),r())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(n,t,r,e,i,o){var a,s=this,l=n.$new(),u=e.openClass,c=angular.noop,d=t.onToggle?r(t.onToggle):angular.noop;this.init=function(e){s.$element=e,t.isOpen&&(a=r(t.isOpen),c=a.assign,n.$watch(a,function(e){l.isOpen=!!e}))},this.toggle=function(e){return l.isOpen=arguments.length?!!e:!l.isOpen},this.isOpen=function(){return l.isOpen},l.getToggleElement=function(){return s.toggleElement},l.focusToggleElement=function(){s.toggleElement&&s.toggleElement[0].focus()},l.$watch("isOpen",function(e,t){o[e?"addClass":"removeClass"](s.$element,u),e?(l.focusToggleElement(),i.open(l)):i.close(l),c(n,e),angular.isDefined(e)&&e!==t&&d(n,{open:!!e})}),n.$on("$locationChangeSuccess",function(){l.isOpen=!1}),n.$on("$destroy",function(){l.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(e,t,n,r){r.init(t)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(t,n,r,i){if(i){i.toggleElement=n;var e=function(e){e.preventDefault(),n.hasClass("disabled")||r.disabled||t.$apply(function(){i.toggle()})};n.bind("click",e),n.attr({"aria-haspopup":!0,"aria-expanded":!1}),t.$watch(i.isOpen,function(e){n.attr("aria-expanded",!!e)}),t.$on("$destroy",function(){n.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var r=[];return{add:function(e,t){r.push({key:e,value:t})},get:function(e){for(var t=0;t");i.attr("backdrop-class",t.backdropClass),h=c(i)(f),n.append(h)}var o=angular.element("
    ");o.attr({"template-url":t.windowTemplateUrl,"window-class":t.windowClass,size:t.size,index:m.length()-1,animate:"animate"}).html(t.content);var a=c(o)(t.scope);m.top().value.modalDomEl=a,n.append(a),n.addClass(g)},n.close=function(e,t){var n=m.get(e);n&&(n.value.deferred.resolve(t),r(e))},n.dismiss=function(e,t){var n=m.get(e);n&&(n.value.deferred.reject(t),r(e))},n.dismissAll=function(e){for(var t=this.getTop();t;)this.dismiss(t.key,e),t=this.getTop()},n.getTop=function(){return m.top()},n}]).provider("$modal",function(){var g={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(l,u,c,d,p,h,f){var e={};return e.open=function(o){var a=c.defer(),e=c.defer(),s={result:a.promise,opened:e.promise,close:function(e){f.close(s,e)},dismiss:function(e){f.dismiss(s,e)}};if((o=angular.extend({},g.options,o)).resolve=o.resolve||{},!o.template&&!o.templateUrl)throw new Error("One of template or templateUrl options is required.");var t,n,r,i=c.all([(r=o,r.template?c.when(r.template):d.get(angular.isFunction(r.templateUrl)?r.templateUrl():r.templateUrl,{cache:p}).then(function(e){return e.data}))].concat((t=o.resolve,n=[],angular.forEach(t,function(e){(angular.isFunction(e)||angular.isArray(e))&&n.push(c.when(l.invoke(e)))}),n)));return i.then(function(n){var e=(o.scope||u).$new();e.$close=s.close,e.$dismiss=s.dismiss;var t,r={},i=1;o.controller&&(r.$scope=e,r.$modalInstance=s,angular.forEach(o.resolve,function(e,t){r[t]=n[i++]}),t=h(o.controller,r),o.controllerAs&&(e[o.controllerAs]=t)),f.open(s,{scope:e,deferred:a,content:n[0],backdrop:o.backdrop,keyboard:o.keyboard,backdropClass:o.backdropClass,windowClass:o.windowClass,windowTemplateUrl:o.windowTemplateUrl,size:o.size})},function(e){a.reject(e)}),i.then(function(){e.resolve(!0)},function(){e.reject(!1)}),s},e}]};return g}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(n,r,i){var o=this,a={$setViewValue:angular.noop},t=r.numPages?i(r.numPages).assign:angular.noop;this.init=function(e,t){a=e,this.config=t,a.$render=function(){o.render()},r.itemsPerPage?n.$parent.$watch(i(r.itemsPerPage),function(e){o.itemsPerPage=parseInt(e,10),n.totalPages=o.calculateTotalPages()}):this.itemsPerPage=t.itemsPerPage},this.calculateTotalPages=function(){var e=this.itemsPerPage<1?1:Math.ceil(n.totalItems/this.itemsPerPage);return Math.max(e||0,1)},this.render=function(){n.page=parseInt(a.$viewValue,10)||1},n.selectPage=function(e){n.page!==e&&0e?n.selectPage(e):a.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(s,l){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(e,t,n,r){function c(e,t,n){return{number:e,text:t,active:n}}var i=r[0],o=r[1];if(o){var d=angular.isDefined(n.maxSize)?e.$parent.$eval(n.maxSize):l.maxSize,p=angular.isDefined(n.rotate)?e.$parent.$eval(n.rotate):l.rotate;e.boundaryLinks=angular.isDefined(n.boundaryLinks)?e.$parent.$eval(n.boundaryLinks):l.boundaryLinks,e.directionLinks=angular.isDefined(n.directionLinks)?e.$parent.$eval(n.directionLinks):l.directionLinks,i.init(o,l),n.maxSize&&e.$parent.$watch(s(n.maxSize),function(e){d=parseInt(e,10),i.render()});var a=i.render;i.render=function(){a(),0';return{restrict:"EA",compile:function(){var _=o(i);return function(r,t,i){function e(){m.isOpen?o():n()}function n(){var e,t,n;(!g||r.$eval(i[S+"Enable"]))&&(n=i[S+"Placement"],m.placement=angular.isDefined(n)?n:D.placement,e=i[S+"PopupDelay"],t=parseInt(e,10),m.popupDelay=isNaN(t)?D.popupDelay:t,m.popupDelay?p||(p=x(a,m.popupDelay,!1)).then(function(e){e()}):a()())}function o(){r.$apply(function(){s()})}function a(){return p=null,d&&(x.cancel(d),d=null),m.content?(u&&l(),c=m.$new(),(u=_(c,function(e){h?O.find("body").append(e):t.after(e)})).css({top:0,left:0,display:"block"}),m.$digest(),v(),m.isOpen=!0,m.$digest(),v):angular.noop}function s(){m.isOpen=!1,x.cancel(p),p=null,m.animation?d||(d=x(l,500)):l()}function l(){d=null,u&&(u.remove(),u=null),c&&(c.$destroy(),c=null)}var u,c,d,p,h=!!angular.isDefined(D.appendToBody)&&D.appendToBody,f=k(void 0),g=angular.isDefined(i[S+"Enable"]),m=r.$new(!0),v=function(){var e=T.positionElements(t,u,m.placement,h);e.top+="px",e.left+="px",u.css(e)};m.isOpen=!1,i.$observe(C,function(e){!(m.content=e)&&m.isOpen&&s()}),i.$observe(S+"Title",function(e){m.title=e});var y,w=function(){t.unbind(f.show,n),t.unbind(f.hide,o)};y=i[S+"Trigger"],w(),(f=k(y)).show===f.hide?t.bind(f.show,e):(t.bind(f.show,n),t.bind(f.hide,o));var b=r.$eval(i[S+"Animation"]);m.animation=angular.isDefined(b)?!!b:D.animation;var $=r.$eval(i[S+"AppendToBody"]);(h=angular.isDefined($)?$:h)&&r.$on("$locationChangeSuccess",function(){m.isOpen&&s()}),r.$on("$destroy",function(){x.cancel(d),x.cancel(p),w(),l(),m=null})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(e){return e("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(e){return e("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(e){return e("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(n,e,t){var r=this,i=angular.isDefined(e.animate)?n.$parent.$eval(e.animate):t.animate;this.bars=[],n.max=angular.isDefined(e.max)?n.$parent.$eval(e.max):t.max,this.addBar=function(t,e){i||e.css({transition:"none"}),this.bars.push(t),t.$watch("value",function(e){t.percent=+(100*e/n.max).toFixed(2)}),t.$on("$destroy",function(){e=null,r.removeBar(t)})},this.removeBar=function(e){this.bars.splice(this.bars.indexOf(e),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(e,t,n,r){r.addBar(e,t)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(e,t,n,r){r.addBar(e,angular.element(t.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(n,r,i){var o={$setViewValue:angular.noop};this.init=function(e){(o=e).$render=this.render,this.stateOn=angular.isDefined(r.stateOn)?n.$parent.$eval(r.stateOn):i.stateOn,this.stateOff=angular.isDefined(r.stateOff)?n.$parent.$eval(r.stateOff):i.stateOff;var t=angular.isDefined(r.ratingStates)?n.$parent.$eval(r.ratingStates):new Array(angular.isDefined(r.max)?n.$parent.$eval(r.max):i.max);n.range=this.buildTemplateObjects(t)},this.buildTemplateObjects=function(e){for(var t=0,n=e.length;t");v.attr({id:t,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(e.typeaheadTemplateUrl)&&v.attr("template-url",e.typeaheadTemplateUrl);var y=function(){m.matches=[],m.activeIdx=-1,a.attr("aria-expanded",!1)},w=function(e){return t+"-option-"+e};m.$watch("activeIdx",function(e){e<0?a.removeAttr("aria-activedescendant"):a.attr("aria-activedescendant",w(e))});var b=function(r){var i={$viewValue:r};u(o,!0),x.when(g.source(o,i)).then(function(e){var t=r===s.$viewValue;if(t&&l)if(0=n?0$&"):e}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(e){e.put("template/accordion/accordion-group.html",'
    \n \n
    \n\t
    \n
    \n
    \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(e){e.put("template/accordion/accordion.html",'
    ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(e){e.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(e){e.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(e){e.put("template/carousel/slide.html","
    \n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/datepicker.html",'
    \n \n \n \n
    ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{label.abbr}}
    {{ weekNumbers[$index] }}\n \n
    \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n
    \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(e){e.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n
    \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(e){e.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(e){e.put("template/modal/window.html",'')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(e){e.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(e){e.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(e){e.put("template/tooltip/tooltip-html-unsafe-popup.html",'
    \n
    \n
    \n
    \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(e){e.put("template/tooltip/tooltip-popup.html",'
    \n
    \n
    \n
    \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(e){e.put("template/popover/popover.html",'
    \n
    \n\n
    \n

    \n
    \n
    \n
    \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(e){e.put("template/progressbar/bar.html",'
    ')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(e){e.put("template/progressbar/progress.html",'
    ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(e){e.put("template/progressbar/progressbar.html",'
    \n
    \n
    ')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(e){e.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(e){e.put("template/tabs/tab.html",'
  • \n {{heading}}\n
  • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(e){e.put("template/tabs/tabset.html",'
    \n \n
    \n
    \n
    \n
    \n
    \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(e){e.put("template/timepicker/timepicker.html",'\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
     
    \n\t\t\t\t\n\t\t\t:\n\t\t\t\t\n\t\t\t
     
    \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(e){e.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(e){e.put("template/typeahead/typeahead-popup.html",'\n')}]),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function p(){return e.apply(null,arguments)}function s(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function l(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function u(e){return void 0===e}function c(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function h(e,t){var n,r=[];for(n=0;n>>0,r=0;rCe(e)?(o=e+1,s-Ce(e)):(o=e,s),{year:o,dayOfYear:a}}function Ne(e,t,n){var r,i,o=He(e.year(),t,n),a=Math.floor((e.dayOfYear()-o-1)/7)+1;return a<1?r=a+qe(i=e.year()-1,t,n):a>qe(e.year(),t,n)?(r=a-qe(e.year(),t,n),i=e.year()+1):(i=e.year(),r=a),{week:r,year:i}}function qe(e,t,n){var r=He(e,t,n),i=He(e+1,t,n);return(Ce(e)-r+i)/7}N("w",["ww",2],"wo","week"),N("W",["WW",2],"Wo","isoWeek"),P("week","w"),P("isoWeek","W"),V("week",5),V("isoWeek",5),le("w",Q),le("ww",Q,B),le("W",Q),le("WW",Q,B),he(["w","ww","W","WW"],function(e,t,n,r){t[r.substr(0,1)]=S(e)});N("d",0,"do","day"),N("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),N("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),N("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),N("e",0,0,"weekday"),N("E",0,0,"isoWeekday"),P("day","d"),P("weekday","e"),P("isoWeekday","E"),V("day",11),V("weekday",11),V("isoWeekday",11),le("d",Q),le("e",Q),le("E",Q),le("dd",function(e,t){return t.weekdaysMinRegex(e)}),le("ddd",function(e,t){return t.weekdaysShortRegex(e)}),le("dddd",function(e,t){return t.weekdaysRegex(e)}),he(["dd","ddd","dddd"],function(e,t,n,r){var i=n._locale.weekdaysParse(e,r,n._strict);null!=i?t.d=i:v(n).invalidWeekday=e}),he(["d","e","E"],function(e,t,n,r){t[r]=S(e)});var Ue="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var Be="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var We=ae;var Ge=ae;var Ke=ae;function Qe(){function e(e,t){return t.length-e.length}var t,n,r,i,o,a=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=m([2e3,1]).day(t),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(r),s.push(i),l.push(o),u.push(r),u.push(i),u.push(o);for(a.sort(e),s.sort(e),l.sort(e),u.sort(e),t=0;t<7;t++)s[t]=ce(s[t]),l[t]=ce(l[t]),u[t]=ce(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Ze(){return this.hours()%12||12}function Xe(e,t){N(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Je(e,t){return t._meridiemParse}N("H",["HH",2],0,"hour"),N("h",["hh",2],0,Ze),N("k",["kk",2],0,function(){return this.hours()||24}),N("hmm",0,0,function(){return""+Ze.apply(this)+F(this.minutes(),2)}),N("hmmss",0,0,function(){return""+Ze.apply(this)+F(this.minutes(),2)+F(this.seconds(),2)}),N("Hmm",0,0,function(){return""+this.hours()+F(this.minutes(),2)}),N("Hmmss",0,0,function(){return""+this.hours()+F(this.minutes(),2)+F(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),P("hour","h"),V("hour",13),le("a",Je),le("A",Je),le("H",Q),le("h",Q),le("k",Q),le("HH",Q,B),le("hh",Q,B),le("kk",Q,B),le("hmm",Z),le("hmmss",X),le("Hmm",Z),le("Hmmss",X),pe(["H","HH"],ve),pe(["k","kk"],function(e,t,n){var r=S(e);t[ve]=24===r?0:r}),pe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),pe(["h","hh"],function(e,t,n){t[ve]=S(e),v(n).bigHour=!0}),pe("hmm",function(e,t,n){var r=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r)),v(n).bigHour=!0}),pe("hmmss",function(e,t,n){var r=e.length-4,i=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r,2)),t[we]=S(e.substr(i)),v(n).bigHour=!0}),pe("Hmm",function(e,t,n){var r=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r))}),pe("Hmmss",function(e,t,n){var r=e.length-4,i=e.length-2;t[ve]=S(e.substr(0,r)),t[ye]=S(e.substr(r,2)),t[we]=S(e.substr(i))});var et,tt=xe("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Pe,monthsShort:Me,week:{dow:0,doy:6},weekdays:Ue,weekdaysMin:Be,weekdaysShort:ze,meridiemParse:/[ap]\.?m?\.?/i},rt={},it={};function ot(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!rt[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),st(t)}catch(e){}return rt[e]}function st(e,t){var n;return e&&((n=u(t)?ut(e):lt(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function lt(e,t){if(null===t)return delete rt[e],null;var n,r=nt;if(t.abbr=e,null!=rt[e])x("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=rt[e]._config;else if(null!=t.parentLocale)if(null!=rt[t.parentLocale])r=rt[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;r=n._config}return rt[e]=new E(T(r,t)),it[e]&&it[e].forEach(function(e){lt(e.name,e.config)}),st(e),rt[e]}function ut(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!s(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,r,i,o=0;o=t&&a(i,n,!0)>=t-1)break;t--}o++}return et}(e)}function ct(e){var t,n=e._a;return n&&-2===v(e).overflow&&(t=n[ge]<0||11Ee(n[fe],n[ge])?me:n[ve]<0||24qe(n,o,a)?v(e)._overflowWeeks=!0:null!=l?v(e)._overflowWeekday=!0:(s=Ye(n,r,i,o,a),e._a[fe]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(o=dt(e._a[fe],r[fe]),(e._dayOfYear>Ce(o)||0===e._dayOfYear)&&(v(e)._overflowDayOfYear=!0),n=je(o,0,e._dayOfYear),e._a[ge]=n.getUTCMonth(),e._a[me]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ve]&&0===e._a[ye]&&0===e._a[we]&&0===e._a[be]&&(e._nextDay=!0,e._a[ve]=0),e._d=(e._useUTC?je:function(e,t,n,r,i,o,a){var s=new Date(e,t,n,r,i,o,a);return e<100&&0<=e&&isFinite(s.getFullYear())&&s.setFullYear(e),s}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ve]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(v(e).weekdayMismatch=!0)}}var ht=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ft=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,gt=/Z|[+-]\d\d(?::?\d\d)?/,mt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],vt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],yt=/^\/?Date\((\-?\d+)/i;function wt(e){var t,n,r,i,o,a,s=e._i,l=ht.exec(s)||ft.exec(s);if(l){for(v(e).iso=!0,t=0,n=mt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},un.isLocal=function(){return!!this.isValid()&&!this._isUTC},un.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},un.isUtc=Ht,un.isUTC=Ht,un.zoneAbbr=function(){return this._isUTC?"UTC":""},un.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},un.dates=n("dates accessor is deprecated. Use date instead.",nn),un.months=n("months accessor is deprecated. Use month instead",Ie),un.years=n("years accessor is deprecated. Use year instead",De),un.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),un.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!u(this._isDSTShifted))return this._isDSTShifted;var e={};if(b(e,this),(e=kt(e))._a){var t=e._isUTC?m(e._a):xt(e._a);this._isDSTShifted=this.isValid()&&0-1/0&&t.selectable&&c[e]){var r=c[e](t.utcDateValue),i=[];if(r.weeks)for(var o=0;on+9,past:u.year()r.indexOf(e.startView))throw new Error("startView must be greater than minView");if(!a.isNumber(e.minuteStep))throw new Error("minuteStep must be numeric");if(e.minuteStep<=0||60<=e.minuteStep)throw new Error("minuteStep must be greater than zero and less than 60");if(null!==e.configureOn&&!a.isString(e.configureOn))throw new Error("configureOn must be a string");if(null!==e.configureOn&&e.configureOn.length<1)throw new Error("configureOn must not be an empty string");if(null!==e.renderOn&&!a.isString(e.renderOn))throw new Error("renderOn must be a string");if(null!==e.renderOn&&e.renderOn.length<1)throw new Error("renderOn must not be an empty string");if(null!==e.modelType&&!a.isString(e.modelType))throw new Error("modelType must be a string");if(null!==e.modelType&&e.modelType.length<1)throw new Error("modelType must not be an empty string");"Date"!==e.modelType&&"moment"!==e.modelType&&"milliseconds"!==e.modelType&&(e.parseFormat=e.modelType);if(null!==e.dropdownSelector&&!a.isString(e.dropdownSelector))throw new Error("dropdownSelector must be a string");null===e.dropdownSelector||"undefined"!=typeof jQuery&&"function"==typeof jQuery().dropdown||(i.error("Please DO NOT specify the dropdownSelector option unless you are using jQuery AND Bootstrap.js. Please include jQuery AND Bootstrap.js, or write code to close the dropdown in the on-set-time callback. \n\nThe dropdownSelector configuration option is being removed because it will not function properly."),delete e.dropdownSelector)}}}a.module("ui.bootstrap.datetimepicker",[]).service("dateTimePickerConfig",function(){var e={bg:{previous:"предишна",next:"следваща"},ca:{previous:"anterior",next:"següent"},da:{previous:"forrige",next:"næste"},de:{previous:"vorige",next:"weiter"},"en-au":{previous:"previous",next:"next"},"en-gb":{previous:"previous",next:"next"},en:{previous:"previous",next:"next"},"es-us":{previous:"atrás",next:"siguiente"},es:{previous:"atrás",next:"siguiente"},fi:{previous:"edellinen",next:"seuraava"},fr:{previous:"précédent",next:"suivant"},hu:{previous:"előző",next:"következő"},it:{previous:"precedente",next:"successivo"},ja:{previous:"前へ",next:"次へ"},ml:{previous:"മുൻപുള്ളത്",next:"അടുത്തത്"},nl:{previous:"vorige",next:"volgende"},pl:{previous:"poprzednia",next:"następna"},"pt-br":{previous:"anteriores",next:"próximos"},pt:{previous:"anterior",next:"próximo"},ro:{previous:"anterior",next:"următor"},ru:{previous:"предыдущая",next:"следующая"},sk:{previous:"predošlá",next:"ďalšia"},sv:{previous:"föregående",next:"nästa"},tr:{previous:"önceki",next:"sonraki"},uk:{previous:"назад",next:"далі"},"zh-cn":{previous:"上一页",next:"下一页"},"zh-tw":{previous:"上一頁",next:"下一頁"}}[b.locale().toLowerCase()];return a.extend({},{configureOn:null,dropdownSelector:null,minuteStep:5,minView:"minute",modelType:"Date",parseFormat:"YYYY-MM-DDTHH:mm:ss.SSSZZ",renderOn:null,startView:"day"},{screenReader:e})}).service("dateTimePickerValidator",t).directive("datetimepicker",e),e.$inject=["dateTimePickerConfig","dateTimePickerValidator"],t.$inject=["$log"]}),angular.module("rzTable",[]),angular.module("rzTable").directive("rzTable",["resizeStorage","$injector","$parse",function(g,i,u){function e(e){}function c(n,r,i){return function(e,t){!0!==i.busy&&void 0!==t&&t!==e&&(d(n),p(n,r,i))}}function d(e){k=!0,l.map(function(e){e.remove()}),l=[]}function p(e,t,n){if(!n.busy){b=$(e).find("th"),v=n.mode,y=!angular.isDefined(n.saveTableSizes)||n.saveTableSizes,w=n.profile;var r=function(t,e){try{var n=e.rzMode?t.mode:"BasicResizer",r=i.get(n);return r}catch(e){return console.error("The resizer "+t.mode+" was not found"),null}}(n,t);r&&(S=new r(e,b,h),y&&(D=g.loadTableSizes(e,n.mode,n.profile)),s=S.handles(b),a=S.ctrlColumns,S.setup(),(o=D)&&($(C).width("auto"),a.each(function(e,t){var n=angular.element(t).scope(),r=n.rzCol||$(t).attr("id"),i=o[r];$(t).css({width:i})}),S.onTableReady()),s.each(function(e,t){!function(e,t,n){var r=$("
    ",{class:e.options.handleClass||"rz-handle"});$(n).prepend(r),l.push(r);var i=S.handleMiddleware(r,n);p=e,h=r,f=i,$(h).mousedown(function(e){k&&(S.onFirstDrag(f,h),S.onTableReady(),k=!1),p.options.onResizeStarted&&p.options.onResizeStarted(f);var t={};S.intervene&&(((t=S.intervene.selector(f)).column=t).orgWidth=$(t).width()),e.preventDefault(),$(h).addClass(p.options.handleClassActive||"rz-handle-active");var n,r,i,o,a,s,l,u,c=e.clientX,d=$(f).width();o=p,a=f,s=c,l=d,u=t,_=function(e){var t=e.clientX,n=t-s,r=S.calculate(l,n);if(!(rt)||(this.fixedColumn.width()<=this.getMinWidth(this.fixedColumn)?(this.bound=t,$(this.fixedColumn).width(this.minWidth),!0):void 0)},e.prototype.onEndDrag=function(){this.bound=!1},e.prototype.calculate=function(e,t){return e-t},e}]),angular.module("rzTable").factory("OverflowResizer",["ResizerModel",function(r){function e(e,t,n){r.call(this,e,t,n)}return(e.prototype=Object.create(r.prototype)).setup=function(){$(this.container).css({overflow:"auto"})},e.prototype.onTableReady=function(){$(this.table).width(1)},e}]),function(e,t){"function"==typeof define&&define.amd?define(["angular"],t):"object"==typeof module&&module.exports?module.exports=t(require("angular")):e.angularClipboard=t(e.angular)}(this,function(i){return i.module("angular-clipboard",[]).factory("clipboard",["$document","$window",function(s,l){return{copyText:function(e,t){var n,r,i=l.pageXOffset||s[0].documentElement.scrollLeft,o=l.pageYOffset||s[0].documentElement.scrollTop,a=(n=e,(r=s[0].createElement("textarea")).style.position="absolute",r.style.fontSize="12pt",r.style.border="0",r.style.padding="0",r.style.margin="0",r.style.left="-10000px",r.style.top=(l.pageYOffset||s[0].documentElement.scrollTop)+"px",r.textContent=n,r);s[0].body.appendChild(a),function(e){try{s[0].body.style.webkitUserSelect="initial";var t=s[0].getSelection();t.removeAllRanges();var n=document.createRange();n.selectNodeContents(e),t.addRange(n),e.select(),e.setSelectionRange(0,999999);try{if(!s[0].execCommand("copy"))throw"failure copy"}finally{t.removeAllRanges()}}finally{s[0].body.style.webkitUserSelect=""}}(a),l.scrollTo(i,o),s[0].body.removeChild(a)},supported:"queryCommandSupported"in s[0]&&s[0].queryCommandSupported("copy")}}]).directive("clipboard",["clipboard",function(r){return{restrict:"A",scope:{onCopied:"&",onError:"&",text:"=",supported:"=?"},link:function(t,n){t.supported=r.supported,n.on("click",function(e){try{r.copyText(t.text,n[0]),i.isFunction(t.onCopied)&&t.$evalAsync(t.onCopied())}catch(e){i.isFunction(t.onError)&&t.$evalAsync(t.onError({err:e}))}})}}}])}),function(e,t){"function"==typeof define&&define.amd?define("sifter",t):"object"==typeof exports?module.exports=t():e.Sifter=t()}(this,function(){var e=function(e,t){this.items=e,this.settings=t||{diacritics:!0}};e.prototype.tokenize=function(e){if(!(e=s(String(e||"").toLowerCase()))||!e.length)return[];var t,n,r,i,o=[],a=e.split(/ +/);for(t=0,n=a.length;t/g,">").replace(/"/g,""")},t={before:function(e,t,n){var r=e[t];e[t]=function(){return n.apply(e,arguments),r.apply(e,arguments)}},after:function(t,e,n){var r=t[e];t[e]=function(){var e=r.apply(t,arguments);return n.apply(t,arguments),e}}},n=function(t,n,e){var r,i=t.trigger,o={};for(r in t.trigger=function(){var e=arguments[0];if(-1===n.indexOf(e))return i.apply(t,arguments);o[e]=arguments},e.apply(t,[]),t.trigger=i,o)o.hasOwnProperty(r)&&i.apply(t,o[r])},f=function(e){var t={};if("selectionStart"in e)t.start=e.selectionStart,t.length=e.selectionEnd-t.start;else if(document.selection){e.focus();var n=document.selection.createRange(),r=document.selection.createRange().text.length;n.moveStart("character",-e.value.length),t.start=n.text.length-r,t.length=r}return t},O=function(p){var h=null,e=function(e,t){var n,r,i,o,a,s,l,u,c,d;(t=t||{},(e=e||window.event||{}).metaKey||e.altKey)||(t.force||!1!==p.data("grow"))&&(n=p.val(),e.type&&"keydown"===e.type.toLowerCase()&&(i=48<=(r=e.keyCode)&&r<=57||65<=r&&r<=90||96<=r&&r<=111||186<=r&&r<=222||32===r,46===r||8===r?(u=f(p[0])).length?n=n.substring(0,u.start)+n.substring(u.start+u.length):8===r&&u.start?n=n.substring(0,u.start-1)+n.substring(u.start+1):46===r&&void 0!==u.start&&(n=n.substring(0,u.start)+n.substring(u.start+1)):i&&(s=e.shiftKey,l=String.fromCharCode(e.keyCode),n+=l=s?l.toUpperCase():l.toLowerCase())),o=p.attr("placeholder"),!n&&o&&(n=o),d=p,(a=((c=n)?(w.$testInput||(w.$testInput=S("").css({position:"absolute",top:-99999,left:-99999,width:"auto",padding:0,whiteSpace:"pre"}).appendTo("body")),w.$testInput.text(c),function(e,t,n){var r,i,o={};if(n)for(r=0,i=n.length;r").addClass(g.wrapperClass).addClass(s).addClass(a),t=S("
    ").addClass(g.inputClass).addClass("items").appendTo(e),n=S('').appendTo(t).attr("tabindex",w.is(":disabled")?"-1":f.tabIndex),o=S(g.dropdownParent||e),r=S("
    ").addClass(g.dropdownClass).addClass(a).hide().appendTo(o),i=S("
    ").addClass(g.dropdownContentClass).appendTo(r),(u=w.attr("id"))&&(n.attr("id",u+"-selectized"),S("label[for='"+u+"']").attr("for",u+"-selectized")),f.settings.copyClassesToDropdown&&r.addClass(s),e.css({width:w[0].style.width}),f.plugins.names.length&&(l="plugin-"+f.plugins.names.join(" plugin-"),e.addClass(l),r.addClass(l)),(null===g.maxItems||1[data-selectable]",function(e){e.stopImmediatePropagation()}),r.on("mouseenter","[data-selectable]",function(){return f.onOptionHover.apply(f,arguments)}),r.on("mousedown click","[data-selectable]",function(){return f.onOptionSelect.apply(f,arguments)}),d="mousedown",p="*:not(input)",h=function(){return f.onItemSelect.apply(f,arguments)},(c=t).on(d,p,function(e){for(var t=e.target;t&&t.parentNode!==c[0];)t=t.parentNode;return e.currentTarget=t,h.apply(this,[e])}),O(n),t.on({mousedown:function(){return f.onMouseDown.apply(f,arguments)},click:function(){return f.onClick.apply(f,arguments)}}),n.on({mousedown:function(e){e.stopPropagation()},keydown:function(){return f.onKeyDown.apply(f,arguments)},keyup:function(){return f.onKeyUp.apply(f,arguments)},keypress:function(){return f.onKeyPress.apply(f,arguments)},resize:function(){f.positionDropdown.apply(f,[])},blur:function(){return f.onBlur.apply(f,arguments)},focus:function(){return f.ignoreBlur=!1,f.onFocus.apply(f,arguments)},paste:function(){return f.onPaste.apply(f,arguments)}}),y.on("keydown"+m,function(e){f.isCmdDown=e[$?"metaKey":"ctrlKey"],f.isCtrlDown=e[$?"altKey":"ctrlKey"],f.isShiftDown=e.shiftKey}),y.on("keyup"+m,function(e){e.keyCode===C&&(f.isCtrlDown=!1),16===e.keyCode&&(f.isShiftDown=!1),e.keyCode===_&&(f.isCmdDown=!1)}),y.on("mousedown"+m,function(e){if(f.isFocused){if(e.target===f.$dropdown[0]||e.target.parentNode===f.$dropdown[0])return!1;f.$control.has(e.target).length||e.target===f.$control[0]||f.blur(e.target)}}),v.on(["scroll"+m,"resize"+m].join(" "),function(){f.isOpen&&f.positionDropdown.apply(f,arguments)}),v.on("mousemove"+m,function(){f.ignoreHover=!1}),this.revertSettings={$children:w.children().detach(),tabindex:w.attr("tabindex")},w.attr("tabindex",-1).hide().after(f.$wrapper),S.isArray(g.items)&&(f.setValue(g.items),delete g.items),D&&w.on("invalid"+m,function(e){e.preventDefault(),f.isInvalid=!0,f.refreshState()}),f.updateOriginalInput(),f.refreshItems(),f.refreshState(),f.updatePlaceholder(),f.isSetup=!0,w.is(":disabled")&&f.disable(),f.on("change",this.onChange),w.data("selectize",f),w.addClass("selectized"),f.trigger("initialize"),!0===g.preload&&f.onSearchChange("")},setupTemplates:function(){var n=this.settings.labelField,r=this.settings.optgroupLabelField,e={optgroup:function(e){return'
    '+e.html+"
    "},optgroup_header:function(e,t){return'
    '+t(e[r])+"
    "},option:function(e,t){return'
    '+t(e[n])+"
    "},item:function(e,t){return'
    '+t(e[n])+"
    "},option_create:function(e,t){return'
    Add '+t(e.input)+"
    "}};this.settings.render=S.extend({},e,this.settings.render)},setupCallbacks:function(){var e,t,n={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(e in n)n.hasOwnProperty(e)&&(t=this.settings[n[e]])&&this.on(e,t)},onClick:function(e){this.isFocused&&this.isOpen||(this.focus(),e.preventDefault())},onMouseDown:function(e){var t=this,n=e.isDefaultPrevented();S(e.target);if(t.isFocused){if(e.target!==t.$control_input[0])return"single"===t.settings.mode?t.isOpen?t.close():t.open():n||t.setActiveItem(null),!1}else n||window.setTimeout(function(){t.focus()},0)},onChange:function(){this.$input.trigger("change")},onPaste:function(e){var i=this;i.isFull()||i.isInputHidden||i.isLocked?e.preventDefault():i.settings.splitOn&&setTimeout(function(){var e=i.$control_input.val();if(e.match(i.settings.splitOn))for(var t=S.trim(e).split(i.settings.splitOn),n=0,r=t.length;n=this.settings.maxItems},updateOriginalInput:function(e){var t,n,r,i,o=this;if(e=e||{},1===o.tagType){for(r=[],t=0,n=o.items.length;t'+s(i)+"");r.length||this.$input.attr("multiple")||r.push(''),o.$input.html(r.join(""))}else o.$input.val(o.getValue()),o.$input.attr("value",o.$input.val());o.isSetup&&(e.silent||o.trigger("change",o.$input.val()))},updatePlaceholder:function(){if(this.settings.placeholder){var e=this.$control_input;this.items.length?e.removeAttr("placeholder"):e.attr("placeholder",this.settings.placeholder),e.triggerHandler("update",{force:!0})}},open:function(){var e=this;e.isLocked||e.isOpen||"multi"===e.settings.mode&&e.isFull()||(e.focus(),e.isOpen=!0,e.refreshState(),e.$dropdown.css({visibility:"hidden",display:"block"}),e.positionDropdown(),e.$dropdown.css({visibility:"visible"}),e.trigger("dropdown_open",e.$dropdown))},close:function(){var e=this,t=e.isOpen;"single"===e.settings.mode&&e.items.length&&(e.hideInput(),e.isBlurring||e.$control_input.blur()),e.isOpen=!1,e.$dropdown.hide(),e.setActiveOption(null),e.refreshState(),t&&e.trigger("dropdown_close",e.$dropdown)},positionDropdown:function(){var e=this.$control,t="body"===this.settings.dropdownParent?e.offset():e.position();t.top+=e.outerHeight(!0),this.$dropdown.css({width:e[0].getBoundingClientRect().width,top:t.top,left:t.left})},clear:function(e){var t=this;t.items.length&&(t.$control.children(":not(input)").remove(),t.items=[],t.lastQuery=null,t.setCaret(0),t.setActiveItem(null),t.updatePlaceholder(),t.updateOriginalInput({silent:e}),t.refreshState(),t.showInput(),t.trigger("clear"))},insertAtCaret:function(e){var t=Math.min(this.caretPos,this.items.length),n=e[0],r=this.buffer||this.$control[0];0===t?r.insertBefore(n,r.firstChild):r.insertBefore(n,r.childNodes[t]),this.setCaret(t+1)},deleteSelection:function(e){var t,n,r,i,o,a,s,l,u,c=this;if(r=e&&8===e.keyCode?-1:1,i=f(c.$control_input[0]),c.$activeOption&&!c.settings.hideSelected&&(s=c.getAdjacentOption(c.$activeOption,-1).attr("data-value")),o=[],c.$activeItems.length){for(u=c.$control.children(".active:"+(0
    '+e.title+'×
    '}},e),n.setup=(t=n.setup,function(){t.apply(n,arguments),n.$dropdown_header=S(e.html(e)),n.$dropdown.prepend(n.$dropdown_header)})}),w.define("optgroup_columns",function(s){var o,l=this;s=S.extend({equalizeWidth:!0,equalizeHeight:!0},s),this.getAdjacentOption=function(e,t){var n=e.closest("[data-group]").find("[data-selectable]"),r=n.index(e)+t;return 0<=r&&r
    ',e=e.firstChild,n.body.appendChild(e),t=u.width=e.offsetWidth-e.clientWidth,n.body.removeChild(e)),t},e=function(){var e,t,n,r,i,o,a;if((t=(a=S("[data-group]",l.$dropdown_content)).length)&&l.$dropdown_content.width()){if(s.equalizeHeight){for(e=n=0;e'+t.label+"",o.setup=(n=r.setup,function(){if(t.append){var i=r.settings.render.item;r.settings.render.item=function(e){return t=i.apply(o,arguments),n=a,r=t.search(/(<\/[^>]+>\s*)$/),t.substring(0,r)+n+t.substring(r);var t,n,r}}n.apply(o,arguments),o.$control.on("click","."+t.className,function(e){if(e.preventDefault(),!r.isLocked){var t=S(e.currentTarget).parent();r.setActiveItem(t),r.deleteSelection()&&r.setCaret(r.items.length)}})})):function(i,t){t.className="remove-single";var n,o=i,a=''+t.label+"";i.setup=(n=o.setup,function(){if(t.append){var e=S(o.$input.context).attr("id"),r=(S("#"+e),o.settings.render.item);o.settings.render.item=function(e){return t=r.apply(i,arguments),n=a,S("").append(t).append(n);var t,n}}n.apply(i,arguments),i.$control.on("click","."+t.className,function(e){e.preventDefault(),o.isLocked||o.clear()})})}(this,e)}),w.define("restore_on_backspace",function(r){var i,e=this;r.text=r.text||function(e){return e[this.settings.labelField]},this.onKeyDown=(i=e.onKeyDown,function(e){var t,n;return 8===e.keyCode&&""===this.$control_input.val()&&!this.$activeItems.length&&0<=(t=this.caretPos-1)&&t",{class:function(){var e=[];return e.push(i.options.state?"on":"off"),i.options.size&&e.push(i.options.size),i.options.disabled&&e.push("disabled"),i.options.readonly&&e.push("readonly"),i.options.indeterminate&&e.push("indeterminate"),i.options.inverse&&e.push("inverse"),i.$element.attr("id")&&e.push("id-"+i.$element.attr("id")),e.map(i._getClass.bind(i)).concat([i.options.baseClass],i._getClasses(i.options.wrapperClass)).join(" ")}}),this.$container=s("
    ",{class:this._getClass("container")}),this.$on=s("",{html:this.options.onText,class:this._getClass("handle-on")+" "+this._getClass(this.options.onColor)}),this.$off=s("",{html:this.options.offText,class:this._getClass("handle-off")+" "+this._getClass(this.options.offColor)}),this.$label=s("",{html:this.options.labelText,class:this._getClass("label")}),this.$element.on("init.bootstrapSwitch",this.options.onInit.bind(this,r)),this.$element.on("switchChange.bootstrapSwitch",function(){for(var e=arguments.length,t=Array(e),n=0;n-n._handleWidth/2;n._dragEnd=!1,n.state(n.options.inverse?!t:t)}else n.state(!n.options.state);n._dragStart=!1}},"mouseleave.bootstrapSwitch":function(){n.$label.trigger("mouseup.bootstrapSwitch")}})}},{key:"_externalLabelHandler",value:function(){var t=this,n=this.$element.closest("label");n.on("click",function(e){e.preventDefault(),e.stopImmediatePropagation(),e.target===n[0]&&t.toggleState()})}},{key:"_formHandler",value:function(){var e=this.$element.closest("form");e.data("bootstrap-switch")||e.on("reset.bootstrapSwitch",function(){window.setTimeout(function(){e.find("input").filter(function(){return s(this).data("bootstrap-switch")}).each(function(){return s(this).bootstrapSwitch("state",this.checked)})},1)}).data("bootstrap-switch",!0)}},{key:"_getClass",value:function(e){return this.options.baseClass+"-"+e}},{key:"_getClasses",value:function(e){return s.isArray(e)?e.map(this._getClass.bind(this)):[this._getClass(e)]}}]),t}();s.fn.bootstrapSwitch=function(o){for(var e=arguments.length,a=Array(1
    ');var r,i=f.overlay?"":" ngdialog-no-overlay";if((d=T('
    ')).html(f.overlay?'
    '+t+"
    ":'
    '+t+"
    "),d.data("$ngDialogOptions",f),c.ngDialogId=u,f.data&&O.isString(f.data)){var o=f.data.replace(/^\s*/,"")[0];c.ngDialogData="{"===o||"["===o?O.fromJson(f.data):new String(f.data),c.ngDialogData.ngDialogId=u}else f.data&&O.isObject(f.data)&&(c.ngDialogData=f.data,c.ngDialogData.ngDialogId=u);(f.className&&d.addClass(f.className),f.appendClassName&&d.addClass(f.appendClassName),f.width&&(h=d[0].querySelector(".ngdialog-content"),O.isString(f.width)?h.style.width=f.width:h.style.width=f.width+"px"),f.height&&(h=d[0].querySelector(".ngdialog-content"),O.isString(f.height)?h.style.height=f.height:h.style.height=f.height+"px"),f.disableAnimation&&d.addClass("ngdialog-disabled-animation"),p=f.appendTo&&O.isString(f.appendTo)?O.element(document.querySelector(f.appendTo)):b.body,$.applyAriaAttributes(d,f),f.preCloseCallback)&&(O.isFunction(f.preCloseCallback)?r=f.preCloseCallback:O.isString(f.preCloseCallback)&&c&&(O.isFunction(c[f.preCloseCallback])?r=c[f.preCloseCallback]:c.$parent&&O.isFunction(c.$parent[f.preCloseCallback])?r=c.$parent[f.preCloseCallback]:m&&O.isFunction(m[f.preCloseCallback])&&(r=m[f.preCloseCallback])),r&&d.data("$ngDialogPreCloseCallback",r));if(c.closeThisDialog=function(e){$.closeDialog(d,e)},f.controller&&(O.isString(f.controller)||O.isArray(f.controller)||O.isFunction(f.controller))){var a;f.controllerAs&&O.isString(f.controllerAs)&&(a=f.controllerAs);var s=w(f.controller,O.extend(n,{$scope:c,$element:d}),!0,a);f.bindToController&&O.extend(s.instance,{ngDialogId:c.ngDialogId,ngDialogData:c.ngDialogData,closeThisDialog:c.closeThisDialog,confirm:c.confirm}),"function"==typeof s?d.data("$ngDialogControllerController",s()):d.data("$ngDialogControllerController",s)}if(v(function(){var e=document.querySelectorAll(".ngdialog");$.deactivateAll(e),g(d)(c);var t=y.innerWidth-b.body.prop("clientWidth");b.html.addClass(f.bodyClassName),b.body.addClass(f.bodyClassName);var n=t-(y.innerWidth-b.body.prop("clientWidth"));0window.innerHeight&&(l=v,t++,e=0);var u=l?0===e?l:l+w:v,c=n+t*(b+s);o.css(o._positionY,u+"px"),"center"==o._positionX?o.css("left",parseInt(window.innerWidth/2-s/2)+"px"):o.css(o._positionX,c+"px"),r[o._positionY+o._positionX]=u+a,0m.maxCount&&0===i&&o.scope().kill(!0),e++}}},i=c(e)(n);i._positionY=h.positionY,i._positionX=h.positionX,i._priority=h.priority,i.addClass(h.type);var o=function(e){("click"===(e=e.originalEvent||e).type||"opacity"===e.propertyName&&1<=e.elapsedTime)&&(n.onClose&&n.$apply(n.onClose(i)),i.remove(),$.splice($.indexOf(i),1),n.$destroy(),r())};h.closeOnClick&&(i.addClass("clickable"),i.bind("click",o)),i.bind("webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",o),angular.isNumber(h.delay)&&u(function(){i.addClass("killed")},h.delay),t("none"),angular.element(document.querySelector(h.container)).append(i);var a=-(parseInt(i[0].offsetHeight)+50);if(i.css(i._positionY,a+"px"),$.push(i),"center"==h.positionX){var s=parseInt(i[0].offsetWidth);i.css("left",parseInt(window.innerWidth/2-s/2)+"px")}u(function(){t("")}),n._templateElement=i,n.kill=function(e){e?(n.onClose&&n.$apply(n.onClose(n._templateElement)),$.splice($.indexOf(n._templateElement),1),n._templateElement.remove(),n.$destroy(),u(r)):n._templateElement.addClass("killed")},u(r),_||(angular.element(g).bind("resize",function(e){u(r)}),_=!0),l.resolve(n)}var l=a.defer();"object"==typeof h&&null!==h||(h={message:h}),h.scope=h.scope?h.scope:o,h.template=h.templateUrl?h.templateUrl:m.templateUrl,h.delay=angular.isUndefined(h.delay)?s:h.delay,h.type=e||h.type||m.type||"",h.positionY=h.positionY?h.positionY:m.positionY,h.positionX=h.positionX?h.positionX:m.positionX,h.replaceMessage=h.replaceMessage?h.replaceMessage:m.replaceMessage,h.onClose=h.onClose?h.onClose:m.onClose,h.closeOnClick=null!==h.closeOnClick&&void 0!==h.closeOnClick?h.closeOnClick:m.closeOnClick,h.container=h.container?h.container:m.container,h.priority=h.priority?h.priority:m.priority;var n=i.get(h.template);return n?t(n):r.get(h.template,{cache:!0}).then(function(e){t(e.data)}).catch(function(e){throw new Error("Template ("+h.template+") could not be loaded. "+e)}),l.promise};return t.primary=function(e){return this(e,"primary")},t.error=function(e){return this(e,"error")},t.success=function(e){return this(e,"success")},t.info=function(e){return this(e,"info")},t.warning=function(e){return this(e,"warning")},t.clearAll=function(){angular.forEach($,function(e){e.addClass("killed")})},t}]}),angular.module("ui-notification").run(["$templateCache",function(e){e.put("angular-ui-notification.html",'

    ')}]),function(){var w="__default";angular.module("angularUtils.directives.dirPagination",[]).directive("dirPaginate",["$compile","$parse","paginationService",function(m,v,y){return{terminal:!0,multiElement:!0,priority:100,compile:function(e,t){var f=t.dirPaginate,n=f.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),r=/\|\s*itemsPerPage\s*:\s*(.*\(\s*\w*\)|([^\)]*?(?=\s+as\s+))|[^\)]*)/;if(null===n[2].match(r))throw"pagination directive: the 'itemsPerPage' filter must be set.";var i=n[2].replace(r,""),g=v(i);o=e,angular.forEach(o,function(e){1===e.nodeType&&angular.element(e).attr("dir-paginate-no-compile",!0)});var o;var a=t.paginationId||w;return y.registerInstance(a),function(e,t,n){var r=v(n.paginationId)(e)||n.paginationId||w;y.registerInstance(r);var i,o,a,s,l,u,c,d=(u=r,c=!!(l=f).match(/(\|\s*itemsPerPage\s*:[^|]*:[^|]*)/),u===w||c?l:l.replace(/(\|\s*itemsPerPage\s*:\s*[^|\s]*)/,"$1 : '"+u+"'"));o=n,a=d,(i=t)[0].hasAttribute("dir-paginate-start")||i[0].hasAttribute("data-dir-paginate-start")?(o.$set("ngRepeatStart",a),i.eq(i.length-1).attr("ng-repeat-end",!0)):o.$set("ngRepeat",a),s=t,angular.forEach(s,function(e){1===e.nodeType&&angular.element(e).removeAttr("dir-paginate-no-compile")}),s.eq(0).removeAttr("dir-paginate-start").removeAttr("dir-paginate").removeAttr("data-dir-paginate-start").removeAttr("data-dir-paginate"),s.eq(s.length-1).removeAttr("dir-paginate-end").removeAttr("data-dir-paginate-end");var p=m(t),h=function(e,t,n){var r;if(t.currentPage)r=v(t.currentPage);else{var i=(n+"__currentPage").replace(/\W/g,"_");e[i]=1,r=v(i)}return r}(e,n,r);y.setCurrentPageParser(r,h,e),void 0!==n.totalItems?(y.setAsyncModeTrue(r),e.$watch(function(){return v(n.totalItems)(e)},function(e){0<=e&&y.setCollectionLength(r,e)})):(y.setAsyncModeFalse(r),e.$watchCollection(function(){return g(e)},function(e){if(e){var t=e instanceof Array?e.length:Object.keys(e).length;y.setCollectionLength(r,t)}})),p(e)}}}}]).directive("dirPaginateNoCompile",function(){return{priority:5e3,terminal:!0}}).directive("dirPaginationControls",["paginationService","paginationTemplate",function(d,n){var p=/^\d+$/,e={restrict:"AE",scope:{maxSize:"=?",onPageChange:"&?",paginationId:"=?",autoHide:"=?"},link:function(r,e,t){var n=t.paginationId||w,i=r.paginationId||t.paginationId||w;if(!d.isRegistered(i)&&!d.isRegistered(n)){var o=i!==w?" (id: "+i+") ":" ";window.console&&console.warn("Pagination directive: the pagination controls"+o+"cannot be used without the corresponding pagination directive, which was not found at link time.")}r.maxSize||(r.maxSize=9);r.autoHide=void 0===r.autoHide||r.autoHide,r.directionLinks=!angular.isDefined(t.directionLinks)||r.$parent.$eval(t.directionLinks),r.boundaryLinks=!!angular.isDefined(t.boundaryLinks)&&r.$parent.$eval(t.boundaryLinks);var a=Math.max(r.maxSize,5);function s(e){if(d.isRegistered(i)&&c(e)){var t=r.pagination.current;r.pages=h(e,d.getCollectionLength(i),d.getItemsPerPage(i),a),r.pagination.current=e,u(),r.onPageChange&&r.onPageChange({newPageNumber:e,oldPageNumber:t})}}function l(){if(d.isRegistered(i)){var e=parseInt(d.getCurrentPage(i))||1;r.pages=h(e,d.getCollectionLength(i),d.getItemsPerPage(i),a),r.pagination.current=e,r.pagination.last=r.pages[r.pages.length-1],r.pagination.last
  • «
  • {{ pageNumber }}
  • »
  • ')}])}();var com_github_culmat_jsTreeTable=function(){function l(e,r,i){return i=i||"children",$.each(e,function(e,t){!function n(e){e[i]&&$.each(e[i],function(e,t){n(t)}),r(e)}(t)}),e}function t(e,n,o,a){var t=e;n=n||"id",o=o||"parent",a=a||"children";var s=[];$.each(t,function(e,t){s[t[n]]=t});var l=[];return $.each(t,function(e,r){var t=r[o];if($.isArray(t)||(t=[t]),0==t.length)l.push(r);else{var i=!1;$.each(t,function(e,t){var n=s[t];n&&(n[a]||(n[a]=[]),$.inArray(r,n[a])<0&&n[a].push(r),i=!0)}),i||l.push(r)}}),l}function u(e,u,c,d,p,t){u=u||"children",c=c||"id",t=t||{};var n=0,r=$("");$.each(t,function(e,t){"class"==e&&"jsTT"!=t?r.addClass(t):r.attr(e,t)});var i=$(""),o=$(""),h=$("");return r.append(i),i.append(o),r.append(h),d?$.each(d,function(e,t){$(o).append($(""))}):($(o).append($("")),$.each(e[0],function(e,t){e!=u&&e!=c&&$(o).append($(""))})),function o(e,a,s,l){n=Math.max(n,s),$.each(e,function(e,n){var r,t,i;n["data-tt-level"]=s,r=n,t=l,i=$(""),$(i).attr("data-tt-id",r[c]),$(i).attr("data-tt-level",r["data-tt-level"]),r[u]&&0!=r[u].length?$(i).attr("data-tt-isnode",!0):$(i).attr("data-tt-isleaf",!0),t&&$(i).attr("data-tt-parent-id",t[c]),p?p($(i),r):d?$.each(d,function(e,t){$(i).append($(""))}):($(i).append($("")),$.each(r,function(e,t){e!=u&&e!=c&&"data-tt-level"!=e&&$(i).append($(""))})),h.append(i),n[a]&&$.each(n[a],function(e,t){o([t],a,s+1,n)})})}(e,u,1),e[0]&&(e[0].maxLevel=n),r}function n(e,t){return $.each(e,function(e,n){$.each(t,function(e,t){n[t]=$(n).attr(t)})}),e}function c(i){i.addClass("jsTT"),i.expandLevel=function(n){$("tr[data-tt-level]",i).each(function(e){var t=parseInt($(this).attr("data-tt-level"));n-1')):r.prepend($('')),r.prepend($('')),t.trExpand=function(e){if(!(this.trChildren.length<1)){e&&(this.trChildrenVisible=!0,$("#state",this).get(0).src=o);var n=e||this.trChildrenVisible;$.each(this.trChildren,function(e,t){n&&$(t).css("display","table-row"),t.trExpand()})}},t.trCollapse=function(e){this.trChildren.length<1||(e&&(this.trChildrenVisible=!1,$("#state",this).get(0).src="data:image/png;base64,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"),$.each(this.trChildren,function(e,t){$(t).css("display","none"),t.trCollapse()}))},$(t).click(function(){this.trChildrenVisible?this.trCollapse(!0):this.trExpand(!0)})}),i}return{depthFirst:l,makeTree:t,renderTree:u,attr2attr:n,treeTable:c,appendTreetable:function(e,t){(t=t||{}).idAttr=t.idAttr||"id",t.childrenAttr=t.childrenAttr||"children";var n=t.controls||[];t.mountPoint||(t.mountPoint=$("body")),t.depthFirst&&l(e,t.depthFirst,t.childrenAttr);var r=u(e,t.childrenAttr,t.idAttr,t.renderedAttr,t.renderer,t.tableAttributes);c(r),t.replaceContent&&t.mountPoint.html("");var i,o,a=t.initialExpandLevel?parseInt(t.initialExpandLevel):-1;if(a=Math.min(a,e[0].maxLevel),r.expandLevel(a),t.slider){var s=$('
    ');s.width("200px"),s.slider({min:1,max:e[0].maxLevel,range:"min",value:a,slide:function(e,t){r.expandLevel(t.value)}}),n=[s].concat(t.controls)}return 0"),$.each(i,function(e,t){o.append($('
    "+t+""+c+""+e+"
    "+r[e]+""+r[c]+""+t+"').append(t))}),$('').append(o))),t.mountPoint.append(r),r},jsTreeTable:"1.0",register:function(n){$.each(this,function(e,t){"register"!=e&&(n[e]=t)})}}}(); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/gulpfile.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/gulpfile.js deleted file mode 100644 index 06ea3fc6..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/gulpfile.js +++ /dev/null @@ -1,134 +0,0 @@ -const gulp = require('gulp'); -const plugins = require('gulp-load-plugins')(); -const open = require('open'); -const app = { - srcPath: 'app/', // 源代码 - devPath: 'tmp/', // 开发打包 - prdPath: 'dist/' // 生产打包 -}; - -const JS_LIBS = [ - 'node_modules/angular-ui-router/release/angular-ui-router.js', - 'node_modules/oclazyload/dist/ocLazyLoad.min.js', - 'node_modules/angular-loading-bar/build/loading-bar.min.js', - 'node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js', - 'node_modules/moment/moment.js', - 'node_modules/angular-date-time-input/src/dateTimeInput.js', - 'node_modules/angularjs-bootstrap-datetimepicker/src/js/datetimepicker.js', - 'node_modules/angular-table-resize/dist/angular-table-resize.min.js', - 'node_modules/angular-clipboard/angular-clipboard.js', - 'node_modules/selectize/dist/js/standalone/selectize.js', - 'node_modules/angular-selectize2/dist/selectize.js', - 'node_modules/bootstrap-switch/dist/js/bootstrap-switch.min.js', - 'node_modules/ng-dialog/js/ngDialog.js', - 'node_modules/angular-ui-notification/dist/angular-ui-notification.min.js', - 'node_modules/angular-utils-pagination/dirPagination.js', - 'app/scripts/libs/treeTable.js', -]; - -const CSS_APP = [ - 'node_modules/angular-loading-bar/build/loading-bar.min.css', - 'node_modules/bootstrap-switch/dist/css/bootstrap3/bootstrap-switch.css', - 'node_modules/ng-dialog/css/ngDialog.min.css', - 'node_modules/ng-dialog/css/ngDialog-theme-default.css', - 'node_modules/angularjs-bootstrap-datetimepicker/src/css/datetimepicker.css', - 'node_modules/angular-ui-notification/dist/angular-ui-notification.min.css', - 'node_modules/angular-table-resize/dist/angular-table-resize.css', - 'node_modules/selectize/dist/css/selectize.css', - 'app/styles/page.css', - 'app/styles/timeline.css', - 'app/styles/main.css' -]; - -const JS_APP = [ - 'app/scripts/app.js', - 'app/scripts/filters/filters.js', - 'app/scripts/services/version_service.js', - 'app/scripts/services/auth_service.js', - 'app/scripts/services/appservice.js', - 'app/scripts/services/flow_service_v1.js', - 'app/scripts/services/flow_service_v2.js', - 'app/scripts/services/degrade_service.js', - 'app/scripts/services/systemservice.js', - 'app/scripts/services/machineservice.js', - 'app/scripts/services/identityservice.js', - 'app/scripts/services/metricservice.js', - 'app/scripts/services/param_flow_service.js', - 'app/scripts/services/authority_service.js', - 'app/scripts/services/cluster_state_service.js', - 'app/scripts/services/gateway/api_service.js', - 'app/scripts/services/gateway/flow_service.js', -]; - -gulp.task('lib', function () { - gulp.src(JS_LIBS) - .pipe(plugins.concat('app.vendor.js')) - .pipe(gulp.dest(app.devPath + 'js')) - .pipe(plugins.uglify()) - .pipe(gulp.dest(app.prdPath + 'js')) - .pipe(plugins.connect.reload()); -}); - -/* -* css任务 -* 在src下创建style文件夹,里面存放less文件。 -*/ -gulp.task('css', function () { - gulp.src(CSS_APP) - .pipe(plugins.concat('app.css')) - .pipe(gulp.dest(app.devPath + 'css')) - .pipe(plugins.cssmin()) - .pipe(gulp.dest(app.prdPath + 'css')) - .pipe(plugins.connect.reload()); -}); - -/* -* js任务 -* 在src目录下创建script文件夹,里面存放所有的js文件 -*/ -gulp.task('js', function () { - gulp.src(JS_APP) - .pipe(plugins.concat('app.js')) - .pipe(gulp.dest(app.devPath + 'js')) - .pipe(plugins.uglify()) - .pipe(gulp.dest(app.prdPath + 'js')) - .pipe(plugins.connect.reload()); -}); - -/* -* js任务 -* 在src目录下创建script文件夹,里面存放所有的js文件 -*/ -gulp.task('jshint', function () { - gulp.src(JS_APP) - .pipe(plugins.jshint()) - .pipe(plugins.jshint.reporter()); -}); - -// 每次发布的时候,可能需要把之前目录内的内容清除,避免旧的文件对新的容有所影响。 需要在每次发布前删除dist和build目录 -gulp.task('clean', function () { - gulp.src([app.devPath, app.prdPath]) - .pipe(plugins.clean()); -}); - -// 总任务 -gulp.task('build', ['clean', 'jshint', 'lib', 'js', 'css']); - -// 服务 -gulp.task('serve', ['build'], function () { - plugins.connect.server({ //启动一个服务器 - root: [app.devPath], // 服务器从哪个路径开始读取,默认从开发路径读取 - livereload: true, // 自动刷新 - port: 1234 - }); - // 打开浏览器 - setTimeout(() => { - open('http://localhost:8080/index_dev.htm') - }, 200); - // 监听 - gulp.watch(app.srcPath + '**/*.js', ['js']); - gulp.watch(app.srcPath + '**/*.css', ['css']); -}); - -// 定义default任务 -gulp.task('default', ['serve']); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index.htm b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index.htm deleted file mode 100644 index 24482898..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index.htm +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - Sentinel Dashboard - - - - - - - - - - - -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index_dev.htm b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index_dev.htm deleted file mode 100644 index 51131681..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/index_dev.htm +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - Sentinel 控制台 - - - - - - - - - - - -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css deleted file mode 100644 index c547283b..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css deleted file mode 100644 index 540440ce..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa1196aad98c2adf4378a7611dd713aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165548 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 z 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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2 b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc60404b91e398a37200c4a77b645cfd9586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77160 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 diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e7c8b556fc36f580c5ff524025bb11c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41236 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").append(a).html();try{return a[0].nodeType===Na?F(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+F(b)})}catch(c){return F(d)}}function wc(a){try{return decodeURIComponent(a)}catch(b){}} -function xc(a){var b={};n((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),y(e)&&(f=y(f)?wc(f):!0,qa.call(b,e)?I(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Qb(a){var b=[];n(a,function(a,c){I(a)?n(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}function ob(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi, -"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function Yd(a,b){var d,c,e=Oa.length;for(c=0;c/,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=eb(b,d.strictDi);c.invoke(["$rootScope", -"$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;S&&e.test(S.name)&&(d.debugInfoEnabled=!0,S.name=S.name.replace(e,""));if(S&&!f.test(S.name))return c();S.name=S.name.replace(f,"");fa.resumeBootstrap=function(a){n(a,function(a){b.push(a)});return c()};z(fa.resumeDeferredBootstrap)&&fa.resumeDeferredBootstrap()}function $d(){S.name="NG_ENABLE_DEBUG_INFO!"+S.name;S.location.reload()} -function ae(a){a=fa.element(a).injector();if(!a)throw Aa("test");return a.get("$$testability")}function zc(a,b){b=b||"_";return a.replace(be,function(a,c){return(c?b:"")+a.toLowerCase()})}function ce(){var a;if(!Ac){var b=pb();(oa=q(b)?S.jQuery:b?S[b]:u)&&oa.fn.on?(B=oa,M(oa.fn,{scope:Pa.scope,isolateScope:Pa.isolateScope,controller:Pa.controller,injector:Pa.injector,inheritedData:Pa.inheritedData}),a=oa.cleanData,oa.cleanData=function(b){var c;if(Rb)Rb=!1;else for(var e=0,f;null!=(f=b[e]);e++)(c= -oa._data(f,"events"))&&c.$destroy&&oa(f).triggerHandler("$destroy");a(b)}):B=N;fa.element=B;Ac=!0}}function qb(a,b,d){if(!a)throw Aa("areq",b||"?",d||"required");return a}function Qa(a,b,d){d&&I(a)&&(a=a[a.length-1]);qb(z(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ra(a,b){if("hasOwnProperty"===a)throw Aa("badname",b);}function Bc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g")+c[2];for(c=c[0];c--;)d=d.lastChild;f=cb(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";n(f,function(a){e.appendChild(a)});return e}function N(a){if(a instanceof N)return a;var b;E(a)&&(a=U(a), -b=!0);if(!(this instanceof N)){if(b&&"<"!=a.charAt(0))throw Ub("nosel");return new N(a)}if(b){b=X;var d;a=(d=Ef.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Mc(this,a)}function Vb(a){return a.cloneNode(!0)}function ub(a,b){b||vb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;cl&&this.remove(t.key);return b}},get:function(a){if(l").parent()[0])});var f=O(a,b,a,c,d,e);K.$$addScopeClass(a);var g=null;return function(b,c,d){qb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement;h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d= -d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?B(Yb(g,B("

    ").append(a).html())):c?Pa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);K.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);return d}}function O(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,t,w,D;if(p)for(D=Array(c.length),m=0;mq.priority)break;if(P=q.scope)q.templateUrl||(H(P)?(Ua("new/isolated scope",O||R,q,Z),O=q):Ua("new/isolated scope",O,q,Z)),R=R||q;x=q.name;!q.templateUrl&&q.controller&&(P=q.controller,T=T||$(),Ua("'"+x+"' controller",T[x],q,Z),T[x]=q);if(P=q.transclude)ga=!0,q.$$tlb||(Ua("transclusion",n,q,Z),n=q),"element"==P?(aa=!0,A=q.priority,P=Z,Z=d.$$element=B(X.createComment(" "+x+": "+d[x]+" ")),b=Z[0],Y(f,ra.call(P,0), -b),Ia=K(P,e,A,g&&g.name,{nonTlbTranscludeDirective:n})):(P=B(Vb(b)).contents(),Z.empty(),Ia=K(P,e,u,u,{needsNewScope:q.$$isolateScope||q.$$newScope}));if(q.template)if(L=!0,Ua("template",J,q,Z),J=q,P=z(q.template)?q.template(Z,d):q.template,P=ja(P),q.replace){g=q;P=Tb.test(P)?Xc(Yb(q.templateNamespace,U(P))):[];b=P[0];if(1!=P.length||1!==b.nodeType)throw ha("tplrt",x,"");Y(f,Z,b);P={$attr:{}};var Wc=V(b,[],P),W=a.splice(F+1,a.length-(F+1));(O||R)&&y(Wc,O,R);a=a.concat(Wc).concat(W);S(d,P);M=a.length}else Z.html(P); -if(q.templateUrl)L=!0,Ua("template",J,q,Z),J=q,q.replace&&(g=q),D=Of(a.splice(F,a.length-F),Z,d,f,ga&&Ia,h,l,{controllerDirectives:T,newScopeDirective:R!==q&&R,newIsolateScopeDirective:O,templateDirective:J,nonTlbTranscludeDirective:n}),M=a.length;else if(q.compile)try{G=q.compile(Z,d,Ia),z(G)?t(null,G,N,Q):G&&t(G.pre,G.post,N,Q)}catch(da){c(da,ua(Z))}q.terminal&&(D.terminal=!0,A=Math.max(A,q.priority))}D.scope=R&&!0===R.scope;D.transcludeOnThisElement=ga;D.templateOnThisElement=L;D.transclude=Ia; -m.hasElementTranscludeDirective=aa;return D}function y(a,b,c){for(var d=0,e=a.length;dm.priority)&&-1!=m.restrict.indexOf(f)&&(k&&(m=Ob(m,{$$start:k,$$end:l})),b.push(m),h=m)}catch(D){c(D)}}return h}function G(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function Q(a,b){if("srcdoc"==b)return L.HTML;var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return L.RESOURCE_URL}function W(a,c,d,e,f){var g=Q(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===ta(a))throw ha("selmulti",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,h){c=h.$$observers||(h.$$observers=$());if(l.test(e))throw ha("nodomevents"); -var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function Y(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;)8===a[b].nodeType&&Pf.call(a,b,1);return a}function Xe(){var a={},b=!1;this.register=function(b,c){Ra(b,"controller");H(b)?M(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!H(a.$scope))throw G("$controller")("noscp", -d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,r;h=!0===h;k&&E(k)&&(r=k);if(E(f)){k=f.match(Uc);if(!k)throw Qf("ctrlfmt",f);m=k[1];r=r||k[3];f=a.hasOwnProperty(m)?a[m]:Bc(g.$scope,m,!0)||(b?Bc(c,m,!0):u);Qa(f,m,!0)}if(h)return h=(I(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),r&&e(g,r,l,m||f.name),M(function(){var a=d.invoke(f,l,g,m);a!==l&&(H(a)||z(a))&&(l=a,r&&e(g,r,l,m||f.name));return l},{instance:l,identifier:r});l=d.instantiate(f,g,m);r&&e(g,r,l,m||f.name);return l}}]}function Ye(){this.$get= -["$window",function(a){return B(a.document)}]}function Ze(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function Zb(a){return H(a)?da(a)?a.toISOString():db(a):a}function df(){this.$get=function(){return function(a){if(!a)return"";var b=[];oc(a,function(a,c){null===a||q(a)||(I(a)?n(a,function(a,d){b.push(ja(c)+"="+ja(Zb(a)))}):b.push(ja(c)+"="+ja(Zb(a))))});return b.join("&")}}}function ef(){this.$get=function(){return function(a){function b(a,e,f){null===a||q(a)|| -(I(a)?n(a,function(a,c){b(a,e+"["+(H(a)?c:"")+"]")}):H(a)&&!da(a)?oc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+"="+ja(Zb(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function $b(a,b){if(E(a)){var d=a.replace(Rf,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf($c))||(c=(c=d.match(Sf))&&Tf[c[0]].test(d));c&&(a=uc(d))}}return a}function ad(a){var b=$(),d;E(a)?n(a.split("\n"),function(a){d=a.indexOf(":");var e=F(U(a.substr(0,d)));a=U(a.substr(d+1));e&& -(b[e]=b[e]?b[e]+", "+a:a)}):H(a)&&n(a,function(a,d){var f=F(d),g=U(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function bd(a){var b;return function(d){b||(b=ad(a));return d?(d=b[F(d)],void 0===d&&(d=null),d):b}}function cd(a,b,d,c){if(z(c))return c(a,b,d);n(c,function(c){a=c(a,b,d)});return a}function cf(){var a=this.defaults={transformResponse:[$b],transformRequest:[function(a){return H(a)&&"[object File]"!==sa.call(a)&&"[object Blob]"!==sa.call(a)&&"[object FormData]"!==sa.call(a)?db(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"}, -post:ia(ac),put:ia(ac),patch:ia(ac)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return y(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return y(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a){var b=M({},a);b.data=cd(a.data,a.headers,a.status,f.transformResponse); -a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};n(a,function(a,e){z(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!fa.isObject(b))throw G("$http")("badreq",b);var f=M({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=M({},b.headers),f,g,h,c=M({},c.common,c[F(b.method)]);a:for(f in c){g=F(f);for(h in d)if(F(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b); -f.method=sb(f.method);f.paramSerializer=E(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=cd(b.data,bd(d),u,b.transformRequest);q(e)&&n(d,function(a,b){"content-type"===F(b)&&delete d[b]});q(b.withCredentials)&&!q(a.withCredentials)&&(b.withCredentials=a.withCredentials);return r(b,e).then(c,c)},u],h=k.when(f);for(n(v,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b= -g.shift();var m=g.shift(),h=h.then(b,m)}d?(h.success=function(a){Qa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Qa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=dd("success"),h.error=dd("error"));return h}function r(c,d){function g(a,c,d,e){function f(){l(c,a,d,e)}J&&(200<=a&&300>a?J.put(R,[a,c,ad(d),e]):J.remove(R));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function l(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?n.resolve: -n.reject)({data:a,status:b,headers:bd(d),config:c,statusText:e})}function r(a){l(a.data,a.status,ia(a.headers()),a.statusText)}function v(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var n=k.defer(),D=n.promise,J,K,O=c.headers,R=t(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);D.then(v,v);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(J=H(c.cache)?c.cache:H(a.cache)?a.cache:A);J&&(K=J.get(R),y(K)?K&&z(K.then)?K.then(r,r):I(K)?l(K[1], -K[0],ia(K[2]),K[3]):l(K,200,{},"OK"):J.put(R,D));q(K)&&((K=ed(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:u)&&(O[c.xsrfHeaderName||a.xsrfHeaderName]=K),e(c.method,R,d,g,O,c.timeout,c.withCredentials,c.responseType));return D}function t(a,b){0=k&&(p.resolve(v),A(C.$$intervalId),delete f[C.$$intervalId]);n||a.$apply()},h);f[C.$$intervalId]=p;return C}var f={};e.cancel=function(a){return a&&a.$$intervalId in f?(f[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete f[a.$$intervalId],!0):!1};return e}]}function bc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=ob(a[b]);return a.join("/")}function fd(a,b){var d=wa(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=ea(d.port)||Vf[d.protocol]|| -null}function gd(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=wa(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function pa(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Fa(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function ib(a){return a.replace(/(#.+)|#$/,"$1")}function cc(a,b,d){this.$$html5=!0;d=d||""; -fd(a,this);this.$$parse=function(a){var d=pa(b,a);if(!E(d))throw Db("ipthprfx",a,b);gd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Qb(this.$$search),d=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=bc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;y(f=pa(a,c))?(g=f,g=y(f=pa(d,f))?b+(pa("/",f)||f):a+g):y(f=pa(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g); -return!!g}}function dc(a,b,d){fd(a,this);this.$$parse=function(c){var e=pa(a,c)||pa(b,c),f;q(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",q(e)&&(a=c,this.replace())):(f=pa(d,e),q(f)&&(f=e));gd(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Qb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=bc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url? -d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Fa(a)==Fa(b)?(this.$$parse(b),!0):!1}}function hd(a,b,d){this.$$html5=!0;dc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Fa(c)?f=c:(g=pa(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Qb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=bc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Eb(a){return function(){return this[a]}} -function id(a,b){return function(d){if(q(d))return this[a];this[a]=b(d);this.$$compose();return this}}function hf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return y(b)?(a=b,this):a};this.html5Mode=function(a){return $a(a)?(b.enabled=a,this):H(a)?($a(a.enabled)&&(b.enabled=a.enabled),$a(a.requireBase)&&(b.requireBase=a.requireBase),$a(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window", -function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var r=c.url(),t;if(b.enabled){if(!m&&b.requireBase)throw Db("nobase");t=r.substring(0,r.indexOf("/",r.indexOf("//")+2))+(m||"/");m=e.history?cc:hd}else t=Fa(r),m=dc;var A=t.substr(0,Fa(t).lastIndexOf("/")+1);l=new m(t,A,"#"+a);l.$$parseLinkUrl(r,r);l.$$state= -c.state();var v=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");H(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=wa(h.animVal).href);v.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]= -!0))}});ib(l.absUrl())!=ib(r)&&c.url(l.absUrl(),!0);var n=!0;c.onUrlChange(function(a,b){q(pa(A,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=ib(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(n=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=ib(c.url()),b=ib(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(n|| -m)n=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function jf(){var a=!0,b=this;this.debugEnabled=function(b){return y(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&& -(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||x;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];n(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Va(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"=== -a||"__proto__"===a)throw ba("isecfld",b);return a}function jd(a,b){a+="";if(!E(a))throw ba("iseccst",b);return a}function xa(a,b){if(a){if(a.constructor===a)throw ba("isecfn",b);if(a.window===a)throw ba("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ba("isecdom",b);if(a===Object)throw ba("isecobj",b);}return a}function kd(a,b){if(a){if(a.constructor===a)throw ba("isecfn",b);if(a===Wf||a===Xf||a===Yf)throw ba("isecff",b);}}function ld(a,b){if(a&&(a===(0).constructor||a=== -(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw ba("isecaf",b);}function Zf(a,b){return"undefined"!==typeof a?a:b}function md(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function W(a,b){var d,c;switch(a.type){case s.Program:d=!0;n(a.body,function(a){W(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:W(a.argument,b);a.constant=a.argument.constant; -a.toWatch=a.argument.toWatch;break;case s.BinaryExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:W(a.test,b);W(a.alternate,b);W(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant= -!1;a.toWatch=[a];break;case s.MemberExpression:W(a.object,b);a.computed&&W(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];n(a.arguments,function(a){W(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant; -a.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];n(a.elements,function(a){W(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=!0;c=[];n(a.properties,function(a){W(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1,a.toWatch=[]}}function nd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:u}} -function od(a){return a.type===s.Identifier||a.type===s.MemberExpression}function pd(a){if(1===a.body.length&&od(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function qd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function rd(a,b){this.astBuilder=a;this.$filter=b}function sd(a, -b){this.astBuilder=a;this.$filter=b}function Fb(a){return"constructor"==a}function ec(a){return z(a.valueOf)?a.valueOf():$f.call(a)}function kf(){var a=$(),b=$();this.$get=["$filter",function(d){function c(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=ec(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function e(a,b,d,e,f){var g=e.inputs,h;if(1===g.length){var k=c,g=g[0];return a.$watch(function(a){var b=g(a);c(b,k)||(h=e(a,u,u,[b]),k=b&&ec(b));return h},b,d,f)}for(var l=[],m=[],r=0,n= -g.length;r=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;fa)for(b in l++,f)qa.call(e,b)||(n--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,g,k=1n&&(v=4-n,q[v]||(q[v]=[]),q[v].push({msg:z(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:f,oldVal:h}));else if(a===c){r=!1;break a}}catch(y){g(y)}if(!(l=A.$$watchersCount&&A.$$childHead||A!==this&&A.$$nextSibling))for(;A!==this&&!(l=A.$$nextSibling);)A=A.$parent}while(A=l);if((r||u.length)&&!n--)throw w.$$phase=null,d("infdig", -b,q);}while(r||u.length);for(w.$$phase=null;L.length;)try{L.shift()()}catch(x){g(x)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===w&&k.$$applicationDestroyed();A(this,-this.$$watchersCount);for(var b in this.$$listenerCount)v(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling= -this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=x;this.$on=this.$watch=this.$watchGroup=function(){return x};this.$$listeners={};this.$$nextSibling=null;m(this)}},$eval:function(a,b){return h(a)(this,b)},$evalAsync:function(a,b){w.$$phase||u.length||k.defer(function(){u.length&&w.$digest()});u.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){L.push(a)},$apply:function(a){try{t("$apply"); -try{return this.$eval(a)}finally{w.$$phase=null}}catch(b){g(b)}finally{try{w.$digest()}catch(c){throw g(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&aa.push(b);C()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,v(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,f=!1,h= -{name:a,targetScope:e,stopPropagation:function(){f=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=cb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;lHa)throw ya("iequirks");var c=ia(la);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ya);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;n(la,function(a, -b){var d=F(b);c[fb("parse_as_"+d)]=function(b){return e(a,b)};c[fb("get_trusted_"+d)]=function(b){return f(a,b)};c[fb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function qf(){this.$get=["$window","$document",function(a,b){var d={},c=ea((/android (\d+)/.exec(F((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),f=b[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,k=f.body&&f.body.style,l=!1,m=!1;if(k){for(var r in k)if(l=h.exec(r)){g=l[0];g=g.substr(0,1).toUpperCase()+ -g.substr(1);break}g||(g="WebkitOpacity"in k&&"webkit");l=!!("transition"in k||g+"Transition"in k);m=!!("animation"in k||g+"Animation"in k);!c||l&&m||(l=E(k.webkitTransition),m=E(k.webkitAnimation))}return{history:!(!a.history||!a.history.pushState||4>c||e),hasEvent:function(a){if("input"===a&&11>=Ha)return!1;if(q(d[a])){var b=f.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ba(),vendorPrefix:g,transitions:l,animations:m,android:c}}]}function sf(){this.$get=["$templateCache","$http","$q","$sce", -function(a,b,d,c){function e(f,g){e.totalPendingRequests++;E(f)&&a.get(f)||(f=c.getTrustedResourceUrl(f));var h=b.defaults&&b.defaults.transformResponse;I(h)?h=h.filter(function(a){return a!==$b}):h===$b&&(h=null);return b.get(f,{cache:a,transformResponse:h})["finally"](function(){e.totalPendingRequests--}).then(function(b){a.put(f,b.data);return b.data},function(a){if(!g)throw ha("tpload",f,a.status,a.statusText);return d.reject(a)})}e.totalPendingRequests=0;return e}]}function tf(){this.$get=["$rootScope", -"$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];n(a,function(a){var c=fa.element(a).data("$binding");c&&n(c,function(c){d?(new RegExp("(^|\\s)"+ud(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;ha;a=Math.abs(a);var g=Infinity===a;if(!g&&!isFinite(a))return"";var h=a+"",k="",l=!1,m=[];g&&(k="\u221e");if(!g&&-1!==h.indexOf("e")){var r=h.match(/([\d\.]+)e(-?)(\d+)/);r&&"-"==r[2]&&r[3]>e+1?a=0:(k=h,l=!0)}if(g||l)0a&&(k=a.toFixed(e),a=parseFloat(k),k=k.replace(ic,c));else{g=(h.split(ic)[1]||"").length; -q(e)&&(e=Math.min(Math.max(b.minFrac,g),b.maxFrac));a=+(Math.round(+(a.toString()+"e"+e)).toString()+"e"+-e);var g=(""+a).split(ic),h=g[0],g=g[1]||"",r=0,t=b.lgSize,n=b.gSize;if(h.length>=t+n)for(r=h.length-t,l=0;la&&(c="-",a=-a);for(a=""+a;a.length-d)e+=d;0===e&&-12==d&&(e=12);return Gb(e,b,c)}}function Hb(a,b){return function(d,c){var e=d["get"+a](),f=sb(b?"SHORT"+a:a);return c[f][e]}}function Dd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Ed(a){return function(b){var d=Dd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))- -+d;b=1+Math.round(b/6048E5);return Gb(b,a)}}function jc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function zd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ea(b[9]+b[10]),g=ea(b[9]+b[11]));h.call(a,ea(b[1]),ea(b[2])-1,ea(b[3]));f=ea(b[4]||0)-f;g=ea(b[5]||0)-g;h=ea(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; -return function(c,d,f){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;E(c)&&(c=hg.test(c)?ea(c):b(c));Q(c)&&(c=new Date(c));if(!da(c)||!isFinite(c.getTime()))return c;for(;d;)(l=ig.exec(d))?(h=cb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=vc(f,c.getTimezoneOffset()),c=Pb(c,f,!0));n(h,function(b){k=jg[b];g+=k?k(c,a.DATETIME_FORMATS,m):b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function cg(){return function(a,b){q(b)&&(b=2);return db(a,b)}}function dg(){return function(a, -b,d){b=Infinity===Math.abs(Number(b))?Number(b):ea(b);if(isNaN(b))return a;Q(a)&&(a=a.toString());if(!I(a)&&!E(a))return a;d=!d||isNaN(d)?0:ea(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Bd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=Ya;if(z(b))h=b;else if(E(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h, -descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(!za(a))return a;I(e)||(e=[e]);0===e.length&&(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"===c)a:{if("function"===typeof e.valueOf&& -(e=e.valueOf(),d(e)))break a;if(qc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;db||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut", -m)}b.on("change",k);c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Kb(a,b){return function(d,c){var e,f;if(da(d))return d;if(E(d)){'"'==d.charAt(0)&&'"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(kg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0, -mm:0,ss:0,sss:0},n(e,function(a,c){c=s};g.$observe("min",function(a){s=n(a);h.$validate()})}if(y(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!r(a)||q(p)||d(a)<=p};g.$observe("max",function(a){p=n(a);h.$validate()})}}}function Hd(a,b,d,c){(c.$$hasNativeValidators=H(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{}; -return c.badInput&&!c.typeMismatch?u:a})}function Id(a,b,d,c,e){if(y(c)){a=a(c);if(!a.constant)throw lb("constexpr",d,c);return a(b)}return e}function lc(a,b){a="ngClass"+a;return["$animate",function(d){function c(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Tb=/<|&#?\w+;/, -Cf=/<([\w:-]+)/,Df=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,ka={option:[1,'"],thead:[1,"
    ","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ka.optgroup=ka.option;ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead;ka.th=ka.td;var Kf=Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)& -16)},Pa=N.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===X.readyState?setTimeout(b):(this.on("DOMContentLoaded",b),N(S).on("load",b))},toString:function(){var a=[];n(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:mg,sort:[].sort,splice:[].splice},Cb={};n("multiple selected checked disabled readOnly required open".split(" "),function(a){Cb[F(a)]=a});var Rc={};n("input select option textarea button form details".split(" "), -function(a){Rc[a]=!0});var Zc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};n({data:Wb,removeData:vb,hasData:function(a){for(var b in gb[a.ng339])return!0;return!1}},function(a,b){N[b]=a});n({data:Wb,inheritedData:Bb,scope:function(a){return B.data(a,"$scope")||Bb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return B.data(a,"$isolateScope")||B.data(a,"$isolateScopeNoTemplate")},controller:Oc,injector:function(a){return Bb(a, -"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:yb,css:function(a,b,d){b=fb(b);if(y(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Na&&2!==c&&8!==c)if(c=F(b),Cb[c])if(y(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||x).specified?c:u;else if(y(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?u:a},prop:function(a,b,d){if(y(d))a[b]=d;else return a[b]}, -text:function(){function a(a,d){if(q(d)){var c=a.nodeType;return 1===c||c===Na?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(q(b)){if(a.multiple&&"select"===ta(a)){var d=[];n(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(q(b))return a.innerHTML;ub(a,!0);a.innerHTML=b},empty:Pc},function(a,b){N.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Pc&&q(2==a.length&&a!==yb&&a!==Oc? -b:c)){if(H(b)){for(e=0;e <= >= && || ! = |".split(" "),function(a){Lb[a]=!0});var sg={n:"\n",f:"\f",r:"\r", -t:"\t",v:"\v","'":"'",'"':'"'},fc=function(a){this.options=a};fc.prototype={constructor:fc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a|| -"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=y(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ba("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:b.text, -left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=bb(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant(): -this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:s.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(), -arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break; -a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:s.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:s.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}}, -throwError:function(a,b){throw ba("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ba("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ba("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a]; -var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},constants:{"true":{type:s.Literal,value:!0},"false":{type:s.Literal,value:!1},"null":{type:s.Literal,value:null},undefined:{type:s.Literal,value:u},"this":{type:s.ThisExpression}}};rd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[], -body:[],own:{}},inputs:[]};W(c,d.$filter);var e="",f;this.stage="assign";if(f=pd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+this.generateFunction("assign","s,v,l");f=nd(c.body);d.stage="inputs";n(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+ -'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",e))(this.$filter,Va,xa,kd,jd,ld,Zf,md,a);this.state=this.stage=u;e.literal=qd(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;n(b,function(b){a.push("var "+b+"="+d.generateFunction(b, -"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;n(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b, -d,c,e,f){var g,h,k=this,l,m;c=c||x;if(!f&&y(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case s.Program:n(a.body,function(b,c){k.recurse(b.expression,u,u,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case s.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;case s.UnaryExpression:this.recurse(a.argument,u,u,function(a){h=a});m=a.operator+"("+this.ifDefined(h, -0)+")";this.assign(b,m);c(m);break;case s.BinaryExpression:this.recurse(a.left,u,u,function(a){g=a});this.recurse(a.right,u,u,function(a){h=a});m="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test, -b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Va(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s", -a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Fb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case s.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,u,function(){k.if_(k.notNull(g),function(){if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g, -h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Va(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Fb(a.property.name))m=k.ensureSafeObject(m);k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],n(a.arguments, -function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);n(a.arguments,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)}, -function(){k.assign(b,"undefined")});c(b)}));break;case s.AssignmentExpression:h=this.nextId();g={};if(!od(a.left))throw ba("lval");this.recurse(a.left,u,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case s.ArrayExpression:l=[];n(a.elements,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(a)})}); -m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case s.ObjectExpression:l=[];n(a.properties,function(a){k.recurse(a.value,k.nextId(),u,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:""+a.key.value)+":"+b)})});m="{"+l.join(",")+"}";this.assign(b,m);c(m);break;case s.ThisExpression:this.assign(b,"s");c("s");break;case s.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+ -this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a, -"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){return a+"."+b},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")}, -addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+",text)")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+ -a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(E(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(Q(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"=== -typeof a)return"undefined";throw ba("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;W(c,d.$filter);var e,f;if(e=pd(c))f=this.recurse(e);e=nd(c.body);var g;e&&(g=[],n(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];n(c.body,function(a){h.push(d.recurse(a.expression))}); -e=0===c.body.length?function(){}:1===c.body.length?h[0]:function(a,b){var c;n(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=qd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left), -e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Va(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Fb(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Va(a.property.name, -f.expression),e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],n(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var r=[],n=0;n":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c, -e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:u,name:u,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f= -g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:u;b&&xa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),m,n;null!=l&&(m=b(f,g,h,k),m=jd(m),Va(m,e),c&&1!==c&&l&&!l[m]&&(l[m]={}),n=l[m],xa(n,e));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&g&&!g[b]&&(g[b]={});h=null!=g?g[b]:u;(d||Fb(b))&&xa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a, -b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var gc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(this.lexer);this.astCompiler=d.csp?new sd(this.ast,b):new rd(this.ast,b)};gc.prototype={constructor:gc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};$();$();var $f=Object.prototype.valueOf,ya=G("$sce"),la={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ha=G("$compile"),Y=X.createElement("a"),wd=wa(S.location.href); -xd.$inject=["$document"];Jc.$inject=["$provide"];yd.$inject=["$locale"];Ad.$inject=["$locale"];var ic=".",jg={yyyy:ca("FullYear",4),yy:ca("FullYear",2,0,!0),y:ca("FullYear",1),MMMM:Hb("Month"),MMM:Hb("Month",!0),MM:ca("Month",2,1),M:ca("Month",1,1),dd:ca("Date",2),d:ca("Date",1),HH:ca("Hours",2),H:ca("Hours",1),hh:ca("Hours",2,-12),h:ca("Hours",1,-12),mm:ca("Minutes",2),m:ca("Minutes",1),ss:ca("Seconds",2),s:ca("Seconds",1),sss:ca("Milliseconds",3),EEEE:Hb("Day"),EEE:Hb("Day",!0),a:function(a,b){return 12> -a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Gb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},ig=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,hg=/^\-?\d+$/;zd.$inject=["$locale"];var eg=na(F),fg=na(sb);Bd.$inject=["$parse"];var he=na({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a, -b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===sa.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),tb={};n(Cb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=va("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});tb[c]=function(){return{restrict:"A",priority:100,link:e}}}});n(Zc,function(a,b){tb[b]=function(){return{priority:100,link:function(a, -c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(lg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});n(["src","srcset","href"],function(a){var b=va("ng-"+a);tb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===sa.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ha&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}}); -var Ib={$addControl:x,$$renameControl:function(a,b){a.$name=b},$removeControl:x,$setValidity:x,$setDirty:x,$setPristine:x,$setSubmitted:x};Fd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Nd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||x}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Fd,compile:function(d,f){d.addClass(Wa).addClass(mb);var g=f.name?"name":a&&f.ngForm?"ngForm": -!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in e)){var q=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",q,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",q,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):x;g&&(s(a,n),e.$observe(g,function(b){n.$name!==b&&(s(a,u),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n); -s(a,u);M(n,Ib)})}}}}}]},ie=Nd(),ve=Nd(!0),kg=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,tg=/^[A-Za-z][A-Za-z\d.+-]*:\/*(?:\w+(?::\w+)?@)?[^\s/]+(?::\d+)?(?:\/[\w#!:.?+=&%@\-/]*)?$/,ug=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,vg=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Od=/^(\d{4})-(\d{2})-(\d{2})$/,Pd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,mc=/^(\d{4})-W(\d\d)$/,Qd=/^(\d{4})-(\d\d)$/, -Rd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Sd={text:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c)},date:kb("date",Od,Kb(Od,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Pd,Kb(Pd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Rd,Kb(Rd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",mc,function(a,b){if(da(a))return a;if(E(a)){mc.lastIndex=0;var d=mc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Dd(c),e=7*(e-1);b&&(d=b.getHours(),f= -b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:kb("month",Qd,Kb(Qd,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Hd(a,b,d,c);jb(a,b,d,c,e,f);c.$$parserName="number";c.$parsers.push(function(a){return c.$isEmpty(a)?null:vg.test(a)?parseFloat(a):u});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!Q(a))throw lb("numfmt",a);a=a.toString()}return a});if(y(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)|| -q(g)||a>=g};d.$observe("min",function(a){y(a)&&!Q(a)&&(a=parseFloat(a,10));g=Q(a)&&!isNaN(a)?a:u;c.$validate()})}if(y(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||q(h)||a<=h};d.$observe("max",function(a){y(a)&&!Q(a)&&(a=parseFloat(a,10));h=Q(a)&&!isNaN(a)?a:u;c.$validate()})}},url:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||tg.test(d)}},email:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c); -c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||ug.test(d)}},radio:function(a,b,d,c){q(d.name)&&b.attr("name",++nb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Id(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Id(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&& -a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return ma(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:x,button:x,submit:x,reset:x,file:x},Dc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Sd[F(g.type)]||Sd.text)(e,f,g,h[0],b,a,d,c)}}}}],wg=/^(true|false|\d+)$/,Ne=function(){return{restrict:"A",priority:100,compile:function(a, -b){return wg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},ne=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=q(a)?"":a})}}}}],pe=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate)); -b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=q(a)?"":a})}}}}],oe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Me=na({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}), -qe=lc("",!0),se=lc("Odd",0),re=lc("Even",1),te=La({compile:function(a,b){b.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ue=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ic={},xg={blur:!0,focus:!0};n("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=va("ng-"+a);Ic[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g= -d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};xg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var xe=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(b,d,c,e,f){var g,h,k;b.$watch(c.ngIf,function(b){b?h||f(function(b,e){h=e;b[b.length++]=X.createComment(" end ngIf: "+c.ngIf+" ");g={clone:b};a.enter(b,d.parent(),d)}):(k&&(k.remove(),k=null),h&&(h.$destroy(),h=null),g&&(k= -rb(g.clone),a.leave(k).then(function(){k=null}),g=null))})}}}],ye=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:fa.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,m,n,q){var s=0,v,u,p,C=function(){u&&(u.remove(),u=null);v&&(v.$destroy(),v=null);p&&(d.leave(p).then(function(){u=null}),u=p,p=null)};c.$watch(f,function(f){var m=function(){!y(h)||h&&!c.$eval(h)|| -b()},u=++s;f?(a(f,!0).then(function(a){if(u===s){var b=c.$new();n.template=a;a=q(b,function(a){C();d.enter(a,null,e).then(m)});v=b;p=a;v.$emit("$includeContentLoaded",f);c.$eval(g)}},function(){u===s&&(C(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(C(),n.template=null)})}}}}],Pe=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){/SVG/.test(d[0].toString())?(d.empty(),a(Lc(e.template,X).childNodes)(b,function(a){d.append(a)}, -{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],ze=La({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),Le=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?U(e):e;c.$parsers.push(function(a){if(!q(a)){var b=[];a&&n(a.split(g),function(a){a&&b.push(f?U(a):a)});return b}});c.$formatters.push(function(a){return I(a)?a.join(e):u});c.$isEmpty=function(a){return!a|| -!a.length}}}},mb="ng-valid",Jd="ng-invalid",Wa="ng-pristine",Jb="ng-dirty",Ld="ng-pending",lb=G("ngModel"),yg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1; -this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Ib;var m=e(d.ngModel),r=m.assign,t=m,s=r,v=null,B,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");t=function(a){var c=m(a);z(c)&&(c=b(a));return c};s=function(a,b){z(m(a))?f(a,{$$$p:p.$modelValue}):r(a,p.$modelValue)}}else if(!m.assign)throw lb("nonassign",d.ngModel,ua(c));};this.$render=x;this.$isEmpty= -function(a){return q(a)||""===a||null===a||a!==a};var C=0;Gd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;f.removeClass(c,Jb);f.addClass(c,Wa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Wa);f.addClass(c,Jb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched= -!0;p.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(v);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!Q(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:u,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c= -!0;n(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(n(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;n(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!z(h.then))throw lb("$asyncValidators",h);f(g,u);c.push(h.then(function(){f(g,!0)},function(a){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},x):g(!0)}function f(a,b){h===C&&p.$setValidity(a,b)}function g(a){h===C&&c(a)}C++;var h=C;(function(){var a=p.$$parserName||"parse";if(q(B))f(a, -null);else return B||(n(p.$validators,function(a,b){f(b,null)}),n(p.$asyncValidators,function(a,b){f(b,null)})),f(a,B),B;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(v);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;if(B=q(b)?u:!0)for(var c=0;ce||c.$isEmpty(b)||b.length<=e}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=ea(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};S.angular.bootstrap? -console.log("WARNING: Tried to load angular more than once."):(ce(),ee(fa),fa.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "), -SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4", -negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",pluralCat:function(a,c){var e=a|0,f=c;u===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),B(X).ready(function(){Zd(X,yc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''); -//# sourceMappingURL=angular.min.js.map diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js deleted file mode 100644 index 1a6258ef..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js deleted file mode 100644 index 74ec9541..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/g2.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.G2_3=e():t.G2_3=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=389)}([function(t,e,n){var i=n(127),r=n(16),a=i.mix({},i,{assign:i.mix,merge:i.deepMix,cloneDeep:i.clone,isFinite:isFinite,isNaN:isNaN,snapEqual:i.isNumberEqual,remove:i.pull,inArray:i.contains,toAllPadding:function(t){var e=0,n=0,i=0,r=0;return a.isNumber(t)||a.isString(t)?e=n=i=r=t:a.isArray(t)?(e=t[0],i=a.isNil(t[1])?t[0]:t[1],r=a.isNil(t[2])?t[0]:t[2],n=a.isNil(t[3])?i:t[3]):a.isObject(t)&&(e=t.top||0,i=t.right||0,r=t.bottom||0,n=t.left||0),[e,i,r,n]},getClipByRange:function(t){var e=t.tl,n=t.br;return new r.Rect({attrs:{x:e.x,y:e.y,width:n.x-e.x,height:n.y-e.y}})}});a.Array={groupToMap:i.groupToMap,group:i.group,merge:i.merge,values:i.valuesOfKey,getRange:i.getRange,firstValue:i.firstValue,remove:i.pull},t.exports=a},function(t,e,n){var i=n(81),r={};i.merge(r,i,{mixin:function(t,e){var n=t.CFG?"CFG":"ATTRS";if(t&&e){t._mixins=e,t[n]=t[n]||{};var i={};r.each(e,function(e){r.augment(t,e);var a=e[n];a&&r.merge(i,a)}),t[n]=r.merge(i,t[n])}}}),t.exports=r},function(t,e,n){var i=n(24),r=n(4);t.exports=function(t,e){if(t)if(r(t))for(var n=0,a=t.length;n0){var a=e.strokeOpacity;i.isNil(a)||1===a||(t.globalAlpha=a),t.stroke()}}this.afterPath(t)},afterPath:function(){},isHitBox:function(){return!0},isHit:function(t,e){var n=[t,e,1];if(this.invert(n),this.isHitBox()){var i=this.getBBox();if(i&&!o.box(i.minX,i.maxX,i.minY,i.maxY,n[0],n[1]))return!1}var r=this._attrs.clip;return r?(r.invert(n,this.get("canvas")),!!r.isPointInPath(n[0],n[1])&&this.isPointInPath(n[0],n[1])):this.isPointInPath(n[0],n[1])},calculateBox:function(){return null},getHitLineWidth:function(){var t=this._attrs,e=t.lineAppendWidth||0;return(t.lineWidth||0)+e},clearTotalMatrix:function(){this._cfg.totalMatrix=null,this._cfg.region=null},clearBBox:function(){this._cfg.box=null,this._cfg.region=null},getBBox:function(){var t=this._cfg.box;return t||((t=this.calculateBox())&&(t.x=t.minX,t.y=t.minY,t.width=t.maxX-t.minX,t.height=t.maxY-t.minY),this._cfg.box=t),t},clone:function(){var t=null,e=this._attrs,n={};return i.each(e,function(t,r){l[r]&&i.isArray(e[r])?n[r]=function(t){for(var e=[],n=0;n1){var y=f[1];y.change({nice:!1,min:0,max:Math.max.apply(null,y.values)})}s.scales=f;var x=new a[c](s);t[o]=x}},n._processData=function(){for(var t=this.get("data"),e=[],n=this._groupData(t),i=0;ia&&(a=c)}(re.max)&&e.change({min:r,max:a})},n._adjust=function(t){var e=this,n=e.get("adjusts"),i=this.viewTheme||u,r=e.getYScale(),a=e.getXScale(),s=a.field,c=r?r.field:null;l.each(n,function(n){var u=l.mix({xField:s,yField:c},n),h=l.upperFirst(n.type);if("Dodge"===h){var f=[];if(a.isCategory||a.isIdentity)f.push("x");else{if(r)throw new Error("dodge is not support linear attribute, please use category attribute!");f.push("y")}u.adjustNames=f,u.dodgeRatio=i.widthRatio.column}else if("Stack"===h){var p=e.get("coord");if(!r){u.height=p.getHeight();var g=e.getDefaultValue("size")||3;u.size=g}!p.isTransposed&&l.isNil(u.reverseOrder)&&(u.reverseOrder=!0)}new o[h](u).processAdjust(t),"Stack"===h&&r&&e._updateStackRange(c,r,t)})},n.setCoord=function(t){this.set("coord",t);var e=this.getAttr("position");this.get("shapeContainer").setMatrix(t.matrix),e&&(e.coord=t)},n.paint=function(){var t=this.get("dataArray"),e=[],n=this.getShapeFactory();n.setCoord(this.get("coord")),this.set("shapeFactory",n);var i=this.get("shapeContainer");this._beforeMapping(t);for(var r=0;r=0?e:n<=0?n:0},n._normalizeValues=function(t,e){var n=[];if(l.isArray(t))for(var i=0;i1)for(var h=0;h0)l.each(n,function(n){e+="-"+t[n]});else{var i,r=this.get("type"),a=this.getXScale(),o=this.getYScale(),s=a.field||"x",u=o.field||"y",c=t[u];i=a.isIdentity?a.value:t[s],e+="interval"===r||"schema"===r?"-"+i:"line"===r||"area"===r||"path"===r?"-"+r:"-"+i+"-"+c;var h=this._getGroupScales();l.isEmpty(h)||l.each(h,function(n){var i=n.field;"identity"!==n.type&&(e+="-"+t[i])})}return e},n.getDrawCfg=function(t){var e={origin:t,x:t.x,y:t.y,color:t.color,size:t.size,shape:t.shape,isInCircle:this.isInCircle(),opacity:t.opacity},n=this.get("styleOptions");return n&&n.style&&(e.style=this.getCallbackCfg(n.fields,n.style,t._origin)),this.get("generatePoints")&&(e.points=t.points,e.nextPoints=t.nextPoints),this.get("animate")&&(e._id=this._getShapeId(t._origin)),e},n.appendShapeInfo=function(t,e){t&&(t.setSilent("index",e),t.setSilent("coord",this.get("coord")),this.get("animate")&&this.get("animateCfg")&&t.setSilent("animateCfg",this.get("animateCfg")))},n._applyViewThemeShapeStyle=function(t,e,n){var i=this.viewTheme||u,r=n.name;e?e&&(e.indexOf("hollow")>-1||e.indexOf("liquid")>-1)&&(r="hollow"+l.upperFirst(r)):n.defaultShapeType.indexOf("hollow")>-1&&(r="hollow"+l.upperFirst(r));var a=i.shape[r]||{};t.style=l.mix({},a,t.style)},n.drawPoint=function(t,e,n,i){var r=t.shape,a=this.getDrawCfg(t);this._applyViewThemeShapeStyle(a,r,n);var o=n.drawShape(r,a,e);this.appendShapeInfo(o,i)},n.getAttr=function(t){return this.get("attrs")[t]},n.getXScale=function(){return this.getAttr("position").scales[0]},n.getYScale=function(){return this.getAttr("position").scales[1]},n.getShapes=function(){var t=[],e=this.get("shapeContainer").get("children");return l.each(e,function(e){e.get("origin")&&t.push(e)}),t},n.getAttrsForLegend=function(){var t=this.get("attrs"),e=[];return l.each(t,function(t){-1!==v.indexOf(t.type)&&e.push(t)}),e},n.getFieldsForLegend=function(){var t=[],e=this.get("attrOptions");return l.each(v,function(n){var i=e[n];i&&i.field&&l.isString(i.field)&&(t=t.concat(i.field.split("*")))}),l.uniq(t)},n.changeVisible=function(t,e){this.set("visible",t);var n=this.get("shapeContainer");n&&n.set("visible",t);var i=this.get("labelContainer");if(i&&i.set("visible",t),!e&&n){n.get("canvas").draw()}},n.reset=function(){this.set("attrOptions",{}),this.clearInner()},n.clearInner=function(){this.clearActivedShapes(),this.clearSelected();var t=this.get("shapeContainer");t&&t.clear();var e=this.get("labelContainer");e&&e.remove(),this.set("attrs",{}),this.set("groupScales",null),this.set("labelContainer",null),this.set("xDistance",null),this.set("isStacked",null)},n.clear=function(){this.clearInner(),this.set("scales",{})},n.destroy=function(){this.clear();var e=this.get("shapeContainer");e&&e.remove(),this.offEvents(),t.prototype.destroy.call(this)},n.bindEvents=function(){this.get("view")&&(this._bindActiveAction(),this._bindSelectedAction())},n.offEvents=function(){this.get("view")&&(this._offActiveAction(),this._offSelectedAction())},e}(s);t.exports=y},function(t,e,n){t.exports={Axis:n(306),Component:n(66),Guide:n(314),Label:n(323),Legend:n(324),Tooltip:n(330)}},function(t,e,n){function i(t,e){var n=t.getCenter();return Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2))}function r(t,e){for(var n=t.length,i=[t[0]],r=1;r=s[c]?1:0,p=h>Math.PI?1:0,g=n.convertPoint(l),d=i(n,g);if(d>=.5)if(h===2*Math.PI){var v={x:(l.x+s.x)/2,y:(l.y+s.y)/2},y=n.convertPoint(v);u.push(["A",d,d,0,p,f,y.x,y.y]),u.push(["A",d,d,0,p,f,g.x,g.y])}else u.push(["A",d,d,0,p,f,g.x,g.y]);return u}(n,o,t)):u.push(r(a,t));break;case"z":default:u.push(a)}}),function(t){a.each(t,function(e,n){if("a"===e[0].toLowerCase()){var i=t[n-1],r=t[n+1];r&&"a"===r[0].toLowerCase()?i&&"l"===i[0].toLowerCase()&&(i[0]="M"):i&&"a"===i[0].toLowerCase()&&r&&"l"===r[0].toLowerCase()&&(r[0]="M")}})}(u),u}};t.exports=s},function(t,e,n){var i=n(5);t.exports=function(t){return i(t)?"":t.toString()}},function(t,e){var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};t.exports=function(t){var e=void 0===t?"undefined":n(t);return null!==t&&"object"===e||"function"===e}},function(t,e,n){t.exports={Canvas:n(181),Group:n(101),Shape:n(6),Arc:n(105),Circle:n(106),Dom:n(107),Ellipse:n(108),Fan:n(109),Image:n(110),Line:n(111),Marker:n(56),Path:n(112),Polygon:n(113),Polyline:n(114),Rect:n(115),Text:n(116),PathSegment:n(39),PathUtil:n(57),Event:n(100),version:"3.3.5"}},function(t,e,n){var i=n(48),r=n(12);t.exports=function(t){if(!i(t)||!r(t,"Object"))return!1;if(null===Object.getPrototypeOf(t))return!0;for(var e=t;null!==Object.getPrototypeOf(e);)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}},function(t,e,n){var i=n(1),r=/[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi,a=/[^\s\,]+/gi;t.exports={parseRadius:function(t){var e=0,n=0,r=0,a=0;return i.isArray(t)?1===t.length?e=n=r=a=t[0]:2===t.length?(e=r=t[0],n=a=t[1]):3===t.length?(e=t[0],n=a=t[1],r=t[2]):(e=t[0],n=t[1],r=t[2],a=t[3]):e=n=r=a=t,{r1:e,r2:n,r3:r,r4:a}},parsePath:function(t){return t=t||[],i.isArray(t)?t:i.isString(t)?(t=t.match(r),i.each(t,function(e,n){if((e=e.match(a))[0].length>1){var r=e[0].charAt(0);e.splice(1,0,e[0].substr(1)),e[0]=r}i.each(e,function(t,n){isNaN(t)||(e[n]=+t)}),t[n]=e}),t):void 0}}},function(t,e,n){"use strict";function i(t,e){return function(n){return t+n*e}}function r(t,e){var n=e-t;return n?i(t,n):Object(a.a)(isNaN(t)?e:t)}e.c=function(t,e){var n=e-t;return n?i(t,n>180||n<-180?n-360*Math.round(n/360):n):Object(a.a)(isNaN(t)?e:t)},e.b=function(t){return 1==(t=+t)?r:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):Object(a.a)(isNaN(e)?n:e)}},e.a=r;var a=n(121)},function(t,e,n){function i(t,e){return r(e)?e:t.invert(t.scale(e))}var r=n(10),a=n(4),o=n(5),s=n(8),l=n(2),u=function(){function t(t){var e=this;this.type="base",this.name=null,this.method=null,this.values=[],this.scales=[],this.linear=null;var n=null,i=this.callback;if(t.callback){var r=t.callback;n=function(){for(var t=arguments.length,n=new Array(t),a=0;a1&&(e=(t[1].value-t[0].value)/2);for(var n=[],i=0;i0){var s=e.value-a[r-1].value;s/=t.get("subTickCount")+1;for(var l=1;l<=n;l++){var u={text:"",value:r?a[r-1].value+l*s:l*s},c=t.getTickPoint(u.value),h=void 0;h=o&&o.length?o.length:parseInt(.6*i.length,10),t._addTickItem(l-1,c,h,"sub")}}})}},n._addTickLine=function(t,e){var n=r.mix({},e),i=[];r.each(t,function(t){i.push(["M",t.x1,t.y1]),i.push(["L",t.x2,t.y2])}),delete n.length,n.path=i;var a=this.get("group").addShape("path",{attrs:n});a.name="axis-ticks",a._id=this.get("_id")+"-ticks",a.set("coord",this.get("coord")),this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo"))},n._renderTicks=function(){var t=this.get("tickItems"),e=this.get("subTickItems");if(!r.isEmpty(t)){var n=this.get("tickLine");this._addTickLine(t,n)}if(!r.isEmpty(e)){var i=this.get("subTickLine")||this.get("tickLine");this._addTickLine(e,i)}},n._renderGrid=function(){var t=this.get("grid");if(t){t.coord=this.get("coord"),t.appendInfo=this.get("appendInfo");var e=this.get("group");this.set("gridGroup",e.addGroup(a,t))}},n._renderLabels=function(){var t=this.get("labelRenderer"),e=this.get("labelItems");t&&(t.set("items",e),t._dryDraw())},n.paint=function(){var t=this.get("tickLine"),e=!0;t&&t.hasOwnProperty("alignWithLabel")&&(e=t.alignWithLabel),this._renderLine();var n=this.get("type");("cat"===n||"timeCat"===n)&&!1===e?this._processCatTicks():this._processTicks(),this._renderTicks(),this._renderGrid(),this._renderLabels();var i=this.get("label");i&&i.autoRotate&&this.autoRotateLabels(),i&&i.autoHide&&this.autoHideLabels()},n.parseTick=function(t,e,n){return{text:t,value:e/(n-1)}},n.getTextAnchor=function(t){return Math.abs(t[1]/t[0])>=1?"center":t[0]>0?"start":"end"},n.getMaxLabelWidth=function(t){var e=t.getLabels(),n=0;return r.each(e,function(t){var e=t.getBBox().width;ne)&&(this.min=e),(i(this.max)||this.max=t.min&&e<=t.max&&n.push(e)}),n.length||(n.push(t.min),n.push(t.max)),t.ticks=n}},n.scale=function(t){if(i(t))return NaN;var e=this.max,n=this.min;if(e===n)return 0;var r=(t-n)/(e-n),a=this.rangeMin();return a+r*(this.rangeMax()-a)},n.invert=function(t){var e=(t-this.rangeMin())/(this.rangeMax()-this.rangeMin());return this.min+e*(this.max-this.min)},e}(a);a.Linear=s,t.exports=s},function(t,e,n){var i=n(13);t.exports=function(t){return i(t)?Array.prototype.slice.call(t):[]}},function(t,e){t.exports=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1e-5;return Math.abs(t-e)n&&(r=2*Math.PI-t+e,a=t-n):(r=t-e,a=n-t),r>a?n:e}function a(t,e,n,i){var a=0;return n-e>=2*Math.PI&&(a=2*Math.PI),e=s.mod(e,2*Math.PI),n=s.mod(n,2*Math.PI)+a,t=s.mod(t,2*Math.PI),i?e>=n?t>n&&tn?t:r(t,e,n):e<=n?ee||tt.x&&(g=t.x),dt.y&&(v=t.y),y0&&p>0?h=Math.PI/2-g:f<0&&p<0?h=-Math.PI/2-g:f>=0&&p<0?h=-g-Math.PI/2:f<=0&&p>0&&(h=Math.PI/2-g);var d=function(t){var e,n=[],i=a.parsePath(t.path);if(!Array.isArray(i)||0===i.length||"M"!==i[0][0]&&"m"!==i[0][0])return!1;for(var r=i.length,s=0;s=0,p=f?n.toUpperCase():n,g=t,v=e.endPoint,y=g[1],x=g[2];switch(p){default:break;case"M":h=f?i(y,x,v):{x:y,y:x},this.command="M",this.params=[v,h],this.subStart=h,this.endPoint=h;break;case"L":h=f?i(y,x,v):{x:y,y:x},this.command="L",this.params=[v,h],this.subStart=e.subStart,this.endPoint=h,this.endTangent=function(){return[h.x-v.x,h.y-v.y]},this.startTangent=function(){return[v.x-h.x,v.y-h.y]};break;case"H":h=f?i(y,0,v):{x:y,y:v.y},this.command="L",this.params=[v,h],this.subStart=e.subStart,this.endPoint=h,this.endTangent=function(){return[h.x-v.x,h.y-v.y]},this.startTangent=function(){return[v.x-h.x,v.y-h.y]};break;case"V":h=f?i(0,y,v):{x:v.x,y:y},this.command="L",this.params=[v,h],this.subStart=e.subStart,this.endPoint=h,this.endTangent=function(){return[h.x-v.x,h.y-v.y]},this.startTangent=function(){return[v.x-h.x,v.y-h.y]};break;case"Q":f?(a=i(y,x,v),u=i(g[3],g[4],v)):(a={x:y,y:x},u={x:g[3],y:g[4]}),this.command="Q",this.params=[v,a,u],this.subStart=e.subStart,this.endPoint=u,this.endTangent=function(){return[u.x-a.x,u.y-a.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]};break;case"T":u=f?i(y,x,v):{x:y,y:x},"Q"===e.command?(a=r(e.params[1],v),this.command="Q",this.params=[v,a,u],this.subStart=e.subStart,this.endPoint=u,this.endTangent=function(){return[u.x-a.x,u.y-a.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]}):(this.command="TL",this.params=[v,u],this.subStart=e.subStart,this.endPoint=u,this.endTangent=function(){return[u.x-v.x,u.y-v.y]},this.startTangent=function(){return[v.x-u.x,v.y-u.y]});break;case"C":f?(a=i(y,x,v),u=i(g[3],g[4],v),c=i(g[5],g[6],v)):(a={x:y,y:x},u={x:g[3],y:g[4]},c={x:g[5],y:g[6]}),this.command="C",this.params=[v,a,u,c],this.subStart=e.subStart,this.endPoint=c,this.endTangent=function(){return[c.x-u.x,c.y-u.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]};break;case"S":f?(u=i(y,x,v),c=i(g[3],g[4],v)):(u={x:y,y:x},c={x:g[3],y:g[4]}),"C"===e.command?(a=r(e.params[2],v),this.command="C",this.params=[v,a,u,c],this.subStart=e.subStart,this.endPoint=c,this.endTangent=function(){return[c.x-u.x,c.y-u.y]},this.startTangent=function(){return[v.x-a.x,v.y-a.y]}):(this.command="SQ",this.params=[v,u,c],this.subStart=e.subStart,this.endPoint=c,this.endTangent=function(){return[c.x-u.x,c.y-u.y]},this.startTangent=function(){return[v.x-u.x,v.y-u.y]});break;case"A":var m=y,_=x,b=g[3],w=g[4],S=g[5];h=f?i(g[6],g[7],v):{x:g[6],y:g[7]},this.command="A";var M=function(t,e,n,i,r,a,u){var c=l.mod(l.toRadian(u),2*Math.PI),h=t.x,f=t.y,p=e.x,g=e.y,d=Math.cos(c)*(h-p)/2+Math.sin(c)*(f-g)/2,v=-1*Math.sin(c)*(h-p)/2+Math.cos(c)*(f-g)/2,y=d*d/(r*r)+v*v/(a*a);y>1&&(r*=Math.sqrt(y),a*=Math.sqrt(y));var x=r*r*(v*v)+a*a*(d*d),m=Math.sqrt((r*r*(a*a)-x)/x);n===i&&(m*=-1),isNaN(m)&&(m=0);var _=m*r*v/a,b=m*-a*d/r,w=(h+p)/2+Math.cos(c)*_-Math.sin(c)*b,S=(f+g)/2+Math.sin(c)*_+Math.cos(c)*b,M=s([1,0],[(d-_)/r,(v-b)/a]),C=[(d-_)/r,(v-b)/a],A=[(-1*d-_)/r,(-1*v-b)/a],k=s(C,A);return o(C,A)<=-1&&(k=Math.PI),o(C,A)>=1&&(k=0),0===i&&k>0&&(k-=2*Math.PI),1===i&&k<0&&(k+=2*Math.PI),[t,w,S,r,a,M,k,c,i]}(v,h,w,S,m,_,b);this.params=M;var C=e.subStart;this.subStart=C,this.endPoint=h;var A=M[5]%(2*Math.PI);l.isNumberEqual(A,2*Math.PI)&&(A=0);var k=M[6]%(2*Math.PI);l.isNumberEqual(k,2*Math.PI)&&(k=0);var P=.001;this.startTangent=function(){0===S&&(P*=-1);var t=M[3]*Math.cos(A-P)+M[1],e=M[4]*Math.sin(A-P)+M[2];return[t-C.x,e-C.y]},this.endTangent=function(){var t=M[6];t-2*Math.PI<1e-4&&(t=0);var e=M[3]*Math.cos(A+t+P)+M[1],n=M[4]*Math.sin(A+t-P)+M[2];return[v.x-e,v.y-n]};break;case"Z":this.command="Z",this.params=[v,e.subStart],this.subStart=e.subStart,this.endPoint=e.subStart}},isInside:function(t,e,n){var i=this.command,r=this.params,a=this.box;if(a&&!u.box(a.minX,a.maxX,a.minY,a.maxY,t,e))return!1;switch(i){default:break;case"M":return!1;case"TL":case"L":case"Z":return u.line(r[0].x,r[0].y,r[1].x,r[1].y,n,t,e);case"SQ":case"Q":return u.quadraticline(r[0].x,r[0].y,r[1].x,r[1].y,r[2].x,r[2].y,n,t,e);case"C":return u.cubicline(r[0].x,r[0].y,r[1].x,r[1].y,r[2].x,r[2].y,r[3].x,r[3].y,n,t,e);case"A":var o=r,s=o[1],l=o[2],c=o[3],h=o[4],f=o[5],d=o[6],v=o[7],y=o[8],x=c>h?c:h,m=c>h?1:c/h,_=c>h?h/c:1;o=[t,e,1];var b=[1,0,0,0,1,0,0,0,1];return g.translate(b,b,[-s,-l]),g.rotate(b,b,-v),g.scale(b,b,[1/m,1/_]),p.transformMat3(o,o,b),u.arcline(0,0,x,f,f+d,1-y,n,o[0],o[1])}return!1},draw:function(t){var e,n,i,r=this.command,a=this.params;switch(r){default:break;case"M":t.moveTo(a[1].x,a[1].y);break;case"TL":case"L":t.lineTo(a[1].x,a[1].y);break;case"SQ":case"Q":e=a[1],n=a[2],t.quadraticCurveTo(e.x,e.y,n.x,n.y);break;case"C":e=a[1],n=a[2],i=a[3],t.bezierCurveTo(e.x,e.y,n.x,n.y,i.x,i.y);break;case"A":var o=a,s=o[1],l=o[2],u=o[3],c=o[4],h=o[5],f=o[6],p=o[7],g=o[8],d=u>c?u:c,v=u>c?1:u/c,y=u>c?c/u:1;t.translate(s,l),t.rotate(p),t.scale(v,y),t.arc(0,0,d,h,h+f,1-g),t.scale(1/v,1/y),t.rotate(-p),t.translate(-s,-l);break;case"Z":t.closePath()}},getBBox:function(t){var e,n,i,r,a=t/2,o=this.params;switch(this.command){default:case"M":case"Z":break;case"TL":case"L":this.box={minX:Math.min(o[0].x,o[1].x)-a,maxX:Math.max(o[0].x,o[1].x)+a,minY:Math.min(o[0].y,o[1].y)-a,maxY:Math.max(o[0].y,o[1].y)+a};break;case"SQ":case"Q":for(i=0,r=(n=h.extrema(o[0].x,o[1].x,o[2].x)).length;iS&&(S=A)}var k=f.yExtrema(y,p,g),P=1/0,T=-1/0,I=[m,_];for(i=2*-Math.PI;i<=2*Math.PI;i+=Math.PI){var O=k+i;1===x?mT&&(T=L)}this.box={minX:w-a,maxX:S+a,minY:P-a,maxY:T+a}}}}),t.exports=v},function(t,e,n){"use strict";e.a=function(t,e){return t=+t,e-=t,function(n){return t+e*n}}},function(t,e,n){var i=n(13),r=Array.prototype.indexOf;t.exports=function(t,e){return!!i(t)&&r.call(t,e)>-1}},function(t,e){t.exports=function(t){for(var e=[],n=0;n2&&void 0!==arguments[2]?arguments[2]:0,i=this.matrix,r=[t,e,n];return l.transformMat3(r,r,i),r}},{key:"invertMatrix",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=this.matrix,r=s.invert([],i),a=[t,e,n];return l.transformMat3(a,a,r),a}},{key:"convert",value:function(t){var e=this.convertPoint(t),n=e.x,i=e.y,r=this.applyMatrix(n,i,1);return{x:r[0],y:r[1]}}},{key:"invert",value:function(t){var e=this.invertMatrix(t.x,t.y,1);return this.invertPoint({x:e[0],y:e[1]})}},{key:"rotate",value:function(t){var e=this.matrix,n=this.center;return s.translate(e,e,[-n.x,-n.y]),s.rotate(e,e,t),s.translate(e,e,[n.x,n.y]),this}},{key:"reflect",value:function(t){switch(t){case"x":this._swapDim("x");break;case"y":this._swapDim("y");break;default:this._swapDim("y")}return this}},{key:"scale",value:function(t,e){var n=this.matrix,i=this.center;return s.translate(n,n,[-i.x,-i.y]),s.scale(n,n,[t,e]),s.translate(n,n,[i.x,i.y]),this}},{key:"translate",value:function(t,e){var n=this.matrix;return s.translate(n,n,[t,e]),this}},{key:"transpose",value:function(){return this.isTransposed=!this.isTransposed,this}}]),t}();t.exports=u},function(t,e,n){var i=n(0),r={splitPoints:function(t){var e=[],n=t.x,r=t.y;return r=i.isArray(r)?r:[r],i.each(r,function(t,r){var a={x:i.isArray(n)?n[r]:n,y:t};e.push(a)}),e},addFillAttrs:function(t,e){e.color&&(t.fill=e.color),i.isNumber(e.opacity)&&(t.opacity=t.fillOpacity=e.opacity)},addStrokeAttrs:function(t,e){e.color&&(t.stroke=e.color),i.isNumber(e.opacity)&&(t.opacity=t.strokeOpacity=e.opacity)}};t.exports=r},function(t,e,n){var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=n(4);t.exports=function t(e){if("object"!==(void 0===e?"undefined":i(e))||null===e)return e;var n=void 0;if(r(e)){n=[];for(var a=0,o=e.length;an?n:t}},function(t,e,n){var i=n(182);i.translate=function(t,e,n){var r=new Array(9);return i.fromTranslation(r,n),i.multiply(t,r,e)},i.rotate=function(t,e,n){var r=new Array(9);return i.fromRotation(r,n),i.multiply(t,r,e)},i.scale=function(t,e,n){var r=new Array(9);return i.fromScaling(r,n),i.multiply(t,r,e)},t.exports=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setMatrixArrayType=function(t){e.ARRAY_TYPE=r=t},e.toRadian=function(t){return t*a},e.equals=function(t,e){return Math.abs(t-e)<=i*Math.max(1,Math.abs(t),Math.abs(e))};var i=e.EPSILON=1e-6,r=e.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,a=(e.RANDOM=Math.random,Math.PI/180)},function(t,e,n){var i;!function(e){"use strict";function r(){}function a(t,e){for(var n=t.length;n--;)if(t[n].listener===e)return n;return-1}function o(t){return function(){return this[t].apply(this,arguments)}}function s(t){return"function"==typeof t||t instanceof RegExp||!(!t||"object"!=typeof t)&&s(t.listener)}var l=r.prototype,u=e.EventEmitter;l.getListeners=function(t){var e,n,i=this._getEvents();if(t instanceof RegExp){e={};for(n in i)i.hasOwnProperty(n)&&t.test(n)&&(e[n]=i[n])}else e=i[t]||(i[t]=[]);return e},l.flattenListeners=function(t){var e,n=[];for(e=0;e=0&&v=0&&r<=1&&h.push(r);else{var f=u*u-4*l*c;o.isNumberEqual(f,0)?h.push(-u/(2*l)):f>0&&(a=(-u-(s=Math.sqrt(f)))/(2*l),(r=(-u+s)/(2*l))>=0&&r<=1&&h.push(r),a>=0&&a<=1&&h.push(a))}return h},len:function(t,e,n,i,r,s,l,u,c){o.isNil(c)&&(c=1);for(var h=(c=c>1?1:c<0?0:c)/2,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],g=0,d=0;d<12;d++){var v=h*f[d]+h,y=a(v,t,n,r,l),x=a(v,e,i,s,u),m=y*y+x*x;g+=p[d]*Math.sqrt(m)}return h*g}}},function(t,e,n){var i=n(1),r=n(6),a=n(27),o=n(39),s=function t(e){t.superclass.constructor.call(this,e)};s.Symbols={circle:function(t,e,n){return[["M",t,e],["m",-n,0],["a",n,n,0,1,0,2*n,0],["a",n,n,0,1,0,2*-n,0]]},square:function(t,e,n){return[["M",t-n,e-n],["L",t+n,e-n],["L",t+n,e+n],["L",t-n,e+n],["Z"]]},diamond:function(t,e,n){return[["M",t-n,e],["L",t,e-n],["L",t+n,e],["L",t,e+n],["Z"]]},triangle:function(t,e,n){var i=n*Math.sin(1/3*Math.PI);return[["M",t-n,e+i],["L",t,e-i],["L",t+n,e+i],["z"]]},"triangle-down":function(t,e,n){var i=n*Math.sin(1/3*Math.PI);return[["M",t-n,e-i],["L",t+n,e-i],["L",t,e+i],["Z"]]}},s.ATTRS={path:null,lineWidth:1},i.extend(s,r),i.augment(s,{type:"marker",canFill:!0,canStroke:!0,getDefaultAttrs:function(){return{x:0,y:0,lineWidth:1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.radius,r=this.getHitLineWidth()/2+i;return{minX:e-r,minY:n-r,maxX:e+r,maxY:n+r}},_getPath:function(){var t=this._attrs,e=t.x,n=t.y,r=t.radius||t.r,a=t.symbol||"circle";return(i.isFunction(a)?a:s.Symbols[a])(e,n,r)},createPath:function(t){var e=this._cfg.segments;if(!e||this._cfg.hasUpdate){var n=a.parsePath(this._getPath());t.beginPath();var i;e=[];for(var r=0;r2&&(n.push([i].concat(a.splice(0,2))),o="l",i="m"===i?"l":"L"),"o"===o&&1===a.length&&n.push([i,a[0]]),"r"===o)n.push([i].concat(a));else for(;a.length>=e[o]&&(n.push([i].concat(a.splice(0,e[o]))),e[o]););}),n},f=function(t,e){for(var n=[],i=0,r=t.length;r-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?r-4===i?a[3]={x:+t[0],y:+t[1]}:r-2===i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[r-2],y:+t[r-1]}:r-4===i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),n.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return n},p=function(t,e,n,i,r){var a=[];if(null===r&&null===i&&(i=n),t=+t,e=+e,n=+n,i=+i,null!==r){var o=Math.PI/180,s=t+n*Math.cos(-i*o),l=t+n*Math.cos(-r*o);a=[["M",s,e+n*Math.sin(-i*o)],["A",n,n,0,+(r-i>180),0,l,e+n*Math.sin(-r*o)]]}else a=[["M",t,e],["m",0,-i],["a",n,i,0,1,1,0,2*i],["a",n,i,0,1,1,0,-2*i],["z"]];return a},g=function(t){if(!(t=h(t))||!t.length)return[["M",0,0]];var e,n,i=[],r=0,a=0,o=0,s=0,l=0;"M"===t[0][0]&&(o=r=+t[0][1],s=a=+t[0][2],l++,i[0]=["M",r,a]);for(var u,c,g=3===t.length&&"M"===t[0][0]&&"R"===t[1][0].toUpperCase()&&"Z"===t[2][0].toUpperCase(),d=l,v=t.length;d1&&(i*=w=Math.sqrt(w),r*=w);var S=i*i,M=r*r,C=(o===s?-1:1)*Math.sqrt(Math.abs((S*M-S*b*b-M*_*_)/(S*b*b+M*_*_)));g=C*i*b/r+(e+l)/2,d=C*-r*_/i+(n+u)/2,f=Math.asin(((n-d)/r).toFixed(9)),p=Math.asin(((u-d)/r).toFixed(9)),f=ep&&(f-=2*Math.PI),!s&&p>f&&(p-=2*Math.PI)}var A=p-f;if(Math.abs(A)>v){var k=p,P=l,T=u;p=f+v*(s&&p>f?1:-1),x=t(l=g+i*Math.cos(p),u=d+r*Math.sin(p),i,r,a,0,s,P,T,[p,k,g,d])}A=p-f;var I=Math.cos(f),O=Math.sin(f),L=Math.cos(p),E=Math.sin(p),D=Math.tan(A/4),F=4/3*i*D,B=4/3*r*D,R=[e,n],j=[e+F*O,n-B*I],N=[l+F*E,u-B*L],z=[l,u];if(j[0]=2*R[0]-j[0],j[1]=2*R[1]-j[1],c)return[j,N,z].concat(x);for(var Y=[],V=0,X=(x=[j,N,z].concat(x).join().split(",")).length;V7){t[e].shift();for(var a=t[e];a.length;)s[e]="A",r&&(l[e]="A"),t.splice(e++,0,["C"].concat(a.splice(0,6)));t.splice(e,1),n=Math.max(i.length,r&&r.length||0)}},p=function(t,e,a,o,s){t&&e&&"M"===t[s][0]&&"M"!==e[s][0]&&(e.splice(s,0,["M",o.x,o.y]),a.bx=0,a.by=0,a.x=t[s][1],a.y=t[s][2],n=Math.max(i.length,r&&r.length||0))};n=Math.max(i.length,r&&r.length||0);for(var y=0;y1?1:l<0?0:l)/2,c=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],h=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],f=0,p=0;p<12;p++){var g=u*c[p]+u,d=_(g,t,n,r,o),v=_(g,e,i,a,s),y=d*d+v*v;f+=h[p]*Math.sqrt(y)}return u*f},w=function(t,e,n,i,r,a,o,s){if(!(Math.max(t,n)Math.max(r,o)||Math.max(e,i)Math.max(a,s))){var l=(t-n)*(a-s)-(e-i)*(r-o);if(l){var u=((t*i-e*n)*(r-o)-(t-n)*(r*s-a*o))/l,c=((t*i-e*n)*(a-s)-(e-i)*(r*s-a*o))/l,h=+u.toFixed(2),f=+c.toFixed(2);if(!(h<+Math.min(t,n).toFixed(2)||h>+Math.max(t,n).toFixed(2)||h<+Math.min(r,o).toFixed(2)||h>+Math.max(r,o).toFixed(2)||f<+Math.min(e,i).toFixed(2)||f>+Math.max(e,i).toFixed(2)||f<+Math.min(a,s).toFixed(2)||f>+Math.max(a,s).toFixed(2)))return{x:u,y:c}}}},S=function(t,e,n){return e>=t.x&&e<=t.x+t.width&&n>=t.y&&n<=t.y+t.height},M=function(t,e,n,i,r){if(r)return[["M",+t+ +r,e],["l",n-2*r,0],["a",r,r,0,0,1,r,r],["l",0,i-2*r],["a",r,r,0,0,1,-r,r],["l",2*r-n,0],["a",r,r,0,0,1,-r,-r],["l",0,2*r-i],["a",r,r,0,0,1,r,-r],["z"]];var a=[["M",t,e],["l",n,0],["l",0,i],["l",-n,0],["z"]];return a.parsePathArray=m,a},C=function(t,e,n,i){return null===t&&(t=e=n=i=0),null===e&&(e=t.y,n=t.width,i=t.height,t=t.x),{x:t,y:e,width:n,w:n,height:i,h:i,x2:t+n,y2:e+i,cx:t+n/2,cy:e+i/2,r1:Math.min(n,i)/2,r2:Math.max(n,i)/2,r0:Math.sqrt(n*n+i*i)/2,path:M(t,e,n,i),vb:[t,e,n,i].join(" ")}},A=function(t,e,n,i,r,a,o,l){s.isArray(t)||(t=[t,e,n,i,r,a,o,l]);var u=function(t,e,n,i,r,a,o,s){for(var l,u,c,h,f=[],p=[[],[]],g=0;g<2;++g)if(0===g?(u=6*t-12*n+6*r,l=-3*t+9*n-9*r+3*o,c=3*n-3*t):(u=6*e-12*i+6*a,l=-3*e+9*i-9*a+3*s,c=3*i-3*e),Math.abs(l)<1e-12){if(Math.abs(u)<1e-12)continue;(h=-c/u)>0&&h<1&&f.push(h)}else{var d=u*u-4*c*l,v=Math.sqrt(d);if(!(d<0)){var y=(-u+v)/(2*l);y>0&&y<1&&f.push(y);var x=(-u-v)/(2*l);x>0&&x<1&&f.push(x)}}for(var m,_=f.length,b=_;_--;)m=1-(h=f[_]),p[0][_]=m*m*m*t+3*m*m*h*n+3*m*h*h*r+h*h*h*o,p[1][_]=m*m*m*e+3*m*m*h*i+3*m*h*h*a+h*h*h*s;return p[0][b]=t,p[1][b]=e,p[0][b+1]=o,p[1][b+1]=s,p[0].length=p[1].length=b+2,{min:{x:Math.min.apply(0,p[0]),y:Math.min.apply(0,p[1])},max:{x:Math.max.apply(0,p[0]),y:Math.max.apply(0,p[1])}}}.apply(null,t);return C(u.min.x,u.min.y,u.max.x-u.min.x,u.max.y-u.min.y)},k=function(t,e,n,i,r,a,o,s,l){var u=1-l,c=Math.pow(u,3),h=Math.pow(u,2),f=l*l,p=f*l,g=t+2*l*(n-t)+f*(r-2*n+t),d=e+2*l*(i-e)+f*(a-2*i+e),v=n+2*l*(r-n)+f*(o-2*r+n),y=i+2*l*(a-i)+f*(s-2*a+i);return{x:c*t+3*h*l*n+3*u*l*l*r+p*o,y:c*e+3*h*l*i+3*u*l*l*a+p*s,m:{x:g,y:d},n:{x:v,y:y},start:{x:u*t+l*n,y:u*e+l*i},end:{x:u*r+l*o,y:u*a+l*s},alpha:90-180*Math.atan2(g-v,d-y)/Math.PI}},P=function(t,e,n){if(!function(t,e){return t=C(t),e=C(e),S(e,t.x,t.y)||S(e,t.x2,t.y)||S(e,t.x,t.y2)||S(e,t.x2,t.y2)||S(t,e.x,e.y)||S(t,e.x2,e.y)||S(t,e.x,e.y2)||S(t,e.x2,e.y2)||(t.xe.x||e.xt.x)&&(t.ye.y||e.yt.y)}(A(t),A(e)))return n?0:[];for(var i=~~(b.apply(0,t)/8),r=~~(b.apply(0,e)/8),a=[],o=[],s={},l=n?0:[],u=0;u=0&&P<=1&&T>=0&&T<=1&&(n?l++:l.push({x:M.x,y:M.y,t1:P,t2:T}))}}return l},T=function(t,e,n){if(1===n)return[[].concat(t)];var r=[];if("L"===e[0]||"C"===e[0]||"Q"===e[0])r=r.concat(function(t,e,n){var r=[[t[1],t[2]]];n=n||2;var a=[];"A"===e[0]?(r.push(e[6]),r.push(e[7])):"C"===e[0]?(r.push([e[1],e[2]]),r.push([e[3],e[4]]),r.push([e[5],e[6]])):"S"===e[0]||"Q"===e[0]?(r.push([e[1],e[2]]),r.push([e[3],e[4]])):r.push([e[1],e[2]]);for(var o=r,s=1/n,l=0;l=3&&(3===t.length&&e.push("Q"),e=e.concat(t[1])),2===t.length&&e.push("L"),e=e.concat(t[t.length-1])})}(t,e,n));else{var a=[].concat(t);"M"===a[0]&&(a[0]="L");for(var o=0;o<=n-1;o++)r.push(a)}return r},I=function(t,e){if(t.length!==e.length)return!1;var n=!0;return s.each(t,function(t,i){if(t!==e[i])return n=!1,!1}),n};t.exports={parsePathString:h,parsePathArray:m,pathTocurve:y,pathToAbsolute:g,catmullRomToBezier:f,rectPath:M,fillPath:function(t,e){if(1===t.length)return t;var n=t.length-1,i=e.length-1,r=n/i,a=[];if(1===t.length&&"M"===t[0][0]){for(var o=0;o=0;f--)s=o[f].index,"add"===o[f].type?t.splice(s,0,[].concat(t[s])):t.splice(s,1)}var p=a-(i=t.length);if(i0)){t[i]=e[i];break}n=a(n,t[i-1],1)}t[i]=["Q"].concat(n.reduce(function(t,e){return t.concat(e)},[]));break;case"T":t[i]=["T"].concat(n[0]);break;case"C":if(n.length<3){if(!(i>0)){t[i]=e[i];break}n=a(n,t[i-1],2)}t[i]=["C"].concat(n.reduce(function(t,e){return t.concat(e)},[]));break;case"S":if(n.length<2){if(!(i>0)){t[i]=e[i];break}n=a(n,t[i-1],1)}t[i]=["S"].concat(n.reduce(function(t,e){return t.concat(e)},[]));break;default:t[i]=e[i]}return t},intersection:function(t,e){return function(t,e,n){t=y(t),e=y(e);for(var i,r,a,o,s,l,u,c,h,f,p=n?0:[],g=0,d=t.length;g=0&&e._call.call(null,t),e=e._next;--p}function l(){x=(y=_.now())+m,p=g=0;try{s()}finally{p=0,function(){var t,e,n=h,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:h=e);f=t,c(i)}(),x=0}}function u(){var t=_.now(),e=t-y;e>v&&(m-=e,y=t)}function c(t){if(!p){g&&(g=clearTimeout(g));t-x>24?(t<1/0&&(g=setTimeout(l,t-_.now()-m)),d&&(d=clearInterval(d))):(d||(y=_.now(),d=setInterval(u,v)),p=1,b(l))}}e.b=i,e.a=a,e.c=o,e.d=s;var h,f,p=0,g=0,d=0,v=1e3,y=0,x=0,m=0,_="object"==typeof performance&&performance.now?performance:Date,b="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};a.prototype=o.prototype={constructor:a,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?i():+n)+(null==e?0:+e),this._next||f===this||(f?f._next=this:h=this,f=this),this._call=t,this._time=n,c()},stop:function(){this._call&&(this._call=null,this._time=1/0,c())}}},function(t,e,n){"use strict";var i=n(19),r=n(119),a=n(122),o=n(123),s=n(40),l=n(124),u=n(125),c=n(121);e.a=function(t,e){var n,h=typeof e;return null==e||"boolean"===h?Object(c.a)(e):("number"===h?s.a:"string"===h?(n=Object(i.a)(e))?(e=n,r.a):u.a:e instanceof i.a?r.a:e instanceof Date?o.a:Array.isArray(e)?a.a:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?l.a:s.a)(t,e)}},function(t,e,n){"use strict";function i(){}function r(t){var e;return t=(t+"").trim().toLowerCase(),(e=_.exec(t))?(e=parseInt(e[1],16),new u(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1)):(e=b.exec(t))?a(parseInt(e[1],16)):(e=w.exec(t))?new u(e[1],e[2],e[3],1):(e=S.exec(t))?new u(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=M.exec(t))?o(e[1],e[2],e[3],e[4]):(e=C.exec(t))?o(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=A.exec(t))?c(e[1],e[2]/100,e[3]/100,1):(e=k.exec(t))?c(e[1],e[2]/100,e[3]/100,e[4]):P.hasOwnProperty(t)?a(P[t]):"transparent"===t?new u(NaN,NaN,NaN,0):null}function a(t){return new u(t>>16&255,t>>8&255,255&t,1)}function o(t,e,n,i){return i<=0&&(t=e=n=NaN),new u(t,e,n,i)}function s(t){return t instanceof i||(t=r(t)),t?(t=t.rgb(),new u(t.r,t.g,t.b,t.opacity)):new u}function l(t,e,n,i){return 1===arguments.length?s(t):new u(t,e,n,null==i?1:i)}function u(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function c(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new f(t,e,n,i)}function h(t,e,n,a){return 1===arguments.length?function(t){if(t instanceof f)return new f(t.h,t.s,t.l,t.opacity);if(t instanceof i||(t=r(t)),!t)return new f;if(t instanceof f)return t;var e=(t=t.rgb()).r/255,n=t.g/255,a=t.b/255,o=Math.min(e,n,a),s=Math.max(e,n,a),l=NaN,u=s-o,c=(s+o)/2;return u?(l=e===s?(n-a)/u+6*(n0&&c<1?0:l,new f(l,u,c,t.opacity)}(t):new f(t,e,n,null==a?1:a)}function f(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function p(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}e.a=i,n.d(e,"d",function(){return d}),n.d(e,"c",function(){return v}),e.e=r,e.h=s,e.g=l,e.b=u,e.f=h;var g=n(61),d=.7,v=1/d,y="\\s*([+-]?\\d+)\\s*",x="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",m="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",_=/^#([0-9a-f]{3})$/,b=/^#([0-9a-f]{6})$/,w=new RegExp("^rgb\\("+[y,y,y]+"\\)$"),S=new RegExp("^rgb\\("+[m,m,m]+"\\)$"),M=new RegExp("^rgba\\("+[y,y,y,x]+"\\)$"),C=new RegExp("^rgba\\("+[m,m,m,x]+"\\)$"),A=new RegExp("^hsl\\("+[x,m,m]+"\\)$"),k=new RegExp("^hsla\\("+[x,m,m,x]+"\\)$"),P={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object(g.a)(i,r,{displayable:function(){return this.rgb().displayable()},toString:function(){return this.rgb()+""}}),Object(g.a)(u,l,Object(g.b)(i,{brighter:function(t){return t=null==t?v:Math.pow(v,t),new u(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?d:Math.pow(d,t),new u(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},toString:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}})),Object(g.a)(f,h,Object(g.b)(i,{brighter:function(t){return t=null==t?v:Math.pow(v,t),new f(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?d:Math.pow(d,t),new f(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new u(p(t>=240?t-240:t+120,r,i),p(t,r,i),p(t<120?t+240:t-120,r,i),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}))},function(t,e,n){"use strict";e.b=function(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n},e.a=function(t,e,n){t.prototype=e.prototype=n,n.constructor=t}},function(t,e,n){"use strict";function i(t,e,n,i,r){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*i+o*r)/6}e.a=i,e.b=function(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),a=t[r],o=t[r+1],s=r>0?t[r-1]:2*a-o,l=r0&&e.lineToLabel(t)})},n.lineToLabel=function(){},n.getLabelPoint=function(t,e,n){function i(e,n){return o.isArray(e)&&(e=1===t.text.length?e.length<=2?e[e.length-1]:function(t){var e=0;return o.each(t,function(t){e+=t}),e/t.length}(e):e[n]),e}var r=this.get("coord"),a=t.text.length,s={text:t.text[n]};if(e&&"polygon"===this.get("geomType")){var l=function(t,e){for(var n,i,r=-1,a=0,o=0,s=t.length-1,l=0;++ru&&(u=t.x)}),s.x=(s.x+u)/2}"pyramid"===e.shape&&!e.nextPoints&&e.points&&e.points.forEach(function(t){t=r.convert(t),(o.isArray(t.x)&&-1===e.x.indexOf(t.x)||o.isNumber(t.x)&&e.x!==t.x)&&(s.x=(s.x+t.x)/2)}),t.position&&this.setLabelPosition(s,e,n,t.position);var c=this.getLabelOffset(t,n,a);return t.offsetX&&(c.x+=t.offsetX),t.offsetY&&(c.y+=t.offsetY),this.transLabelPoint(s),s.start={x:s.x,y:s.y},s.x+=c.x,s.y+=c.y,s.color=e.color,s},n.setLabelPosition=function(){},n.transLabelPoint=function(t){var e=this.get("coord").applyMatrix(t.x,t.y,1);t.x=e[0],t.y=e[1]},n.getOffsetVector=function(t){var e=t.offset||0,n=this.get("coord");return n.isTransposed?n.applyMatrix(e,0):n.applyMatrix(0,e)},n.getDefaultOffset=function(t){var e=this.get("coord"),n=this.getOffsetVector(t);return e.isTransposed?n[0]:n[1]},n.getLabelOffset=function(t,e,n){var i=this.getDefaultOffset(t),r=this.get("coord").isTransposed,a=r?"x":"y",o=r?1:-1,s={x:0,y:0};return s[a]=e>0||1===n?i*o:i*o*-1,s},n.getLabelAlign=function(t,e,n){var i="center";if(this.get("coord").isTransposed){var r=this.getDefaultOffset(t);i=r<0?"right":0===r?"center":"left",n>1&&0===e&&("right"===i?i="left":"left"===i&&(i="right"))}return i},n._getLabelValue=function(t,e){o.isArray(e)||(e=[e]);var n=[];return o.each(e,function(e){var i=t[e.field];if(o.isArray(i)){var r=[];o.each(i,function(t){r.push(e.getText(t))}),i=r}else i=e.getText(i);(o.isNil(i)||""===i)&&n.push(null),n.push(i)}),n},n._getLabelCfgs=function(t){var e=this,n=this.get("labelCfg"),i=n.scales,r=this.get("label"),a=[];n.globalCfg&&n.globalCfg.type&&e.set("type",n.globalCfg.type),o.each(t,function(t,s){var l={},u=t._origin,c=e._getLabelValue(u,i);if(n.callback){var h=i.map(function(t){return u[t.field]});l=n.callback.apply(null,h)}if(l||0===l){if(o.isString(l)||o.isNumber(l)?l={text:l}:(l.text=l.content||c[0],delete l.content),l=o.mix({},r,n.globalCfg||{},l),t.point=u,l.htmlTemplate&&(l.useHtml=!0,l.text=l.htmlTemplate.call(null,l.text,t,s),delete l.htmlTemplate),l.formatter&&(l.text=l.formatter.call(null,l.text,t,s),delete l.formatter),l.label){var f=l.label;delete l.label,l=o.mix(l,f)}if(l.textStyle){delete l.textStyle.offset;var p=l.textStyle;o.isFunction(p)&&(l.textStyle=p.call(null,l.text,t,s))}l.labelLine&&(l.labelLine=o.mix({},r.labelLine,l.labelLine)),l.textStyle=o.mix({},r.textStyle,l.textStyle),delete l.items,a.push(l)}else a.push(null)}),this.set("labelItemCfgs",a)},n.showLabels=function(t,e){var n=this.get("labelRenderer"),i=this.getLabelsItems(t,e);e=[].concat(e);var r=this.get("type");i=this.adjustItems(i,e),this.drawLines(i),n.set("items",i.filter(function(t,n){return!!t||(e.splice(n,1),!1)})),r&&(n.set("shapes",e),n.set("type",r),n.set("points",t)),n.set("canvas",this.get("canvas")),n.draw()},n.destroy=function(){this.get("labelRenderer").destroy(),t.prototype.destroy.call(this)},e}(i);t.exports=l},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(53),a=n(3),o=function(t){function e(e){var n,r=i(i(n=t.call(this)||this)),o={visible:!0},s=r.getDefaultCfg();return r._attrs=o,a.deepMix(o,s,e),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{}},n.get=function(t){return this._attrs[t]},n.set=function(t,e){this._attrs[t]=e},n.changeVisible=function(){},n.destroy=function(){this._attrs={},this.removeAllListeners(),this.destroyed=!0},e}(r);t.exports=o},function(t,e,n){var i=n(3),r=n(158),a=n(327),o=n(14).FONT_FAMILY,s=i.Event,l=i.Group,u=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"continuous-legend",items:null,layout:"vertical",width:20,height:156,textStyle:{fill:"#333",textAlign:"center",textBaseline:"middle",stroke:"#fff",lineWidth:5,fontFamily:o},hoverTextStyle:{fill:"rgba(0,0,0,0.25)"},slidable:!0,triggerAttr:{fill:"#fff",shadowBlur:10,shadowColor:"rgba(0,0,0,0.65)",radius:2},_range:[0,100],middleBackgroundStyle:{fill:"#D9D9D9"},textOffset:4,lineStyle:{lineWidth:1,stroke:"#fff"},pointerStyle:{fill:"rgb(230, 230, 230)"}})},n._calStartPoint=function(){var t={x:10,y:this.get("titleGap")-8},e=this.get("titleShape");if(e){var n=e.getBBox();t.y+=n.height}return t},n.beforeRender=function(){var e=this.get("items");i.isArray(e)&&!i.isEmpty(e)&&(t.prototype.beforeRender.call(this),this.set("firstItem",e[0]),this.set("lastItem",e[e.length-1]))},n._formatItemValue=function(t){var e=this.get("formatter")||this.get("itemFormatter");return e&&(t=e.call(this,t)),t},n.render=function(){t.prototype.render.call(this),this.get("slidable")?this._renderSlider():this._renderUnslidable()},n._renderSlider=function(){var t=new l,e=new l,n=new l,i=this._calStartPoint(),r=this.get("group").addGroup(a,{minHandleElement:t,maxHandleElement:e,backgroundElement:n,layout:this.get("layout"),range:this.get("_range"),width:this.get("width"),height:this.get("height")});r.translate(i.x,i.y),this.set("slider",r);this._renderSliderShape().attr("clip",r.get("middleHandleElement")),this._renderTrigger()},n._addMiddleBar=function(t,e,n){return t.addShape(e,{attrs:i.mix({},n,this.get("middleBackgroundStyle"))}),t.addShape(e,{attrs:n})},n._renderTrigger=function(){var t=this.get("firstItem"),e=this.get("lastItem"),n=this.get("layout"),r=this.get("textStyle"),a=this.get("triggerAttr"),o=i.mix({},a),s=i.mix({},a),l=i.mix({text:this._formatItemValue(t.value)+""},r),u=i.mix({text:this._formatItemValue(e.value)+""},r);"vertical"===n?(this._addVerticalTrigger("min",o,l),this._addVerticalTrigger("max",s,u)):(this._addHorizontalTrigger("min",o,l),this._addHorizontalTrigger("max",s,u))},n._addVerticalTrigger=function(t,e,n){var r=this.get("slider").get(t+"HandleElement"),a=this.get("width"),o=r.addShape("rect",{attrs:i.mix({x:a/2-8-2,y:"min"===t?0:-8,width:18,height:8},e)}),s=r.addShape("text",{attrs:i.mix(n,{x:a+this.get("textOffset"),y:"max"===t?-4:4,textAlign:"start",lineHeight:1,textBaseline:"middle"})}),l="vertical"===this.get("layout")?"ns-resize":"ew-resize";o.attr("cursor",l),s.attr("cursor",l),this.set(t+"ButtonElement",o),this.set(t+"TextElement",s)},n._addHorizontalTrigger=function(t,e,n){var r=this.get("slider").get(t+"HandleElement"),a=r.addShape("rect",{attrs:i.mix({x:"min"===t?-8:0,y:-8-this.get("height")/2,width:8,height:16},e)}),o=r.addShape("text",{attrs:i.mix(n,{x:"min"===t?-12:12,y:4+this.get("textOffset")+10,textAlign:"min"===t?"end":"start",textBaseline:"middle"})}),s="vertical"===this.get("layout")?"ns-resize":"ew-resize";a.attr("cursor",s),o.attr("cursor",s),this.set(t+"ButtonElement",a),this.set(t+"TextElement",o)},n._bindEvents=function(){var t=this;if(this.get("slidable")){this.get("slider").on("sliderchange",function(e){var n=e.range,i=t.get("firstItem").value,r=t.get("lastItem").value,a=i+n[0]/100*(r-i),o=i+n[1]/100*(r-i);t._updateElement(a,o);var l=new s("itemfilter",e,!0,!0);l.range=[a,o],t.emit("itemfilter",l)})}this.get("hoverable")&&(this.get("group").on("mousemove",i.wrapBehavior(this,"_onMouseMove")),this.get("group").on("mouseleave",i.wrapBehavior(this,"_onMouseLeave")))},n._updateElement=function(t,e){var n=this.get("minTextElement"),i=this.get("maxTextElement");e>1&&(t=parseInt(t,10),e=parseInt(e,10)),n.attr("text",this._formatItemValue(t)+""),i.attr("text",this._formatItemValue(e)+"")},n._onMouseLeave=function(){var t=this.get("group").findById("hoverPointer");t&&t.destroy();var e=this.get("group").findById("hoverText");e&&e.destroy(),this.get("canvas").draw()},n._onMouseMove=function(t){var e,n=this.get("height"),i=this.get("width"),r=this.get("items"),a=this.get("canvas").get("el").getBoundingClientRect(),o=this.get("group").getBBox();if("vertical"===this.get("layout")){var s=5;"color-legend"===this.get("type")&&(s=30);var l=this.get("titleGap"),u=this.get("titleShape");u&&(l+=u.getBBox().maxY-u.getBBox().minY);var c=t.clientY||t.event.clientY;c=c-a.y-this.get("group").attr("matrix")[7]+o.y-s+l,e=r[0].value+(1-c/n)*(r[r.length-1].value-r[0].value)}else{var h=t.clientX||t.event.clientX;h=h-a.x-this.get("group").attr("matrix")[6],e=r[0].value+h/i*(r[r.length-1].value-r[0].value)}e=e.toFixed(2),this.activate(e),this.emit("mousehover",{value:e})},n.activate=function(t){if(t){var e=this.get("group").findById("hoverPointer"),n=this.get("group").findById("hoverText"),r=this.get("items");if(!(tr[r.length-1].value)){var a,o=this.get("height"),s=this.get("width"),l=this.get("titleShape"),u=this.get("titleGap"),c=[],h=(t-r[0].value)/(r[r.length-1].value-r[0].value);if("vertical"===this.get("layout")){var f=0,p=0;"color-legend"===this.get("type")&&(f=u,l&&(f+=l.getBBox().height)),this.get("slidable")&&("color-legend"===this.get("type")?f-=13:(f=u-15,l&&(f+=l.getBBox().height)),p+=10),c=[[p,(h=(1-h)*o)+f],[p-10,h+f-5],[p-10,h+f+5]],a=i.mix({},{x:s+this.get("textOffset")/2+p,y:h+f,text:this._formatItemValue(t)+""},this.get("textStyle"),{textAlign:"start"})}else{var g=0,d=0;"color-legend"===this.get("type")&&(g=u,l&&(g+=l.getBBox().height)),this.get("slidable")&&("color-legend"===this.get("type")?g-=7:(g=u,l||(g-=7)),d+=10),c=[[(h*=s)+d,g],[h+d-5,g-10],[h+d+5,g-10]],a=i.mix({},{x:h-5,y:o+this.get("textOffset")+g,text:this._formatItemValue(t)+""},this.get("textStyle"))}var v=i.mix(a,this.get("hoverTextStyle"));n?n.attr(v):(n=this.get("group").addShape("text",{attrs:v})).set("id","hoverText"),e?e.attr(i.mix({points:c},this.get("pointerStyle"))):(e=this.get("group").addShape("Polygon",{attrs:i.mix({points:c},this.get("pointerStyle"))})).set("id","hoverPointer"),this.get("canvas").draw()}}},n.deactivate=function(){var t=this.get("group").findById("hoverPointer");t&&t.destroy();var e=this.get("group").findById("hoverText");e&&e.destroy(),this.get("canvas").draw()},e}(r);t.exports=u},function(t,e,n){var i=n(66),r=n(3),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{x:0,y:0,items:null,titleContent:null,showTitle:!0,plotRange:null,offset:10,timeStamp:0,inPlot:!0,crosshairs:null})},n.isContentChange=function(t,e){var n=this.get("titleContent"),i=this.get("items"),a=!(t===n&&i.length===e.length);return a||r.each(e,function(t,e){var n=i[e];for(var o in t)if(t.hasOwnProperty(o)&&!r.isObject(t[o])&&t[o]!==n[o]){a=!0;break}if(a)return!1}),a},n.setContent=function(t,e){var n=(new Date).valueOf();return this.set("items",e),this.set("titleContent",t),this.set("timeStamp",n),this.render(),this},n.setPosition=function(t,e){this.set("x",t),this.set("y",e)},n.render=function(){},n.clear=function(){},n.show=function(){this.set("visible",!0)},n.hide=function(){this.set("visible",!1)},n.destroy=function(){},e}(i);t.exports=a},function(t,e,n){"use strict";function i(t,e){this._groups=t,this._parents=e}function r(){return new i([[document.documentElement]],F)}n.d(e,"c",function(){return F}),e.a=i;var a=n(402),o=n(403),s=n(404),l=n(405),u=n(382),c=n(407),h=n(408),f=n(409),p=n(410),g=n(411),d=n(412),v=n(413),y=n(414),x=n(415),m=n(416),_=n(417),b=n(384),w=n(418),S=n(419),M=n(420),C=n(421),A=n(422),k=n(423),P=n(424),T=n(425),I=n(426),O=n(427),L=n(428),E=n(374),D=n(429),F=[null];i.prototype=r.prototype={constructor:i,select:a.a,selectAll:o.a,filter:s.a,data:l.a,enter:u.b,exit:c.a,merge:h.a,order:f.a,sort:p.a,call:g.a,nodes:d.a,node:v.a,size:y.a,empty:x.a,each:m.a,attr:_.a,style:b.a,property:w.a,classed:S.a,text:M.a,html:C.a,raise:A.a,lower:k.a,append:P.a,insert:T.a,remove:I.a,clone:O.a,datum:L.a,on:E.b,dispatch:D.a},e.b=r},function(t,e,n){"use strict";function i(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}n.d(e,"c",function(){return u}),n.d(e,"d",function(){return c}),n.d(e,"b",function(){return p}),n.d(e,"a",function(){return g}),e.g=function(t,e){var n=i(t,e);if(n.state>l)throw new Error("too late; already scheduled");return n},e.h=function(t,e){var n=i(t,e);if(n.state>c)throw new Error("too late; already started");return n},e.f=i;var r=n(438),a=n(170),o=Object(r.a)("start","end","interrupt"),s=[],l=0,u=1,c=2,h=3,f=4,p=5,g=6;e.e=function(t,e,n,i,r,d){var v=t.__transition;if(v){if(n in v)return}else t.__transition={};!function(t,e,n){function i(p){var d,v,y,x;if(n.state!==u)return o();for(d in l)if((x=l[d]).name===n.name){if(x.state===h)return Object(a.timeout)(i);x.state===f?(x.state=g,x.timer.stop(),x.on.call("interrupt",t,t.__data__,x.index,x.group),delete l[d]):+d0?new Date(t).getTime():new Date(t.replace(/-/gi,"/")).getTime()),r(t)&&(t=t.getTime()),t}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(401);n.d(e,"create",function(){return i.a});var r=n(360);n.d(e,"creator",function(){return r.a});var a=n(430);n.d(e,"local",function(){return a.a});var o=n(381);n.d(e,"matcher",function(){return o.a});var s=n(431);n.d(e,"mouse",function(){return s.a});var l=n(370);n.d(e,"namespace",function(){return l.a});var u=n(371);n.d(e,"namespaces",function(){return u.a});var c=n(361);n.d(e,"clientPoint",function(){return c.a});var h=n(379);n.d(e,"select",function(){return h.a});var f=n(432);n.d(e,"selectAll",function(){return f.a});var p=n(69);n.d(e,"selection",function(){return p.b});var g=n(372);n.d(e,"selector",function(){return g.a});var d=n(380);n.d(e,"selectorAll",function(){return d.a});var v=n(384);n.d(e,"style",function(){return v.b});var y=n(433);n.d(e,"touch",function(){return y.a});var x=n(434);n.d(e,"touches",function(){return x.a});var m=n(373);n.d(e,"window",function(){return m.a});var _=n(374);n.d(e,"event",function(){return _.c}),n.d(e,"customEvent",function(){return _.a})},function(t,e,n){t.exports={Position:n(292),Color:n(293),Shape:n(294),Size:n(295),Opacity:n(296),ColorUtil:n(149)}},function(t,e,n){var i=n(75),r=n(17);r.Linear=n(33),r.Identity=n(175),r.Cat=n(77),r.Time=n(176),r.TimeCat=n(178),r.Log=n(179),r.Pow=n(180);var a=function(t){if(r.hasOwnProperty(t)){var e=i(t);r[e]=function(e){return new r[t](e)}}};for(var o in r)a(o);var s=["cat","timeCat"];r.isCategory=function(t){return s.indexOf(t)>=0},t.exports=r},function(t,e,n){var i=n(23);t.exports=function(t){var e=i(t);return e.charAt(0).toLowerCase()+e.substring(1)}},function(t,e){function n(t,e){var n=t.length;if(0===n)return NaN;var i=t[0];if(e=t[n-1])return t[n-1];for(var r=1;rt[n-1])return NaN;if(er&&(e=parseFloat(e.toFixed(n)))}else for(;t>10;)e*=10,t/=10;return e}(t*=i);i*=o,t/=o}var s=(t="floor"===n?a.snapFloor(e,t):"ceil"===n?a.snapCeiling(e,t):a.snapTo(e,t))*i;if(Math.abs(i)<1&&s.toString().length>r){s=t/parseInt(1/i)*(i>0?1:-1)}return s},snapMultiple:function(t,e,n){return("ceil"===n?Math.ceil(t/e):"floor"===n?Math.floor(t/e):Math.round(t/e))*e},snapTo:function(t,e){var r=n(t,e),a=i(t,e);if(isNaN(r)||isNaN(a)){if(t[0]>=e)return t[0];var o=t[t.length-1];if(o<=e)return o}return Math.abs(e-r)20&&(r=20),parseFloat(t.toFixed(r))}};t.exports=a},function(t,e,n){var i=n(17),r=n(78),a=n(2),o=n(9),s=n(10),l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="cat",this.isCategory=!0,this.isRounding=!0},n.init=function(){var t=this.values,e=this.tickCount;if(a(t,function(e,n){t[n]=e.toString()}),!this.ticks){var n=t;if(e){n=r({maxCount:e,data:t,isRounding:this.isRounding}).ticks}this.ticks=n}},n.getText=function(e){return-1===this.values.indexOf(e)&&o(e)&&(e=this.values[Math.round(e)]),t.prototype.getText.call(this,e)},n.translate=function(t){var e=this.values.indexOf(t);return-1===e&&o(t)?e=t:-1===e&&(e=NaN),e},n.scale=function(t){var e,n=this.rangeMin(),i=this.rangeMax();return(s(t)||-1!==this.values.indexOf(t))&&(t=this.translate(t)),e=this.values.length>1?t/(this.values.length-1):t,n+e*(i-n)},n.invert=function(t){if(s(t))return t;var e=this.rangeMin(),n=this.rangeMax();tn&&(t=n);var i=(t-e)/(n-e),r=Math.round(i*(this.values.length-1))%this.values.length;return r=r||0,this.values[r]},e}(i);i.Cat=l,t.exports=l},function(t,e,n){var i=n(2);t.exports=function(t){var e,n={},r=[],a=t.isRounding,o=function(t){var e=[];return i(t,function(t){e=e.concat(t)}),e}(t.data),s=o.length,l=t.maxCount||8;if(a?2===(e=function(t,e){var n;for(n=e;n>0&&t%n!=0;n--);if(1===n)for(n=e;n>0&&(t-1)%n!=0;n--);return n}(s-1,l-1)+1)?e=l:e3?0:(t-t%10!=10)*t%10]}};var x={D:function(t){return t.getDate()},DD:function(t){return s(t.getDate())},Do:function(t,e){return e.DoFn(t.getDate())},d:function(t){return t.getDay()},dd:function(t){return s(t.getDay())},ddd:function(t,e){return e.dayNamesShort[t.getDay()]},dddd:function(t,e){return e.dayNames[t.getDay()]},M:function(t){return t.getMonth()+1},MM:function(t){return s(t.getMonth()+1)},MMM:function(t,e){return e.monthNamesShort[t.getMonth()]},MMMM:function(t,e){return e.monthNames[t.getMonth()]},YY:function(t){return String(t.getFullYear()).substr(2)},YYYY:function(t){return s(t.getFullYear(),4)},h:function(t){return t.getHours()%12||12},hh:function(t){return s(t.getHours()%12||12)},H:function(t){return t.getHours()},HH:function(t){return s(t.getHours())},m:function(t){return t.getMinutes()},mm:function(t){return s(t.getMinutes())},s:function(t){return t.getSeconds()},ss:function(t){return s(t.getSeconds())},S:function(t){return Math.round(t.getMilliseconds()/100)},SS:function(t){return s(Math.round(t.getMilliseconds()/10),2)},SSS:function(t){return s(t.getMilliseconds(),3)},a:function(t,e){return t.getHours()<12?e.amPm[0]:e.amPm[1]},A:function(t,e){return t.getHours()<12?e.amPm[0].toUpperCase():e.amPm[1].toUpperCase()},ZZ:function(t){var e=t.getTimezoneOffset();return(e>0?"-":"+")+s(100*Math.floor(Math.abs(e)/60)+Math.abs(e)%60,4)}},m={D:[c,function(t,e){t.day=e}],Do:[new RegExp(c.source+h.source),function(t,e){t.day=parseInt(e,10)}],M:[c,function(t,e){t.month=e-1}],YY:[c,function(t,e){var n=+(""+(new Date).getFullYear()).substr(0,2);t.year=""+(e>68?n-1:n)+e}],h:[c,function(t,e){t.hour=e}],m:[c,function(t,e){t.minute=e}],s:[c,function(t,e){t.second=e}],YYYY:[/\d{4}/,function(t,e){t.year=e}],S:[/\d/,function(t,e){t.millisecond=100*e}],SS:[/\d{2}/,function(t,e){t.millisecond=10*e}],SSS:[/\d{3}/,function(t,e){t.millisecond=e}],d:[c,p],ddd:[h,p],MMM:[h,o("monthNamesShort")],MMMM:[h,o("monthNames")],a:[h,function(t,e,n){var i=e.toLowerCase();i===n.amPm[0]?t.isPm=!1:i===n.amPm[1]&&(t.isPm=!0)}],ZZ:[/([\+\-]\d\d:?\d\d|Z)/,function(t,e){"Z"===e&&(e="+00:00");var n,i=(e+"").match(/([\+\-]|\d\d)/gi);i&&(n=60*i[1]+parseInt(i[2],10),t.timezoneOffset="+"===i[0]?n:-n)}]};m.dd=m.d,m.dddd=m.ddd,m.DD=m.D,m.mm=m.m,m.hh=m.H=m.HH=m.h,m.MM=m.M,m.ss=m.s,m.A=m.a,l.masks={default:"ddd MMM DD YYYY HH:mm:ss",shortDate:"M/D/YY",mediumDate:"MMM D, YYYY",longDate:"MMMM D, YYYY",fullDate:"dddd, MMMM D, YYYY",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},l.format=function(t,e,n){var i=n||l.i18n;if("number"==typeof t&&(t=new Date(t)),"[object Date]"!==Object.prototype.toString.call(t)||isNaN(t.getTime()))throw new Error("Invalid Date in fecha.format");var r=[];return e=(e=l.masks[e]||e||l.masks.default).replace(f,function(t,e){return r.push(e),"??"}),(e=e.replace(u,function(e){return e in x?x[e](t,i):e.slice(1,e.length-1)})).replace(/\?\?/g,function(){return r.shift()})},l.parse=function(t,e,n){var i=n||l.i18n;if("string"!=typeof e)throw new Error("Invalid format in fecha.parse");if(e=l.masks[e]||e,t.length>1e3)return!1;var r=!0,a={};if(e.replace(u,function(e){if(m[e]){var n=m[e],o=t.search(n[0]);~o?t.replace(n[0],function(e){return n[1](a,e,i),t=t.substr(o+e.length),e}):r=!1}return m[e]?"":e.slice(1,e.length-1)}),!r)return!1;var o=new Date;!0===a.isPm&&null!=a.hour&&12!=+a.hour?a.hour=+a.hour+12:!1===a.isPm&&12==+a.hour&&(a.hour=0);var s;return null!=a.timezoneOffset?(a.minute=+(a.minute||0)-+a.timezoneOffset,s=new Date(Date.UTC(a.year||o.getFullYear(),a.month||0,a.day||1,a.hour||0,a.minute||0,a.second||0,a.millisecond||0))):s=new Date(a.year||o.getFullYear(),a.month||0,a.day||1,a.hour||0,a.minute||0,a.second||0,a.millisecond||0),s},void 0!==t&&t.exports?t.exports=l:void 0!==(i=function(){return l}.call(e,n,e,t))&&(t.exports=i)}()},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Date")}},function(t,e,n){t.exports={isFunction:n(11),isObject:n(24),isBoolean:n(82),isNil:n(5),isString:n(10),isArray:n(4),isNumber:n(9),isEmpty:n(83),uniqueId:n(86),clone:n(46),deepMix:n(47),assign:n(8),merge:n(47),upperFirst:n(87),each:n(2),isEqual:n(49),toArray:n(34),extend:n(88),augment:n(89),remove:n(90),isNumberEqual:n(35),toRadian:n(91),toDegree:n(92),mod:n(93),clamp:n(50),createDom:n(94),modifyCSS:n(95),requestAnimationFrame:n(96),getRatio:function(){return window.devicePixelRatio?window.devicePixelRatio:2},mat3:n(51),vec2:n(97),vec3:n(98),transform:n(99)}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Boolean")}},function(t,e,n){var i=n(5),r=n(13),a=n(84),o=n(85),s=Object.prototype.hasOwnProperty;t.exports=function(t){if(i(t))return!0;if(r(t))return!t.length;var e=a(t);if("Map"===e||"Set"===e)return!t.size;if(o(t))return!Object.keys(t).length;for(var n in t)if(s.call(t,n))return!1;return!0}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).replace(/^\[object /,"").replace(/\]$/,"")}},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},function(t,e){var n=function(){var t={};return function(e){return e=e||"g",t[e]?t[e]+=1:t[e]=1,e+t[e]}}();t.exports=n},function(t,e,n){var i=n(23);t.exports=function(t){var e=i(t);return e.charAt(0).toUpperCase()+e.substring(1)}},function(t,e,n){var i=n(11),r=n(8);t.exports=function(t,e,n,a){i(e)||(n=e,e=t,t=function(){});var o=Object.create?function(t,e){return Object.create(t,{constructor:{value:e}})}:function(t,e){function n(){}n.prototype=t;var i=new n;return i.constructor=e,i},s=o(e.prototype,t);return t.prototype=r(s,t.prototype),t.superclass=o(e.prototype,e),r(s,n),r(t,a),t}},function(t,e,n){var i=n(11),r=n(34),a=n(8);t.exports=function(t){for(var e=r(arguments),n=1;n-1;)i.call(t,s,1);return t}},function(t,e){var n=Math.PI/180;t.exports=function(t){return n*t}},function(t,e){var n=180/Math.PI;t.exports=function(t){return n*t}},function(t,e){t.exports=function(t,e){return(t%e+e)%e}},function(t,e){var n=document.createElement("table"),i=document.createElement("tr"),r=/^\s*<(\w+|!)[^>]*>/,a={tr:document.createElement("tbody"),tbody:n,thead:n,tfoot:n,td:i,th:i,"*":document.createElement("div")};t.exports=function(t){var e=r.test(t)&&RegExp.$1;e in a||(e="*");var n=a[e];t=t.replace(/(^\s*)|(\s*$)/g,""),n.innerHTML=""+t;var i=n.childNodes[0];return n.removeChild(i),i}},function(t,e){t.exports=function(t,e){if(t)for(var n in e)e.hasOwnProperty(n)&&(t.style[n]=e[n]);return t}},function(t,e){t.exports=function(t){return(window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(t){return setTimeout(t,16)})(t)}},function(t,e,n){var i=n(183),r=n(50);i.angle=function(t,e){var n=i.dot(t,e)/(i.length(t)*i.length(e));return Math.acos(r(n,-1,1))},i.direction=function(t,e){return t[0]*e[1]-e[0]*t[1]},i.angleTo=function(t,e,n){var r=i.angle(t,e),a=i.direction(t,e)>=0;return n?a?2*Math.PI-r:r:a?r:2*Math.PI-r},i.vertical=function(t,e,n){return n?(t[0]=e[1],t[1]=-1*e[0]):(t[0]=-1*e[1],t[1]=e[0]),t},t.exports=i},function(t,e,n){var i=n(184);t.exports=i},function(t,e,n){var i=n(46),r=n(2),a=n(51);t.exports=function(t,e){return t=i(t),r(e,function(e){switch(e[0]){case"t":a.translate(t,t,[e[1],e[2]]);break;case"s":a.scale(t,t,[e[1],e[2]]);break;case"r":a.rotate(t,t,e[1]);break;case"m":a.multiply(t,t,e[1]);break;default:return!1}}),t}},function(t,e,n){var i=n(1),r=function(t,e,n,i){this.type=t,this.target=null,this.currentTarget=null,this.bubbles=n,this.cancelable=i,this.timeStamp=(new Date).getTime(),this.defaultPrevented=!1,this.propagationStopped=!1,this.removed=!1,this.event=e};i.augment(r,{preventDefault:function(){this.defaultPrevented=this.cancelable&&!0},stopPropagation:function(){this.propagationStopped=!0},remove:function(){this.remove=!0},clone:function(){return i.clone(this)},toString:function(){return"[Event (type="+this.type+")]"}}),t.exports=r},function(t,e,n){function i(t,e,n){for(var i,r=t.length-1;r>=0;r--){var a=t[r];if(a._cfg.visible&&a._cfg.capture&&(a.isGroup?i=a.getShape(e,n):a.isHit(e,n)&&(i=a)),i)break}return i}function r(t){if(!t._cfg&&t!==c){var e=t.superclass.constructor;e&&!e._cfg&&r(e),t._cfg={},a.merge(t._cfg,e._cfg),a.merge(t._cfg,t.CFG)}}var a=n(1),o=n(102),s=n(188),l={},u="_INDEX",c=function t(e){t.superclass.constructor.call(this,e),this.set("children",[]),this.set("tobeRemoved",[]),this._beforeRenderUI(),this._renderUI(),this._bindUI()};a.extend(c,o),a.augment(c,{isGroup:!0,type:"group",canFill:!0,canStroke:!0,getDefaultCfg:function(){return r(this.constructor),a.merge({},this.constructor._cfg)},_beforeRenderUI:function(){},_renderUI:function(){},_bindUI:function(){},addShape:function(t,e){var n=this.get("canvas");e=e||{};var i=l[t];if(i||(i=a.upperFirst(t),l[t]=i),e.attrs&&n){var r=e.attrs;if("text"===t){var o=n.get("fontFamily");o&&(r.fontFamily=r.fontFamily?r.fontFamily:o)}}e.canvas=n,e.type=t;var u=new s[i](e);return this.add(u),u},addGroup:function(t,e){var n,i=this.get("canvas");if(e=a.merge({},e),a.isFunction(t))e?(e.canvas=i,e.parent=this,n=new t(e)):n=new t({canvas:i,parent:this}),this.add(n);else if(a.isObject(t))t.canvas=i,n=new c(t),this.add(n);else{if(void 0!==t)return!1;n=new c,this.add(n)}return n},renderBack:function(t,e){var n=this.get("backShape"),i=this.getBBox();return a.merge(e,{x:i.minX-t[3],y:i.minY-t[0],width:i.width+t[1]+t[3],height:i.height+t[0]+t[2]}),n?n.attr(e):n=this.addShape("rect",{zIndex:-1,attrs:e}),this.set("backShape",n),this.sort(),n},removeChild:function(t,e){if(arguments.length>=2)this.contain(t)&&t.remove(e);else{if(1===arguments.length){if(!a.isBoolean(t))return this.contain(t)&&t.remove(!0),this;e=t}0===arguments.length&&(e=!0),c.superclass.remove.call(this,e)}return this},add:function(t){var e=this,n=e.get("children");if(a.isArray(t))a.each(t,function(t){var n=t.get("parent");n&&n.removeChild(t,!1),e._setCfgProperty(t)}),e._cfg.children=n.concat(t);else{var i=t,r=i.get("parent");r&&r.removeChild(i,!1),e._setCfgProperty(i),n.push(i)}return e},_setCfgProperty:function(t){var e=this._cfg;t.set("parent",this),t.set("canvas",e.canvas),e.timeline&&t.set("timeline",e.timeline)},contain:function(t){return this.get("children").indexOf(t)>-1},getChildByIndex:function(t){return this.get("children")[t]},getFirst:function(){return this.getChildByIndex(0)},getLast:function(){var t=this.get("children").length-1;return this.getChildByIndex(t)},getBBox:function(){var t=1/0,e=-1/0,n=1/0,i=-1/0,r=this.get("children");r.length>0?a.each(r,function(r){if(r.get("visible")){if(r.isGroup&&0===r.get("children").length)return;var a=r.getBBox();if(!a)return!0;var o=[a.minX,a.minY,1],s=[a.minX,a.maxY,1],l=[a.maxX,a.minY,1],u=[a.maxX,a.maxY,1];r.apply(o),r.apply(s),r.apply(l),r.apply(u);var c=Math.min(o[0],s[0],l[0],u[0]),h=Math.max(o[0],s[0],l[0],u[0]),f=Math.min(o[1],s[1],l[1],u[1]),p=Math.max(o[1],s[1],l[1],u[1]);ce&&(e=h),fi&&(i=p)}}):(t=0,e=0,n=0,i=0);var o={minX:t,minY:n,maxX:e,maxY:i};return o.x=o.minX,o.y=o.minY,o.width=o.maxX-o.minX,o.height=o.maxY-o.minY,o},getCount:function(){return this.get("children").length},sort:function(){var t=this.get("children");return a.each(t,function(t,e){return t[u]=e,t}),t.sort(function(t){return function(e,n){var i=t(e,n);return 0===i?e[u]-n[u]:i}}(function(t,e){return t.get("zIndex")-e.get("zIndex")})),this},findById:function(t){return this.find(function(e){return e.get("id")===t})},find:function(t){if(a.isString(t))return this.findById(t);var e=this.get("children"),n=null;return a.each(e,function(e){if(t(e)?n=e:e.find&&(n=e.find(t)),n)return!1}),n},findAll:function(t){var e=this.get("children"),n=[],i=[];return a.each(e,function(e){t(e)&&n.push(e),e.findAllBy&&(i=e.findAllBy(t),n=n.concat(i))}),n},findBy:function(t){var e=this.get("children"),n=null;return a.each(e,function(e){if(t(e)?n=e:e.findBy&&(n=e.findBy(t)),n)return!1}),n},findAllBy:function(t){var e=this.get("children"),n=[],i=[];return a.each(e,function(e){t(e)&&n.push(e),e.findAllBy&&(i=e.findAllBy(t),n=n.concat(i))}),n},getShape:function(t,e){var n,r=this._attrs.clip,a=this._cfg.children;if(r){var o=[t,e,1];r.invert(o,this.get("canvas")),r.isPointInPath(o[0],o[1])&&(n=i(a,t,e))}else n=i(a,t,e);return n},clearTotalMatrix:function(){if(this.get("totalMatrix")){this.setSilent("totalMatrix",null);for(var t=this._cfg.children,e=0;e=0;n--)e[n].remove(!0,t);return this._cfg.children=[],this},destroy:function(){this.get("destroyed")||(this.clear(),c.superclass.destroy.call(this))},clone:function(){var t=this._cfg.children,e=new c;return a.each(t,function(t){e.add(t.clone())}),e}}),t.exports=c},function(t,e,n){var i=n(1),r=n(185),a=n(186),o=n(187),s=n(53),l=function(t){this._cfg={zIndex:0,capture:!0,visible:!0,destroyed:!1},i.assign(this._cfg,this.getDefaultCfg(),t),this.initAttrs(this._cfg.attrs),this._cfg.attrs={},this.initTransform(),this.init()};l.CFG={id:null,zIndex:0,canvas:null,parent:null,capture:!0,context:null,visible:!0,destroyed:!1},i.augment(l,r,a,s,o,{init:function(){this.setSilent("animable",!0),this.setSilent("animating",!1)},getParent:function(){return this._cfg.parent},getDefaultCfg:function(){return{}},set:function(t,e){return"zIndex"===t&&this._beforeSetZIndex&&this._beforeSetZIndex(e),"loading"===t&&this._beforeSetLoading&&this._beforeSetLoading(e),this._cfg[t]=e,this},setSilent:function(t,e){this._cfg[t]=e},get:function(t){return this._cfg[t]},show:function(){return this._cfg.visible=!0,this},hide:function(){return this._cfg.visible=!1,this},remove:function(t,e){var n=this._cfg,r=n.parent,a=n.el;return r&&i.remove(r.get("children"),this),a&&(e?r&&r._cfg.tobeRemoved.push(a):a.parentNode.removeChild(a)),(t||void 0===t)&&this.destroy(),this},destroy:function(){this.get("destroyed")||(this._attrs=null,this.removeEvent(),this._cfg={destroyed:!0})},toFront:function(){var t=this._cfg,e=t.parent;if(e){var n=e._cfg.children,i=t.el,r=n.indexOf(this);n.splice(r,1),n.push(this),i&&(i.parentNode.removeChild(i),t.el=null)}},toBack:function(){var t=this._cfg,e=t.parent;if(e){var n=e._cfg.children,i=t.el,r=n.indexOf(this);if(n.splice(r,1),n.unshift(this),i){var a=i.parentNode;a.removeChild(i),a.insertBefore(i,a.firstChild)}}},_beforeSetZIndex:function(t){var e=this._cfg.parent;this._cfg.zIndex=t,i.isNil(e)||e.sort();var n=this._cfg.el;if(n){var r=e._cfg.children,a=r.indexOf(this),o=n.parentNode;o.removeChild(n),a===r.length-1?o.appendChild(n):o.insertBefore(n,o.childNodes[a])}return t},_setAttrs:function(t){return this.attr(t),t},setZIndex:function(t){return this._cfg.zIndex=t,this._beforeSetZIndex(t)},clone:function(){return i.clone(this)},getBBox:function(){}}),t.exports=l},function(t,e,n){function i(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function r(t,e,n,r,a,s,l,u,c){var h,f,p,g,d,v,y,x=.005,m=1/0,_=[l,u];for(d=0;d<1;d+=.05)p=[i(t,n,a,d),i(e,r,s,d)],(f=o.squaredDistance(_,p))=0&&f=0?[r]:[]}}},function(t,e){t.exports={xAt:function(t,e,n,i,r){return e*Math.cos(t)*Math.cos(r)-n*Math.sin(t)*Math.sin(r)+i},yAt:function(t,e,n,i,r){return e*Math.sin(t)*Math.cos(r)+n*Math.cos(t)*Math.sin(r)+i},xExtrema:function(t,e,n){return Math.atan(-n/e*Math.tan(t))},yExtrema:function(t,e,n){return Math.atan(n/(e*Math.tan(t)))}}},function(t,e,n){function i(t,e,n){return t+e*Math.cos(n)}function r(t,e,n){return t+e*Math.sin(n)}var a=n(1),o=n(6),s=n(37),l=n(38),u=function t(e){t.superclass.constructor.call(this,e)};u.ATTRS={x:0,y:0,r:0,startAngle:0,endAngle:0,clockwise:!1,lineWidth:1,startArrow:!1,endArrow:!1},a.extend(u,o),a.augment(u,{canStroke:!0,type:"arc",getDefaultAttrs:function(){return{x:0,y:0,r:0,startAngle:0,endAngle:0,clockwise:!1,lineWidth:1,startArrow:!1,endArrow:!1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.r,r=t.startAngle,a=t.endAngle,o=t.clockwise,l=this.getHitLineWidth()/2,u=s.box(e,n,i,r,a,o);return u.minX-=l,u.minY-=l,u.maxX+=l,u.maxY+=l,u},getStartTangent:function(){var t=this._attrs,e=t.x,n=t.y,a=t.startAngle,o=t.r,s=t.clockwise,l=Math.PI/180;s&&(l*=-1);var u=[],c=i(e,o,a+l),h=r(n,o,a+l),f=i(e,o,a),p=r(n,o,a);return u.push([c,h]),u.push([f,p]),u},getEndTangent:function(){var t=this._attrs,e=t.x,n=t.y,a=t.endAngle,o=t.r,s=t.clockwise,l=Math.PI/180,u=[];s&&(l*=-1);var c=i(e,o,a+l),h=r(n,o,a+l),f=i(e,o,a),p=r(n,o,a);return u.push([f,p]),u.push([c,h]),u},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,r=e.r,a=e.startAngle,o=e.endAngle,s=e.clockwise;(t=t||self.get("context")).beginPath(),t.arc(n,i,r,a,o,s)},afterPath:function(t){var e=this._attrs;if(t=t||this.get("context"),e.startArrow){var n=this.getStartTangent();l.addStartArrow(t,e,n[0][0],n[0][1],n[1][0],n[1][1])}if(e.endArrow){var i=this.getEndTangent();l.addEndArrow(t,e,i[0][0],i[0][1],i[1][0],i[1][1])}}}),t.exports=u},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,r:0,lineWidth:1},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"circle",getDefaultAttrs:function(){return{lineWidth:1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.r,r=this.getHitLineWidth()/2+i;return{minX:e-r,minY:n-r,maxX:e+r,maxY:n+r}},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,r=e.r;t.beginPath(),t.arc(n,i,r,0,2*Math.PI,!1),t.closePath()}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"dom",calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.width,r=t.height,a=this.getHitLineWidth()/2;return{minX:e-a,minY:n-a,maxX:e+i+a,maxY:n+r+a}}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,rx:1,ry:1,lineWidth:1},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"ellipse",getDefaultAttrs:function(){return{lineWidth:1}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.rx,r=t.ry,a=this.getHitLineWidth(),o=i+a/2,s=r+a/2;return{minX:e-o,minY:n-s,maxX:e+o,maxY:n+s}},createPath:function(t){var e=this._attrs,n=e.x,r=e.y,a=e.rx,o=e.ry;t=t||self.get("context");var s=a>o?a:o,l=a>o?1:a/o,u=a>o?o/a:1,c=[1,0,0,0,1,0,0,0,1];i.mat3.scale(c,c,[l,u]),i.mat3.translate(c,c,[n,r]),t.beginPath(),t.save(),t.transform(c[0],c[1],c[3],c[4],c[6],c[7]),t.arc(0,0,s,0,2*Math.PI),t.restore(),t.closePath()}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=n(37),o=function t(e){t.superclass.constructor.call(this,e)};o.ATTRS={x:0,y:0,rs:0,re:0,startAngle:0,endAngle:0,clockwise:!1,lineWidth:1},i.extend(o,r),i.augment(o,{canFill:!0,canStroke:!0,type:"fan",getDefaultAttrs:function(){return{clockwise:!1,lineWidth:1,rs:0,re:0}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.rs,r=t.re,o=t.startAngle,s=t.endAngle,l=t.clockwise,u=this.getHitLineWidth(),c=a.box(e,n,i,o,s,l),h=a.box(e,n,r,o,s,l),f=u/2;return{minX:Math.min(c.minX,h.minX)-f,minY:Math.min(c.minY,h.minY)-f,maxX:Math.max(c.maxX,h.maxX)+f,maxY:Math.max(c.maxY,h.maxY)+f}},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,r=e.rs,a=e.re,o=e.startAngle,s=e.endAngle,l=e.clockwise,u={x:Math.cos(o)*r+n,y:Math.sin(o)*r+i},c={x:Math.cos(o)*a+n,y:Math.sin(o)*a+i},h={x:Math.cos(s)*r+n,y:Math.sin(s)*r+i};(t=t||self.get("context")).beginPath(),t.moveTo(u.x,u.y),t.lineTo(c.x,c.y),t.arc(n,i,a,o,s,l),t.lineTo(h.x,h.y),t.arc(n,i,r,s,o,!l),t.closePath()}}),t.exports=o},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,img:void 0,width:0,height:0,sx:null,sy:null,swidth:null,sheight:null},i.extend(a,r),i.augment(a,{type:"image",isHitBox:function(){return!1},calculateBox:function(){var t=this._attrs;this._cfg.attrs&&this._cfg.attrs.img===t.img||this._setAttrImg();var e=t.x,n=t.y;return{minX:e,minY:n,maxX:e+t.width,maxY:n+t.height}},_beforeSetLoading:function(t){var e=this.get("canvas");return!1===t&&!0===this.get("toDraw")&&(this._cfg.loading=!1,e.draw()),t},_setAttrImg:function(){var t=this,e=t._attrs,n=e.img;if(!i.isString(n))return n instanceof Image?(e.width||t.attr("width",n.width),e.height||t.attr("height",n.height),n):n instanceof HTMLElement&&i.isString(n.nodeName)&&"CANVAS"===n.nodeName.toUpperCase()?(e.width||t.attr("width",Number(n.getAttribute("width"))),e.height||t.attr("height",Number(n.getAttribute("height"))),n):n instanceof ImageData?(e.width||t.attr("width",n.width),e.height||t.attr("height",n.height),n):null;var r=new Image;r.onload=function(){if(t.get("destroyed"))return!1;t.attr("imgSrc",n),t.attr("img",r);var e=t.get("callback");e&&e.call(t),t.set("loading",!1)},r.src=n,r.crossOrigin="Anonymous",t.set("loading",!0)},drawInner:function(t){this._cfg.hasUpdate&&this._setAttrImg(),this.get("loading")?this.set("toDraw",!0):(this._drawImage(t),this._cfg.hasUpdate=!1)},_drawImage:function(t){var e=this._attrs,n=e.x,r=e.y,a=e.img,o=e.width,s=e.height,l=e.sx,u=e.sy,c=e.swidth,h=e.sheight;this.set("toDraw",!1);var f=a;if(f instanceof ImageData&&((f=new Image).src=a),f instanceof Image||f instanceof HTMLElement&&i.isString(f.nodeName)&&"CANVAS"===f.nodeName.toUpperCase()){if(i.isNil(l)||i.isNil(u)||i.isNil(c)||i.isNil(h))return void t.drawImage(f,n,r,o,s);if(!(i.isNil(l)||i.isNil(u)||i.isNil(c)||i.isNil(h)))return void t.drawImage(f,l,u,c,h,n,r,o,s)}}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=n(38),o=n(36),s=function t(e){t.superclass.constructor.call(this,e)};s.ATTRS={x1:0,y1:0,x2:0,y2:0,lineWidth:1,startArrow:!1,endArrow:!1},i.extend(s,r),i.augment(s,{canStroke:!0,type:"line",getDefaultAttrs:function(){return{lineWidth:1,startArrow:!1,endArrow:!1}},calculateBox:function(){var t=this._attrs,e=t.x1,n=t.y1,i=t.x2,r=t.y2,a=this.getHitLineWidth();return o.box(e,n,i,r,a)},createPath:function(t){var e=this._attrs,n=e.x1,i=e.y1,r=e.x2,a=e.y2;(t=t||self.get("context")).beginPath(),t.moveTo(n,i),t.lineTo(r,a)},afterPath:function(t){var e=this._attrs,n=e.x1,i=e.y1,r=e.x2,o=e.y2;t=t||this.get("context"),e.startArrow&&a.addStartArrow(t,e,r,o,n,i),e.endArrow&&a.addEndArrow(t,e,n,i,r,o)},getPoint:function(t){var e=this._attrs;return{x:o.at(e.x1,e.x2,t),y:o.at(e.y1,e.y2,t)}}}),t.exports=s},function(t,e,n){var i=n(1),r=n(6),a=n(39),o=n(27),s=n(38),l=n(57),u=n(55),c=function t(e){t.superclass.constructor.call(this,e)};c.ATTRS={path:null,lineWidth:1,startArrow:!1,endArrow:!1},i.extend(c,r),i.augment(c,{canFill:!0,canStroke:!0,type:"path",getDefaultAttrs:function(){return{lineWidth:1,startArrow:!1,endArrow:!1}},_afterSetAttrPath:function(t){if(i.isNil(t))return this.setSilent("segments",null),void this.setSilent("box",void 0);var e,n=o.parsePath(t),r=[];if(i.isArray(n)&&0!==n.length&&("M"===n[0][0]||"m"===n[0][0])){for(var s=n.length,l=0;lr&&(r=i.maxX),i.minYo&&(o=i.maxY))}),n===1/0||a===1/0?{minX:0,minY:0,maxX:0,maxY:0}:{minX:n,minY:a,maxX:r,maxY:o}},_setTcache:function(){var t,e,n,r,a=0,o=0,s=[],l=this._cfg.curve;l&&(i.each(l,function(t,e){n=l[e+1],r=t.length,n&&(a+=u.len(t[r-2],t[r-1],n[1],n[2],n[3],n[4],n[5],n[6]))}),i.each(l,function(i,c){n=l[c+1],r=i.length,n&&((t=[])[0]=o/a,e=u.len(i[r-2],i[r-1],n[1],n[2],n[3],n[4],n[5],n[6]),o+=e,t[1]=o/a,s.push(t))}),this._cfg.tCache=s)},_calculateCurve:function(){var t=this._attrs.path;this._cfg.curve=l.pathTocurve(t)},getStartTangent:function(){var t,e,n,r,a=this.get("segments");if(a.length>1)if(t=a[0].endPoint,e=a[1].endPoint,n=a[1].startTangent,r=[],i.isFunction(n)){var o=n();r.push([t.x-o[0],t.y-o[1]]),r.push([t.x,t.y])}else r.push([e.x,e.y]),r.push([t.x,t.y]);return r},getEndTangent:function(){var t,e,n,r,a=this.get("segments"),o=a.length;if(o>1)if(t=a[o-2].endPoint,e=a[o-1].endPoint,n=a[o-1].endTangent,r=[],i.isFunction(n)){var s=n();r.push([e.x-s[0],e.y-s[1]]),r.push([e.x,e.y])}else r.push([t.x,t.y]),r.push([e.x,e.y]);return r},getPoint:function(t){var e,n,r=this._cfg.tCache;r||(this._calculateCurve(),this._setTcache(),r=this._cfg.tCache);var a=this._cfg.curve;if(!r)return a?{x:a[0][1],y:a[0][2]}:null;i.each(r,function(i,r){t>=i[0]&&t<=i[1]&&(e=(t-i[0])/(i[1]-i[0]),n=r)});var o=a[n];if(i.isNil(o)||i.isNil(n))return null;var s=o.length,l=a[n+1];return{x:u.at(o[s-2],l[1],l[3],l[5],1-e),y:u.at(o[s-1],l[2],l[4],l[6],1-e)}},createPath:function(t){var e=this.get("segments");if(i.isArray(e)){(t=t||this.get("context")).beginPath();for(var n=e.length,r=0;ra&&(a=e),io&&(o=i)});var s=e/2;return{minX:n-s,minY:r-s,maxX:a+s,maxY:o+s}},createPath:function(t){var e=this._attrs.points;e.length<2||((t=t||this.get("context")).beginPath(),i.each(e,function(e,n){0===n?t.moveTo(e[0],e[1]):t.lineTo(e[0],e[1])}),t.closePath())}}),t.exports=a},function(t,e,n){var i=n(1),r=n(6),a=n(38),o=n(36),s=function t(e){t.superclass.constructor.call(this,e)};s.ATTRS={points:null,lineWidth:1,startArrow:!1,endArrow:!1,tCache:null},i.extend(s,r),i.augment(s,{canStroke:!0,type:"polyline",tCache:null,getDefaultAttrs:function(){return{lineWidth:1,startArrow:!1,endArrow:!1}},calculateBox:function(){var t=this._attrs,e=this.getHitLineWidth(),n=t.points;if(!n||0===n.length)return null;var r=1/0,a=1/0,o=-1/0,s=-1/0;i.each(n,function(t){var e=t[0],n=t[1];eo&&(o=e),ns&&(s=n)});var l=e/2;return{minX:r-l,minY:a-l,maxX:o+l,maxY:s+l}},_setTcache:function(){var t,e,n=this._attrs.points,r=0,a=0,s=[];n&&0!==n.length&&(i.each(n,function(t,e){n[e+1]&&(r+=o.len(t[0],t[1],n[e+1][0],n[e+1][1]))}),r<=0||(i.each(n,function(i,l){n[l+1]&&((t=[])[0]=a/r,e=o.len(i[0],i[1],n[l+1][0],n[l+1][1]),a+=e,t[1]=a/r,s.push(t))}),this.tCache=s))},createPath:function(t){var e,n,i=this._attrs.points;if(!(i.length<2)){for((t=t||this.get("context")).beginPath(),t.moveTo(i[0][0],i[0][1]),n=1,e=i.length-1;n=i[0]&&t<=i[1]&&(e=(t-i[0])/(i[1]-i[0]),n=r)}),{x:o.at(r[n][0],r[n+1][0],e),y:o.at(r[n][1],r[n+1][1],e)}}}),t.exports=s},function(t,e,n){var i=n(1),r=n(27).parseRadius,a=n(6),o=function t(e){t.superclass.constructor.call(this,e)};o.ATTRS={x:0,y:0,width:0,height:0,radius:0,lineWidth:1},i.extend(o,a),i.augment(o,{canFill:!0,canStroke:!0,type:"rect",getDefaultAttrs:function(){return{lineWidth:1,radius:0}},calculateBox:function(){var t=this._attrs,e=t.x,n=t.y,i=t.width,r=t.height,a=this.getHitLineWidth()/2;return{minX:e-a,minY:n-a,maxX:e+i+a,maxY:n+r+a}},createPath:function(t){var e=this._attrs,n=e.x,i=e.y,a=e.width,o=e.height,s=e.radius;if((t=t||this.get("context")).beginPath(),0===s)t.rect(n,i,a,o);else{var l=r(s);t.moveTo(n+l.r1,i),t.lineTo(n+a-l.r2,i),0!==l.r2&&t.arc(n+a-l.r2,i+l.r2,l.r2,-Math.PI/2,0),t.lineTo(n+a,i+o-l.r3),0!==l.r3&&t.arc(n+a-l.r3,i+o-l.r3,l.r3,0,Math.PI/2),t.lineTo(n+l.r4,i+o),0!==l.r4&&t.arc(n+l.r4,i+o-l.r4,l.r4,Math.PI/2,Math.PI),t.lineTo(n,i+l.r1),0!==l.r1&&t.arc(n+l.r1,i+l.r1,l.r1,Math.PI,1.5*Math.PI),t.closePath()}}}),t.exports=o},function(t,e,n){var i=n(1),r=n(6),a=function t(e){t.superclass.constructor.call(this,e)};a.ATTRS={x:0,y:0,text:null,fontSize:12,fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"normal",fontVariant:"normal",textAlign:"start",textBaseline:"bottom",lineHeight:null,textArr:null},i.extend(a,r),i.augment(a,{canFill:!0,canStroke:!0,type:"text",getDefaultAttrs:function(){return{lineWidth:1,lineCount:1,fontSize:12,fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"normal",fontVariant:"normal",textAlign:"start",textBaseline:"bottom"}},initTransform:function(){var t=this._attrs.fontSize;t&&+t<12&&this.transform([["t",-1*this._attrs.x,-1*this._attrs.y],["s",+t/12,+t/12],["t",this._attrs.x,this._attrs.y]])},_assembleFont:function(){var t=this._attrs,e=t.fontSize,n=t.fontFamily,i=t.fontWeight,r=t.fontStyle,a=t.fontVariant;t.font=[r,a,i,e+"px",n].join(" ")},_setAttrText:function(){var t=this._attrs,e=t.text,n=null;if(i.isString(e)&&-1!==e.indexOf("\n")){var r=(n=e.split("\n")).length;t.lineCount=r}t.textArr=n},_getTextHeight:function(){var t=this._attrs,e=t.lineCount,n=1*t.fontSize;if(e>1){return n*e+this._getSpaceingY()*(e-1)}return n},isHitBox:function(){return!1},calculateBox:function(){var t=this._attrs,e=this._cfg;e.attrs&&!e.hasUpdate||(this._assembleFont(),this._setAttrText()),t.textArr||this._setAttrText();var n=t.x,i=t.y,r=this.measureText();if(!r)return{minX:n,minY:i,maxX:n,maxY:i};var a=this._getTextHeight(),o=t.textAlign,s=t.textBaseline,l=this.getHitLineWidth(),u={x:n,y:i-a};o&&("end"===o||"right"===o?u.x-=r:"center"===o&&(u.x-=r/2)),s&&("top"===s?u.y+=a:"middle"===s&&(u.y+=a/2)),this.set("startPoint",u);var c=l/2;return{minX:u.x-c,minY:u.y-c,maxX:u.x+r+c,maxY:u.y+a+c}},_getSpaceingY:function(){var t=this._attrs,e=t.lineHeight,n=1*t.fontSize;return e?e-n:.14*n},drawInner:function(t){var e=this._attrs,n=this._cfg;n.attrs&&!n.hasUpdate||(this._assembleFont(),this._setAttrText()),t.font=e.font;var r=e.text;if(r){var a=e.textArr,o=e.x,s=e.y;if(t.beginPath(),this.hasStroke()){var l=e.strokeOpacity;i.isNil(l)||1===l||(t.globalAlpha=l),a?this._drawTextArr(t,!1):t.strokeText(r,o,s),t.globalAlpha=1}if(this.hasFill()){var u=e.fillOpacity;i.isNil(u)||1===u||(t.globalAlpha=u),a?this._drawTextArr(t,!0):t.fillText(r,o,s)}n.hasUpdate=!1}},_drawTextArr:function(t,e){var n,r=this._attrs.textArr,a=this._attrs.textBaseline,o=1*this._attrs.fontSize,s=this._getSpaceingY(),l=this._attrs.x,u=this._attrs.y,c=this.getBBox(),h=c.maxY-c.minY;i.each(r,function(i,r){n=u+r*(s+o)-h+o,"middle"===a&&(n+=h-o-(h-o)/2),"top"===a&&(n+=h-o),e?t.fillText(i,l,n):t.strokeText(i,l,n)})},measureText:function(){var t,e=this._attrs,n=e.text,r=e.font,a=e.textArr,o=0;if(!i.isNil(n)){var s=document.createElement("canvas").getContext("2d");return s.save(),s.font=r,a?i.each(a,function(e){t=s.measureText(e).width,ol&&(s=e.slice(l,s),c[u]?c[u]+=s:c[++u]=s),(n=n[0])===(o=o[0])?c[u]?c[u]+=o:c[++u]=o:(c[++u]=null,h.push({i:u,x:Object(i.a)(n,o)})),l=a.lastIndex;return lo&&(n=t,o=s)}),n}}},function(t,e){t.exports=parseInt},function(t,e){t.exports=function(t,e){return t.hasOwnProperty(e)}},function(t,e,n){var i=n(2),r=n(11),a=Object.values?function(t){return Object.values(t)}:function(t){var e=[];return i(t,function(n,i){r(t)&&"prototype"===i||e.push(n)}),e};t.exports=a},function(t,e,n){var i=n(137);t.exports=function(t,e,n,r,a){if(a)return[["M",+t+ +a,e],["l",n-2*a,0],["a",a,a,0,0,1,a,a],["l",0,r-2*a],["a",a,a,0,0,1,-a,a],["l",2*a-n,0],["a",a,a,0,0,1,-a,-a],["l",0,2*a-r],["a",a,a,0,0,1,a,-a],["z"]];var o=[["M",t,e],["l",n,0],["l",0,r],["l",-n,0],["z"]];return o.parsePathArray=i,o}},function(t,e){var n=/,?([a-z]),?/gi;t.exports=function(t){return t.join(",").replace(n,"$1")}},function(t,e,n){var i=n(139),r=function(t,e,n,i){return[t,e,n,i,n,i]},a=function(t,e,n,i,r,a){return[1/3*t+2/3*n,1/3*e+2/3*i,1/3*r+2/3*n,1/3*a+2/3*i,r,a]};t.exports=function(t,e){var n=i(t),o=e&&i(e),s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},l={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},u=[],c=[],h="",f="",p=void 0,g=function(t,e,n){var i=void 0,o=void 0;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"].concat(function t(e,n,i,r,a,o,s,l,u,c){i===r&&(i+=1);var h=120*Math.PI/180,f=Math.PI/180*(+a||0),p=[],g=void 0,d=void 0,v=void 0,y=void 0,x=void 0,m=function(t,e,n){return{x:t*Math.cos(n)-e*Math.sin(n),y:t*Math.sin(n)+e*Math.cos(n)}};if(c)d=c[0],v=c[1],y=c[2],x=c[3];else{e=(g=m(e,n,-f)).x,n=g.y,l=(g=m(l,u,-f)).x,u=g.y,e===l&&n===u&&(l+=1,u+=1);var _=(e-l)/2,b=(n-u)/2,w=_*_/(i*i)+b*b/(r*r);w>1&&(i*=w=Math.sqrt(w),r*=w);var S=i*i,M=r*r,C=(o===s?-1:1)*Math.sqrt(Math.abs((S*M-S*b*b-M*_*_)/(S*b*b+M*_*_)));y=C*i*b/r+(e+l)/2,x=C*-r*_/i+(n+u)/2,d=Math.asin(((n-x)/r).toFixed(9)),v=Math.asin(((u-x)/r).toFixed(9)),d=ev&&(d-=2*Math.PI),!s&&v>d&&(v-=2*Math.PI)}var A=v-d;if(Math.abs(A)>h){var k=v,P=l,T=u;v=d+h*(s&&v>d?1:-1),p=t(l=y+i*Math.cos(v),u=x+r*Math.sin(v),i,r,a,0,s,P,T,[v,k,y,x])}A=v-d;var I=Math.cos(d),O=Math.sin(d),L=Math.cos(v),E=Math.sin(v),D=Math.tan(A/4),F=4/3*i*D,B=4/3*r*D,R=[e,n],j=[e+F*O,n-B*I],N=[l+F*E,u-B*L],z=[l,u];if(j[0]=2*R[0]-j[0],j[1]=2*R[1]-j[1],c)return[j,N,z].concat(p);for(var Y=[],V=0,X=(p=[j,N,z].concat(p).join().split(",")).length;V7){t[e].shift();for(var i=t[e];i.length;)u[e]="A",o&&(c[e]="A"),t.splice(e++,0,["C"].concat(i.splice(0,6)));t.splice(e,1),p=Math.max(n.length,o&&o.length||0)}},v=function(t,e,i,r,a){t&&e&&"M"===t[a][0]&&"M"!==e[a][0]&&(e.splice(a,0,["M",r.x,r.y]),i.bx=0,i.by=0,i.x=t[a][1],i.y=t[a][2],p=Math.max(n.length,o&&o.length||0))};p=Math.max(n.length,o&&o.length||0);for(var y=0;y180),0,l,e+n*Math.sin(-r*o)]]}else a=[["M",t,e],["m",0,-i],["a",n,i,0,1,1,0,2*i],["a",n,i,0,1,1,0,-2*i],["z"]];return a}var r=n(140),a=n(141);t.exports=function(t){if(!(t=r(t))||!t.length)return[["M",0,0]];var e=[],n=0,o=0,s=0,l=0,u=0,c=void 0,h=void 0;"M"===t[0][0]&&(s=n=+t[0][1],l=o=+t[0][2],u++,e[0]=["M",n,o]);for(var f,p,g=3===t.length&&"M"===t[0][0]&&"R"===t[1][0].toUpperCase()&&"Z"===t[2][0].toUpperCase(),d=u,v=t.length;d2&&(i.push([n].concat(o.splice(0,2))),s="l",n="m"===n?"l":"L"),"o"===s&&1===o.length&&i.push([n,o[0]]),"r"===s)i.push([n].concat(o));else for(;o.length>=e[s]&&(i.push([n].concat(o.splice(0,e[s]))),e[s]););}),i}},function(t,e){t.exports=function(t,e){for(var n=[],i=0,r=t.length;r-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?r-4===i?a[3]={x:+t[0],y:+t[1]}:r-2===i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[r-2],y:+t[r-1]}:r-4===i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),n.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return n}},function(t,e,n){var i=n(23);t.exports=function(t){return i(t).toLowerCase()}},function(t,e,n){var i=n(23);t.exports=function(t){return i(t).toUpperCase()}},function(t,e,n){var i=n(145);t.exports=function(t,e){if(!e)return[t];var n=i(t,e),r=[];for(var a in n)r.push(n[a]);return r}},function(t,e,n){var i=n(11),r=n(4),a=n(146);t.exports=function(t,e){if(!e)return{0:t};if(!i(e)){var n=r(e)?e:e.replace(/\s+/g,"").split("*");e=function(t){for(var e="_",i=0,r=n.length;i');t.appendChild(a),this.set("wrapperEl",a),this.get("forceFit")&&(n=s.getWidth(t,n),this.set("width",n));var l=this.get("renderer"),u=new o({containerDOM:a,width:n,height:i,pixelRatio:"svg"===l?1:this.get("pixelRatio"),renderer:l});this.set("canvas",u)},n._initPlot=function(){this._initPlotBack();var t=this.get("canvas"),e=t.addGroup({zIndex:1}),n=t.addGroup({zIndex:0}),i=t.addGroup({zIndex:3});this.set("backPlot",e),this.set("middlePlot",n),this.set("frontPlot",i)},n._initPlotBack=function(){var t=this.get("canvas"),e=this.get("viewTheme"),n=t.addGroup(u,{padding:this.get("padding"),plotBackground:r.mix({},e.plotBackground,this.get("plotBackground")),background:r.mix({},e.background,this.get("background"))});this.set("plot",n),this.set("plotRange",n.get("plotRange"))},n._initEvents=function(){this.get("forceFit")&&window.addEventListener("resize",r.wrapBehavior(this,"_initForceFitEvent"))},n._initForceFitEvent=function(){var t=setTimeout(r.wrapBehavior(this,"forceFit"),200);clearTimeout(this.get("resizeTimer")),this.set("resizeTimer",t)},n._renderLegends=function(){var t=this.get("options").legends;if(r.isNil(t)||!1!==t){var e=this.get("legendController");if(e.options=t||{},e.plotRange=this.get("plotRange"),t&&t.custom)e.addCustomLegend();else{var n=this.getAllGeoms(),i=[];r.each(n,function(t){var n=t.get("view"),a=t.getAttrsForLegend();r.each(a,function(a){var o=a.type,s=a.getScale(o);if(s.field&&"identity"!==s.type&&!function(t,e){var n=!1;return r.each(t,function(t){var i=[].concat(t.values),r=[].concat(e.values);t.type!==e.type||t.field!==e.field||i.sort().toString()!==r.sort().toString()||(n=!0)}),n}(i,s)){i.push(s);var l=n.getFilteredOutValues(s.field);e.addLegend(s,a,t,l)}})});var a=this.getYScales();0===i.length&&a.length>1&&e.addMixedLegend(a,n)}e.alignLegends()}},n._renderTooltips=function(){var t=this.get("options");if(r.isNil(t.tooltip)||!1!==t.tooltip){var e=this.get("tooltipController");e.options=t.tooltip||{},e.renderTooltip()}},n.getAllGeoms=function(){var t=[];t=t.concat(this.get("geoms"));var e=this.get("views");return r.each(e,function(e){t=t.concat(e.get("geoms"))}),t},n.forceFit=function(){if(this&&!this.destroyed){var t=this.get("container"),e=this.get("width"),n=s.getWidth(t,e);if(0!==n&&n!==e){var i=this.get("height");this.changeSize(n,i)}return this}},n.resetPlot=function(){var t=this.get("plot"),e=this.get("padding");i(e,t.get("padding"))||(t.set("padding",e),t.repaint())},n.changeSize=function(t,e){this.get("canvas").changeSize(t,e);var n=this.get("plot");return this.set("width",t),this.set("height",e),n.repaint(),this.set("keepPadding",!0),this.repaint(),this.set("keepPadding",!1),this.emit("afterchangesize"),this},n.changeWidth=function(t){return this.changeSize(t,this.get("height"))},n.changeHeight=function(t){return this.changeSize(this.get("width"),t)},n.view=function(t){(t=t||{}).theme=this.get("theme"),t.parent=this,t.backPlot=this.get("backPlot"),t.middlePlot=this.get("middlePlot"),t.frontPlot=this.get("frontPlot"),t.canvas=this.get("canvas"),r.isNil(t.animate)&&(t.animate=this.get("animate")),t.options=r.mix({},this._getSharedOptions(),t.options);var e=new a(t);return e.set("_id","view"+this.get("views").length),this.get("views").push(e),this.emit("addview",{view:e}),e},n.removeView=function(t){var e=this.get("views");r.Array.remove(e,t),t.destroy()},n._getSharedOptions=function(){var t=this.get("options"),e={};return r.each(["scales","coord","axes"],function(n){e[n]=r.cloneDeep(t[n])}),e},n.getViewRegion=function(){var t=this.get("plotRange");return{start:t.bl,end:t.tr}},n.legend=function(t,e){var n=this.get("options");n.legends||(n.legends={});var i={};return!1===t?n.legends=!1:r.isObject(t)?i=t:r.isString(t)?i[t]=e:i=e,r.mix(n.legends,i),this},n.tooltip=function(t,e){var n=this.get("options");return n.tooltip||(n.tooltip={}),!1===t?n.tooltip=!1:r.isObject(t)?r.mix(n.tooltip,t):r.mix(n.tooltip,e),this},n.clear=function(){this.emit("beforeclear");for(var e=this.get("views");e.length>0;){e.shift().destroy()}t.prototype.clear.call(this);var n=this.get("canvas");return this.resetPlot(),n.draw(),this.emit("afterclear"),this},n.clearInner=function(){var e=this.get("views");r.each(e,function(t){t.clearInner()});var n=this.get("tooltipController");if(n&&n.clear(),!this.get("keepLegend")){var i=this.get("legendController");i&&i.clear()}t.prototype.clearInner.call(this)},n.drawComponents=function(){t.prototype.drawComponents.call(this),this.get("keepLegend")||this._renderLegends()},n.render=function(){if(!this.get("keepPadding")&&this._isAutoPadding()){this.beforeRender(),this.drawComponents();var e=this._getAutoPadding(),n=this.get("plot");i(n.get("padding"),e)||(n.set("padding",e),n.repaint())}var a=this.get("middlePlot");if(this.get("limitInPlot")&&!a.attr("clip")){var o=r.getClipByRange(this.get("plotRange"));a.attr("clip",o)}t.prototype.render.call(this),this._renderTooltips()},n.repaint=function(){this.get("keepPadding")||this.resetPlot(),t.prototype.repaint.call(this)},n.changeVisible=function(t){var e=this.get("wrapperEl"),n=t?"":"none";e.style.display=n},n.toDataURL=function(){var t=this.get("canvas"),e=this.get("renderer"),n=t.get("el"),i="";if("svg"===e){var r=n.cloneNode(!0),a=document.implementation.createDocumentType("svg","-//W3C//DTD SVG 1.1//EN","http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"),o=document.implementation.createDocument("http://www.w3.org/2000/svg","svg",a);o.replaceChild(r,o.documentElement);var s=(new XMLSerializer).serializeToString(o);i="data:image/svg+xml;charset=utf8,"+encodeURIComponent(s)}else"canvas"===e&&(i=n.toDataURL("image/png"));return i},n.downloadImage=function(t){var e=this,n=document.createElement("a"),i=e.get("renderer"),r=(t||"chart")+("svg"===i?".svg":".png");e.get("canvas").get("timeline").stopAllAnimations(),setTimeout(function(){var t=e.toDataURL();if(window.Blob&&window.URL&&"svg"!==i){for(var a=t.split(","),o=a[0].match(/:(.*?);/)[1],s=atob(a[1]),l=s.length,u=new Uint8Array(l);l--;)u[l]=s.charCodeAt(l);var c=new Blob([u],{type:o});window.navigator.msSaveBlob?window.navigator.msSaveBlob(c,r):n.addEventListener("click",function(){n.download=r,n.href=window.URL.createObjectURL(c)})}else n.addEventListener("click",function(){n.download=r,n.href=t});var h=document.createEvent("MouseEvents");h.initEvent("click",!1,!1),n.dispatchEvent(h)},16)},n.showTooltip=function(t){var e=this.getViewsByPoint(t);if(e.length){this.get("tooltipController").showTooltip(t,e)}return this},n.hideTooltip=function(){return this.get("tooltipController").hideTooltip(),this},n.getTooltipItems=function(t){var e=this.getViewsByPoint(t),n=[];return r.each(e,function(e){var i=e.get("geoms");r.each(i,function(e){var i=e.get("dataArray"),a=[];r.each(i,function(n){var i=e.findPoint(t,n);if(i){var r=e.getTipItems(i);a=a.concat(r)}}),n=n.concat(a)})}),n},n.destroy=function(){this.emit("beforedestroy"),clearTimeout(this.get("resizeTimer"));var e=this.get("canvas"),n=this.get("wrapperEl");n.parentNode.removeChild(n),t.prototype.destroy.call(this),e.destroy(),window.removeEventListener("resize",r.getWrapBehavior(this,"_initForceFitEvent")),this.emit("afterdestroy")},e}(a);t.exports=g},function(t,e,n){var i=n(53),r=n(0),a=function(t){function e(e){var n,i={visible:!0},a=(n=t.call(this)||this).getDefaultCfg();return n._attrs=i,r.assign(i,a,e),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{}},n.get=function(t){return this._attrs[t]},n.set=function(t,e){this._attrs[t]=e},n.show=function(){this.get("visible")||(this.set("visible",!0),this.changeVisible(!0))},n.hide=function(){this.get("visible")&&(this.set("visible",!1),this.changeVisible(!1))},n.changeVisible=function(){},n.destroy=function(){this._attrs={},this.removeAllListeners(),this.destroyed=!0},e}(i);t.exports=a},function(t,e,n){function i(t,e,n,i){return t[i]+(e[i]-t[i])*n}function r(t){return"#"+a(t[0])+a(t[1])+a(t[2])}function a(t){return t=Math.round(t),1===(t=t.toString(16)).length&&(t="0"+t),t}function o(t){var e=[];return e.push(parseInt(t.substr(1,2),16)),e.push(parseInt(t.substr(3,2),16)),e.push(parseInt(t.substr(5,2),16)),e}var s=n(9),l=n(10),u=n(2),c=/rgba?\(([\s.,0-9]+)\)/,h={},f=null,p={toRGB:function(t){if("#"===t[0]&&7===t.length)return t;f||(f=function(){var t=document.createElement("i");return t.title="Web Colour Picker",t.style.display="none",document.body.appendChild(t),t}());var e;if(h[t])e=h[t];else{f.style.color=t,e=document.defaultView.getComputedStyle(f,"").getPropertyValue("color");e=r(c.exec(e)[1].split(/\s*,\s*/)),h[t]=e}return e},rgb2arr:o,gradient:function(t){var e=[];return l(t)&&(t=t.split("-")),u(t,function(t){-1===t.indexOf("#")&&(t=p.toRGB(t)),e.push(o(t))}),function(t){return function(t,e){(isNaN(e)||!s(e)||e<0)&&(e=0),e>1&&(e=1);var n=t.length-1,a=Math.floor(n*e),o=n*e-a,l=t[a],u=a===n?l:t[a+1];return r([i(l,u,o,0),i(l,u,o,1),i(l,u,o,2)])}(e,t)}}};t.exports=p},function(t,e,n){var i=n(2),r={values:n(64)};t.exports={isAdjust:function(t){return this.adjustNames.indexOf(t)>=0},_getDimValues:function(t){var e={},n=[];if(this.xField&&this.isAdjust("x")&&n.push(this.xField),this.yField&&this.isAdjust("y")&&n.push(this.yField),i(n,function(n){var i=r.values(t,n);i.sort(function(t,e){return t-e}),e[n]=i}),!this.yField&&this.isAdjust("y")){var a=[0,1];e.y=a}return e},adjustData:function(t,e){var n=this,r=n._getDimValues(e);i(t,function(e,a){i(r,function(i,r){n.adjustDim(r,i,e,t.length,a)})})},getAdjustRange:function(t,e,n){var i,r,a=n.indexOf(e),o=n.length;return!this.yField&&this.isAdjust("y")?(i=0,r=1):o>1?(i=0===a?n[0]:n[a-1],r=a===o-1?n[o-1]:n[a+1],0!==a?i+=(e-i)/2:i-=(r-e)/2,a!==o-1?r-=(r-e)/2:r+=(e-n[o-2])/2):(i=0===e?0:e-.5,r=0===e?1:e+.5),{pre:i,next:r}},groupData:function(t,e){var n={};return i(t,function(t){var i=t[e];void 0===i&&(i=t[e]=0),n[i]||(n[i]=[]),n[i].push(t)}),n}}},function(t,e,n){var i={default:n(152),dark:n(304)};t.exports=i},function(t,e){var n,i,r='"-apple-system", BlinkMacSystemFont, "Segoe UI", Roboto,"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",SimSun, "sans-serif"',a={defaultColor:"#1890FF",plotCfg:{padding:[20,20,95,80]},fontFamily:r,defaultLegendPosition:"bottom",colors:["#1890FF","#2FC25B","#FACC14","#223273","#8543E0","#13C2C2","#3436C7","#F04864"],colors_16:["#1890FF","#41D9C7","#2FC25B","#FACC14","#E6965C","#223273","#7564CC","#8543E0","#5C8EE6","#13C2C2","#5CA3E6","#3436C7","#B381E6","#F04864","#D598D9"],colors_24:["#1890FF","#66B5FF","#41D9C7","#2FC25B","#6EDB8F","#9AE65C","#FACC14","#E6965C","#57AD71","#223273","#738AE6","#7564CC","#8543E0","#A877ED","#5C8EE6","#13C2C2","#70E0E0","#5CA3E6","#3436C7","#8082FF","#DD81E6","#F04864","#FA7D92","#D598D9"],colors_pie:["#1890FF","#13C2C2","#2FC25B","#FACC14","#F04864","#8543E0","#3436C7","#223273"],colors_pie_16:["#1890FF","#73C9E6","#13C2C2","#6CD9B3","#2FC25B","#9DD96C","#FACC14","#E6965C","#F04864","#D66BCA","#8543E0","#8E77ED","#3436C7","#737EE6","#223273","#7EA2E6"],shapes:{point:["hollowCircle","hollowSquare","hollowDiamond","hollowBowtie","hollowTriangle","hollowHexagon","cross","tick","plus","hyphen","line"],line:["line","dash","dot"],area:["area"]},sizes:[1,10],opacities:[.1,.9],axis:{top:{position:"top",title:null,label:{offset:16,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r},autoRotate:!0},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0}},bottom:{position:"bottom",title:null,label:{offset:16,autoRotate:!0,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r}},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0}},left:{position:"left",title:null,label:{offset:8,autoRotate:!0,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r}},line:null,tickLine:null,grid:{zIndex:-1,lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},hideFirstLine:!0}},right:{position:"right",title:null,label:{offset:8,autoRotate:!0,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,textBaseline:"middle",fontFamily:r}},line:null,tickLine:null,grid:{lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},hideFirstLine:!0}},circle:{zIndex:1,title:null,label:{offset:8,textStyle:{fill:"#545454",fontSize:12,lineHeight:16,fontFamily:r}},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0},grid:{lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},hideFirstLine:!0}},radius:{zIndex:0,label:{offset:12,textStyle:{fill:"#545454",fontSize:12,textBaseline:"middle",lineHeight:16,fontFamily:r}},line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,stroke:"#BFBFBF",length:4,alignWithLabel:!0},grid:{lineStyle:{stroke:"#E9E9E9",lineWidth:1,lineDash:[3,3]},type:"circle"}},helix:{grid:null,label:null,title:null,line:{lineWidth:1,stroke:"#BFBFBF"},tickLine:{lineWidth:1,length:4,stroke:"#BFBFBF",alignWithLabel:!0}}},label:{offset:20,textStyle:{fill:"#545454",fontSize:12,textBaseline:"middle",fontFamily:r}},treemapLabels:{offset:10,textStyle:{fill:"#fff",fontSize:12,textBaseline:"top",fontStyle:"bold",fontFamily:r}},innerLabels:{textStyle:{fill:"#fff",fontSize:12,textBaseline:"middle",fontFamily:r}},thetaLabels:{labelHeight:14,offset:30},legend:{right:{position:"right",layout:"vertical",itemMarginBottom:8,width:16,height:156,title:null,legendStyle:{LIST_CLASS:{textAlign:"left"}},textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:0,fontFamily:r},unCheckColor:"#bfbfbf"},left:{position:"left",layout:"vertical",itemMarginBottom:8,width:16,height:156,title:null,textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:20,fontFamily:r},unCheckColor:"#bfbfbf"},top:{position:"top",offset:[0,6],layout:"horizontal",title:null,itemGap:10,width:156,height:16,textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:20,fontFamily:r},unCheckColor:"#bfbfbf"},bottom:{position:"bottom",offset:[0,6],layout:"horizontal",title:null,itemGap:10,width:156,height:16,textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"start",textBaseline:"middle",lineHeight:20,fontFamily:r},unCheckColor:"#bfbfbf"},html:(n={},n["g2-legend"]={height:"auto",width:"auto",position:"absolute",overflow:"auto",fontSize:"12px",fontFamily:r,lineHeight:"20px",color:"#8C8C8C"},n["g2-legend-title"]={marginBottom:"4px"},n["g2-legend-list"]={listStyleType:"none",margin:0,padding:0},n["g2-legend-list-item"]={cursor:"pointer",marginBottom:"5px",marginRight:"24px"},n["g2-legend-marker"]={width:"9px",height:"9px",borderRadius:"50%",display:"inline-block",marginRight:"8px",verticalAlign:"middle"},n),gradient:{textStyle:{fill:"#8C8C8C",fontSize:12,textAlign:"center",textBaseline:"middle",lineHeight:20,fontFamily:r},lineStyle:{lineWidth:1,stroke:"#fff"},unCheckColor:"#bfbfbf"},margin:[0,5,24,5],legendMargin:24},tooltip:(i={useHtml:!0,crosshairs:!1,offset:15},i["g2-tooltip"]={position:"absolute",visibility:"hidden",zIndex:8,transition:"visibility 0.2s cubic-bezier(0.23, 1, 0.32, 1), left 0.4s cubic-bezier(0.23, 1, 0.32, 1), top 0.4s cubic-bezier(0.23, 1, 0.32, 1)",backgroundColor:"rgba(255, 255, 255, 0.9)",boxShadow:"0px 0px 10px #aeaeae",borderRadius:"3px",color:"rgb(87, 87, 87)",fontSize:"12px",fontFamily:r,lineHeight:"20px",padding:"10px 10px 6px 10px"},i["g2-tooltip-title"]={marginBottom:"4px"},i["g2-tooltip-list"]={margin:0,listStyleType:"none",padding:0},i["g2-tooltip-list-item"]={marginBottom:"4px"},i["g2-tooltip-marker"]={width:"5px",height:"5px",borderRadius:"50%",display:"inline-block",marginRight:"8px"},i["g2-tooltip-value"]={display:"inline-block",float:"right",marginLeft:"30px"},i),tooltipMarker:{symbol:function(t,e,n){return[["M",t,e],["m",-n,0],["a",n,n,0,1,0,2*n,0],["a",n,n,0,1,0,2*-n,0]]},stroke:"#fff",shadowBlur:10,shadowOffsetX:0,shadowOffSetY:0,shadowColor:"rgba(0,0,0,0.09)",lineWidth:2,radius:4},tooltipCrosshairsRect:{type:"rect",rectStyle:{fill:"#CCD6EC",opacity:.3}},tooltipCrosshairsLine:{lineStyle:{stroke:"rgba(0, 0, 0, 0.25)",lineWidth:1}},shape:{point:{lineWidth:1,fill:"#1890FF",radius:4},hollowPoint:{fill:"#fff",lineWidth:1,stroke:"#1890FF",radius:3},interval:{lineWidth:0,fill:"#1890FF",fillOpacity:.85},hollowInterval:{fill:"#fff",stroke:"#1890FF",fillOpacity:0,lineWidth:2},area:{lineWidth:0,fill:"#1890FF",fillOpacity:.6},polygon:{lineWidth:0,fill:"#1890FF",fillOpacity:1},hollowPolygon:{fill:"#fff",stroke:"#1890FF",fillOpacity:0,lineWidth:2},hollowArea:{fill:"#fff",stroke:"#1890FF",fillOpacity:0,lineWidth:2},line:{stroke:"#1890FF",lineWidth:2,fill:null},edge:{stroke:"#1890FF",lineWidth:1,fill:null},schema:{stroke:"#1890FF",lineWidth:1,fill:null}},guide:{line:{lineStyle:{stroke:"rgba(0, 0, 0, .65)",lineDash:[2,2],lineWidth:1},text:{position:"start",autoRotate:!0,style:{fill:"rgba(0, 0, 0, .45)",fontSize:12,textAlign:"start",fontFamily:r,textBaseline:"bottom"}}},text:{style:{fill:"rgba(0,0,0,.5)",fontSize:12,textBaseline:"middle",textAlign:"start",fontFamily:r}},region:{style:{lineWidth:0,fill:"#000",fillOpacity:.04}},html:{alignX:"middle",alignY:"middle"},dataRegion:{style:{region:{lineWidth:0,fill:"#000000",opacity:.04},text:{textAlign:"center",textBaseline:"bottom",fontSize:12,fill:"rgba(0, 0, 0, .65)"}}},dataMarker:{top:!0,style:{point:{r:3,fill:"#FFFFFF",stroke:"#1890FF",lineWidth:2},line:{stroke:"#A3B1BF",lineWidth:1},text:{fill:"rgba(0, 0, 0, .65)",opacity:1,fontSize:12,textAlign:"start"}},display:{point:!0,line:!0,text:!0},lineLength:20,direction:"upward",autoAdjust:!0}},pixelRatio:null};t.exports=a},function(t,e,n){var i=n(25).Group,r=n(3),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{zIndex:1,type:"line",lineStyle:null,items:null,alternateColor:null,matrix:null,hideFirstLine:!1,hideLastLine:!1,hightLightZero:!1,zeroLineStyle:{stroke:"#595959",lineDash:[0,0]}}},n._renderUI=function(){t.prototype._renderUI.call(this),this._drawLines()},n._drawLines=function(){var t=this.get("lineStyle"),e=this.get("items");e&&e.length&&(this._precessItems(e),this._drawGridLines(e,t))},n._precessItems=function(t){var e,n=this;r.each(t,function(t,i){e&&n.get("alternateColor")&&n._drawAlternativeBg(t,e,i),e=t})},n._drawGridLines=function(t,e){var n,i,a,o,s=this,l=this.get("type"),u=t.length;"line"===l||"polygon"===l?r.each(t,function(t,c){s.get("hideFirstLine")&&0===c||s.get("hideLastLine")&&c===u-1||(o=t.points,i=[],"line"===l?(i.push(["M",o[0].x,o[0].y]),i.push(["L",o[o.length-1].x,o[o.length-1].y])):r.each(o,function(t,e){0===e?i.push(["M",t.x,t.y]):i.push(["L",t.x,t.y])}),a=s._drawZeroLine(l,c)?r.mix({},s.get("zeroLineStyle"),{path:i}):r.mix({},e,{path:i}),(n=s.addShape("path",{attrs:a})).name="axis-grid",n._id=t._id,n.set("coord",s.get("coord")),s.get("appendInfo")&&n.setSilent("appendInfo",s.get("appendInfo")))}):r.each(t,function(t,l){s.get("hideFirstLine")&&0===l||s.get("hideLastLine")&&l===u-1||(o=t.points,i=[],r.each(o,function(t,e){var n=t.radius;0===e?i.push(["M",t.x,t.y]):i.push(["A",n,n,0,0,t.flag,t.x,t.y])}),a=r.mix({},e,{path:i}),(n=s.addShape("path",{attrs:a})).name="axis-grid",n._id=t._id,n.set("coord",s.get("coord")),s.get("appendInfo")&&n.setSilent("appendInfo",s.get("appendInfo")))})},n._drawZeroLine=function(t,e){var n=this.get("tickValues");return!("line"!==t||!n||0!==n[e]||!this.get("hightLightZero"))},n._drawAlternativeBg=function(t,e,n){var i,a,o,s=this.get("alternateColor");r.isString(s)?a=s:r.isArray(s)&&(a=s[0],o=s[1]),n%2==0?o&&(i=this._getBackItem(e.points,t.points,o)):a&&(i=this._getBackItem(e.points,t.points,a));var l=this.addShape("Path",{attrs:i});l.name="axis-grid-rect",l._id=t._id&&t._id.replace("grid","grid-rect"),l.set("coord",this.get("coord")),this.get("appendInfo")&&l.setSilent("appendInfo",this.get("appendInfo"))},n._getBackItem=function(t,e,n){var i=[],a=this.get("type");if("line"===a)i.push(["M",t[0].x,t[0].y]),i.push(["L",t[t.length-1].x,t[t.length-1].y]),i.push(["L",e[e.length-1].x,e[e.length-1].y]),i.push(["L",e[0].x,e[0].y]),i.push(["Z"]);else if("polygon"===a){r.each(t,function(t,e){0===e?i.push(["M",t.x,t.y]):i.push(["L",t.x,t.y])});for(var o=e.length-1;o>=0;o--)i.push(["L",e[o].x,e[o].y]);i.push(["Z"])}else{var s=t[0].flag;r.each(t,function(t,e){var n=t.radius;0===e?i.push(["M",t.x,t.y]):i.push(["A",n,n,0,0,t.flag,t.x,t.y])});for(var l=e.length-1;l>=0;l--){var u=e[l],c=u.radius;l===e.length-1?i.push(["M",u.x,u.y]):i.push(["A",c,c,0,0,1===s?0:1,u.x,u.y])}}return{fill:n,path:i}},e}(i);t.exports=a},function(t,e,n){var i=n(3),r=i.DomUtil,a=n(32),o={scatter:n(307),map:n(308),treemap:n(309)},s=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"label",type:"default",textStyle:null,formatter:null,items:null,useHtml:!1,containerTpl:'
    ',itemTpl:'
    {text}
    ',labelLine:!1,lineGroup:null,shapes:null,config:!0,capture:!0})},n.clear=function(){var e=this.get("group"),n=this.get("container");e&&!e.get("destroyed")&&e.clear(),n&&(n.innerHTML=""),t.prototype.clear.call(this)},n.destroy=function(){var t=this.get("group"),e=this.get("container");t.destroy||t.destroy(),e&&(e.innerHTML="")},n.render=function(){this.clear(),this._init(),this.beforeDraw(),this.draw(),this.afterDraw()},n._dryDraw=function(){var t=this,e=t.get("items"),n=t.getLabels(),r=n.length;i.each(e,function(e,i){if(i=e.length;a--)n[a].remove();t._adjustLabels(),!t.get("labelLine")&&t.get("config")||t.drawLines()},n.draw=function(){this._dryDraw(),this.get("canvas").draw()},n.changeLabel=function(t,e){if(t)if(t.tagName){var n=this._createDom(e);t.innerHTML=n.innerHTML,this._setCustomPosition(e,t)}else t._id=e._id,t.attr("text",e.text),t.attr("x")===e.x&&t.attr("y")===e.y||(t.resetMatrix(),e.textStyle.rotate&&(t.rotateAtStart(e.textStyle.rotate),delete e.textStyle.rotate),t.attr(e))},n.show=function(){var t=this.get("group"),e=this.get("container");t&&t.show(),e&&(e.style.opacity=1)},n.hide=function(){var t=this.get("group"),e=this.get("container");t&&t.hide(),e&&(e.style.opacity=0)},n.drawLines=function(){var t=this;"boolean"==typeof t.get("labelLine")&&t.set("labelLine",{});var e=t.get("lineGroup");!e||e.get("destroyed")?(e=t.get("group").addGroup({elCls:"x-line-group"}),t.set("lineGroup",e)):e.clear(),i.each(t.get("items"),function(n){t.lineToLabel(n,e)})},n.lineToLabel=function(t,e){if(this.get("config")||t.labelLine){var n=t.labelLine||this.get("labelLine"),r=void 0===t.capture?this.get("capture"):t.capture,a=n.path;if(a&&i.isFunction(n.path)&&(a=n.path(t)),!a){var o=t.start||{x:t.x-t._offset.x,y:t.y-t._offset.y};a=[["M",o.x,o.y],["L",t.x,t.y]]}var s=t.color;s||(s=t.textStyle&&t.textStyle.fill?t.textStyle.fill:"#000");var l=e.addShape("path",{attrs:i.mix({path:a,fill:null,stroke:s},n),capture:r});l.name=this.get("name"),l._id=t._id&&t._id.replace("glabel","glabelline"),l.set("coord",this.get("coord"))}},n._adjustLabels=function(){var t=this.get("type"),e=this.getLabels(),n=this.get("shapes"),i=o[t];"default"!==t&&i&&i(e,n)},n.getLabels=function(){var t=this.get("container");return t?i.toArray(t.childNodes):this.get("group").get("children")},n._addLabel=function(t,e){var n=t;return this.get("config")&&(n=this._getLabelCfg(t,e)),this._createText(n)},n._getLabelCfg=function(t,e){var n=this.get("textStyle")||{},r=this.get("formatter"),a=this.get("htmlTemplate");if(!i.isObject(t)){var o=t;(t={}).text=o}i.isFunction(n)&&(n=n(t.text,t,e)),r&&(t.text=r(t.text,t,e)),a&&(t.useHtml=!0,i.isFunction(a)&&(t.text=a(t.text,t,e))),i.isNil(t.text)&&(t.text=""),t.text=t.text+"";return i.mix({},t,{textStyle:n},{x:t.x||0,y:t.y||0})},n._init=function(){if(!this.get("group")){var t=this.get("canvas").addGroup({id:"label-group"});this.set("group",t)}},n.initHtmlContainer=function(){var t=this.get("container");if(t)i.isString(t)&&(t=document.getElementById(t))&&this.set("container",t);else{var e=this.get("containerTpl"),n=this.get("canvas").get("el").parentNode;t=r.createDom(e),n.style.position="relative",n.appendChild(t),this.set("container",t)}return t},n._createText=function(t){var e,n=this.get("container"),r=void 0===t.capture?this.get("capture"):t.capture;if(!t.useHtml&&!t.htmlTemplate){var a=this.get("name"),o=t.point,s=this.get("group");delete t.point;var l=t.rotate;return t.textStyle&&(t.textStyle.rotate&&(l=t.textStyle.rotate,delete t.textStyle.rotate),t=i.mix({x:t.x,y:t.y,textAlign:t.textAlign,text:t.text},t.textStyle)),e=s.addShape("text",{attrs:t,capture:r}),l&&(Math.abs(l)>2*Math.PI&&(l=l/180*Math.PI),e.transform([["t",-t.x,-t.y],["r",l],["t",t.x,t.y]])),e.setSilent("origin",o||t),e.name=a,this.get("appendInfo")&&e.setSilent("appendInfo",this.get("appendInfo")),e}n||(n=this.initHtmlContainer());var u=this._createDom(t);n.appendChild(u),this._setCustomPosition(t,u)},n._createDom=function(t){var e=this.get("itemTpl"),n=i.substitute(e,{text:t.text});return r.createDom(n)},n._setCustomPosition=function(t,e){var n=t.textAlign||"left",i=t.y,a=t.x,o=r.getOuterWidth(e);i-=r.getOuterHeight(e)/2,"center"===n?a-=o/2:"right"===n&&(a-=o),e.style.top=parseInt(i,10)+"px",e.style.left=parseInt(a,10)+"px"},e}(a);t.exports=s},function(t,e){var n=function(){function t(){this.bitmap=[]}var e=t.prototype;return e.hasGap=function(t){for(var e=!0,n=this.bitmap,i=Math.floor(t.minX),r=Math.ceil(t.maxX),a=Math.floor(t.minY),o=Math.ceil(t.maxY)-1,s=i;sn&&a.each(e,function(t){h=t.getBBox(),u=f||h.width,c=h.height+r,n-li&&a.each(n,function(t){p=t.getBBox(),h=p.width,f=p.height,u?g=u+r:h>g&&(g=h+r),i-c-1?t:t.parentNode?t.parentNode.className===h?t.parentNode:r(t.parentNode,e):null}function a(t,e){var n=null,i=e instanceof c?e.get("value"):e;return o.each(t,function(t){if(t.value===i)return n=t,!1}),n}var o=n(3),s=n(157),l=n(14).FONT_FAMILY,u=o.DomUtil,c=o.Group,h="g2-legend",f="g2-legend-list",p="g2-legend-list-item",g="g2-legend-marker",d=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return o.mix({},e,{type:"category-legend",container:null,containerTpl:'

      ',itemTpl:'
    • {value}
    • ',legendStyle:{},textStyle:{fill:"#333",fontSize:12,textAlign:"middle",textBaseline:"top",fontFamily:l},abridgeText:!1,tipTpl:'
      ',tipStyle:{display:"none",fontSize:"12px",backgroundColor:"#fff",position:"absolute",width:"auto",height:"auto",padding:"3px",boxShadow:"2px 2px 5px #888"},autoPosition:!0})},n._init=function(){},n.beforeRender=function(){},n.render=function(){this._renderHTML()},n._bindEvents=function(){var t=this,e=i(this.get("legendWrapper"),f);this.get("hoverable")&&(e.onmousemove=function(e){return t._onMousemove(e)},e.onmouseout=function(e){return t._onMouseleave(e)}),this.get("clickable")&&(e.onclick=function(e){return t._onClick(e)})},n._onMousemove=function(t){var e=this.get("items"),n=t.target,i=n.className;if(!((i=i.split(" ")).indexOf(h)>-1||i.indexOf(f)>-1)){var o=r(n,p),s=a(e,o.getAttribute("data-value"));s?(this.deactivate(),this.activate(o.getAttribute("data-value")),this.emit("itemhover",{item:s,currentTarget:o,checked:s.checked})):s||(this.deactivate(),this.emit("itemunhover",t))}},n._onMouseleave=function(t){this.deactivate(),this.emit("itemunhover",t)},n._onClick=function(t){var e=this,n=i(this.get("legendWrapper"),f),s=this.get("unCheckColor"),l=this.get("items"),u=this.get("selectedMode"),c=n.childNodes,d=t.target,v=d.className;if(!((v=v.split(" ")).indexOf(h)>-1||v.indexOf(f)>-1)){var y=r(d,p),x=i(y,"g2-legend-text"),m=i(y,g),_=a(l,y.getAttribute("data-value"));if(_){var b=y.className,w=y.getAttribute("data-color");if("single"===u)_.checked=!0,o.each(c,function(t){if(t!==y){i(t,g).style.backgroundColor=s,t.className=t.className.replace("checked","unChecked"),t.style.color=s;a(l,t.getAttribute("data-value")).checked=!1}else x&&(x.style.color=e.get("textStyle").fill),m&&(m.style.backgroundColor=w),y.className=b.replace("unChecked","checked")});else{var S=-1!==b.indexOf("checked"),M=0;if(o.each(c,function(t){-1!==t.className.indexOf("checked")&&M++}),!this.get("allowAllCanceled")&&S&&1===M)return void this.emit("clicklastitem",{item:_,currentTarget:y,checked:"single"===u||_.checked});_.checked=!_.checked,S?(m&&(m.style.backgroundColor=s),y.className=b.replace("checked","unChecked"),y.style.color=s):(m&&(m.style.backgroundColor=w),y.className=b.replace("unChecked","checked"),y.style.color=this.get("textStyle").fill)}this.emit("itemclick",{item:_,currentTarget:y,checked:"single"===u||_.checked})}}},n.activate=function(t){var e=this,n=this,r=n.get("items"),o=a(r,t);i(n.get("legendWrapper"),f).childNodes.forEach(function(t){var s=i(t,g),l=a(r,t.getAttribute("data-value"));if(e.get("highlight")){if(l===o&&l.checked)return void(s.style.border="1px solid #333")}else l===o?s.style.opacity=n.get("activeOpacity"):l.checked&&(s.style.opacity=n.get("inactiveOpacity"))})},n.deactivate=function(){var t=this,e=this;i(e.get("legendWrapper"),f).childNodes.forEach(function(n){var r=i(n,g);t.get("highlight")?r.style.border="1px solid #fff":r.style.opacity=e.get("inactiveOpacity")})},n._renderHTML=function(){var t=this,e=this.get("container"),n=this.get("title"),r=this.get("containerTpl"),a=u.createDom(r),s=i(a,"g2-legend-title"),c=i(a,f),d=this.get("unCheckColor"),v=o.deepMix({},{CONTAINER_CLASS:{height:"auto",width:"auto",position:"absolute",overflowY:"auto",fontSize:"12px",fontFamily:l,lineHeight:"20px",color:"#8C8C8C"},TITLE_CLASS:{marginBottom:this.get("titleGap")+"px",fontSize:"12px",color:"#333",textBaseline:"middle",fontFamily:l},LIST_CLASS:{listStyleType:"none",margin:0,padding:0,textAlign:"center"},LIST_ITEM_CLASS:{cursor:"pointer",marginBottom:"5px",marginRight:"24px"},MARKER_CLASS:{width:"9px",height:"9px",borderRadius:"50%",display:"inline-block",marginRight:"4px",verticalAlign:"middle"}},this.get("legendStyle"));if(/^\#/.test(e)||"string"==typeof e&&e.constructor===String){var y=e.replace("#","");(e=document.getElementById(y)).appendChild(a)}else{var x=this.get("position"),m={};m="left"===x||"right"===x?{maxHeight:(this.get("maxLength")||e.offsetHeight)+"px"}:{maxWidth:(this.get("maxLength")||e.offsetWidth)+"px"},u.modifyCSS(a,o.mix({},v.CONTAINER_CLASS,m,this.get(h))),e.appendChild(a)}u.modifyCSS(c,o.mix({},v.LIST_CLASS,this.get(f))),s&&(n&&n.text?(s.innerHTML=n.text,u.modifyCSS(s,o.mix({},v.TITLE_CLASS,this.get("g2-legend-title"),n))):a.removeChild(s));var _=this.get("items"),b=this.get("itemTpl"),w=this.get("position"),S=this.get("layout"),M="right"===w||"left"===w||"vertical"===S?"block":"inline-block",C=o.mix({},v.LIST_ITEM_CLASS,{display:M},this.get(p)),A=o.mix({},v.MARKER_CLASS,this.get(g));if(o.each(_,function(e,n){var r,s=e.checked,l=t._formatItemValue(e.value),h=e.marker.fill||e.marker.stroke,f=s?h:d;r=o.isFunction(b)?b(l,f,s,n):b;var p=o.substitute(r,o.mix({},e,{index:n,checked:s?"checked":"unChecked",value:l,color:f,originColor:h,originValue:e.value.replace(/\"/g,""")})),v=u.createDom(p);v.style.color=t.get("textStyle").fill;var y=i(v,g),x=i(v,"g2-legend-text");if(u.modifyCSS(v,C),y&&u.modifyCSS(y,A),s||(v.style.color=d,y&&(y.style.backgroundColor=d)),c.appendChild(v),t.get("abridgeText")){var m=l,_=v.offsetWidth,w=t.get("textStyle").fontSize;isNaN(w)&&(-1!==w.indexOf("pt")?w=1*parseFloat(w.substr(0,w.length-2))/72*96:-1!==w.indexOf("px")&&(w=parseFloat(w.substr(0,w.length-2))));var S=w*m.length,M=Math.floor(_/w);_<2*w?m="":_1&&(m=m.substr(0,M-1)+"..."),x.innerText=m,v.addEventListener("mouseover",function(){var t=i(a.parentNode,"textTip");t.style.display="block",t.style.left=v.offsetLeft+v.offsetWidth+"px",t.style.top=v.offsetTop+15+"px",t.innerText=l}),v.addEventListener("mouseout",function(){i(a.parentNode,"textTip").style.display="none"})}}),this.get("abridgeText")){var k=this.get("tipTpl"),P=u.createDom(k),T=this.get("tipStyle");u.modifyCSS(P,T),a.parentNode.appendChild(P),P.addEventListener("mouseover",function(){P.style.display="none"})}this.set("legendWrapper",a)},n._adjustPositionOffset=function(){var t=this.get("position"),e=this.get("offset"),n=this.get("offsetX"),i=this.get("offsetY");n&&(e[0]=n),i&&(e[1]=i);var r=this.get("legendWrapper");r.style.left=t[0]+"px",r.style.top=t[1]+"px",r.style.marginLeft=e[0]+"px",r.style.marginTop=e[1]+"px"},n.getWidth=function(){return u.getOuterWidth(this.get("legendWrapper"))},n.getHeight=function(){return u.getOuterHeight(this.get("legendWrapper"))},n.move=function(e,n){/^\#/.test(this.get("container"))?t.prototype.move.call(this,e,n):(u.modifyCSS(this.get("legendWrapper"),{left:e+"px",top:n+"px"}),this.set("x",e),this.set("y",n))},n.destroy=function(){var t=this.get("legendWrapper");t&&t.parentNode&&t.parentNode.removeChild(t)},e}(s);t.exports=d},function(t,e,n){var i=n(32),r=n(3),a=function(t){function e(e){var n;return(n=t.call(this,e)||this)._init_(),n.render(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:null,plot:null,plotRange:null,rectStyle:{fill:"#CCD6EC",opacity:.3},lineStyle:{stroke:"rgba(0, 0, 0, 0.25)",lineWidth:1},isTransposed:!1})},n._init_=function(){var t,e=this.get("plot");t="rect"===this.type?e.addGroup({zIndex:0}):e.addGroup(),this.set("container",t)},n._addLineShape=function(t,e){var n=this.get("container").addShape("line",{capture:!1,attrs:t});return this.set("crossLineShape"+e,n),n},n._renderHorizontalLine=function(t,e){var n=r.mix(this.get("lineStyle"),this.get("style")),i=r.mix({x1:e?e.bl.x:t.get("width"),y1:0,x2:e?e.br.x:0,y2:0},n);this._addLineShape(i,"X")},n._renderVerticalLine=function(t,e){var n=r.mix(this.get("lineStyle"),this.get("style")),i=r.mix({x1:0,y1:e?e.bl.y:t.get("height"),x2:0,y2:e?e.tl.y:0},n);this._addLineShape(i,"Y")},n._renderBackground=function(t,e){var n=r.mix(this.get("rectStyle"),this.get("style")),i=this.get("container"),a=r.mix({x:e?e.tl.x:0,y:e?e.tl.y:t.get("height"),width:e?e.br.x-e.bl.x:t.get("width"),height:e?Math.abs(e.tl.y-e.bl.y):t.get("height")},n),o=i.addShape("rect",{attrs:a,capture:!1});return this.set("crosshairsRectShape",o),o},n._updateRectShape=function(t){var e,n=this.get("crosshairsRectShape"),i=this.get("isTransposed"),a=t[0],o=t[t.length-1],s=i?"y":"x",l=i?"height":"width",u=a[s];if(t.length>1&&a[s]>o[s]&&(u=o[s]),this.get("width"))n.attr(s,u-this.get("crosshairs").width/2),n.attr(l,this.get("width"));else if(r.isArray(a.point[s])&&!a.size){var c=a.point[s][1]-a.point[s][0];n.attr(s,a.point[s][0]),n.attr(l,c)}else e=3*a.size/4,n.attr(s,u-e),1===t.length?n.attr(l,3*a.size/2):n.attr(l,Math.abs(o[s]-a[s])+2*e)},n.render=function(){var t=this.get("canvas"),e=this.get("plotRange"),n=this.get("isTransposed");switch(this.clear(),this.get("type")){case"x":this._renderHorizontalLine(t,e);break;case"y":this._renderVerticalLine(t,e);break;case"cross":this._renderHorizontalLine(t,e),this._renderVerticalLine(t,e);break;case"rect":this._renderBackground(t,e);break;default:n?this._renderHorizontalLine(t,e):this._renderVerticalLine(t,e)}},n.show=function(){var e=this.get("container");t.prototype.show.call(this),e.show()},n.hide=function(){var e=this.get("container");t.prototype.hide.call(this),e.hide()},n.clear=function(){var e=this.get("container");this.set("crossLineShapeX",null),this.set("crossLineShapeY",null),this.set("crosshairsRectShape",null),t.prototype.clear.call(this),e.clear()},n.destroy=function(){var e=this.get("container");t.prototype.destroy.call(this),e.remove()},n.setPosition=function(t,e,n){var i=this.get("crossLineShapeX"),r=this.get("crossLineShapeY"),a=this.get("crosshairsRectShape");r&&!r.get("destroyed")&&r.move(t,0),i&&!i.get("destroyed")&&i.move(0,e),a&&!a.get("destroyed")&&this._updateRectShape(n)},e}(i);t.exports=a},function(t,e){var n={_calcTooltipPosition:function(t,e,n,i,r,a){var o=0,s=0,l=20;if(a){var u=a.getBBox();o=u.width,s=u.height,t=u.x,e=u.y,l=5}switch(n){case"inside":t=t+o/2-i/2,e=e+s/2-r/2;break;case"top":t=t+o/2-i/2,e=e-r-l;break;case"left":t=t-i-l,e=e+s/2-r/2;break;case"right":t=t+o+l,e=e+s/2-r/2;break;case"bottom":default:t=t+o/2-i/2,e=e+s+l}return[t,e]},_constraintPositionInBoundary:function(t,e,n,i,r,a){return t+n+20>r?t=(t-=n+20)<0?0:t:t+20<0?t=20:t+=20,e+i+20>a?e=(e-=i+20)<0?0:e:e+20<0?e=20:e+=20,[t,e]},_constraintPositionInPlot:function(t,e,n,i,r,a){return t+n>r.tr.x&&(t-=n+40),tr.bl.y&&(e-=i+40),ee&&!a){t+=2*Math.asin(e/(2*o))}else o+=e;return{x:r.x+o*Math.cos(t),y:r.y+o*Math.sin(t),angle:t,r:o}},n.getArcPoint=function(t,e){var n;return e=e||0,n=a.isArray(t.x)||a.isArray(t.y)?{x:a.isArray(t.x)?t.x[e]:t.x,y:a.isArray(t.y)?t.y[e]:t.y}:t,this.transLabelPoint(n),n},n.getPointAngle=function(t){var e=this.get("coord");return r.getPointAngle(e,t)},n.getMiddlePoint=function(t){var e=this.get("coord"),n=t.length,i={x:0,y:0};return a.each(t,function(t){i.x+=t.x,i.y+=t.y}),i.x/=n,i.y/=n,i=e.convert(i)},n._isToMiddle=function(t){return t.x.length>2},n.getLabelPoint=function(t,e,n){var i,r=t.text[n],a=1;this._isToMiddle(e)?i=this.getMiddlePoint(e.points):(1===t.text.length&&0===n?n=1:0===n&&(a=-1),i=this.getArcPoint(e,n));var o=this.getDefaultOffset(t);o*=a;var s=this.getPointAngle(i),l=this.getCirclePoint(s,o,i);if(l?(l.text=r,l.angle=s,l.color=e.color):l={text:""},t.autoRotate||void 0===t.autoRotate){var u=l.textStyle?l.textStyle.rotate:null;u||(u=l.rotate||this.getLabelRotate(s,o,e)),l.rotate=u}return l.start={x:i.x,y:i.y},l},n._isEmitLabels=function(){return this.get("label").labelEmit},n.getLabelRotate=function(t){var e;return e=180*t/Math.PI,e+=90,this._isEmitLabels()&&(e-=90),e&&(e>90?e-=180:e<-90&&(e+=180)),e/180*Math.PI},n.getLabelAlign=function(t){var e,n=this.get("coord");if(this._isEmitLabels())e=t.angle<=Math.PI/2&&t.angle>-Math.PI/2?"left":"right";else if(n.isTransposed){var i=n.getCenter(),r=this.getDefaultOffset(t);e=Math.abs(t.x-i.x)<1?"center":t.angle>Math.PI||t.angle<=0?r>0?"left":"right":r>0?"right":"left"}else e="center";return e},e}(i);t.exports=o},function(t,e,n){t.exports={Scale:n(341),Coord:n(342),Axis:n(347),Guide:n(348),Legend:n(351),Tooltip:n(353),Event:n(354)}},function(t,e,n){function i(t,e,n){void 0===n&&(n=1);var i=[t.x,t.y,n];return a.vec3.transformMat3(i,i,e),{x:i[0],y:i[1]}}var r=n(16),a=n(0),o=n(167);t.exports=function(t,e){var n=e;return a.each(t.get("children"),function(t){if(t instanceof r.Group||t instanceof r.Path)n=o(n,t.getBBox());else if(t instanceof r.Text){var e=function(t){var e=t.getBBox(),n={x:e.minX,y:e.minY},r={x:e.maxX,y:e.maxY},a=t.attr("matrix");return n=i(n,a),r=i(r,a),{minX:n.x,minY:n.y,maxX:r.x,maxY:r.y}}(t),s=Math.abs(e.maxX-e.minX),l=Math.abs(e.maxY-e.minY);n=s0?e=0:n=0,n-e<5&&!l&&n-e>=1&&(l=1)),i(l)){var m=(n-e)/(v-1);l=a.snapFactorTo(m,x,"ceil"),f!==h&&((y=parseInt((n-e)/l,10))>f&&(y=f),ye&&(_-=l),n=a.fixedBase(M,l),e=a.fixedBase(_,l)}n=Math.min(n,d),e=Math.max(e,g),c.push(e);for(var C=1;Cn?(s=o,o=n):s>n&&(s=n),l1&&(e.minTickInterval=s-o),(a(e.min)||e._toTimeStamp(e.min)>o)&&(e.min=o),(a(e.max)||e._toTimeStamp(e.max)d&&(d=n);var m=d/x,_=i(p);if(m>.51){for(var b=Math.ceil(m),w=i(g),S=_;S<=w+b;S+=b)f.push(r(S));d=null}else if(m>.0834){for(var M=Math.ceil(m/.0834),C=a(p),A=function(t,e){var n=i(t),r=i(e),o=a(t);return 12*(r-n)+(a(e)-o)%12}(p,g),k=0;k<=A+M;k+=M)f.push(o(_,k+C));d=null}else if(d>.5*y){var P=new Date(p),T=P.getFullYear(),I=P.getMonth(p),O=P.getDate(),L=Math.ceil(d/y),E=function(t,e){return Math.ceil((e-t)/h)}(p,g);d=L*y;for(var D=0;Dc){var F=new Date(p),B=F.getFullYear(),R=F.getMonth(p),j=F.getDate(),N=F.getHours(),z=s.snapTo(u,Math.ceil(d/c)),Y=function(t,e){return Math.ceil((e-t)/c)}(p,g);d=z*c;for(var V=0;V<=Y+z;V+=z)f.push(new Date(B,R,j,N+V).getTime())}else if(d>6e4){var X=function(t,e){return Math.ceil((e-t)/6e4)}(p,g),H=Math.ceil(d/6e4);d=6e4*H;for(var W=0;W<=X+H;W+=H)f.push(p+6e4*W)}else{d<1e3&&(d=1e3),p=1e3*Math.floor(p/1e3);var G=Math.ceil((g-p)/1e3),q=Math.ceil(d/1e3);d=1e3*q;for(var U=0;U-1?r/(this.values.length-1):0,n+e*(i-n)},n.getText=function(t){var e="",n=this.translate(t);e=n>-1?this.values[n]:t;var i=this.formatter;return e=parseInt(e,10),e=i?i(e):a.format(e,this.mask)},n.getTicks=function(){var t=this,e=this.ticks,n=[];return l(e,function(e){var i;i=c(e)?e:{text:h(e)?e:t.getText(e),value:t.scale(e),tickValue:e},n.push(i)}),n},n._toTimeStamp=function(t){return s.toTimeStamp(t)},e}(r);i.TimeCat=f,t.exports=f},function(t,e,n){function i(t,e){return 1===t?1:Math.log(e)/Math.log(t)}var r=n(2),a=n(17),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n._initDefaultCfg=function(){t.prototype._initDefaultCfg.call(this),this.type="log",this.tickCount=10,this.base=2,this._minTick=null},n.calculateTicks=function(){var t,e=this.base;if(this.min<0)throw new Error("The minimum value must be greater than zero!");var n=i(e,this.max);if(this.min>0)t=Math.floor(i(e,this.min));else{var a=this.values,o=this.max;r(a,function(t){t>0&&t1&&(o=1),t=Math.floor(i(e,o)),this._minTick=t,this.positiveMin=o}for(var s=n-t,l=this.tickCount,u=Math.ceil(s/l),c=[],h=t;h=0?Math.floor(i(e,this.min)):0)>n){var r=n;n=t,t=r}for(var a=n-t,o=this.tickCount,s=Math.ceil(a/o),l=[],u=t;u0&&(r=1/Math.sqrt(r),t[0]=e[0]*r,t[1]=e[1]*r),t},e.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]},e.cross=function(t,e,n){var i=e[0]*n[1]-e[1]*n[0];return t[0]=t[1]=0,t[2]=i,t},e.lerp=function(t,e,n,i){var r=e[0],a=e[1];return t[0]=r+i*(n[0]-r),t[1]=a+i*(n[1]-a),t},e.random=function(t,e){e=e||1;var n=2*h.RANDOM()*Math.PI;return t[0]=Math.cos(n)*e,t[1]=Math.sin(n)*e,t},e.transformMat2=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r,t[1]=n[1]*i+n[3]*r,t},e.transformMat2d=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},e.transformMat3=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[3]*r+n[6],t[1]=n[1]*i+n[4]*r+n[7],t},e.transformMat4=function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[4]*r+n[12],t[1]=n[1]*i+n[5]*r+n[13],t},e.rotate=function(t,e,n,i){var r=e[0]-n[0],a=e[1]-n[1],o=Math.sin(i),s=Math.cos(i);return t[0]=r*s-a*o+n[0],t[1]=r*o+a*s+n[1],t},e.angle=function(t,e){var n=t[0],i=t[1],r=e[0],a=e[1],o=n*n+i*i;o>0&&(o=1/Math.sqrt(o));var s=r*r+a*a;s>0&&(s=1/Math.sqrt(s));var l=(n*r+i*a)*o*s;return l>1?0:l<-1?Math.PI:Math.acos(l)},e.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]},e.equals=function(t,e){var n=t[0],i=t[1],r=e[0],a=e[1];return Math.abs(n-r)<=h.EPSILON*Math.max(1,Math.abs(n),Math.abs(r))&&Math.abs(i-a)<=h.EPSILON*Math.max(1,Math.abs(i),Math.abs(a))};var h=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(52));e.len=u,e.sub=r,e.mul=a,e.div=o,e.dist=s,e.sqrDist=l,e.sqrLen=c,e.forEach=function(){var t=i();return function(e,n,i,r,a,o){var s=void 0,l=void 0;for(n||(n=2),i||(i=0),l=r?Math.min(r*n+i,e.length):e.length,s=i;s0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t}function p(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}Object.defineProperty(e,"__esModule",{value:!0}),e.forEach=e.sqrLen=e.len=e.sqrDist=e.dist=e.div=e.mul=e.sub=void 0,e.create=i,e.clone=function(t){var e=new g.ARRAY_TYPE(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},e.length=r,e.fromValues=a,e.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t},e.set=function(t,e,n,i){return t[0]=e,t[1]=n,t[2]=i,t},e.add=function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t},e.subtract=o,e.multiply=s,e.divide=l,e.ceil=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t},e.floor=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t},e.min=function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t[2]=Math.min(e[2],n[2]),t},e.max=function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t[2]=Math.max(e[2],n[2]),t},e.round=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t},e.scale=function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t},e.scaleAndAdd=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t[2]=e[2]+n[2]*i,t},e.distance=u,e.squaredDistance=c,e.squaredLength=h,e.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t},e.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t},e.normalize=f,e.dot=p,e.cross=function(t,e,n){var i=e[0],r=e[1],a=e[2],o=n[0],s=n[1],l=n[2];return t[0]=r*l-a*s,t[1]=a*o-i*l,t[2]=i*s-r*o,t},e.lerp=function(t,e,n,i){var r=e[0],a=e[1],o=e[2];return t[0]=r+i*(n[0]-r),t[1]=a+i*(n[1]-a),t[2]=o+i*(n[2]-o),t},e.hermite=function(t,e,n,i,r,a){var o=a*a,s=o*(2*a-3)+1,l=o*(a-2)+a,u=o*(a-1),c=o*(3-2*a);return t[0]=e[0]*s+n[0]*l+i[0]*u+r[0]*c,t[1]=e[1]*s+n[1]*l+i[1]*u+r[1]*c,t[2]=e[2]*s+n[2]*l+i[2]*u+r[2]*c,t},e.bezier=function(t,e,n,i,r,a){var o=1-a,s=o*o,l=a*a,u=s*o,c=3*a*s,h=3*l*o,f=l*a;return t[0]=e[0]*u+n[0]*c+i[0]*h+r[0]*f,t[1]=e[1]*u+n[1]*c+i[1]*h+r[1]*f,t[2]=e[2]*u+n[2]*c+i[2]*h+r[2]*f,t},e.random=function(t,e){e=e||1;var n=2*g.RANDOM()*Math.PI,i=2*g.RANDOM()-1,r=Math.sqrt(1-i*i)*e;return t[0]=Math.cos(n)*r,t[1]=Math.sin(n)*r,t[2]=i*e,t},e.transformMat4=function(t,e,n){var i=e[0],r=e[1],a=e[2],o=n[3]*i+n[7]*r+n[11]*a+n[15];return o=o||1,t[0]=(n[0]*i+n[4]*r+n[8]*a+n[12])/o,t[1]=(n[1]*i+n[5]*r+n[9]*a+n[13])/o,t[2]=(n[2]*i+n[6]*r+n[10]*a+n[14])/o,t},e.transformMat3=function(t,e,n){var i=e[0],r=e[1],a=e[2];return t[0]=i*n[0]+r*n[3]+a*n[6],t[1]=i*n[1]+r*n[4]+a*n[7],t[2]=i*n[2]+r*n[5]+a*n[8],t},e.transformQuat=function(t,e,n){var i=n[0],r=n[1],a=n[2],o=n[3],s=e[0],l=e[1],u=e[2],c=r*u-a*l,h=a*s-i*u,f=i*l-r*s,p=r*f-a*h,g=a*c-i*f,d=i*h-r*c,v=2*o;return c*=v,h*=v,f*=v,p*=2,g*=2,d*=2,t[0]=s+c+p,t[1]=l+h+g,t[2]=u+f+d,t},e.rotateX=function(t,e,n,i){var r=[],a=[];return r[0]=e[0]-n[0],r[1]=e[1]-n[1],r[2]=e[2]-n[2],a[0]=r[0],a[1]=r[1]*Math.cos(i)-r[2]*Math.sin(i),a[2]=r[1]*Math.sin(i)+r[2]*Math.cos(i),t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},e.rotateY=function(t,e,n,i){var r=[],a=[];return r[0]=e[0]-n[0],r[1]=e[1]-n[1],r[2]=e[2]-n[2],a[0]=r[2]*Math.sin(i)+r[0]*Math.cos(i),a[1]=r[1],a[2]=r[2]*Math.cos(i)-r[0]*Math.sin(i),t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},e.rotateZ=function(t,e,n,i){var r=[],a=[];return r[0]=e[0]-n[0],r[1]=e[1]-n[1],r[2]=e[2]-n[2],a[0]=r[0]*Math.cos(i)-r[1]*Math.sin(i),a[1]=r[0]*Math.sin(i)+r[1]*Math.cos(i),a[2]=r[2],t[0]=a[0]+n[0],t[1]=a[1]+n[1],t[2]=a[2]+n[2],t},e.angle=function(t,e){var n=a(t[0],t[1],t[2]),i=a(e[0],e[1],e[2]);f(n,n),f(i,i);var r=p(n,i);return r>1?0:r<-1?Math.PI:Math.acos(r)},e.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},e.exactEquals=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]},e.equals=function(t,e){var n=t[0],i=t[1],r=t[2],a=e[0],o=e[1],s=e[2];return Math.abs(n-a)<=g.EPSILON*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(i-o)<=g.EPSILON*Math.max(1,Math.abs(i),Math.abs(o))&&Math.abs(r-s)<=g.EPSILON*Math.max(1,Math.abs(r),Math.abs(s))};var g=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(52));e.sub=o,e.mul=s,e.div=l,e.dist=u,e.sqrDist=c,e.len=r,e.sqrLen=h,e.forEach=function(){var t=i();return function(e,n,i,r,a,o){var s=void 0,l=void 0;for(n||(n=3),i||(i=0),l=r?Math.min(r*n+i,e.length):e.length,s=i;s2*Math.PI&&(t=t/180*Math.PI),this.transform([["t",-e,-n],["r",t],["t",e,n]])},move:function(t,e){var n=this.get("x")||0,i=this.get("y")||0;return this.translate(t-n,e-i),this.set("x",t),this.set("y",e),this},transform:function(t){var e=this,n=this._attrs.matrix;return o.each(t,function(t){switch(t[0]){case"t":e.translate(t[1],t[2]);break;case"s":e.scale(t[1],t[2]);break;case"r":e.rotate(t[1]);break;case"m":e.attr("matrix",o.mat3.multiply([],n,t[1])),e.clearTotalMatrix()}}),e},setTransform:function(t){return this.attr("matrix",[1,0,0,0,1,0,0,0,1]),this.transform(t)},getMatrix:function(){return this.attr("matrix")},setMatrix:function(t){return this.attr("matrix",t),this.clearTotalMatrix(),this},apply:function(t,e){var n;return n=e?this._getMatrixByRoot(e):this.attr("matrix"),o.vec3.transformMat3(t,t,n),this},_getMatrixByRoot:function(t){t=t||this;for(var e=this,n=[];e!==t;)n.unshift(e),e=e.get("parent");n.unshift(e);var i=[1,0,0,0,1,0,0,0,1];return o.each(n,function(t){o.mat3.multiply(i,t.attr("matrix"),i)}),i},getTotalMatrix:function(){var t=this._cfg.totalMatrix;if(!t){t=[1,0,0,0,1,0,0,0,1];var e=this._cfg.parent;if(e){a(t,e.getTotalMatrix())}a(t,this.attr("matrix")),this._cfg.totalMatrix=t}return t},clearTotalMatrix:function(){},invert:function(t){var e=this.getTotalMatrix();if(r(e))t[0]/=e[0],t[1]/=e[4];else{var n=o.mat3.invert([],e);n&&o.vec3.transformMat3(t,t,n)}return this},resetTransform:function(t){var e=this.attr("matrix");i(e)||t.transform(e[0],e[1],e[3],e[4],e[6],e[7])}}},function(t,e,n){var i=n(1),r={delay:"delay",rotate:"rotate"},a={fill:"fill",stroke:"stroke",fillStyle:"fillStyle",strokeStyle:"strokeStyle"};t.exports={animate:function(t,e,n,o,s){void 0===s&&(s=0);this.set("animating",!0);var l=this.get("timeline");l||(l=this.get("canvas").get("timeline"),this.setSilent("timeline",l));var u=this.get("animators")||[];l._timer||l.initTimer(),i.isNumber(o)&&(s=o,o=null),i.isFunction(n)?(o=n,n="easeLinear"):n=n||"easeLinear";var c=function(t,e){var n={matrix:null,attrs:{}},o=e._attrs;for(var s in t)if("transform"===s)n.matrix=i.transform(e.getMatrix(),t[s]);else if("rotate"===s)n.matrix=i.transform(e.getMatrix(),[["r",t[s]]]);else if("matrix"===s)n.matrix=t[s];else{if(a[s]&&/^[r,R,L,l]{1}[\s]*\(/.test(t[s]))continue;r[s]||o[s]===t[s]||(n.attrs[s]=t[s])}return n}(t,this),h={fromAttrs:function(t,e){var n={},i=e._attrs;for(var r in t.attrs)n[r]=i[r];return n}(c,this),toAttrs:c.attrs,fromMatrix:i.clone(this.getMatrix()),toMatrix:c.matrix,duration:e,easing:n,callback:o,delay:s,startTime:l.getTime(),id:i.uniqueId()};u.length>0?u=function(t,e){var n=e.delay,r=Object.prototype.hasOwnProperty;return i.each(e.toAttrs,function(e,a){i.each(t,function(t){n').getContext("2d"),l={arc:function(t,e){var n=this._attrs,i=n.x,r=n.y,o=n.r,s=n.startAngle,l=n.endAngle,u=n.clockwise,c=this.getHitLineWidth();return!!this.hasStroke()&&a.arcline(i,r,o,s,l,u,c,t,e)},circle:function(t,e){var n=this._attrs,i=n.x,r=n.y,o=n.r,s=this.getHitLineWidth(),l=this.hasFill(),u=this.hasStroke();return l&&u?a.circle(i,r,o,t,e)||a.arcline(i,r,o,0,2*Math.PI,!1,s,t,e):l?a.circle(i,r,o,t,e):!!u&&a.arcline(i,r,o,0,2*Math.PI,!1,s,t,e)},dom:function(t,e){if(!this._cfg.el)return!1;var n=this._cfg.el.getBBox();return a.box(n.x,n.x+n.width,n.y,n.y+n.height,t,e)},ellipse:function(t,e){var n=this._attrs,i=this.hasFill(),o=this.hasStroke(),s=n.x,l=n.y,u=n.rx,c=n.ry,h=this.getHitLineWidth(),f=u>c?u:c,p=u>c?1:u/c,g=u>c?c/u:1,d=[t,e,1],v=[1,0,0,0,1,0,0,0,1];r.mat3.scale(v,v,[p,g]),r.mat3.translate(v,v,[s,l]);var y=r.mat3.invert([],v);return r.vec3.transformMat3(d,d,y),i&&o?a.circle(0,0,f,d[0],d[1])||a.arcline(0,0,f,0,2*Math.PI,!1,h,d[0],d[1]):i?a.circle(0,0,f,d[0],d[1]):!!o&&a.arcline(0,0,f,0,2*Math.PI,!1,h,d[0],d[1])},fan:function(t,e){function n(){var t=o.arc.nearAngle(m,d,v,y);if(r.isNumberEqual(m,t)){var e=r.vec2.squaredLength(x);if(p*p<=e&&e<=g*g)return!0}return!1}function i(){var n=s.getHitLineWidth(),i={x:Math.cos(d)*p+h,y:Math.sin(d)*p+f},r={x:Math.cos(d)*g+h,y:Math.sin(d)*g+f},o={x:Math.cos(v)*p+h,y:Math.sin(v)*p+f},l={x:Math.cos(v)*g+h,y:Math.sin(v)*g+f};return!!(a.line(i.x,i.y,r.x,r.y,n,t,e)||a.line(o.x,o.y,l.x,l.y,n,t,e)||a.arcline(h,f,p,d,v,y,n,t,e)||a.arcline(h,f,g,d,v,y,n,t,e))}var s=this,l=s.hasFill(),u=s.hasStroke(),c=s._attrs,h=c.x,f=c.y,p=c.rs,g=c.re,d=c.startAngle,v=c.endAngle,y=c.clockwise,x=[t-h,e-f],m=r.vec2.angleTo([1,0],x);return l&&u?n()||i():l?n():!!u&&i()},image:function(t,e){var n=this._attrs;if(this.get("toDraw")||!n.img)return!1;this._cfg.attrs&&this._cfg.attrs.img===n.img||this._setAttrImg();var i=n.x,r=n.y,o=n.width,s=n.height;return a.rect(i,r,o,s,t,e)},line:function(t,e){var n=this._attrs,i=n.x1,r=n.y1,o=n.x2,s=n.y2,l=this.getHitLineWidth();return!!this.hasStroke()&&a.line(i,r,o,s,l,t,e)},path:function(t,e){function n(){if(!r.isEmpty(o)){for(var n=a.getHitLineWidth(),i=0,s=o.length;i=3&&o.push(n[0]),a.polyline(o,i,t,e)}var r=this,o=r.hasFill(),s=r.hasStroke();return o&&s?i(t,e,r)||n():o?i(t,e,r):!!s&&n()},polyline:function(t,e){var n=this._attrs;if(this.hasStroke()){var i=n.points;if(i.length<2)return!1;var r=n.lineWidth;return a.polyline(i,r,t,e)}return!1},rect:function(t,e){function n(){var n=r._attrs,i=n.x,o=n.y,s=n.width,l=n.height,u=n.radius,c=r.getHitLineWidth();if(0===u){var h=c/2;return a.line(i-h,o,i+s+h,o,c,t,e)||a.line(i+s,o-h,i+s,o+l+h,c,t,e)||a.line(i+s+h,o+l,i-h,o+l,c,t,e)||a.line(i,o+l+h,i,o-h,c,t,e)}return a.line(i+u,o,i+s-u,o,c,t,e)||a.line(i+s,o+u,i+s,o+l-u,c,t,e)||a.line(i+s-u,o+l,i+u,o+l,c,t,e)||a.line(i,o+l-u,i,o+u,c,t,e)||a.arcline(i+s-u,o+u,u,1.5*Math.PI,2*Math.PI,!1,c,t,e)||a.arcline(i+s-u,o+l-u,u,0,.5*Math.PI,!1,c,t,e)||a.arcline(i+u,o+l-u,u,.5*Math.PI,Math.PI,!1,c,t,e)||a.arcline(i+u,o+u,u,Math.PI,1.5*Math.PI,!1,c,t,e)}var r=this,o=r.hasFill(),s=r.hasStroke();return o&&s?i(t,e,r)||n():o?i(t,e,r):!!s&&n()},text:function(t,e){var n=this.getBBox();if(this.hasFill()||this.hasStroke())return a.box(n.minX,n.maxX,n.minY,n.maxY,t,e)}};t.exports={isPointInPath:function(t,e){var n=l[this.type];return!!n&&n.call(this,t,e)}}},function(t,e,n){function i(t,e,n){var i=e.startTime;if(ng.length?(p=a.parsePathString(o[f]),g=a.parsePathString(s[f]),g=a.fillPathByDiff(g,p),g=a.formatPath(g,p),e.fromAttrs.path=g,e.toAttrs.path=p):e.pathFormatted||(p=a.parsePathString(o[f]),g=a.parsePathString(s[f]),g=a.formatPath(g,p),e.fromAttrs.path=g,e.toAttrs.path=p,e.pathFormatted=!0),i[f]=[];for(var d=0;d0){for(var l=r._animators.length-1;l>=0;l--)if((t=r._animators[l]).get("destroyed"))a.removeAnimator(l);else{if(!t.get("pause").isPaused)for(var u=(e=t.get("animators")).length-1;u>=0;u--)n=e[u],(s=i(t,n,o))&&(e.splice(u,1),s=!1,n.callback&&n.callback());0===e.length&&a.removeAnimator(l)}r.canvas.draw()}})},addAnimator:function(t){this._animators.push(t)},removeAnimator:function(t){this._animators.splice(t,1)},isAnimating:function(){return!!this._animators.length},stop:function(){this._timer&&this._timer.stop()},stopAllAnimations:function(){this._animators.forEach(function(t){t.stopAnimate()}),this._animators=[],this.canvas.draw()},getTime:function(){return this._current}}),t.exports=h},function(t,e,n){"use strict";var i=n(58);e.a=function(t,e,n){var r=new i.a;return e=null==e?0:+e,r.restart(function(n){r.stop(),t(n+e)},e,n),r}},function(t,e,n){"use strict";var i=n(58);e.a=function(t,e,n){var r=new i.a,a=e;return null==e?(r.restart(t,e,n),r):(e=+e,n=null==n?Object(i.b)():+n,r.restart(function i(o){o+=a,r.restart(i,a+=e,n),t(o)},e,n),r)}},function(t,e,n){"use strict";e.a=function(t){return+t}},function(t,e,n){"use strict";e.a=function(t){return t*t},e.c=function(t){return t*(2-t)},e.b=function(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}},function(t,e,n){"use strict";e.a=function(t){return t*t*t},e.c=function(t){return--t*t*t+1},e.b=function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}},function(t,e,n){"use strict";n.d(e,"a",function(){return i}),n.d(e,"c",function(){return r}),n.d(e,"b",function(){return a});var i=function t(e){function n(t){return Math.pow(t,e)}return e=+e,n.exponent=t,n}(3),r=function t(e){function n(t){return 1-Math.pow(1-t,e)}return e=+e,n.exponent=t,n}(3),a=function t(e){function n(t){return((t*=2)<=1?Math.pow(t,e):2-Math.pow(2-t,e))/2}return e=+e,n.exponent=t,n}(3)},function(t,e,n){"use strict";e.a=function(t){return 1-Math.cos(t*r)},e.c=function(t){return Math.sin(t*r)},e.b=function(t){return(1-Math.cos(i*t))/2};var i=Math.PI,r=i/2},function(t,e,n){"use strict";e.a=function(t){return Math.pow(2,10*t-10)},e.c=function(t){return 1-Math.pow(2,-10*t)},e.b=function(t){return((t*=2)<=1?Math.pow(2,10*t-10):2-Math.pow(2,10-10*t))/2}},function(t,e,n){"use strict";e.a=function(t){return 1-Math.sqrt(1-t*t)},e.c=function(t){return Math.sqrt(1- --t*t)},e.b=function(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}},function(t,e,n){"use strict";function i(t){return(t=+t)b?Math.pow(t,1/3):t/_+x}function s(t){return t>m?t*t*t:_*(t-x)}function l(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function u(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function c(t,e,n,r){return 1===arguments.length?function(t){if(t instanceof h)return new h(t.h,t.c,t.l,t.opacity);t instanceof a||(t=i(t));var e=Math.atan2(t.b,t.a)*g.b;return new h(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}(t):new h(t,e,n,null==r?1:r)}function h(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}e.a=r,e.b=c;var f=n(61),p=n(60),g=n(118),d=.95047,v=1,y=1.08883,x=4/29,m=6/29,_=3*m*m,b=m*m*m;Object(f.a)(a,r,Object(f.b)(p.a,{brighter:function(t){return new a(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new a(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return t=v*s(t),e=d*s(e),n=y*s(n),new p.b(l(3.2404542*e-1.5371385*t-.4985314*n),l(-.969266*e+1.8760108*t+.041556*n),l(.0556434*e-.2040259*t+1.0572252*n),this.opacity)}})),Object(f.a)(h,c,Object(f.b)(p.a,{brighter:function(t){return new h(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new h(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return i(this).rgb()}}))},function(t,e,n){"use strict";function i(t,e,n,i){return 1===arguments.length?function(t){if(t instanceof r)return new r(t.h,t.s,t.l,t.opacity);t instanceof o.b||(t=Object(o.h)(t));var e=t.r/255,n=t.g/255,i=t.b/255,a=(d*i+p*e-g*n)/(d+p-g),l=i-a,u=(f*(n-a)-c*l)/h,v=Math.sqrt(u*u+l*l)/(f*a*(1-a)),y=v?Math.atan2(u,l)*s.b-120:NaN;return new r(y<0?y+360:y,v,a,t.opacity)}(t):new r(t,e,n,null==i?1:i)}function r(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}e.a=i;var a=n(61),o=n(60),s=n(118),l=-.14861,u=1.78277,c=-.29227,h=-.90649,f=1.97294,p=f*h,g=f*u,d=u*c-h*l;Object(a.a)(r,i,Object(a.b)(o.a,{brighter:function(t){return t=null==t?o.c:Math.pow(o.c,t),new r(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?o.d:Math.pow(o.d,t),new r(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*s.a,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),i=Math.cos(t),r=Math.sin(t);return new o.b(255*(e+n*(l*i+u*r)),255*(e+n*(c*i+h*r)),255*(e+n*(f*i)),this.opacity)}}))},function(t,e,n){"use strict";e.a=function(t,e){return t=+t,e-=t,function(n){return Math.round(t+e*n)}}},function(t,e,n){"use strict";function i(t,e,n,i){function a(t){return t.length?t.pop()+" ":""}return function(o,s){var l=[],u=[];return o=t(o),s=t(s),function(t,i,a,o,s,l){if(t!==a||i!==o){var u=s.push("translate(",null,e,null,n);l.push({i:u-4,x:Object(r.a)(t,a)},{i:u-2,x:Object(r.a)(i,o)})}else(a||o)&&s.push("translate("+a+e+o+n)}(o.translateX,o.translateY,s.translateX,s.translateY,l,u),function(t,e,n,o){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),o.push({i:n.push(a(n)+"rotate(",null,i)-2,x:Object(r.a)(t,e)})):e&&n.push(a(n)+"rotate("+e+i)}(o.rotate,s.rotate,l,u),function(t,e,n,o){t!==e?o.push({i:n.push(a(n)+"skewX(",null,i)-2,x:Object(r.a)(t,e)}):e&&n.push(a(n)+"skewX("+e+i)}(o.skewX,s.skewX,l,u),function(t,e,n,i,o,s){if(t!==n||e!==i){var l=o.push(a(o)+"scale(",null,",",null,")");s.push({i:l-4,x:Object(r.a)(t,n)},{i:l-2,x:Object(r.a)(e,i)})}else 1===n&&1===i||o.push(a(o)+"scale("+n+","+i+")")}(o.scaleX,o.scaleY,s.scaleX,s.scaleY,l,u),o=s=null,function(t){for(var e,n=-1,i=u.length;++n');return t.appendChild(n),this.type="canvas",this.canvas=n,this.context=n.getContext("2d"),this.toDraw=!1,this}var e=t.prototype;return e.beforeDraw=function(){var t=this.canvas;this.context&&this.context.clearRect(0,0,t.width,t.height)},e.draw=function(t){function e(){n.animateHandler=i.requestAnimationFrame(function(){n.animateHandler=void 0,n.toDraw&&e()}),n.beforeDraw();try{n._drawGroup(t)}catch(t){console.warn("error in draw canvas, detail as:"),console.warn(t),n.toDraw=!1}n.toDraw=!1}var n=this;n.animateHandler?n.toDraw=!0:e()},e.drawSync=function(t){this.beforeDraw(),this._drawGroup(t)},e._drawGroup=function(t){if(!t._cfg.removed&&!t._cfg.destroyed&&t._cfg.visible){var e=t._cfg.children,n=null;this.setContext(t);for(var i=0;i-1){var s=n[o];"fillStyle"===o&&(s=r.parseStyle(s,t,e)),"strokeStyle"===o&&(s=r.parseStyle(s,t,e)),"lineDash"===o&&e.setLineDash?i.isArray(s)?e.setLineDash(s):i.isString(s)&&e.setLineDash(s.split(" ")):e[o]=s}},t}();t.exports=o},function(t,e,n){function i(t,e){var n=t.match(c);r.each(n,function(t){t=t.split(":"),e.addColorStop(t[0],t[1])})}var r=n(1),a=/[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi,o=/[^\s\,]+/gi,s=/^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i,l=/^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i,u=/^p\s*\(\s*([axyn])\s*\)\s*(.*)/i,c=/[\d.]+:(#[^\s]+|[^\)]+\))/gi;t.exports={parsePath:function(t){return t=t||[],r.isArray(t)?t:r.isString(t)?(t=t.match(a),r.each(t,function(e,n){if((e=e.match(o))[0].length>1){var i=e[0].charAt(0);e.splice(1,0,e[0].substr(1)),e[0]=i}r.each(e,function(t,n){isNaN(t)||(e[n]=+t)}),t[n]=e}),t):void 0},parseStyle:function(t,e,n){if(r.isString(t)){if("("===t[1]||"("===t[2]){if("l"===t[0])return function(t,e,n){var a,o,l=s.exec(t),u=r.mod(r.toRadian(parseFloat(l[1])),2*Math.PI),c=l[2],h=e.getBBox();u>=0&&u<.5*Math.PI?(a={x:h.minX,y:h.minY},o={x:h.maxX,y:h.maxY}):.5*Math.PI<=u&&u');return t.appendChild(n),this.type="svg",this.canvas=n,this.context=new o(n),this.toDraw=!1,this}var e=t.prototype;return e.draw=function(t){function e(){n.animateHandler=i.requestAnimationFrame(function(){n.animateHandler=void 0,n.toDraw&&e()});try{n._drawChildren(t)}catch(t){console.warn("error in draw canvas, detail as:"),console.warn(t),n.toDraw=!1}n.toDraw=!1}var n=this;n.animateHandler?n.toDraw=!0:e()},e.drawSync=function(t){this._drawChildren(t)},e._drawGroup=function(t,e){var n=t._cfg;n.removed||n.destroyed||(n.tobeRemoved&&(i.each(n.tobeRemoved,function(t){t.parentNode&&t.parentNode.removeChild(t)}),n.tobeRemoved=[]),this._drawShape(t,e),n.children&&n.children.length>0&&this._drawChildren(t))},e._drawChildren=function(t){var e,n=t._cfg.children;if(n)for(var i=0;is?1:0,f=Math.abs(l-s)>Math.PI?1:0,p=n.rs,g=n.re,d=e(s,n.rs,a),v=e(l,n.rs,a);n.rs>0?(o.push("M "+c.x+","+c.y),o.push("L "+v.x+","+v.y),o.push("A "+p+","+p+",0,"+f+","+(1===h?0:1)+","+d.x+","+d.y),o.push("L "+u.x+" "+u.y)):(o.push("M "+a.x+","+a.y),o.push("L "+u.x+","+u.y)),o.push("A "+g+","+g+",0,"+f+","+h+","+c.x+","+c.y),n.rs>0?o.push("L "+v.x+","+v.y):o.push("Z"),r.el.setAttribute("d",o.join(" "))},e._updateText=function(t){var e=t._attrs,n=t._cfg.attrs,i=t._cfg.el;this._setFont(t);for(var r in e)if(e[r]!==n[r]){if("text"===r){this._setText(t,""+e[r]);continue}if("fillStyle"===r||"strokeStyle"===r){this._setColor(t,r,e[r]);continue}if("matrix"===r){this._setTransform(t);continue}l[r]&&i.setAttribute(l[r],e[r])}t._cfg.attrs=Object.assign({},t._attrs),t._cfg.hasUpdate=!1},e._setFont=function(t){var e=t.get("el"),n=t._attrs,i=n.fontSize;e.setAttribute("alignment-baseline",u[n.textBaseline]||"baseline"),e.setAttribute("text-anchor",c[n.textAlign]||"left"),i&&+i<12&&(n.matrix=[1,0,0,0,1,0,0,0,1],t.transform([["t",-n.x,-n.y],["s",+i/12,+i/12],["t",n.x,n.y]]))},e._setText=function(t,e){var n=t._cfg.el,r=t._attrs.textBaseline||"bottom";if(e)if(~e.indexOf("\n")){var a=t._attrs.x,o=e.split("\n"),s=o.length-1,l="";i.each(o,function(t,e){0===e?"alphabetic"===r?l+=''+t+"":"top"===r?l+=''+t+"":"middle"===r?l+=''+t+"":"bottom"===r?l+=''+t+"":"hanging"===r&&(l+=''+t+""):l+=''+t+""}),n.innerHTML=l}else n.innerHTML=e;else n.innerHTML=""},e._setClip=function(t,e){var n=t._cfg.el;if(e)if(n.hasAttribute("clip-path"))e._cfg.hasUpdate&&this._updateShape(e);else{this._createDom(e),this._updateShape(e);var i=this.context.addClip(e);n.setAttribute("clip-path","url(#"+i+")")}else n.removeAttribute("clip-path")},e._setColor=function(t,e,n){var i=t._cfg.el,r=this.context;if(n)if(n=n.trim(),/^[r,R,L,l]{1}[\s]*\(/.test(n)){var a=r.find("gradient",n);a||(a=r.addGradient(n)),i.setAttribute(l[e],"url(#"+a+")")}else if(/^[p,P]{1}[\s]*\(/.test(n)){var o=r.find("pattern",n);o||(o=r.addPattern(n)),i.setAttribute(l[e],"url(#"+o+")")}else i.setAttribute(l[e],n);else i.setAttribute(l[e],"none")},e._setShadow=function(t){var e=t._cfg.el,n=t._attrs,i={dx:n.shadowOffsetX,dy:n.shadowOffsetY,blur:n.shadowBlur,color:n.shadowColor};if(i.dx||i.dy||i.blur||i.color){var r=this.context.find("filter",i);r||(r=this.context.addShadow(i,this)),e.setAttribute("filter","url(#"+r+")")}else e.removeAttribute("filter")},t}();t.exports=h},function(t,e,n){var i=n(1),r=n(222),a=n(223),o=n(224),s=n(225),l=n(226),u=function(){function t(t){var e=document.createElementNS("http://www.w3.org/2000/svg","defs"),n=i.uniqueId("defs_");e.id=n,t.appendChild(e),this.children=[],this.defaultArrow={},this.el=e,this.canvas=t}var e=t.prototype;return e.find=function(t,e){for(var n=this.children,i=null,r=0;r'}),n}var r=n(1),a=/^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i,o=/^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i,s=/[\d.]+:(#[^\s]+|[^\)]+\))/gi,l=function(){function t(t){var e=null,n=r.uniqueId("gradient_");return"l"===t.toLowerCase()[0]?function(t,e){var n,o,s=a.exec(t),l=r.mod(r.toRadian(parseFloat(s[1])),2*Math.PI),u=s[2];l>=0&&l<.5*Math.PI?(n={x:0,y:0},o={x:1,y:1}):.5*Math.PI<=l&&l';e.innerHTML=n},t}();t.exports=o},function(t,e,n){var i=n(1),r=function(){function t(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg","marker"),r=i.uniqueId("marker_");n.setAttribute("id",r);var a=document.createElementNS("http://www.w3.org/2000/svg","path");return a.setAttribute("stroke","none"),a.setAttribute("fill",t.stroke||"#000"),n.appendChild(a),n.setAttribute("overflow","visible"),n.setAttribute("orient","auto-start-reverse"),this.el=n,this.child=a,this.id=r,this.cfg=t["marker-start"===e?"startArrow":"endArrow"],this.stroke=t.stroke||"#000",!0===this.cfg?this._setDefaultPath(e,a):this._setMarker(t.lineWidth,a),this}var e=t.prototype;return e.match=function(){return!1},e._setDefaultPath=function(t,e){var n=this.el;e.setAttribute("d","M0,0 L6,3 L0,6 L3,3Z"),n.setAttribute("refX",3),n.setAttribute("refY",3)},e._setMarker=function(t,e){var n=this.el,r=this.cfg.path,a=this.cfg.d;i.isArray(r)&&(r=r.map(function(t){return t.join(" ")}).join("")),e.setAttribute("d",r),n.appendChild(e),a&&n.setAttribute("refX",a/t)},e.update=function(t){var e=this.child;e.attr?e.attr("fill",t):e.setAttribute("fill",t)},t}();t.exports=r},function(t,e,n){var i=n(1),r=function(){function t(t){this.type="clip";var e=document.createElementNS("http://www.w3.org/2000/svg","clipPath");this.el=e,this.id=i.uniqueId("clip_"),e.id=this.id;var n=t._cfg.el;return e.appendChild(n.cloneNode(!0)),this.cfg=t,this}var e=t.prototype;return e.match=function(){return!1},e.remove=function(){var t=this.el;t.parentNode.removeChild(t)},t}();t.exports=r},function(t,e,n){var i=n(1),r=/^p\s*\(\s*([axyn])\s*\)\s*(.*)/i,a=function(){function t(t){function e(){console.log(l.width,l.height),n.setAttribute("width",l.width),n.setAttribute("height",l.height)}var n=document.createElementNS("http://www.w3.org/2000/svg","pattern");n.setAttribute("patternUnits","userSpaceOnUse");var a=document.createElementNS("http://www.w3.org/2000/svg","image");n.appendChild(a);var o=i.uniqueId("pattern_");n.id=o,this.el=n,this.id=o,this.cfg=t;var s=r.exec(t)[2];a.setAttribute("href",s);var l=new Image;return s.match(/^data:/i)||(l.crossOrigin="Anonymous"),l.src=s,l.complete?e():(l.onload=e,l.src=l.src),this}return t.prototype.match=function(t,e){return this.cfg===e},t}();t.exports=a},function(t,e){var n={svg:"svg",circle:"circle",rect:"rect",text:"text",path:"path",foreignObject:"foreignObject",polygon:"polygon",ellipse:"ellipse",image:"image"};t.exports=function(t,e,i){var r=i.target||i.srcElement;if(!n[r.tagName]){for(var a=r.parentNode;a&&!n[a.tagName];)a=a.parentNode;r=a}return this._cfg.el===r?this:this.find(function(t){return t._cfg&&t._cfg.el===r})}},function(t,e,n){t.exports={addEventListener:n(229),createDom:n(94),getBoundingClientRect:n(230),getHeight:n(231),getOuterHeight:n(232),getOuterWidth:n(233),getRatio:n(234),getStyle:n(235),getWidth:n(236),modifyCSS:n(95),requestAnimationFrame:n(96)}},function(t,e){t.exports=function(t,e,n){if(t){if(t.addEventListener)return t.addEventListener(e,n,!1),{remove:function(){t.removeEventListener(e,n,!1)}};if(t.attachEvent)return t.attachEvent("on"+e,n),{remove:function(){t.detachEvent("on"+e,n)}}}}},function(t,e){t.exports=function(t,e){if(t&&t.getBoundingClientRect){var n=t.getBoundingClientRect(),i=document.documentElement.clientTop,r=document.documentElement.clientLeft;return{top:n.top-i,bottom:n.bottom-i,left:n.left-r,right:n.right-r}}return e||null}},function(t,e){t.exports=function(t,e){var n=this.getStyle(t,"height",e);return"auto"===n&&(n=t.offsetHeight),parseFloat(n)}},function(t,e){t.exports=function(t,e){var n=this.getHeight(t,e),i=parseFloat(this.getStyle(t,"borderTopWidth"))||0,r=parseFloat(this.getStyle(t,"paddingTop"))||0,a=parseFloat(this.getStyle(t,"paddingBottom"))||0;return n+i+(parseFloat(this.getStyle(t,"borderBottomWidth"))||0)+r+a}},function(t,e){t.exports=function(t,e){var n=this.getWidth(t,e),i=parseFloat(this.getStyle(t,"borderLeftWidth"))||0,r=parseFloat(this.getStyle(t,"paddingLeft"))||0,a=parseFloat(this.getStyle(t,"paddingRight"))||0;return n+i+(parseFloat(this.getStyle(t,"borderRightWidth"))||0)+r+a}},function(t,e){t.exports=function(){return window.devicePixelRatio?window.devicePixelRatio:2}},function(t,e,n){var i=n(5);t.exports=function(t,e,n){try{return window.getComputedStyle?window.getComputedStyle(t,null)[e]:t.currentStyle[e]}catch(t){return i(n)?null:n}}},function(t,e){t.exports=function(t,e){var n=this.getStyle(t,"width",e);return"auto"===n&&(n=t.offsetWidth),parseFloat(n)}},function(t,e,n){t.exports={contains:n(41),difference:n(238),find:n(239),firstValue:n(240),flatten:n(241),flattenDeep:n(242),getRange:n(243),merge:n(42),pull:n(90),pullAt:n(130),reduce:n(244),remove:n(245),sortBy:n(246),union:n(247),uniq:n(131),valuesOfKey:n(64)}},function(t,e,n){var i=n(63),r=n(41);t.exports=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return i(t,function(t){return!r(e,t)})}},function(t,e,n){var i=n(11),r=n(26),a=n(128);t.exports=function(t,e){var n=void 0;if(i(e)&&(n=e),r(e)&&(n=function(t){return a(t,e)}),n)for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:[];if(i(e))for(var r=0;re[i])return 1;if(t[i]1){var i=e[0].charAt(0);e.splice(1,0,e[0].substr(1)),e[0]=i}a(e,function(t,n){isNaN(t)||(e[n]=+t)}),t[n]=e}),t):void 0}},function(t,e,n){var i=n(4);t.exports=function(t){var e=0,n=0,r=0,a=0;return i(t)?1===t.length?e=n=r=a=t[0]:2===t.length?(e=r=t[0],n=a=t[1]):3===t.length?(e=t[0],n=a=t[1],r=t[2]):(e=t[0],n=t[1],r=t[2],a=t[3]):e=n=r=a=t,{r1:e,r2:n,r3:r,r4:a}}},function(t,e,n){var i=n(35);t.exports={clamp:n(50),fixedBase:n(256),isDecimal:n(257),isEven:n(258),isInteger:n(259),isNegative:n(260),isNumberEqual:i,isOdd:n(261),isPositive:n(262),maxBy:n(132),minBy:n(263),mod:n(93),snapEqual:i,toDegree:n(92),toInt:n(133),toInteger:n(133),toRadian:n(91)}},function(t,e){t.exports=function(t,e){var n=e.toString(),i=n.indexOf(".");if(-1===i)return Math.round(t);var r=n.substr(i+1).length;return r>20&&(r=20),parseFloat(t.toFixed(r))}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t%1!=0}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t%2==0}},function(t,e,n){var i=n(9),r=Number.isInteger?Number.isInteger:function(t){return i(t)&&t%1==0};t.exports=r},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t<0}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t%2!=0}},function(t,e,n){var i=n(9);t.exports=function(t){return i(t)&&t>0}},function(t,e,n){var i=n(4),r=n(11),a=n(2);t.exports=function(t,e){if(i(t)){var n=t[0],o=void 0;o=r(e)?e(t[0]):t[0][e];var s=void 0;return a(t,function(t){(s=r(e)?e(t):t[e])1?1:u<0?0:u)/2,h=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],f=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],p=0,g=0;g<12;g++){var d=c*h[g]+c,v=o(d,t,n,r,s),y=o(d,e,i,a,l),x=v*v+y*y;p+=f[g]*Math.sqrt(x)}return c*p},l=function(t,e,n,i,r,a,o,s){if(!(Math.max(t,n)Math.max(r,o)||Math.max(e,i)Math.max(a,s))){var l=(t-n)*(a-s)-(e-i)*(r-o);if(l){var u=((t*i-e*n)*(r-o)-(t-n)*(r*s-a*o))/l,c=((t*i-e*n)*(a-s)-(e-i)*(r*s-a*o))/l,h=+u.toFixed(2),f=+c.toFixed(2);if(!(h<+Math.min(t,n).toFixed(2)||h>+Math.max(t,n).toFixed(2)||h<+Math.min(r,o).toFixed(2)||h>+Math.max(r,o).toFixed(2)||f<+Math.min(e,i).toFixed(2)||f>+Math.max(e,i).toFixed(2)||f<+Math.min(a,s).toFixed(2)||f>+Math.max(a,s).toFixed(2)))return{x:u,y:c}}}},u=function(t,e,n){return e>=t.x&&e<=t.x+t.width&&n>=t.y&&n<=t.y+t.height},c=function(t,e,n,i){return null===t&&(t=e=n=i=0),null===e&&(e=t.y,n=t.width,i=t.height,t=t.x),{x:t,y:e,width:n,w:n,height:i,h:i,x2:t+n,y2:e+i,cx:t+n/2,cy:e+i/2,r1:Math.min(n,i)/2,r2:Math.max(n,i)/2,r0:Math.sqrt(n*n+i*i)/2,path:r(t,e,n,i),vb:[t,e,n,i].join(" ")}},h=function(t,e,n,r,a,o,s,l){i(t)||(t=[t,e,n,r,a,o,s,l]);var u=function(t,e,n,i,r,a,o,s){for(var l=[],u=[[],[]],c=void 0,h=void 0,f=void 0,p=void 0,g=0;g<2;++g)if(0===g?(h=6*t-12*n+6*r,c=-3*t+9*n-9*r+3*o,f=3*n-3*t):(h=6*e-12*i+6*a,c=-3*e+9*i-9*a+3*s,f=3*i-3*e),Math.abs(c)<1e-12){if(Math.abs(h)<1e-12)continue;(p=-f/h)>0&&p<1&&l.push(p)}else{var d=h*h-4*f*c,v=Math.sqrt(d);if(!(d<0)){var y=(-h+v)/(2*c);y>0&&y<1&&l.push(y);var x=(-h-v)/(2*c);x>0&&x<1&&l.push(x)}}for(var m=l.length,_=m,b=void 0;m--;)b=1-(p=l[m]),u[0][m]=b*b*b*t+3*b*b*p*n+3*b*p*p*r+p*p*p*o,u[1][m]=b*b*b*e+3*b*b*p*i+3*b*p*p*a+p*p*p*s;return u[0][_]=t,u[1][_]=e,u[0][_+1]=o,u[1][_+1]=s,u[0].length=u[1].length=_+2,{min:{x:Math.min.apply(0,u[0]),y:Math.min.apply(0,u[1])},max:{x:Math.max.apply(0,u[0]),y:Math.max.apply(0,u[1])}}}.apply(null,t);return c(u.min.x,u.min.y,u.max.x-u.min.x,u.max.y-u.min.y)},f=function(t,e,n,i,r,a,o,s,l){var u=1-l,c=Math.pow(u,3),h=Math.pow(u,2),f=l*l,p=f*l,g=t+2*l*(n-t)+f*(r-2*n+t),d=e+2*l*(i-e)+f*(a-2*i+e),v=n+2*l*(r-n)+f*(o-2*r+n),y=i+2*l*(a-i)+f*(s-2*a+i);return{x:c*t+3*h*l*n+3*u*l*l*r+p*o,y:c*e+3*h*l*i+3*u*l*l*a+p*s,m:{x:g,y:d},n:{x:v,y:y},start:{x:u*t+l*n,y:u*e+l*i},end:{x:u*r+l*o,y:u*a+l*s},alpha:90-180*Math.atan2(g-v,d-y)/Math.PI}},p=function(t,e,n){if(!function(t,e){return t=c(t),e=c(e),u(e,t.x,t.y)||u(e,t.x2,t.y)||u(e,t.x,t.y2)||u(e,t.x2,t.y2)||u(t,e.x,e.y)||u(t,e.x2,e.y)||u(t,e.x,e.y2)||u(t,e.x2,e.y2)||(t.xe.x||e.xt.x)&&(t.ye.y||e.yt.y)}(h(t),h(e)))return n?0:[];for(var i=~~(s.apply(0,t)/8),r=~~(s.apply(0,e)/8),a=[],o=[],p={},g=n?0:[],d=0;d=0&&P<=1&&T>=0&&T<=1&&(n?g++:g.push({x:k.x,y:k.y,t1:P,t2:T}))}}return g};t.exports=function(t,e){return function(t,e,n){t=a(t),e=a(e);for(var i=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,c=void 0,h=void 0,f=void 0,g=void 0,d=n?0:[],v=0,y=t.length;v=3&&(3===t.length&&e.push("Q"),e=e.concat(t[1])),2===t.length&&e.push("L"),e=e.concat(t[t.length-1])})}(t,e,i));else{var a=[].concat(t);"M"===a[0]&&(a[0]="L");for(var o=0;o<=i-1;o++)r.push(a)}return r}t.exports=function(t,e){if(1===t.length)return t;var n=t.length-1,r=e.length-1,a=n/r,o=[];if(1===t.length&&"M"===t[0][0]){for(var s=0;s=0;p--)l=s[p].index,"add"===s[p].type?t.splice(l,0,[].concat(t[l])):t.splice(l,1)}if((a=t.length)0)){t[a]=e[a];break}r=i(r,t[a-1],1)}t[a]=["Q"].concat(r.reduce(function(t,e){return t.concat(e)},[]));break;case"T":t[a]=["T"].concat(r[0]);break;case"C":if(r.length<3){if(!(a>0)){t[a]=e[a];break}r=i(r,t[a-1],2)}t[a]=["C"].concat(r.reduce(function(t,e){return t.concat(e)},[]));break;case"S":if(r.length<2){if(!(a>0)){t[a]=e[a];break}r=i(r,t[a-1],1)}t[a]=["S"].concat(r.reduce(function(t,e){return t.concat(e)},[]));break;default:t[a]=e[a]}return t}},function(t,e,n){var i={lc:n(275),lowerCase:n(142),lowerFirst:n(75),substitute:n(276),uc:n(277),upperCase:n(143),upperFirst:n(87)};t.exports=i},function(t,e,n){t.exports=n(142)},function(t,e){t.exports=function(t,e){return t&&e?t.replace(/\\?\{([^{}]+)\}/g,function(t,n){return"\\"===t.charAt(0)?t.slice(1):void 0===e[n]?"":e[n]}):t}},function(t,e,n){t.exports=n(143)},function(t,e,n){var i=n(12),r={getType:n(84),isArray:n(4),isArrayLike:n(13),isBoolean:n(82),isFunction:n(11),isNil:n(5),isNull:n(279),isNumber:n(9),isObject:n(24),isObjectLike:n(48),isPlainObject:n(26),isPrototype:n(85),isType:i,isUndefined:n(280),isString:n(10),isRegExp:n(281),isDate:n(80),isArguments:n(282),isError:n(283)};t.exports=r},function(t,e){t.exports=function(t){return null===t}},function(t,e){t.exports=function(t){return void 0===t}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"RegExp")}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Arguments")}},function(t,e,n){var i=n(12);t.exports=function(t){return i(t,"Error")}},function(t,e){t.exports=function(t,e,n){var i=void 0;return function(){var r=this,a=arguments,o=n&&!i;clearTimeout(i),i=setTimeout(function(){i=null,n||t.apply(r,a)},e),o&&t.apply(r,a)}}},function(t,e,n){var i=n(13);t.exports=function(t,e){if(!i(t))return-1;var n=Array.prototype.indexOf;if(n)return n.call(t,e);for(var r=-1,a=0;ae?(i&&(clearTimeout(i),i=null),s=u,o=t.apply(r,a),i||(r=a=null)):i||!1===n.trailing||(i=setTimeout(l,c)),o};return u.cancel=function(){clearTimeout(i),s=0,i=r=a=null},u}},function(t,e,n){function i(t,e){var n,i,r=function(t){if(f.isEmpty(t))return null;var e=t[0].x,n=t[0].x,i=t[0].y,r=t[0].y;return f.each(t,function(t){e=e>t.x?t.x:e,n=nt.y?t.y:i,r=r0?o.maxX:o.minX,l,1];t.apply(u),t.attr({transform:[["t",-n,-l],["s",.01,1],["t",n,l]]});var c={transform:[["t",-n,-l],["s",100,1],["t",n,l]]},h=r(e,a,i);t.animate(c,h.duration,h.easing,h.callback,h.delay)}function s(t,e,n){var i,a,o=t._id,s=t.get("index");if(n.isPolar&&"point"!==t.name)i=n.getCenter().x,a=n.getCenter().y;else{var l=t.getBBox();i=(l.minX+l.maxX)/2,a=(l.minY+l.maxY)/2}var u=[i,a,1];t.apply(u),t.attr({transform:[["t",-i,-a],["s",.01,.01],["t",i,a]]});var c={transform:[["t",-i,-a],["s",100,100],["t",i,a]]},h=r(e,s,o);t.animate(c,h.duration,h.easing,h.callback,h.delay)}function l(t,e){if("path"===t.get("type")){var n=t._id,i=t.get("index"),a=g.pathToAbsolute(t.attr("path"));t.attr("path",[a[0]]);var o={path:a},s=r(e,i,n);t.animate(o,s.duration,s.easing,s.callback,s.delay)}}function u(t,e,n,i,a){var o,s=function(t){var e,n,i,r,a,o=t.start,s=t.end,l=t.getWidth(),u=t.getHeight();return t.isPolar?(r=t.getRadius(),i=t.getCenter(),e=t.startAngle,n=t.endAngle,(a=new p.Fan({attrs:{x:i.x,y:i.y,rs:0,re:r+200,startAngle:e,endAngle:e}})).endState={endAngle:n}):(a=new p.Rect({attrs:{x:o.x-200,y:s.y-200,width:t.isTransposed?l+400:0,height:t.isTransposed?0:u+400}}),t.isTransposed?a.endState={height:u+400}:a.endState={width:l+400}),a.isClip=!0,a}(n),l=t.get("canvas"),u=t._id,c=t.get("index");i?(s.attr("startAngle",i),s.attr("endAngle",i),o={endAngle:a}):o=s.endState,s.set("canvas",l),t.attr("clip",s),t.setSilent("animating",!0);var h=r(e,c,u);s.animate(o,h.duration,h.easing,function(){t&&!t.get("destroyed")&&(t.attr("clip",null),t.setSilent("cacheShape",null),t.setSilent("animating",!1),s.remove())},h.delay)}function c(t,e){var n=t._id,i=t.get("index"),a=f.isNil(t.attr("fillOpacity"))?1:t.attr("fillOpacity"),o=f.isNil(t.attr("strokeOpacity"))?1:t.attr("strokeOpacity");t.attr("fillOpacity",0),t.attr("strokeOpacity",0);var s={fillOpacity:a,strokeOpacity:o},l=r(e,i,n);t.animate(s,l.duration,l.easing,l.callback,l.delay)}function h(t,e,n){var r=i(t,n),a=r.endAngle;u(t,e,n,r.startAngle,a)}var f=n(0),p=n(16),g=f.PathUtil;t.exports={enter:{clipIn:u,zoomIn:s,pathIn:l,scaleInY:a,scaleInX:o,fanIn:h,fadeIn:c},leave:{lineWidthOut:function(t,e){var n={lineWidth:0,opacity:0},i=t._id,a=r(e,t.get("index"),i);t.animate(n,a.duration,a.easing,function(){t.remove()},a.delay)},zoomOut:function(t,e,n){var i,a,o=t._id,s=t.get("index");if(n.isPolar&&"point"!==t.name)i=n.getCenter().x,a=n.getCenter().y;else{var l=t.getBBox();i=(l.minX+l.maxX)/2,a=(l.minY+l.maxY)/2}var u=[i,a,1];t.apply(u);var c={transform:[["t",-i,-a],["s",.01,.01],["t",i,a]]},h=r(e,s,o);t.animate(c,h.duration,h.easing,function(){t.remove()},h.delay)},pathOut:function(t,e){if("path"===t.get("type")){var n=t._id,i=t.get("index"),a={path:[g.pathToAbsolute(t.attr("path"))[0]]},o=r(e,i,n);t.animate(a,o.duration,o.easing,function(){t.remove()},o.delay)}},fadeOut:function(t,e){var n=t._id,i={fillOpacity:0,strokeOpacity:0},a=r(e,t.get("index"),n);t.animate(i,a.duration,a.easing,function(){t.remove()},a.delay)}},appear:{clipIn:u,zoomIn:s,pathIn:l,scaleInY:a,scaleInX:o,fanIn:h,fadeIn:c},update:{fadeIn:c,fanIn:h}}},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t,e,n){var i=(t-e)/(n-e);return i>=0&&i<=1}function a(t,e){var n=!1;if(t){if("theta"===t.type){var i=t.start,a=t.end;n=r(e.x,i.x,a.x)&&r(e.y,i.y,a.y)}else{var o=t.invert(e);n=o.x>=0&&o.y>=0&&o.x<=1&&o.y<=1}}return n}var o=n(148),s=n(20),l=n(0),u=n(165),c=n(7),h=n(151),f=n(355),p={};l.each(s,function(t,e){var n=l.lowerFirst(e);p[n]=function(e){var n=new t(e);return this.addGeom(n),n}});var g=function(t){function e(e){var n,r=i(i(n=t.call(this,e)||this));return r._setTheme(),l.each(s,function(t,e){var n=l.lowerFirst(e);r[n]=function(e){void 0===e&&(e={}),e.viewTheme=r.get("viewTheme");var n=new t(e);return r.addGeom(n),n}}),r.init(),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{viewContainer:null,coord:null,start:{x:0,y:0},end:{x:1,y:1},geoms:[],scales:{},options:{},scaleController:null,padding:0,theme:null,parent:null,tooltipEnable:!0,animate:c.animate,visible:!0}},n._setTheme=function(){var t=this.get("theme"),e={},n={};l.isObject(t)?n=t:-1!==l.indexOf(Object.keys(h),t)&&(n=h[t]),l.deepMix(e,c,n),this.set("viewTheme",e)},n.init=function(){this._initViewPlot(),this.get("data")&&this._initData(this.get("data")),this._initOptions(),this._initControllers(),this._bindEvents()},n._initOptions=function(){var t=this,e=l.mix({},t.get("options"));e.scales||(e.scales={}),e.coord||(e.coord={}),!1===e.animate&&this.set("animate",!1),(!1===e.tooltip||l.isNull(e.tooltip))&&this.set("tooltipEnable",!1),e.geoms&&e.geoms.length&&l.each(e.geoms,function(e){t._createGeom(e)});var n=t.get("scaleController");n&&(n.defs=e.scales);var i=t.get("coordController");i&&i.reset(e.coord),this.set("options",e)},n._createGeom=function(t){var e,n=t.type;this[n]&&(e=this[n](),l.each(t,function(t,n){if(e[n])if(l.isObject(t)&&t.field)if("label"===t)e[n](t.field,t.callback,t.cfg);else{var i;l.each(t,function(t,e){"field"!==e&&(i=t)}),e[n](t.field,i)}else e[n](t)}))},n._initControllers=function(){var t=this.get("options"),e=this.get("viewTheme"),n=this.get("canvas"),i=new u.Scale({viewTheme:e,defs:t.scales}),r=new u.Coord(t.coord);this.set("scaleController",i),this.set("coordController",r);var a=new u.Axis({canvas:n,viewTheme:e});this.set("axisController",a);var o=new u.Guide({viewTheme:e,options:t.guides||[]});this.set("guideController",o)},n._initViewPlot=function(){this.get("viewContainer")||this.set("viewContainer",this.get("middlePlot"))},n._initGeoms=function(){for(var t=this.get("geoms"),e=this.get("filteredData"),n=this.get("coord"),i=this.get("_id"),r=0;r0;){t.shift().destroy()}},n._drawGeoms=function(){this.emit("beforedrawgeoms");for(var t=this.get("geoms"),e=this.get("coord"),n=0;n0?r.change({min:0}):s<=0&&r.change({max:0}))}}},n._setCatScalesRange=function(){var t=this.get("coord"),e=this.get("viewTheme"),n=this.getXScale(),i=this.getYScales(),r=[];n&&r.push(n),r=r.concat(i);var a=t.isPolar&&function(t){var e=t.startAngle,n=t.endAngle;return!(!l.isNil(e)&&!l.isNil(n)&&n-e<2*Math.PI)}(t),o=this.get("scaleController").defs;l.each(r,function(n){if((n.isCategory||n.isIdentity)&&n.values&&(!o[n.field]||!o[n.field].range)){var i,r=n.values.length;if(1===r)i=[.5,1];else{var s=0;i=a?t.isTransposed?[(s=1/r*e.widthRatio.multiplePie)/2,1-s/2]:[0,1-1/r]:[s=1/r*1/2,1-s]}n.range=i}})},n.getXScale=function(){var t=this.get("geoms"),e=null;return l.isEmpty(t)||(e=t[0].getXScale()),e},n.getYScales=function(){for(var t=this.get("geoms"),e=[],n=0;n=0?"positive":"negative";o[d][g]||(o[d][g]=0),h[n]=[o[d][g],p+o[d][g]],o[d][g]+=p}}},e}(a);a.Stack=o,t.exports=o},function(t,e,n){var i={merge:n(42),values:n(64)},r=n(144),a=n(2);t.exports={processAdjust:function(t){var e=i.merge(t),n=this.dodgeBy,a=t;n&&(a=r(e,n)),this.cacheMap={},this.adjDataArray=a,this.mergeData=e,this.adjustData(a,e),this.adjDataArray=null,this.mergeData=null},getDistribution:function(t){var e=this.adjDataArray,n=this.cacheMap,r=n[t];return r||(r={},a(e,function(e,n){var o=i.values(e,t);o.length||o.push(0),a(o,function(t){r[t]||(r[t]=[]),r[t].push(n)})}),n[t]=r),r},adjustDim:function(t,e,n,i,r){var o=this,s=o.getDistribution(t),l=o.groupData(n,t);a(l,function(n,i){i=parseFloat(i);var l;l=1===e.length?{pre:e[0]-1,next:e[0]+1}:o.getAdjustRange(t,i,e),a(n,function(e){var n=e[t],i=s[n],a=i.indexOf(r);e[t]=o.getDodgeOffset(l,a,i.length)})})}}},function(t,e){t.exports={_initDefaultCfg:function(){this.xField=null,this.yField=null,this.height=null,this.size=10,this.reverseOrder=!1,this.adjustNames=["y"]},processOneDimStack:function(t){var e=this.xField,n=this.yField||"y",i=this.height,r={};this.reverseOrder&&(t=t.slice(0).reverse());for(var a=0,o=t.length;ai.width||n.height>i.height?r.push(t[a]):n.width*n.height>i.width*i.height&&r.push(t[a]);for(var o=0;o0?e="left":t[0]<0&&(e="right"),e},n.getLinePath=function(){var t=this.get("center"),e=t.x,n=t.y,i=this.get("radius"),r=i,a=this.get("startAngle"),o=this.get("endAngle"),s=this.get("inner"),l=[];if(Math.abs(o-a)===2*Math.PI)l=[["M",e,n],["m",0,-r],["a",i,r,0,1,1,0,2*r],["a",i,r,0,1,1,0,-2*r],["z"]];else{var u=this._getCirclePoint(a),c=this._getCirclePoint(o),h=Math.abs(o-a)>Math.PI?1:0,f=a>o?0:1;if(s){var p=this.getSideVector(s*i,u),g=this.getSideVector(s*i,c),d={x:p[0]+e,y:p[1]+n},v={x:g[0]+e,y:g[1]+n};l=[["M",d.x,d.y],["L",u.x,u.y],["A",i,r,0,h,f,c.x,c.y],["L",v.x,v.y],["A",i*s,r*s,0,h,Math.abs(f-1),d.x,d.y]]}else l=[["M",e,n],["L",u.x,u.y],["A",i,r,0,h,f,c.x,c.y],["L",e,n]]}return l},n.addLabel=function(e,n,i){var r=this.get("label").offset||this.get("_labelOffset")||.001;n=this.getSidePoint(n,r),t.prototype.addLabel.call(this,e,n,i)},n.autoRotateLabels=function(){var t=this.get("ticks"),e=this.get("labelRenderer");if(e&&t.length>12){var n=this.get("radius"),r=this.get("startAngle"),a=this.get("endAngle")-r,o=a/(t.length-1),s=Math.sin(o/2)*n*2,l=this.getMaxLabelWidth(e);i.each(e.get("group").get("children"),function(e,n){var i=t[n].value*a+r,o=i%(2*Math.PI);lMath.PI&&(i-=Math.PI),i-=Math.PI/2,e.attr("textAlign","center")):o>Math.PI/2?i-=Math.PI:oo.x)&&(u=!0);var c=a.vertical([],l,u);return a.scale([],c,t*n)},n.getAxisVector=function(){var t=this.get("start"),e=this.get("end");return[e.x-t.x,e.y-t.y]},n.getLinePath=function(){var t=this.get("start"),e=this.get("end"),n=[];return n.push(["M",t.x,t.y]),n.push(["L",e.x,e.y]),n},n.getTickEnd=function(t,e){var n=this.getSideVector(e);return{x:t.x+n[0],y:t.y+n[1]}},n.getTickPoint=function(t){var e=this.get("start"),n=this.get("end"),i=n.x-e.x,r=n.y-e.y;return{x:e.x+i*t,y:e.y+r*t}},n.renderTitle=function(){var t=this.get("title"),e=this.getTickPoint(.5),n=t.offset;if(r.isNil(n)){n=20;var i=this.get("labelsGroup");if(i){n+=this.getMaxLabelWidth(i)+(this.get("label").offset||this.get("_labelOffset"))}}var o=t.textStyle,s=r.mix({},o);if(t.text){var l=this.getAxisVector();if(t.autoRotate&&r.isNil(o.rotate)){var u=0;if(!r.snapEqual(l[1],0)){var c=[l[0],l[1]];u=a.angleTo(c,[1,0],!0)}s.rotate=u*(180/Math.PI)}else r.isNil(o.rotate)||(s.rotate=o.rotate/180*Math.PI);var h,f=this.getSideVector(n),p=t.position;h="start"===p?{x:this.get("start").x+f[0],y:this.get("start").y+f[1]}:"end"===p?{x:this.get("end").x+f[0],y:this.get("end").y+f[1]}:{x:e.x+f[0],y:e.y+f[1]},s.x=h.x,s.y=h.y,s.text=t.text;var g=this.get("group").addShape("Text",{zIndex:2,attrs:s});g.name="axis-title",this.get("appendInfo")&&g.setSilent("appendInfo",this.get("appendInfo"))}},n.autoRotateLabels=function(){var t=this.get("labelRenderer"),e=this.get("title");if(t){var n=t.get("group").get("children"),i=this.get("label").offset,a=e?e.offset:48;if(a<0)return;var o,s,l=this.getAxisVector();if(r.snapEqual(l[0],0)&&e&&e.text)(s=this.getMaxLabelWidth(t))>a-i-12&&(o=-1*Math.acos((a-i-12)/s));else if(r.snapEqual(l[1],0)&&n.length>1){var u=Math.abs(this._getAvgLabelLength(t));(s=this.getMaxLabelWidth(t))>u&&(o=Math.asin(1.25*(a-i-12)/s))}if(o){var c=this.get("factor");r.each(n,function(t){t.rotateAtStart(o),r.snapEqual(l[1],0)&&(c>0?t.attr("textAlign","left"):t.attr("textAlign","right"))})}}},n.autoHideLabels=function(){var t,e,n=this.get("labelRenderer");if(n){var i=n.get("group").get("children"),a=this.getAxisVector();if(i.length<2)return;if(r.snapEqual(a[0],0)){var o=this.getMaxLabelHeight(n)+8,s=Math.abs(this._getAvgLabelHeightSpace(n));o>s&&(t=o,e=s)}else if(r.snapEqual(a[1],0)&&i.length>1){var l=this.getMaxLabelWidth(n)+8,u=Math.abs(this._getAvgLabelLength(n));l>u&&(t=l,e=u)}if(t&&e){var c=Math.ceil(t/e);r.each(i,function(t,e){e%c!=0&&t.attr("text","")})}}},e}(i);t.exports=o},function(t,e,n){var i=n(3),r=n(31),a=i.MatrixUtil,o=i.PathUtil,s=a.vec2,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"polyline"})},n.getLinePath=function(){var t=this.get("tickPoints"),e=this.get("start"),n=this.get("end"),r=[];r.push(e.x),r.push(e.y),i.each(t,function(t){r.push(t.x),r.push(t.y)}),r.push(n.x),r.push(n.y);var a=o.catmullRomToBezier(r);return a.unshift(["M",e.x,e.y]),a},n.getTickPoint=function(t,e){return this.get("tickPoints")[e]},n.getTickEnd=function(t,e,n){var i=this.get("tickLine"),r=e||i.length,a=this.getSideVector(r,t,n);return{x:t.x+a[0],y:t.y+a[1]}},n.getSideVector=function(t,e,n){var i;if(0===n){if((i=this.get("start")).x===e.x&&i.y===e.y)return[0,0]}else{i=this.get("tickPoints")[n-1]}var r=[e.x-i.x,e.y-i.y],a=s.normalize([],r),o=s.vertical([],a,!1);return s.scale([],o,t)},e}(r);t.exports=l},function(t,e,n){t.exports={Guide:n(15),Arc:n(315),DataMarker:n(316),DataRegion:n(317),Html:n(318),Image:n(319),Line:n(320),Region:n(321),Text:n(322)}},function(t,e,n){function i(t,e){var n,i=t.x-e.x,r=t.y-e.y;return 0===r?n=i<0?o/2:270*o/180:i>=0&&r>0?n=2*o-s(i/r):i<=0&&r<0?n=o-s(i/r):i>0&&r<0?n=o+s(-i/r):i<0&&r>0&&(n=s(i/-r)),n}var r=n(3),a=n(15),o=Math.PI,s=Math.atan,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{name:"arc",start:null,end:null,style:{stroke:"#999",lineWidth:1}})},n.render=function(t,e){var n,a=this.parsePoint(t,this.get("start")),s=this.parsePoint(t,this.get("end")),l=t.getCenter(),u=Math.sqrt((a.x-l.x)*(a.x-l.x)+(a.y-l.y)*(a.y-l.y)),c=i(a,l),h=i(s,l);if(ho?1:0;n=[["M",a.x,a.y],["A",u,u,0,f,1,s.x,s.y]]}var p=e.addShape("path",{zIndex:this.get("zIndex"),attrs:r.mix({path:n},this.get("style"))});p.name="guide-arc",this.get("appendInfo")&&p.setSilent("appendInfo",this.get("appendInfo")),this.set("el",p)},e}(a);t.exports=l},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"dataMarker",zIndex:1,top:!0,position:null,style:{point:{r:3,fill:"#FFFFFF",stroke:"#1890FF",lineWidth:2},line:{stroke:"#A3B1BF",lineWidth:1},text:{fill:"#000000",opacity:.65,fontSize:12,textAlign:"start"}},display:{point:!0,line:!0,text:!0},lineLength:20,direction:"upward",autoAdjust:!0})},n.render=function(t,e){var n=this.parsePoint(t,this.get("position")),i=e.addGroup();i.name="guide-data-marker";var r,a,o=this._getElementPosition(n),s=this.get("display");if(s.line){var l=o.line;r=this._drawLine(l,i)}if(s.text&&this.get("content")){var u=o.text;a=this._drawText(u,i)}if(s.point){var c=o.point;this._drawPoint(c,i)}if(this.get("autoAdjust")){var h=i.getBBox(),f=h.minX,p=h.minY,g=h.maxX,d=h.maxY,v=t.start,y=t.end;if(a){f<=v.x&&a.attr("textAlign","start"),g>=y.x&&a.attr("textAlign","end");var x=this.get("direction");if("upward"===x&&p<=y.y||"upward"!==x&&d>=v.y){var m,_;"upward"===x&&p<=y.y?(m="top",_=1):(m="bottom",_=-1),a.attr("textBaseline",m);var b=0;if(this.get("display").line){b=this.get("lineLength");var w=[["M",n.x,n.y],["L",n.x,n.y+b*_]];r.attr("path",w)}var S=n.y+(b+2)*_;a.attr("y",S)}}}this.get("appendInfo")&&i.setSilent("appendInfo",this.get("appendInfo")),this.set("el",i)},n._getElementPosition=function(t){var e=t.x,n=t.y,i=this.get("display").line?this.get("lineLength"):0,r=this.get("direction");this.get("style").text.textBaseline="upward"===r?"bottom":"top";var a="upward"===r?-1:1;return{point:{x:e,y:n},line:[{x:e,y:n},{x:e,y:i*a+n}],text:{x:e,y:(i+2)*a+n}}},n._drawLine=function(t,e){var n=this.get("style").line,r=[["M",t[0].x,t[0].y],["L",t[1].x,t[1].y]];return e.addShape("path",{attrs:i.mix({path:r},n)})},n._drawText=function(t,e){var n=this.get("style").text;return e.addShape("text",{attrs:i.mix({text:this.get("content")},n,t)})},n._drawPoint=function(t,e){var n=this.get("style").point;return e.addShape("circle",{attrs:i.mix({},n,t)})},e}(n(15));t.exports=r},function(t,e,n){var i=n(3),r=n(156),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"dataRegion",start:null,end:null,content:"",style:{region:{lineWidth:0,fill:"#000000",opacity:.04},text:{textAlign:"center",textBaseline:"bottom",fontSize:12,fill:"rgba(0, 0, 0, .65)"}}})},n.render=function(t,e,n){var r=this.get("lineLength")||0,a=this._getRegionData(t,n);if(a.length){var o=this._getBBox(a),s=[];s.push(["M",a[0].x,o.yMin-r]);for(var l=0,u=a.length;l=n&&h.push(this.parsePoint(t,[g[s],g[l]])),g[s]===c)break}return h},n._getBBox=function(t){for(var e=[],n=[],r=0;r');a.appendChild(o);var s=this.get("htmlContent")||this.get("html");if(i.isFunction(s)){s=s(this.get("xScales"),this.get("yScales"))}var l=r.createDom(s);o.appendChild(l),r.modifyCSS(o,{position:"absolute"}),this._setDomPosition(o,l,n),this.set("el",o)},n._setDomPosition=function(t,e,n){var i=this.get("alignX"),a=this.get("alignY"),o=r.getOuterWidth(e),s=r.getOuterHeight(e),l={x:n.x,y:n.y};"middle"===i&&"top"===a?l.x-=Math.round(o/2):"middle"===i&&"bottom"===a?(l.x-=Math.round(o/2),l.y-=Math.round(s)):"left"===i&&"bottom"===a?l.y-=Math.round(s):"left"===i&&"middle"===a?l.y-=Math.round(s/2):"left"===i&&"top"===a?(l.x=n.x,l.y=n.y):"right"===i&&"bottom"===a?(l.x-=Math.round(o),l.y-=Math.round(s)):"right"===i&&"middle"===a?(l.x-=Math.round(o),l.y-=Math.round(s/2)):"right"===i&&"top"===a?l.x-=Math.round(o):(l.x-=Math.round(o/2),l.y-=Math.round(s/2));var u=this.get("offsetX");u&&(l.x+=u);var c=this.get("offsetY");c&&(l.y+=c),r.modifyCSS(t,{top:Math.round(l.y)+"px",left:Math.round(l.x)+"px",visibility:"visible",zIndex:this.get("zIndex")})},n.clear=function(){var t=this.get("el");t&&t.parentNode&&t.parentNode.removeChild(t)},e}(n(15));t.exports=a},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"image",start:null,end:null,src:null,offsetX:null,offsetY:null})},n.render=function(t,e){var n=this.parsePoint(t,this.get("start")),i={x:n.x,y:n.y};if(i.img=this.get("src"),this.get("end")){var r=this.parsePoint(t,this.get("end"));i.width=r.x-n.x,i.height=r.y-n.y}else i.width=this.get("width")||32,i.height=this.get("height")||32;this.get("offsetX")&&(i.x+=this.get("offsetX")),this.get("offsetY")&&(i.y+=this.get("offsetY"));var a=e.addShape("Image",{zIndex:1,attrs:i});a.name="guide-image",this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo")),this.set("el",a)},e}(n(15));t.exports=r},function(t,e,n){var i=n(3),r=n(15),a=i.MatrixUtil.vec2,o=n(14).FONT_FAMILY,s=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"line",start:null,end:null,lineStyle:{stroke:"#000",lineWidth:1},text:{position:"end",autoRotate:!0,style:{fill:"#999",fontSize:12,fontWeight:500,fontFamily:o},content:null}})},n.render=function(t,e){var n=this.parsePoint(t,this.get("start")),i=this.parsePoint(t,this.get("end")),r=e.addGroup({viewId:e.get("viewId")});this._drawLines(n,i,r);var a=this.get("text");a&&a.content&&this._drawText(n,i,r),this.set("el",r)},n._drawLines=function(t,e,n){var r=[["M",t.x,t.y],["L",e.x,e.y]],a=n.addShape("Path",{attrs:i.mix({path:r},this.get("lineStyle"))});a.name="guide-line",this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo"))},n._drawText=function(t,e,n){var r,o=this.get("text"),s=o.position,l=o.style||{};((r="start"===s?0:"center"===s?.5:i.isString(s)&&-1!==s.indexOf("%")?parseInt(s,10)/100:i.isNumber(s)?s:1)>1||r<0)&&(r=1);var u={x:t.x+(e.x-t.x)*r,y:t.y+(e.y-t.y)*r};if(o.offsetX&&(u.x+=o.offsetX),o.offsetY&&(u.y+=o.offsetY),u.text=o.content,u=i.mix({},u,l),o.autoRotate&&i.isNil(l.rotate)){var c=a.angleTo([e.x-t.x,e.y-t.y],[1,0],1);u.rotate=c}else i.isNil(l.rotate)||(u.rotate=l.rotate*Math.PI/180);var h=n.addShape("Text",{attrs:u});h.name="guide-line-text",this.get("appendInfo")&&h.setSilent("appendInfo",this.get("appendInfo"))},e}(r);t.exports=s},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"region",zIndex:1,start:null,end:null,style:{lineWidth:0,fill:"#CCD7EB",opacity:.4}})},n.render=function(t,e){var n=this.get("style"),r=this._getPath(t),a=e.addShape("path",{zIndex:this.get("zIndex"),attrs:i.mix({path:r},n)});a.name="guide-region",this.get("appendInfo")&&a.setSilent("appendInfo",this.get("appendInfo")),this.set("el",a)},n._getPath=function(t){var e=this.parsePoint(t,this.get("start")),n=this.parsePoint(t,this.get("end"));return[["M",e.x,e.y],["L",n.x,e.y],["L",n.x,n.y],["L",e.x,n.y],["z"]]},e}(n(15));t.exports=r},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"text",position:null,content:null,style:{fill:"#999",fontSize:12,fontWeight:500,textAlign:"center"},offsetX:null,offsetY:null,top:!0})},n.render=function(t,e){var n=this.parsePoint(t,this.get("position")),r=i.mix({},this.get("style")),a=this.get("offsetX"),o=this.get("offsetY");a&&(n.x+=a),o&&(n.y+=o),r.rotate&&(r.rotate=r.rotate*Math.PI/180);var s=e.addShape("Text",{zIndex:this.get("zIndex"),attrs:i.mix({text:this.get("content")},r,n)});s.name="guide-text",this.get("appendInfo")&&s.setSilent("appendInfo",this.get("appendInfo")),this.set("el",s)},e}(n(15));t.exports=r},function(t,e,n){var i=n(154);t.exports=i},function(t,e,n){t.exports={Category:n(157),CatHtml:n(159),CatPageHtml:n(325),Color:n(326),Size:n(328),CircleSize:n(329)}},function(t,e,n){function i(t,e){return t.getElementsByClassName(e)[0]}var r=n(3),a=n(159),o=n(14).FONT_FAMILY,s=r.DomUtil,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:"category-page-legend",container:null,caretStyle:{fill:"rgba(0,0,0,0.65)"},pageNumStyle:{display:"inline-block",fontSize:"12px",fontFamily:o,cursor:"default"},slipDomStyle:{width:"auto",height:"auto",position:"absolute"},slipTpl:'

      1

      /2

      ',slipWidth:65,legendOverflow:"unset"})},n.render=function(){t.prototype._renderHTML.call(this),this._renderFlipPage()},n._renderFlipPage=function(){var t=document.getElementsByClassName("g2-legend")[0],e=i(t,"g2-legend-list"),n=this.get("position"),a=this.get("layout"),o="right"===n||"left"===n||"vertical"===a?"block":"inline-block";if(t.scrollHeight>t.offsetHeight){var l=this.get("slipTpl"),u=s.createDom(l),c=i(u,"g2-caret-up"),h=i(u,"g2-caret-down");s.modifyCSS(c,this.get("caretStyle")),s.modifyCSS(c,{fill:"rgba(0,0,0,0.25)"}),s.modifyCSS(h,this.get("caretStyle"));var f=i(u,"cur-pagenum"),p=i(u,"next-pagenum"),g=this.get("pageNumStyle");s.modifyCSS(f,r.mix({},g,{paddingLeft:"10px"})),s.modifyCSS(p,r.mix({},g,{opacity:.3,paddingRight:"10px"})),s.modifyCSS(u,r.mix({},this.get("slipDomStyle"),{top:t.offsetHeight+"px"})),t.style.overflow=this.get("legendOverflow"),t.appendChild(u);for(var d=e.childNodes,v=0,y=1,x=[],m=0;m=t.offsetHeight&&(y++,x.forEach(function(t){t.style.display="none"}),x=[]),x.push(d[m]);p.innerText="/"+y,d.forEach(function(e){e.style.display=o,(v=e.offsetTop+e.offsetHeight)>t.offsetHeight&&(e.style.display="none")}),c.addEventListener("click",function(){if(d[0].style.display!==o){var e=-1;d.forEach(function(t,n){t.style.display===o&&(e=-1===e?n:e,t.style.display="none")});for(var n=e-1;n>=0&&(d[n].style.display=o,v=d[e-1].offsetTop+d[e-1].offsetHeight,d[n].style.display="none",v0){var g=i.toRGB(l[p-1].color);u+=1-l[p].percentage+":"+g+" "}h.addShape("text",{attrs:r.mix({},{x:a+this.get("textOffset")/2,y:o-l[p].percentage*o,text:this._formatItemValue(l[p].value)+""},this.get("textStyle"),{textAlign:"start"})})}}else{u+="l (0) ";for(var d=0;d0){var v=i.toRGB(l[d-1].color);u+=l[d].percentage+":"+v+" "}u+=l[d].percentage+":"+n+" ",h.addShape("text",{attrs:r.mix({},{x:l[d].percentage*a,y:o+5+this.get("textOffset"),text:this._formatItemValue(l[d].value)+""},this.get("textStyle"))})}}h.addShape("rect",{attrs:{x:0,y:0,width:a,height:o,fill:u,strokeOpacity:0}}),h.addShape("path",{attrs:r.mix({path:c},this.get("lineStyle"))}),h.move(0,e)},e}(n(67));t.exports=a},function(t,e,n){var i=n(3),r=i.DomUtil,a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{range:null,middleAttr:{fill:"#fff",fillOpacity:0},backgroundElement:null,minHandleElement:null,maxHandleElement:null,middleHandleElement:null,currentTarget:null,layout:"vertical",width:null,height:null,pageX:null,pageY:null}},n._beforeRenderUI=function(){var t=this.get("layout"),e=this.get("backgroundElement"),n=this.get("minHandleElement"),i=this.get("maxHandleElement"),r=this.addShape("rect",{attrs:this.get("middleAttr")}),a="vertical"===t?"ns-resize":"ew-resize";this.add([e,n,i]),this.set("middleHandleElement",r),e.set("zIndex",0),r.set("zIndex",1),n.set("zIndex",2),i.set("zIndex",2),r.attr("cursor","move"),n.attr("cursor",a),i.attr("cursor",a),this.sort()},n._renderUI=function(){"horizontal"===this.get("layout")?this._renderHorizontal():this._renderVertical()},n._transform=function(t){var e=this.get("range"),n=e[0]/100,i=e[1]/100,r=this.get("width"),a=this.get("height"),o=this.get("minHandleElement"),s=this.get("maxHandleElement"),l=this.get("middleHandleElement");o.resetMatrix(),s.resetMatrix(),"horizontal"===t?(l.attr({x:r*n,y:0,width:(i-n)*r,height:a}),o.translate(n*r,a),s.translate(i*r,a)):(l.attr({x:0,y:a*(1-i),width:r,height:(i-n)*a}),o.translate(1,(1-n)*a),s.translate(1,(1-i)*a))},n._renderHorizontal=function(){this._transform("horizontal")},n._renderVertical=function(){this._transform("vertical")},n._bindUI=function(){this.on("mousedown",i.wrapBehavior(this,"_onMouseDown"))},n._isElement=function(t,e){var n=this.get(e);if(t===n)return!0;if(n.isGroup){return n.get("children").indexOf(t)>-1}return!1},n._getRange=function(t,e){var n=t+e;return n=n>100?100:n,n=n<0?0:n},n._updateStatus=function(t,e){var n="x"===t?this.get("width"):this.get("height");t=i.upperFirst(t);var r,a=this.get("range"),o=this.get("page"+t),s=this.get("currentTarget"),l=this.get("rangeStash"),u="vertical"===this.get("layout")?-1:1,c=e["page"+t],h=(c-o)/n*100*u;a[1]<=a[0]?(this._isElement(s,"minHandleElement")||this._isElement(s,"maxHandleElement"))&&(a[0]=this._getRange(h,a[0]),a[1]=this._getRange(h,a[0])):(this._isElement(s,"minHandleElement")&&(a[0]=this._getRange(h,a[0])),this._isElement(s,"maxHandleElement")&&(a[1]=this._getRange(h,a[1]))),this._isElement(s,"middleHandleElement")&&(r=l[1]-l[0],a[0]=this._getRange(h,a[0]),a[1]=a[0]+r,a[1]>100&&(a[1]=100,a[0]=a[1]-r)),this.emit("sliderchange",{range:a}),this.set("page"+t,c),this._renderUI(),this.get("canvas").draw()},n._onMouseDown=function(t){var e=t.currentTarget,n=t.event,i=this.get("range");n.stopPropagation(),n.preventDefault(),this.set("pageX",n.pageX),this.set("pageY",n.pageY),this.set("currentTarget",e),this.set("rangeStash",[i[0],i[1]]),this._bindCanvasEvents()},n._bindCanvasEvents=function(){var t=this.get("canvas").get("containerDOM");this.onMouseMoveListener=r.addEventListener(t,"mousemove",i.wrapBehavior(this,"_onCanvasMouseMove")),this.onMouseUpListener=r.addEventListener(t,"mouseup",i.wrapBehavior(this,"_onCanvasMouseUp")),this.onMouseLeaveListener=r.addEventListener(t,"mouseleave",i.wrapBehavior(this,"_onCanvasMouseUp"))},n._onCanvasMouseMove=function(t){if(!this._mouseOutArea(t)){"horizontal"===this.get("layout")?this._updateStatus("x",t):this._updateStatus("y",t)}},n._onCanvasMouseUp=function(){this._removeDocumentEvents()},n._removeDocumentEvents=function(){this.onMouseMoveListener.remove(),this.onMouseUpListener.remove()},n._mouseOutArea=function(t){var e=this.get("canvas").get("el").getBoundingClientRect(),n=this.get("parent"),i=n.getBBox(),r=n.attr("matrix")[6],a=n.attr("matrix")[7],o=r+i.width,s=a+i.height,l=t.clientX-e.x,u=t.clientY-e.y;return lo||us},e}(i.Group);t.exports=a},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"size-legend",width:100,height:200,_unslidableElementStyle:{fill:"#4E7CCC",fillOpacity:1},frontMiddleBarStyle:{fill:"rgb(64, 141, 251)"}})},n._renderSliderShape=function(){var t=this.get("slider").get("backgroundElement"),e=this.get("layout"),n=this.get("width"),r=this.get("height"),a=this.get("height")/2,o=this.get("frontMiddleBarStyle"),s="vertical"===e?[[0,0],[n,0],[n,r],[n-4,r]]:[[0,a+r/2],[0,a+r/2-4],[n,a-r/2],[n,a+r/2]];return this._addMiddleBar(t,"Polygon",i.mix({points:s},o))},n._renderUnslidable=function(){var t=this.get("layout"),e=this.get("width"),n=this.get("height"),r=this.get("frontMiddleBarStyle"),a="vertical"===t?[[0,0],[e,0],[e,n],[e-4,n]]:[[0,n],[0,n-4],[e,0],[e,n]];this.get("group").addGroup().addShape("Polygon",{attrs:i.mix({points:a},r)});var o=this._formatItemValue(this.get("firstItem").value),s=this._formatItemValue(this.get("lastItem").value);"vertical"===this.get("layout")?(this._addText(e+10,n-3,o),this._addText(e+10,3,s)):(this._addText(0,n,o),this._addText(e,n,s))},n._addText=function(t,e,n){var r=this.get("group").addGroup(),a=this.get("textStyle"),o=this.get("titleShape"),s=this.get("titleGap");o&&(s+=o.getBBox().height),"vertical"===this.get("layout")?r.addShape("text",{attrs:i.mix({x:t+this.get("textOffset"),y:e,text:0===n?"0":n},a)}):(e+=s+this.get("textOffset")-20,o||(e+=10),r.addShape("text",{attrs:i.mix({x:t,y:e,text:0===n?"0":n},a)}))},e}(n(67));t.exports=r},function(t,e,n){var i=n(3),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"size-circle-legend",width:100,height:200,_unslidableCircleStyle:{stroke:"rgb(99, 161, 248)",fill:"rgb(99, 161, 248)",fillOpacity:.3,lineWidth:1.5},triggerAttr:{fill:"white",shadowOffsetX:-2,shadowOffsetY:2,shadowBlur:10,shadowColor:"#ccc"},frontMiddleBarStyle:{fill:"rgb(64, 141, 251)"}})},n._renderSliderShape=function(){var t=this.get("slider").get("backgroundElement"),e=this.get("layout"),n="vertical"===e?2:this.get("width"),r="vertical"===e?this.get("height"):2,a=this.get("height")/2,o=this.get("frontMiddleBarStyle"),s="vertical"===e?[[0,0],[n,0],[n,r],[0,r]]:[[0,a+r],[0,a-r],[5+n-4,a-r],[5+n-4,a+r]];return this._addMiddleBar(t,"Polygon",i.mix({points:s},o))},n._addHorizontalTrigger=function(t,e,n,r){var a=this.get("slider").get(t+"HandleElement"),o=-this.get("height")/2,s=a.addShape("circle",{attrs:i.mix({x:0,y:o,r:r},e)}),l=a.addShape("text",{attrs:i.mix(n,{x:0,y:o+r+10,textAlign:"center",textBaseline:"middle"})}),u="vertical"===this.get("layout")?"ns-resize":"ew-resize";s.attr("cursor",u),l.attr("cursor",u),this.set(t+"ButtonElement",s),this.set(t+"TextElement",l)},n._addVerticalTrigger=function(t,e,n,r){var a=this.get("slider").get(t+"HandleElement"),o=a.addShape("circle",{attrs:i.mix({x:0,y:0,r:r},e)}),s=a.addShape("text",{attrs:i.mix(n,{x:r+10,y:0,textAlign:"start",textBaseline:"middle"})}),l="vertical"===this.get("layout")?"ns-resize":"ew-resize";o.attr("cursor",l),s.attr("cursor",l),this.set(t+"ButtonElement",o),this.set(t+"TextElement",s)},n._renderTrigger=function(){var t=this.get("firstItem"),e=this.get("lastItem"),n=this.get("layout"),r=this.get("textStyle"),a=this.get("triggerAttr"),o=i.mix({},a),s=i.mix({},a),l=i.mix({text:this._formatItemValue(t.value)+""},r),u=i.mix({text:this._formatItemValue(e.value)+""},r);"vertical"===n?(this._addVerticalTrigger("min",o,l,5),this._addVerticalTrigger("max",s,u,16)):(this._addHorizontalTrigger("min",o,l,5),this._addHorizontalTrigger("max",s,u,16))},n._bindEvents=function(){var t=this;if(this.get("slidable")){this.get("slider").on("sliderchange",function(e){var n=e.range,i=t.get("firstItem").value,r=t.get("lastItem").value,a=i+n[0]/100*(r-i),o=i+n[1]/100*(r-i),s=5+n[0]/100*11,l=5+n[1]/100*11;t._updateElement(a,o,s,l);var u=new Event("itemfilter",e,!0,!0);u.range=[a,o],t.emit("itemfilter",u)})}},n._updateElement=function(e,n,i,r){t.prototype._updateElement.call(this,e,n);var a=this.get("minTextElement"),o=this.get("maxTextElement"),s=this.get("minButtonElement"),l=this.get("maxButtonElement");s.attr("r",i),l.attr("r",r);if("vertical"===this.get("layout"))a.attr("x",i+10),o.attr("x",r+10);else{var u=-this.get("height")/2;a.attr("y",u+i+10),o.attr("y",u+r+10)}},n._addCircle=function(t,e,n,r,a){var o=this.get("group").addGroup(),s=this.get("_unslidableCircleStyle"),l=this.get("textStyle"),u=this.get("titleShape"),c=this.get("titleGap");u&&(c+=u.getBBox().height),o.addShape("circle",{attrs:i.mix({x:t,y:e+c,r:0===n?1:n},s)}),"vertical"===this.get("layout")?o.addShape("text",{attrs:i.mix({x:a+20+this.get("textOffset"),y:e+c,text:0===r?"0":r},l)}):o.addShape("text",{attrs:i.mix({x:t,y:e+c+a+13+this.get("textOffset"),text:0===r?"0":r},l)})},n._renderUnslidable=function(){var t=this.get("firstItem").value,e=this.get("lastItem").value;if(t>e){var n=e;e=t,t=n}var i=this._formatItemValue(t),r=this._formatItemValue(e),a=t<5?5:t,o=e>16?16:e;a>o&&(a=5,o=16),"vertical"===this.get("layout")?(this._addCircle(o,o,a,i,2*o),this._addCircle(o,2*o+16+a,o,r,2*o)):(this._addCircle(o,o,a,i,2*o),this._addCircle(2*o+16+a,o,o,r,2*o))},n.activate=function(e){this.get("slidable")&&t.prototype.activate.call(this,e)},e}(n(67));t.exports=r},function(t,e,n){var i=n(68);i.Html=n(331),i.Canvas=n(163),i.Mini=n(333),t.exports=i},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t,e){return t.getElementsByClassName(e)[0]}var a=n(68),o=n(3),s=o.DomUtil,l=n(332),u=n(160),c=n(161),h=n(162),f=function(t){function e(e){var n;n=t.call(this,e)||this,o.assign(i(i(n)),c),o.assign(i(i(n)),h);var r=l;n.style=function(t,e){return Object.keys(t).forEach(function(n){e[n]&&(t[n]=o.mix(t[n],e[n]))}),t}(r,e),n._init_(),n.get("items")&&n.render();var a=n.get("crosshairs");if(a){var s="rect"===a.type?n.get("backPlot"):n.get("frontPlot"),f=new u(o.mix({plot:s,plotRange:n.get("plotRange"),canvas:n.get("canvas")},n.get("crosshairs")));f.hide(),n.set("crosshairGroup",f)}return n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return o.mix({},e,{containerTpl:'
        ',itemTpl:'
      • {name}{value}
      • ',htmlContent:null,follow:!0,enterable:!1})},n._init_=function(){var t,e=this.get("containerTpl"),n=this.get("canvas").get("el").parentNode;if(!this.get("htmlContent")){if(/^\#/.test(e)){var i=e.replace("#","");t=document.getElementById(i)}else t=s.createDom(e),s.modifyCSS(t,this.style["g2-tooltip"]),n.appendChild(t),n.style.position="relative";this.set("container",t)}},n.render=function(){if(this.clear(),this.get("htmlContent")){var t=this.get("canvas").get("el").parentNode,e=this._getHtmlContent();t.appendChild(e),this.set("container",e)}else this._renderTpl()},n._renderTpl=function(){var t=this,e=t.get("showTitle"),n=t.get("titleContent"),i=t.get("container"),a=r(i,"g2-tooltip-title"),l=r(i,"g2-tooltip-list"),u=t.get("items");a&&e&&(s.modifyCSS(a,t.style["g2-tooltip-title"]),a.innerHTML=n),l&&(s.modifyCSS(l,t.style["g2-tooltip-list"]),o.each(u,function(e,n){l.appendChild(t._addItem(e,n))}))},n.clear=function(){var t=this.get("container");if(this.get("htmlContent"))t&&t.remove();else{var e=r(t,"g2-tooltip-title"),n=r(t,"g2-tooltip-list");e&&(e.innerHTML=""),n&&(n.innerHTML="")}},n.show=function(){var e=this.get("container");e.style.visibility="visible",e.style.display="block";var n=this.get("crosshairGroup");n&&n.show();var i=this.get("markerGroup");i&&i.show(),t.prototype.show.call(this),this.get("canvas").draw()},n.hide=function(){var e=this.get("container");e.style.visibility="hidden",e.style.display="none";var n=this.get("crosshairGroup");n&&n.hide();var i=this.get("markerGroup");i&&i.hide(),t.prototype.hide.call(this),this.get("canvas").draw()},n.destroy=function(){var e=this.get("container"),n=this.get("containerTpl");e&&!/^\#/.test(n)&&e.parentNode.removeChild(e);var i=this.get("crosshairGroup");i&&i.destroy();var r=this.get("markerGroup");r&&r.remove(),t.prototype.destroy.call(this)},n._addItem=function(t,e){var n=this.get("itemTpl"),i=o.substitute(n,o.mix({index:e},t)),a=s.createDom(i);s.modifyCSS(a,this.style["g2-tooltip-list-item"]);var l=r(a,"g2-tooltip-marker");l&&s.modifyCSS(l,this.style["g2-tooltip-marker"]);var u=r(a,"g2-tooltip-value");return u&&s.modifyCSS(u,this.style["g2-tooltip-value"]),a},n._getHtmlContent=function(){var t=this.get("htmlContent")(this.get("titleContent"),this.get("items"));return s.createDom(t)},n.setPosition=function(e,n,i){var r,a=this.get("container"),l=this.get("canvas").get("el"),u=s.getWidth(l),c=s.getHeight(l),h=a.clientWidth,f=a.clientHeight,p=e,g=n,d=this.get("prePosition")||{x:0,y:0};if(this.get("enterable"))r=[e,n-=a.clientHeight/2],d&&e-d.x>0?e-=a.clientWidth+1:e+=1;else if(this.get("position")){var v=a.clientWidth,y=a.clientHeight;e=(r=this._calcTooltipPosition(e,n,this.get("position"),v,y,i))[0],n=r[1]}else e=(r=this._constraintPositionInBoundary(e,n,h,f,u,c))[0],n=r[1];if(this.get("inPlot")){var x=this.get("plotRange");e=(r=this._constraintPositionInPlot(e,n,h,f,x,this.get("enterable")))[0],n=r[1]}var m=this.get("markerItems");o.isEmpty(m)||(p=m[0].x,g=m[0].y),this.set("prePosition",r);this.get("follow")&&(a.style.left=e+"px",a.style.top=n+"px");var _=this.get("crosshairGroup");if(_){var b=this.get("items");_.setPosition(p,g,b)}t.prototype.setPosition.call(this,e,n)},e}(a);t.exports=f},function(t,e,n){var i,r=n(14).FONT_FAMILY,a=(i={crosshairs:!1,offset:15},i["g2-tooltip"]={position:"absolute",visibility:"hidden",zIndex:8,transition:"visibility 0.2s cubic-bezier(0.23, 1, 0.32, 1), left 0.4s cubic-bezier(0.23, 1, 0.32, 1), top 0.4s cubic-bezier(0.23, 1, 0.32, 1)",backgroundColor:"rgba(255, 255, 255, 0.9)",boxShadow:"0px 0px 10px #aeaeae",borderRadius:"3px",color:"rgb(87, 87, 87)",fontSize:"12px",fontFamily:r,lineHeight:"20px",padding:"10px 10px 6px 10px"},i["g2-tooltip-title"]={marginBottom:"4px"},i["g2-tooltip-list"]={margin:0,listStyleType:"none",padding:0},i["g2-tooltip-list-item"]={marginBottom:"4px"},i["g2-tooltip-marker"]={width:"5px",height:"5px",borderRadius:"50%",display:"inline-block",marginRight:"8px"},i["g2-tooltip-value"]={display:"inline-block",float:"right",marginLeft:"30px"},i);t.exports=a},function(t,e,n){var i=n(3),r=n(163),a=n(14).FONT_FAMILY,o=i.DomUtil,s=i.MatrixUtil,l=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{boardStyle:{x:0,y:0,width:0,height:0,radius:3},valueStyle:{x:0,y:0,text:"",fontFamily:a,fontSize:12,stroke:"#fff",lineWidth:2,fill:"black",textBaseline:"top",textAlign:"start"},padding:{top:5,right:5,bottom:0,left:5},triangleWidth:10,triangleHeight:4})},n._init_=function(){var t=this.get("padding"),e=this.get("frontPlot").addGroup();this.set("container",e);var n=e.addShape("rect",{attrs:i.mix({},this.get("boardStyle"))});this.set("board",n);var r=e.addShape("path",{attrs:{fill:this.get("boardStyle").fill}});this.set("triangleShape",r);var a=e.addGroup();a.move(t.left,t.top);var o=a.addShape("text",{attrs:i.mix({},this.get("valueStyle"))});this.set("valueShape",o)},n.render=function(){this.clear();var t=this.get("board"),e=this.get("valueShape"),n=this.get("padding"),i=this.get("items")[0];e&&e.attr("text",i.value);var r=e?e.getBBox():{width:80,height:30},a=n.left+r.width+n.right,o=n.top+r.height+n.bottom;t.attr("width",a),t.attr("height",o),this._centerTriangleShape()},n.clear=function(){this.get("valueShape").attr("text","")},n.setPosition=function(t,e,n){var i=this.get("container"),r=this.get("plotRange"),a=i.getBBox(),l=a.width,u=a.height;if(t-=l/2,n&&("point"===n.name||"interval"===n.name)){e=n.getBBox().y}if(e-=u,this.get("inPlot"))tr.tr.x?(t=r.tr.x-l,this._rightTriangleShape()):this._centerTriangleShape(),er.bl.y&&(e=r.bl.y-u);else{var c=this.get("canvas").get("el"),h=o.getWidth(c),f=o.getHeight(c);t<0?(t=0,this._leftTriangleShape()):t+l/2>h?(t=h-l,this._rightTriangleShape()):this._centerTriangleShape(),e<0?e=0:e+u>f&&(e=f-u)}var p=s.transform([1,0,0,0,1,0,0,0,1],[["t",t,e]]);i.stopAnimate(),i.animate({matrix:p},this.get("animationDuration"))},n._centerTriangleShape=function(){var t=this.get("triangleShape"),e=this.get("triangleWidth"),n=this.get("triangleHeight"),i=this.get("board").getBBox(),r=i.width,a=i.height,o=[["M",0,0],["L",e,0],["L",e/2,n],["L",0,0],["Z"]];t.attr("path",o),t.move(r/2-e/2,a-1)},n._leftTriangleShape=function(){var t=this.get("triangleShape"),e=this.get("triangleWidth"),n=this.get("triangleHeight"),i=this.get("board").getBBox().height,r=[["M",0,0],["L",e,0],["L",0,n+3],["L",0,0],["Z"]];t.attr("path",r),t.move(0,i-3)},n._rightTriangleShape=function(){var t=this.get("triangleShape"),e=this.get("triangleWidth"),n=this.get("triangleHeight"),i=this.get("board").getBBox(),r=i.width,a=i.height,o=[["M",0,0],["L",e,0],["L",e,n+4],["L",0,0],["Z"]];t.attr("path",o),t.move(r-e-1,a-4)},e}(r);t.exports=l},function(t,e,n){var i=n(0).MatrixUtil.vec2;t.exports={catmullRom2bezier:function(t,e,n){for(var r=!!e,a=[],o=0,s=t.length;o0&&(e=this._distribute(e,n)),t.prototype.adjustItems.call(this,e)},n._distribute=function(t,e){var n=this.get("coord"),i=n.getRadius(),r=this.get("label").labelHeight,a=n.getCenter(),o=2*(i+e)+2*r,s={start:n.start,end:n.end},l=this.get("geom");if(l){var u=l.get("view");s=u.getViewRegion()}var c=[[],[]];return t.forEach(function(t){t&&("right"===t.textAlign?c[0].push(t):c[1].push(t))}),c.forEach(function(t,e){var n=parseInt(o/r,10);t.length>n&&(t.sort(function(t,e){return e["..percent"]-t["..percent"]}),t.splice(n,t.length-n)),t.sort(function(t,e){return t.y-e.y}),function(t,e,n,i,r){var a,o=!0,s=n.start,l=n.end,u=Math.min(s.y,l.y),c=Math.abs(s.y-l.y),h=0,f=Number.MIN_VALUE,p=t.map(function(t){return t.y>h&&(h=t.y),t.yc&&(c=h-u);o;)for(p.forEach(function(t){var e=(Math.min.apply(f,t.targets)+Math.max.apply(f,t.targets))/2;t.pos=Math.min(Math.max(f,e-t.size/2),c-t.size)}),o=!1,a=p.length;a--;)if(a>0){var g=p[a-1],d=p[a];g.pos+g.size>d.pos&&(g.size+=d.size,g.targets=g.targets.concat(d.targets),g.pos+g.size>c&&(g.pos=c-g.size),p.splice(a,1),o=!0)}a=0,p.forEach(function(n){var i=u+e/2;n.targets.forEach(function(){t[a].y=n.pos+i,i+=e,a++})}),t.forEach(function(t){var e=t.r*t.r,n=Math.pow(Math.abs(t.y-i.y),2);if(e90&&(n-=180),n<-90&&(n+=180)),n/180*Math.PI},n.getLabelAlign=function(t){var e,n=this.get("coord").getCenter();e=t.angle<=Math.PI/2&&t.x>=n.x?"left":"right";return this.getDefaultOffset(t)<=0&&(e="right"===e?"left":"right"),e},n.getArcPoint=function(t){return t},n.getPointAngle=function(t){var e=this.get("coord"),n={x:r.isArray(t.x)?t.x[0]:t.x,y:t.y[0]};this.transLabelPoint(n);var i={x:r.isArray(t.x)?t.x[1]:t.x,y:t.y[1]};this.transLabelPoint(i);var a,s=o.getPointAngle(e,n);if(t.points&&t.points[0].y===t.points[1].y)a=s;else{var l=o.getPointAngle(e,i);s>=l&&(l+=2*Math.PI),a=s+(l-s)/2}return a},n.getCirclePoint=function(t,e){var n=this.get("coord"),r=n.getCenter(),a=n.getRadius()+e,o=i(r,t,a);return o.angle=t,o.r=a,o},e}(a);t.exports=l},function(t,e,n){var i=n(0),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.setLabelPosition=function(t,e,n,r){i.isFunction(r)&&(r=r(t.text,e._origin,n));var a=this.get("coord"),o=a.isTransposed,s=a.convertPoint(e.points[0]),l=a.convertPoint(e.points[2]),u=(s.x-l.x)/2*(o?-1:1),c=(s.y-l.y)/2*(o?-1:1);switch(r){case"right":o?(t.x-=u,t.y+=c,t.textAlign=t.textAlign||"center"):(t.x-=u,t.y+=c,t.textAlign=t.textAlign||"left");break;case"left":o?(t.x-=u,t.y-=c,t.textAlign=t.textAlign||"center"):(t.x+=u,t.y+=c,t.textAlign=t.textAlign||"right");break;case"bottom":o?(t.x-=2*u,t.textAlign=t.textAlign||"left"):(t.y+=2*c,t.textAlign=t.textAlign||"center");break;case"middle":o?t.x-=u:t.y+=c,t.textAlign=t.textAlign||"center";break;case"top":t.textAlign=o?t.textAlign||"left":t.textAlign||"center"}},e}(n(65));t.exports=r},function(t,e,n){function i(t){return t.alias||t.field}var r=n(0),a=n(7).defaultColor,o={_getIntervalSize:function(t){var e=null,n=this.get("type"),i=this.get("coord");if(i.isRect&&("interval"===n||"schema"===n)){e=this.getSize(t._origin);var a=i.isTransposed?"y":"x";if(r.isArray(t[a])){e=e(1+i.rangeMax())/2&&(r=i.rangeMin()),e=i.invert(r),i.isCategory&&(e=i.translate(e)),e},_getOriginByPoint:function(t){var e=this.getXScale(),n=this.getYScale(),i=e.field,r=n.field,a=this.get("coord").invert(t),o=e.invert(a.x),s=n.invert(a.y),l={};return l[i]=o,l[r]=s,l},_getScale:function(t){var e=this.get("scales"),n=null;return r.each(e,function(e){if(e.field===t)return n=e,!1}),n},_getTipValueScale:function(){var t,e=this.getAttrsForLegend();r.each(e,function(e){var n=e.getScale(e.type);if(n.isLinear)return t=n,!1});var n=this.getXScale(),i=this.getYScale();return!t&&i&&"..y"===i.field?n:t||i||n},_getTipTitleScale:function(t){if(t)return this._getScale(t);var e,n=this.getAttr("position").getFields();return r.each(n,function(t){if(-1===t.indexOf(".."))return e=t,!1}),this._getScale(e)},_filterValue:function(t,e){var n=this.get("coord"),i=this.getYScale(),a=i.field,o=n.invert(e).y;o=i.invert(o);var s=t[t.length-1];return r.each(t,function(t){var e=t._origin;if(e[a][0]<=o&&e[a][1]>=o)return s=t,!1}),s},getXDistance:function(){var t=this.get("xDistance");if(!t){var e=this.getXScale();if(e.isCategory)t=1;else{var n=e.values,i=e.translate(n[0]),a=i;r.each(n,function(t){(t=e.translate(t))a&&(a=t)});var o=n.length;t=(a-i)/(o-1)}this.set("xDistance",t)}return t},findPoint:function(t,e){var n=this,i=n.get("type"),a=n.getXScale(),o=n.getYScale(),s=a.field,l=o.field,u=null;if(r.indexOf(["heatmap","point"],i)>-1){var c=n.get("coord").invert(t),h=a.invert(c.x),f=o.invert(c.y),p=1/0;return r.each(e,function(t){var e=Math.pow(t._origin[s]-h,2)+Math.pow(t._origin[l]-f,2);e=v){if(!_)return u=t,!1;r.isArray(u)||(u=[]),u.push(t)}}),r.isArray(u)&&(u=this._filterValue(u,t));else{var b;if(a.isLinear||"timeCat"===a.type){if((v>a.translate(m)||va.max||vMath.abs(a.translate(b._origin[s])-v)&&(d=b)}var A=n.getXDistance();return!u&&Math.abs(a.translate(d._origin[s])-v)<=A/2&&(u=d),u},getTipTitle:function(t,e){var n="",i=this._getTipTitleScale(e);if(i){var r=t[i.field];n=i.getText(r)}else if("heatmap"===this.get("type")){var a=this.getXScale(),o=this.getYScale();n="( "+a.getText(t[a.field])+", "+o.getText(t[o.field])+" )"}return n},getTipValue:function(t,e){var n,i=e.field,a=t.key;if(n=t[i],r.isArray(n)){var o=[];r.each(n,function(t){o.push(e.getText(t))}),n=o.join("-")}else n=e.getText(n,a);return n},getTipName:function(t){var e,n,a=this._getGroupScales();if(a.length&&r.each(a,function(t){return n=t,!1}),n){var o=n.field;e=n.getText(t[o])}else{e=i(this._getTipValueScale())}return e},getTipItems:function(t,e){function n(e,n,i){if(!r.isNil(n)&&""!==n){var o={title:c,point:t,name:e||c,value:n,color:t.color||a,marker:!0};o.size=l._getIntervalSize(t),f.push(r.mix({},o,i))}}var o,s,l=this,u=t._origin,c=l.getTipTitle(u,e),h=l.get("tooltipCfg"),f=[];if(h){var p=h.fields,g=h.cfg,d=[];if(r.each(p,function(t){d.push(u[t])}),g){r.isFunction(g)&&(g=g.apply(null,d));var v=r.mix({},{point:t,title:c,color:t.color||a,marker:!0},g);v.size=l._getIntervalSize(t),f.push(v)}else r.each(p,function(t){if(!r.isNil(u[t])){var e=l._getScale(t);o=i(e),s=e.getText(u[t]),n(o,s)}})}else{var y=l._getTipValueScale();r.isNil(u[y.field])||(s=l.getTipValue(u,y),n(o=l.getTipName(u),s))}return f},isShareTooltip:function(){var t,e=this.get("shareTooltip"),n=this.get("type"),i=this.get("view");if(t=i.get("parent")?i.get("parent").get("options"):i.get("options"),"interval"===n){var a=this.get("coord"),o=a.type;("theta"===o||"polar"===o&&a.isTransposed)&&(e=!1)}else this.getYScale()&&!r.inArray(["contour","point","polygon","edge"],n)||(e=!1);return t.tooltip&&r.isBoolean(t.tooltip.shared)&&(e=t.tooltip.shared),e}};t.exports=o},function(t,e,n){function i(t,e){if(!t)return!0;if(t.length!==e.length)return!0;var n=!1;return a.each(e,function(e,i){if(!function(t,e){if(a.isNil(t)||a.isNil(e))return!1;var n=t.get("origin"),i=e.get("origin");return a.isEqual(n,i)}(e,t[i]))return n=!0,!1}),n}function r(t,e){var n={};return a.each(t,function(t,i){var r=e.attr(i);a.isArray(r)&&(r=a.cloneDeep(r)),n[i]=r}),n}var a=n(0),o={_isAllowActive:function(){var t=this.get("allowActive");if(!a.isNil(t))return t;var e=this.get("view"),n=this.isShareTooltip();return!1===e.get("options").tooltip||!n},_onMouseenter:function(t){var e=t.shape,n=this.get("shapeContainer");e&&n.contain(e)&&this._isAllowActive()&&this.setShapesActived(e)},_onMouseleave:function(){var t=this.get("view").get("canvas");this.get("activeShapes")&&(this.clearActivedShapes(),t.draw())},_bindActiveAction:function(){var t=this.get("view"),e=this.get("type");t.on(e+":mouseenter",a.wrapBehavior(this,"_onMouseenter")),t.on(e+":mouseleave",a.wrapBehavior(this,"_onMouseleave"))},_offActiveAction:function(){var t=this.get("view"),e=this.get("type");t.off(e+":mouseenter",a.getWrapBehavior(this,"_onMouseenter")),t.off(e+":mouseleave",a.getWrapBehavior(this,"_onMouseleave"))},_setActiveShape:function(t){var e=this.get("activedOptions")||{},n=t.get("origin"),i=n.shape||this.getDefaultValue("shape");a.isArray(i)&&(i=i[0]);var o=this.get("shapeFactory"),s=a.mix({},t.attr(),{origin:n}),l=o.getActiveCfg(i,s);e.style&&a.mix(l,e.style);var u=r(l,t);t.setSilent("_originAttrs",u),e.animate?t.animate(l,300):t.attr(l),t.set("zIndex",1)},setShapesActived:function(t){var e=this;a.isArray(t)||(t=[t]);var n=e.get("activeShapes");if(i(n,t)){var r=e.get("view").get("canvas"),o=e.get("shapeContainer"),s=e.get("activedOptions");s&&s.highlight?(a.each(t,function(t){t.get("animating")&&t.stopAnimate()}),e.highlightShapes(t)):(n&&e.clearActivedShapes(),a.each(t,function(t){t.get("animating")&&t.stopAnimate(),t.get("visible")&&!t.get("selected")&&e._setActiveShape(t)})),e.set("activeShapes",t),o.sort(),r.draw()}},clearActivedShapes:function(){var t=this.get("shapeContainer"),e=this.get("activedOptions"),n=e&&e.animate;if(t&&!t.get("destroyed")){var i=this.get("activeShapes");a.each(i,function(t){if(!t.get("selected")){var e=t.get("_originAttrs");n?(t.stopAnimate(),t.animate(e,300)):t.attr(e),t.setZIndex(0),t.set("_originAttrs",null)}});if(this.get("preHighlightShapes")){var r=t.get("children");a.each(r,function(t){if(!t.get("selected")){var e=t.get("_originAttrs");e&&(n?(t.stopAnimate(),t.animate(e,300)):t.attr(e),t.setZIndex(0),t.set("_originAttrs",null))}})}t.get("children").sort(function(t,e){return t._INDEX-e._INDEX}),this.set("activeShapes",null),this.set("preHighlightShapes",null)}},getGroupShapesByPoint:function(t){var e=[];if(this.get("shapeContainer")){var n=this.getXScale().field,i=this.getShapes(),r=this._getOriginByPoint(t);a.each(i,function(t){var i=t.get("origin");if(t.get("visible")&&i){i._origin[n]===r[n]&&e.push(t)}})}return e},getSingleShapeByPoint:function(t){var e,n=this.get("shapeContainer"),i=n.get("canvas").get("pixelRatio");if(n&&(e=n.getShape(t.x*i,t.y*i)),e&&e.get("origin"))return e},highlightShapes:function(t,e){a.isArray(t)||(t=[t]);var n=this.get("activeShapes");if(i(n,t)){n&&this.clearActivedShapes();var o=this.getShapes(),s=this.get("activedOptions"),l=s&&s.animate,u=s&&s.style;a.each(o,function(n){var i={};n.stopAnimate(),-1!==a.indexOf(t,n)?(a.mix(i,u,e),n.setZIndex(1)):(a.mix(i,{fillOpacity:.3,opacity:.3}),n.setZIndex(0));var o=r(i,n);n.setSilent("_originAttrs",o),l?n.animate(i,300):n.attr(i)}),this.set("preHighlightShapes",t),this.set("activeShapes",t)}}};t.exports=o},function(t,e,n){function i(t,e){if(r.isNil(t)||r.isNil(e))return!1;var n=t.get("origin"),i=e.get("origin");return r.isEqual(n,i)}var r=n(0),a={_isAllowSelect:function(){var t=this.get("allowSelect");if(!r.isNil(t))return t;var e=this.get("type"),n=this.get("coord"),i=n&&n.type;return"interval"===e&&"theta"===i},_onClick:function(t){if(this._isAllowSelect()){this.clearActivedShapes();var e=t.shape,n=this.get("shapeContainer");e&&!e.get("animating")&&n.contain(e)&&this.setShapeSelected(e)}},_bindSelectedAction:function(){var t=this.get("view"),e=this.get("type");t.on(e+":click",r.wrapBehavior(this,"_onClick"))},_offSelectedAction:function(){var t=this.get("view"),e=this.get("type");t.off(e+":click",r.getWrapBehavior(this,"_onClick"))},_setShapeStatus:function(t,e){var n=this.get("view"),i=this.get("selectedOptions")||{},a=!1!==i.animate,o=n.get("canvas");t.set("selected",e);var s=t.get("origin");if(e){var l=s.shape||this.getDefaultValue("shape");r.isArray(l)&&(l=l[0]);var u=this.get("shapeFactory"),c=r.mix({geom:this,point:s},i),h=u.getSelectedCfg(l,c);r.mix(h,c.style),t.get("_originAttrs")||(t.get("animating")&&t.stopAnimate(),t.set("_originAttrs",function(t,e){var n={};return r.each(t,function(t,i){"transform"===i&&(i="matrix");var a=e.attr(i);r.isArray(a)&&(a=r.cloneDeep(a)),n[i]=a}),n}(h,t))),a?t.animate(h,300):(t.attr(h),o.draw())}else{var f=t.get("_originAttrs");t.set("_originAttrs",null),a?t.animate(f,300):(t.attr(f),o.draw())}},setShapeSelected:function(t){var e=this._getSelectedShapes(),n=this.get("selectedOptions")||{},a=!1!==n.cancelable;if("multiple"===n.mode)-1===r.indexOf(e,t)?(e.push(t),this._setShapeStatus(t,!0)):a&&(r.Array.remove(e,t),this._setShapeStatus(t,!1));else{var o=e[0];a&&(t=i(o,t)?null:t),i(o,t)||(o&&this._setShapeStatus(o,!1),t&&this._setShapeStatus(t,!0))}},clearSelected:function(){var t=this,e=t.get("shapeContainer");if(e&&!e.get("destroyed")){var n=t._getSelectedShapes();r.each(n,function(e){t._setShapeStatus(e,!1),e.set("_originAttrs",null)})}},setSelected:function(t){var e=this,n=e.getShapes();return r.each(n,function(n){var i=n.get("origin");i&&i._origin===t&&e.setShapeSelected(n)}),this},_getSelectedShapes:function(){var t=this.getShapes(),e=[];return r.each(t,function(t){t.get("selected")&&e.push(t)}),this.set("selectedShapes",e),e}};t.exports=a},function(t,e,n){var i=n(0);t.exports=function(t){return i.isArray(t)?t:i.isString(t)?t.split("*"):[t]}},function(t,e,n){var i=n(74),r=n(0),a=/^(?:(?!0000)[0-9]{4}([-/.]+)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2\2(?:29))(\s+([01]|([01][0-9]|2[0-3])):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9]))?$/,o={LINEAR:"linear",CAT:"cat",TIME:"time"},s=function(){function t(t){this.defs={},this.viewTheme={scales:{}},this.filters={},r.assign(this,t)}var e=t.prototype;return e._getDef=function(t){var e=this.defs,n=this.viewTheme,i=null;return(n.scales[t]||e[t])&&(i=r.mix({},n.scales[t]),r.each(e[t],function(t,e){r.isNil(t)?delete i[e]:i[e]=t}),this.filters[t]&&(delete i.min,delete i.max)),i},e._getDefaultType=function(t,e){var n=o.LINEAR,i=r.Array.firstValue(e,t);return r.isArray(i)&&(i=i[0]),a.test(i)?n=o.TIME:r.isString(i)&&(n=o.CAT),n},e._getScaleCfg=function(t,e,n){var a={field:e},o=r.Array.values(n,e);if(a.values=o,!i.isCategory(t)&&"time"!==t){var s=r.Array.getRange(o);a.min=s.min,a.max=s.max,a.nice=!0}return"time"===t&&(a.nice=!1),a},e.createScale=function(t,e){var n,a=this._getDef(t);if(!e||!e.length)return n=a&&a.type?i[a.type](a):i.identity({value:t,field:t.toString(),values:[t]});var o=r.Array.firstValue(e,t);if(r.isNumber(t)||r.isNil(o)&&!a)n=i.identity({value:t,field:t.toString(),values:[t]});else{var s;a&&(s=a.type),s=s||this._getDefaultType(t,e);var l=this._getScaleCfg(s,t,e);a&&r.mix(l,a),n=i[s](l)}return n},t}();t.exports=s},function(t,e,n){var i=n(0),r=n(343),a=function(){function t(t){this.type="rect",this.actions=[],this.cfg={},i.mix(this,t),this.option=t||{}}var e=t.prototype;return e.reset=function(t){return this.actions=t.actions||[],this.type=t.type,this.cfg=t.cfg,this.option.actions=this.actions,this.option.type=this.type,this.option.cfg=this.cfg,this},e._execActions=function(t){var e=this.actions;i.each(e,function(e){var n=e[0];t[n](e[1],e[2])})},e.hasAction=function(t){var e=this.actions,n=!1;return i.each(e,function(e){if(t===e[0])return n=!0,!1}),n},e.createCoord=function(t,e){var n,a,o=this.type,s=this.cfg,l=i.mix({start:t,end:e},s);return"theta"===o?(n=r.Polar,this.hasAction("transpose")||this.transpose(),(a=new n(l)).type=o):a=new(n=r[i.upperFirst(o||"")]||r.Rect)(l),this._execActions(a),a},e.rotate=function(t){return t=t*Math.PI/180,this.actions.push(["rotate",t]),this},e.reflect=function(t){return this.actions.push(["reflect",t]),this},e.scale=function(t,e){return this.actions.push(["scale",t,e]),this},e.transpose=function(){return this.actions.push(["transpose"]),this},t}();t.exports=a},function(t,e,n){"use strict";var i=n(44);i.Cartesian=n(344),i.Rect=i.Cartesian,i.Polar=n(345),i.Helix=n(346),t.exports=i},function(t,e,n){"use strict";function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){return!e||"object"!==i(e)&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function a(t,e){for(var n=0;nf/l?(a=f/l,o={x:n.x-(.5-c)*f,y:n.y-(.5-h)*a*u}):(a=p/u,o={x:n.x-(.5-c)*a*l,y:n.y-(.5-h)*p}),t?t>0&&t<=1?t*=a:(t<=0||t>a)&&(t=a):t=a;var g={start:i,end:r},d={start:e*t,end:t};this.x=g,this.y=d,this.radius=t,this.circleCentre=o,this.center=o}},{key:"getCenter",value:function(){return this.circleCentre}},{key:"getOneBox",value:function(){var t=this.startAngle,e=this.endAngle;if(Math.abs(e-t)>=2*Math.PI)return{minX:-1,maxX:1,minY:-1,maxY:1};for(var n=[0,Math.cos(t),Math.cos(e)],i=[0,Math.sin(t),Math.sin(e)],r=Math.min(t,e);r0?l:-l;var u=this.invertDim(s,"y"),c={};return c.x=this.isTransposed?u:l,c.y=this.isTransposed?l:u,c}}]),e}();t.exports=y},function(t,e,n){"use strict";function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){return!e||"object"!==i(e)&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function a(t,e){for(var n=0;n=0&&n<=1&&(s*=n);var l=Math.floor(s*(1-i)/o),u=l/(2*Math.PI),c={start:r,end:a},h={start:i*s,end:i*s+.99*l};this.a=u,this.d=l,this.x=c,this.y=h}},{key:"getCenter",value:function(){return this.center}},{key:"convertPoint",value:function(t){var e,n,i=this.a,r=this.center;this.isTransposed?(e=t.y,n=t.x):(e=t.x,n=t.y);var a=this.convertDim(e,"x"),o=i*a,s=this.convertDim(n,"y");return{x:r.x+Math.cos(a)*(o+s),y:r.y+Math.sin(a)*(o+s)}}},{key:"invertPoint",value:function(t){var e=this.center,n=this.a,i=this.d+this.y.start,r=g.subtract([],[t.x,t.y],[e.x,e.y]),a=g.angleTo(r,[1,0],!0),o=a*n;g.length(r)u.x||!o&&s.y>u.y?1:-1,{isVertical:o,factor:r,start:s,end:l}},e._getCircleCfg=function(t){var e,n={},i=t.x,r=t.y,a=r.start>r.end;e=t.isTransposed?{x:a?0:1,y:0}:{x:0,y:a?0:1},e=t.convert(e);var s,l=t.circleCentre,u=[e.x-l.x,e.y-l.y],c=[1,0],h=(s=e.y>l.y?o.angle(u,c):-1*o.angle(u,c))+(i.end-i.start);return n.startAngle=s,n.endAngle=h,n.center=l,n.radius=Math.sqrt(Math.pow(e.x-l.x,2)+Math.pow(e.y-l.y,2)),n.inner=t.innerRadius||0,n},e._getRadiusCfg=function(t){var e,n,i=t.x.start<0?-1:1;return t.isTransposed?(e={x:0,y:0},n={x:1,y:0}):(e={x:0,y:0},n={x:0,y:1}),{factor:i,start:t.convert(e),end:t.convert(n)}},e._getAxisPosition=function(t,e,n,i){var r="",a=this.options;if(a[i]&&a[i].position)r=a[i].position;else{var o=t.type;t.isRect?"x"===e?r="bottom":"y"===e&&(r=n?"right":"left"):r="helix"===o?"helix":"x"===e?t.isTransposed?"radius":"circle":t.isTransposed?"circle":"radius"}return r},e._getAxisDefaultCfg=function(t,e,n,i){var a=this.viewTheme,o={},s=this.options,l=e.field;if(o=r.deepMix({},a.axis[i],o,s[l]),o.viewTheme=a,o.title){var u=r.isPlainObject(o.title)?o.title:{};u.text=u.text||e.alias||l,r.deepMix(o,{title:u})}return o.ticks=e.getTicks(),t.isPolar&&!e.isCategory&&"x"===n&&Math.abs(t.endAngle-t.startAngle)===2*Math.PI&&o.ticks.pop(),o.coord=t,o.label&&r.isNil(o.label.autoRotate)&&(o.label.autoRotate=!0),s.hasOwnProperty("xField")&&s.xField.hasOwnProperty("grid")&&"left"===o.position&&r.deepMix(o,s.xField),o},e._getAxisCfg=function(t,e,n,i,a,o){void 0===a&&(a="");var s=this,l=s._getAxisPosition(t,i,a,e.field),u=s._getAxisDefaultCfg(t,e,i,l);if(!r.isEmpty(u.grid)&&n){var c=[],h=[],f=function(t){var e=[];if(t.length>0){var n=(e=t.slice(0))[0],i=e[e.length-1];0!==n.value&&e.unshift({value:0}),1!==i.value&&e.push({value:1})}return e}(n.getTicks());if(f.length){var p=function(t,e,n){var i=[];return t.length<1?i:(t.length>=2&&e&&n&&i.push({text:"",tickValue:"",value:0}),0!==t[0].value&&i.push({text:"",tickValue:"",value:0}),1!==(i=i.concat(t))[i.length-1].value&&i.push({text:"",tickValue:"",value:1}),i)}(u.ticks,e.isLinear,"center"===u.grid.align);r.each(p,function(n,l){h.push(n.tickValue);var g=[],d=n.value;if("center"===u.grid.align&&(d=s._getMiddleValue(d,p,l,e.isLinear)),!r.isNil(d)){var v=t.x,y=t.y;r.each(f,function(e){var n="x"===i?d:e.value,r="x"===i?e.value:d,a=t.convert({x:n,y:r});if(t.isPolar){var o=t.circleCentre;y.start>y.end&&(r=1-r),a.flag=v.start>v.end?0:1,a.radius=Math.sqrt(Math.pow(a.x-o.x,2)+Math.pow(a.y-o.y,2))}g.push(a)}),c.push({_id:o+"-"+i+a+"-grid-"+n.tickValue,points:g})}})}u.grid.items=c,u.grid.tickValues=h}return u.type=e.type,u},e._getHelixCfg=function(t){for(var e={},n=t.a,i=t.startAngle,r=t.endAngle,a=[],o=0;o<=100;o++){var s=t.convert({x:o/100,y:0});a.push(s.x),a.push(s.y)}var l=t.convert({x:0,y:0});return e.a=n,e.startAngle=i,e.endAngle=r,e.crp=a,e.axisStart=l,e.center=t.center,e.inner=t.y.start,e},e._drawAxis=function(t,e,n,i,o,s,l){var u,c,h=this.container,f=this.canvas;"cartesian"===t.type?(u=a.Line,c=this._getLineCfg(t,e,i,l)):"helix"===t.type&&"x"===i?(u=a.Helix,c=this._getHelixCfg(t)):"x"===i?(u=a.Circle,c=this._getCircleCfg(t)):(u=a.Line,c=this._getRadiusCfg(t));var p=this._getAxisCfg(t,e,n,i,l,o);p=r.mix({},p,c),"y"===i&&s&&"circle"===s.get("type")&&(p.circle=s),p._id=o+"-"+i,r.isNil(l)||(p._id=o+"-"+i+l),r.mix(p,{canvas:f,group:h});var g=new u(p);return g.render(),this.axes.push(g),g},e.createAxis=function(t,e,n){var i=this,a=this.coord,o=a.type;if("theta"!==o&&("polar"!==o||!a.isTransposed)){var s;t&&!i._isHide(t.field)&&(s=i._drawAxis(a,t,e[0],"x",n)),r.isEmpty(e)||"helix"===o||r.each(e,function(e,r){i._isHide(e.field)||i._drawAxis(a,e,t,"y",n,s,r)})}},e.changeVisible=function(t){var e=this.axes;r.each(e,function(e){e.set("visible",t)})},e.clear=function(){var t=this.axes;r.each(t,function(t){t.clear()}),this.axes=[]},t}();t.exports=s},function(t,e,n){var i=n(0),r=n(349),a=function(){function t(t){this.guides=[],this.options=[],this.xScales=null,this.yScales=null,this.view=null,this.viewTheme=null,this.frontGroup=null,this.backGroup=null,i.mix(this,t)}var e=t.prototype;return e._creatGuides=function(){var t=this,e=this.options,n=this.xScales,a=this.yScales,o=this.view,s=this.viewTheme;return this.backContainer&&o&&(this.backGroup=this.backContainer.addGroup({viewId:o.get("_id")})),this.frontContainer&&o&&(this.frontGroup=this.frontContainer.addGroup({viewId:o.get("_id")})),e.forEach(function(e){var o=e.type,l=i.deepMix({xScales:n,yScales:a,viewTheme:s},s?s.guide[o]:{},e);o=i.upperFirst(o);var u=new r[o](l);t.guides.push(u)}),t.guides},e.line=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"line"},t)),this},e.arc=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"arc"},t)),this},e.text=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"text"},t)),this},e.image=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"image"},t)),this},e.region=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"region"},t)),this},e.regionFilter=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"regionFilter"},t)),this},e.dataMarker=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"dataMarker"},t)),this},e.dataRegion=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"dataRegion"},t)),this},e.html=function(t){return void 0===t&&(t={}),this.options.push(i.mix({type:"html"},t)),this},e.render=function(t){var e=this,n=e.view,r=n&&n.get("data"),a=e._creatGuides();i.each(a,function(i){var a;a=i.get("top")?e.frontGroup||e.frontContainer:e.backGroup||e.backContainer,i.render(t,a,r,n)})},e.clear=function(){this.options=[],this.reset()},e.changeVisible=function(t){var e=this.guides;i.each(e,function(e){e.changeVisible(t)})},e.reset=function(){var t=this.guides;i.each(t,function(t){t.clear()}),this.guides=[],this.backGroup&&this.backGroup.remove(),this.frontGroup&&this.frontGroup.remove()},t}();t.exports=a},function(t,e,n){var i=n(21).Guide,r=n(350);i.RegionFilter=r,t.exports=i},function(t,e,n){var i=n(0),r=n(15),a=n(25).Path,o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{name:"regionFilter",zIndex:1,top:!0,start:null,end:null,color:null,apply:null,style:{opacity:1}})},n.render=function(t,e,n,i){var r=this,a=e.addGroup();a.name="guide-region-filter",i.once("afterpaint",function(){if(!a.get("destroyed")){r._drawShapes(i,a);var e=r._drawClip(t);a.attr({clip:e}),r.set("clip",e),r.get("appendInfo")&&a.setSilent("appendInfo",r.get("appendInfo")),r.set("el",a)}})},n._drawShapes=function(t,e){var n=this,r=[];return t.getAllGeoms().map(function(t){var a=t.getShapes(),o=t.get("type");return n._geomFilter(o)&&a.map(function(t){var a=t.type,o=i.cloneDeep(t.attr());n._adjustDisplay(o);var s=e.addShape(a,{attrs:o});return r.push(s),t}),t}),r},n._drawClip=function(t){var e=this.parsePoint(t,this.get("start")),n=this.parsePoint(t,this.get("end")),i=[["M",e.x,e.y],["L",n.x,e.y],["L",n.x,n.y],["L",e.x,n.y],["z"]];return new a({attrs:{path:i,opacity:1}})},n._adjustDisplay=function(t){var e=this.get("color");t.fill&&(t.fill=t.fillStyle=e),t.stroke=t.strokeStyle=e},n._geomFilter=function(t){var e=this.get("apply");return!e||i.contains(e,t)},n.clear=function(){t.prototype.clear.call(this);var e=this.get("clip");e&&e.remove()},e}(r);t.exports=o},function(t,e,n){var i=n(0),r=n(21).Legend,a=n(352),o=n(18),s=n(166),l=n(168),u=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,c=function(){function t(t){this.options={},i.mix(this,t),this.clear();var e=this.chart;this.container=e.get("frontPlot"),this.plotRange=e.get("plotRange")}var e=t.prototype;return e.clear=function(){var t=this.legends;this.backRange=null,i.each(t,function(t){i.each(t,function(t){t.destroy()})}),this.legends={}},e.getBackRange=function(){var t=this.backRange;if(!t){var e=this.chart.get("backPlot");t=s(e,l(this.chart.get("plotRange")));var n=this.plotRange;t.maxX-t.minX0){var a=e.getXScale(),o=e.getYScale(),s=a.field,l=o.field,u=t.get("origin")._origin,c=e.get("labelContainer").get("labelsGroup").get("children");i.each(c,function(e){var i=e.get("origin")||[];i[s]===u[s]&&i[l]===u[l]&&(e.set("visible",n),t.set("gLabel",e))})}}},e._bindFilterEvent=function(t,e){var n=this,r=this.chart,a=e.field;t.on("itemfilter",function(t){var e=t.range;r.filterShape(function(t,r,o){if(!i.isNil(t[a])){var s=t[a]>=e[0]&&t[a]<=e[1];return n._filterLabels(r,o,s),s}return!0});for(var o=r.getAllGeoms()||[],s=function(t){var n=o[t];"heatmap"===n.get("type")&&u(function(){n.drawWithRange(e)})},l=0;l1?l:n;if("left"===x[0]||"right"===x[0])s=u.br.y,m=this._getXAlign(x[0],o,n,c,g,d),_=e?e.get("group").get("y")+e.getHeight()+v:this._getYAlignVertical(x[1],s,b,c,0,d,a.get("height"));else if("top"===x[0]||"bottom"===x[0])if(_=this._getYAlignHorizontal(x[0],s,n,c,p,d),e){var w=e.getWidth();m=e.get("group").get("x")+w+v}else m=this._getXAlign(x[1],o,b,c,0,d),"right"===x[1]&&(m=u.br.x-b.totalWidth);t.move(m+h,_+f)},e._getXAlign=function(t,e,n,i,r,a){var o="left"===t?i.minX-r-a[3]:i.maxX+a[1];return"center"===t&&(o=(e-n.totalWidth)/2),o},e._getYAlignHorizontal=function(t,e,n,i,r,a){return"top"===t?i.minY-r-a[0]:i.maxY+a[2]},e._getYAlignVertical=function(t,e,n,i,r,a,o){var s="top"===t?i.minY-r-a[0]:e-n.totalHeight;return"center"===t&&(s=(o-n.totalHeight)/2),s},e._getSubRegion=function(t){var e=0,n=0,r=0,a=0;return i.each(t,function(t){var i=t.getWidth(),o=t.getHeight();e1){var g=Array(f.callback.length-1).fill("");c.color=f.mapping.apply(f,[l].concat(g)).join("")||b.defaultColor}else c.color=f.mapping(l).join("")||b.defaultColor;if(y&&p)if(p.callback&&p.callback.length>1){var v=Array(p.callback.length-1).fill("");m=p.mapping.apply(p,[l].concat(v)).join("")}else m=p.mapping(l).join("");var _=o.getShapeFactory(x).getMarkerCfg(m,c);i.isFunction(m)&&(_.symbol=m),d.push({value:r,dataValue:l,checked:h,marker:_})});var A=i.deepMix({},b.legend[M[0]],h[c]||h,{viewId:_.get("_id"),maxLength:C,items:d,container:g,position:[0,0]});A.title&&i.deepMix(A,{title:{text:t.alias||t.field}});var k;if(u._isTailLegend(h,n))A.chart=u.chart,A.geom=n,k=new a(A);else if(h.useHtml){var P=g.get("canvas").get("el");if(g=h.container,i.isString(g)&&/^\#/.test(g)){var T=g.replace("#","");g=document.getElementById(T)}g||(g=P.parentNode),A.container=g,void 0===A.legendStyle&&(A.legendStyle={}),A.legendStyle.CONTAINER_CLASS={position:"absolute",overflow:"auto","z-index":""===P.style.zIndex?1:parseInt(P.style.zIndex,10)+1},h.flipPage?(A.legendStyle.CONTAINER_CLASS.height="right"===M[0]||"left"===M[0]?C+"px":"auto",A.legendStyle.CONTAINER_CLASS.width="right"!==M[0]&&"left"!==M[0]?C+"px":"auto",k=new r.CatPageHtml(A)):k=new r.CatHtml(A)}else k=new r.Category(A);return u._bindClickEvent(k,t,s),p[l].push(k),k},e._bindChartMove=function(t){var e=this.chart,n=this.legends;e.on("plotmove",function(e){var r=!1;if(e.target){var a=e.target.get("origin");if(a){var o=a._origin||a[0]._origin,s=t.field;if(o){var l=o[s];i.each(n,function(t){i.each(t,function(t){r=!0,!t.destroyed&&t.activate(l)})})}}}r||i.each(n,function(t){i.each(t,function(t){!t.destroyed&&t.deactivate()})})})},e._addContinuousLegend=function(t,e,n){var a=this.legends;a[n]=a[n]||[];var o,s,l,u=this.container,c=t.field,h=t.getTicks(),f=[],p=this.viewTheme;i.each(h,function(n){var i=n.value,r=t.invert(i),a=e.mapping(r).join("");f.push({value:n.tickValue,attrValue:a,color:a,scaleValue:i}),0===i&&(s=!0),1===i&&(l=!0)}),s||f.push({value:t.min,attrValue:e.mapping(0).join(""),color:e.mapping(0).join(""),scaleValue:0}),l||f.push({value:t.max,attrValue:e.mapping(1).join(""),color:e.mapping(1).join(""),scaleValue:1});var g=this.options,d=n.split("-"),v=p.legend[d[0]];(g&&!1===g.slidable||g[c]&&!1===g[c].slidable)&&(v=i.mix({},v,p.legend.gradient));var y=i.deepMix({},v,g[c]||g,{items:f,attr:e,formatter:t.formatter,container:u,position:[0,0]});if(y.title&&i.deepMix(y,{title:{text:t.alias||t.field}}),"color"===e.type)o=new r.Color(y);else{if("size"!==e.type)return;o=g&&"circle"===g.sizeType?new r.CircleSize(y):new r.Size(y)}return this._bindFilterEvent(o,t),a[n].push(o),o},e._isTailLegend=function(t,e){if(t.hasOwnProperty("attachLast")&&t.attachLast){var n=e.get("type");if("line"===n||"lineStack"===n||"area"===n||"areaStack"===n)return!0}return!1},e._adjustPosition=function(t,e){var n;if(e)n="right-top";else if(i.isArray(t))n=String(t[0])+"-"+String(t[1]);else{var r=t.split("-");1===r.length?("left"===r[0]&&(n="left-bottom"),"right"===r[0]&&(n="right-bottom"),"top"===r[0]&&(n="top-center"),"bottom"===r[0]&&(n="bottom-center")):n=t}return n},e.addLegend=function(t,e,n,i){var r=this.options,a=t.field,o=r[a],s=this.viewTheme;if(!1===o)return null;if(o&&o.custom)this.addCustomLegend(a);else{var l=r.position||s.defaultLegendPosition;l=this._adjustPosition(l,this._isTailLegend(r,n)),o&&o.position&&(l=this._adjustPosition(o.position,this._isTailLegend(o,n)));var u;(u=t.isLinear?this._addContinuousLegend(t,e,l):this._addCategoryLegend(t,e,n,i,l))&&(this._bindHoverEvent(u,a),r.reactive&&this._bindChartMove(t))}},e.addCustomLegend=function(t){var e=this.chart,n=this.viewTheme,a=this.container,o=this.options;t&&(o=o[t]);var s=o.position||n.defaultLegendPosition;s=this._adjustPosition(s);var l=this.legends;l[s]=l[s]||[];var u=o.items;if(u){var c=e.getAllGeoms();i.each(u,function(t){var e=function(t,e){var n;return i.each(t,function(t){t.get("visible")&&t.getYScale().field===e&&(n=t)}),n}(c,t.value);i.isObject(t.marker)?t.marker.radius=t.marker.radius||4.5:t.marker={symbol:t.marker?t.marker:"circle",fill:t.fill,radius:4.5},t.checked=!!i.isNil(t.checked)||t.checked,t.geom=e});var h,f=e.get("canvas"),p=this.plotRange,g=s.split("-"),d="right"===g[0]||"left"===g[0]?p.bl.y-p.tr.y:f.get("width"),v=i.deepMix({},n.legend[g[0]],o,{maxLength:d,items:u,container:a,position:[0,0]});if(o.useHtml){var y=o.container;if(/^\#/.test(a)){var x=y.replace("#","");y=document.getElementById(x)}else y||(y=a.get("canvas").get("el").parentNode);v.container=y,void 0===v.legendStyle&&(v.legendStyle={}),v.legendStyle.CONTAINER_CLASS||(v.legendStyle.CONTAINER_CLASS={height:"right"===g[0]||"left"===g[0]?d+"px":"auto",width:"right"!==g[0]&&"left"!==g[0]?d+"px":"auto",position:"absolute",overflow:"auto"}),h=o.flipPage?new r.CatPageHtml(v):new r.CatHtml(v)}else h=new r.Category(v);return l[s].push(h),h.on("itemclick",function(t){o.onClick&&o.onClick(t)}),this._bindHoverEvent(h),h}},e.addMixedLegend=function(t,e){var n=[];i.each(t,function(t){var r=t.field;i.each(e,function(e){if(e.getYScale()===t&&t.values&&t.values.length>0){var i=e.get("shapeType")||"point",a=e.getDefaultValue("shape")||"circle",s=o.getShapeFactory(i),l={color:e.getDefaultValue("color")},u=s.getMarkerCfg(a,l),c={value:r,marker:u};n.push(c)}})});var r={custom:!0,items:n};this.options=i.deepMix({},r,this.options);var a=this.addCustomLegend();this._bindClickEventForMix(a)},e.alignLegends=function(){var t=this,e=t.legends,n=t._getRegion(e);t.totalRegion=n;var r=0;return i.each(e,function(e,a){var o=n.subs[r];i.each(e,function(n,i){var r=e[i-1];n.get("useHtml")&&!n.get("autoPosition")||t._alignLegend(n,r,o,a)}),r++}),this},t}();t.exports=c},function(t,e,n){var i=n(0),r=n(21),a=n(7),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{type:"tail-legend",layout:"vertical",autoLayout:!0})},n._addItem=function(t){var e=this.get("itemsGroup"),n=this._getNextX(),r=this.get("unCheckColor"),a=e.addGroup({x:0,y:0,value:t.value,scaleValue:t.scaleValue,checked:t.checked});a.translate(n,0),a.set("viewId",e.get("viewId"));var o=this.get("textStyle"),s=this.get("_wordSpaceing"),l=0;if(t.marker){var u=i.mix({},t.marker,{x:t.marker.radius,y:0});t.checked||(u.fill&&(u.fill=r),u.stroke&&(u.stroke=r));var c=a.addShape("marker",{type:"marker",attrs:u});c.attr("cursor","pointer"),c.name="legend-marker",l+=c.getBBox().width+s}var h=i.mix({},o,{x:l,y:0,text:this._formatItemValue(t.value)});t.checked||i.mix(h,{fill:r});var f=a.addShape("text",{attrs:h});f.attr("cursor","pointer"),f.name="legend-text",this.get("appendInfo")&&f.setSilent("appendInfo",this.get("appendInfo"));var p=a.getBBox(),g=this.get("itemWidth"),d=a.addShape("rect",{attrs:{x:n,y:0-p.height/2,fill:"#fff",fillOpacity:0,width:g||p.width,height:p.height}});return d.attr("cursor","pointer"),d.setSilent("origin",t),d.name="legend-item",this.get("appendInfo")&&d.setSilent("appendInfo",this.get("appendInfo")),a.name="legendGroup",a},n._adjust=function(){if(this.get("geom")){this.get("group").attr("matrix")[7]=0;var t=this.get("geom").get("dataArray"),e=this.get("itemsGroup").get("children"),n=0;i.each(e,function(e){var r=t[n],a=r[r.length-1].y;i.isArray(a)&&(a=a[1]);var o=e.getBBox().height,s=e.get("x"),l=a-o/2;e.translate(s,l),n++}),this.get("autoLayout")&&this._antiCollision(e)}},n.render=function(){var e=this;t.prototype.render.call(this);this.get("chart").once("afterpaint",function(){e._adjust()})},n._getPreviousY=function(t){return t.attr("matrix")[7]+t.getBBox().height},n._adjustDenote=function(t,e,n){var i=2*-a.legend.legendMargin;t.addShape("path",{attrs:{path:"M-2,"+e+"L"+i+","+(n+3),lineWidth:1,lineDash:[2,2],stroke:"#999999"}})},n._antiCollision=function(t){var e=this;t.sort(function(t,e){return t.attr("matrix")[7]-e.attr("matrix")[7]});var n=!0,i=e.get("chart").get("plotRange"),r=i.tl.y,a=Math.abs(r-i.bl.y),o=t[0].getBBox().height,s=Number.MIN_VALUE,l=0,u=t.map(function(t){var e=t.attr("matrix")[7];return e>l&&(l=e),e0){var g=u[c-1],d=u[c];g.pos+g.size>d.pos&&(g.size+=d.size,g.targets=g.targets.concat(d.targets),u.splice(c,1),n=!0)}}c=0;var v=this.get("itemsGroup").addGroup();u.forEach(function(n){var i=r+o;n.targets.forEach(function(){var r=t[c].attr("matrix")[7],a=n.pos+i-o/2;Math.abs(r-a)>o/2&&e._adjustDenote(v,a,r-e.get("group").attr("matrix")[7]/2),t[c].translate(0,-r),t[c].translate(0,a),i+=o,c++})})},e}(r.Legend.Category);t.exports=o},function(t,e,n){function i(t,e){if(!t)return!1;return!!t.className&&-1!==(a.isNil(t.className.baseVal)?t.className:t.className.baseVal).indexOf(e)}function r(t){var e=[];return a.each(t,function(t){var n=function(t,e){var n=-1;return a.each(t,function(t,i){var r=!0;for(var o in e)if(e.hasOwnProperty(o)&&-1===h.indexOf(o)&&!a.isObject(e[o])&&e[o]!==t[o]){r=!1;break}if(r)return n=i,!1}),n}(e,t);-1===n?e.push(t):e[n]=t}),e}var a=n(0),o=n(18),s=n(21).Tooltip,l=a.MatrixUtil.vec2,u=["line","area","path","areaStack"],c=["line","area"],h=["marker","showMarker"],f=function(){function t(t){a.assign(this,t),this.timeStamp=0}var e=t.prototype;return e._normalizeEvent=function(t){var e=this.chart,n=this._getCanvas(),i=n.getPointByClient(t.clientX,t.clientY),r=n.get("pixelRatio");i.x=i.x/r,i.y=i.y/r;var a=e.getViewsByPoint(i);return i.views=a,i},e._getCanvas=function(){return this.chart.get("canvas")},e._getTriggerEvent=function(){var t,e=this.options.triggerOn;return e&&"mousemove"!==e?"click"===e?t="plotclick":"none"===e&&(t=null):t="plotmove",t},e._getDefaultTooltipCfg=function(){var t=this.chart,e=this.viewTheme,n=this.options,i=a.mix({},e.tooltip),r=t.getAllGeoms().filter(function(t){return t.get("visible")}),o=[];a.each(r,function(t){var e=t.get("type"),n=t.get("adjusts"),i=!1;n&&a.each(n,function(t){if("symmetric"===t.type||"Symmetric"===t.type)return i=!0,!1}),-1!==a.indexOf(o,e)||i||o.push(e)});var s,l=!(!r.length||!r[0].get("coord"))&&r[0].get("coord").isTransposed;if(r.length&&r[0].get("coord")&&"cartesian"===r[0].get("coord").type)if("interval"===o[0]&&!1!==n.shared){var u=a.mix({},e.tooltipCrosshairsRect);u.isTransposed=l,s={zIndex:0,crosshairs:u}}else if(a.indexOf(c,o[0])>-1){var h=a.mix({},e.tooltipCrosshairsLine);h.isTransposed=l,s={crosshairs:h}}return a.mix(i,s,{})},e._bindEvent=function(){var t=this.chart,e=this._getTriggerEvent();e&&(t.on(e,a.wrapBehavior(this,"onMouseMove")),t.on("plotleave",a.wrapBehavior(this,"onMouseOut")))},e._offEvent=function(){var t=this.chart,e=this._getTriggerEvent();e&&(t.off(e,a.getWrapBehavior(this,"onMouseMove")),t.off("plotleave",a.getWrapBehavior(this,"onMouseOut")))},e._setTooltip=function(t,e,n,i){var o=this.tooltip,s=this.prePoint;if(!s||s.x!==t.x||s.y!==t.y){e=r(e),this.prePoint=t;var l=this.chart,u=this.viewTheme,c=a.isArray(t.x)?t.x[t.x.length-1]:t.x,h=a.isArray(t.y)?t.y[t.y.length-1]:t.y;o.get("visible")||l.emit("tooltip:show",{x:c,y:h,tooltip:o});var f=e[0],p=f.title||f.name;o.isContentChange(p,e)&&(l.emit("tooltip:change",{tooltip:o,x:c,y:h,items:e}),p=e[0].title||e[0].name,o.setContent(p,e),a.isEmpty(n)?(o.clearMarkers(),o.set("markerItems",[])):!0===this.options.hideMarkers?o.set("markerItems",n):o.setMarkers(n,u.tooltipMarker));i===this._getCanvas()&&"mini"===o.get("type")?o.hide():(o.setPosition(c,h,i),o.show())}},e.hideTooltip=function(){var t=this.tooltip,e=this.chart,n=this._getCanvas();this.prePoint=null,t.hide(),e.emit("tooltip:hide",{tooltip:t}),n.draw()},e.onMouseMove=function(t){if(!a.isEmpty(t.views)){var e=this.timeStamp,n=+new Date,i={x:t.x,y:t.y};n-e>16&&!this.chart.get("stopTooltip")&&(this.showTooltip(i,t.views,t.shape),this.timeStamp=n)}},e.onMouseOut=function(t){var e=this.tooltip;e.get("visible")&&e.get("follow")&&(t&&t.toElement&&(i(t.toElement,"g2-tooltip")||function(t,e){for(var n=t.parentNode,r=!1;n&&n!==document.body;){if(i(n,e)){r=!0;break}n=n.parentNode}return r}(t.toElement,"g2-tooltip"))||this.hideTooltip())},e.renderTooltip=function(){var t=this;if(!t.tooltip){var e=t.chart,n=t.viewTheme,i=t._getCanvas(),r=t._getDefaultTooltipCfg(),o=t.options;(o=a.deepMix({plotRange:e.get("plotRange"),capture:!1,canvas:i,frontPlot:e.get("frontPlot"),viewTheme:n.tooltip,backPlot:e.get("backPlot")},r,o)).crosshairs&&"rect"===o.crosshairs.type&&(o.zIndex=0),o.visible=!1;var l;"mini"===o.type?(o.crosshairs=!1,o.position="top",l=new s.Mini(o)):l=o.useHtml?new s.Html(o):new s.Canvas(o),t.tooltip=l;var u=t._getTriggerEvent();if(!l.get("enterable")&&"plotmove"===u){var c=l.get("container");c&&(c.onmousemove=function(n){var i=t._normalizeEvent(n);e.emit(u,i)})}t._bindEvent()}},e.showTooltip=function(t,e,n){var i=this;if(!a.isEmpty(e)&&t){this.tooltip||this.renderTooltip();var r=i.options,o=[],s=[];if(a.each(e,function(e){if(!e.get("tooltipEnable"))return!0;var n=e.get("geoms"),l=e.get("coord");a.each(n,function(e){var n=e.get("type");if(e.get("visible")&&!1!==e.get("tooltipCfg")){var c=e.get("dataArray");if(e.isShareTooltip()||!1===r.shared&&a.inArray(["area","line","path","polygon"],n))a.each(c,function(c){var h=e.findPoint(t,c);if(h){var f=e.getTipItems(h,r.title);a.each(f,function(t){var r=t.point;if(r&&r.x&&r.y){var s=a.isArray(r.x)?r.x[r.x.length-1]:r.x,c=a.isArray(r.y)?r.y[r.y.length-1]:r.y;r=l.applyMatrix(s,c,1),t.x=r[0],t.y=r[1],t.showMarker=!0;var h=i._getItemMarker(e,t.color);t.marker=h,-1!==a.indexOf(u,n)&&o.push(t)}}),s=s.concat(f)}});else{var h=e.get("shapeContainer"),f=h.get("canvas").get("pixelRatio"),p=h.getShape(t.x*f,t.y*f);p&&p.get("visible")&&p.get("origin")&&(s=e.getTipItems(p.get("origin"),r.title))}}}),a.each(s,function(t){var e=t.point,n=a.isArray(e.x)?e.x[e.x.length-1]:e.x,i=a.isArray(e.y)?e.y[e.y.length-1]:e.y;e=l.applyMatrix(n,i,1),t.x=e[0],t.y=e[1]})}),s.length){var c=s[0];if(!s.every(function(t){return t.title===c.title})){var h=c,f=1/0;s.forEach(function(e){var n=l.distance([t.x,t.y],[e.x,e.y]);n1){var p=s[0],g=Math.abs(t.y-p.y);a.each(s,function(e){Math.abs(t.y-e.y)<=g&&(p=e,g=Math.abs(t.y-e.y))}),p&&p.x&&p.y&&(o=[p]),s=[p]}i._setTooltip(t,s,o,n)}else i.hideTooltip()}},e.clear=function(){var t=this.tooltip;t&&t.destroy(),this.tooltip=null,this.prePoint=null,this._offEvent()},e._getItemMarker=function(t,e){var n=t.get("shapeType")||"point",i=t.getDefaultValue("shape")||"circle",r={color:e};return o.getShapeFactory(n).getMarkerCfg(i,r)},t}();t.exports=f},function(t,e,n){function i(t,e){if(a.isNil(t)||a.isNil(e))return!1;var n=t.get("origin"),i=e.get("origin");return a.isNil(n)&&a.isNil(i)?a.isEqual(t,e):a.isEqual(n,i)}function r(t){t.shape&&t.shape.get("origin")&&(t.data=t.shape.get("origin"))}var a=n(0),o=function(){function t(t){this.view=null,this.canvas=null,a.assign(this,t),this._init()}var e=t.prototype;return e._init=function(){this.pixelRatio=this.canvas.get("pixelRatio")},e._getShapeEventObj=function(t){return{x:t.x/this.pixelRatio,y:t.y/this.pixelRatio,target:t.target,toElement:t.event.toElement||t.event.relatedTarget}},e._getShape=function(t,e){return this.view.get("canvas").getShape(t,e)},e._getPointInfo=function(t){var e=this.view,n={x:t.x/this.pixelRatio,y:t.y/this.pixelRatio},i=e.getViewsByPoint(n);return n.views=i,n},e._getEventObj=function(t,e,n){return{x:e.x,y:e.y,target:t.target,toElement:t.event.toElement||t.event.relatedTarget,views:n}},e.bindEvents=function(){var t=this.canvas;t.on("mousedown",a.wrapBehavior(this,"onDown")),t.on("mousemove",a.wrapBehavior(this,"onMove")),t.on("mouseleave",a.wrapBehavior(this,"onOut")),t.on("mouseup",a.wrapBehavior(this,"onUp")),t.on("click",a.wrapBehavior(this,"onClick")),t.on("dblclick",a.wrapBehavior(this,"onClick")),t.on("touchstart",a.wrapBehavior(this,"onTouchstart")),t.on("touchmove",a.wrapBehavior(this,"onTouchmove")),t.on("touchend",a.wrapBehavior(this,"onTouchend"))},e._triggerShapeEvent=function(t,e,n){if(t&&t.name&&!t.get("destroyed")){var i=this.view;if(i.isShapeInView(t)){var r=t.name+":"+e;n.view=i,n.appendInfo=t.get("appendInfo"),i.emit(r,n);var a=i.get("parent");a&&a.emit(r,n)}}},e.onDown=function(t){var e=this.view,n=this._getShapeEventObj(t);n.shape=this.currentShape,r(n),e.emit("mousedown",n),this._triggerShapeEvent(this.currentShape,"mousedown",n)},e.onMove=function(t){var e=this.view,n=this.currentShape;n&&n.get("destroyed")&&(n=null,this.currentShape=null);var a=this._getShape(t.x,t.y)||t.currentTarget,o=this._getShapeEventObj(t);if(o.shape=a,r(o),e.emit("mousemove",o),this._triggerShapeEvent(a,"mousemove",o),n&&!i(n,a)){var s=this._getShapeEventObj(t);s.shape=n,s.toShape=a,r(s),this._triggerShapeEvent(n,"mouseleave",s)}if(a&&!i(n,a)){var l=this._getShapeEventObj(t);l.shape=a,l.fromShape=n,r(l),this._triggerShapeEvent(a,"mouseenter",l)}this.currentShape=a;var u=this._getPointInfo(t),c=this.curViews||[];0===c.length&&u.views.length&&e.emit("plotenter",this._getEventObj(t,u,u.views)),c.length&&0===u.views.length&&e.emit("plotleave",this._getEventObj(t,u,c)),u.views.length&&((o=this._getEventObj(t,u,u.views)).shape=a,r(o),e.emit("plotmove",o)),this.curViews=u.views},e.onOut=function(t){var e=this.view,n=this._getPointInfo(t),i=this.curViews||[],r=this._getEventObj(t,n,i);!this.curViews||0===this.curViews.length||r.toElement&&"CANVAS"===r.toElement.tagName||(e.emit("plotleave",r),this.curViews=[])},e.onUp=function(t){var e=this.view,n=this._getShapeEventObj(t);n.shape=this.currentShape,e.emit("mouseup",n),this._triggerShapeEvent(this.currentShape,"mouseup",n)},e.onClick=function(t){var e=this.view,n=this._getShape(t.x,t.y)||t.currentTarget,i=this._getShapeEventObj(t);i.shape=n,r(i),e.emit("click",i),this._triggerShapeEvent(n,t.type,i),this.currentShape=n;var o=this._getPointInfo(t),s=o.views;if(!a.isEmpty(s)){var l=this._getEventObj(t,o,s);if(this.currentShape){var u=this.currentShape;l.shape=u,r(l)}e.emit("plotclick",l),"dblclick"===t.type&&(e.emit("plotdblclick",l),e.emit("dblclick",i))}},e.onTouchstart=function(t){var e=this.view,n=this._getShape(t.x,t.y)||t.currentTarget,i=this._getShapeEventObj(t);i.shape=n,r(i),e.emit("touchstart",i),this._triggerShapeEvent(n,"touchstart",i),this.currentShape=n},e.onTouchmove=function(t){var e=this.view,n=this._getShape(t.x,t.y)||t.currentTarget,i=this._getShapeEventObj(t);i.shape=n,r(i),e.emit("touchmove",i),this._triggerShapeEvent(n,"touchmove",i),this.currentShape=n},e.onTouchend=function(t){var e=this.view,n=this._getShapeEventObj(t);n.shape=this.currentShape,r(n),e.emit("touchend",n),this._triggerShapeEvent(this.currentShape,"touchend",n)},e.clearEvents=function(){var t=this.canvas;t.off("mousemove",a.getWrapBehavior(this,"onMove")),t.off("mouseleave",a.getWrapBehavior(this,"onOut")),t.off("mousedown",a.getWrapBehavior(this,"onDown")),t.off("mouseup",a.getWrapBehavior(this,"onUp")),t.off("click",a.getWrapBehavior(this,"onClick")),t.off("dblclick",a.getWrapBehavior(this,"onClick")),t.off("touchstart",a.getWrapBehavior(this,"onTouchstart")),t.off("touchmove",a.getWrapBehavior(this,"onTouchmove")),t.off("touchend",a.getWrapBehavior(this,"onTouchend"))},t}();t.exports=o},function(t,e,n){function i(t,e){var n=[];if(!1===t.get("animate"))return[];var r=t.get("children");return s.each(r,function(t){if(t.isGroup)n=n.concat(i(t,e));else if(t.isShape&&t._id){var r=t._id;(r=r.split("-")[0])===e&&n.push(t)}}),n}function r(t,e,n,i){return i?l.Action[n][i]:l.getAnimation(t,e,n)}function a(t,e,n){var i=l.getAnimateCfg(t,e);return n&&n[e]?s.deepMix({},i,n[e]):i}function o(t,e,n,i){var o,l,c=!1;if(i){var h=[],f=[];s.each(e,function(e){var n=t[e._id];n?(e.setSilent("cacheShape",n),h.push(e),delete t[e._id]):f.push(e)}),s.each(t,function(t){var e=t.name,i=t.coord,h=t._id,f=t.attrs,p=t.index,g=t.type;if(l=a(e,"leave",t.animateCfg),o=r(e,i,"leave",l.animation),s.isFunction(o)){var d=n.addShape(g,{attrs:f,index:p});if(d._id=h,d.name=e,i&&"label"!==e){var v=d.getMatrix(),y=u.multiply([],v,i.matrix);d.setMatrix(y)}c=!0,o(d,l,i)}}),s.each(h,function(t){var e=t.name,n=t.get("coord"),i=t.get("cacheShape").attrs;if(!s.isEqual(i,t.attr())){if(l=a(e,"update",t.get("animateCfg")),o=r(e,n,"update",l.animation),s.isFunction(o))o(t,l,n);else{var u=s.cloneDeep(t.attr());t.attr(i),t.animate(u,l.duration,l.easing,function(){t.setSilent("cacheShape",null)})}c=!0}}),s.each(f,function(t){var e=t.name,n=t.get("coord");l=a(e,"enter",t.get("animateCfg")),o=r(e,n,"enter",l.animation),s.isFunction(o)&&(o(t,l,n),c=!0)})}else s.each(e,function(t){var e=t.name,n=t.get("coord");l=a(e,"appear",t.get("animateCfg")),o=r(e,n,"appear",l.animation),s.isFunction(o)&&(o(t,l,n),c=!0)});return c}var s=n(0),l=n(126),u=s.MatrixUtil.mat3;t.exports={execAnimation:function(t,e){var n=t.get("middlePlot"),r=t.get("backPlot"),a=t.get("_id"),l=t.get("canvas"),u=l.get(a+"caches")||[];0===u.length&&(e=!1);var c=i(n,a),h=i(r,a),f=c.concat(h);l.setSilent(a+"caches",function(t){var e={};return s.each(t,function(t){if(t._id&&!t.isClip){var n=t._id;e[n]={_id:n,type:t.get("type"),attrs:s.cloneDeep(t.attr()),name:t.name,index:t.get("index"),animateCfg:t.get("animateCfg"),coord:t.get("coord")}}}),e}(f));(e?o(u,f,l,e):o(u,c,l,e))||l.draw()}}},function(t,e,n){var i=n(0),r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{type:"plotBack",padding:null,background:null,plotRange:null,plotBackground:null}},n._beforeRenderUI=function(){this._calculateRange()},n._renderUI=function(){this._renderBackground(),this._renderPlotBackground()},n._renderBackground=function(){var t=this.get("background");if(t){var e=this.get("canvas"),n={x:0,y:0,width:this.get("width")||e.get("width"),height:this.get("height")||e.get("height")},r=this.get("backgroundShape");r?r.attr(n):(r=this.addShape("rect",{attrs:i.mix(n,t)}),this.set("backgroundShape",r))}},n._renderPlotBackground=function(){var t=this.get("plotBackground");if(t){var e=this.get("plotRange"),n=e.br.x-e.bl.x,r=e.br.y-e.tr.y,a=e.tl,o={x:a.x,y:a.y,width:n,height:r},s=this.get("plotBackShape");s?s.attr(o):(t.image?(o.img=t.image,s=this.addShape("image",{attrs:o})):(i.mix(o,t),s=this.addShape("rect",{attrs:o})),this.set("plotBackShape",s))}},n._convert=function(t,e){if(i.isString(t))if("auto"===t)t=0;else if(-1!==t.indexOf("%")){var n=this.get("canvas"),r=this.get("width")||n.get("width"),a=this.get("height")||n.get("height");t=parseInt(t,10)/100,t=e?t*r:t*a}return t},n._calculateRange=function(){var t=this.get("plotRange");i.isNil(t)&&(t={});var e=this.get("padding"),n=this.get("canvas"),r=this.get("width")||n.get("width"),a=this.get("height")||n.get("height"),o=i.toAllPadding(e),s=this._convert(o[0],!1),l=this._convert(o[1],!0),u=this._convert(o[2],!1),c=this._convert(o[3],!0),h=Math.min(c,r-l),f=Math.max(c,r-l),p=Math.min(a-u,s),g=Math.max(a-u,s);t.tl={x:h,y:p},t.tr={x:f,y:p},t.bl={x:h,y:g},t.br={x:f,y:g},t.cc={x:(f+h)/2,y:(g+p)/2},this.set("plotRange",t)},n.repaint=function(){return this._calculateRange(),this._renderBackground(),this._renderPlotBackground(),this},e}(n(16).Group);t.exports=r},function(t,e,n){var i=n(7),r=n(0),a={getDefaultSize:function(){var t=this.get("defaultSize"),e=this.get("viewTheme")||i;if(!t){var n,a=this.get("coord"),o=this.getXScale(),s=o.values,l=this.get("dataArray");if(o.isLinear&&s.length>1){s.sort();var u=function(t,e){var n=t.length;r.isString(t[0])&&(t=t.map(function(t){return e.translate(t)}));for(var i=t[1]-t[0],a=2;ao&&(i=o)}return i}(s,o);n=(o.max-o.min)/u,s.length>n&&(n=s.length)}else n=s.length;var c=o.range,h=1/n,f=1;if(this.isInCircle()?f=a.isTransposed&&n>1?e.widthRatio.multiplePie:e.widthRatio.rose:(o.isLinear&&(h*=c[1]-c[0]),f=e.widthRatio.column),h*=f,this.hasAdjust("dodge")){h/=this._getDodgeCount(l)}t=h,this.set("defaultSize",t)}return t},_getDodgeCount:function(t){var e,n=this.get("adjusts"),i=t.length;if(r.each(n,function(t){"dodge"===t.type&&(e=t.dodgeBy)}),e){var a=r.Array.merge(t);i=r.Array.values(a,e).length}return i},getDimWidth:function(t){var e=this.get("coord"),n=e.convertPoint({x:0,y:0}),i=e.convertPoint({x:"x"===t?1:0,y:"x"===t?0:1}),r=0;return n&&i&&(r=Math.sqrt(Math.pow(i.x-n.x,2)+Math.pow(i.y-n.y,2))),r},_getWidth:function(){var t=this.get("coord");return this.isInCircle()&&!t.isTransposed?(t.endAngle-t.startAngle)*t.radius:this.getDimWidth("x")},_toNormalizedSize:function(t){return t/this._getWidth()},_toCoordSize:function(t){return this._getWidth()*t},getNormalizedSize:function(t){var e=this.getAttrValue("size",t);return e=r.isNil(e)?this.getDefaultSize():this._toNormalizedSize(e)},getSize:function(t){var e=this.getAttrValue("size",t);if(r.isNil(e)){var n=this.getDefaultSize();e=this._toCoordSize(n)}return e}};t.exports=a},function(t,e,n){var i=n(0),r=n(7);t.exports={splitData:function(t){var e=this.get("viewTheme")||r;if(!t.length)return[];var n,a=[],o=[],s=this.getYScale().field;return i.each(t,function(t){n=t._origin?t._origin[s]:t[s],e.connectNulls?i.isNil(n)||o.push(t):i.isArray(n)&&i.isNil(n[0])||i.isNil(n)?o.length&&(a.push(o),o=[]):o.push(t)}),o.length&&a.push(o),a}}},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(20),a=n(358),o=n(0),s=function(t){function e(e){var n;return n=t.call(this,e)||this,o.assign(i(i(n)),a),n}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="path",e.shapeType="line",e},n.getDrawCfg=function(e){var n=t.prototype.getDrawCfg.call(this,e);return n.isStack=this.hasStack(),n},n.draw=function(t,e,n,i){var r=this,a=this.splitData(t),s=this.getDrawCfg(t[0]);r._applyViewThemeShapeStyle(s,s.shape,n),s.origin=t,o.each(a,function(t,a){if(!o.isEmpty(t)){s.splitedIndex=a,s.points=t;var l=n.drawShape(s.shape,s,e);r.appendShapeInfo(l,i+a)}})},e}(r);r.Path=s,t.exports=s},function(t,e,n){"use strict";var i=n(370),r=n(371);e.a=function(t){var e=Object(i.a)(t);return(e.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===r.b&&e.documentElement.namespaceURI===r.b?e.createElement(t):e.createElementNS(n,t)}})(e)}},function(t,e,n){"use strict";e.a=function(t,e){var n=t.ownerSVGElement||t;if(n.createSVGPoint){var i=n.createSVGPoint();return i.x=e.clientX,i.y=e.clientY,i=i.matrixTransform(t.getScreenCTM().inverse()),[i.x,i.y]}var r=t.getBoundingClientRect();return[e.clientX-r.left-t.clientLeft,e.clientY-r.top-t.clientTop]}},function(t,e,n){"use strict";e.b=function(t,e,n){var r=t._id;return t.each(function(){var t=Object(i.h)(this,r);(t.value||(t.value={}))[e]=n.apply(this,arguments)}),function(t){return Object(i.f)(t,r).value[e]}};var i=n(70);e.a=function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var r,a=Object(i.f)(this.node(),n).tween,o=0,s=a.length;o0;)i-=2*Math.PI;var c=a-t+(i=i/Math.PI/2*n)-2*t;l.push(["M",c,e]);for(var h=0,f=0;f=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),i.a.hasOwnProperty(e)?{space:i.a[e],local:t}:t}},function(t,e,n){"use strict";n.d(e,"b",function(){return i});var i="http://www.w3.org/1999/xhtml";e.a={svg:"http://www.w3.org/2000/svg",xhtml:i,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}},function(t,e,n){"use strict";e.a=function(t){return null==t?function(){}:function(){return this.querySelector(t)}}},function(t,e,n){"use strict";e.a=function(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}},function(t,e,n){"use strict";function i(t,e,n){return function(i){var r=o;o=i;try{t.call(this,this.__data__,e,n)}finally{o=r}}}function r(t,e,n){var r=a.hasOwnProperty(t.type)?function(t,e,n){return t=i(t,e,n),function(e){var n=e.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||t.call(this,e)}}:i;return function(i,a,o){var s,l=this.__on,u=r(e,a,o);if(l)for(var c=0,h=l.length;c=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}})}(t+""),s=o.length;{if(!(arguments.length<2)){for(l=e?r:function(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;in.max&&(n.max=e.max)):"timeCat"===o?(i.each(s,function(t,e){s[e]=r.toTimeStamp(t)}),s.sort(function(t,e){return t-e}),n=s):n=s,n}},function(t,e,n){"use strict";var i=n(69);e.a=function(t){return"string"==typeof t?new i.a([[document.querySelector(t)]],[document.documentElement]):new i.a([[t]],i.c)}},function(t,e,n){"use strict";e.a=function(t){return null==t?function(){return[]}:function(){return this.querySelectorAll(t)}}},function(t,e,n){"use strict";var i=function(t){return function(){return this.matches(t)}};if("undefined"!=typeof document){var r=document.documentElement;if(!r.matches){var a=r.webkitMatchesSelector||r.msMatchesSelector||r.mozMatchesSelector||r.oMatchesSelector;i=function(t){return function(){return a.call(this,t)}}}}e.a=i},function(t,e,n){"use strict";function i(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}e.a=i;var r=n(383),a=n(69);e.b=function(){return new a.a(this._enter||this._groups.map(r.a),this._parents)},i.prototype={constructor:i,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}}},function(t,e,n){"use strict";e.a=function(t){return new Array(t.length)}},function(t,e,n){"use strict";function i(t,e){return t.style.getPropertyValue(e)||Object(r.a)(t).getComputedStyle(t,null).getPropertyValue(e)}e.b=i;var r=n(373);e.a=function(t,e,n){return arguments.length>1?this.each((null==e?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof e?function(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}:function(t,e,n){return function(){this.style.setProperty(t,e,n)}})(t,e,null==n?"":n)):i(this.node(),t)}},function(t,e,n){"use strict";var i=n(70);e.a=function(t,e){var n,r,a,o=t.__transition,s=!0;if(o){e=null==e?null:e+"";for(a in o)(n=o[a]).name===e?(r=n.state>i.d&&n.state0&&(o[0][0]="L"),i=i.concat(o)}),i.push(["Z"]),i}function o(t){return{symbol:function(t,e){return[["M",t-5.5,e-4],["L",t+5.5,e-4],["L",t+5.5,e+4],["L",t-5.5,e+4],["Z"]]},radius:5,fill:t.color,fillOpacity:.6}}var s=n(0),l=n(18),u=n(22),c=n(45),h=n(7),f=l.registerFactory("area",{defaultShapeType:"area",getDefaultPoints:function(t){var e=[],n=t.x,i=t.y,r=t.y0;return i=s.isArray(i)?i:[r,i],s.each(i,function(t){e.push({x:n,y:t})}),e},getActiveCfg:function(t,e){return function(t,e){if("line"===t||"smoothLine"===t)return{lineWidth:(e.lineWidth||0)+1};var n=e.fillOpacity||e.opacity||1;return{fillOpacity:n-.15,strokeOpacity:n-.15}}(t,e)},drawShape:function(t,e,n){var i,r=this.getShape(t);return(i=1===e.points.length&&h.showSinglePoint?function(t,e,n){var i=t._coord.convertPoint(e.points[0][1]);return n.addShape("circle",{attrs:s.mix({x:i.x,y:i.y,r:2,fill:e.color},e.style)})}(this,e,n):r.draw(e,n))&&(i.set("origin",e.origin),i._id=e.splitedIndex?e._id+e.splitedIndex:e._id,i.name=this.name),i},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});l.registerShape("area","area",{draw:function(t,e){var n=r(t),i=a(t,!1,this);return e.addShape("path",{attrs:s.mix(n,{path:i})})},getMarkerCfg:function(t){return o(t)}}),l.registerShape("area","smooth",{draw:function(t,e){var n=r(t),i=this._coord;t.constraint=[[i.start.x,i.end.y],[i.end.x,i.start.y]];var o=a(t,!0,this);return e.addShape("path",{attrs:s.mix(n,{path:o})})},getMarkerCfg:function(t){return o(t)}}),l.registerShape("area","line",{draw:function(t,e){var n=i(t),r=a(t,!1,this);return e.addShape("path",{attrs:s.mix(n,{path:r})})},getMarkerCfg:function(t){return o(t)}}),l.registerShape("area","smoothLine",{draw:function(t,e){var n=i(t),r=a(t,!0,this);return e.addShape("path",{attrs:s.mix(n,{path:r})})},getMarkerCfg:function(t){return o(t)}}),f.spline=f.smooth,t.exports=f},function(t,e,n){var i=n(20);n(393);var r=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="edge",e.shapeType="edge",e.generatePoints=!0,e},e}(i);i.Edge=r,t.exports=r},function(t,e,n){function i(t){var e=u.shape.edge,n=o.mix({},e,t.style);return l.addStrokeAttrs(n,t),n}function r(t,e){var n=[];n.push({x:t.x,y:.5*t.y+1*e.y/2}),n.push({y:.5*t.y+1*e.y/2,x:e.x}),n.push(e);var i=["C"];return o.each(n,function(t){i.push(t.x,t.y)}),i}function a(t,e){var n=[];n.push({x:e.x,y:e.y}),n.push(t);var i=["Q"];return o.each(n,function(t){i.push(t.x,t.y)}),i}var o=n(0),s=n(18),l=n(45),u=n(7),c=n(22),h=1/3,f=s.registerFactory("edge",{defaultShapeType:"line",getDefaultPoints:function(t){return l.splitPoints(t)},getActiveCfg:function(t,e){return{lineWidth:(e.lineWidth||0)+1}}});s.registerShape("edge","line",{draw:function(t,e){var n=this.parsePoints(t.points),r=i(t),a=c.getLinePath(n);return e.addShape("path",{attrs:o.mix(r,{path:a})})},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),s.registerShape("edge","vhv",{draw:function(t,e){var n=t.points,r=i(t),a=function(t,e){var n=[];n.push({y:t.y*(1-h)+e.y*h,x:t.x}),n.push({y:t.y*(1-h)+e.y*h,x:e.x}),n.push(e);var i=[["M",t.x,t.y]];return o.each(n,function(t){i.push(["L",t.x,t.y])}),i}(n[0],n[1]);a=this.parsePath(a);return e.addShape("path",{attrs:o.mix(r,{path:a})})},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),s.registerShape("edge","smooth",{draw:function(t,e){var n=t.points,a=i(t),s=function(t,e){var n=r(t,e),i=[["M",t.x,t.y]];return i.push(n),i}(n[0],n[1]);s=this.parsePath(s);return e.addShape("path",{attrs:o.mix(a,{path:s})})},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),s.registerShape("edge","arc",{draw:function(t,e){var n,s,l=t.points,u=l.length>2?"weight":"normal",c=i(t);if(t.isInCircle){var h={x:0,y:1};"normal"===u?s=function(t,e,n){var i=a(e,n),r=[["M",t.x,t.y]];return r.push(i),r}(l[0],l[1],h):(c.fill=c.stroke,s=function(t,e){var n=a(t[1],e),i=a(t[3],e),r=[["M",t[0].x,t[0].y]];return r.push(i),r.push(["L",t[3].x,t[3].y]),r.push(["L",t[2].x,t[2].y]),r.push(n),r.push(["L",t[1].x,t[1].y]),r.push(["L",t[0].x,t[0].y]),r.push(["Z"]),r}(l,h)),s=this.parsePath(s),n=e.addShape("path",{attrs:o.mix(c,{path:s})})}else if("normal"===u)l=this.parsePoints(l),n=e.addShape("arc",{attrs:o.mix(c,{x:(l[1].x+l[0].x)/2,y:l[0].y,r:Math.abs(l[1].x-l[0].x)/2,startAngle:Math.PI,endAngle:2*Math.PI})});else{s=[["M",l[0].x,l[0].y],["L",l[1].x,l[1].y]];var f=r(l[1],l[3]),p=r(l[2],l[0]);s.push(f),s.push(["L",l[3].x,l[3].y]),s.push(["L",l[2].x,l[2].y]),s.push(p),s.push(["Z"]),s=this.parsePath(s),c.fill=c.stroke,n=e.addShape("path",{attrs:o.mix(c,{path:s})})}return n},getMarkerCfg:function(t){return o.mix({symbol:"circle",radius:4.5},i(t))}}),t.exports=f},function(t,e,n){var i=n(73).ColorUtil,r=n(20),a=n(0),o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="heatmap",e.paletteCache={},e},n._prepareRange=function(){var t=this.get("mappedData"),e=this.getAttr("color").field,n=1/0,i=-1/0;t.forEach(function(t){var r=t._origin[e];r>i&&(i=r),r=t[0]}));for(var c=this._getScale(o),h=0;h1?t[1]:e;return{min:e,max:n,min1:i,max1:t.length>3?t[3]:n,median:t.length>2?t[2]:i}}function r(t,e,n){var r,a,s=[];return o.isArray(e)?r=[[t-n/2,(a=i(e)).max],[t+n/2,a.max],[t,a.max],[t,a.max1],[t-n/2,a.min1],[t-n/2,a.max1],[t+n/2,a.max1],[t+n/2,a.min1],[t,a.min1],[t,a.min],[t-n/2,a.min],[t+n/2,a.min],[t-n/2,a.median],[t+n/2,a.median]]:(e=e||.5,r=[[(a=i(t)).min,e-n/2],[a.min,e+n/2],[a.min,e],[a.min1,e],[a.min1,e-n/2],[a.min1,e+n/2],[a.max1,e+n/2],[a.max1,e-n/2],[a.max1,e],[a.max,e],[a.max,e-n/2],[a.max,e+n/2],[a.median,e-n/2],[a.median,e+n/2]]),function(t,e){o.each(t,function(t){e.push({x:t[0],y:t[1]})})}(r,s),s}function a(t,e,n){var i=function(t){o.isArray(t)||(t=[t]);var e=t.sort(function(t,e){return te[n].radius+B)return!1;return!0}(e,t)}),u=0,c=0,h=[];if(o.length>1){var f=l(o);for(n=0;n-1){var m=t[d.parentIndex[x]],_=Math.atan2(d.x-m.x,d.y-m.y),b=Math.atan2(g.x-m.x,g.y-m.y),w=b-_;w<0&&(w+=2*Math.PI);var S=b-w/2,M=a(v,{x:m.x+m.radius*Math.sin(S),y:m.y+m.radius*Math.cos(S)});M>2*m.radius&&(M=2*m.radius),(null===y||y.width>M)&&(y={circle:m,width:M,p1:d,p2:g})}null!==y&&(h.push(y),u+=r(y.circle.radius,y.width),g=d)}}else{var C=t[0];for(n=1;nMath.abs(C.radius-t[n].radius)){A=!0;break}A?u=c=0:(u=C.radius*C.radius*Math.PI,h.push({circle:C,p1:{x:C.x,y:C.y+C.radius},p2:{x:C.x-B,y:C.y+C.radius},width:2*C.radius}))}return c/=2,e&&(e.area=u+c,e.arcArea=u,e.polygonArea=c,e.arcs=h,e.innerPoints=o,e.intersectionPoints=i),u+c}function r(t,e){return t*t*Math.acos(1-e/t)-(t-e)*Math.sqrt(e*(2*t-e))}function a(t,e){return Math.sqrt((t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y))}function o(t,e,n){if(n>=t+e)return 0;if(n<=Math.abs(t-e))return Math.PI*Math.min(t,e)*Math.min(t,e);var i=e-(n*n-t*t+e*e)/(2*n);return r(t,t-(n*n-e*e+t*t)/(2*n))+r(e,i)}function s(t,e){var n=a(t,e),i=t.radius,r=e.radius;if(n>=i+r||n<=Math.abs(i-r))return[];var o=(i*i-r*r+n*n)/(2*n),s=Math.sqrt(i*i-o*o),l=t.x+o*(e.x-t.x)/n,u=t.y+o*(e.y-t.y)/n,c=-(e.y-t.y)*(s/n),h=-(e.x-t.x)*(s/n);return[{x:l+c,y:u-h},{x:l-c,y:u+h}]}function l(t){for(var e={x:0,y:0},n=0;n=v[d-1].fx){var P=!1;if(b.fx>k.fx?(g(w,1+f,_,-f,k),w.fx=t(w),w.fx=1)break;for(y=1;yl+a*r*u||c>=d)f=r;else{if(Math.abs(p)<=-o*u)return r;p*(f-s)>=0&&(f=s),s=r,d=c}return 0}var l=n.fx,u=h(n.fxprime,e),c=l,f=l,p=u,d=0;r=r||1,a=a||1e-6,o=o||.1;for(var v=0;v<10;++v){if(g(i.x,1,n.x,r,e),c=i.fx=t(i.x,i.fxprime),p=h(i.fxprime,e),c>l+a*r*u||v&&c>=f)return s(d,r,f);if(Math.abs(p)<=-o*u)return r;if(p>=0)return s(r,d,c);f=c,d=r,r*=2}return r}function y(t,e,n){var i,r,a,o={x:e.slice(),fx:0,fxprime:e.slice()},s={x:e.slice(),fx:0,fxprime:e.slice()},l=e.slice(),u=1;a=(n=n||{}).maxIterations||20*e.length,o.fx=t(o.x,o.fxprime),p(i=o.fxprime.slice(),o.fxprime,-1);for(var c=0;ce}),e=0;e0)throw"Initial bisect points must have opposite signs";if(0===o)return e;if(0===s)return n;for(var u=0;u=0&&(e=c),Math.abs(l)=8){var r=function(t,e){var n,i=(e=e||{}).restarts||10,r=[],a={};for(n=0;n=Math.min(e[a].size,e[o].size)?l=1:t.size<=1e-10&&(l=-1),r[a][o]=r[o][a]=l}),{distances:i,constraints:r}}(t,r,a),l=s.distances,h=s.constraints,g=f(l.map(f))/l.length;l=l.map(function(t){return t.map(function(t){return t/g})});var d,v,x=function(t,e){return function(t,e,n,i){var r,a=0;for(r=0;r0&&g<=h||f<0&&g>=h||(a+=2*d*d,e[2*r]+=4*d*(o-u),e[2*r+1]+=4*d*(s-c),e[2*l]+=4*d*(u-o),e[2*l+1]+=4*d*(c-s))}return a}(t,e,l,h)};for(n=0;n=Math.min(l[g].size,l[d].size)&&(p=0),u[g].push({set:d,size:f.size,weight:p}),u[d].push({set:g,size:f.size,weight:p})}var v=[];for(a in u)if(u.hasOwnProperty(a)){var y=0;for(c=0;c0){var r=t[0].x,o=t[0].y;for(i=0;i1){var s,l,u=Math.atan2(t[1].x,t[1].y)-e,c=Math.cos(u),h=Math.sin(u);for(i=0;i2){for(var f=Math.atan2(t[2].x,t[2].y)-e;f<0;)f+=2*Math.PI;for(;f>2*Math.PI;)f-=2*Math.PI;if(f>Math.PI){var p=t[1].y/(1e-10+t[1].x);for(i=0;iu&&p.node().getComputedTextLength()>o&&(h.pop(),p.text(h.join(" ")),h=[c],p=r.append("tspan").text(c),f++)}var g=.35-1.1*f/2,d=r.attr("x"),v=r.attr("y");r.selectAll("tspan").attr("x",d).attr("y",v).attr("dy",function(t,e){return g+1.1*e+"em"})}}function T(t,e,n){var i,r,o=e[0].radius-a(e[0],t);for(i=1;i=u&&(s=r[n],u=c)}var h=d(function(n){return-1*T({x:n[0],y:n[1]},t,e)},[s.x,s.y],{maxIterations:500,minErrorDelta:1e-10}).x,f={x:h[0],y:h[1]},p=!0;for(n=0;nt[n].radius){p=!1;break}for(n=0;n0&&console.log("WARNING: area "+a+" not represented on screen")}return n}function E(t,e,n){var i=[];return i.push("\nM",t,e),i.push("\nm",-n,0),i.push("\na",n,n,0,1,0,2*n,0),i.push("\na",n,n,0,1,0,2*-n,0),i.join(" ")}function D(t){var e=t.split(" ");return{x:parseFloat(e[1]),y:parseFloat(e[2]),radius:-parseFloat(e[4])}}function F(t){var e={};i(t,e);var n=e.arcs;if(0===n.length)return"M 0 0";if(1==n.length){var r=n[0].circle;return E(r.x,r.y,r.radius)}for(var a=["\nM",n[0].p2.x,n[0].p2.y],o=0;ol;a.push("\nA",l,l,0,u?1:0,1,s.p1.x,s.p1.y)}return a.join(" ")}var B=1e-10,R=1e-10;t.intersectionArea=i,t.circleCircleIntersection=s,t.circleOverlap=o,t.circleArea=r,t.distance=a,t.venn=x,t.greedyLayout=b,t.scaleSolution=k,t.normalizeSolution=A,t.bestInitialLayout=_,t.lossFunction=w,t.disjointCluster=M,t.distanceFromIntersectArea=m,t.VennDiagram=function(){function t(t){function f(t){return t.sets in b?b[t.sets]:1==t.sets.length?""+t.sets[0]:void 0}var p=t.datum(),g={};p.forEach(function(t){0==t.size&&1==t.sets.length&&(g[t.sets[0]]=1)});var x={},m={};if((p=p.filter(function(t){return!t.sets.some(function(t){return t in g})})).length>0){var _=v(p,{lossFunction:y});s&&(_=A(_,o,h)),x=k(_,n,i,r),m=L(x,p)}var b={};p.forEach(function(t){t.label&&(b[t.sets]=t.label)}),t.selectAll("svg").data([x]).enter().append("svg");var w=t.select("svg").attr("width",n).attr("height",i),S={},M=!1;w.selectAll(".venn-area path").each(function(t){var n=e.select(this).attr("d");1==t.sets.length&&n&&(M=!0,S[t.sets[0]]=D(n))});var C=function(t){return function(e){return F(t.sets.map(function(t){var r=S[t],a=x[t];return r||(r={x:n/2,y:i/2,radius:1}),a||(a={x:n/2,y:i/2,radius:1}),{x:r.x*(1-e)+a.x*e,y:r.y*(1-e)+a.y*e,radius:r.radius*(1-e)+a.radius*e}}))}},T=w.selectAll(".venn-area").data(p,function(t){return t.sets}),I=T.enter().append("g").attr("class",function(t){return"venn-area venn-"+(1==t.sets.length?"circle":"intersection")}).attr("data-venn-sets",function(t){return t.sets.join("_")}),O=I.append("path"),E=I.append("text").attr("class","label").text(function(t){return f(t)}).attr("text-anchor","middle").attr("dy",".35em").attr("x",n/2).attr("y",i/2);u&&(O.style("fill-opacity","0").filter(function(t){return 1==t.sets.length}).style("fill",function(t){return d(t.sets)}).style("fill-opacity",".25"),E.style("fill",function(t){return 1==t.sets.length?d(t.sets):"#444"}));var B=t;M?(B=t.transition("venn").duration(a)).selectAll("path").attrTween("d",C):B.selectAll("path").attr("d",function(t){return F(t.sets.map(function(t){return x[t]}))});var R=B.selectAll("text").filter(function(t){return t.sets in m}).text(function(t){return f(t)}).attr("x",function(t){return Math.floor(m[t.sets].x)}).attr("y",function(t){return Math.floor(m[t.sets].y)});l&&(M?"on"in R?R.on("end",P(x,f)):R.each("end",P(x,f)):R.each(P(x,f)));var j=T.exit().transition("venn").duration(a).remove();j.selectAll("path").attrTween("d",C);var N=j.selectAll("text").attr("x",n/2).attr("y",i/2);return null!==c&&(E.style("font-size","0px"),R.style("font-size",c),N.style("font-size","0px")),{circles:x,textCentres:m,nodes:T,enter:I,update:B,exit:j}}var n=600,i=350,r=15,a=1e3,o=Math.PI/2,s=!0,l=!0,u=!0,c=null,h=null,f={},p=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],g=0,d=function(t){if(t in f)return f[t];var e=f[t]=p[g];return(g+=1)>=p.length&&(g=0),e},v=x,y=w;return t.wrap=function(e){return arguments.length?(l=e,t):l},t.width=function(e){return arguments.length?(n=e,t):n},t.height=function(e){return arguments.length?(i=e,t):i},t.padding=function(e){return arguments.length?(r=e,t):r},t.colours=function(e){return arguments.length?(d=e,t):d},t.fontSize=function(e){return arguments.length?(c=e,t):c},t.duration=function(e){return arguments.length?(a=e,t):a},t.layoutFunction=function(e){return arguments.length?(v=e,t):v},t.normalize=function(e){return arguments.length?(s=e,t):s},t.styled=function(e){return arguments.length?(u=e,t):u},t.orientation=function(e){return arguments.length?(o=e,t):o},t.orientationOrder=function(e){return arguments.length?(h=e,t):h},t.lossFunction=function(e){return arguments.length?(y=e,t):y},t},t.wrapText=P,t.computeTextCentres=L,t.computeTextCentre=I,t.sortAreas=function(t,e){function n(t){for(var e=0;e=M&&(M=S+1);!(w=_[M])&&++M=0;)(i=r[a])&&(o&&o!==i.nextSibling&&o.parentNode.insertBefore(i,o),o=i);return this}},function(t,e,n){"use strict";function i(t,e){return te?1:t>=e?0:NaN}var r=n(69);e.a=function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=i);for(var n=this._groups,a=n.length,o=new Array(a),s=0;s1?this.each((null==e?function(t){return function(){delete this[t]}}:"function"==typeof e?function(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}:function(t,e){return function(){this[t]=e}})(t,e)):this.node()[t]}},function(t,e,n){"use strict";function i(t){return t.trim().split(/^|\s+/)}function r(t){return t.classList||new a(t)}function a(t){this._node=t,this._names=i(t.getAttribute("class")||"")}function o(t,e){for(var n=r(t),i=-1,a=e.length;++i=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}},e.a=function(t,e){var n=i(t+"");if(arguments.length<2){for(var a=r(this.node()),l=-1,u=n.length;++l=0&&(n=t.slice(i+1),t=t.slice(0,i)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}})}(t+"",i),o=-1,s=r.length;{if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++o0)for(var n,i,r=new Array(n),a=0;a=0&&(t=t.slice(0,e)),!t||"start"===t})}(e)?i.g:i.h;return function(){var i=o(this,t),s=i.on;s!==r&&(a=(r=s).copy()).on(e,n),i.on=a}}(n,t,e))}},function(t,e,n){"use strict";e.a=function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))}},function(t,e,n){"use strict";var i=n(72),r=n(169),a=n(70);e.a=function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Object(i.selector)(t));for(var o=this._groups,s=o.length,l=new Array(s),u=0;ur.c&&n.name===e)return new i.a([[t]],a,e,+o)}return null}},function(t,e,n){function i(t){var e=s.shape.venn,n=r.mix({},e,t.style);return o.addFillAttrs(n,t),n}var r=n(0),a=n(18),o=n(45),s=n(7),l=r.PathUtil,u=a.registerFactory("venn",{defaultShapeType:"venn",getDefaultPoints:function(t){var e=[];return r.each(t.x,function(n,i){var r=t.y[i];e.push({x:n,y:r})}),e},getActiveCfg:function(t,e){var n=e.lineWidth||1;if("hollow"===t)return{lineWidth:n+1};return{fillOpacity:(e.fillOpacity||e.opacity||1)-.08}},getSelectedCfg:function(t,e){return e&&e.style?e.style:this.getActiveCfg(t,e)}});a.registerShape("venn","venn",{draw:function(t,e){var n=t.origin._origin.path,a=i(t),o=l.parsePathString(n);return e.addShape("path",{attrs:r.mix(a,{path:o})})},getMarkerCfg:function(t){return r.mix({symbol:"circle",radius:4},i(t))}}),a.registerShape("venn","hollow",{draw:function(t,e){var n=t.origin._origin.path,i=function(t){var e=s.shape.hollowVenn,n=r.mix({},e,t.style);return o.addStrokeAttrs(n,t),n}(t),a=l.parsePathString(n);return e.addShape("path",{attrs:r.mix(i,{path:a})})},getMarkerCfg:function(t){return r.mix({symbol:"circle",radius:4},i(t))}}),t.exports=u},function(t,e,n){function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}function r(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var a=n(20),o=n(0),s=n(357);n(460);var l=function(t){function e(e){var n;return n=t.call(this,e)||this,o.assign(r(r(n)),s),n}i(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.type="violin",e.shapeType="violin",e.generatePoints=!0,e},n.createShapePointsCfg=function(e){var n=t.prototype.createShapePointsCfg.call(this,e);n.size=this.getNormalizedSize(e);var i=this.get("_sizeField");return n._size=e._origin[i],n},n.clearInner=function(){t.prototype.clearInner.call(this),this.set("defaultSize",null)},n._initAttrs=function(){var e=this.get("attrOptions"),n=e.size?e.size.field:this.get("_sizeField")?this.get("_sizeField"):"size";this.set("_sizeField",n),delete e.size,t.prototype._initAttrs.call(this)},e}(a),u=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);return e.prototype.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return e.hasDefaultAdjust=!0,e.adjusts=[{type:"dodge"}],e},e}(l);l.Dodge=u,a.Violin=l,a.ViolinDodge=u,t.exports=l},function(t,e,n){function i(t){var e=c.shape.venn,n=s.mix({},e,t.style);return u.addFillAttrs(n,t),t.color&&(n.stroke=n.stroke||t.color),n}function r(t){var e=c.shape.hollowVenn,n=s.mix({},e,t.style);return u.addStrokeAttrs(n,t),n}function a(t){for(var e=[],n=0;n=0;r--)for(var a=e.getFacetsByLevel(t,r),o=0;op.x||a.yf.y)return}s.style.cursor="crosshair",e.startPoint=a,e.brushShape=null,e.brushing=!0,c?c.clear():(c=n.addGroup({zIndex:5})).initTransform(),e.container=c,"POLYGON"===i&&(e.polygonPath="M "+a.x+" "+a.y)}}}},n.process=function(t){var e=this,n=e.brushing,i=e.dragging,a=e.type,o=e.plot,s=e.startPoint,l=e.xScale,u=e.yScale,c=e.canvas;if(n||i){var h={x:t.offsetX,y:t.offsetY},f=c.get("canvasDOM");if(n){f.style.cursor="crosshair";var p=o.start,g=o.end,d=e.polygonPath,v=e.brushShape,y=e.container;e.plot&&e.inPlot&&(h=e._limitCoordScope(h));var x,m,_,b;"Y"===a?(x=p.x,m=h.y>=s.y?s.y:h.y,_=Math.abs(p.x-g.x),b=Math.abs(s.y-h.y)):"X"===a?(x=h.x>=s.x?s.x:h.x,m=g.y,_=Math.abs(s.x-h.x),b=Math.abs(g.y-p.y)):"XY"===a?(h.x>=s.x?(x=s.x,m=h.y>=s.y?s.y:h.y):(x=h.x,m=h.y>=s.y?s.y:h.y),_=Math.abs(s.x-h.x),b=Math.abs(s.y-h.y)):"POLYGON"===a&&(d+="L "+h.x+" "+h.y,e.polygonPath=d,v?!v.get("destroyed")&&v.attr(r.mix({},v._attrs,{path:d})):v=y.addShape("path",{attrs:r.mix(e.style,{path:d})})),"POLYGON"!==a&&(v?!v.get("destroyed")&&v.attr(r.mix({},v._attrs,{x:x,y:m,width:_,height:b})):v=y.addShape("rect",{attrs:r.mix(e.style,{x:x,y:m,width:_,height:b})})),e.brushShape=v}else if(i){f.style.cursor="move";var w=e.selection;if(w&&!w.get("destroyed"))if("POLYGON"===a){var S=e.prePoint;e.selection.translate(h.x-S.x,h.y-S.y)}else e.dragoffX&&w.attr("x",h.x-e.dragoffX),e.dragoffY&&w.attr("y",h.y-e.dragoffY)}e.prePoint=h,c.draw();var M=e._getSelected(),C=M.data,A=M.shapes,k=M.xValues,P=M.yValues,T={data:C,shapes:A,x:h.x,y:h.y};l&&(T[l.field]=k),u&&(T[u.field]=P),e.onDragmove&&e.onDragmove(T),e.onBrushmove&&e.onBrushmove(T)}},n.end=function(t){var e=this,n=e.data,i=e.shapes,a=e.xValues,o=e.yValues,s=e.canvas,l=e.type,u=e.startPoint,c=e.chart,h=e.container,f=e.xScale,p=e.yScale,g=t.offsetX,d=t.offsetY;if(s.get("canvasDOM").style.cursor="default",Math.abs(u.x-g)<=1&&Math.abs(u.y-d)<=1)return e.brushing=!1,void(e.dragging=!1);var v={data:n,shapes:i,x:g,y:d};if(f&&(v[f.field]=a),p&&(v[p.field]=o),e.dragging)e.dragging=!1,e.onDragend&&e.onDragend(v);else if(e.brushing){e.brushing=!1;var y=e.brushShape,x=e.polygonPath;"POLYGON"===l&&(x+="z",y&&!y.get("destroyed")&&y.attr(r.mix({},y._attrs,{path:x})),e.polygonPath=x,s.draw()),e.onBrushend?e.onBrushend(v):c&&e.filter&&(h.clear(),"X"===l?f&&c.filter(f.field,function(t){return a.indexOf(t)>-1}):"Y"===l?p&&c.filter(p.field,function(t){return o.indexOf(t)>-1}):(f&&c.filter(f.field,function(t){return a.indexOf(t)>-1}),p&&c.filter(p.field,function(t){return o.indexOf(t)>-1})),c.repaint())}},n.reset=function(){var t=this.chart,e=this.filter,n=this.brushShape,i=this.canvas;t&&e&&(t.get("options").filters={},t.repaint()),n&&(n.destroy(),i.draw())},n._limitCoordScope=function(t){var e=this.plot,n=e.start,i=e.end;return t.xi.x&&(t.x=i.x),t.yn.y&&(t.y=n.y),t},n._getSelected=function(){var t=this,e=t.chart,n=t.xScale,i=t.yScale,r=t.brushShape,a=t.canvas,o=a.get("pixelRatio"),s=[],l=[],u=[],c=[];if(e){e.get("geoms").map(function(t){return t.getShapes().map(function(t){var e=t.get("origin");return Array.isArray(e)||(e=[e]),e.map(function(e){if(r.isHit(e.x*o,e.y*o)){s.push(t);var a=e._origin;c.push(a),n&&l.push(a[n.field]),i&&u.push(a[i.field])}return e}),t}),t})}return t.shapes=s,t.xValues=l,t.yValues=u,t.data=c,a.draw(),{data:c,xValues:l,yValues:u,shapes:s}},e}(n(171));t.exports=s},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(0),a=n(171),o=n(469),s=n(377),l=n(378),u=["X","Y","XY"],c="X",h=function(t){function e(e,n){var a,s=i(i(a=t.call(this,e,n)||this));s.type=s.type.toUpperCase(),s.chart=n,s.coord=n.get("coord");var h=s.data=n.get("data");o(n);var f=n.getYScales(),p=n.getXScale();f.push(p);var g=n.get("scaleController");return f.forEach(function(t){var e=t.field;s.limitRange[e]=l(h,t);var n=g.defs[e]||{};s.originScaleDefsByField[e]=r.mix(n,{nice:!!n.nice}),t.isLinear&&(s.stepByField[e]=(t.max-t.min)*s.stepRatio)}),-1===u.indexOf(s.type)&&(s.type=c),s._disableTooltip(),a}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{type:c,stepRatio:.05,limitRange:{},stepByField:{},threshold:20,originScaleDefsByField:{},previousPoint:null,isDragging:!1})},n._disableTooltip=function(){var t=this.chart;t.get("tooltipController")&&(this._showTooltip=!0,t.tooltip(!1))},n._enableTooltip=function(t){var e=this.chart;this._showTooltip&&(e.tooltip(!0),e.showTooltip(t))},n._applyTranslate=function(t,e,n){void 0===e&&(e=0);t.isLinear?this._translateLinearScale(t,e,n):this._translateCatScale(t,e,n)},n._translateCatScale=function(t,e,n){var i=this.chart,a=t.type,o=t.field,l=t.values,u=t.ticks,c=s(i,o),h=this.limitRange[o],f=e/n,p=l.length,g=Math.max(1,Math.abs(parseInt(f*p))),d=h.indexOf(l[0]),v=h.indexOf(l[p-1]);if(e>0&&d>=0){for(var y=0;y0;y++)d-=1,v-=1;var x=h.slice(d,v+1),m=null;if("timeCat"===a){for(var _=u.length>2?u[1]-u[0]:864e5,b=u[0]-_;b>=x[0];b-=_)u.unshift(b);m=u}i.scale(o,r.mix({},c,{values:x,ticks:m}))}else if(e<0&&v<=h.length-1){for(var w=0;w2?u[1]-u[0]:864e5,A=u[u.length-1]+C;A<=S[S.length-1];A+=C)u.push(A);M=u}i.scale(o,r.mix({},c,{values:S,ticks:M}))}},n._translateLinearScale=function(t,e,n){var i=this.chart,a=this.limitRange,o=t.min,l=t.max,u=t.field;if(o!==a[u].min||l!==a[u].max){var c=e/n,h=l-o,f=s(i,u);i.scale(u,r.mix({},f,{nice:!1,min:o+c*h,max:l+c*h}))}},n.start=function(t){this.canvas.get("canvasDOM").style.cursor="pointer",this.isDragging=!0,this.previousPoint={x:t.x,y:t.y},this._disableTooltip()},n.process=function(t){var e=this;if(e.isDragging){var n=e.chart,i=e.type,r=e.canvas,a=e.coord,o=e.threshold;r.get("canvasDOM").style.cursor="move";var s=e.previousPoint,l=t,u=l.x-s.x,c=l.y-s.y,h=!1;if(Math.abs(u)>o&&i.indexOf("X")>-1){h=!0;var f=n.getXScale();e._applyTranslate(f,f.isLinear?-u:u,a.width)}if(Math.abs(c)>o&&i.indexOf("Y")>-1){h=!0;n.getYScales().forEach(function(t){e._applyTranslate(t,l.y-s.y,a.height)})}h&&(e.previousPoint=l,n.repaint())}},n.end=function(t){this.isDragging=!1;this.canvas.get("canvasDOM").style.cursor="default",this._enableTooltip(t)},n.reset=function(){var t=this.view,e=this.originScaleDefsByField,n=t.getYScales(),i=t.getXScale();n.push(i),n.forEach(function(n){if(n.isLinear){var i=n.field;t.scale(i,e[i])}}),t.repaint(),this._disableTooltip()},e}(a);t.exports=h},function(t,e,n){var i=n(0),r=n(71),a=n(376);t.exports=function(t){t.on("beforeinitgeoms",function(){t.set("limitInPlot",!0);var e=t.get("data"),n=a(t);if(!n)return e;var o=t.get("geoms"),s=!1;i.each(o,function(t){if(-1!==["area","line","path"].indexOf(t.get("type")))return s=!0,!1});var l=[];if(i.each(n,function(t,e){!s&&t&&(t.values||t.min||t.max)&&l.push(e)}),0===l.length)return e;var u=[];i.each(e,function(t){var e=!0;i.each(l,function(a){var o=t[a];if(o){var s=n[a];if("timeCat"===s.type){var l=s.values;i.isNumber(l[0])&&(o=r.toTimeStamp(o))}(s.values&&-1===s.values.indexOf(o)||s.min&&os.max)&&(e=!1)}}),e&&u.push(t)}),t.set("filteredData",u)})}},function(t,e,n){var i=n(0),r=n(171),a=n(471),o=n(378),s=function(t){function e(e,n){var r,a=(r=t.call(this,e,n)||this).getDefaultCfg();return n.set("_scrollBarCfg",i.deepMix({},a,e)),n.set("_limitRange",{}),n.get("_horizontalBar")||n.get("_verticalBar")||r._renderScrollBars(),r}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return i.mix({},e,{startEvent:null,processEvent:null,endEvent:null,resetEvent:null,type:"X",xStyle:{backgroundColor:"rgba(202, 215, 239, .2)",fillerColor:"rgba(202, 215, 239, .75)",size:4,lineCap:"round",offsetX:0,offsetY:-10},yStyle:{backgroundColor:"rgba(202, 215, 239, .2)",fillerColor:"rgba(202, 215, 239, .75)",size:4,lineCap:"round",offsetX:8,offsetY:0}})},n._renderScrollBars=function(){var t=this.chart,e=t.get("_scrollBarCfg");if(e){var n=t.get("data"),i=t.get("plotRange");i.width=Math.abs(i.br.x-i.bl.x),i.height=Math.abs(i.tl.y-i.bl.y);var r=t.get("backPlot"),s=t.get("canvas").get("height"),l=t.get("_limitRange"),u=e.type;if(u.indexOf("X")>-1){var c=e.xStyle,h=c.offsetX,f=c.offsetY,p=c.lineCap,g=c.backgroundColor,d=c.fillerColor,v=c.size,y=t.getXScale(),x=l[y.field];x||(x=o(n,y),l[y.field]=x);var m=a(y,x,y.type),_=t.get("_horizontalBar"),b=s-v/2+f;if(_){_.get("children")[1].attr({x1:Math.max(i.bl.x+i.width*m[0]+h,i.bl.x),x2:Math.min(i.bl.x+i.width*m[1]+h,i.br.x)})}else(_=r.addGroup({className:"horizontalBar"})).addShape("line",{attrs:{x1:i.bl.x+h,y1:b,x2:i.br.x+h,y2:b,lineWidth:v,stroke:g,lineCap:p}}),_.addShape("line",{attrs:{x1:Math.max(i.bl.x+i.width*m[0]+h,i.bl.x),y1:b,x2:Math.min(i.bl.x+i.width*m[1]+h,i.br.x),y2:b,lineWidth:v,stroke:d,lineCap:p}}),t.set("_horizontalBar",_)}if(u.indexOf("Y")>-1){var w=e.yStyle,S=w.offsetX,M=w.offsetY,C=w.lineCap,A=w.backgroundColor,k=w.fillerColor,P=w.size,T=t.getYScales()[0],I=l[T.field];I||(I=o(n,T),l[T.field]=I);var O=a(T,I,T.type),L=t.get("_verticalBar"),E=P/2+S;if(L){L.get("children")[1].attr({y1:Math.max(i.tl.y+i.height*O[0]+M,i.tl.y),y2:Math.min(i.tl.y+i.height*O[1]+M,i.bl.y)})}else(L=r.addGroup({className:"verticalBar"})).addShape("line",{attrs:{x1:E,y1:i.tl.y+M,x2:E,y2:i.bl.y+M,lineWidth:P,stroke:A,lineCap:C}}),L.addShape("line",{attrs:{x1:E,y1:Math.max(i.tl.y+i.height*O[0]+M,i.tl.y),x2:E,y2:Math.min(i.tl.y+i.height*O[1]+M,i.bl.y),lineWidth:P,stroke:k,lineCap:C}}),t.set("_verticalBar",L)}}},n._clear=function(){var t=this.chart;if(t){var e=t.get("_horizontalBar"),n=t.get("_verticalBar");e&&e.remove(!0),n&&n.remove(!0),t.set("_horizontalBar",null),t.set("_verticalBar",null)}},n._bindEvents=function(){this._onAfterclearOrBeforechangedata=this._onAfterclearOrBeforechangedata.bind(this),this._onAfterclearinner=this._onAfterclearinner.bind(this),this._onAfterdrawgeoms=this._onAfterdrawgeoms.bind(this);var t=this.chart;t.on("afterclear",this._onAfterclearOrBeforechangedata),t.on("beforechangedata",this._onAfterclearOrBeforechangedata),t.on("afterclearinner",this._onAfterclearinner),t.on("afterdrawgeoms",this._onAfterdrawgeoms)},n._onAfterclearOrBeforechangedata=function(){this.chart&&this.chart.set("_limitRange",{})},n._onAfterclearinner=function(){this._clear()},n._onAfterdrawgeoms=function(){this._renderScrollBars()},n._clearEvents=function(){var t=this.chart;t&&(t.off("afterclear",this._onAfterclearOrBeforechangedata),t.off("beforechangedata",this._onAfterclearOrBeforechangedata),t.off("afterclearinner",this._onAfterclearinner),t.off("afterdrawgeoms",this._onAfterdrawgeoms))},n.destroy=function(){this._clearEvents(),this._clear(),this.canvas.draw()},e}(r);t.exports=s},function(t,e){t.exports=function(t,e,n){if(!t)return[0,1];var i=0,r=0;if("linear"===n){var a=e.min,o=e.max-a;i=(t.min-a)/o,r=(t.max-a)/o}else{var s=e,l=t.values,u=s.indexOf(l[0]),c=s.indexOf(l[l.length-1]);i=u/(s.length-1),r=c/(s.length-1)}return[i,r]}},function(t,e,n){function i(t,e){var n={};for(var i in e)n[i]=t[i];return n}var r=n(0),a=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{startEvent:"mouseup",processEvent:null,selectStyle:{fillOpacity:1},unSelectStyle:{fillOpacity:.1},cancelable:!0})},n.start=function(t){var e,n=[];if(this.view.eachShape(function(i,r){r.isPointInPath(t.x,t.y)?e=r:n.push(r)}),e)if(e.get("_selected")){if(!this.cancelable)return;this.reset()}else{var a=this.selectStyle,o=this.unSelectStyle,s=i(e.attr(),e);e.set("_originAttrs",s),e.attr(a),r.each(n,function(t){var e=t.get("_originAttrs");e&&t.attr(e),t.set("_selected",!1),o&&(e=i(t.attr(),o),t.set("_originAttrs",e),t.attr(o))}),e.set("_selected",!0),this.selectedShape=e,this.canvas.draw()}else this.reset()},n.end=function(t){var e=this.selectedShape;e&&!e.get("destroyed")&&e.get("origin")&&(t.data=e.get("origin")._origin,t.shapeInfo=e.get("origin"),t.shape=e,t.selected=!!e.get("_selected"))},n.reset=function(){if(this.selectedShape){var t=this.view.get("geoms")[0].get("container").get("children")[0].get("children");r.each(t,function(t){var e=t.get("_originAttrs");e&&(t._attrs=e,t.set("_originAttrs",null)),t.set("_selected",!1)}),this.canvas.draw()}},e}(n(171));t.exports=a},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(474),a=n(147),o=n(0),s=n(16),l=n(7),u=n(171),c=n(377),h=n(376),f=s.Canvas,p=o.DomUtil,g=o.isNumber,d=function(t){function e(e,n){var r,a=i(i(r=t.call(this,e,n)||this));return a._initContainer(),a._initStyle(),a.render(),r}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return o.mix({},e,{startEvent:null,processEvent:null,endEvent:null,resetEvent:null,height:26,width:"auto",padding:l.plotCfg.padding,container:null,xAxis:null,yAxis:null,fillerStyle:{fill:"#BDCCED",fillOpacity:.3},backgroundStyle:{stroke:"#CCD6EC",fill:"#CCD6EC",fillOpacity:.3,lineWidth:1},range:[0,100],layout:"horizontal",textStyle:{fill:"#545454"},handleStyle:{img:"https://gw.alipayobjects.com/zos/rmsportal/QXtfhORGlDuRvLXFzpsQ.png",width:5},backgroundChart:{type:["area"],color:"#CCD6EC"}})},n._initContainer=function(){var t=this.container;if(!t)throw new Error("Please specify the container for the Slider!");o.isString(t)?this.domContainer=document.getElementById(t):this.domContainer=t},n.forceFit=function(){var t=this;if(t&&!t.destroyed){var e=p.getWidth(t.domContainer),n=t.height;if(e!==t.domWidth){var i=t.canvas;i.changeSize(e,n),t.bgChart&&t.bgChart.changeWidth(e),i.clear(),t._initWidth(),t._initSlider(),t._bindEvent(),i.draw()}}},n._initForceFitEvent=function(){var t=setTimeout(o.wrapBehavior(this,"forceFit"),200);clearTimeout(this.resizeTimer),this.resizeTimer=t},n._initStyle=function(){var t=this;t.handleStyle=o.mix({width:t.height,height:t.height},t.handleStyle),"auto"===t.width&&window.addEventListener("resize",o.wrapBehavior(t,"_initForceFitEvent"))},n._initWidth=function(){var t,e=this;t="auto"===e.width?p.getWidth(e.domContainer):e.width,e.domWidth=t;var n=o.toAllPadding(e.padding);"horizontal"===e.layout?(e.plotWidth=t-n[1]-n[3],e.plotPadding=n[3],e.plotHeight=e.height):"vertical"===e.layout&&(e.plotWidth=e.width,e.plotHeight=e.height-n[0]-n[2],e.plotPadding=n[0])},n._initCanvas=function(){var t=this.domWidth,e=this.height,n=new f({width:t,height:e,containerDOM:this.domContainer,capture:!1}),i=n.get("el");i.style.position="absolute",i.style.top=0,i.style.left=0,i.style.zIndex=3,this.canvas=n},n._initBackground=function(){var t,e=this,n=this.chart,i=n.getAllGeoms[0],r=e.data=e.data||n.get("data"),s=n.getXScale(),l=e.xAxis||s.field,u=e.yAxis||n.getYScales()[0].field,c=o.deepMix((t={},t[""+l]={range:[0,1]},t),h(n),e.scales);if(delete c[l].min,delete c[l].max,!r)throw new Error("Please specify the data!");if(!l)throw new Error("Please specify the xAxis!");if(!u)throw new Error("Please specify the yAxis!");var f=e.backgroundChart,p=f.type||i.get("type"),g=f.color||"grey";o.isArray(p)||(p=[p]);var d=o.toAllPadding(e.padding),v=new a({container:e.container,width:e.domWidth,height:e.height,padding:[0,d[1],0,d[3]],animate:!1});v.source(r),v.scale(c),v.axis(!1),v.tooltip(!1),v.legend(!1),o.each(p,function(t){v[t]().position(l+"*"+u).color(g).opacity(1)}),v.render(),e.bgChart=v,e.scale="horizontal"===e.layout?v.getXScale():v.getYScales()[0],"vertical"===e.layout&&v.destroy()},n._initRange=function(){var t=this,e=t.startRadio,n=t.endRadio,i=t._startValue,r=t._endValue,a=t.scale,o=0,s=1;g(e)?o=e:i&&(o=a.scale(a.translate(i))),g(n)?s=n:r&&(s=a.scale(a.translate(r)));var l=t.minSpan,u=t.maxSpan,c=0;if("time"===a.type||"timeCat"===a.type){var h=a.values,f=h[0];c=h[h.length-1]-f}else a.isLinear&&(c=a.max-a.min);c&&l&&(t.minRange=l/c*100),c&&u&&(t.maxRange=u/c*100);var p=[100*o,100*s];return t.range=p,p},n._getHandleValue=function(t){var e=this,n=e.range,i=n[0]/100,r=n[1]/100,a=e.scale;return"min"===t?e._startValue?e._startValue:a.invert(i):e._endValue?e._endValue:a.invert(r)},n._initSlider=function(){var t=this,e=t.canvas,n=t._initRange(),i=t.scale,a=e.addGroup(r,{middleAttr:t.fillerStyle,range:n,minRange:t.minRange,maxRange:t.maxRange,layout:t.layout,width:t.plotWidth,height:t.plotHeight,backgroundStyle:t.backgroundStyle,textStyle:t.textStyle,handleStyle:t.handleStyle,minText:i.getText(t._getHandleValue("min")),maxText:i.getText(t._getHandleValue("max"))});"horizontal"===t.layout?a.translate(t.plotPadding,0):"vertical"===t.layout&&a.translate(0,t.plotPadding),t.rangeElement=a},n._updateElement=function(t,e){var n=this,i=n.chart,r=n.scale,a=n.rangeElement,s=r.field,l=a.get("minTextElement"),u=a.get("maxTextElement"),h=r.invert(t),f=r.invert(e),p=r.getText(h),g=r.getText(f);l.attr("text",p),u.attr("text",g),n._startValue=p,n._endValue=g,n.onChange&&n.onChange({startText:p,endText:g,startValue:h,endValue:f,startRadio:t,endRadio:e}),i.scale(s,o.mix({},c(i,s),{nice:!1,min:h,max:f})),i.repaint()},n._bindEvent=function(){var t=this;t.rangeElement.on("sliderchange",function(e){var n=e.range,i=n[0]/100,r=n[1]/100;t._updateElement(i,r)})},n.clear=function(){var t=this;t.canvas.clear(),t.bgChart&&t.bgChart.destroy(),t.bgChart=null,t.scale=null,t.canvas.draw()},n.repaint=function(){this.clear(),this.render()},n.render=function(){var t=this;t._initWidth(),t._initCanvas(),t._initBackground(),t._initSlider(),t._bindEvent(),t.canvas.draw()},n.destroy=function(){var t=this;clearTimeout(t.resizeTimer);t.rangeElement.off("sliderchange"),t.bgChart&&t.bgChart.destroy(),t.canvas.destroy();for(var e=t.domContainer;e.hasChildNodes();)e.removeChild(e.firstChild);window.removeEventListener("resize",o.getWrapBehavior(t,"_initForceFitEvent")),t.destroyed=!0},e}(u);t.exports=d},function(t,e,n){var i=n(0),r=n(16).Group,a=i.DomUtil,o=function(t){function e(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){return{range:null,middleAttr:null,backgroundElement:null,minHandleElement:null,maxHandleElement:null,middleHandleElement:null,currentTarget:null,layout:"vertical",width:null,height:null,pageX:null,pageY:null}},n._initHandle=function(t){var e,n,r,a=this.addGroup(),o=this.get("layout"),s=this.get("handleStyle"),l=s.img,u=s.width,c=s.height;if("horizontal"===o){var h=s.width;r="ew-resize",n=a.addShape("Image",{attrs:{x:-h/2,y:0,width:h,height:c,img:l,cursor:r}}),e=a.addShape("Text",{attrs:i.mix({x:"min"===t?-(h/2+5):h/2+5,y:c/2,textAlign:"min"===t?"end":"start",textBaseline:"middle",text:"min"===t?this.get("minText"):this.get("maxText"),cursor:r},this.get("textStyle"))})}else r="ns-resize",n=a.addShape("Image",{attrs:{x:0,y:-c/2,width:u,height:c,img:l,cursor:r}}),e=a.addShape("Text",{attrs:i.mix({x:u/2,y:"min"===t?c/2+5:-(c/2+5),textAlign:"center",textBaseline:"middle",text:"min"===t?this.get("minText"):this.get("maxText"),cursor:r},this.get("textStyle"))});return this.set(t+"TextElement",e),this.set(t+"IconElement",n),a},n._initSliderBackground=function(){var t=this.addGroup();return t.initTransform(),t.translate(0,0),t.addShape("Rect",{attrs:i.mix({x:0,y:0,width:this.get("width"),height:this.get("height")},this.get("backgroundStyle"))}),t},n._beforeRenderUI=function(){var t=this._initSliderBackground(),e=this._initHandle("min"),n=this._initHandle("max"),i=this.addShape("rect",{attrs:this.get("middleAttr")});this.set("middleHandleElement",i),this.set("minHandleElement",e),this.set("maxHandleElement",n),this.set("backgroundElement",t),t.set("zIndex",0),i.set("zIndex",1),e.set("zIndex",2),n.set("zIndex",2),i.attr("cursor","move"),this.sort()},n._renderUI=function(){"horizontal"===this.get("layout")?this._renderHorizontal():this._renderVertical()},n._transform=function(t){var e=this.get("range"),n=e[0]/100,i=e[1]/100,r=this.get("width"),a=this.get("height"),o=this.get("minHandleElement"),s=this.get("maxHandleElement"),l=this.get("middleHandleElement");o.resetMatrix?(o.resetMatrix(),s.resetMatrix()):(o.initTransform(),s.initTransform()),"horizontal"===t?(l.attr({x:r*n,y:0,width:(i-n)*r,height:a}),o.translate(n*r,0),s.translate(i*r,0)):(l.attr({x:0,y:a*(1-i),width:r,height:(i-n)*a}),o.translate(0,(1-n)*a),s.translate(0,(1-i)*a))},n._renderHorizontal=function(){this._transform("horizontal")},n._renderVertical=function(){this._transform("vertical")},n._bindUI=function(){this.on("mousedown",i.wrapBehavior(this,"_onMouseDown"))},n._isElement=function(t,e){var n=this.get(e);if(t===n)return!0;if(n.isGroup){return n.get("children").indexOf(t)>-1}return!1},n._getRange=function(t,e){var n=t+e;return n=n>100?100:n,n=n<0?0:n},n._limitRange=function(t,e,n){n[0]=this._getRange(t,n[0]),n[1]=n[0]+e,n[1]>100&&(n[1]=100,n[0]=n[1]-e)},n._updateStatus=function(t,e){var n="x"===t?this.get("width"):this.get("height");t=i.upperFirst(t);var r,a=this.get("range"),o=this.get("page"+t),s=this.get("currentTarget"),l=this.get("rangeStash"),u="vertical"===this.get("layout")?-1:1,c=e["page"+t],h=(c-o)/n*100*u,f=this.get("minRange"),p=this.get("maxRange");a[1]<=a[0]?(this._isElement(s,"minHandleElement")||this._isElement(s,"maxHandleElement"))&&(a[0]=this._getRange(h,a[0]),a[1]=this._getRange(h,a[0])):(this._isElement(s,"minHandleElement")&&(a[0]=this._getRange(h,a[0]),f&&a[1]-a[0]<=f&&this._limitRange(h,f,a),p&&a[1]-a[0]>=p&&this._limitRange(h,p,a)),this._isElement(s,"maxHandleElement")&&(a[1]=this._getRange(h,a[1]),f&&a[1]-a[0]<=f&&this._limitRange(h,f,a),p&&a[1]-a[0]>=p&&this._limitRange(h,p,a))),this._isElement(s,"middleHandleElement")&&(r=l[1]-l[0],this._limitRange(h,r,a)),this.emit("sliderchange",{range:a}),this.set("page"+t,c),this._renderUI(),this.get("canvas").draw()},n._onMouseDown=function(t){var e=t.currentTarget,n=t.event,i=this.get("range");n.stopPropagation(),n.preventDefault(),this.set("pageX",n.pageX),this.set("pageY",n.pageY),this.set("currentTarget",e),this.set("rangeStash",[i[0],i[1]]),this._bindCanvasEvents()},n._bindCanvasEvents=function(){var t=this.get("canvas").get("containerDOM");this.onMouseMoveListener=a.addEventListener(t,"mousemove",i.wrapBehavior(this,"_onCanvasMouseMove")),this.onMouseUpListener=a.addEventListener(t,"mouseup",i.wrapBehavior(this,"_onCanvasMouseUp")),this.onMouseLeaveListener=a.addEventListener(t,"mouseleave",i.wrapBehavior(this,"_onCanvasMouseUp"))},n._onCanvasMouseMove=function(t){"horizontal"===this.get("layout")?this._updateStatus("x",t):this._updateStatus("y",t)},n._onCanvasMouseUp=function(){this._removeDocumentEvents()},n._removeDocumentEvents=function(){this.onMouseMoveListener.remove(),this.onMouseUpListener.remove(),this.onMouseLeaveListener.remove()},e}(r);t.exports=o},function(t,e,n){function i(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var r=n(0),a=n(171),o=n(377),s=n(378),l=["X","Y","XY"],u="X",c=function(t){function e(e,n){var a,o=i(i(a=t.call(this,e,n)||this));o.chart=n,o.type=o.type.toUpperCase();var c=o.data=n.get("data"),h=n.getYScales(),f=n.getXScale();h.push(f);var p=n.get("scaleController");return h.forEach(function(t){var e=t.field,n=p.defs[e]||{};o.limitRange[e]=s(c,t),o.originScaleDefsByField[e]=r.mix(n,{nice:!!n.nice}),t.isLinear?o.stepByField[e]=(t.max-t.min)*o.stepRatio:o.stepByField[e]=o.catStep}),-1===l.indexOf(o.type)&&(o.type=u),a}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(e,t);var n=e.prototype;return n.getDefaultCfg=function(){var e=t.prototype.getDefaultCfg.call(this);return r.mix({},e,{processEvent:"mousewheel",type:u,stepRatio:.05,stepByField:{},minScale:1,maxScale:4,catStep:2,limitRange:{},originScaleDefsByField:{}})},n._applyScale=function(t,e,n,i){void 0===n&&(n=0);var a=this,s=a.chart,l=a.stepByField;if(t.isLinear){var u=t.min,c=t.max,h=t.field,f=1-n,p=l[h]*e,g=u+p*n,d=c-p*f;d>g&&s.scale(h,{nice:!1,min:g,max:d})}else{var v=t.field,y=t.values,x=a.chart,m=x.get("coord"),_=o(x,v),b=a.limitRange[v],w=b.length,S=w/a.maxScale,M=w/a.minScale,C=y.length,A=m.invertPoint(i).x,k=C-e*this.catStep,P=parseInt(k*A),T=k+P;if(e>0&&C>=S){var I=P,O=T;T>C&&(O=C-1,I=C-k);var L=y.slice(I,O);x.scale(v,r.mix({},_,{values:L}))}else if(e<0&&C<=M){var E=b.indexOf(y[0]),D=b.indexOf(y[C-1]),F=Math.max(0,E-P),B=Math.min(D+T,w),R=b.slice(F,B);x.scale(v,r.mix({},_,{values:R}))}}},n.process=function(t){var e=this,n=e.chart,i=e.type,r=n.get("coord"),a=t.deltaY,o=r.invertPoint(t);if(a){e.onZoom&&e.onZoom(a,o,e),a>0?e.onZoomin&&e.onZoomin(a,o,e):e.onZoomout&&e.onZoomout(a,o,e);var s=a/Math.abs(a);if(i.indexOf("X")>-1&&e._applyScale(n.getXScale(),s,o.x,t),i.indexOf("Y")>-1){n.getYScales().forEach(function(n){e._applyScale(n,s,o.y,t)})}}n.repaint()},n.reset=function(){var t=this.view,e=this.originScaleDefsByField,n=t.getYScales(),i=t.getXScale();n.push(i),n.forEach(function(n){if(n.isLinear){var i=n.field;t.scale(i,e[i])}}),t.repaint()},e}(a);t.exports=c}])}); \ No newline at end of file diff --git a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js b/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js deleted file mode 100644 index fad9ab12..00000000 --- a/pig-visual/pig-sentinel-dashboard/src/main/webapp/resources/lib/js/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="
        ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ -return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
          '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
        • '+(t[0].content||"no content")+"
        • ";i'+(t[i].content||"no content")+"";return a}()+"
        ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
        '+(u.length>1?'':"")+'
        '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
        ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
        是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon-ext.png b/pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon-ext.png deleted file mode 100755 index bbbb669bb311514baa5db3a6a00b4644d0e280f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5911 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 bWW^%>x7XlHV^#Q1uOX^B?ki3(VEg|7!QHuF diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-1.gif b/pig-visual/pig-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-1.gif deleted file mode 100755 index db3a483e4b74971fbfb1cc0fb6499852cedfe650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmZ?wbhEHbRAo?Qn8?Ji_w)@mZNLBj|1&T!DE{a6a}5c0b_{Se(lcOY1PT3QVdY|A zV$cDyff`g97?`@J^shYqmS1s(LX_+4yGox$4el*+Jm?ved2^25GBru=T^dGm#<906 za&AQCZ08H8P;Bd&{NT;vl&}c_^L4%p?g_hjBu{YB29{c>Ob}p@z~Ks3xCw+@!HClp xtZ<(QPf3`00FNu+VbOvoEE+h73k#4LIKl$IE8t;)<_eUs!0QU6uz&iJhvXcHF*h)T1OnEW1i^?zgDfop1p?usL*#PMGT;HQkSO{q6FlJyb$PWkPf|h*eTST}7h8z$}MF(XD(aQ)ZLZ zM?v0rT<1C4XHn<6PbNA{XL@>1^)apdD_@tcYDrW#m`k#MmslI7p^P;Az74wGs`!SI zLs$GEZHsafXsu1i-WleMzAL(yw$-LK{0hv;6hrx8kx!!4$``dAyBnY9Jz&DqJo2$A z!(L$H=KqBeY~CF_viHPz^tTglc?D97CqEBjzUwH}7GI zapg8YZM~>2Wk%E$d&r@9ly9b4Q zJpM7T@}r63I(OExUlG%Xcjz3MU+9U^r!SkpjNThDtaP)7>j6L5z%o5|^hlVOyI*uY zt^UU6NTuY?(Lb4ZIU2Zb5Vz}Pb7KF%ivf&j^CL>$cDz?rMNTQQ|NqDVD7mhghUp%h zhIA{gi{S8y9YhIIbSv$`B!JiPi!0#4#Jge0)p&YVPHchWcyAn zQhvb8ggXGXs9;k`u9Uq*YB>O+Q3Rq=2hlLFcG{Q3ORH_}JnY8C+r%@}6|%ySP%bWG zV~mA;?P`Q2L_Ss})nrJ{$TmeA9Tt*4=}X5x%RioM@_?ZsKSEST-f+GBv~Ya)xX3O{ z8!d=YthI-13OI;RN~`>|6u5L{z20oBp%9MIj)n$!Aw{Wpq&Rtr4~*_74Gjo@3el>B zz(Rk;;>2lp73<2;d=r*8z%WkdsG=vRuG_fvxO#uN^El|+5Qoz^X!2MfxJ3m}vyi?> zMLLDi8+${Z6YbUg?8GNR>-+SwHKdFyr%HqWcs|X_l*-DAC^bG&KCqWg7-_`UlwQ`EdOp_LJkr`L$mHHs75uP?fSgVfsDjuE#ft2b8HDt0yFt!+;C zEgL=)G9ZFt4wa+N3Xg7FGc0~`&EEt6_%7tyzmnb9B_h1~7~GD4V-Bhx7~QKRkF>&aT>(-!Us@aJxAY@8E?HW$G8g zSz@7Jcp>iCp;lU1ieF6n7!oAa-1E!rS0 zF1lBFVS%G#ZO}b@*+bIk+7@Q|iG60vIDVpV%4tW8rKyzwRo_<25;8*Ky@n z-sX>W*b;M){5lB_Edc@m1`VHy0@dg$PTR9uE$O2&a?KAe?xRlCj&Z$iZYw - - - - Error - - - - - - -
        -

        System Error

        -

        ${exceptionMsg}

        - Back -

        -
        - - - \ No newline at end of file diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl deleted file mode 100755 index aace849f..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl +++ /dev/null @@ -1,239 +0,0 @@ -<#macro commonStyle> - - <#-- favicon --> - - - - - - - - - - - - - - - - - - - - - - - - - <#-- i18n --> - <#global I18n = I18nUtil.getMultString()?eval /> - - - -<#macro commonScript> - - - - - - - - - - - - - - <#-- jquery cookie --> - - <#-- jquery.validate --> - - - <#-- layer --> - - - <#-- common --> - - - - - -<#macro commonHeader> -
        - - -
        - - - - - - -<#macro commonLeft pageName > - - - - -<#macro commonControl > - - - - -
        - - -<#macro commonFooter > -
        - Powered by XXL-JOB ${I18n.admin_version} - -
        - \ No newline at end of file diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/help.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/help.ftl deleted file mode 100755 index 1409fc50..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/help.ftl +++ /dev/null @@ -1,47 +0,0 @@ - - - - <#import "./common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - ${I18n.admin_name} - -sidebar-collapse "> -
        - - <@netCommon.commonHeader /> - - <@netCommon.commonLeft "help" /> - - -
        - -
        -

        ${I18n.job_help}

        -
        - - -
        -
        -

        ${I18n.admin_name_full}

        -
        -

        - Github     - -

        - ${I18n.job_help_document} -

        - -

        -

        -
        -
        - -
        - - - - <@netCommon.commonFooter /> -
        -<@netCommon.commonScript /> - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/index.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/index.ftl deleted file mode 100755 index d642f4e6..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/index.ftl +++ /dev/null @@ -1,147 +0,0 @@ - - - - <#import "./common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - - ${I18n.admin_name} - -sidebar-collapse "> -
        - - <@netCommon.commonHeader /> - - <@netCommon.commonLeft "index" /> - - -
        - -
        -

        ${I18n.job_dashboard_name}

        - -
        - - -
        - - -
        - - <#-- 任务信息 --> -
        -
        - - -
        - ${I18n.job_dashboard_job_num} - ${jobInfoCount} - -
        -
        -
        - ${I18n.job_dashboard_job_num_tip} -
        -
        -
        - - <#-- 调度信息 --> -
        -
        - - -
        - ${I18n.job_dashboard_trigger_num} - ${jobLogCount} - -
        -
        -
        - - ${I18n.job_dashboard_trigger_num_tip} - <#--<#if jobLogCount gt 0> - 调度成功率:${(jobLogSuccessCount*100/jobLogCount)?string("0.00")}% - --> - -
        -
        -
        - - <#-- 执行器 --> -
        -
        - - -
        - ${I18n.job_dashboard_jobgroup_num} - ${executorCount} - -
        -
        -
        - ${I18n.job_dashboard_jobgroup_num_tip} -
        -
        -
        - -
        - - <#-- 调度报表:时间区间筛选,左侧折线图 + 右侧饼图 --> -
        -
        -
        -
        -

        ${I18n.job_dashboard_report}

        - <#----> - - -
        - - <#----> -
        - - -
        -
        -
        - <#-- 左侧折线图 --> -
        -
        -
        - <#-- 右侧饼图 --> -
        -
        -
        -
        -
        -
        -
        -
        - -
        - -
        - - - - <@netCommon.commonFooter /> -
        -<@netCommon.commonScript /> - - - -<#-- echarts --> - - - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobcode/jobcode.index.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobcode/jobcode.index.ftl deleted file mode 100755 index a386b288..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobcode/jobcode.index.ftl +++ /dev/null @@ -1,164 +0,0 @@ - - - - <#import "../common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - - ${I18n.admin_name} - - - - -
        - -
        - -
        - -
        - - - <#--<@netCommon.commonFooter />--> -
        - - - - -<@netCommon.commonScript /> - - - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js" /> - <#assign glueTypeIdeMode = "text/x-java" /> - - <#if jobInfo.glueType == "GLUE_GROOVY" > - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js" /> - <#assign glueTypeIdeMode = "text/x-java" /> - <#elseif jobInfo.glueType == "GLUE_SHELL" > - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/shell/shell.js" /> - <#assign glueTypeIdeMode = "text/x-sh" /> - <#elseif jobInfo.glueType == "GLUE_PYTHON" > - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/python/python.js" /> - <#assign glueTypeIdeMode = "text/x-python" /> - <#elseif jobInfo.glueType == "GLUE_PHP" > - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/php/php.js" /> - <#assign glueTypeIdeMode = "text/x-php" /> - <#assign glueTypeModeSrc02 = "${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js" /> - <#elseif jobInfo.glueType == "GLUE_NODEJS" > - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/javascript/javascript.js" /> - <#assign glueTypeIdeMode = "text/javascript" /> - <#elseif jobInfo.glueType == "GLUE_POWERSHELL" > - <#assign glueTypeModeSrc = "${request.contextPath}/static/plugins/codemirror/mode/powershell/powershell.js" /> - <#assign glueTypeIdeMode = "powershell" /> - - - - - -<#if glueTypeModeSrc02?exists> - - - - - - - - - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl deleted file mode 100755 index 778df9ec..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl +++ /dev/null @@ -1,172 +0,0 @@ - - - - <#import "../common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - - ${I18n.admin_name} - -sidebar-collapse "> -
        - - <@netCommon.commonHeader /> - - <@netCommon.commonLeft "jobgroup" /> - - -
        - -
        -

        ${I18n.jobgroup_name}

        -
        - - -
        - -
        -
        -
        - AppName - -
        -
        -
        -
        - ${I18n.jobgroup_field_title} - -
        -
        -
        - -
        -
        - -
        -
        - -
        -
        -
        -
        - - - - - - - - - - - - - -
        IDAppName${I18n.jobgroup_field_title}${I18n.jobgroup_field_addressType}OnLine ${I18n.jobgroup_field_registryList}${I18n.system_opt}
        -
        -
        -
        -
        -
        -
        - - - - - - - - - <@netCommon.commonFooter /> -
        - -<@netCommon.commonScript /> - - - - - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl deleted file mode 100755 index 3a5d7d8a..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl +++ /dev/null @@ -1,540 +0,0 @@ - - - - <#import "../common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - - ${I18n.admin_name} - -sidebar-collapse"> -
        - - <@netCommon.commonHeader /> - - <@netCommon.commonLeft "jobinfo" /> - - -
        - -
        -

        ${I18n.jobinfo_name}

        -
        - - -
        - -
        -
        -
        - ${I18n.jobinfo_field_jobgroup} - -
        -
        -
        -
        - -
        -
        -
        -
        - -
        -
        -
        -
        - -
        -
        -
        -
        - -
        -
        -
        - -
        -
        - -
        -
        - -
        -
        -
        - <#--
        -

        调度列表

        -
        --> -
        - - - - - - - - - - - - - - - - - - - -
        ${I18n.jobinfo_field_id}${I18n.jobinfo_field_jobgroup}${I18n.jobinfo_field_jobdesc}${I18n.schedule_type}${I18n.jobinfo_field_gluetype}${I18n.jobinfo_field_executorparam}addTimeupdateTime${I18n.jobinfo_field_author}${I18n.jobinfo_field_alarmemail}${I18n.system_status}${I18n.system_opt}
        -
        -
        -
        -
        -
        -
        - - - <@netCommon.commonFooter /> -
        - - - - - - - -<#-- trigger --> - - -<@netCommon.commonScript /> - - - - - -<#-- cronGen --> - - - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl deleted file mode 100644 index bb8072f9..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl +++ /dev/null @@ -1,70 +0,0 @@ - - - - <#import "../common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - ${I18n.admin_name} - - - -
        - -
        - -
        - -
        -
        -
        -                
        -
      • -
        -
        -
        - - - <@netCommon.commonFooter /> - -
        - -<@netCommon.commonScript /> - - - - - \ No newline at end of file diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl deleted file mode 100755 index a2e983de..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl +++ /dev/null @@ -1,180 +0,0 @@ - - - - <#import "../common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - - - - ${I18n.admin_name} - -sidebar-collapse "> -
        - - <@netCommon.commonHeader /> - - <@netCommon.commonLeft "joblog" /> - - -
        - -
        -

        ${I18n.joblog_name}

        -
        - - -
        -
        -
        -
        - ${I18n.jobinfo_field_jobgroup} - -
        -
        -
        -
        - ${I18n.jobinfo_job} - -
        -
        - -
        -
        - ${I18n.joblog_status} - -
        -
        - -
        -
        - - ${I18n.joblog_field_triggerTime} - - -
        -
        - -
        - -
        - -
        - -
        -
        - -
        -
        -
        - <#--

        调度日志

        --> -
        - - - - - - <#-- - - --> - - - - - - - - - - -
        ${I18n.jobinfo_field_id}jobGroup执行器地址运行模式任务参数${I18n.joblog_field_triggerTime}${I18n.joblog_field_triggerCode}${I18n.joblog_field_triggerMsg}${I18n.joblog_field_handleTime}${I18n.joblog_field_handleCode}${I18n.joblog_field_handleMsg}${I18n.system_opt}
        -
        -
        -
        -
        -
        -
        - - - <@netCommon.commonFooter /> -
        - - - - -<@netCommon.commonScript /> - - - - - - - - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/login.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/login.ftl deleted file mode 100755 index c3f69638..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/login.ftl +++ /dev/null @@ -1,45 +0,0 @@ - - - - <#import "./common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - ${I18n.admin_name} - - - -<@netCommon.commonScript /> - - - - - diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/user/user.index.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/user/user.index.ftl deleted file mode 100755 index 01203982..00000000 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/user/user.index.ftl +++ /dev/null @@ -1,188 +0,0 @@ - - - - <#import "../common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - - ${I18n.admin_name} - -sidebar-collapse"> -
        - - <@netCommon.commonHeader /> - - <@netCommon.commonLeft "user" /> - - -
        - -
        -

        ${I18n.user_manage}

        -
        - - -
        - -
        -
        -
        - ${I18n.user_role} - -
        -
        -
        -
        - ${I18n.user_username} - -
        -
        -
        - -
        -
        - -
        -
        - -
        -
        -
        -
        - - - - - - - - - - - - - -
        ID${I18n.user_username}${I18n.user_password}${I18n.user_role}${I18n.user_permission}${I18n.system_opt}
        -
        -
        -
        -
        -
        -
        - - - <@netCommon.commonFooter /> -
        - - - - - - - -<@netCommon.commonScript /> - - - - - - diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 9469be1b..dc772450 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.7 + 3.7.0-JDK8 pig-visual @@ -31,8 +31,7 @@ pig-codegen + pig-quartz pig-monitor - pig-sentinel-dashboard - pig-xxl-job-admin diff --git a/pom.xml b/pom.xml index 53f5f1d4..904ad576 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig ${project.artifactId} - 3.6.7 + 3.7.0-JDK8 pom https://www.pig4cloud.com @@ -35,8 +35,8 @@ 1.8 2.7.10 0.4.3 - 3.6.0 2.2.2 + 0.0.1 2.3 3.1 1.10 -- Gitee From 80adb67cff3a5040318560f2e8736a7cea5ef8ac Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 17 Aug 2023 21:46:22 +0800 Subject: [PATCH 116/238] :bookmark: Releasing / Version tags. 3.7.0-JDK8 --- .../component/PigSecurityInnerAspect.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java index 42f2ff1f..d270f5c8 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java @@ -16,8 +16,10 @@ package com.pig4cloud.pig.common.security.component; +import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.annotation.Inner; +import javax.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -25,10 +27,9 @@ import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.Ordered; +import org.springframework.core.annotation.AnnotationUtils; import org.springframework.security.access.AccessDeniedException; -import javax.servlet.http.HttpServletRequest; - /** * @author lengleng * @date 2022-06-04 @@ -46,13 +47,12 @@ public class PigSecurityInnerAspect implements Ordered { @Before("@within(inner) || @annotation(inner)") public void around(JoinPoint point, Inner inner) { // 实际注入的inner实体由表达式后一个注解决定,即是方法上的@Inner注解实体,若方法上无@Inner注解,则获取类上的 - // 这段代码没有意义,拦截的就是@Inner注解,怎么会为null呢 - // if (inner == null) { - // Class clazz = point.getTarget().getClass(); - // inner = AnnotationUtils.findAnnotation(clazz, Inner.class); - // } + if (inner == null) { + Class clazz = point.getTarget().getClass(); + inner = AnnotationUtils.findAnnotation(clazz, Inner.class); + } String header = request.getHeader(SecurityConstants.FROM); - if (inner.value() && !SecurityConstants.FROM_IN.equals(header)) { + if (inner.value() && !StrUtil.equals(SecurityConstants.FROM_IN, header)) { log.warn("访问接口 {} 没有权限", point.getSignature().getName()); throw new AccessDeniedException("Access is denied"); } -- Gitee From 0e8fa668b34f9e39546d34eefcf2b8e2ede97c66 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 17 Aug 2023 21:50:48 +0800 Subject: [PATCH 117/238] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E5=8C=96=EF=BC=8Cquartz=20=E9=85=8D=E7=BD=AE=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E9=93=BE=E6=8E=A5=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig_config.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/pig_config.sql b/db/pig_config.sql index ba73c3da..e84782f8 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -43,7 +43,7 @@ INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 代码生成模块\n - id: pig-quartz\n uri: lb://pig-quartz\n predicates:\n - Path=/job/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', 'cde041935aeeb2a5f59bf3b56d78f56d', '2022-05-08 12:10:37', '2023-07-05 13:50:59', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\nfile:\n bucketName: s3demo \n local:\n enable: true\n base-path: /Users/lengleng/Downloads/img', '48f8db128aeb5debb331bae49ff37908', '2022-05-08 12:10:37', '2023-07-07 14:44:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:4000/pig_job?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构 (第一次启动自动创建表,后续改成never 即可)\n jdbc:\n initialize-schema: always\n\n', '7a2859cbd056ef554b6163f5c70dfcf5', '2023-07-02 12:24:33', '2023-08-17 20:44:54', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_job?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构 (第一次启动自动创建表,后续改成never 即可)\n jdbc:\n initialize-schema: always\n\n', '7a2859cbd056ef554b6163f5c70dfcf5', '2023-07-02 12:24:33', '2023-08-17 20:44:54', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); COMMIT; -- ---------------------------- -- Gitee From e0a9c78a1dad94c42e6a6801b9518bed07925127 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 17 Aug 2023 22:11:36 +0800 Subject: [PATCH 118/238] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E5=8C=96=EF=BC=8Cquartz=20=E9=85=8D=E7=BD=AE=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E9=93=BE=E6=8E=A5=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-register/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-register/src/main/resources/application.yml b/pig-register/src/main/resources/application.yml index d27db8b1..46125f56 100644 --- a/pig-register/src/main/resources/application.yml +++ b/pig-register/src/main/resources/application.yml @@ -10,7 +10,7 @@ db: user: ${MYSQL_USER:root} password: ${MYSQL_PWD:root} url: - 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:4000}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true nacos: -- Gitee From 2f673068ef8af0db5c648ce83ba41418c42a8672 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 17 Aug 2023 22:16:13 +0800 Subject: [PATCH 119/238] :art: Improving structure / format of the code. up format 0.0.39 --- pig-common/pig-common-bom/pom.xml | 2 +- .../PigRemoteRegisteredClientRepository.java | 49 +++++++++---------- pom.xml | 2 +- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index ef3699d1..d90f067d 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -21,7 +21,7 @@ 1.8 1.8 4.9.9 - 0.0.38 + 0.0.39 1.2.83 1.6.9 2.2.0 diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java index 35c62955..9e7c217c 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java @@ -86,16 +86,15 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo public RegisteredClient findByClientId(String clientId) { SysOauthClientDetails clientDetails = RetOps - .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)) - .getData() - .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( - new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); + .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)) + .getData() + .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( + new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) - .clientId(clientDetails.getClientId()) - .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) - .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); - + .clientId(clientDetails.getClientId()) + .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); for (String authorizedGrantType : clientDetails.getAuthorizedGrantTypes()) { builder.authorizationGrantType(new AuthorizationGrantType(authorizedGrantType)); @@ -103,28 +102,28 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo // 回调地址 Optional.ofNullable(clientDetails.getWebServerRedirectUri()) - .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) - .filter(StrUtil::isNotBlank) - .forEach(builder::redirectUri)); + .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::redirectUri)); // scope Optional.ofNullable(clientDetails.getScope()) - .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) - .filter(StrUtil::isNotBlank) - .forEach(builder::scope)); + .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::scope)); return builder - .tokenSettings(TokenSettings.builder() - .accessTokenFormat(OAuth2TokenFormat.REFERENCE) - .accessTokenTimeToLive(Duration.ofSeconds( - Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) - .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) - .orElse(refreshTokenValiditySeconds))) - .build()) - .clientSettings(ClientSettings.builder() - .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) - .build()) - .build(); + .tokenSettings(TokenSettings.builder() + .accessTokenFormat(OAuth2TokenFormat.REFERENCE) + .accessTokenTimeToLive(Duration.ofSeconds( + Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) + .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) + .orElse(refreshTokenValiditySeconds))) + .build()) + .clientSettings(ClientSettings.builder() + .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) + .build()) + .build(); } diff --git a/pom.xml b/pom.xml index 904ad576..64b36b6f 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ username password 4.9.9 - 0.0.38 + 0.0.39 -- Gitee From a6894fa2e3b18ac5985d818bd15053540698733c Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 19 Aug 2023 20:29:12 +0800 Subject: [PATCH 120/238] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E5=8C=96=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E8=8F=9C=E5=8D=95SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/db/pig.sql b/db/pig.sql index c42cd8e5..55ea7e67 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -338,10 +338,6 @@ INSERT INTO `sys_menu` VALUES (2400, '终端管理', 'client', NULL, '/admin/cli INSERT INTO `sys_menu` VALUES (2401, '客户端新增', NULL, 'sys_client_add', NULL, 2400, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2021-05-25 03:12:55', '0'); INSERT INTO `sys_menu` VALUES (2402, '客户端修改', NULL, 'sys_client_edit', NULL, 2400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:37:06', ' ', '2021-05-25 03:12:55', '0'); INSERT INTO `sys_menu` VALUES (2403, '客户端删除', NULL, 'sys_client_del', NULL, 2400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:39:16', ' ', '2021-05-25 03:12:55', '0'); -INSERT INTO `sys_menu` VALUES (2500, '密钥管理', 'key', NULL, '/admin/social/index', 2000, 'iconfont icon-quanxian', '1', 10, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:26:16', '0'); -INSERT INTO `sys_menu` VALUES (2501, '密钥新增', NULL, 'sys_social_details_add', NULL, 2500, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:19', '0'); -INSERT INTO `sys_menu` VALUES (2502, '密钥修改', NULL, 'sys_social_details_edit', NULL, 2500, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:19', '0'); -INSERT INTO `sys_menu` VALUES (2503, '密钥删除', NULL, 'sys_social_details_del', NULL, 2500, '1', '1', 2, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:23', '0'); INSERT INTO `sys_menu` VALUES (2600, '令牌管理', 'token', NULL, '/admin/token/index', 2000, 'ele-Key', '1', 11, '0', NULL, '0', '', '2018-09-04 05:58:41', 'admin', '2023-02-16 15:28:28', '0'); INSERT INTO `sys_menu` VALUES (2601, '令牌删除', NULL, 'sys_token_del', NULL, 2600, NULL, '1', 1, '0', NULL, '1', ' ', '2018-09-04 05:59:50', ' ', '2020-03-24 08:57:24', '0'); INSERT INTO `sys_menu` VALUES (2800, 'Quartz管理', 'quartz', NULL, '/daemon/job-manage/index', 2000, 'ele-AlarmClock', '1', 8, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:25:06', '0'); @@ -353,12 +349,6 @@ INSERT INTO `sys_menu` VALUES (2850, '任务开始', NULL, 'job_sys_job_start_jo INSERT INTO `sys_menu` VALUES (2860, '任务刷新', NULL, 'job_sys_job_refresh_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:30', '0'); INSERT INTO `sys_menu` VALUES (2870, '执行任务', NULL, 'job_sys_job_run_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2019-08-08 15:35:18', ' ', '2020-03-24 08:57:31', '0'); INSERT INTO `sys_menu` VALUES (2871, '导出', NULL, 'job_sys_job_export', NULL, 2800, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-06 15:26:13', ' ', NULL, '0'); -INSERT INTO `sys_menu` VALUES (2900, '国际化管理', 'i18n', NULL, '/admin/i18n/index', 2000, 'iconfont icon-zhongyingzhuanhuan', '1', 8, '0', NULL, '0', '', NULL, 'admin', '2023-02-16 15:25:18', '0'); -INSERT INTO `sys_menu` VALUES (2901, '系统表-国际化查看', NULL, 'sys_i18n_view', NULL, 2900, '1', '1', 0, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); -INSERT INTO `sys_menu` VALUES (2902, '系统表-国际化新增', NULL, 'sys_i18n_add', NULL, 2900, '1', '1', 1, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); -INSERT INTO `sys_menu` VALUES (2903, '系统表-国际化修改', NULL, 'sys_i18n_edit', NULL, 2900, '1', '1', 2, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); -INSERT INTO `sys_menu` VALUES (2904, '系统表-国际化删除', NULL, 'sys_i18n_del', NULL, 2900, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); -INSERT INTO `sys_menu` VALUES (2905, '导入导出', NULL, 'sys_i18n_export', NULL, 2900, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0'); INSERT INTO `sys_menu` VALUES (2906, '文件管理', 'file', NULL, '/admin/file/index', 2000, 'ele-Files', '1', 6, '0', NULL, '0', '', '2019-06-25 12:44:46', 'admin', '2023-02-16 15:24:42', '0'); INSERT INTO `sys_menu` VALUES (2907, '删除文件', NULL, 'sys_file_del', NULL, 2906, NULL, '1', 1, '0', NULL, '1', ' ', '2019-06-25 13:41:41', ' ', '2020-03-24 08:58:42', '0'); INSERT INTO `sys_menu` VALUES (4000, '系统监控', 'monitor', NULL, '/daemon', -1, 'iconfont icon-shuju', '1', 3, '0', '0', '0', 'admin', '2023-02-06 20:20:47', 'admin', '2023-02-23 20:01:07', '0'); @@ -568,10 +558,6 @@ INSERT INTO `sys_role_menu` VALUES (1, 2400); INSERT INTO `sys_role_menu` VALUES (1, 2401); INSERT INTO `sys_role_menu` VALUES (1, 2402); INSERT INTO `sys_role_menu` VALUES (1, 2403); -INSERT INTO `sys_role_menu` VALUES (1, 2500); -INSERT INTO `sys_role_menu` VALUES (1, 2501); -INSERT INTO `sys_role_menu` VALUES (1, 2502); -INSERT INTO `sys_role_menu` VALUES (1, 2503); INSERT INTO `sys_role_menu` VALUES (1, 2600); INSERT INTO `sys_role_menu` VALUES (1, 2601); INSERT INTO `sys_role_menu` VALUES (1, 2800); @@ -583,12 +569,6 @@ INSERT INTO `sys_role_menu` VALUES (1, 2850); INSERT INTO `sys_role_menu` VALUES (1, 2860); INSERT INTO `sys_role_menu` VALUES (1, 2870); INSERT INTO `sys_role_menu` VALUES (1, 2871); -INSERT INTO `sys_role_menu` VALUES (1, 2900); -INSERT INTO `sys_role_menu` VALUES (1, 2901); -INSERT INTO `sys_role_menu` VALUES (1, 2902); -INSERT INTO `sys_role_menu` VALUES (1, 2903); -INSERT INTO `sys_role_menu` VALUES (1, 2904); -INSERT INTO `sys_role_menu` VALUES (1, 2905); INSERT INTO `sys_role_menu` VALUES (1, 2906); INSERT INTO `sys_role_menu` VALUES (1, 2907); INSERT INTO `sys_role_menu` VALUES (1, 4000); -- Gitee From 3b87cf34f6fc6badbfd6cc888a3a5298d02a98bf Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 22 Aug 2023 12:33:02 +0800 Subject: [PATCH 121/238] :bookmark: Releasing / Version tags. 3.7.0-JDK8 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63afb06e..760bd926 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ ### 分支说明 - master: java8 + springboot 2.7 + springcloud 2021 -- jdk17: java17 + springboot 3.0 + springcloud 2022 +- jdk17: java17 + springboot 3.1 + springcloud 2022 ### 核心依赖 -- Gitee From 4275fcc61d89da6fce33331c732bcb141265acc4 Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 23 Aug 2023 13:40:29 +0800 Subject: [PATCH 122/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E7=9A=84=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig_codegen.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql index 98a0d741..a7d4b1ed 100644 --- a/db/pig_codegen.sql +++ b/db/pig_codegen.sql @@ -215,7 +215,7 @@ CREATE TABLE `gen_template` ( BEGIN; INSERT INTO `gen_template` VALUES (1, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-07-21 22:12:38', '0', 1, '', 'admin'); INSERT INTO `gen_template` VALUES (2, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-07-21 22:12:41', '0', 1, '', 'admin'); -INSERT INTO `gen_template` VALUES (3, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pig.common.core.util.R;\nimport com.pig4cloud.pig.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.core.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page,@ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.queryType == \'=\')\n wrapper.eq(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight(StrUtil.isNotBlank($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className}) {\n return ${className}Service.list(Wrappers.query(${className}));\n }\n}', '2023-02-23 01:16:17', '2023-07-21 22:02:51', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (3, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pig.common.core.util.R;\nimport com.pig4cloud.pig.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.pig.common.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.core.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.attrType == \'String\')\n#set($expression=\"StrUtil.isNotBlank\")\n#else\n#set($expression=\"Objects.nonNull\")\n#end\n#if($field.queryType == \'=\')\n wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight($expression($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @param ids 导出指定ID\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className},${pk.attrType}[] ids) {\n return ${className}Service.list(Wrappers.lambdaQuery(${className}).in(ArrayUtil.isNotEmpty(ids), ${ClassName}Entity::$str.getProperty($pk.attrName), ids));\n }\n}', '2023-02-23 01:16:17', '2023-08-22 20:54:58', '0', 1, '', 'admin'); INSERT INTO `gen_template` VALUES (4, 'Service', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java', 'Service', 'package ${package}.${moduleName}.service;\n\n#if($ChildClassName)\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport com.baomidou.mybatisplus.extension.service.IService;\n#end\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n\n#if($ChildClassName)\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(Long[] ids);\n\n Boolean removeChild(Long[] ids);\n#else\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:16:53', '2023-06-04 10:35:25', '0', 1, ' ', ' '); INSERT INTO `gen_template` VALUES (5, 'ServiceImpl', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java', 'ServiceImpl', 'package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n#if($ChildClassName)\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\n#end\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n#if($ChildClassName)\n@RequiredArgsConstructor\n#end\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n#if($ChildClassName)\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#foreach ($field in $childFieldList)\n#if($field.primaryPk)\n#set($getChildPkName=$str.getProperty($field.attrName))\n#end\n#end\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.getId());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(Long[] ids) {\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery().in(${ChildClassName}Entity::$str.getProperty($childField), ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(Long[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n#end\n}', '2023-02-23 01:17:36', '2023-06-04 10:35:21', '0', 1, ' ', ' '); INSERT INTO `gen_template` VALUES (6, '实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ClassName}Entity.java', 'Entity', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n#if($ChildClassName)\nimport com.alibaba.excel.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk)\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n private $field.attrType $field.attrName;\n#end\n#if($ChildClassName)\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n#end\n}', '2023-02-23 01:17:53', '2023-06-04 10:45:15', '0', 1, ' ', ' '); -- Gitee From ac2b4fd2de777cb895657c01a26e4a9ed607c92b Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 23 Aug 2023 14:05:51 +0800 Subject: [PATCH 123/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20swagger=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=B9=B3=E9=93=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/swagger/config/SwaggerAutoConfiguration.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/SwaggerAutoConfiguration.java b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/SwaggerAutoConfiguration.java index 4ce4e8f5..076986c1 100644 --- a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/SwaggerAutoConfiguration.java +++ b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/SwaggerAutoConfiguration.java @@ -25,6 +25,7 @@ import io.swagger.v3.oas.models.security.Scopes; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; import lombok.RequiredArgsConstructor; +import org.springdoc.core.SpringDocUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ServiceInstance; @@ -66,6 +67,9 @@ public class SwaggerAutoConfiguration { String path = swaggerProperties.getServices().get(serviceInstance.getServiceId()); serverList.add(new Server().url(swaggerProperties.getGateway() + "/" + path)); openAPI.servers(serverList); + + // 支持参数平铺 + SpringDocUtils.getConfig().addSimpleTypesForParameterObject(Class.class); return openAPI; } -- Gitee From f85a0acac55d01158a8be8358d481f5604e541ba Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 24 Aug 2023 10:53:37 +0800 Subject: [PATCH 124/238] =?UTF-8?q?:arrow=5Fup:=20Upgrading=20dependencies?= =?UTF-8?q?.=20=E9=81=BF=E5=85=8D=E9=AA=8C=E8=AF=81=E7=A0=81=E8=B4=9F?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 64b36b6f..db31c159 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 1.8 2.7.10 0.4.3 - 2.2.2 + 2.2.3 0.0.1 2.3 3.1 -- Gitee From bdcc11cf40ed9181529eeb81a9f498a55bb6bcde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Thu, 24 Aug 2023 14:16:30 +0800 Subject: [PATCH 125/238] :arrow_up: spring-boot from 2.7.13 to 2.7.14 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 760bd926..5caee4a0 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ | 依赖 | 版本 | |-----------------------------|------------| -| Spring Boot | 2.7.13 | +| Spring Boot | 2.7.14 | | Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.3 | diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index d90f067d..b195f6c6 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -15,7 +15,7 @@ ${project.version} - 2.7.13 + 2.7.14 UTF-8 2.17.1 1.8 diff --git a/pom.xml b/pom.xml index 64b36b6f..25ec0a7c 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.13 + 2.7.14 2021.0.8 2021.0.5.0 UTF-8 -- Gitee From 29c56bdefd17dbbef87c9a569c96a73ab00809ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Thu, 24 Aug 2023 14:18:56 +0800 Subject: [PATCH 126/238] =?UTF-8?q?:arrow=5Fup:=20:bug:=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20com.amazonaws:aws-java-sdk-s3=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=AB=98=E5=8D=B1=E6=BC=8F=E6=B4=9E=20CVE-2022-31159?= =?UTF-8?q?=20https://github.com/advisories/GHSA-c28r-hw5m-5gv3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index d90f067d..0a8022c6 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -31,7 +31,7 @@ 1.6.1 1.2.6 7.1 - 1.11.543 + 1.12.261 1.0.5 2.0.2 2.3.5 -- Gitee From d9b2e0a792ca259f88c20f1d6f87d296ca20bc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Thu, 24 Aug 2023 14:23:51 +0800 Subject: [PATCH 127/238] =?UTF-8?q?:memo:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 760bd926..b72b179d 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ | Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.3 | -| Mybatis Plus | 3.5.3.1 | -| hutool | 5.8.1 | +| Mybatis Plus | 3.5.3.2 | +| hutool | 5.8.21 | ### 模块说明 -- Gitee From d98073e5fce959e55e5879f1ba8336f0b66b1a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Thu, 24 Aug 2023 14:29:00 +0800 Subject: [PATCH 128/238] =?UTF-8?q?:wrench:=20=E4=BC=98=E5=8C=96=20Dockerf?= =?UTF-8?q?ile=EF=BC=8C=E5=87=8F=E5=B0=91=E5=B1=82=E6=95=B0=20WORKDIR=20?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E8=87=AA=E5=8A=A8=E5=88=9B=E5=BB=BA=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=EF=BC=8C=E6=97=A0=E9=9C=80=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=20mkdir=20=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-auth/Dockerfile | 2 -- pig-gateway/Dockerfile | 2 -- pig-register/Dockerfile | 2 -- pig-upms/pig-upms-biz/Dockerfile | 2 -- pig-visual/pig-codegen/Dockerfile | 2 -- pig-visual/pig-monitor/Dockerfile | 2 -- pig-visual/pig-quartz/Dockerfile | 2 -- 7 files changed, 14 deletions(-) diff --git a/pig-auth/Dockerfile b/pig-auth/Dockerfile index 0d630f03..e2440b2a 100755 --- a/pig-auth/Dockerfile +++ b/pig-auth/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-auth - WORKDIR /pig-auth ARG JAR_FILE=target/pig-auth.jar diff --git a/pig-gateway/Dockerfile b/pig-gateway/Dockerfile index 9e30d95e..c20004d3 100755 --- a/pig-gateway/Dockerfile +++ b/pig-gateway/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-gateway - WORKDIR /pig-gateway ARG JAR_FILE=target/pig-gateway.jar diff --git a/pig-register/Dockerfile b/pig-register/Dockerfile index b4425562..43df994a 100644 --- a/pig-register/Dockerfile +++ b/pig-register/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-register - WORKDIR /pig-register ARG JAR_FILE=target/pig-register.jar diff --git a/pig-upms/pig-upms-biz/Dockerfile b/pig-upms/pig-upms-biz/Dockerfile index 38f00480..7c0bbc2e 100644 --- a/pig-upms/pig-upms-biz/Dockerfile +++ b/pig-upms/pig-upms-biz/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-upms-biz - WORKDIR /pig-upms-biz ARG JAR_FILE=target/pig-upms-biz.jar diff --git a/pig-visual/pig-codegen/Dockerfile b/pig-visual/pig-codegen/Dockerfile index a4120858..0b87aa88 100644 --- a/pig-visual/pig-codegen/Dockerfile +++ b/pig-visual/pig-codegen/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-codegen - WORKDIR /pig-codegen ARG JAR_FILE=target/pig-codegen.jar diff --git a/pig-visual/pig-monitor/Dockerfile b/pig-visual/pig-monitor/Dockerfile index 015b9438..ffa4ad7c 100755 --- a/pig-visual/pig-monitor/Dockerfile +++ b/pig-visual/pig-monitor/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-monitor - WORKDIR /pig-monitor ARG JAR_FILE=target/pig-monitor.jar diff --git a/pig-visual/pig-quartz/Dockerfile b/pig-visual/pig-quartz/Dockerfile index 270aff8a..36f1e6a7 100644 --- a/pig-visual/pig-quartz/Dockerfile +++ b/pig-visual/pig-quartz/Dockerfile @@ -1,7 +1,5 @@ FROM moxm/java:1.8-full -RUN mkdir -p /pig-quartz - WORKDIR /pig-quartz ARG JAR_FILE=target/pig-quartz.jar -- Gitee From fa84f67755d83cdd9418e3ac95e65c19bf08026c Mon Sep 17 00:00:00 2001 From: Mac666 Date: Thu, 24 Aug 2023 13:48:23 +0000 Subject: [PATCH 129/238] up spring-boot version close #I7VR8X Signed-off-by: Mac666 --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 760bd926..f092ce4c 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ | 依赖 | 版本 | |-----------------------------|------------| -| Spring Boot | 2.7.13 | +| Spring Boot | 2.7.15 | | Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.3 | diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index d90f067d..53e9e6ea 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -15,7 +15,7 @@ ${project.version} - 2.7.13 + 2.7.15 UTF-8 2.17.1 1.8 diff --git a/pom.xml b/pom.xml index db31c159..b53ce674 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.13 + 2.7.15 2021.0.8 2021.0.5.0 UTF-8 -- Gitee From 7ecaf0f54233598dbc3fef09b279adb4d0149012 Mon Sep 17 00:00:00 2001 From: Mac666 Date: Fri, 25 Aug 2023 02:27:48 +0000 Subject: [PATCH 130/238] =?UTF-8?q?up=20nacos=20close=20#I7VROS=20?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E8=BE=BE=E6=A2=A6=E7=8E=AF=E5=A2=83=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mac666 --- pig-register/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-register/pom.xml b/pig-register/pom.xml index ccd1201d..c762efd8 100644 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -27,7 +27,7 @@ nacos 注册配置中心 - 2.2.4 + 2.2.4-OEM -- Gitee From 17069258ffbe0c9b9bcc781edd4e2b1ea6b758ed Mon Sep 17 00:00:00 2001 From: yurin Date: Sun, 27 Aug 2023 12:00:15 +0800 Subject: [PATCH 131/238] =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4bug?= =?UTF-8?q?fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/SysUserMapper.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml index 2b3ed9f7..00ac0f5c 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pig-upms/pig-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -103,8 +103,8 @@ FROM sys_user u LEFT JOIN sys_user_role urole ON urole.user_id = u.user_id - LEFT JOIN sys_role r ON r.role_id = urole.role_id - WHERE u.username = #{username} + LEFT JOIN sys_role r ON r.role_id = urole.role_id and r.del_flag = '0' + WHERE u.username = #{username} and u.del_flag = '0' + +
        +
        + +
        - - - - -
        - +
        + +
        + + <#if error??> +
        + ${error} +
        + + +
        + +
        +
        + +
        + + Copyright © 2021-2023 + PIGCLOUD +
        +
        + + + + + -- Gitee From d8aafe5a5659b4290a0f83943862f7379b201731 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 13 Nov 2023 19:56:01 +0800 Subject: [PATCH 156/238] =?UTF-8?q?:sparkles:=20Introducing=20new=20featur?= =?UTF-8?q?es.=20=E6=94=AF=E6=8C=81=20=E4=B8=8A=E4=B8=8B=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-register/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 44e803cf..0a69fcdd 100644 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -27,7 +27,7 @@ nacos 注册配置中心 - 2.2.4-OEM + 2.2.4-x86 -- Gitee From eb6df8dfe423e283fed291dc9bc26ab4095681ad Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Thu, 16 Nov 2023 03:53:15 +0000 Subject: [PATCH 157/238] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E9=98=B2=E6=AD=A2=E8=B7=A8=E5=9F=9F=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=96=87=E4=BB=B6=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: twelvet <2471835953@qq.com> --- .../pig4cloud/pig/codegen/controller/GeneratorController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java index 5d7fa0f1..224bcfc3 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java @@ -70,6 +70,7 @@ public class GeneratorController { byte[] data = outputStream.toByteArray(); response.reset(); + response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s.zip", tableIds)); response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length)); response.setContentType("application/octet-stream; charset=UTF-8"); -- Gitee From 8fe690bc5d387aff95c1de89b370c84315310473 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 20 Nov 2023 04:37:32 +0000 Subject: [PATCH 158/238] =?UTF-8?q?ref:=20=E9=87=8D=E6=9E=84=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E8=B7=AF=E5=BE=84=E6=94=AF=E6=8C=81=E5=8D=95?= =?UTF-8?q?=E4=BD=93=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lbw --- .../pig/gateway/config/RouterFunctionConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java index 8d814c22..529ec6fa 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java @@ -43,7 +43,7 @@ public class RouterFunctionConfiguration { @Bean public RouterFunction routerFunction() { return RouterFunctions.route( - RequestPredicates.path("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), imageCodeHandler); + RequestPredicates.path("/code/image").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), imageCodeHandler); } } -- Gitee From f9f89e800efaab8e2140cbcee71c4d510592157c Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 20 Nov 2023 12:42:11 +0800 Subject: [PATCH 159/238] :art: Improving structure / format of the code. --- .../pig/gateway/config/RouterFunctionConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java index 529ec6fa..df44a94d 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java @@ -43,7 +43,8 @@ public class RouterFunctionConfiguration { @Bean public RouterFunction routerFunction() { return RouterFunctions.route( - RequestPredicates.path("/code/image").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), imageCodeHandler); + RequestPredicates.path("/code/image").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), + imageCodeHandler); } } -- Gitee From a19e8a631a8efd743bfc4d57cf014fee35067c03 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Thu, 23 Nov 2023 14:44:49 +0000 Subject: [PATCH 160/238] Spring Boot 2.7.18 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b566393..9a670f14 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.17 + 2.7.18 2021.0.8 2021.0.5.0 UTF-8 -- Gitee From a80e0632ba39b680f3e6bf8ddd9798421122c0b7 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 7 Dec 2023 14:54:48 +0800 Subject: [PATCH 161/238] :arrow_up: Upgrading dependencies. springboot 2.7.18 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b566393..9a670f14 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ https://www.pig4cloud.com - 2.7.17 + 2.7.18 2021.0.8 2021.0.5.0 UTF-8 -- Gitee From a2d0505d7c996681265baaf17225e0c14ab36b76 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 7 Dec 2023 20:06:52 +0800 Subject: [PATCH 162/238] :arrow_up: Upgrading dependencies. springboot 2.7.18 --- pig-register/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 0a69fcdd..44e803cf 100644 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -27,7 +27,7 @@ nacos 注册配置中心 - 2.2.4-x86 + 2.2.4-OEM -- Gitee From 5aa7cb48d3fde64508b4c59a7f94055b41ef1608 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Wed, 20 Dec 2023 07:58:11 +0000 Subject: [PATCH 163/238] sas 0.4.5 Signed-off-by: twelvet <2471835953@qq.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9a670f14..b0d71270 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 1.8 1.8 2.7.10 - 0.4.4 + 0.4.5 2.2.3 0.0.1 1.18.30 -- Gitee From 1704597859302d66c4b0c9648475f5d4b3fd70e7 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Thu, 21 Dec 2023 09:19:48 +0000 Subject: [PATCH 164/238] hutool 5.8.23 Signed-off-by: twelvet <2471835953@qq.com> --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 04a5538f..0168039a 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -36,7 +36,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.22 + 5.8.23 2.7.4 1.8.4 -- Gitee From f5c7f999b3f63ef15825c9297ec951bd400e4044 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 25 Dec 2023 11:23:17 +0000 Subject: [PATCH 165/238] up mybatis-plus 3.5.5 Signed-off-by: lbw --- README.md | 2 +- pig-common/pig-common-bom/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c094b455..a538fff5 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ | Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.4 | -| Mybatis Plus | 3.5.4 | +| Mybatis Plus | 3.5.5 | | hutool | 5.8.22 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 0168039a..6fbe920b 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -26,7 +26,7 @@ 3.0.3 1.6.9 2.2.0 - 3.5.4 + 3.5.5 4.2.0 8.0.33 1.6.1 -- Gitee From 75e21703d6467fd614097f6fd83f17be8fbf3c31 Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 6 Jan 2024 15:21:29 +0800 Subject: [PATCH 166/238] :arrow_up: Upgrading dependencies. springboot 2.7.18 --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 6fbe920b..161680f3 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -15,7 +15,7 @@ ${project.version} - 2.7.16 + 2.7.18 UTF-8 2.17.1 1.8 -- Gitee From 9f95e927b42c1743042377d6adf590ef0a9f0c5b Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 6 Jan 2024 15:23:40 +0800 Subject: [PATCH 167/238] :arrow_up: Upgrading dependencies. springboot 2.7.18 --- README.md | 2 +- pig-register/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a538fff5..5b079d29 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ | 依赖 | 版本 | |-----------------------------|------------| -| Spring Boot | 2.7.17 | +| Spring Boot | 2.7.18 | | Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.5.0 | | Spring Authorization Server | 0.4.4 | diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 0a69fcdd..44e803cf 100644 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -27,7 +27,7 @@ nacos 注册配置中心 - 2.2.4-x86 + 2.2.4-OEM -- Gitee From 51dc2a5d5a21050cf1957a8d8b4b5a833af25d33 Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 10 Jan 2024 16:37:23 +0800 Subject: [PATCH 168/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=BD=91=E5=85=B3filter=20=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E9=9D=9E=E5=AF=86=E7=A0=81=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E7=9B=B4=E6=8E=A5=E8=B7=B3=E8=BF=87=20PasswordDecoder?= =?UTF-8?q?Filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/PigDaoAuthenticationProvider.java | 5 +- .../core/constant/SecurityConstants.java | 5 + .../gateway/filter/PasswordDecoderFilter.java | 200 +++++++++--------- 3 files changed, 111 insertions(+), 99 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java index 67463377..b587d68b 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/core/PigDaoAuthenticationProvider.java @@ -20,6 +20,7 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.web.authentication.www.BasicAuthenticationConverter; import org.springframework.util.Assert; @@ -67,9 +68,9 @@ public class PigDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { - // app 模式不用校验密码 + // 只有密码模式需要校验密码 String grantType = WebUtils.getRequest().get().getParameter(OAuth2ParameterNames.GRANT_TYPE); - if (StrUtil.equals(SecurityConstants.MOBILE, grantType)) { + if (!StrUtil.equals(AuthorizationGrantType.PASSWORD.getValue(), grantType)) { return; } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java index acda5fa6..fe757be2 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java @@ -62,6 +62,11 @@ public interface SecurityConstants { */ String REFRESH_TOKEN = "refresh_token"; + /** + * password 模式 + */ + String PASSWORD = "password"; + /** * 手机号登录 */ diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java index c5b916bd..61c18ef6 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java @@ -20,6 +20,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; +import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; import cn.hutool.http.HttpUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; @@ -59,102 +60,107 @@ import java.util.function.Function; @RequiredArgsConstructor public class PasswordDecoderFilter extends AbstractGatewayFilterFactory { - private static final List> messageReaders = HandlerStrategies.withDefaults().messageReaders(); - - private static final String PASSWORD = "password"; - - private static final String KEY_ALGORITHM = "AES"; - - private final GatewayConfigProperties gatewayConfig; - - @Override - public GatewayFilter apply(Object config) { - return (exchange, chain) -> { - ServerHttpRequest request = exchange.getRequest(); - // 1. 不是登录请求,直接向下执行 - if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { - return chain.filter(exchange); - } - - // 2. 刷新token类型,直接向下执行 - String grantType = request.getQueryParams().getFirst("grant_type"); - if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { - return chain.filter(exchange); - } - - // 3. 前端加密密文解密逻辑 - Class inClass = String.class; - Class outClass = String.class; - ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders); - - // 4. 解密生成新的报文 - Mono modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES()); - - BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass); - HttpHeaders headers = new HttpHeaders(); - headers.putAll(exchange.getRequest().getHeaders()); - headers.remove(HttpHeaders.CONTENT_LENGTH); - - headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); - CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); - return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> { - ServerHttpRequest decorator = decorate(exchange, headers, outputMessage); - return chain.filter(exchange.mutate().request(decorator).build()); - })); - }; - } - - /** - * 原文解密 - * @return - */ - private Function decryptAES() { - return s -> { - // 构建前端对应解密AES 因子 - AES aes = new AES(Mode.CFB, Padding.NoPadding, - new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM), - new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes())); - - // 获取请求密码并解密 - Map inParamsMap = HttpUtil.decodeParamMap((String) s, CharsetUtil.CHARSET_UTF_8); - if (inParamsMap.containsKey(PASSWORD)) { - String password = aes.decryptStr(inParamsMap.get(PASSWORD)); - // 返回修改后报文字符 - inParamsMap.put(PASSWORD, password); - } - else { - log.error("非法请求数据:{}", s); - } - return Mono.just(HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true)); - }; - } - - /** - * 报文转换 - * @return - */ - private ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers, - CachedBodyOutputMessage outputMessage) { - return new ServerHttpRequestDecorator(exchange.getRequest()) { - @Override - public HttpHeaders getHeaders() { - long contentLength = headers.getContentLength(); - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.putAll(super.getHeaders()); - if (contentLength > 0) { - httpHeaders.setContentLength(contentLength); - } - else { - httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); - } - return httpHeaders; - } - - @Override - public Flux getBody() { - return outputMessage.getBody(); - } - }; - } + private static final List> messageReaders = HandlerStrategies.withDefaults().messageReaders(); + + private static final String PASSWORD = "password"; + + private static final String KEY_ALGORITHM = "AES"; + + private final GatewayConfigProperties gatewayConfig; + + static { + // 关闭hutool 强制关闭Bouncy Castle库的依赖 + SecureUtil.disableBouncyCastle(); + } + + @Override + public GatewayFilter apply(Object config) { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + // 1. 不是登录请求,直接向下执行 + if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { + return chain.filter(exchange); + } + + // 2. 不是密码登录模式直接跳过 + String grantType = request.getQueryParams().getFirst("grant_type"); + if (!StrUtil.equals(SecurityConstants.PASSWORD, grantType)) { + return chain.filter(exchange); + } + + // 3. 前端加密密文解密逻辑 + Class inClass = String.class; + Class outClass = String.class; + ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders); + + // 4. 解密生成新的报文 + Mono modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES()); + + BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass); + HttpHeaders headers = new HttpHeaders(); + headers.putAll(exchange.getRequest().getHeaders()); + headers.remove(HttpHeaders.CONTENT_LENGTH); + + headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); + CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); + return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> { + ServerHttpRequest decorator = decorate(exchange, headers, outputMessage); + return chain.filter(exchange.mutate().request(decorator).build()); + })); + }; + } + + /** + * 原文解密 + * + * @return + */ + private Function decryptAES() { + return s -> { + // 构建前端对应解密AES 因子 + AES aes = new AES(Mode.CFB, Padding.NoPadding, + new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM), + new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes())); + + // 获取请求密码并解密 + Map inParamsMap = HttpUtil.decodeParamMap((String) s, CharsetUtil.CHARSET_UTF_8); + if (inParamsMap.containsKey(PASSWORD)) { + String password = aes.decryptStr(inParamsMap.get(PASSWORD)); + // 返回修改后报文字符 + inParamsMap.put(PASSWORD, password); + } else { + log.error("非法请求数据:{}", s); + } + return Mono.just(HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true)); + }; + } + + /** + * 报文转换 + * + * @return + */ + private ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers, + CachedBodyOutputMessage outputMessage) { + return new ServerHttpRequestDecorator(exchange.getRequest()) { + @Override + public HttpHeaders getHeaders() { + long contentLength = headers.getContentLength(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.putAll(super.getHeaders()); + if (contentLength > 0) { + httpHeaders.setContentLength(contentLength); + } else { + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + } + return httpHeaders; + } + + @Override + public Flux getBody() { + return outputMessage.getBody(); + } + }; + } } -- Gitee From 44dffda5017c28d82a58d13fa3bef38ceff8c208 Mon Sep 17 00:00:00 2001 From: lbw Date: Fri, 26 Jan 2024 13:28:04 +0800 Subject: [PATCH 169/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=B1=BB=E5=9E=8B=E4=B8=AD=E7=9A=84=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=8E=88=E6=9D=83=E7=B1=BB=E5=9E=8B=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/OAuth2ResourceOwnerBaseAuthenticationProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 22044ec1..5f1aa468 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -147,14 +147,14 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider Date: Sun, 28 Jan 2024 17:10:28 +0800 Subject: [PATCH 170/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=BD=91=E5=85=B3Form=20Body=20read=20?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=8F=90=E5=8D=87=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/constant/SecurityConstants.java | 10 -- .../gateway/config/GatewayConfiguration.java | 34 +++- .../gateway/filter/PasswordDecoderFilter.java | 168 ++++++------------ .../filter/ValidateCodeGatewayFilter.java | 91 +++++----- .../handler/GlobalExceptionHandler.java | 2 +- 5 files changed, 128 insertions(+), 177 deletions(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java index fe757be2..6254d0a4 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java @@ -47,11 +47,6 @@ public interface SecurityConstants { */ String FROM = "from"; - /** - * 请求header - */ - String HEADER_FROM_IN = FROM + "=" + FROM_IN; - /** * 默认登录URL */ @@ -82,11 +77,6 @@ public interface SecurityConstants { */ String NOOP = "{noop}"; - /*** - * 资源服务器默认bean名称 - */ - String RESOURCE_SERVER_CONFIGURER = "resourceServerConfigurerAdapter"; - /** * 用户名 */ diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java index ceaaeed7..094fcc95 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java @@ -7,6 +7,7 @@ import com.pig4cloud.pig.gateway.filter.ValidateCodeGatewayFilter; import com.pig4cloud.pig.gateway.handler.GlobalExceptionHandler; import com.pig4cloud.pig.gateway.handler.ImageCodeHandler; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; @@ -20,27 +21,56 @@ import org.springframework.data.redis.core.RedisTemplate; @EnableConfigurationProperties(GatewayConfigProperties.class) public class GatewayConfiguration { + /** + * 创建密码解码器过滤器 + * @param modifyRequestBodyGatewayFilterFactory 修改请求体网关过滤器工厂 + * @param configProperties 配置属性 + * @return 密码解码器过滤器 + */ @Bean - public PasswordDecoderFilter passwordDecoderFilter(GatewayConfigProperties configProperties) { - return new PasswordDecoderFilter(configProperties); + public PasswordDecoderFilter passwordDecoderFilter( + ModifyRequestBodyGatewayFilterFactory modifyRequestBodyGatewayFilterFactory, + GatewayConfigProperties configProperties) { + return new PasswordDecoderFilter(modifyRequestBodyGatewayFilterFactory, configProperties); } + /** + * 创建PigRequest全局过滤器 + * @return PigRequest全局过滤器 + */ @Bean public PigRequestGlobalFilter pigRequestGlobalFilter() { return new PigRequestGlobalFilter(); } + /** + * 创建验证码网关过滤器 + * @param configProperties 配置属性 + * @param objectMapper 对象映射器 + * @param redisTemplate Redis模板 + * @return 验证码网关过滤器 + */ @Bean public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties, ObjectMapper objectMapper, RedisTemplate redisTemplate) { return new ValidateCodeGatewayFilter(configProperties, objectMapper, redisTemplate); } + /** + * 创建全局异常处理程序 + * @param objectMapper 对象映射器 + * @return 全局异常处理程序 + */ @Bean public GlobalExceptionHandler globalExceptionHandler(ObjectMapper objectMapper) { return new GlobalExceptionHandler(objectMapper); } + /** + * 创建图片验证码处理器 + * @param redisTemplate Redis模板 + * @return 图片验证码处理器 + */ @Bean public ImageCodeHandler imageCodeHandler(RedisTemplate redisTemplate) { return new ImageCodeHandler(redisTemplate); diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java index 61c18ef6..d6ce2e9c 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java @@ -29,28 +29,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage; -import org.springframework.cloud.gateway.support.BodyInserterContext; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.codec.HttpMessageReader; +import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory; import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpRequestDecorator; -import org.springframework.web.reactive.function.BodyInserter; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerStrategies; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.Charset; -import java.util.List; import java.util.Map; -import java.util.function.Function; /** * @author lengleng @@ -60,107 +46,55 @@ import java.util.function.Function; @RequiredArgsConstructor public class PasswordDecoderFilter extends AbstractGatewayFilterFactory { - private static final List> messageReaders = HandlerStrategies.withDefaults().messageReaders(); - - private static final String PASSWORD = "password"; - - private static final String KEY_ALGORITHM = "AES"; - - private final GatewayConfigProperties gatewayConfig; - - static { - // 关闭hutool 强制关闭Bouncy Castle库的依赖 - SecureUtil.disableBouncyCastle(); - } - - @Override - public GatewayFilter apply(Object config) { - return (exchange, chain) -> { - ServerHttpRequest request = exchange.getRequest(); - // 1. 不是登录请求,直接向下执行 - if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { - return chain.filter(exchange); - } - - // 2. 不是密码登录模式直接跳过 - String grantType = request.getQueryParams().getFirst("grant_type"); - if (!StrUtil.equals(SecurityConstants.PASSWORD, grantType)) { - return chain.filter(exchange); - } - - // 3. 前端加密密文解密逻辑 - Class inClass = String.class; - Class outClass = String.class; - ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders); - - // 4. 解密生成新的报文 - Mono modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES()); - - BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass); - HttpHeaders headers = new HttpHeaders(); - headers.putAll(exchange.getRequest().getHeaders()); - headers.remove(HttpHeaders.CONTENT_LENGTH); - - headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); - CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); - return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> { - ServerHttpRequest decorator = decorate(exchange, headers, outputMessage); - return chain.filter(exchange.mutate().request(decorator).build()); - })); - }; - } - - /** - * 原文解密 - * - * @return - */ - private Function decryptAES() { - return s -> { - // 构建前端对应解密AES 因子 - AES aes = new AES(Mode.CFB, Padding.NoPadding, - new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM), - new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes())); - - // 获取请求密码并解密 - Map inParamsMap = HttpUtil.decodeParamMap((String) s, CharsetUtil.CHARSET_UTF_8); - if (inParamsMap.containsKey(PASSWORD)) { - String password = aes.decryptStr(inParamsMap.get(PASSWORD)); - // 返回修改后报文字符 - inParamsMap.put(PASSWORD, password); - } else { - log.error("非法请求数据:{}", s); - } - return Mono.just(HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true)); - }; - } - - /** - * 报文转换 - * - * @return - */ - private ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers, - CachedBodyOutputMessage outputMessage) { - return new ServerHttpRequestDecorator(exchange.getRequest()) { - @Override - public HttpHeaders getHeaders() { - long contentLength = headers.getContentLength(); - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.putAll(super.getHeaders()); - if (contentLength > 0) { - httpHeaders.setContentLength(contentLength); - } else { - httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); - } - return httpHeaders; - } - - @Override - public Flux getBody() { - return outputMessage.getBody(); - } - }; - } + private final ModifyRequestBodyGatewayFilterFactory modifyRequestBodyFilter; + + private static final String PASSWORD = "password"; + + private static final String KEY_ALGORITHM = "AES"; + + private final GatewayConfigProperties gatewayConfig; + + static { + // 关闭hutool 强制关闭Bouncy Castle库的依赖 + SecureUtil.disableBouncyCastle(); + } + + @Override + public GatewayFilter apply(Object config) { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + // 不是登录请求,直接向下执行 + if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { + return chain.filter(exchange); + } + + return modifyRequestBodyFilter + .apply(new ModifyRequestBodyGatewayFilterFactory.Config().setRewriteFunction(String.class, String.class, + (webExchange, body) -> Mono.just(modifyRequestPassword(body)))) + .filter(exchange, chain); + }; + } + + /** + * 修改请求报文的密码密文为名为 + * @param requestBody 请求报文 + * @return 修改后的报文 + */ + private String modifyRequestPassword(String requestBody) { + // 构建前端对应解密AES 因子 + AES aes = new AES(Mode.CFB, Padding.NoPadding, + new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM), + new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes())); + + // 获取请求密码并解密 + Map inParamsMap = HttpUtil.decodeParamMap(requestBody, CharsetUtil.CHARSET_UTF_8); + if (inParamsMap.containsKey(PASSWORD)) { + String password = aes.decryptStr(inParamsMap.get(PASSWORD)); + // 返回修改后报文字符 + inParamsMap.put(PASSWORD, password); + } + + return HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true); + } } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java index d23e433a..20c1943b 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java @@ -17,14 +17,14 @@ package com.pig4cloud.pig.gateway.filter; import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.core.JsonProcessingException; +import cn.hutool.http.HttpUtil; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.exception.ValidateCodeException; -import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.WebUtils; import com.pig4cloud.pig.gateway.config.GatewayConfigProperties; import lombok.RequiredArgsConstructor; @@ -32,13 +32,15 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import reactor.core.publisher.Mono; + +import java.nio.CharBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Objects; /** * The type Validate code gateway filter. @@ -56,68 +58,63 @@ public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory redisTemplate; + /** + * 应用网关过滤器 + * @param config 配置对象 + * @return 网关过滤器 + */ @Override public GatewayFilter apply(Object config) { + return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); - boolean isAuthToken = CharSequenceUtil.containsAnyIgnoreCase(request.getURI().getPath(), - SecurityConstants.OAUTH_TOKEN_URL); - // 不是登录请求,直接向下执行 - if (!isAuthToken) { + if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { return chain.filter(exchange); } - // 刷新token,手机号登录(也可以这里进行校验) 直接向下执行 - String grantType = request.getQueryParams().getFirst("grant_type"); - if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { + // 客户端配置跳过,直接向下执行 + boolean isIgnoreClient = configProperties.getIgnoreClients().contains(WebUtils.getClientId(request)); + if (isIgnoreClient) { return chain.filter(exchange); } - boolean isIgnoreClient = configProperties.getIgnoreClients().contains(WebUtils.getClientId(request)); - try { - // only oauth and the request not in ignore clients need check code. - if (!isIgnoreClient) { - checkCode(request); + // 构建缓存body,可重复读获取form data + return ServerWebExchangeUtils.cacheRequestBody(exchange, (serverHttpRequest) -> { + // get cacheRequestBody + DataBuffer cachedRequestBody = exchange.getAttribute("cachedRequestBody"); + CharBuffer charBuffer = StandardCharsets.UTF_8 + .decode(Objects.requireNonNull(cachedRequestBody).asByteBuffer()); + Map requestBodyMap = HttpUtil.decodeParamMap(charBuffer.toString(), + CharsetUtil.CHARSET_UTF_8); + // 刷新请求跳过,直接向下执行 + if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, requestBodyMap.get("grant_type"))) { + return chain.filter(exchange); } - } - catch (Exception e) { - ServerHttpResponse response = exchange.getResponse(); - response.setStatusCode(HttpStatus.PRECONDITION_REQUIRED); - response.getHeaders().setContentType(MediaType.APPLICATION_JSON); - - final String errMsg = e.getMessage(); - return response.writeWith(Mono.create(monoSink -> { - try { - byte[] bytes = objectMapper.writeValueAsBytes(R.failed(errMsg)); - DataBuffer dataBuffer = response.bufferFactory().wrap(bytes); - - monoSink.success(dataBuffer); - } - catch (JsonProcessingException jsonProcessingException) { - log.error("对象输出异常", jsonProcessingException); - monoSink.error(jsonProcessingException); - } - })); - } - return chain.filter(exchange); + // 根据 randomStr 参数判断验证码是否正常 + String code = requestBodyMap.get("code"); + String randomStr = requestBodyMap.getOrDefault("randomStr", + requestBodyMap.get(SecurityConstants.SMS_PARAMETER_NAME)); + checkCode(code, randomStr); + + return chain.filter(exchange.mutate().request(serverHttpRequest).build()); + }); }; } + /** + * 检查验证码,错误扔出 ValidateCodeException GlobalExceptionHandler统一处理 + * @param code 验证码 + * @param randomStr 请求参数 + * @throws ValidateCodeException 验证码异常 + */ @SneakyThrows - private void checkCode(ServerHttpRequest request) { - String code = request.getQueryParams().getFirst("code"); - + private void checkCode(String code, String randomStr) { if (CharSequenceUtil.isBlank(code)) { throw new ValidateCodeException("验证码不能为空"); } - String randomStr = request.getQueryParams().getFirst("randomStr"); - if (CharSequenceUtil.isBlank(randomStr)) { - randomStr = request.getQueryParams().getFirst(SecurityConstants.SMS_PARAMETER_NAME); - } - String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; Object codeObj = redisTemplate.opsForValue().get(key); diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/GlobalExceptionHandler.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/GlobalExceptionHandler.java index ee9f98fd..a79a96f9 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/GlobalExceptionHandler.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/GlobalExceptionHandler.java @@ -61,7 +61,7 @@ public class GlobalExceptionHandler implements ErrorWebExceptionHandler { return response.writeWith(Mono.fromSupplier(() -> { DataBufferFactory bufferFactory = response.bufferFactory(); try { - log.warn("Error Spring Cloud Gateway : {} {}", exchange.getRequest().getPath(), ex.getMessage()); + log.debug("Error Spring Cloud Gateway : {} {}", exchange.getRequest().getPath(), ex.getMessage()); return bufferFactory.wrap(objectMapper.writeValueAsBytes(R.failed(ex.getMessage()))); } catch (JsonProcessingException e) { -- Gitee From f1cb9f8eb28a1d0df3eb4bacd9abc73ed471d90f Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 28 Jan 2024 20:06:07 +0800 Subject: [PATCH 171/238] =?UTF-8?q?:wrench:=20=E4=BF=AE=E6=94=B9=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C=20nacos=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=93=BE=E6=8E=A5=E8=B6=85=E6=97=B6=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-register/src/main/resources/application.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pig-register/src/main/resources/application.yml b/pig-register/src/main/resources/application.yml index 46125f56..0ca42a53 100644 --- a/pig-register/src/main/resources/application.yml +++ b/pig-register/src/main/resources/application.yml @@ -11,7 +11,10 @@ db: password: ${MYSQL_PWD:root} url: 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true - + pool: + config: + connectionTimeout: 30000 + validationTimeout: 10000 nacos: core: -- Gitee From b14411f967eca469c6ac8dcfa7dbd649adbda5c1 Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 28 Jan 2024 20:25:43 +0800 Subject: [PATCH 172/238] :bookmark: Releasing 3.7.4 --- pig-auth/pom.xml | 2 +- pig-common/pig-common-bom/pom.xml | 4 ++-- pig-common/pig-common-core/pom.xml | 2 +- pig-common/pig-common-datasource/pom.xml | 2 +- pig-common/pig-common-feign/pom.xml | 2 +- pig-common/pig-common-job/pom.xml | 2 +- pig-common/pig-common-log/pom.xml | 2 +- pig-common/pig-common-mybatis/pom.xml | 2 +- pig-common/pig-common-oss/pom.xml | 2 +- pig-common/pig-common-seata/pom.xml | 2 +- pig-common/pig-common-security/pom.xml | 2 +- pig-common/pig-common-swagger/pom.xml | 2 +- pig-common/pig-common-xss/pom.xml | 2 +- pig-common/pom.xml | 2 +- pig-gateway/pom.xml | 2 +- pig-register/pom.xml | 2 +- pig-upms/pig-upms-api/pom.xml | 2 +- pig-upms/pig-upms-biz/pom.xml | 2 +- pig-upms/pom.xml | 2 +- pig-visual/pig-codegen/pom.xml | 2 +- pig-visual/pig-monitor/pom.xml | 2 +- pig-visual/pig-quartz/pom.xml | 2 +- pig-visual/pom.xml | 2 +- pom.xml | 2 +- 24 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 262f163e..3e6a206b 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.1-JDK8 + 3.7.4-JDK8 pig-auth diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 161680f3..c7d8d1ff 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common-bom - 3.7.1-JDK8 + 3.7.4-JDK8 pom pig-common-bom @@ -27,7 +27,7 @@ 1.6.9 2.2.0 3.5.5 - 4.2.0 + 4.3.0 8.0.33 1.6.1 1.2.6 diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index 144bc6a5..e4b559c4 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-core diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index 74c47e48..d3583158 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -21,7 +21,7 @@ pig-common com.pig4cloud - 3.7.1-JDK8 + 3.7.4-JDK8 4.0.0 diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 418fe7d1..c0b6a7ff 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 4.0.0 diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 3953de84..70df103c 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-job diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index 5ed0abc2..01273e60 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-log diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index 628f38e0..f4d9e9a6 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-mybatis diff --git a/pig-common/pig-common-oss/pom.xml b/pig-common/pig-common-oss/pom.xml index 15bdd088..351057b1 100755 --- a/pig-common/pig-common-oss/pom.xml +++ b/pig-common/pig-common-oss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-oss diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index 541b62cc..d907156d 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index a791e7cf..01580020 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-security diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index 8e5093f8..0628e1ac 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 1c347017..771a2bc4 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common-xss diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 2e98cff8..062d1f90 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.1-JDK8 + 3.7.4-JDK8 pig-common diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 035730cf..3c59f609 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.1-JDK8 + 3.7.4-JDK8 pig-gateway diff --git a/pig-register/pom.xml b/pig-register/pom.xml index 44e803cf..bbaacd61 100644 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -18,7 +18,7 @@ com.pig4cloud pig - 3.7.1-JDK8 + 3.7.4-JDK8 pig-register diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index a2624335..ec371fc7 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.7.1-JDK8 + 3.7.4-JDK8 pig-upms-api diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index 44529025..7909652d 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.7.1-JDK8 + 3.7.4-JDK8 pig-upms-biz diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index 0bfc36a3..5bb57518 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.1-JDK8 + 3.7.4-JDK8 pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index 961331e1..8c3d78d1 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.7.1-JDK8 + 3.7.4-JDK8 pig-codegen diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index 57596cf0..d56244e4 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.7.1-JDK8 + 3.7.4-JDK8 pig-monitor diff --git a/pig-visual/pig-quartz/pom.xml b/pig-visual/pig-quartz/pom.xml index 3619b0f8..728babc9 100644 --- a/pig-visual/pig-quartz/pom.xml +++ b/pig-visual/pig-quartz/pom.xml @@ -5,7 +5,7 @@ com.pig4cloud pig-visual - 3.7.1-JDK8 + 3.7.4-JDK8 4.0.0 diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 3897635a..4d3abddb 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.1-JDK8 + 3.7.4-JDK8 pig-visual diff --git a/pom.xml b/pom.xml index b0d71270..623c88bf 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig ${project.artifactId} - 3.7.1-JDK8 + 3.7.4-JDK8 pom https://www.pig4cloud.com -- Gitee From cb94ea52ce7b04e2346c6ed622da875ffd3966fd Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 28 Jan 2024 21:39:35 +0800 Subject: [PATCH 173/238] :bookmark: Releasing / Version tags. 3.7.4 --- .gitignore | 1 + pig-auth/pom.xml | 2 +- pig-common/pig-common-bom/pom.xml | 59 +++++++++++++++++------- pig-common/pig-common-core/pom.xml | 2 +- pig-common/pig-common-datasource/pom.xml | 2 +- pig-common/pig-common-feign/pom.xml | 2 +- pig-common/pig-common-job/pom.xml | 2 +- pig-common/pig-common-log/pom.xml | 2 +- pig-common/pig-common-mybatis/pom.xml | 2 +- pig-common/pig-common-oss/pom.xml | 2 +- pig-common/pig-common-seata/pom.xml | 2 +- pig-common/pig-common-security/pom.xml | 2 +- pig-common/pig-common-swagger/pom.xml | 2 +- pig-common/pig-common-xss/pom.xml | 2 +- pig-common/pom.xml | 2 +- pig-gateway/pom.xml | 2 +- pig-register/pom.xml | 2 +- pig-upms/pig-upms-api/pom.xml | 2 +- pig-upms/pig-upms-biz/pom.xml | 2 +- pig-upms/pom.xml | 2 +- pig-visual/pig-codegen/pom.xml | 2 +- pig-visual/pig-monitor/pom.xml | 2 +- pig-visual/pig-quartz/pom.xml | 2 +- pig-visual/pom.xml | 2 +- pom.xml | 31 ++++++++++++- 25 files changed, 96 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 877ad0ba..a3e921c8 100755 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,4 @@ target/ Thumbs.db Servers .metadata +.flattened-pom.xml diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 3e6a206b..9f4c1b22 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.4-JDK8 + ${revision} pig-auth diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index c7d8d1ff..7ab89093 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common-bom - 3.7.4-JDK8 + ${revision} pom pig-common-bom @@ -14,14 +14,12 @@ pig cloud parent - ${project.version} + 3.7.4-JDK8 2.7.18 UTF-8 2.17.1 1.8 1.8 - 4.9.9 - 0.0.39 1.2.83 3.0.3 1.6.9 @@ -39,6 +37,9 @@ 5.8.23 2.7.4 1.8.4 + 4.9.9 + 1.6.0 + 0.0.39 @@ -47,62 +48,62 @@ com.pig4cloud pig-common-core - ${pig.common.version} + ${revision} com.pig4cloud pig-common-datasource - ${pig.common.version} + ${revision} com.pig4cloud pig-common-job - ${pig.common.version} + ${revision} com.pig4cloud pig-common-log - ${pig.common.version} + ${revision} com.pig4cloud pig-common-mybatis - ${pig.common.version} + ${revision} com.pig4cloud pig-common-security - ${pig.common.version} + ${revision} com.pig4cloud pig-common-feign - ${pig.common.version} + ${revision} com.pig4cloud pig-common-swagger - ${pig.common.version} + ${revision} com.pig4cloud pig-common-seata - ${pig.common.version} + ${revision} com.pig4cloud pig-common-xss - ${pig.common.version} + ${revision} com.pig4cloud pig-common-oss - ${pig.common.version} + ${revision} com.pig4cloud pig-upms-api - ${pig.common.version} + ${revision} com.mysql @@ -228,6 +229,32 @@ + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + resolveCiFriendliesOnly + true + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + io.github.git-commit-id diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index e4b559c4..bd13b0ab 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-core diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index d3583158..305cef49 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -21,7 +21,7 @@ pig-common com.pig4cloud - 3.7.4-JDK8 + ${revision} 4.0.0 diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index c0b6a7ff..ac444375 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} 4.0.0 diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 70df103c..06776287 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-job diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index 01273e60..8a94a9aa 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-log diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index f4d9e9a6..fb74400f 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-mybatis diff --git a/pig-common/pig-common-oss/pom.xml b/pig-common/pig-common-oss/pom.xml index 351057b1..cfd10cf1 100755 --- a/pig-common/pig-common-oss/pom.xml +++ b/pig-common/pig-common-oss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-oss diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index d907156d..d809f966 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index 01580020..56ef74cb 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-security diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index 0628e1ac..e3974c73 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 771a2bc4..f391aaa0 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.7.4-JDK8 + ${revision} pig-common-xss diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 062d1f90..42af275b 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.4-JDK8 + ${revision} pig-common diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 3c59f609..14ea1f90 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.4-JDK8 + ${revision} pig-gateway diff --git a/pig-register/pom.xml b/pig-register/pom.xml index bbaacd61..b11b8b1b 100644 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -18,7 +18,7 @@ com.pig4cloud pig - 3.7.4-JDK8 + ${revision} pig-register diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index ec371fc7..0af724eb 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.7.4-JDK8 + ${revision} pig-upms-api diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index 7909652d..889d22a3 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.7.4-JDK8 + ${revision} pig-upms-biz diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index 5bb57518..143c2981 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.4-JDK8 + ${revision} pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index 8c3d78d1..c2f11c7e 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.7.4-JDK8 + ${revision} pig-codegen diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index d56244e4..3bff4d0e 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.7.4-JDK8 + ${revision} pig-monitor diff --git a/pig-visual/pig-quartz/pom.xml b/pig-visual/pig-quartz/pom.xml index 728babc9..eb145622 100644 --- a/pig-visual/pig-quartz/pom.xml +++ b/pig-visual/pig-quartz/pom.xml @@ -5,7 +5,7 @@ com.pig4cloud pig-visual - 3.7.4-JDK8 + ${revision} 4.0.0 diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 4d3abddb..e51bb4c6 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.7.4-JDK8 + ${revision} pig-visual diff --git a/pom.xml b/pom.xml index 623c88bf..a8023fa3 100644 --- a/pom.xml +++ b/pom.xml @@ -22,11 +22,13 @@ com.pig4cloud pig ${project.artifactId} - 3.7.4-JDK8 + ${revision} pom https://www.pig4cloud.com + + 3.7.4-JDK8 2.7.18 2021.0.8 2021.0.5.0 @@ -53,6 +55,7 @@ password 4.9.9 0.0.39 + 1.6.0 @@ -199,6 +202,32 @@ + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + resolveCiFriendliesOnly + true + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + io.github.git-commit-id -- Gitee From 47a7e7a7c13f599a61cb3a8bc82810f56ef1199a Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 28 Jan 2024 21:47:39 +0800 Subject: [PATCH 174/238] :bookmark: Releasing / Version tags. 3.7.4 --- .github/workflows/mirror.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 31cfa186..112d4506 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -14,12 +14,3 @@ jobs: with: source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@code.gitlink.org.cn:lengleng/pig.git" - atomgit: - runs-on: ubuntu-latest - steps: - - uses: wearerequired/git-mirror-action@master #同步至 atomgit - env: - SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} - with: - source-repo: "git@github.com:pig-mesh/pig.git" - destination-repo: "git@atomgit.com:log4j/pig.git" -- Gitee From adace3a6e35c2b43766c12f65cc349f3a486f071 Mon Sep 17 00:00:00 2001 From: lbw Date: Sun, 28 Jan 2024 23:09:39 +0800 Subject: [PATCH 175/238] :bookmark: Releasing / Version tags. 3.7.4 --- .../gateway/config/GatewayConfiguration.java | 103 +++++++++--------- .../filter/ValidateCodeGatewayFilter.java | 4 +- 2 files changed, 54 insertions(+), 53 deletions(-) diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java index 094fcc95..11ad9ee9 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java @@ -21,59 +21,62 @@ import org.springframework.data.redis.core.RedisTemplate; @EnableConfigurationProperties(GatewayConfigProperties.class) public class GatewayConfiguration { - /** - * 创建密码解码器过滤器 - * @param modifyRequestBodyGatewayFilterFactory 修改请求体网关过滤器工厂 - * @param configProperties 配置属性 - * @return 密码解码器过滤器 - */ - @Bean - public PasswordDecoderFilter passwordDecoderFilter( - ModifyRequestBodyGatewayFilterFactory modifyRequestBodyGatewayFilterFactory, - GatewayConfigProperties configProperties) { - return new PasswordDecoderFilter(modifyRequestBodyGatewayFilterFactory, configProperties); - } + /** + * 创建密码解码器过滤器 + * + * @param modifyRequestBodyGatewayFilterFactory 修改请求体网关过滤器工厂 + * @param configProperties 配置属性 + * @return 密码解码器过滤器 + */ + @Bean + public PasswordDecoderFilter passwordDecoderFilter( + ModifyRequestBodyGatewayFilterFactory modifyRequestBodyGatewayFilterFactory, + GatewayConfigProperties configProperties) { + return new PasswordDecoderFilter(modifyRequestBodyGatewayFilterFactory, configProperties); + } - /** - * 创建PigRequest全局过滤器 - * @return PigRequest全局过滤器 - */ - @Bean - public PigRequestGlobalFilter pigRequestGlobalFilter() { - return new PigRequestGlobalFilter(); - } + /** + * 创建PigRequest全局过滤器 + * + * @return PigRequest全局过滤器 + */ + @Bean + public PigRequestGlobalFilter pigRequestGlobalFilter() { + return new PigRequestGlobalFilter(); + } - /** - * 创建验证码网关过滤器 - * @param configProperties 配置属性 - * @param objectMapper 对象映射器 - * @param redisTemplate Redis模板 - * @return 验证码网关过滤器 - */ - @Bean - public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties, - ObjectMapper objectMapper, RedisTemplate redisTemplate) { - return new ValidateCodeGatewayFilter(configProperties, objectMapper, redisTemplate); - } + /** + * 创建验证码网关过滤器 + * + * @param configProperties 配置属性 + * @param redisTemplate Redis模板 + * @return 验证码网关过滤器 + */ + @Bean + public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties, RedisTemplate redisTemplate) { + return new ValidateCodeGatewayFilter(configProperties, redisTemplate); + } - /** - * 创建全局异常处理程序 - * @param objectMapper 对象映射器 - * @return 全局异常处理程序 - */ - @Bean - public GlobalExceptionHandler globalExceptionHandler(ObjectMapper objectMapper) { - return new GlobalExceptionHandler(objectMapper); - } + /** + * 创建全局异常处理程序 + * + * @param objectMapper 对象映射器 + * @return 全局异常处理程序 + */ + @Bean + public GlobalExceptionHandler globalExceptionHandler(ObjectMapper objectMapper) { + return new GlobalExceptionHandler(objectMapper); + } - /** - * 创建图片验证码处理器 - * @param redisTemplate Redis模板 - * @return 图片验证码处理器 - */ - @Bean - public ImageCodeHandler imageCodeHandler(RedisTemplate redisTemplate) { - return new ImageCodeHandler(redisTemplate); - } + /** + * 创建图片验证码处理器 + * + * @param redisTemplate Redis模板 + * @return 图片验证码处理器 + */ + @Bean + public ImageCodeHandler imageCodeHandler(RedisTemplate redisTemplate) { + return new ImageCodeHandler(redisTemplate); + } } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java index 20c1943b..148135b8 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java @@ -54,8 +54,6 @@ public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory redisTemplate; /** @@ -89,7 +87,7 @@ public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory Date: Sat, 3 Feb 2024 13:14:26 +0000 Subject: [PATCH 176/238] up spring cloud alibab 2021.0.6.0 Signed-off-by: lbw --- README.md | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5b079d29..046777f9 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ |-----------------------------|------------| | Spring Boot | 2.7.18 | | Spring Cloud | 2021.0.8 | -| Spring Cloud Alibaba | 2021.0.5.0 | +| Spring Cloud Alibaba | 2021.0.6.0 | | Spring Authorization Server | 0.4.4 | | Mybatis Plus | 3.5.5 | | hutool | 5.8.22 | diff --git a/pom.xml b/pom.xml index a8023fa3..88b84898 100644 --- a/pom.xml +++ b/pom.xml @@ -31,11 +31,11 @@ 3.7.4-JDK8 2.7.18 2021.0.8 - 2021.0.5.0 + 2021.0.6.0 UTF-8 1.8 1.8 - 2.7.10 + 2.7.15 0.4.5 2.2.3 0.0.1 -- Gitee From 41036e957eb39ee1ac01c64dff4adf8910e239d0 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 15 Feb 2024 06:07:43 +0000 Subject: [PATCH 177/238] up hutool 5.8.26 Signed-off-by: lbw --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 7ab89093..b392d9dd 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -34,7 +34,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.23 + 5.8.26 2.7.4 1.8.4 4.9.9 -- Gitee From b9651daaaf06c174a26db7d07c3c2b67ea4d1fbc Mon Sep 17 00:00:00 2001 From: mijun Date: Mon, 19 Feb 2024 15:47:09 +0800 Subject: [PATCH 178/238] =?UTF-8?q?fix:oss=E5=88=9B=E5=BB=BAbucket?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=90=8D=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java index 4ab42ca7..4691c198 100755 --- a/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java +++ b/pig-common/pig-common-oss/src/main/java/com/pig4cloud/pig/common/file/oss/http/OssEndpoint.java @@ -55,7 +55,7 @@ public class OssEndpoint { */ @SneakyThrows @PostMapping("/bucket/{bucketName}") - public Bucket createBucker(@PathVariable String bucketName) { + public Bucket createBucket(@PathVariable String bucketName) { template.createBucket(bucketName); return template.getBucket(bucketName).get(); -- Gitee From 7031ba049c3699d82aca662673276b79d07d4ea0 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 22 Feb 2024 19:27:22 +0800 Subject: [PATCH 179/238] =?UTF-8?q?:sparkles:=20Introducing=20new=20featur?= =?UTF-8?q?es.=20#I9300D=20sql=E6=B3=A8=E5=85=A5=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E6=8D=A2=20mybatis-plus=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resolver/SqlFilterArgumentResolver.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 3b9a9a20..88d870a9 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -20,6 +20,7 @@ package com.pig4cloud.pig.common.mybatis.resolver; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; @@ -45,9 +46,6 @@ import java.util.stream.Collectors; @Slf4j public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver { - private final static String[] KEYWORDS = { "master", "truncate", "insert", "select", "delete", "update", "declare", - "alter", "drop", "sleep", "extractvalue", "concat" }; - /** * 判断Controller是否包含page 参数 * @param parameter 参数 @@ -90,21 +88,12 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver List orderItemList = new ArrayList<>(); Optional.ofNullable(ascs) .ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList()))); + Arrays.stream(s).filter(SqlInjectionUtils::check).map(OrderItem::asc).collect(Collectors.toList()))); Optional.ofNullable(descs) .ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList()))); + Arrays.stream(s).filter(SqlInjectionUtils::check).map(OrderItem::desc).collect(Collectors.toList()))); page.addOrder(orderItemList); return page; } - - /** - * 判断用户输入里面有没有关键字 - * @return Predicate - */ - private Predicate sqlInjectPredicate() { - return sql -> Arrays.stream(KEYWORDS).noneMatch(keyword -> StrUtil.containsIgnoreCase(sql, keyword)); - } - } -- Gitee From 6196abe0fda047d15eb98566df63bb4048918a86 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 4 Mar 2024 22:06:15 +0800 Subject: [PATCH 180/238] =?UTF-8?q?=F0=9F=90=9B=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=9D=A1=E4=BB=B6=E5=A4=B1=E6=95=88=20SqlFil?= =?UTF-8?q?terArgumentResolver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resolver/SqlFilterArgumentResolver.java | 91 ++++++++++--------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 88d870a9..9a01e208 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -22,7 +22,9 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + import javax.servlet.http.HttpServletRequest; + import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; @@ -34,7 +36,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; -import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -46,54 +47,56 @@ import java.util.stream.Collectors; @Slf4j public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver { - /** - * 判断Controller是否包含page 参数 - * @param parameter 参数 - * @return 是否过滤 - */ - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.getParameterType().equals(Page.class); - } + /** + * 判断Controller是否包含page 参数 + * + * @param parameter 参数 + * @return 是否过滤 + */ + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.getParameterType().equals(Page.class); + } + + /** + * @param parameter 入参集合 + * @param mavContainer model 和 view + * @param webRequest web相关 + * @param binderFactory 入参解析 + * @return 检查后新的page对象 + *

        + * page 只支持查询 GET .如需解析POST获取请求报文体处理 + */ + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { - /** - * @param parameter 入参集合 - * @param mavContainer model 和 view - * @param webRequest web相关 - * @param binderFactory 入参解析 - * @return 检查后新的page对象 - *

        - * page 只支持查询 GET .如需解析POST获取请求报文体处理 - */ - @Override - public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + String[] ascs = request.getParameterValues("ascs"); + String[] descs = request.getParameterValues("descs"); + String current = request.getParameter("current"); + String size = request.getParameter("size"); - String[] ascs = request.getParameterValues("ascs"); - String[] descs = request.getParameterValues("descs"); - String current = request.getParameter("current"); - String size = request.getParameter("size"); + Page page = new Page<>(); + if (StrUtil.isNotBlank(current)) { + page.setCurrent(Long.parseLong(current)); + } - Page page = new Page<>(); - if (StrUtil.isNotBlank(current)) { - page.setCurrent(Long.parseLong(current)); - } + if (StrUtil.isNotBlank(size)) { + page.setSize(Long.parseLong(size)); + } - if (StrUtil.isNotBlank(size)) { - page.setSize(Long.parseLong(size)); - } + List orderItemList = new ArrayList<>(); + Optional.ofNullable(ascs) + .ifPresent(s -> orderItemList.addAll( + Arrays.stream(s).filter(asc -> !SqlInjectionUtils.check(asc)).map(OrderItem::asc).collect(Collectors.toList()))); + Optional.ofNullable(descs) + .ifPresent(s -> orderItemList.addAll( + Arrays.stream(s).filter(desc -> !SqlInjectionUtils.check(desc)).map(OrderItem::desc).collect(Collectors.toList()))); + page.addOrder(orderItemList); - List orderItemList = new ArrayList<>(); - Optional.ofNullable(ascs) - .ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(SqlInjectionUtils::check).map(OrderItem::asc).collect(Collectors.toList()))); - Optional.ofNullable(descs) - .ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(SqlInjectionUtils::check).map(OrderItem::desc).collect(Collectors.toList()))); - page.addOrder(orderItemList); + return page; + } - return page; - } } -- Gitee From 4052ae5e1cd37d9efed64135f4f7ba4d51ea7ae2 Mon Sep 17 00:00:00 2001 From: twelvet <2471835953@qq.com> Date: Thu, 14 Mar 2024 01:12:36 +0000 Subject: [PATCH 181/238] springdoc v1.8.0 Signed-off-by: twelvet <2471835953@qq.com> --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index b392d9dd..1fd4d3c7 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -22,7 +22,7 @@ 1.8 1.2.83 3.0.3 - 1.6.9 + 1.8.0 2.2.0 3.5.5 4.3.0 -- Gitee From a285f2b3184c66bb891345108d7bf92b9f416049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 15 Mar 2024 21:37:28 +0800 Subject: [PATCH 182/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20RedisUtils.?= =?UTF-8?q?=20del(String...=20keys)=E4=BC=A0=E5=8F=82=E6=9C=89=E8=AF=AF=20?= =?UTF-8?q?#990?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/core/util/RedisUtils.java | 1271 +++++++++-------- 1 file changed, 656 insertions(+), 615 deletions(-) diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java index c02039a7..3a96c712 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -20,620 +20,661 @@ import java.util.concurrent.TimeUnit; @UtilityClass public class RedisUtils { - private static final Long SUCCESS = 1L; - - /** - * 指定缓存失效时间 - * @param key 键 - * @param time 时间(秒) - */ - public boolean expire(String key, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate) - .filter(template -> time > 0) - .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); - return true; - } - - /** - * 根据 key 获取过期时间 - * @param key 键 不能为null - * @return 时间(秒) 返回0代表为永久有效 - */ - public long getExpire(Object key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate) - .map(template -> template.getExpire(key, TimeUnit.SECONDS)) - .orElse(-1L); - } - - /** - * 查找匹配key - * @param pattern key - * @return / - */ - public List scan(String pattern) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); - return Optional.ofNullable(redisTemplate).map(template -> { - RedisConnectionFactory factory = template.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(); - while (cursor.hasNext()) { - result.add(new String(cursor.next())); - } - RedisConnectionUtils.releaseConnection(rc, factory); - return result; - }).orElse(Collections.emptyList()); - } - - /** - * 分页查询 key - * @param patternKey key - * @param page 页码 - * @param size 每页数目 - * @return / - */ - public List findKeysForPage(String patternKey, int page, int size) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(size); - int tmpIndex = 0; - int fromIndex = page * size; - int toIndex = page * size + size; - while (cursor.hasNext()) { - if (tmpIndex >= fromIndex && tmpIndex < toIndex) { - result.add(new String(cursor.next())); - tmpIndex++; - continue; - } - // 获取到满足条件的数据后,就可以退出了 - if (tmpIndex >= toIndex) { - break; - } - tmpIndex++; - cursor.next(); - } - RedisConnectionUtils.releaseConnection(rc, factory); - return result; - } - - /** - * 判断key是否存在 - * @param key 键 - * @return true 存在 false不存在 - */ - public boolean hasKey(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> template.hasKey(key)).orElse(false); - } - - /** - * 删除缓存 - * @param keys 可以传一个值 或多个 - */ - public void del(String... keys) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(keys) - .map(Arrays::asList) - .filter(keysList -> !keysList.isEmpty()) - .ifPresent(redisTemplate::delete); - } - - /** - * 获取锁 - * @param lockKey 锁key - * @param value value - * @param expireTime:单位-秒 - * @return boolean - */ - public boolean getLock(String lockKey, String value, int expireTime) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate) - .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) - .orElse(false); - } - - /** - * 释放锁 - * @param lockKey 锁key - * @param value value - * @return boolean - */ - public boolean releaseLock(String lockKey, String value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; - RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); - return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) - .map(Convert::toLong) - .filter(SUCCESS::equals) - .isPresent(); - } - - // ============================String============================= - - /** - * 普通缓存获取 - * @param key 键 - * @return 值 - */ - public T get(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForValue().get(key); - } - - /** - * 批量获取 - * @param keys - * @return - */ - public List multiGet(List keys) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForValue().multiGet(keys); - } - - /** - * 普通缓存放入 - * @param key 键 - * @param value 值 - * @return true成功 false失败 - */ - public boolean set(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - template.opsForValue().set(key, value); - return true; - }); - return true; - } - - /** - * 普通缓存放入并设置时间 - * @param key 键 - * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> { - if (time > 0) { - template.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } - else { - template.opsForValue().set(key, value); - } - return true; - }).orElse(false); - } - - /** - * 普通缓存放入并设置时间 - * @param key 键 - * @param value 值 - * @param time 时间 - * @param timeUnit 类型 - * @return true成功 false 失败 - */ - public boolean set(String key, T value, long time, TimeUnit timeUnit) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - if (time > 0) { - template.opsForValue().set(key, value, time, timeUnit); - } - else { - template.opsForValue().set(key, value); - } - return true; - }); - return true; - } - - // ================================Map================================= - - /** - * HashGet - * @param key 键 不能为null - * @param hashKey 项 不能为null - * @return 值 - */ - public HV hget(String key, HK hashKey) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().get(key, hashKey); - } - - /** - * 获取hashKey对应的所有键值 - * @param key 键 - * @return 对应的多个键值 - */ - public Map hmget(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().entries(key); - } - - /** - * HashSet - * @param key 键 - * @param map 对应多个键值 - * @return true 成功 false 失败 - */ - public boolean hmset(String key, Map map) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().putAll(key, map); - return true; - }); - return true; - } - - /** - * HashSet 并设置时间 - * @param key 键 - * @param map 对应多个键值 - * @param time 时间(秒) - * @return true成功 false失败 - */ - public boolean hmset(String key, Map map, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().putAll(key, map); - if (time > 0) { - template.expire(key, time, TimeUnit.SECONDS); - } - return true; - }); - return true; - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * @param key 键 - * @param item 项 - * @param value 值 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().put(key, item, value); - return true; - }).orElse(false); - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().put(key, item, value); - if (time > 0) { - template.expire(key, time, TimeUnit.SECONDS); - } - return true; - }).orElse(false); - } - - /** - * 删除hash表中的值 - * @param key 键 不能为null - * @param item 项 可以使多个 不能为null - */ - public void hdel(String key, Object... item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForHash().delete(key, item); - } - - /** - * 判断hash表中是否有该项的值 - * @param key 键 不能为null - * @param item 项 不能为null - * @return true 存在 false不存在 - */ - public boolean hHasKey(String key, String item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().hasKey(key, item); - } - - /** - * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * @param key 键 - * @param item 项 - * @param by 要增加几(大于0) - * @return - */ - public double hincr(String key, String item, double by) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().increment(key, item, by); - } - - /** - * hash递减 - * @param key 键 - * @param item 项 - * @param by 要减少记(小于0) - * @return - */ - public double hdecr(String key, String item, double by) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().increment(key, item, -by); - } - - // ============================set============================= - - /** - * 根据key获取Set中的所有值 - * @param key 键 - * @return - */ - public Set sGet(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().members(key); - } - - /** - * 根据value从一个set中查询,是否存在 - * @param key 键 - * @param value 值 - * @return true 存在 false不存在 - */ - public boolean sHasKey(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().isMember(key, value); - } - - /** - * 将数据放入set缓存 - * @param key 键 - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSet(String key, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().add(key, values); - } - - /** - * 将set数据放入缓存 - * @param key 键 - * @param time 时间(秒) - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSetAndTime(String key, long time, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } - - /** - * 获取set缓存的长度 - * @param key 键 - * @return - */ - public long sGetSetSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().size(key); - } - - /** - * 移除值为value的 - * @param key 键 - * @param values 值 可以是多个 - * @return 移除的个数 - */ - public long setRemove(String key, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } - - /** - * 获集合key1和集合key2的差集元素 - * @param key 键 - * @return - */ - public Set sDifference(String key, String otherKey) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().difference(key, otherKey); - } - - // ===============================list================================= - - /** - * 获取list缓存的内容 - * @param key 键 - * @param start 开始 - * @param end 结束 0 到 -1代表所有值 - * @return - */ - public List lGet(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().range(key, start, end); - } - - /** - * 获取list缓存的长度 - * @param key 键 - * @return - */ - public long lGetListSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().size(key); - } - - /** - * 通过索引 获取list中的值 - * @param key 键 - * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 - * @return - */ - public Object lGetIndex(String key, long index) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().index(key, index); - } - - /** - * 将list放入缓存 - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPush(key, value); - return true; - } - - /** - * 将list放入缓存 - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - Optional.ofNullable(redisTemplate).ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); - } - return true; - } - - /** - * 将list放入缓存 - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, List value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPushAll(key, value); - return true; - } - - /** - * 将list放入缓存 - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, List value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } - - /** - * 根据索引修改list中的某条数据 - * @param key 键 - * @param index 索引 - * @param value 值 - * @return / - */ - public boolean lUpdateIndex(String key, long index, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().set(key, index, value); - return true; - } - - /** - * 移除N个值为value - * @param key 键 - * @param count 移除多少个 - * @param value 值 - * @return 移除的个数 - */ - public long lRemove(String key, long count, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().remove(key, count, value); - } - - /** - * 将zSet数据放入缓存 - * @param key - * @param time - * @param tuples - * @return - */ - public long zSetAndTime(String key, long time, Set> tuples) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Long count = redisTemplate.opsForZSet().add(key, tuples); - if (time > 0) { - expire(key, time); - } - return count; - - } - - /** - * Sorted set:有序集合获取 - * @param key - * @param min - * @param max - * @return - */ - public Set zRangeByScore(String key, double min, double max) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.rangeByScore(key, min, max); - - } - - /** - * Sorted set:有序集合获取 正序 - * @param key - * @param start - * @param end - * @return - */ - public Set zRange(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.range(key, start, end); - - } - - /** - * Sorted set:有序集合获取 倒叙 - * @param key - * @param start - * @param end - * @return - */ - public Set zReverseRange(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.reverseRange(key, start, end); - - } - - /** - * 获取zSet缓存的长度 - * @param key 键 - * @return - */ - public long zGetSetSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForZSet().size(key); - } + private static final Long SUCCESS = 1L; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate) + .filter(template -> time > 0) + .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); + return true; + } + + /** + * 根据 key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate) + .map(template -> template.getExpire(key, TimeUnit.SECONDS)) + .orElse(-1L); + } + + /** + * 查找匹配key + * + * @param pattern key + * @return / + */ + public List scan(String pattern) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + return Optional.ofNullable(redisTemplate).map(template -> { + RedisConnectionFactory factory = template.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + RedisConnectionUtils.releaseConnection(rc, factory); + return result; + }).orElse(Collections.emptyList()); + } + + /** + * 分页查询 key + * + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + RedisConnectionUtils.releaseConnection(rc, factory); + return result; + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> template.hasKey(key)).orElse(false); + } + + /** + * 删除缓存 + * + * @param keys 可以传一个值 或多个 + */ + public void del(String... keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + if (keys != null) { + Arrays.stream(keys).forEach(redisTemplate::delete); + } + } + + /** + * 获取锁 + * + * @param lockKey 锁key + * @param value value + * @param expireTime:单位-秒 + * @return boolean + */ + public boolean getLock(String lockKey, String value, int expireTime) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate) + .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) + .orElse(false); + } + + /** + * 释放锁 + * + * @param lockKey 锁key + * @param value value + * @return boolean + */ + public boolean releaseLock(String lockKey, String value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); + return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) + .map(Convert::toLong) + .filter(SUCCESS::equals) + .isPresent(); + } + + // ============================String============================= + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public T get(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForValue().get(key); + } + + /** + * 批量获取 + * + * @param keys + * @return + */ + public List multiGet(List keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForValue().multiGet(keys); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForValue().set(key, value); + return true; + }); + return true; + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + if (time > 0) { + template.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + template.opsForValue().set(key, value); + } + return true; + }).orElse(false); + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, T value, long time, TimeUnit timeUnit) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + if (time > 0) { + template.opsForValue().set(key, value, time, timeUnit); + } else { + template.opsForValue().set(key, value); + } + return true; + }); + return true; + } + + // ================================Map================================= + + /** + * HashGet + * + * @param key 键 不能为null + * @param hashKey 项 不能为null + * @return 值 + */ + public HV hget(String key, HK hashKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().get(key, hashKey); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().putAll(key, map); + return true; + }); + return true; + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().putAll(key, map); + if (time > 0) { + template.expire(key, time, TimeUnit.SECONDS); + } + return true; + }); + return true; + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().put(key, item, value); + return true; + }).orElse(false); + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().put(key, item, value); + if (time > 0) { + template.expire(key, time, TimeUnit.SECONDS); + } + return true; + }).orElse(false); + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().members(key); + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().isMember(key, value); + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().add(key, values); + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().size(key); + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } + + /** + * 获集合key1和集合key2的差集元素 + * + * @param key 键 + * @return + */ + public Set sDifference(String key, String otherKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().difference(key, otherKey); + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().range(key, start, end); + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().size(key); + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().index(key, index); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPush(key, value); + return true; + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + Optional.ofNullable(redisTemplate).ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); + } + return true; + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().set(key, index, value); + return true; + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().remove(key, count, value); + } + + /** + * 将zSet数据放入缓存 + * + * @param key + * @param time + * @param tuples + * @return + */ + public long zSetAndTime(String key, long time, Set> tuples) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Long count = redisTemplate.opsForZSet().add(key, tuples); + if (time > 0) { + expire(key, time); + } + return count; + + } + + /** + * Sorted set:有序集合获取 + * + * @param key + * @param min + * @param max + * @return + */ + public Set zRangeByScore(String key, double min, double max) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, min, max); + + } + + /** + * Sorted set:有序集合获取 正序 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.range(key, start, end); + + } + + /** + * Sorted set:有序集合获取 倒叙 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zReverseRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.reverseRange(key, start, end); + + } + + /** + * 获取zSet缓存的长度 + * + * @param key 键 + * @return + */ + public long zGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForZSet().size(key); + } } -- Gitee From f1abcbbef235ea5bcefcc45c7fc117799b34de21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 15 Mar 2024 22:11:05 +0800 Subject: [PATCH 183/238] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20add=20feign=20head?= =?UTF-8?q?er=20connection=3Dclose=20fix=20RetryableException=20#I97DZH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java --- .../feign/PigFeignAutoConfiguration.java | 62 +++++++++---------- .../core/PigFeignRequestCloseInterceptor.java | 23 +++++++ 2 files changed, 51 insertions(+), 34 deletions(-) create mode 100644 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index ff9fa669..29f89286 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -20,11 +20,12 @@ import com.alibaba.cloud.sentinel.feign.SentinelFeignAutoConfiguration; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pig.common.feign.core.PigFeignRequestCloseInterceptor; import com.pig4cloud.pig.common.feign.sentinel.ext.PigSentinelFeign; import com.pig4cloud.pig.common.feign.sentinel.handle.PigUrlBlockHandler; import com.pig4cloud.pig.common.feign.sentinel.parser.PigHeaderRequestOriginParser; import feign.Feign; -import okhttp3.OkHttpClient; +import feign.RequestInterceptor; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -32,8 +33,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import java.util.concurrent.TimeUnit; - /** * sentinel 配置 * @@ -44,38 +43,33 @@ import java.util.concurrent.TimeUnit; @AutoConfigureBefore(SentinelFeignAutoConfiguration.class) public class PigFeignAutoConfiguration { - @Bean - @Scope("prototype") - @ConditionalOnMissingBean - @ConditionalOnProperty(name = "feign.sentinel.enabled") - public Feign.Builder feignSentinelBuilder() { - return PigSentinelFeign.builder(); - } - - @Bean - @ConditionalOnMissingBean - public BlockExceptionHandler blockExceptionHandler(ObjectMapper objectMapper) { - return new PigUrlBlockHandler(objectMapper); - } + @Bean + @Scope("prototype") + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "feign.sentinel.enabled") + public Feign.Builder feignSentinelBuilder() { + return PigSentinelFeign.builder(); + } - @Bean - @ConditionalOnMissingBean - public RequestOriginParser requestOriginParser() { - return new PigHeaderRequestOriginParser(); - } + @Bean + @ConditionalOnMissingBean + public BlockExceptionHandler blockExceptionHandler(ObjectMapper objectMapper) { + return new PigUrlBlockHandler(objectMapper); + } - /** - * OkHttp 客户端配置 - * @return OkHttp 客户端配 - */ - @Bean - public OkHttpClient okHttpClient() { - return new OkHttpClient.Builder().retryOnConnectionFailure(false) // 是否开启缓存 - .connectTimeout(30L, TimeUnit.SECONDS) // 连接超时时间 - .readTimeout(30L, TimeUnit.SECONDS) // 读取超时时间 - .writeTimeout(30L, TimeUnit.SECONDS) - .followRedirects(true) // 是否允许重定向 - .build(); - } + @Bean + @ConditionalOnMissingBean + public RequestOriginParser requestOriginParser() { + return new PigHeaderRequestOriginParser(); + } + /** + * set connection close header + * + * @return RequestInterceptor + */ + @Bean + public RequestInterceptor pigFeignRequestCloseInterceptor() { + return new PigFeignRequestCloseInterceptor(); + } } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java new file mode 100644 index 00000000..83a8b512 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pig.common.feign.core; + +import feign.RequestInterceptor; +import org.springframework.http.HttpHeaders; + +/** + * @author lengleng + * @date 2024/3/15 + *

        + * http connection close + */ +public class PigFeignRequestCloseInterceptor implements RequestInterceptor { + + /** + * set connection close + * + * @param template + */ + @Override + public void apply(feign.RequestTemplate template) { + template.header(HttpHeaders.CONNECTION, "close"); + } +} -- Gitee From d97533ff7c7103008a4ceb240458ada39f833d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 19 Mar 2024 16:15:15 +0800 Subject: [PATCH 184/238] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20#I99Q0B=20b?= =?UTF-8?q?ug=E6=8F=90=E4=BA=A4=20=E5=A4=9A=E8=A7=92=E8=89=B2=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=9B=B4=E6=96=B0=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/admin/service/impl/SysUserServiceImpl.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index 2dbffbc0..b3306625 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -204,11 +204,9 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") public R updateUserInfo(UserDTO userDto) { - UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername()); - SysUser sysUser = new SysUser(); sysUser.setPhone(userDto.getPhone()); - sysUser.setUserId(userVO.getUserId()); + sysUser.setUserId(SecurityUtils.getUser().getId()); sysUser.setAvatar(userDto.getAvatar()); sysUser.setNickname(userDto.getNickname()); sysUser.setName(userDto.getName()); @@ -259,7 +257,7 @@ public class SysUserServiceImpl extends ServiceImpl impl // 根据数据权限查询全部的用户信息 List voList = baseMapper.selectVoList(userDTO); // 转换成execl 对象输出 - List userExcelVOList = voList.stream().map(userVO -> { + return voList.stream().map(userVO -> { UserExcelVO excelVO = new UserExcelVO(); BeanUtils.copyProperties(userVO, excelVO); String roleNameList = userVO.getRoleList() @@ -412,8 +410,8 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") public R changePassword(UserDTO userDto) { - UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername()); - if (Objects.isNull(userVO)) { + SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); + if (Objects.isNull(sysUser)) { return R.failed("用户不存在"); } @@ -421,7 +419,7 @@ public class SysUserServiceImpl extends ServiceImpl impl return R.failed("原密码不能为空"); } - if (!ENCODER.matches(userDto.getPassword(), userVO.getPassword())) { + if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); } @@ -433,7 +431,7 @@ public class SysUserServiceImpl extends ServiceImpl impl this.update(Wrappers.lambdaUpdate() .set(SysUser::getPassword, password) - .eq(SysUser::getUserId, userVO.getUserId())); + .eq(SysUser::getUserId, sysUser.getUserId())); return R.ok(); } -- Gitee From fb7d2fc9a8f978e6ea3d05da95a74fd6baf8571f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 11:40:55 +0800 Subject: [PATCH 185/238] =?UTF-8?q?=F0=9F=94=A5=20=E5=88=A0=E9=99=A4=20Sys?= =?UTF-8?q?UserServiceImpl=20=E6=97=A0=E7=94=A8=E5=AF=BC=E5=85=A5=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 766 +++++++++--------- 1 file changed, 386 insertions(+), 380 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index b3306625..50033564 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -69,386 +69,392 @@ import java.util.stream.Collectors; @AllArgsConstructor public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); - - private final SysMenuService sysMenuService; - - private final SysRoleService sysRoleService; - - private final SysPostService sysPostService; - - private final SysDeptService sysDeptService; - - private final SysUserRoleMapper sysUserRoleMapper; - - private final SysUserPostMapper sysUserPostMapper; - - private final CacheManager cacheManager; - - /** - * 保存用户信息 - * @param userDto DTO 对象 - * @return success/fail - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveUser(UserDTO userDto) { - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); - sysUser.setCreateBy(userDto.getUsername()); - sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - baseMapper.insert(sysUser); - // 保存用户岗位信息 - Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { - posts.stream().map(postId -> { - SysUserPost userPost = new SysUserPost(); - userPost.setUserId(sysUser.getUserId()); - userPost.setPostId(postId); - return userPost; - }).forEach(sysUserPostMapper::insert); - }); - - // 如果角色为空,赋默认角色 - if (CollUtil.isEmpty(userDto.getRole())) { - // 获取默认角色编码 - String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - // 默认角色 - SysRole sysRole = sysRoleService - .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); - userDto.setRole(Collections.singletonList(sysRole.getRoleId())); - } - - // 插入用户角色关系表 - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(sysUserRoleMapper::insert); - return Boolean.TRUE; - } - - /** - * 通过查用户的全部信息 - * @param sysUser 用户 - * @return - */ - @Override - public UserInfo findUserInfo(SysUser sysUser) { - UserInfo userInfo = new UserInfo(); - userInfo.setSysUser(sysUser); - // 设置角色列表 (ID) - List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) - .stream() - .map(SysRole::getRoleId) - .collect(Collectors.toList()); - userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); - - // 设置权限列表(menu.permission) - Set permissions = new HashSet<>(); - roleIds.forEach(roleId -> { - List permissionList = sysMenuService.findMenuByRoleId(roleId) - .stream() - .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) - .map(SysMenu::getPermission) - .collect(Collectors.toList()); - permissions.addAll(permissionList); - }); - userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); - return userInfo; - } - - /** - * 分页查询用户信息(含有角色信息) - * @param page 分页对象 - * @param userDTO 参数列表 - * @return - */ - @Override - public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { - return baseMapper.getUserVosPage(page, userDTO); - } - - /** - * 通过ID查询用户信息 - * @param id 用户ID - * @return 用户信息 - */ - @Override - public UserVO selectUserVoById(Long id) { - return baseMapper.getUserVoById(id); - } - - /** - * 删除用户 - * @param ids 用户ID 列表 - * @return Boolean - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean deleteUserByIds(Long[] ids) { - // 删除 spring cache - List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); - Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); - for (SysUser sysUser : userList) { - // 立即删除 - cache.evictIfPresent(sysUser.getUsername()); - } - - sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); - this.removeBatchByIds(CollUtil.toList(ids)); - return Boolean.TRUE; - } - - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R updateUserInfo(UserDTO userDto) { - SysUser sysUser = new SysUser(); - sysUser.setPhone(userDto.getPhone()); - sysUser.setUserId(SecurityUtils.getUser().getId()); - sysUser.setAvatar(userDto.getAvatar()); - sysUser.setNickname(userDto.getNickname()); - sysUser.setName(userDto.getName()); - sysUser.setEmail(userDto.getEmail()); - return R.ok(this.updateById(sysUser)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public Boolean updateUser(UserDTO userDto) { - // 更新用户表信息 - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setUpdateTime(LocalDateTime.now()); - if (StrUtil.isNotBlank(userDto.getPassword())) { - sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - } - this.updateById(sysUser); - - // 更新用户角色表 - sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(SysUserRole::insert); - - // 更新用户岗位表 - sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); - userDto.getPost().stream().map(postId -> { - SysUserPost userPost = new SysUserPost(); - userPost.setUserId(sysUser.getUserId()); - userPost.setPostId(postId); - return userPost; - }).forEach(SysUserPost::insert); - return Boolean.TRUE; - } - - /** - * 查询全部的用户 - * @param userDTO 查询条件 - * @return list - */ - @Override - public List listUser(UserDTO userDTO) { - // 根据数据权限查询全部的用户信息 - List voList = baseMapper.selectVoList(userDTO); - // 转换成execl 对象输出 + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); + + private final SysMenuService sysMenuService; + + private final SysRoleService sysRoleService; + + private final SysPostService sysPostService; + + private final SysDeptService sysDeptService; + + private final SysUserRoleMapper sysUserRoleMapper; + + private final SysUserPostMapper sysUserPostMapper; + + private final CacheManager cacheManager; + + /** + * 保存用户信息 + * + * @param userDto DTO 对象 + * @return success/fail + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveUser(UserDTO userDto) { + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); + sysUser.setCreateBy(userDto.getUsername()); + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + baseMapper.insert(sysUser); + // 保存用户岗位信息 + Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { + posts.stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(sysUserPostMapper::insert); + }); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService + .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); + return Boolean.TRUE; + } + + /** + * 通过查用户的全部信息 + * + * @param sysUser 用户 + * @return + */ + @Override + public UserInfo findUserInfo(SysUser sysUser) { + UserInfo userInfo = new UserInfo(); + userInfo.setSysUser(sysUser); + // 设置角色列表 (ID) + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) + .stream() + .map(SysRole::getRoleId) + .collect(Collectors.toList()); + userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + + // 设置权限列表(menu.permission) + Set permissions = new HashSet<>(); + roleIds.forEach(roleId -> { + List permissionList = sysMenuService.findMenuByRoleId(roleId) + .stream() + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) + .map(SysMenu::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); + userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); + return userInfo; + } + + /** + * 分页查询用户信息(含有角色信息) + * + * @param page 分页对象 + * @param userDTO 参数列表 + * @return + */ + @Override + public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { + return baseMapper.getUserVosPage(page, userDTO); + } + + /** + * 通过ID查询用户信息 + * + * @param id 用户ID + * @return 用户信息 + */ + @Override + public UserVO selectUserVoById(Long id) { + return baseMapper.getUserVoById(id); + } + + /** + * 删除用户 + * + * @param ids 用户ID 列表 + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteUserByIds(Long[] ids) { + // 删除 spring cache + List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + for (SysUser sysUser : userList) { + // 立即删除 + cache.evictIfPresent(sysUser.getUsername()); + } + + sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); + this.removeBatchByIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R updateUserInfo(UserDTO userDto) { + SysUser sysUser = new SysUser(); + sysUser.setPhone(userDto.getPhone()); + sysUser.setUserId(SecurityUtils.getUser().getId()); + sysUser.setAvatar(userDto.getAvatar()); + sysUser.setNickname(userDto.getNickname()); + sysUser.setName(userDto.getName()); + sysUser.setEmail(userDto.getEmail()); + return R.ok(this.updateById(sysUser)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public Boolean updateUser(UserDTO userDto) { + // 更新用户表信息 + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setUpdateTime(LocalDateTime.now()); + if (StrUtil.isNotBlank(userDto.getPassword())) { + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + } + this.updateById(sysUser); + + // 更新用户角色表 + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(SysUserRole::insert); + + // 更新用户岗位表 + sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); + userDto.getPost().stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(SysUserPost::insert); + return Boolean.TRUE; + } + + /** + * 查询全部的用户 + * + * @param userDTO 查询条件 + * @return list + */ + @Override + public List listUser(UserDTO userDTO) { + // 根据数据权限查询全部的用户信息 + List voList = baseMapper.selectVoList(userDTO); + // 转换成execl 对象输出 return voList.stream().map(userVO -> { - UserExcelVO excelVO = new UserExcelVO(); - BeanUtils.copyProperties(userVO, excelVO); - String roleNameList = userVO.getRoleList() - .stream() - .map(SysRole::getRoleName) - .collect(Collectors.joining(StrUtil.COMMA)); - excelVO.setRoleNameList(roleNameList); - String postNameList = userVO.getPostList() - .stream() - .map(SysPost::getPostName) - .collect(Collectors.joining(StrUtil.COMMA)); - excelVO.setPostNameList(postNameList); - return excelVO; - }).collect(Collectors.toList()); - return userExcelVOList; - } - - /** - * excel 导入用户, 插入正确的 错误的提示行号 - * @param excelVOList excel 列表数据 - * @param bindingResult 错误数据 - * @return ok fail - */ - @Override - public R importUser(List excelVOList, BindingResult bindingResult) { - // 通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - List deptList = sysDeptService.list(); - List roleList = sysRoleService.list(); - List postList = sysPostService.list(); - - // 执行数据插入操作 组装 UserDto - for (UserExcelVO excel : excelVOList) { - // 个性化校验逻辑 - List userList = this.list(); - - Set errorMsg = new HashSet<>(); - // 校验用户名是否存在 - boolean exsitUserName = userList.stream() - .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); - - if (exsitUserName) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); - } - - // 判断输入的部门名称列表是否合法 - Optional deptOptional = deptList.stream() - .filter(dept -> excel.getDeptName().equals(dept.getName())) - .findFirst(); - if (!deptOptional.isPresent()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); - } - - // 判断输入的角色名称列表是否合法 - List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); - List roleCollList = roleList.stream() - .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) - .collect(Collectors.toList()); - - if (roleCollList.size() != roleNameList.size()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); - } - - // 判断输入的部门名称列表是否合法 - List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); - List postCollList = postList.stream() - .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) - .collect(Collectors.toList()); - - if (postCollList.size() != postNameList.size()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); - } - - // 数据合法情况 - if (CollUtil.isEmpty(errorMsg)) { - insertExcelUser(excel, deptOptional, roleCollList, postCollList); - } - else { - // 数据不合法情况 - errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); - } - - } - - if (CollUtil.isNotEmpty(errorMessageList)) { - return R.failed(errorMessageList); - } - return R.ok(); - } - - /** - * 插入excel User - */ - private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, - List postCollList) { - UserDTO userDTO = new UserDTO(); - userDTO.setUsername(excel.getUsername()); - userDTO.setPhone(excel.getPhone()); - userDTO.setNickname(excel.getNickname()); - userDTO.setName(excel.getName()); - userDTO.setEmail(excel.getEmail()); - // 批量导入初始密码为手机号 - userDTO.setPassword(userDTO.getPhone()); - // 根据部门名称查询部门ID - userDTO.setDeptId(deptOptional.get().getDeptId()); - // 插入岗位名称 - List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); - userDTO.setPost(postIdList); - // 根据角色名称查询角色ID - List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); - userDTO.setRole(roleIdList); - // 插入用户 - this.saveUser(userDTO); - } - - /** - * 注册用户 赋予用户默认角色 - * @param userDto 用户信息 - * @return success/false - */ - @Override - @Transactional(rollbackFor = Exception.class) - public R registerUser(UserDTO userDto) { - // 判断用户名是否存在 - SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); - if (sysUser != null) { - String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); - return R.failed(message); - } - return R.ok(saveUser(userDto)); - } - - /** - * 锁定用户 - * @param username 用户名 - * @return - */ - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") - public R lockUser(String username) { - SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - - if (Objects.nonNull(sysUser)) { - sysUser.setLockFlag(CommonConstants.STATUS_LOCK); - baseMapper.updateById(sysUser); - } - return R.ok(); - } - - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R changePassword(UserDTO userDto) { - SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); - if (Objects.isNull(sysUser)) { - return R.failed("用户不存在"); - } - - if (StrUtil.isEmpty(userDto.getPassword())) { - return R.failed("原密码不能为空"); - } - - if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { - log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); - } - - if (StrUtil.isEmpty(userDto.getNewpassword1())) { - return R.failed("新密码不能为空"); - } - String password = ENCODER.encode(userDto.getNewpassword1()); - - this.update(Wrappers.lambdaUpdate() - .set(SysUser::getPassword, password) - .eq(SysUser::getUserId, sysUser.getUserId())); - return R.ok(); - } - - @Override - public R checkPassword(String password) { - String username = SecurityUtils.getUser().getUsername(); - SysUser condition = new SysUser(); - condition.setUsername(username); - SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); - - if (!ENCODER.matches(password, sysUser.getPassword())) { - log.info("原密码错误"); - return R.failed("密码输入错误"); - } - else { - return R.ok(); - } - } + UserExcelVO excelVO = new UserExcelVO(); + BeanUtils.copyProperties(userVO, excelVO); + String roleNameList = userVO.getRoleList() + .stream() + .map(SysRole::getRoleName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setRoleNameList(roleNameList); + String postNameList = userVO.getPostList() + .stream() + .map(SysPost::getPostName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setPostNameList(postNameList); + return excelVO; + }).collect(Collectors.toList()); + } + + /** + * excel 导入用户, 插入正确的 错误的提示行号 + * + * @param excelVOList excel 列表数据 + * @param bindingResult 错误数据 + * @return ok fail + */ + @Override + public R importUser(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + List deptList = sysDeptService.list(); + List roleList = sysRoleService.list(); + List postList = sysPostService.list(); + + // 执行数据插入操作 组装 UserDto + for (UserExcelVO excel : excelVOList) { + // 个性化校验逻辑 + List userList = this.list(); + + Set errorMsg = new HashSet<>(); + // 校验用户名是否存在 + boolean exsitUserName = userList.stream() + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + + if (exsitUserName) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); + } + + // 判断输入的部门名称列表是否合法 + Optional deptOptional = deptList.stream() + .filter(dept -> excel.getDeptName().equals(dept.getName())) + .findFirst(); + if (!deptOptional.isPresent()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); + } + + // 判断输入的角色名称列表是否合法 + List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); + List roleCollList = roleList.stream() + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); + + if (roleCollList.size() != roleNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); + } + + // 判断输入的部门名称列表是否合法 + List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); + List postCollList = postList.stream() + .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) + .collect(Collectors.toList()); + + if (postCollList.size() != postNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelUser(excel, deptOptional, roleCollList, postCollList); + } else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + + } + + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 插入excel User + */ + private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, + List postCollList) { + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(excel.getUsername()); + userDTO.setPhone(excel.getPhone()); + userDTO.setNickname(excel.getNickname()); + userDTO.setName(excel.getName()); + userDTO.setEmail(excel.getEmail()); + // 批量导入初始密码为手机号 + userDTO.setPassword(userDTO.getPhone()); + // 根据部门名称查询部门ID + userDTO.setDeptId(deptOptional.get().getDeptId()); + // 插入岗位名称 + List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); + userDTO.setPost(postIdList); + // 根据角色名称查询角色ID + List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); + userDTO.setRole(roleIdList); + // 插入用户 + this.saveUser(userDTO); + } + + /** + * 注册用户 赋予用户默认角色 + * + * @param userDto 用户信息 + * @return success/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R registerUser(UserDTO userDto) { + // 判断用户名是否存在 + SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); + if (sysUser != null) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + return R.ok(saveUser(userDto)); + } + + /** + * 锁定用户 + * + * @param username 用户名 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") + public R lockUser(String username) { + SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + + if (Objects.nonNull(sysUser)) { + sysUser.setLockFlag(CommonConstants.STATUS_LOCK); + baseMapper.updateById(sysUser); + } + return R.ok(); + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R changePassword(UserDTO userDto) { + SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); + if (Objects.isNull(sysUser)) { + return R.failed("用户不存在"); + } + + if (StrUtil.isEmpty(userDto.getPassword())) { + return R.failed("原密码不能为空"); + } + + if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { + log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); + } + + if (StrUtil.isEmpty(userDto.getNewpassword1())) { + return R.failed("新密码不能为空"); + } + String password = ENCODER.encode(userDto.getNewpassword1()); + + this.update(Wrappers.lambdaUpdate() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, sysUser.getUserId())); + return R.ok(); + } + + @Override + public R checkPassword(String password) { + String username = SecurityUtils.getUser().getUsername(); + SysUser condition = new SysUser(); + condition.setUsername(username); + SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); + + if (!ENCODER.matches(password, sysUser.getPassword())) { + log.info("原密码错误"); + return R.failed("密码输入错误"); + } else { + return R.ok(); + } + } } -- Gitee From a5125ed8d385c0002cf4ee129db87fd14fec69ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 4 Apr 2024 21:12:29 +0800 Subject: [PATCH 186/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=20PasswordDecoderFilter=20=20ValidateCodeFil?= =?UTF-8?q?ter=20=E4=BB=A3=E7=A0=81=E8=87=B3=20pig-auth=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=AE=80=E5=8C=96=E7=BD=91=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-auth/pom.xml | 11 ++ .../AuthorizationServerConfiguration.java | 17 ++- .../pig/auth/endpoint/ImageCodeEndpoint.java | 48 +++++++ .../filter/AuthSecurityConfigProperties.java | 29 ++-- .../filter/PasswordDecoderFilter.java | 118 ++++++++-------- .../support/filter/ValidateCodeFilter.java | 126 +++++++++++++++++ .../servlet/RepeatBodyRequestWrapper.java | 103 ++++++++++++++ .../gateway/config/GatewayConfiguration.java | 83 +++--------- .../config/RouterFunctionConfiguration.java | 50 ------- .../filter/ValidateCodeGatewayFilter.java | 127 ------------------ .../pig/gateway/handler/ImageCodeHandler.java | 74 ---------- .../quartz/util/JavaClassTaskInvok.java | 7 +- 12 files changed, 400 insertions(+), 393 deletions(-) create mode 100644 pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java rename pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfigProperties.java => pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java (38%) rename {pig-gateway/src/main/java/com/pig4cloud/pig/gateway => pig-auth/src/main/java/com/pig4cloud/pig/auth/support}/filter/PasswordDecoderFilter.java (32%) create mode 100644 pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java create mode 100644 pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java delete mode 100755 pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java delete mode 100644 pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java delete mode 100755 pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 9f4c1b22..3f6c1ebd 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -73,6 +73,17 @@ com.pig4cloud pig-common-log + + + io.springboot.plugin + captcha-core + ${captcha.version} + + + + cn.hutool + hutool-crypto + diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index a9c01e43..1c49ba5d 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -20,6 +20,8 @@ import com.pig4cloud.pig.auth.support.CustomeOAuth2AccessTokenGenerator; import com.pig4cloud.pig.auth.support.core.CustomeOAuth2TokenCustomizer; import com.pig4cloud.pig.auth.support.core.FormIdentityLoginConfigurer; import com.pig4cloud.pig.auth.support.core.PigDaoAuthenticationProvider; +import com.pig4cloud.pig.auth.support.filter.PasswordDecoderFilter; +import com.pig4cloud.pig.auth.support.filter.ValidateCodeFilter; import com.pig4cloud.pig.auth.support.handler.PigAuthenticationFailureEventHandler; import com.pig4cloud.pig.auth.support.handler.PigAuthenticationSuccessEventHandler; import com.pig4cloud.pig.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationConverter; @@ -41,10 +43,12 @@ import org.springframework.security.oauth2.server.authorization.settings.Authori import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator; import org.springframework.security.oauth2.server.authorization.token.OAuth2RefreshTokenGenerator; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; -import org.springframework.security.oauth2.server.authorization.web.authentication.*; +import org.springframework.security.oauth2.server.authorization.web.authentication.DelegatingAuthenticationConverter; +import org.springframework.security.oauth2.server.authorization.web.authentication.OAuth2AuthorizationCodeRequestAuthenticationConverter; import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import java.util.Arrays; @@ -60,6 +64,11 @@ public class AuthorizationServerConfiguration { private final OAuth2AuthorizationService authorizationService; + private final PasswordDecoderFilter passwordDecoderFilter; + + private final ValidateCodeFilter validateCodeFilter; + + @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { @@ -73,6 +82,12 @@ public class AuthorizationServerConfiguration { OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = http .getConfigurer(OAuth2AuthorizationServerConfigurer.class); + + // 增加验证码过滤器 + http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class); + // 增加密码解密过滤器 + http.addFilterBefore(passwordDecoderFilter, UsernamePasswordAuthenticationFilter.class); + authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java new file mode 100644 index 00000000..c226ae84 --- /dev/null +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java @@ -0,0 +1,48 @@ +package com.pig4cloud.pig.auth.endpoint; + +import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import io.springboot.captcha.ArithmeticCaptcha; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.util.concurrent.TimeUnit; + +/** + * 验证码相关的接口 + * + * @author lengleng + * @date 2022/6/27 + */ +@RestController +@RequestMapping("/code") +@RequiredArgsConstructor +public class ImageCodeEndpoint { + + private static final Integer DEFAULT_IMAGE_WIDTH = 100; + + private static final Integer DEFAULT_IMAGE_HEIGHT = 40; + + private final RedisTemplate redisTemplate; + + /** + * 创建图形验证码 + */ + @SneakyThrows + @GetMapping("/image") + public void image(String randomStr, HttpServletResponse response) { + ArithmeticCaptcha captcha = new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT); + + String result = captcha.text(); + redisTemplate.opsForValue() + .set(CacheConstants.DEFAULT_CODE_KEY + randomStr, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + // 转换流信息写出 + captcha.out(response.getOutputStream()); + } + +} diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfigProperties.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java similarity index 38% rename from pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfigProperties.java rename to pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java index 4ca748de..918be580 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfigProperties.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java @@ -1,8 +1,9 @@ -package com.pig4cloud.pig.gateway.config; +package com.pig4cloud.pig.auth.support.filter; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; import java.util.List; @@ -13,18 +14,24 @@ import java.util.List; * 网关配置文件 */ @Data +@Component @RefreshScope -@ConfigurationProperties("gateway") -public class GatewayConfigProperties { +@ConfigurationProperties("security") +public class AuthSecurityConfigProperties { - /** - * 网关解密登录前端密码 秘钥 {@link com.pig4cloud.pig.gateway.filter.PasswordDecoderFilter} - */ - private String encodeKey; + /** + * 是否是微服务架构 + */ + private boolean isMicro; - /** - * 网关不需要校验验证码的客户端 {@link com.pig4cloud.pig.gateway.filter.ValidateCodeGatewayFilter} - */ - private List ignoreClients; + /** + * 网关解密登录前端密码 秘钥 + */ + private String encodeKey; + + /** + * 网关不需要校验验证码的客户端 + */ + private List ignoreClients; } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java similarity index 32% rename from pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java rename to pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java index d6ce2e9c..267c931b 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PasswordDecoderFilter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java @@ -14,28 +14,28 @@ * limitations under the License. */ -package com.pig4cloud.pig.gateway.filter; +package com.pig4cloud.pig.auth.support.filter; -import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; -import cn.hutool.http.HttpUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; -import com.pig4cloud.pig.gateway.config.GatewayConfigProperties; +import com.pig4cloud.pig.common.core.servlet.RepeatBodyRequestWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory; -import org.springframework.http.server.reactive.ServerHttpRequest; -import reactor.core.publisher.Mono; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -import java.nio.charset.Charset; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; /** @@ -43,58 +43,52 @@ import java.util.Map; * @date 2019 /2/1 密码解密工具类 */ @Slf4j +@Component @RequiredArgsConstructor -public class PasswordDecoderFilter extends AbstractGatewayFilterFactory { - - private final ModifyRequestBodyGatewayFilterFactory modifyRequestBodyFilter; - - private static final String PASSWORD = "password"; - - private static final String KEY_ALGORITHM = "AES"; - - private final GatewayConfigProperties gatewayConfig; - - static { - // 关闭hutool 强制关闭Bouncy Castle库的依赖 - SecureUtil.disableBouncyCastle(); - } - - @Override - public GatewayFilter apply(Object config) { - return (exchange, chain) -> { - ServerHttpRequest request = exchange.getRequest(); - // 不是登录请求,直接向下执行 - if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { - return chain.filter(exchange); - } - - return modifyRequestBodyFilter - .apply(new ModifyRequestBodyGatewayFilterFactory.Config().setRewriteFunction(String.class, String.class, - (webExchange, body) -> Mono.just(modifyRequestPassword(body)))) - .filter(exchange, chain); - }; - } - - /** - * 修改请求报文的密码密文为名为 - * @param requestBody 请求报文 - * @return 修改后的报文 - */ - private String modifyRequestPassword(String requestBody) { - // 构建前端对应解密AES 因子 - AES aes = new AES(Mode.CFB, Padding.NoPadding, - new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM), - new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes())); - - // 获取请求密码并解密 - Map inParamsMap = HttpUtil.decodeParamMap(requestBody, CharsetUtil.CHARSET_UTF_8); - if (inParamsMap.containsKey(PASSWORD)) { - String password = aes.decryptStr(inParamsMap.get(PASSWORD)); - // 返回修改后报文字符 - inParamsMap.put(PASSWORD, password); - } - - return HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true); - } +public class PasswordDecoderFilter extends OncePerRequestFilter { + + private final AuthSecurityConfigProperties authSecurityConfigProperties; + + private static final String PASSWORD = "password"; + + private static final String KEY_ALGORITHM = "AES"; + + + static { + // 关闭hutool 强制关闭Bouncy Castle库的依赖 + SecureUtil.disableBouncyCastle(); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + // 不是登录请求,直接向下执行 + if (!StrUtil.containsAnyIgnoreCase(request.getRequestURI(), SecurityConstants.OAUTH_TOKEN_URL)) { + chain.doFilter(request, response); + return; + } + + // 将请求流转换为可多次读取的请求流 + RepeatBodyRequestWrapper requestWrapper = new RepeatBodyRequestWrapper(request); + Map parameterMap = requestWrapper.getParameterMap(); + + // 构建前端对应解密AES 因子 + AES aes = new AES(Mode.CFB, Padding.NoPadding, + new SecretKeySpec(authSecurityConfigProperties.getEncodeKey().getBytes(), KEY_ALGORITHM), + new IvParameterSpec(authSecurityConfigProperties.getEncodeKey().getBytes())); + + + parameterMap.forEach((k, v) -> { + String[] values = parameterMap.get(k); + if (!PASSWORD.equals(k) || ArrayUtil.isEmpty(values)) { + return; + } + + // 解密密码 + String decryptPassword = aes.decryptStr(values[0]); + parameterMap.put(k, new String[]{decryptPassword}); + }); + chain.doFilter(requestWrapper, response); + } + } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java new file mode 100644 index 00000000..be188141 --- /dev/null +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java @@ -0,0 +1,126 @@ +package com.pig4cloud.pig.auth.support.filter; + +/** + * 登录前处理器 + * + * @author lengleng + * @date 2024/4/3 + */ + + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import com.pig4cloud.pig.common.core.exception.ValidateCodeException; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.core.util.WebUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Optional; + +/** + * @author lbw + * @date 2024-01-06 + *

        + * 登录前置处理器: 前端密码传输密文解密,验证码处理 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ValidateCodeFilter extends OncePerRequestFilter { + + private final AuthSecurityConfigProperties authSecurityConfigProperties; + + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + + String requestUrl = request.getServletPath(); + + // 不是登录URL 请求直接跳过 + if (!SecurityConstants.OAUTH_TOKEN_URL.equals(requestUrl)) { + filterChain.doFilter(request, response); + return; + } + + // 如果登录URL 但是刷新token的请求,直接向下执行 + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { + filterChain.doFilter(request, response); + return; + } + + // 客户端配置跳过验证码 + boolean isIgnoreClient = authSecurityConfigProperties.getIgnoreClients().contains(WebUtils.getClientId()); + if (isIgnoreClient) { + filterChain.doFilter(request, response); + return; + } + + // 校验验证码 1. 客户端开启验证码 2. 短信模式 + try { + checkCode(); + filterChain.doFilter(request, response); + } catch (ValidateCodeException validateCodeException) { + throw new OAuth2AuthenticationException(validateCodeException.getMessage()); + } + } + + /** + * 校验验证码 + */ + private void checkCode() throws ValidateCodeException { + Optional request = WebUtils.getRequest(); + String code = request.get().getParameter("code"); + + if (StrUtil.isBlank(code)) { + throw new ValidateCodeException("验证码不能为空"); + } + + String randomStr = request.get().getParameter("randomStr"); + + // https://gitee.com/log4j/pig/issues/IWA0D + String mobile = request.get().getParameter("mobile"); + if (StrUtil.isNotBlank(mobile)) { + randomStr = mobile; + } + + String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { + throw new ValidateCodeException("验证码不合法"); + } + + Object codeObj = redisTemplate.opsForValue().get(key); + + if (codeObj == null) { + throw new ValidateCodeException("验证码不合法"); + } + + String saveCode = codeObj.toString(); + if (StrUtil.isBlank(saveCode)) { + redisTemplate.delete(key); + throw new ValidateCodeException("验证码不合法"); + } + + if (!StrUtil.equals(saveCode, code)) { + redisTemplate.delete(key); + throw new ValidateCodeException("验证码不合法"); + } + + redisTemplate.delete(key); + } + +} + diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java new file mode 100644 index 00000000..d04feb6c --- /dev/null +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java @@ -0,0 +1,103 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pig.common.core.servlet; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StreamUtils; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Map; + +/** + * Request包装类:允许 body 重复读取 + * + * @author Hccake + */ +@Slf4j +public class RepeatBodyRequestWrapper extends HttpServletRequestWrapper { + + private final byte[] bodyByteArray; + + private final Map parameterMap; + + public RepeatBodyRequestWrapper(HttpServletRequest request) { + super(request); + this.bodyByteArray = getByteBody(request); + this.parameterMap = super.getParameterMap(); + } + + @Override + public BufferedReader getReader() { + return ObjectUtils.isEmpty(this.bodyByteArray) ? null + : new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.bodyByteArray); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + // doNoting + } + + @Override + public int read() { + return byteArrayInputStream.read(); + } + }; + } + + private static byte[] getByteBody(HttpServletRequest request) { + byte[] body = new byte[0]; + try { + body = StreamUtils.copyToByteArray(request.getInputStream()); + } catch (IOException e) { + log.error("解析流中数据异常", e); + } + return body; + } + + /** + * 重写 getParameterMap() 方法 解决 undertow 中流被读取后,会进行标记,从而导致无法正确获取 body 中的表单数据的问题 + * + * @return Map parameterMap + */ + @Override + public Map getParameterMap() { + return this.parameterMap; + } + +} diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java index 11ad9ee9..d57d09c9 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java @@ -1,16 +1,10 @@ package com.pig4cloud.pig.gateway.config; import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pig.gateway.filter.PasswordDecoderFilter; import com.pig4cloud.pig.gateway.filter.PigRequestGlobalFilter; -import com.pig4cloud.pig.gateway.filter.ValidateCodeGatewayFilter; import com.pig4cloud.pig.gateway.handler.GlobalExceptionHandler; -import com.pig4cloud.pig.gateway.handler.ImageCodeHandler; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.core.RedisTemplate; /** * 网关配置 @@ -18,65 +12,30 @@ import org.springframework.data.redis.core.RedisTemplate; * @author L.cm */ @Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(GatewayConfigProperties.class) public class GatewayConfiguration { - /** - * 创建密码解码器过滤器 - * - * @param modifyRequestBodyGatewayFilterFactory 修改请求体网关过滤器工厂 - * @param configProperties 配置属性 - * @return 密码解码器过滤器 - */ - @Bean - public PasswordDecoderFilter passwordDecoderFilter( - ModifyRequestBodyGatewayFilterFactory modifyRequestBodyGatewayFilterFactory, - GatewayConfigProperties configProperties) { - return new PasswordDecoderFilter(modifyRequestBodyGatewayFilterFactory, configProperties); - } - /** - * 创建PigRequest全局过滤器 - * - * @return PigRequest全局过滤器 - */ - @Bean - public PigRequestGlobalFilter pigRequestGlobalFilter() { - return new PigRequestGlobalFilter(); - } + /** + * 创建PigRequest全局过滤器 + * + * @return PigRequest全局过滤器 + */ + @Bean + public PigRequestGlobalFilter pigRequestGlobalFilter() { + return new PigRequestGlobalFilter(); + } + + + /** + * 创建全局异常处理程序 + * + * @param objectMapper 对象映射器 + * @return 全局异常处理程序 + */ + @Bean + public GlobalExceptionHandler globalExceptionHandler(ObjectMapper objectMapper) { + return new GlobalExceptionHandler(objectMapper); + } - /** - * 创建验证码网关过滤器 - * - * @param configProperties 配置属性 - * @param redisTemplate Redis模板 - * @return 验证码网关过滤器 - */ - @Bean - public ValidateCodeGatewayFilter validateCodeGatewayFilter(GatewayConfigProperties configProperties, RedisTemplate redisTemplate) { - return new ValidateCodeGatewayFilter(configProperties, redisTemplate); - } - - /** - * 创建全局异常处理程序 - * - * @param objectMapper 对象映射器 - * @return 全局异常处理程序 - */ - @Bean - public GlobalExceptionHandler globalExceptionHandler(ObjectMapper objectMapper) { - return new GlobalExceptionHandler(objectMapper); - } - - /** - * 创建图片验证码处理器 - * - * @param redisTemplate Redis模板 - * @return 图片验证码处理器 - */ - @Bean - public ImageCodeHandler imageCodeHandler(RedisTemplate redisTemplate) { - return new ImageCodeHandler(redisTemplate); - } } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java deleted file mode 100755 index df44a94d..00000000 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RouterFunctionConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.gateway.config; - -import com.pig4cloud.pig.gateway.handler.ImageCodeHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.MediaType; -import org.springframework.web.reactive.function.server.RequestPredicates; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; - -/** - * 路由配置信息 - * - * @author lengleng - * @date 2020-06-11 - */ -@Slf4j -@Configuration(proxyBeanMethods = false) -@RequiredArgsConstructor -public class RouterFunctionConfiguration { - - private final ImageCodeHandler imageCodeHandler; - - @Bean - public RouterFunction routerFunction() { - return RouterFunctions.route( - RequestPredicates.path("/code/image").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), - imageCodeHandler); - } - -} diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java deleted file mode 100644 index 148135b8..00000000 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/ValidateCodeGatewayFilter.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.gateway.filter; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pig.common.core.constant.CacheConstants; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; -import com.pig4cloud.pig.common.core.exception.ValidateCodeException; -import com.pig4cloud.pig.common.core.util.WebUtils; -import com.pig4cloud.pig.gateway.config.GatewayConfigProperties; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.server.reactive.ServerHttpRequest; - -import java.nio.CharBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Objects; - -/** - * The type Validate code gateway filter. - * - * @author lengleng - * @date 2018 /7/4 验证码处理 - */ -@Slf4j -@RequiredArgsConstructor -public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory { - - private final GatewayConfigProperties configProperties; - - private final RedisTemplate redisTemplate; - - /** - * 应用网关过滤器 - * @param config 配置对象 - * @return 网关过滤器 - */ - @Override - public GatewayFilter apply(Object config) { - - return (exchange, chain) -> { - ServerHttpRequest request = exchange.getRequest(); - // 不是登录请求,直接向下执行 - if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { - return chain.filter(exchange); - } - - // 客户端配置跳过,直接向下执行 - boolean isIgnoreClient = configProperties.getIgnoreClients().contains(WebUtils.getClientId(request)); - if (isIgnoreClient) { - return chain.filter(exchange); - } - - // 构建缓存body,可重复读获取form data - return ServerWebExchangeUtils.cacheRequestBody(exchange, (serverHttpRequest) -> { - // get cacheRequestBody - DataBuffer cachedRequestBody = exchange.getAttribute("cachedRequestBody"); - CharBuffer charBuffer = StandardCharsets.UTF_8 - .decode(Objects.requireNonNull(cachedRequestBody).asByteBuffer()); - Map requestBodyMap = HttpUtil.decodeParamMap(charBuffer.toString(), - CharsetUtil.CHARSET_UTF_8); - // 刷新请求跳过,直接向下执行 - if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, requestBodyMap.get("grant_type"))) { - return chain.filter(exchange.mutate().request(serverHttpRequest).build()); - } - - // 根据 randomStr 参数判断验证码是否正常 - String code = requestBodyMap.get("code"); - String randomStr = requestBodyMap.getOrDefault("randomStr", - requestBodyMap.get(SecurityConstants.SMS_PARAMETER_NAME)); - checkCode(code, randomStr); - - return chain.filter(exchange.mutate().request(serverHttpRequest).build()); - }); - }; - } - - /** - * 检查验证码,错误扔出 ValidateCodeException GlobalExceptionHandler统一处理 - * @param code 验证码 - * @param randomStr 请求参数 - * @throws ValidateCodeException 验证码异常 - */ - @SneakyThrows - private void checkCode(String code, String randomStr) { - if (CharSequenceUtil.isBlank(code)) { - throw new ValidateCodeException("验证码不能为空"); - } - - String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; - - Object codeObj = redisTemplate.opsForValue().get(key); - - if (ObjectUtil.isEmpty(codeObj) || !code.equals(codeObj)) { - throw new ValidateCodeException("验证码不合法"); - } - - redisTemplate.delete(key); - } - -} diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java deleted file mode 100755 index d401497a..00000000 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.gateway.handler; - -import com.pig4cloud.captcha.ArithmeticCaptcha; -import com.pig4cloud.pig.common.core.constant.CacheConstants; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.util.FastByteArrayOutputStream; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerFunction; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; - -import java.util.Optional; -import java.util.concurrent.TimeUnit; - -/** - * @author lengleng - * @date 2018/7/5 验证码生成逻辑处理类 - */ -@Slf4j -@RequiredArgsConstructor -public class ImageCodeHandler implements HandlerFunction { - - private static final Integer DEFAULT_IMAGE_WIDTH = 100; - - private static final Integer DEFAULT_IMAGE_HEIGHT = 40; - - private final RedisTemplate redisTemplate; - - @Override - public Mono handle(ServerRequest serverRequest) { - ArithmeticCaptcha captcha = new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT); - - String result = captcha.text(); - - // 保存验证码信息 - Optional randomStr = serverRequest.queryParam("randomStr"); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - randomStr.ifPresent(s -> redisTemplate.opsForValue() - .set(CacheConstants.DEFAULT_CODE_KEY + s, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS)); - - // 转换流信息写出 - FastByteArrayOutputStream os = new FastByteArrayOutputStream(); - captcha.out(os); - - return ServerResponse.status(HttpStatus.OK) - .contentType(MediaType.IMAGE_JPEG) - .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray()))); - } - -} diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java index d8206042..a59debac 100644 --- a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java @@ -64,12 +64,7 @@ public class JavaClassTaskInvok implements ITaskInvok { catch (ClassNotFoundException e) { log.error("定时任务java反射类没有找到,执行任务:{}", sysJob.getClassName()); throw new TaskException("定时任务java反射类没有找到,执行任务:" + sysJob.getClassName()); - } - catch (IllegalAccessException e) { - log.error("定时任务java反射类异常,执行任务:{}", sysJob.getClassName()); - throw new TaskException("定时任务java反射类异常,执行任务:" + sysJob.getClassName()); - } - catch (InstantiationException e) { + } catch (IllegalAccessException | InstantiationException e) { log.error("定时任务java反射类异常,执行任务:{}", sysJob.getClassName()); throw new TaskException("定时任务java反射类异常,执行任务:" + sysJob.getClassName()); } -- Gitee From 0e90c12696a6ebde68c13a37e81a5211542edecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 12:35:15 +0800 Subject: [PATCH 187/238] =?UTF-8?q?:recycle:=20Refactoring=20code.=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=20PasswordDecoderFilter=20=20ValidateCodeFil?= =?UTF-8?q?ter=20=E4=BB=A3=E7=A0=81=E8=87=B3=20pig-auth=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=AE=80=E5=8C=96=E7=BD=91=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/config/WebSecurityConfiguration.java | 86 ++++++++++--------- .../pig/auth/endpoint/ImageCodeEndpoint.java | 4 +- .../support/filter/ValidateCodeFilter.java | 3 +- .../PigAuthenticationFailureEventHandler.java | 12 +-- .../service/impl/SysMobileServiceImpl.java | 4 +- 5 files changed, 52 insertions(+), 57 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java index 81736c79..1da2acc2 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java @@ -33,48 +33,50 @@ import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity public class WebSecurityConfiguration { - /** - * spring security 默认的安全策略 - * @param http security注入点 - * @return SecurityFilterChain - * @throws Exception - */ - @Bean - SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { - http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*") - .permitAll()// 开放自定义的部分端点 - .anyRequest() - .authenticated()) - .headers() - .frameOptions() - .sameOrigin()// 避免iframe同源无法登录 - .and() - .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 - // 处理 UsernamePasswordAuthenticationToken - http.authenticationProvider(new PigDaoAuthenticationProvider()); - return http.build(); - } + /** + * spring security 默认的安全策略 + * + * @param http security注入点 + * @return SecurityFilterChain + * @throws Exception + */ + @Bean + SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { + http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*") + .permitAll()// 开放自定义的部分端点 + .anyRequest() + .authenticated()) + .headers() + .frameOptions() + .sameOrigin()// 避免iframe同源无法登录 + .and() + .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 + // 处理 UsernamePasswordAuthenticationToken + http.authenticationProvider(new PigDaoAuthenticationProvider()); + return http.build(); + } - /** - * 暴露静态资源 - * - * https://github.com/spring-projects/spring-security/issues/10938 - * @param http - * @return - * @throws Exception - */ - @Bean - @Order(0) - SecurityFilterChain resources(HttpSecurity http) throws Exception { - http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/css/**", "/error")) - .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) - .requestCache() - .disable() - .securityContext() - .disable() - .sessionManagement() - .disable(); - return http.build(); - } + /** + * 暴露静态资源 + *

        + * https://github.com/spring-projects/spring-security/issues/10938 + * + * @param http + * @return + * @throws Exception + */ + @Bean + @Order(0) + SecurityFilterChain resources(HttpSecurity http) throws Exception { + http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/code/image", "/css/**", "/error")) + .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) + .requestCache() + .disable() + .securityContext() + .disable() + .sessionManagement() + .disable(); + return http.build(); + } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java index c226ae84..2a67a929 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java @@ -5,7 +5,7 @@ import com.pig4cloud.pig.common.core.constant.SecurityConstants; import io.springboot.captcha.ArithmeticCaptcha; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -28,7 +28,7 @@ public class ImageCodeEndpoint { private static final Integer DEFAULT_IMAGE_HEIGHT = 40; - private final RedisTemplate redisTemplate; + private final StringRedisTemplate redisTemplate; /** * 创建图形验证码 diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java index be188141..48c34e0b 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java @@ -17,6 +17,7 @@ import com.pig4cloud.pig.common.core.util.WebUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.stereotype.Component; @@ -97,7 +98,7 @@ public class ValidateCodeFilter extends OncePerRequestFilter { } String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + RedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class); if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { throw new ValidateCodeException("验证码不合法"); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java index cdf42d2a..10187182 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java @@ -19,15 +19,11 @@ package com.pig4cloud.pig.auth.support.handler; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.admin.api.entity.SysLog; import com.pig4cloud.pig.common.core.constant.CommonConstants; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; -import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.SpringContextHolder; import com.pig4cloud.pig.common.log.event.SysLogEvent; import com.pig4cloud.pig.common.log.util.LogTypeEnum; import com.pig4cloud.pig.common.log.util.SysLogUtils; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -39,6 +35,8 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -97,12 +95,6 @@ public class PigAuthenticationFailureEventHandler implements AuthenticationFailu errorMessage = exception.getLocalizedMessage(); } - // 手机号登录 - String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); - if (SecurityConstants.MOBILE.equals(grantType)) { - errorMessage = MsgUtils.getSecurityMessage("AbstractUserDetailsAuthenticationProvider.smsBadCredentials"); - } - this.errorHttpResponseConverter.write(R.failed(errorMessage), MediaType.APPLICATION_JSON, httpResponse); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java index 14876597..e40d80a3 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMobileServiceImpl.java @@ -30,7 +30,7 @@ import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.List; @@ -47,7 +47,7 @@ import java.util.concurrent.TimeUnit; @AllArgsConstructor public class SysMobileServiceImpl implements SysMobileService { - private final RedisTemplate redisTemplate; + private final StringRedisTemplate redisTemplate; private final SysUserMapper userMapper; -- Gitee From 1af0c068b0a873a1df3b02039a200c3860acb86e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 12:50:25 +0800 Subject: [PATCH 188/238] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96swagger=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-common/pig-common-bom/pom.xml | 2 +- pig-common/pig-common-swagger/pom.xml | 4 ++++ .../pig/common/swagger/annotation/EnablePigDoc.java | 3 +++ .../src/main/resources/openapi-config.yaml | 7 +++++++ 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 pig-common/pig-common-swagger/src/main/resources/openapi-config.yaml diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 1fd4d3c7..b392d9dd 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -22,7 +22,7 @@ 1.8 1.2.83 3.0.3 - 1.8.0 + 1.6.9 2.2.0 3.5.5 4.3.0 diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index e3974c73..03b55e42 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -69,5 +69,9 @@ spring-webmvc provided + + com.pig4cloud + pig-common-core + diff --git a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java index 1ddf61ef..a9b0de24 100644 --- a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java +++ b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java @@ -16,10 +16,12 @@ package com.pig4cloud.pig.common.swagger.annotation; +import com.pig4cloud.pig.common.core.factory.YamlPropertySourceFactory; import com.pig4cloud.pig.common.swagger.config.OpenAPIDefinitionImportSelector; import com.pig4cloud.pig.common.swagger.support.SwaggerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; import java.lang.annotation.*; @@ -35,6 +37,7 @@ import java.lang.annotation.*; @Inherited @EnableConfigurationProperties(SwaggerProperties.class) @Import({ OpenAPIDefinitionImportSelector.class }) +@PropertySource(value = "classpath:openapi-config.yaml", factory = YamlPropertySourceFactory.class) public @interface EnablePigDoc { /** diff --git a/pig-common/pig-common-swagger/src/main/resources/openapi-config.yaml b/pig-common/pig-common-swagger/src/main/resources/openapi-config.yaml new file mode 100644 index 00000000..f1823a02 --- /dev/null +++ b/pig-common/pig-common-swagger/src/main/resources/openapi-config.yaml @@ -0,0 +1,7 @@ +# swagger 配置 +swagger: + enabled: true + title: Pig Swagger API + gateway: http://${GATEWAY-HOST:pig-gateway}:${GATEWAY-PORT:9999} + token-url: ${swagger.gateway}/auth/oauth2/token + scope: server -- Gitee From d302fb71f1d7ed0b0b5ecbb272529e1825350192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 4 Apr 2024 21:32:23 +0800 Subject: [PATCH 189/238] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=20feign=20=E5=AF=BC=E5=85=A5=E6=94=AF=E6=8C=81=E5=8D=95?= =?UTF-8?q?=E4=BD=93=E7=89=88=E6=9C=AC=E9=80=9A=E8=BF=87SPI=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openfeign/PigFeignClientsRegistrar.java | 418 ++++++++++-------- 1 file changed, 224 insertions(+), 194 deletions(-) diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 55d495c1..c34b4d81 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -34,6 +34,7 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; import org.springframework.lang.Nullable; +import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -48,199 +49,228 @@ import java.util.Map; */ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, BeanClassLoaderAware, EnvironmentAware { - @Getter - private ClassLoader beanClassLoader; - - @Getter - private Environment environment; - - @Override - public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { - registerFeignClients(registry); - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.beanClassLoader = classLoader; - } - - private void registerFeignClients(BeanDefinitionRegistry registry) { - - List feignClients = new ArrayList<>( - SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())); - - // 支持 springboot 2.7 + 最新版本的配置方式 - ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); - // 如果 spring.factories 里为空 - if (feignClients.isEmpty()) { - return; - } - for (String className : feignClients) { - try { - Class clazz = beanClassLoader.loadClass(className); - AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(clazz, - FeignClient.class); - if (attributes == null) { - continue; - } - // 如果已经存在该 bean,支持原生的 Feign - if (registry.containsBeanDefinition(className)) { - continue; - } - registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); - - validate(attributes); - BeanDefinitionBuilder definition = BeanDefinitionBuilder - .genericBeanDefinition(FeignClientFactoryBean.class); - definition.addPropertyValue("url", getUrl(attributes)); - definition.addPropertyValue("path", getPath(attributes)); - String name = getName(attributes); - definition.addPropertyValue("name", name); - - // 兼容最新版本的 spring-cloud-openfeign,尚未发布 - StringBuilder aliasBuilder = new StringBuilder(18); - if (attributes.containsKey("contextId")) { - String contextId = getContextId(attributes); - aliasBuilder.append(contextId); - definition.addPropertyValue("contextId", contextId); - } - else { - aliasBuilder.append(name); - } - - definition.addPropertyValue("type", className); - definition.addPropertyValue("decode404", attributes.get("decode404")); - definition.addPropertyValue("fallback", attributes.get("fallback")); - definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); - definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); - - AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); - - // alias - String alias = aliasBuilder.append("FeignClient").toString(); - - // has a default, won't be null - boolean primary = (Boolean) attributes.get("primary"); - - beanDefinition.setPrimary(primary); - - String qualifier = getQualifier(attributes); - if (StringUtils.hasText(qualifier)) { - alias = qualifier; - } - - BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, - new String[] { alias }); - BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); - - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - } - - /** - * Return the class used by {@link SpringFactoriesLoader} to load configuration - * candidates. - * @return the factory class - */ - private Class getSpringFactoriesLoaderFactoryClass() { - return PigFeignAutoConfiguration.class; - } - - private void validate(Map attributes) { - AnnotationAttributes annotation = AnnotationAttributes.fromMap(attributes); - // This blows up if an aliased property is overspecified - FeignClientsRegistrar.validateFallback(annotation.getClass("fallback")); - FeignClientsRegistrar.validateFallbackFactory(annotation.getClass("fallbackFactory")); - } - - private String getName(Map attributes) { - String name = (String) attributes.get("serviceId"); - if (!StringUtils.hasText(name)) { - name = (String) attributes.get("name"); - } - if (!StringUtils.hasText(name)) { - name = (String) attributes.get("value"); - } - name = resolve(name); - return FeignClientsRegistrar.getName(name); - } - - private String getContextId(Map attributes) { - String contextId = (String) attributes.get("contextId"); - if (!StringUtils.hasText(contextId)) { - return getName(attributes); - } - - contextId = resolve(contextId); - return FeignClientsRegistrar.getName(contextId); - } - - private String resolve(String value) { - if (StringUtils.hasText(value)) { - return this.environment.resolvePlaceholders(value); - } - return value; - } - - private String getUrl(Map attributes) { - String url = resolve((String) attributes.get("url")); - return FeignClientsRegistrar.getUrl(url); - } - - private String getPath(Map attributes) { - String path = resolve((String) attributes.get("path")); - return FeignClientsRegistrar.getPath(path); - } - - @Nullable - private String getQualifier(@Nullable Map client) { - if (client == null) { - return null; - } - String qualifier = (String) client.get("qualifier"); - if (StringUtils.hasText(qualifier)) { - return qualifier; - } - return null; - } - - @Nullable - private String getClientName(@Nullable Map client) { - if (client == null) { - return null; - } - String value = (String) client.get("contextId"); - if (!StringUtils.hasText(value)) { - value = (String) client.get("value"); - } - if (!StringUtils.hasText(value)) { - value = (String) client.get("name"); - } - if (!StringUtils.hasText(value)) { - value = (String) client.get("serviceId"); - } - if (StringUtils.hasText(value)) { - return value; - } - - throw new IllegalStateException( - "Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName()); - } - - private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); - builder.addConstructorArgValue(name); - builder.addConstructorArgValue(configuration); - registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), - builder.getBeanDefinition()); - } - - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; - } + private final static String BASE_URL = "http://127.0.0.1:${server.port}${server.servlet.context-path}"; + + @Getter + private ClassLoader beanClassLoader; + + @Getter + private Environment environment; + + @Override + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + registerFeignClients(registry); + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = classLoader; + } + + private void registerFeignClients(BeanDefinitionRegistry registry) { + List feignClients = new ArrayList<>(); + + // 支持 springboot 2.7 + 最新版本的配置方式 + ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); + + // 如果 spring.factories 里为空 + if (feignClients.isEmpty()) { + return; + } + for (String className : feignClients) { + try { + Class clazz = beanClassLoader.loadClass(className); + AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(clazz, + FeignClient.class); + if (attributes == null) { + continue; + } + + // 如果是单体项目自动注入 & url 为空 + Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); + // 如果已经存在该 bean,支持原生的 Feign + if (registry.containsBeanDefinition(className) && isMicro) { + continue; + } + + registerClientConfiguration(registry, getClientName(attributes), className, + attributes.get("configuration")); + + validate(attributes); + BeanDefinitionBuilder definition = BeanDefinitionBuilder + .genericBeanDefinition(FeignClientFactoryBean.class); + definition.addPropertyValue("url", getUrl(registry, attributes)); + definition.addPropertyValue("path", getPath(attributes)); + String name = getName(attributes); + definition.addPropertyValue("name", name); + + // 兼容最新版本的 spring-cloud-openfeign,尚未发布 + StringBuilder aliasBuilder = new StringBuilder(18); + if (attributes.containsKey("contextId")) { + String contextId = getContextId(attributes); + aliasBuilder.append(contextId); + definition.addPropertyValue("contextId", contextId); + } else { + aliasBuilder.append(name); + } + + definition.addPropertyValue("type", className); + definition.addPropertyValue("dismiss404", + Boolean.parseBoolean(String.valueOf(attributes.get("dismiss404")))); + Object fallbackFactory = attributes.get("fallbackFactory"); + if (fallbackFactory != null) { + definition.addPropertyValue("fallbackFactory", fallbackFactory instanceof Class ? fallbackFactory + : ClassUtils.resolveClassName(fallbackFactory.toString(), null)); + } + definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); + definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + + AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); + + // alias + String alias = aliasBuilder.append("FeignClient").toString(); + + // has a default, won't be null + boolean primary = (Boolean) attributes.get("primary"); + + beanDefinition.setPrimary(primary); + + String qualifier = getQualifier(attributes); + if (StringUtils.hasText(qualifier)) { + alias = qualifier; + } + + BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, + new String[]{alias}); + BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + + /** + * Return the class used by {@link SpringFactoriesLoader} to load configuration + * candidates. + * + * @return the factory class + */ + private Class getSpringFactoriesLoaderFactoryClass() { + return PigFeignAutoConfiguration.class; + } + + private void validate(Map attributes) { + AnnotationAttributes annotation = AnnotationAttributes.fromMap(attributes); + // This blows up if an aliased property is overspecified + FeignClientsRegistrar.validateFallback(annotation.getClass("fallback")); + FeignClientsRegistrar.validateFallbackFactory(annotation.getClass("fallbackFactory")); + } + + private String getName(Map attributes) { + String name = (String) attributes.get("serviceId"); + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("name"); + } + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("value"); + } + name = resolve(name); + return FeignClientsRegistrar.getName(name); + } + + private String getContextId(Map attributes) { + String contextId = (String) attributes.get("contextId"); + if (!StringUtils.hasText(contextId)) { + return getName(attributes); + } + + contextId = resolve(contextId); + return FeignClientsRegistrar.getName(contextId); + } + + private String resolve(String value) { + if (StringUtils.hasText(value)) { + return this.environment.resolvePlaceholders(value); + } + return value; + } + + private String getUrl(BeanDefinitionRegistry registry, Map attributes) { + + // 如果是单体项目自动注入 & url 为空 + Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); + + if (isMicro) { + return null; + } + + String url = resolve(BASE_URL); + + return FeignClientsRegistrar.getUrl(url); + } + + private String getPath(Map attributes) { + String path = resolve((String) attributes.get("path")); + return FeignClientsRegistrar.getPath(path); + } + + @Nullable + private String getQualifier(@Nullable Map client) { + if (client == null) { + return null; + } + String qualifier = (String) client.get("qualifier"); + if (StringUtils.hasText(qualifier)) { + return qualifier; + } + return null; + } + + @Nullable + private String getClientName(@Nullable Map client) { + if (client == null) { + return null; + } + String value = (String) client.get("contextId"); + if (!StringUtils.hasText(value)) { + value = (String) client.get("value"); + } + if (!StringUtils.hasText(value)) { + value = (String) client.get("name"); + } + if (!StringUtils.hasText(value)) { + value = (String) client.get("serviceId"); + } + if (StringUtils.hasText(value)) { + return value; + } + + throw new IllegalStateException( + "Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName()); + } + + private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); + builder.addConstructorArgValue(name); + builder.addConstructorArgValue(configuration); + registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), + builder.getBeanDefinition()); + } + + private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object className, + Object configuration) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); + builder.addConstructorArgValue(name); + builder.addConstructorArgValue(className); + builder.addConstructorArgValue(configuration); + registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), + builder.getBeanDefinition()); + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } } -- Gitee From 66379e728fd8aa4f38c43707ca01310181fb962b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 13:15:21 +0800 Subject: [PATCH 190/238] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=20feign=20=E5=AF=BC=E5=85=A5=E6=94=AF=E6=8C=81=E5=8D=95?= =?UTF-8?q?=E4=BD=93=E7=89=88=E6=9C=AC=E9=80=9A=E8=BF=87SPI=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/PigFeignAutoConfiguration.java | 3 + .../annotation/EnablePigFeignClients.java | 87 ++++++++++--------- ...mework.cloud.openfeign.FeignClient.imports | 6 ++ 3 files changed, 53 insertions(+), 43 deletions(-) create mode 100644 pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index 29f89286..c16957f8 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -29,8 +29,10 @@ import feign.RequestInterceptor; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.openfeign.PigFeignClientsRegistrar; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Scope; /** @@ -40,6 +42,7 @@ import org.springframework.context.annotation.Scope; * @date 2020-02-12 */ @Configuration(proxyBeanMethods = false) +@Import(PigFeignClientsRegistrar.class) @AutoConfigureBefore(SentinelFeignAutoConfiguration.class) public class PigFeignAutoConfiguration { diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java index ed97d11a..d0cc7e48 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java @@ -18,8 +18,6 @@ package com.pig4cloud.pig.common.feign.annotation; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClientsConfiguration; -import org.springframework.cloud.openfeign.PigFeignClientsRegistrar; -import org.springframework.context.annotation.Import; import java.lang.annotation.*; @@ -31,52 +29,55 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @EnableFeignClients -@Import(PigFeignClientsRegistrar.class) public @interface EnablePigFeignClients { - /** - * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation - * declarations e.g.: {@code @ComponentScan("org.my.pkg")} instead of - * {@code @ComponentScan(basePackages="org.my.pkg")}. - * @return the array of 'basePackages'. - */ - String[] value() default {}; + /** + * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation + * declarations e.g.: {@code @ComponentScan("org.my.pkg")} instead of + * {@code @ComponentScan(basePackages="org.my.pkg")}. + * + * @return the array of 'basePackages'. + */ + String[] value() default {}; - /** - * Base packages to scan for annotated components. - *

        - * {@link #value()} is an alias for (and mutually exclusive with) this attribute. - *

        - * Use {@link #basePackageClasses()} for a type-safe alternative to String-based - * package names. - * @return the array of 'basePackages'. - */ - String[] basePackages() default { "com.pig4cloud.pig" }; + /** + * Base packages to scan for annotated components. + *

        + * {@link #value()} is an alias for (and mutually exclusive with) this attribute. + *

        + * Use {@link #basePackageClasses()} for a type-safe alternative to String-based + * package names. + * + * @return the array of 'basePackages'. + */ + String[] basePackages() default {"com.pig4cloud.pig"}; - /** - * Type-safe alternative to {@link #basePackages()} for specifying the packages to - * scan for annotated components. The package of each class specified will be scanned. - *

        - * Consider creating a special no-op marker class or interface in each package that - * serves no purpose other than being referenced by this attribute. - * @return the array of 'basePackageClasses'. - */ - Class[] basePackageClasses() default {}; + /** + * Type-safe alternative to {@link #basePackages()} for specifying the packages to + * scan for annotated components. The package of each class specified will be scanned. + *

        + * Consider creating a special no-op marker class or interface in each package that + * serves no purpose other than being referenced by this attribute. + * + * @return the array of 'basePackageClasses'. + */ + Class[] basePackageClasses() default {}; - /** - * A custom @Configuration for all feign clients. Can contain override - * @Bean definition for the pieces that make up the client, for instance - * {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}. - * - * @see FeignClientsConfiguration for the defaults - */ - Class[] defaultConfiguration() default {}; + /** + * A custom @Configuration for all feign clients. Can contain override + * @Bean definition for the pieces that make up the client, for instance + * {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}. + * + * @see FeignClientsConfiguration for the defaults + */ + Class[] defaultConfiguration() default {}; - /** - * List of classes annotated with @FeignClient. If not empty, disables classpath - * scanning. - * @return - */ - Class[] clients() default {}; + /** + * List of classes annotated with @FeignClient. If not empty, disables classpath + * scanning. + * + * @return + */ + Class[] clients() default {}; } diff --git a/pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports new file mode 100644 index 00000000..cedeeaff --- /dev/null +++ b/pig-upms/pig-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -0,0 +1,6 @@ +com.pig4cloud.pig.admin.api.feign.RemoteClientDetailsService +com.pig4cloud.pig.admin.api.feign.RemoteDictService +com.pig4cloud.pig.admin.api.feign.RemoteLogService +com.pig4cloud.pig.admin.api.feign.RemoteParamService +com.pig4cloud.pig.admin.api.feign.RemoteTokenService +com.pig4cloud.pig.admin.api.feign.RemoteUserService -- Gitee From d45551a88b1861e890636690544da30e05f617e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sat, 6 Apr 2024 23:20:01 +0800 Subject: [PATCH 191/238] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=AF=BC=E5=87=BA=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/SysLogController.java | 89 ++++++++++--------- .../pig/admin/service/SysLogService.java | 37 +++++--- .../admin/service/impl/SysLogServiceImpl.java | 68 +++++++++----- 3 files changed, 115 insertions(+), 79 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index 0cc74fa7..7ed53c5a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -20,7 +20,6 @@ package com.pig4cloud.pig.admin.controller; import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.dto.SysLogDTO; import com.pig4cloud.pig.admin.api.entity.SysLog; @@ -54,51 +53,55 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysLogController { - private final SysLogService sysLogService; + private final SysLogService sysLogService; - /** - * 简单分页查询 - * @param page 分页对象 - * @param sysLog 系统日志 - * @return - */ - @GetMapping("/page") - public R getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { - return R.ok(sysLogService.getLogByPage(page, sysLog)); - } + /** + * 简单分页查询 + * + * @param page 分页对象 + * @param sysLog 系统日志 + * @return + */ + @GetMapping("/page") + public R getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { + return R.ok(sysLogService.getLogByPage(page, sysLog)); + } - /** - * 批量删除日志 - * @param ids ID - * @return success/false - */ - @DeleteMapping - @PreAuthorize("@pms.hasPermission('sys_log_del')") - public R removeByIds(@RequestBody Long[] ids) { - return R.ok(sysLogService.removeBatchByIds(CollUtil.toList(ids))); - } + /** + * 批量删除日志 + * + * @param ids ID + * @return success/false + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_log_del')") + public R removeByIds(@RequestBody Long[] ids) { + return R.ok(sysLogService.removeBatchByIds(CollUtil.toList(ids))); + } - /** - * 插入日志 - * @param sysLog 日志实体 - * @return success/false - */ - @Inner - @PostMapping("/save") - public R save(@Valid @RequestBody SysLog sysLog) { - return R.ok(sysLogService.saveLog(sysLog)); - } + /** + * 插入日志 + * + * @param sysLog 日志实体 + * @return success/false + */ + @Inner + @PostMapping("/save") + public R save(@Valid @RequestBody SysLog sysLog) { + return R.ok(sysLogService.saveLog(sysLog)); + } - /** - * 导出excel 表格 - * @param sysLog 查询条件 - * @return - */ - @ResponseExcel - @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('sys_log_export')") - public List export(SysLog sysLog) { - return sysLogService.list(Wrappers.query(sysLog)); - } + /** + * 导出excel 表格 + * + * @param sysLog 查询条件 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_log_export')") + public List export(SysLogDTO sysLog) { + return sysLogService.getList(sysLog); + } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java index 7fe4dc7b..ce422696 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java @@ -24,6 +24,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.dto.SysLogDTO; import com.pig4cloud.pig.admin.api.entity.SysLog; +import java.util.List; + /** *

        * 日志表 服务类 @@ -34,19 +36,28 @@ import com.pig4cloud.pig.admin.api.entity.SysLog; */ public interface SysLogService extends IService { - /** - * 分页查询日志 - * @param page - * @param sysLog - * @return - */ - Page getLogByPage(Page page, SysLogDTO sysLog); + /** + * 分页查询日志 + * + * @param page + * @param sysLog + * @return + */ + Page getLogByPage(Page page, SysLogDTO sysLog); - /** - * 插入日志 - * @param sysLog 日志对象 - * @return true/false - */ - Boolean saveLog(SysLog sysLog); + /** + * 插入日志 + * + * @param sysLog 日志对象 + * @return true/false + */ + Boolean saveLog(SysLog sysLog); + /** + * 查询日志列表 + * + * @param sysLog 查询条件 + * @return List + */ + List getList(SysLogDTO sysLog); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index f956a0ae..9944e8a1 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -32,6 +32,8 @@ import com.pig4cloud.pig.admin.service.SysLogService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + /** *

        * 日志表 服务实现类 @@ -43,32 +45,52 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SysLogServiceImpl extends ServiceImpl implements SysLogService { - @Override - public Page getLogByPage(Page page, SysLogDTO sysLog) { + @Override + public Page getLogByPage(Page page, SysLogDTO sysLog) { + return baseMapper.selectPage(page, buildQuery(sysLog)); + } - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - if (StrUtil.isNotBlank(sysLog.getLogType())) { - wrapper.eq(SysLog::getLogType, sysLog.getLogType()); - } + /** + * 插入日志 + * + * @param sysLog 日志对象 + * @return true/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveLog(SysLog sysLog) { + baseMapper.insert(sysLog); + return Boolean.TRUE; + } - if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { - wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) - .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); - } + /** + * 查询日志列表 + * + * @param sysLog 查询条件 + * @return List + */ + @Override + public List getList(SysLogDTO sysLog) { + return baseMapper.selectList(buildQuery(sysLog)); + } - return baseMapper.selectPage(page, wrapper); - } + /** + * 构建查询条件 + * + * @param sysLog 前端条件 + * @return LambdaQueryWrapper + */ + private LambdaQueryWrapper buildQuery(SysLogDTO sysLog) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + if (StrUtil.isNotBlank(sysLog.getLogType())) { + wrapper.eq(SysLog::getLogType, sysLog.getLogType()); + } - /** - * 插入日志 - * @param sysLog 日志对象 - * @return true/false - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveLog(SysLog sysLog) { - baseMapper.insert(sysLog); - return Boolean.TRUE; - } + if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { + wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); + } + return wrapper; + } } -- Gitee From c10b7f8c7176bf69f0996fa7936df059f5e73d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 4 Apr 2024 21:34:45 +0800 Subject: [PATCH 192/238] :sparkles: Introducing new features. add pig-boot --- .../AuthorizationServerConfiguration.java | 15 +- pig-boot/Dockerfile | 13 ++ pig-boot/pom.xml | 105 +++++++++++++ .../com/pig4cloud/pig/PigBootApplication.java | 36 +++++ .../PigBootSecurityServerConfiguration.java | 143 ++++++++++++++++++ .../src/main/resources/application-dev.yml | 30 ++++ pig-boot/src/main/resources/application.yml | 86 +++++++++++ 7 files changed, 421 insertions(+), 7 deletions(-) create mode 100755 pig-boot/Dockerfile create mode 100755 pig-boot/pom.xml create mode 100755 pig-boot/src/main/java/com/pig4cloud/pig/PigBootApplication.java create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java create mode 100644 pig-boot/src/main/resources/application-dev.yml create mode 100644 pig-boot/src/main/resources/application.yml diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index 1c49ba5d..2291fd3f 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -30,6 +30,7 @@ import com.pig4cloud.pig.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationCo import com.pig4cloud.pig.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationProvider; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @@ -43,8 +44,7 @@ import org.springframework.security.oauth2.server.authorization.settings.Authori import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator; import org.springframework.security.oauth2.server.authorization.token.OAuth2RefreshTokenGenerator; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; -import org.springframework.security.oauth2.server.authorization.web.authentication.DelegatingAuthenticationConverter; -import org.springframework.security.oauth2.server.authorization.web.authentication.OAuth2AuthorizationCodeRequestAuthenticationConverter; +import org.springframework.security.oauth2.server.authorization.web.authentication.*; import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationConverter; @@ -71,6 +71,7 @@ public class AuthorizationServerConfiguration { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) + @ConditionalOnProperty(value = "security.micro", matchIfMissing = true) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { // OAuth 2.1 默认配置 @@ -115,6 +116,7 @@ public class AuthorizationServerConfiguration { /** * 令牌生成规则实现
        * client:username:uuid + * * @return OAuth2TokenGenerator */ @Bean @@ -127,13 +129,12 @@ public class AuthorizationServerConfiguration { /** * request -> xToken 注入请求转换器 + * * @return DelegatingAuthenticationConverter */ - private AuthenticationConverter accessTokenRequestConverter() { - return new DelegatingAuthenticationConverter( - Arrays.asList(new OAuth2ResourceOwnerPasswordAuthenticationConverter(), - new OAuth2ResourceOwnerSmsAuthenticationConverter(), - new OAuth2AuthorizationCodeRequestAuthenticationConverter())); + @Bean + public AuthenticationConverter accessTokenRequestConverter() { + return new DelegatingAuthenticationConverter(Arrays.asList(new OAuth2ResourceOwnerPasswordAuthenticationConverter(), new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(), new OAuth2ClientCredentialsAuthenticationConverter(), new OAuth2AuthorizationCodeAuthenticationConverter(), new OAuth2AuthorizationCodeRequestAuthenticationConverter())); } /** diff --git a/pig-boot/Dockerfile b/pig-boot/Dockerfile new file mode 100755 index 00000000..a4a08e67 --- /dev/null +++ b/pig-boot/Dockerfile @@ -0,0 +1,13 @@ +FROM alibabadragonwell/dragonwell:21-anolis + +WORKDIR /pig-boot + +ARG JAR_FILE=target/pig-boot.jar + +COPY ${JAR_FILE} app.jar + +EXPOSE 9999 + +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" + +CMD sleep 60; java $JAVA_OPTS -jar app.jar diff --git a/pig-boot/pom.xml b/pig-boot/pom.xml new file mode 100755 index 00000000..9ad96ed5 --- /dev/null +++ b/pig-boot/pom.xml @@ -0,0 +1,105 @@ + + + + + 4.0.0 + + com.pig4cloud + pig + ${revision} + + + pig-boot + jar + + pig 单体版本启动 + + + + + com.pig4cloud + pig-auth + ${revision} + + + org.springframework.boot + spring-boot-maven-plugin + + + + + com.pig4cloud + pig-codegen + ${revision} + + + + com.pig4cloud + pig-quartz + ${revision} + + + + com.pig4cloud + pig-upms-biz + ${revision} + + + + com.pig4cloud + pig-common-security + + + + com.pig4cloud + pig-common-swagger + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + + + boot + + + dev + + + + true + + + + diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/PigBootApplication.java b/pig-boot/src/main/java/com/pig4cloud/pig/PigBootApplication.java new file mode 100755 index 00000000..4b61e20d --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/PigBootApplication.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pig; + +import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; +import com.pig4cloud.pig.common.swagger.annotation.EnablePigDoc; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author lengleng 单体版本启动器,只需要运行此模块则整个系统启动 + */ +@EnablePigDoc(value = "admin", isMicro = false) +@EnablePigResourceServer +@SpringBootApplication +public class PigBootApplication { + + public static void main(String[] args) { + SpringApplication.run(PigBootApplication.class, args); + } + +} diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java b/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java new file mode 100644 index 00000000..e1a9b718 --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java @@ -0,0 +1,143 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pig.bootstrap; + +import com.pig4cloud.pig.auth.support.core.PigDaoAuthenticationProvider; +import com.pig4cloud.pig.auth.support.filter.PasswordDecoderFilter; +import com.pig4cloud.pig.auth.support.filter.ValidateCodeFilter; +import com.pig4cloud.pig.auth.support.handler.PigAuthenticationFailureEventHandler; +import com.pig4cloud.pig.auth.support.handler.PigAuthenticationSuccessEventHandler; +import com.pig4cloud.pig.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationProvider; +import com.pig4cloud.pig.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationProvider; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import com.pig4cloud.pig.common.security.component.PermitAllUrlProperties; +import com.pig4cloud.pig.common.security.component.PigBearerTokenExtractor; +import com.pig4cloud.pig.common.security.component.ResourceAuthExceptionEntryPoint; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; +import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; +import org.springframework.security.web.DefaultSecurityFilterChain; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import java.util.stream.Collectors; + +/** + * @author lengleng 认证授权服务器配置 + */ +@Configuration +@RequiredArgsConstructor +public class PigBootSecurityServerConfiguration { + + private final ResourceAuthExceptionEntryPoint resourceAuthExceptionEntryPoint; + + private final OpaqueTokenIntrospector customOpaqueTokenIntrospector; + + private final AuthenticationConverter accessTokenRequestConverter; + + private final OAuth2AuthorizationService authorizationService; + + private final PigBearerTokenExtractor pigBearerTokenExtractor; + + private final PasswordDecoderFilter passwordDecoderFilter; + + private final OAuth2TokenGenerator oAuth2TokenGenerator; + + private final ValidateCodeFilter validateCodeFilter; + + private final PermitAllUrlProperties permitAllUrl; + + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); + + http.addFilterAfter(passwordDecoderFilter, UsernamePasswordAuthenticationFilter.class); + http.addFilterAfter(validateCodeFilter, UsernamePasswordAuthenticationFilter.class); + http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 + tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter) // 注入自定义的授权认证Converter + .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 + .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 + }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 + oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 + .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))) + .authorizationService(authorizationService).authorizationServerSettings( + AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build()); + + AntPathRequestMatcher[] requestMatchers = permitAllUrl.getUrls().stream().map(AntPathRequestMatcher::new) + .collect(Collectors.toList()).toArray(new AntPathRequestMatcher[]{}); + + http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers).permitAll() + .anyRequest().authenticated()) + .oauth2ResourceServer( + oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) + .authenticationEntryPoint(resourceAuthExceptionEntryPoint) + .bearerTokenResolver(pigBearerTokenExtractor)) + .exceptionHandling(configurer -> configurer.authenticationEntryPoint(resourceAuthExceptionEntryPoint)) + .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .csrf(AbstractHttpConfigurer::disable); + + DefaultSecurityFilterChain securityFilterChain = http.build(); + + // 注入自定义授权模式实现 + addCustomOAuth2GrantAuthenticationProvider(http); + return securityFilterChain; + } + + /** + * 注入授权模式实现提供方 + *

        + * 1. 密码模式
        + * 2. 短信登录
        + */ + @SuppressWarnings("unchecked") + private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + OAuth2AuthorizationService authorizationService = http.getSharedObject(OAuth2AuthorizationService.class); + + OAuth2ResourceOwnerPasswordAuthenticationProvider resourceOwnerPasswordAuthenticationProvider = new OAuth2ResourceOwnerPasswordAuthenticationProvider( + authenticationManager, authorizationService, oAuth2TokenGenerator); + + OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider( + authenticationManager, authorizationService, oAuth2TokenGenerator); + + // 处理 UsernamePasswordAuthenticationToken + http.authenticationProvider(new PigDaoAuthenticationProvider()); + // 处理 OAuth2ResourceOwnerPasswordAuthenticationToken + http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider); + // 处理 OAuth2ResourceOwnerSmsAuthenticationToken + http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); + } + +} diff --git a/pig-boot/src/main/resources/application-dev.yml b/pig-boot/src/main/resources/application-dev.yml new file mode 100644 index 00000000..43a7e8e3 --- /dev/null +++ b/pig-boot/src/main/resources/application-dev.yml @@ -0,0 +1,30 @@ +spring: + redis: + host: pig-redis + # 数据库相关配置 + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: root + url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true + +# 本地文件系统 +file: + local: + enable: true + base-path: /Users/lengleng/Downloads/img + +## 登录配置 +security: + # 登录报文加密根密钥 ,必须是16位 + encodeKey: thanks,pig4cloud + # 跳过验证码校验的客户端 + ignore-clients: + - test + +# 配置文件加密根密码 +jasypt: + encryptor: + password: pig + algorithm: PBEWithMD5AndDES + iv-generator-classname: org.jasypt.iv.NoIvGenerator diff --git a/pig-boot/src/main/resources/application.yml b/pig-boot/src/main/resources/application.yml new file mode 100644 index 00000000..d5c37198 --- /dev/null +++ b/pig-boot/src/main/resources/application.yml @@ -0,0 +1,86 @@ +server: + port: 9999 + servlet: + context-path: /admin + +spring: + application: + name: @project.artifactId@ + # 缓存相关配置 + cache: + type: redis + # 定时任务属性配置 + quartz: + properties: + org: + quartz: + scheduler: + instanceName: clusteredScheduler + instanceId: AUTO + jobStore: + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 10000 + useProperties: false + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 50 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + job-store-type: jdbc + jdbc: + initialize-schema: always # 生产注意设置为 never + startup-delay: 10 + # 上传文件大小限制 + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + cloud: + nacos: + config: + enabled: false + discovery: + enabled: false + main: + allow-bean-definition-overriding: true + profiles: + active: dev + + +## spring security 对外暴露接口设置 +security: + micro: false + oauth2: + ignore: + urls: + - /webjars/** + - /v3/api-docs/** + - /doc.html + - /swagger-ui.html + - /swagger-ui/** + - /swagger-resources + - /token/check_token + - /error + - /token/** + - /actuator/** + - /code/** + +#--------------如下配置尽量不要变动------------- +# mybatis-plus 配置 +mybatis-plus: + mapper-locations: classpath*:/mapper/*Mapper.xml + global-config: + banner: false + db-config: + id-type: auto + where-strategy: not_empty + insert-strategy: not_empty + update-strategy: not_null + type-handlers-package: com.pig4cloud.pig.common.mybatis.handler + configuration: + jdbc-type-for-null: 'null' + call-setters-on-nulls: true + shrink-whitespaces-in-sql: true -- Gitee From a318d85f845cab1682e67d68bf0068b74c76d7c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 14:31:47 +0800 Subject: [PATCH 193/238] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20EnablePigDoc=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20isMicro=20=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/swagger/annotation/EnablePigDoc.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java index a9b0de24..6baa298f 100644 --- a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java +++ b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java @@ -46,4 +46,11 @@ public @interface EnablePigDoc { */ String value(); + /** + * 是否是微服务架构 + * + * @return bool + */ + boolean isMicro() default true; + } -- Gitee From ff921f91c4673a3ea16c3904a6df7d06b263b2a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 14:32:23 +0800 Subject: [PATCH 194/238] =?UTF-8?q?=F0=9F=94=A5=20=E5=88=A0=E9=99=A4=20@En?= =?UTF-8?q?ablePigFeignClients=20=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/EnablePigFeignClients.java | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100755 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java deleted file mode 100755 index d0cc7e48..00000000 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/EnablePigFeignClients.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pig4cloud.pig.common.feign.annotation; - -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClientsConfiguration; - -import java.lang.annotation.*; - -/** - * @author lengleng - * @date 2019/2/1 - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@EnableFeignClients -public @interface EnablePigFeignClients { - - /** - * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation - * declarations e.g.: {@code @ComponentScan("org.my.pkg")} instead of - * {@code @ComponentScan(basePackages="org.my.pkg")}. - * - * @return the array of 'basePackages'. - */ - String[] value() default {}; - - /** - * Base packages to scan for annotated components. - *

        - * {@link #value()} is an alias for (and mutually exclusive with) this attribute. - *

        - * Use {@link #basePackageClasses()} for a type-safe alternative to String-based - * package names. - * - * @return the array of 'basePackages'. - */ - String[] basePackages() default {"com.pig4cloud.pig"}; - - /** - * Type-safe alternative to {@link #basePackages()} for specifying the packages to - * scan for annotated components. The package of each class specified will be scanned. - *

        - * Consider creating a special no-op marker class or interface in each package that - * serves no purpose other than being referenced by this attribute. - * - * @return the array of 'basePackageClasses'. - */ - Class[] basePackageClasses() default {}; - - /** - * A custom @Configuration for all feign clients. Can contain override - * @Bean definition for the pieces that make up the client, for instance - * {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}. - * - * @see FeignClientsConfiguration for the defaults - */ - Class[] defaultConfiguration() default {}; - - /** - * List of classes annotated with @FeignClient. If not empty, disables classpath - * scanning. - * - * @return - */ - Class[] clients() default {}; - -} -- Gitee From 38a8b41bfb0f2dbcb8b1e12e52a08865e3f06c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 14:32:57 +0800 Subject: [PATCH 195/238] =?UTF-8?q?:art:=20Improving=20structure=20/=20for?= =?UTF-8?q?mat=20of=20the=20code.=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/auth/PigAuthApplication.java | 2 - .../AuthorizationServerConfiguration.java | 11 +- .../auth/config/WebSecurityConfiguration.java | 88 +- .../pig/auth/endpoint/ImageCodeEndpoint.java | 2 +- .../filter/AuthSecurityConfigProperties.java | 24 +- .../support/filter/PasswordDecoderFilter.java | 6 +- .../support/filter/ValidateCodeFilter.java | 8 +- .../PigBootSecurityServerConfiguration.java | 18 +- .../pig/common/core/util/RedisUtils.java | 1302 ++++++++--------- .../feign/PigFeignAutoConfiguration.java | 53 +- .../core/PigFeignRequestCloseInterceptor.java | 1 + .../openfeign/PigFeignClientsRegistrar.java | 30 +- .../resolver/SqlFilterArgumentResolver.java | 22 +- .../swagger/annotation/EnablePigDoc.java | 1 - .../config/OpenAPIMetadataConfiguration.java | 6 + .../gateway/config/GatewayConfiguration.java | 5 - .../pig/admin/PigAdminApplication.java | 2 - .../admin/controller/SysLogController.java | 6 +- .../pig/admin/service/SysLogService.java | 3 +- .../admin/service/impl/SysLogServiceImpl.java | 87 +- .../service/impl/SysUserServiceImpl.java | 15 +- .../pig/codegen/PigCodeGenApplication.java | 2 - .../daemon/quartz/PigQuartzApplication.java | 2 - .../quartz/util/JavaClassTaskInvok.java | 2 +- pom.xml | 1 + 25 files changed, 838 insertions(+), 861 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/PigAuthApplication.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/PigAuthApplication.java index 1e36a8b9..3591081c 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/PigAuthApplication.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/PigAuthApplication.java @@ -16,7 +16,6 @@ package com.pig4cloud.pig.auth; -import com.pig4cloud.pig.common.feign.annotation.EnablePigFeignClients; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @@ -25,7 +24,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; * @author lengleng * @date 2018年06月21日 认证授权中心 */ -@EnablePigFeignClients @EnableDiscoveryClient @SpringBootApplication public class PigAuthApplication { diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index 2291fd3f..6220418c 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -68,7 +68,6 @@ public class AuthorizationServerConfiguration { private final ValidateCodeFilter validateCodeFilter; - @Bean @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnProperty(value = "security.micro", matchIfMissing = true) @@ -83,7 +82,6 @@ public class AuthorizationServerConfiguration { OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = http .getConfigurer(OAuth2AuthorizationServerConfigurer.class); - // 增加验证码过滤器 http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class); // 增加密码解密过滤器 @@ -116,7 +114,6 @@ public class AuthorizationServerConfiguration { /** * 令牌生成规则实现
        * client:username:uuid - * * @return OAuth2TokenGenerator */ @Bean @@ -129,12 +126,16 @@ public class AuthorizationServerConfiguration { /** * request -> xToken 注入请求转换器 - * * @return DelegatingAuthenticationConverter */ @Bean public AuthenticationConverter accessTokenRequestConverter() { - return new DelegatingAuthenticationConverter(Arrays.asList(new OAuth2ResourceOwnerPasswordAuthenticationConverter(), new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(), new OAuth2ClientCredentialsAuthenticationConverter(), new OAuth2AuthorizationCodeAuthenticationConverter(), new OAuth2AuthorizationCodeRequestAuthenticationConverter())); + return new DelegatingAuthenticationConverter(Arrays.asList( + new OAuth2ResourceOwnerPasswordAuthenticationConverter(), + new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(), + new OAuth2ClientCredentialsAuthenticationConverter(), + new OAuth2AuthorizationCodeAuthenticationConverter(), + new OAuth2AuthorizationCodeRequestAuthenticationConverter())); } /** diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java index 1da2acc2..76dc965f 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java @@ -33,50 +33,50 @@ import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity public class WebSecurityConfiguration { - /** - * spring security 默认的安全策略 - * - * @param http security注入点 - * @return SecurityFilterChain - * @throws Exception - */ - @Bean - SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { - http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*") - .permitAll()// 开放自定义的部分端点 - .anyRequest() - .authenticated()) - .headers() - .frameOptions() - .sameOrigin()// 避免iframe同源无法登录 - .and() - .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 - // 处理 UsernamePasswordAuthenticationToken - http.authenticationProvider(new PigDaoAuthenticationProvider()); - return http.build(); - } + /** + * spring security 默认的安全策略 + * + * @param http security注入点 + * @return SecurityFilterChain + * @throws Exception + */ + @Bean + SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { + http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*") + .permitAll()// 开放自定义的部分端点 + .anyRequest() + .authenticated()) + .headers() + .frameOptions() + .sameOrigin()// 避免iframe同源无法登录 + .and() + .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 + // 处理 UsernamePasswordAuthenticationToken + http.authenticationProvider(new PigDaoAuthenticationProvider()); + return http.build(); + } - /** - * 暴露静态资源 - *

        - * https://github.com/spring-projects/spring-security/issues/10938 - * - * @param http - * @return - * @throws Exception - */ - @Bean - @Order(0) - SecurityFilterChain resources(HttpSecurity http) throws Exception { - http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/code/image", "/css/**", "/error")) - .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) - .requestCache() - .disable() - .securityContext() - .disable() - .sessionManagement() - .disable(); - return http.build(); - } + /** + * 暴露静态资源 + *

        + * https://github.com/spring-projects/spring-security/issues/10938 + * + * @param http + * @return + * @throws Exception + */ + @Bean + @Order(0) + SecurityFilterChain resources(HttpSecurity http) throws Exception { + http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/code/image", "/css/**", "/error")) + .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) + .requestCache() + .disable() + .securityContext() + .disable() + .sessionManagement() + .disable(); + return http.build(); + } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java index 2a67a929..17665e35 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java @@ -43,6 +43,6 @@ public class ImageCodeEndpoint { .set(CacheConstants.DEFAULT_CODE_KEY + randomStr, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); // 转换流信息写出 captcha.out(response.getOutputStream()); - } + } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java index 918be580..2633caf6 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/AuthSecurityConfigProperties.java @@ -19,19 +19,19 @@ import java.util.List; @ConfigurationProperties("security") public class AuthSecurityConfigProperties { - /** - * 是否是微服务架构 - */ - private boolean isMicro; + /** + * 是否是微服务架构 + */ + private boolean isMicro; - /** - * 网关解密登录前端密码 秘钥 - */ - private String encodeKey; + /** + * 网关解密登录前端密码 秘钥 + */ + private String encodeKey; - /** - * 网关不需要校验验证码的客户端 - */ - private List ignoreClients; + /** + * 网关不需要校验验证码的客户端 + */ + private List ignoreClients; } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java index 267c931b..ac33ed28 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java @@ -53,14 +53,14 @@ public class PasswordDecoderFilter extends OncePerRequestFilter { private static final String KEY_ALGORITHM = "AES"; - static { // 关闭hutool 强制关闭Bouncy Castle库的依赖 SecureUtil.disableBouncyCastle(); } @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { // 不是登录请求,直接向下执行 if (!StrUtil.containsAnyIgnoreCase(request.getRequestURI(), SecurityConstants.OAUTH_TOKEN_URL)) { chain.doFilter(request, response); @@ -76,7 +76,6 @@ public class PasswordDecoderFilter extends OncePerRequestFilter { new SecretKeySpec(authSecurityConfigProperties.getEncodeKey().getBytes(), KEY_ALGORITHM), new IvParameterSpec(authSecurityConfigProperties.getEncodeKey().getBytes())); - parameterMap.forEach((k, v) -> { String[] values = parameterMap.get(k); if (!PASSWORD.equals(k) || ArrayUtil.isEmpty(values)) { @@ -90,5 +89,4 @@ public class PasswordDecoderFilter extends OncePerRequestFilter { chain.doFilter(requestWrapper, response); } - } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java index 48c34e0b..4b528b5f 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java @@ -7,7 +7,6 @@ package com.pig4cloud.pig.auth.support.filter; * @date 2024/4/3 */ - import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.SecurityConstants; @@ -43,9 +42,9 @@ public class ValidateCodeFilter extends OncePerRequestFilter { private final AuthSecurityConfigProperties authSecurityConfigProperties; - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { String requestUrl = request.getServletPath(); @@ -121,7 +120,6 @@ public class ValidateCodeFilter extends OncePerRequestFilter { } redisTemplate.delete(key); - } + } } - diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java b/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java index e1a9b718..7f6f25b2 100644 --- a/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java +++ b/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java @@ -92,14 +92,20 @@ public class PigBootSecurityServerConfiguration { oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))) - .authorizationService(authorizationService).authorizationServerSettings( + .authorizationService(authorizationService) + .authorizationServerSettings( AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build()); - AntPathRequestMatcher[] requestMatchers = permitAllUrl.getUrls().stream().map(AntPathRequestMatcher::new) - .collect(Collectors.toList()).toArray(new AntPathRequestMatcher[]{}); + AntPathRequestMatcher[] requestMatchers = permitAllUrl.getUrls() + .stream() + .map(AntPathRequestMatcher::new) + .collect(Collectors.toList()) + .toArray(new AntPathRequestMatcher[]{}); - http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers).permitAll() - .anyRequest().authenticated()) + http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers) + .permitAll() + .anyRequest() + .authenticated()) .oauth2ResourceServer( oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) .authenticationEntryPoint(resourceAuthExceptionEntryPoint) @@ -138,6 +144,6 @@ public class PigBootSecurityServerConfiguration { http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider); // 处理 OAuth2ResourceOwnerSmsAuthenticationToken http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); - } + } } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java index 3a96c712..82184d4e 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -20,661 +20,651 @@ import java.util.concurrent.TimeUnit; @UtilityClass public class RedisUtils { - private static final Long SUCCESS = 1L; - - /** - * 指定缓存失效时间 - * - * @param key 键 - * @param time 时间(秒) - */ - public boolean expire(String key, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate) - .filter(template -> time > 0) - .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); - return true; - } - - /** - * 根据 key 获取过期时间 - * - * @param key 键 不能为null - * @return 时间(秒) 返回0代表为永久有效 - */ - public long getExpire(Object key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate) - .map(template -> template.getExpire(key, TimeUnit.SECONDS)) - .orElse(-1L); - } - - /** - * 查找匹配key - * - * @param pattern key - * @return / - */ - public List scan(String pattern) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); - return Optional.ofNullable(redisTemplate).map(template -> { - RedisConnectionFactory factory = template.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(); - while (cursor.hasNext()) { - result.add(new String(cursor.next())); - } - RedisConnectionUtils.releaseConnection(rc, factory); - return result; - }).orElse(Collections.emptyList()); - } - - /** - * 分页查询 key - * - * @param patternKey key - * @param page 页码 - * @param size 每页数目 - * @return / - */ - public List findKeysForPage(String patternKey, int page, int size) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(size); - int tmpIndex = 0; - int fromIndex = page * size; - int toIndex = page * size + size; - while (cursor.hasNext()) { - if (tmpIndex >= fromIndex && tmpIndex < toIndex) { - result.add(new String(cursor.next())); - tmpIndex++; - continue; - } - // 获取到满足条件的数据后,就可以退出了 - if (tmpIndex >= toIndex) { - break; - } - tmpIndex++; - cursor.next(); - } - RedisConnectionUtils.releaseConnection(rc, factory); - return result; - } - - /** - * 判断key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public boolean hasKey(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> template.hasKey(key)).orElse(false); - } - - /** - * 删除缓存 - * - * @param keys 可以传一个值 或多个 - */ - public void del(String... keys) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - if (keys != null) { - Arrays.stream(keys).forEach(redisTemplate::delete); - } - } - - /** - * 获取锁 - * - * @param lockKey 锁key - * @param value value - * @param expireTime:单位-秒 - * @return boolean - */ - public boolean getLock(String lockKey, String value, int expireTime) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate) - .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) - .orElse(false); - } - - /** - * 释放锁 - * - * @param lockKey 锁key - * @param value value - * @return boolean - */ - public boolean releaseLock(String lockKey, String value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; - RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); - return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) - .map(Convert::toLong) - .filter(SUCCESS::equals) - .isPresent(); - } - - // ============================String============================= - - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public T get(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForValue().get(key); - } - - /** - * 批量获取 - * - * @param keys - * @return - */ - public List multiGet(List keys) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForValue().multiGet(keys); - } - - /** - * 普通缓存放入 - * - * @param key 键 - * @param value 值 - * @return true成功 false失败 - */ - public boolean set(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - template.opsForValue().set(key, value); - return true; - }); - return true; - } - - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> { - if (time > 0) { - template.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { - template.opsForValue().set(key, value); - } - return true; - }).orElse(false); - } - - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间 - * @param timeUnit 类型 - * @return true成功 false 失败 - */ - public boolean set(String key, T value, long time, TimeUnit timeUnit) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - if (time > 0) { - template.opsForValue().set(key, value, time, timeUnit); - } else { - template.opsForValue().set(key, value); - } - return true; - }); - return true; - } - - // ================================Map================================= - - /** - * HashGet - * - * @param key 键 不能为null - * @param hashKey 项 不能为null - * @return 值 - */ - public HV hget(String key, HK hashKey) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().get(key, hashKey); - } - - /** - * 获取hashKey对应的所有键值 - * - * @param key 键 - * @return 对应的多个键值 - */ - public Map hmget(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().entries(key); - } - - /** - * HashSet - * - * @param key 键 - * @param map 对应多个键值 - * @return true 成功 false 失败 - */ - public boolean hmset(String key, Map map) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().putAll(key, map); - return true; - }); - return true; - } - - /** - * HashSet 并设置时间 - * - * @param key 键 - * @param map 对应多个键值 - * @param time 时间(秒) - * @return true成功 false失败 - */ - public boolean hmset(String key, Map map, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().putAll(key, map); - if (time > 0) { - template.expire(key, time, TimeUnit.SECONDS); - } - return true; - }); - return true; - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().put(key, item, value); - return true; - }).orElse(false); - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return Optional.ofNullable(redisTemplate).map(template -> { - template.opsForHash().put(key, item, value); - if (time > 0) { - template.expire(key, time, TimeUnit.SECONDS); - } - return true; - }).orElse(false); - } - - /** - * 删除hash表中的值 - * - * @param key 键 不能为null - * @param item 项 可以使多个 不能为null - */ - public void hdel(String key, Object... item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForHash().delete(key, item); - } - - /** - * 判断hash表中是否有该项的值 - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return true 存在 false不存在 - */ - public boolean hHasKey(String key, String item) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().hasKey(key, item); - } - - /** - * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * - * @param key 键 - * @param item 项 - * @param by 要增加几(大于0) - * @return - */ - public double hincr(String key, String item, double by) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().increment(key, item, by); - } - - /** - * hash递减 - * - * @param key 键 - * @param item 项 - * @param by 要减少记(小于0) - * @return - */ - public double hdecr(String key, String item, double by) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForHash().increment(key, item, -by); - } - - // ============================set============================= - - /** - * 根据key获取Set中的所有值 - * - * @param key 键 - * @return - */ - public Set sGet(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().members(key); - } - - /** - * 根据value从一个set中查询,是否存在 - * - * @param key 键 - * @param value 值 - * @return true 存在 false不存在 - */ - public boolean sHasKey(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().isMember(key, value); - } - - /** - * 将数据放入set缓存 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSet(String key, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().add(key, values); - } - - /** - * 将set数据放入缓存 - * - * @param key 键 - * @param time 时间(秒) - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSetAndTime(String key, long time, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } - - /** - * 获取set缓存的长度 - * - * @param key 键 - * @return - */ - public long sGetSetSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().size(key); - } - - /** - * 移除值为value的 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 移除的个数 - */ - public long setRemove(String key, Object... values) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } - - /** - * 获集合key1和集合key2的差集元素 - * - * @param key 键 - * @return - */ - public Set sDifference(String key, String otherKey) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForSet().difference(key, otherKey); - } - - // ===============================list================================= - - /** - * 获取list缓存的内容 - * - * @param key 键 - * @param start 开始 - * @param end 结束 0 到 -1代表所有值 - * @return - */ - public List lGet(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().range(key, start, end); - } - - /** - * 获取list缓存的长度 - * - * @param key 键 - * @return - */ - public long lGetListSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().size(key); - } - - /** - * 通过索引 获取list中的值 - * - * @param key 键 - * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 - * @return - */ - public Object lGetIndex(String key, long index) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().index(key, index); - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPush(key, value); - return true; - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, Object value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - Optional.ofNullable(redisTemplate).ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); - } - return true; - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, List value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPushAll(key, value); - return true; - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, List value, long time) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } - - /** - * 根据索引修改list中的某条数据 - * - * @param key 键 - * @param index 索引 - * @param value 值 - * @return / - */ - public boolean lUpdateIndex(String key, long index, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - redisTemplate.opsForList().set(key, index, value); - return true; - } - - /** - * 移除N个值为value - * - * @param key 键 - * @param count 移除多少个 - * @param value 值 - * @return 移除的个数 - */ - public long lRemove(String key, long count, Object value) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForList().remove(key, count, value); - } - - /** - * 将zSet数据放入缓存 - * - * @param key - * @param time - * @param tuples - * @return - */ - public long zSetAndTime(String key, long time, Set> tuples) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - Long count = redisTemplate.opsForZSet().add(key, tuples); - if (time > 0) { - expire(key, time); - } - return count; - - } - - /** - * Sorted set:有序集合获取 - * - * @param key - * @param min - * @param max - * @return - */ - public Set zRangeByScore(String key, double min, double max) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.rangeByScore(key, min, max); - - } - - /** - * Sorted set:有序集合获取 正序 - * - * @param key - * @param start - * @param end - * @return - */ - public Set zRange(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.range(key, start, end); - - } - - /** - * Sorted set:有序集合获取 倒叙 - * - * @param key - * @param start - * @param end - * @return - */ - public Set zReverseRange(String key, long start, long end) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - ZSetOperations zset = redisTemplate.opsForZSet(); - return zset.reverseRange(key, start, end); - - } - - /** - * 获取zSet缓存的长度 - * - * @param key 键 - * @return - */ - public long zGetSetSize(String key) { - RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); - return redisTemplate.opsForZSet().size(key); - } + private static final Long SUCCESS = 1L; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate) + .filter(template -> time > 0) + .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); + return true; + } + + /** + * 根据 key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate) + .map(template -> template.getExpire(key, TimeUnit.SECONDS)) + .orElse(-1L); + } + + /** + * 查找匹配key + * + * @param pattern key + * @return / + */ + public List scan(String pattern) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + return Optional.ofNullable(redisTemplate).map(template -> { + RedisConnectionFactory factory = template.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + RedisConnectionUtils.releaseConnection(rc, factory); + return result; + }).orElse(Collections.emptyList()); + } + + /** + * 分页查询 key + * + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + RedisConnectionUtils.releaseConnection(rc, factory); + return result; + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> template.hasKey(key)).orElse(false); + } + + /** + * 删除缓存 + * + * @param keys 可以传一个值 或多个 + */ + public void del(String... keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + if (keys != null) { + Arrays.stream(keys).forEach(redisTemplate::delete); + } + } + + /** + * 获取锁 + * + * @param lockKey 锁key + * @param value value + * @param expireTime:单位-秒 + * @return boolean + */ + public boolean getLock(String lockKey, String value, int expireTime) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate) + .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) + .orElse(false); + } + + /** + * 释放锁 + * + * @param lockKey 锁key + * @param value value + * @return boolean + */ + public boolean releaseLock(String lockKey, String value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); + return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) + .map(Convert::toLong) + .filter(SUCCESS::equals) + .isPresent(); + } + + // ============================String============================= + + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + public T get(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForValue().get(key); + } + + /** + * 批量获取 + * + * @param keys + * @return + */ + public List multiGet(List keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForValue().multiGet(keys); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForValue().set(key, value); + return true; + }); + return true; + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + if (time > 0) { + template.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + template.opsForValue().set(key, value); + } + return true; + }).orElse(false); + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, T value, long time, TimeUnit timeUnit) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + if (time > 0) { + template.opsForValue().set(key, value, time, timeUnit); + } else { + template.opsForValue().set(key, value); + } + return true; + }); + return true; + } + + // ================================Map================================= + + /** + * HashGet + * + * @param key 键 不能为null + * @param hashKey 项 不能为null + * @return 值 + */ + public HV hget(String key, HK hashKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().get(key, hashKey); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().putAll(key, map); + return true; + }); + return true; + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().putAll(key, map); + if (time > 0) { + template.expire(key, time, TimeUnit.SECONDS); + } + return true; + }); + return true; + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().put(key, item, value); + return true; + }).orElse(false); + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return Optional.ofNullable(redisTemplate).map(template -> { + template.opsForHash().put(key, item, value); + if (time > 0) { + template.expire(key, time, TimeUnit.SECONDS); + } + return true; + }).orElse(false); + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * @param key 键 + * @return + */ + public Set sGet(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().members(key); + } + + /** + * 根据value从一个set中查询,是否存在 + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().isMember(key, value); + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().add(key, values); + } + + /** + * 将set数据放入缓存 + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().size(key); + } + + /** + * 移除值为value的 + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } + + /** + * 获集合key1和集合key2的差集元素 + * + * @param key 键 + * @return + */ + public Set sDifference(String key, String otherKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForSet().difference(key, otherKey); + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().range(key, start, end); + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().size(key); + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().index(key, index); + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPush(key, value); + return true; + } + + /** + * 将list放入缓存 + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + Optional.ofNullable(redisTemplate).ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); + } + return true; + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForList().set(key, index, value); + return true; + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForList().remove(key, count, value); + } + + /** + * 将zSet数据放入缓存 + * + * @param key + * @param time + * @param tuples + * @return + */ + public long zSetAndTime(String key, long time, Set> tuples) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Long count = redisTemplate.opsForZSet().add(key, tuples); + if (time > 0) { + expire(key, time); + } + return count; + + } + + /** + * Sorted set:有序集合获取 + * + * @param key + * @param min + * @param max + * @return + */ + public Set zRangeByScore(String key, double min, double max) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, min, max); + + } + + /** + * Sorted set:有序集合获取 正序 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.range(key, start, end); + + } + + /** + * Sorted set:有序集合获取 倒叙 + * @param key + * @param start + * @param end + * @return + */ + public Set zReverseRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.reverseRange(key, start, end); + + } + + /** + * 获取zSet缓存的长度 + * @param key 键 + * @return + */ + public long zGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForZSet().size(key); + } } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index c16957f8..997409ec 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -46,33 +46,34 @@ import org.springframework.context.annotation.Scope; @AutoConfigureBefore(SentinelFeignAutoConfiguration.class) public class PigFeignAutoConfiguration { - @Bean - @Scope("prototype") - @ConditionalOnMissingBean - @ConditionalOnProperty(name = "feign.sentinel.enabled") - public Feign.Builder feignSentinelBuilder() { - return PigSentinelFeign.builder(); - } + @Bean + @Scope("prototype") + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "feign.sentinel.enabled") + public Feign.Builder feignSentinelBuilder() { + return PigSentinelFeign.builder(); + } - @Bean - @ConditionalOnMissingBean - public BlockExceptionHandler blockExceptionHandler(ObjectMapper objectMapper) { - return new PigUrlBlockHandler(objectMapper); - } + @Bean + @ConditionalOnMissingBean + public BlockExceptionHandler blockExceptionHandler(ObjectMapper objectMapper) { + return new PigUrlBlockHandler(objectMapper); + } - @Bean - @ConditionalOnMissingBean - public RequestOriginParser requestOriginParser() { - return new PigHeaderRequestOriginParser(); - } + @Bean + @ConditionalOnMissingBean + public RequestOriginParser requestOriginParser() { + return new PigHeaderRequestOriginParser(); + } + + /** + * set connection close header + * + * @return RequestInterceptor + */ + @Bean + public RequestInterceptor pigFeignRequestCloseInterceptor() { + return new PigFeignRequestCloseInterceptor(); + } - /** - * set connection close header - * - * @return RequestInterceptor - */ - @Bean - public RequestInterceptor pigFeignRequestCloseInterceptor() { - return new PigFeignRequestCloseInterceptor(); - } } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java index 83a8b512..c8ae0d6e 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java @@ -20,4 +20,5 @@ public class PigFeignRequestCloseInterceptor implements RequestInterceptor { public void apply(feign.RequestTemplate template) { template.header(HttpHeaders.CONNECTION, "close"); } + } diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index c34b4d81..9ce54857 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -34,7 +34,6 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; import org.springframework.lang.Nullable; -import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -68,11 +67,12 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } private void registerFeignClients(BeanDefinitionRegistry registry) { - List feignClients = new ArrayList<>(); + + List feignClients = new ArrayList<>( + SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())); // 支持 springboot 2.7 + 最新版本的配置方式 ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); - // 如果 spring.factories 里为空 if (feignClients.isEmpty()) { return; @@ -93,8 +93,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, continue; } - registerClientConfiguration(registry, getClientName(attributes), className, - attributes.get("configuration")); + registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); validate(attributes); BeanDefinitionBuilder definition = BeanDefinitionBuilder @@ -115,13 +114,8 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } definition.addPropertyValue("type", className); - definition.addPropertyValue("dismiss404", - Boolean.parseBoolean(String.valueOf(attributes.get("dismiss404")))); - Object fallbackFactory = attributes.get("fallbackFactory"); - if (fallbackFactory != null) { - definition.addPropertyValue("fallbackFactory", fallbackFactory instanceof Class ? fallbackFactory - : ClassUtils.resolveClassName(fallbackFactory.toString(), null)); - } + definition.addPropertyValue("decode404", attributes.get("decode404")); + definition.addPropertyValue("fallback", attributes.get("fallback")); definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); @@ -258,19 +252,9 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, builder.getBeanDefinition()); } - private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object className, - Object configuration) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); - builder.addConstructorArgValue(name); - builder.addConstructorArgValue(className); - builder.addConstructorArgValue(configuration); - registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), - builder.getBeanDefinition()); - } - @Override public void setEnvironment(Environment environment) { this.environment = environment; - } + } } diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 9a01e208..43c846de 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -22,9 +22,6 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; - -import javax.servlet.http.HttpServletRequest; - import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; @@ -32,6 +29,7 @@ import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -89,14 +87,18 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver List orderItemList = new ArrayList<>(); Optional.ofNullable(ascs) - .ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(asc -> !SqlInjectionUtils.check(asc)).map(OrderItem::asc).collect(Collectors.toList()))); + .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) + .filter(asc -> !SqlInjectionUtils.check(asc)) + .map(OrderItem::asc) + .collect(Collectors.toList()))); Optional.ofNullable(descs) - .ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(desc -> !SqlInjectionUtils.check(desc)).map(OrderItem::desc).collect(Collectors.toList()))); - page.addOrder(orderItemList); + .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) + .filter(desc -> !SqlInjectionUtils.check(desc)) + .map(OrderItem::desc) + .collect(Collectors.toList()))); + page.addOrder(orderItemList); - return page; - } + return page; + } } diff --git a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java index 6baa298f..911e4e00 100644 --- a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java +++ b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/annotation/EnablePigDoc.java @@ -48,7 +48,6 @@ public @interface EnablePigDoc { /** * 是否是微服务架构 - * * @return bool */ boolean isMicro() default true; diff --git a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java index 1fa8fa0b..573f9f2a 100644 --- a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java +++ b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java @@ -20,6 +20,12 @@ public class OpenAPIMetadataConfiguration implements InitializingBean, Applicati @Override public void afterPropertiesSet() throws Exception { + String[] beanNamesForType = applicationContext.getBeanNamesForType(ServiceInstance.class); + + if (beanNamesForType.length == 0) { + return; + } + ServiceInstance serviceInstance = applicationContext.getBean(ServiceInstance.class); serviceInstance.getMetadata().put("spring-doc", path); } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java index d57d09c9..b7ef0a1d 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/GatewayConfiguration.java @@ -14,10 +14,8 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) public class GatewayConfiguration { - /** * 创建PigRequest全局过滤器 - * * @return PigRequest全局过滤器 */ @Bean @@ -25,10 +23,8 @@ public class GatewayConfiguration { return new PigRequestGlobalFilter(); } - /** * 创建全局异常处理程序 - * * @param objectMapper 对象映射器 * @return 全局异常处理程序 */ @@ -37,5 +33,4 @@ public class GatewayConfiguration { return new GlobalExceptionHandler(objectMapper); } - } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java index c17ec051..cc841995 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/PigAdminApplication.java @@ -19,7 +19,6 @@ package com.pig4cloud.pig.admin; -import com.pig4cloud.pig.common.feign.annotation.EnablePigFeignClients; import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; import com.pig4cloud.pig.common.swagger.annotation.EnablePigDoc; import org.springframework.boot.SpringApplication; @@ -33,7 +32,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; * 用户统一管理系统 */ @EnablePigDoc("admin") -@EnablePigFeignClients @EnablePigResourceServer @EnableDiscoveryClient @SpringBootApplication diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index 7ed53c5a..017a69f6 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -29,13 +29,13 @@ import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import javax.validation.Valid; import lombok.AllArgsConstructor; import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; /** @@ -101,7 +101,7 @@ public class SysLogController { @GetMapping("/export") @PreAuthorize("@pms.hasPermission('sys_log_export')") public List export(SysLogDTO sysLog) { - return sysLogService.getList(sysLog); - } + return sysLogService.getList(sysLog); + } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java index ce422696..bd3ef183 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java @@ -59,5 +59,6 @@ public interface SysLogService extends IService { * @param sysLog 查询条件 * @return List */ - List getList(SysLogDTO sysLog); + List getList(SysLogDTO sysLog); + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index 9944e8a1..ba21436f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -45,52 +45,53 @@ import java.util.List; @Service public class SysLogServiceImpl extends ServiceImpl implements SysLogService { - @Override - public Page getLogByPage(Page page, SysLogDTO sysLog) { - return baseMapper.selectPage(page, buildQuery(sysLog)); - } + @Override + public Page getLogByPage(Page page, SysLogDTO sysLog) { + return baseMapper.selectPage(page, buildQuery(sysLog)); + } - /** - * 插入日志 - * - * @param sysLog 日志对象 - * @return true/false - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveLog(SysLog sysLog) { - baseMapper.insert(sysLog); - return Boolean.TRUE; - } + /** + * 插入日志 + * + * @param sysLog 日志对象 + * @return true/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveLog(SysLog sysLog) { + baseMapper.insert(sysLog); + return Boolean.TRUE; + } - /** - * 查询日志列表 - * - * @param sysLog 查询条件 - * @return List - */ - @Override - public List getList(SysLogDTO sysLog) { - return baseMapper.selectList(buildQuery(sysLog)); - } + /** + * 查询日志列表 + * + * @param sysLog 查询条件 + * @return List + */ + @Override + public List getList(SysLogDTO sysLog) { + return baseMapper.selectList(buildQuery(sysLog)); + } - /** - * 构建查询条件 - * - * @param sysLog 前端条件 - * @return LambdaQueryWrapper - */ - private LambdaQueryWrapper buildQuery(SysLogDTO sysLog) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - if (StrUtil.isNotBlank(sysLog.getLogType())) { - wrapper.eq(SysLog::getLogType, sysLog.getLogType()); - } + /** + * 构建查询条件 + * + * @param sysLog 前端条件 + * @return LambdaQueryWrapper + */ + private LambdaQueryWrapper buildQuery(SysLogDTO sysLog) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + if (StrUtil.isNotBlank(sysLog.getLogType())) { + wrapper.eq(SysLog::getLogType, sysLog.getLogType()); + } - if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { - wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) - .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); - } + if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { + wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); + } + + return wrapper; + } - return wrapper; - } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index 50033564..20b8ecdb 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -449,12 +449,13 @@ public class SysUserServiceImpl extends ServiceImpl impl condition.setUsername(username); SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); - if (!ENCODER.matches(password, sysUser.getPassword())) { - log.info("原密码错误"); - return R.failed("密码输入错误"); - } else { - return R.ok(); - } - } + if (!ENCODER.matches(password, sysUser.getPassword())) { + log.info("原密码错误"); + return R.failed("密码输入错误"); + } + else { + return R.ok(); + } + } } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java index 9fb7b06e..d49de955 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java @@ -18,7 +18,6 @@ package com.pig4cloud.pig.codegen; import com.pig4cloud.pig.common.datasource.annotation.EnableDynamicDataSource; -import com.pig4cloud.pig.common.feign.annotation.EnablePigFeignClients; import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -29,7 +28,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; * @date 2018/07/29 代码生成模块 */ @EnableDynamicDataSource -@EnablePigFeignClients @EnableDiscoveryClient @EnablePigResourceServer @SpringBootApplication diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java index 9cdba2a2..5bcbb766 100644 --- a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/PigQuartzApplication.java @@ -1,6 +1,5 @@ package com.pig4cloud.pig.daemon.quartz; -import com.pig4cloud.pig.common.feign.annotation.EnablePigFeignClients; import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; import com.pig4cloud.pig.common.swagger.annotation.EnablePigDoc; import org.springframework.boot.SpringApplication; @@ -12,7 +11,6 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; * @date 2023-07-05 */ @EnablePigDoc(value = "job") -@EnablePigFeignClients @EnablePigResourceServer @EnableDiscoveryClient @SpringBootApplication diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java index a59debac..7692477a 100644 --- a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java @@ -64,7 +64,7 @@ public class JavaClassTaskInvok implements ITaskInvok { catch (ClassNotFoundException e) { log.error("定时任务java反射类没有找到,执行任务:{}", sysJob.getClassName()); throw new TaskException("定时任务java反射类没有找到,执行任务:" + sysJob.getClassName()); - } catch (IllegalAccessException | InstantiationException e) { + } catch (IllegalAccessException | InstantiationException e) { log.error("定时任务java反射类异常,执行任务:{}", sysJob.getClassName()); throw new TaskException("定时任务java反射类异常,执行任务:" + sysJob.getClassName()); } diff --git a/pom.xml b/pom.xml index 88b84898..457246a5 100644 --- a/pom.xml +++ b/pom.xml @@ -99,6 +99,7 @@ + pig-boot pig-register pig-gateway pig-auth -- Gitee From 2702a0c325c6fc0f8a171cc7a536fd81ef14072e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 14:50:12 +0800 Subject: [PATCH 196/238] =?UTF-8?q?:sparkles:=20Introducing=20new=20featur?= =?UTF-8?q?es.=20=E8=B0=83=E6=95=B4swagger=20=E6=8E=A5=E5=8F=A3=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-boot/pom.xml | 11 +++++++++++ pig-boot/src/main/resources/application-dev.yml | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/pig-boot/pom.xml b/pig-boot/pom.xml index 9ad96ed5..a0fe46d6 100755 --- a/pig-boot/pom.xml +++ b/pig-boot/pom.xml @@ -69,6 +69,17 @@ com.pig4cloud pig-common-swagger + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + com.github.xiaoymin + knife4j-openapi3-spring-boot-starter + ${knife4j.version} + org.springframework.boot diff --git a/pig-boot/src/main/resources/application-dev.yml b/pig-boot/src/main/resources/application-dev.yml index 43a7e8e3..3908f850 100644 --- a/pig-boot/src/main/resources/application-dev.yml +++ b/pig-boot/src/main/resources/application-dev.yml @@ -28,3 +28,7 @@ jasypt: password: pig algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator + +# swagger 配置 +swagger: + token-url: ${swagger.gateway}/admin/oauth2/token -- Gitee From 225a5d5b52f608469f2fbdf817d94c1262a699df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 7 Apr 2024 14:50:34 +0800 Subject: [PATCH 197/238] =?UTF-8?q?:card=5Ffile=5Fbox:=20=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E5=90=88=E5=B9=B6=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/Dockerfile | 4 - db/pig.sql | 295 +++++++++++++++++++++++++++++++++ db/pig_codegen.sql | 255 ---------------------------- db/pig_config.sql | 14 +- db/pig_job.sql | 58 ------- pig-auth/pom.xml | 29 ++-- pig-upms/pig-upms-biz/pom.xml | 28 ++-- pig-visual/pig-codegen/pom.xml | 29 ++-- pig-visual/pig-quartz/pom.xml | 29 ++-- pom.xml | 5 +- 10 files changed, 374 insertions(+), 372 deletions(-) delete mode 100644 db/pig_codegen.sql delete mode 100644 db/pig_job.sql diff --git a/db/Dockerfile b/db/Dockerfile index bf702036..951fed68 100644 --- a/db/Dockerfile +++ b/db/Dockerfile @@ -8,8 +8,4 @@ RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY ./pig.sql /docker-entrypoint-initdb.d -COPY ./pig_codegen.sql /docker-entrypoint-initdb.d - COPY ./pig_config.sql /docker-entrypoint-initdb.d - -COPY ./pig_job.sql /docker-entrypoint-initdb.d diff --git a/db/pig.sql b/db/pig.sql index 42d7058f..72c6123b 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -672,4 +672,299 @@ INSERT INTO `sys_user_role` VALUES (1, 1); INSERT INTO `sys_user_role` VALUES (1676492190299299842, 2); COMMIT; +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint NOT NULL COMMENT '任务id', + `job_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务组名', + `job_order` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', + `job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', + `execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空', + `class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', + `method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法', + `method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 DEFAULT '3' COMMENT '错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行)', + `job_tenant_type` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '1、多租户任务;2、非多租户任务', + `job_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(1、未发布;2、运行中;3、暂停;4、删除;)', + `job_execute_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(0正常 1异常)', + `create_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间', + `previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间', + `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间', + `remark` varchar(500) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表'; + +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint NOT NULL COMMENT '任务日志ID', + `job_id` bigint NOT NULL COMMENT '任务id', + `job_name` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务组名', + `job_order` char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', + `job_type` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', + `execute_path` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空', + `class_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', + `method_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务方法', + `method_params_value` varchar(2000) CHARACTER SET utf8 DEFAULT NULL COMMENT '参数值', + `cron_expression` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'cron执行表达式', + `job_message` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '日志信息', + `job_log_status` char(1) CHARACTER SET utf8 DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `execute_time` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '执行时间', + `exception_info` varchar(2000) CHARACTER SET utf8 DEFAULT '' COMMENT '异常信息', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务执行日志表'; + +-- ---------------------------- +-- Table structure for gen_datasource_conf +-- ---------------------------- +DROP TABLE IF EXISTS `gen_datasource_conf`; +CREATE TABLE `gen_datasource_conf` ( + `id` bigint NOT NULL COMMENT '主键', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '别名', + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'jdbcurl', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `ds_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', + `conf_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配置类型', + `ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称', + `instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实例', + `port` int DEFAULT NULL COMMENT '端口', + `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据源表'; + +-- ---------------------------- +-- Records of gen_datasource_conf +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_field_type +-- ---------------------------- +DROP TABLE IF EXISTS `gen_field_type`; +CREATE TABLE `gen_field_type` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `column_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', + `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`), + UNIQUE KEY `column_type` (`column_type`) +) ENGINE=InnoDB AUTO_INCREMENT=1634915190321451010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字段类型管理'; + +-- ---------------------------- +-- Records of gen_field_type +-- ---------------------------- +BEGIN; +INSERT INTO `gen_field_type` VALUES (1, 'datetime', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (2, 'date', 'LocalDate', 'java.time.LocalDate', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (3, 'tinyint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (4, 'smallint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (5, 'mediumint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (6, 'int', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (7, 'integer', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (8, 'bigint', 'Long', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (9, 'float', 'Float', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (10, 'double', 'Double', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (11, 'decimal', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (12, 'bit', 'Boolean', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (13, 'char', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (14, 'varchar', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (15, 'tinytext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (16, 'text', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (17, 'mediumtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (18, 'longtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (19, 'timestamp', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (20, 'NUMBER', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (21, 'BINARY_INTEGER', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (22, 'BINARY_FLOAT', 'Float', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (23, 'BINARY_DOUBLE', 'Double', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (24, 'VARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (25, 'NVARCHAR', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (26, 'NVARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (27, 'CLOB', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (28, 'int8', 'Long', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (29, 'int4', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (30, 'int2', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (31, 'numeric', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (32, 'json', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_group +-- ---------------------------- +DROP TABLE IF EXISTS `gen_group`; +CREATE TABLE `gen_group` ( + `id` bigint NOT NULL, + `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组名称', + `group_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组描述', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组'; + +-- ---------------------------- +-- Records of gen_group +-- ---------------------------- +BEGIN; +INSERT INTO `gen_group` VALUES (1, '增删改查', '单表增删改查', ' ', ' ', NULL, NULL, '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名', + `class_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类名', + `db_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', + `table_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '说明', + `author` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '作者', + `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目包名', + `version` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目版本号', + `i18n` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否生成带有i18n 0 不带有 1带有', + `style` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '代码风格', + `child_table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表名称', + `main_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表关联键', + `child_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联键', + `generator_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成方式 0:zip压缩包 1:自定义目录', + `backend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端生成路径', + `frontend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端生成路径', + `module_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模块名', + `function_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '功能名', + `form_layout` tinyint DEFAULT NULL COMMENT '表单布局 1:一列 2:两列', + `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源ID', + `baseclass_id` bigint DEFAULT NULL COMMENT '基类ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `table_name` (`table_name`,`ds_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表'; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源名称', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名称', + `field_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段名称', + `field_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', + `field_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段说明', + `attr_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性名', + `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', + `sort` int DEFAULT NULL COMMENT '排序', + `auto_fill` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动填充 DEFAULT、INSERT、UPDATE、INSERT_UPDATE', + `primary_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '主键 0:否 1:是', + `base_field` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '基类字段 0:否 1:是', + `form_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单项 0:否 1:是', + `form_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单必填 0:否 1:是', + `form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单类型', + `form_validator` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单效验', + `grid_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表项 0:否 1:是', + `grid_sort` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表排序 0:否 1:是', + `query_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '查询项 0:否 1:是', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询方式', + `query_form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询表单类型', + `field_dict` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表字段'; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_template +-- ---------------------------- +DROP TABLE IF EXISTS `gen_template`; +CREATE TABLE `gen_template` ( + `id` bigint NOT NULL COMMENT '主键', + `template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称', + `generator_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板路径', + `template_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板描述', + `template_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板代码', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板'; + +-- ---------------------------- +-- Records of gen_template +-- ---------------------------- +BEGIN; +INSERT INTO `gen_template` VALUES (1, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pig.common.core.util.R;\nimport com.pig4cloud.pig.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.api.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.attrType == \'String\')\n#set($expression=\"StrUtil.isNotBlank\")\n#else\n#set($expression=\"Objects.nonNull\")\n#end\n#if($field.queryType == \'=\')\n wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight($expression($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @param ids 导出指定ID\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className},${pk.attrType}[] ids) {\n return ${className}Service.list(Wrappers.lambdaQuery(${className}).in(ArrayUtil.isNotEmpty(ids), ${ClassName}Entity::$str.getProperty($pk.attrName), ids));\n }\n}', '2023-02-23 01:16:17', '2023-08-28 22:48:06', '0', '', 'admin'); +INSERT INTO `gen_template` VALUES (2, 'Service', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java', 'Service', 'package ${package}.${moduleName}.service;\n\n#if($ChildClassName)\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport com.baomidou.mybatisplus.extension.service.IService;\n#end\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n\n#if($ChildClassName)\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(Long[] ids);\n\n Boolean removeChild(Long[] ids);\n#else\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:16:53', '2023-06-04 10:35:25', '0', ' ', ' '); +INSERT INTO `gen_template` VALUES (3, 'ServiceImpl', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java', 'ServiceImpl', 'package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n#if($ChildClassName)\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\n#end\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n#if($ChildClassName)\n@RequiredArgsConstructor\n#end\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n#if($ChildClassName)\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#set($getChildPkName=$str.getProperty(${pk.attrName}))\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.getId());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(Long[] ids) {\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery().in(${ChildClassName}Entity::$str.getProperty($childField), ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(Long[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n#end\n}', '2023-02-23 01:17:36', '2023-08-27 23:29:58', '0', ' ', ' '); +INSERT INTO `gen_template` VALUES (4, '实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ClassName}Entity.java', 'Entity', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n#if($ChildClassName)\nimport com.alibaba.excel.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n private $field.attrType $field.attrName;\n#end\n#if($ChildClassName)\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n#end\n}', '2023-02-23 01:17:53', '2023-08-27 22:26:06', '0', ' ', ' '); +INSERT INTO `gen_template` VALUES (5, 'Mapper', '${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java', 'Mapper', 'package ${package}.${moduleName}.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n\n}', '2023-02-23 01:18:18', '2023-08-28 22:47:02', '0', ' ', 'admin'); +INSERT INTO `gen_template` VALUES (6, 'Mapper.xml', '${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml', 'Mapper.xml', '\n\n\n\n\n \n#foreach ($field in $fieldList)\n #if($field.primaryPk)\n \n #end\n #if(!$field.primaryPk)\n \n #end\n#end\n \n', '2023-02-23 01:18:35', '2023-06-04 10:34:56', '0', ' ', ' '); +INSERT INTO `gen_template` VALUES (7, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 \n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\');\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\');', '2023-02-23 01:19:08', '2023-08-28 22:06:16', '0', ' ', ' '); +INSERT INTO `gen_template` VALUES (8, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', ' ', ' '); +INSERT INTO `gen_template` VALUES (9, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-28 22:53:55', '0', '', 'admin'); +INSERT INTO `gen_template` VALUES (10, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-08-27 22:23:19', '0', '', 'admin'); +INSERT INTO `gen_template` VALUES (11, 'i18n英文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/en.ts', 'i18n英文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'import ${ClassName}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'${field.attrName}\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'input ${field.attrName}\',\n#end\n }\n}', '2023-02-23 01:20:25', '2023-06-04 10:49:25', '0', '', 'admin'); +INSERT INTO `gen_template` VALUES (12, 'i18n中文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/zh-cn.ts', 'i18n中文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'导入${tableComment}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n }\n}', '2023-02-23 01:20:40', '2023-06-04 10:49:28', '0', '', 'admin'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_template_group +-- ---------------------------- +DROP TABLE IF EXISTS `gen_template_group`; +CREATE TABLE `gen_template_group` ( + `group_id` bigint NOT NULL COMMENT '分组id', + `template_id` bigint NOT NULL COMMENT '模板id', + PRIMARY KEY (`group_id`,`template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组关联表'; + +-- ---------------------------- +-- Records of gen_template_group +-- ---------------------------- +BEGIN; +INSERT INTO `gen_template_group` VALUES (1, 1); +INSERT INTO `gen_template_group` VALUES (1, 2); +INSERT INTO `gen_template_group` VALUES (1, 3); +INSERT INTO `gen_template_group` VALUES (1, 4); +INSERT INTO `gen_template_group` VALUES (1, 5); +INSERT INTO `gen_template_group` VALUES (1, 6); +INSERT INTO `gen_template_group` VALUES (1, 7); +INSERT INTO `gen_template_group` VALUES (1, 8); +INSERT INTO `gen_template_group` VALUES (1, 9); +INSERT INTO `gen_template_group` VALUES (1, 10); +INSERT INTO `gen_template_group` VALUES (1, 11); +INSERT INTO `gen_template_group` VALUES (1, 12); +COMMIT; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql deleted file mode 100644 index 6c07b3a8..00000000 --- a/db/pig_codegen.sql +++ /dev/null @@ -1,255 +0,0 @@ -DROP DATABASE IF EXISTS `pig_codegen`; - -CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; -USE pig_codegen; - --- ---------------------------- --- Table structure for gen_datasource_conf --- ---------------------------- -DROP TABLE IF EXISTS `gen_datasource_conf`; -CREATE TABLE `gen_datasource_conf` ( - `id` bigint NOT NULL COMMENT '主键', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '别名', - `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'jdbcurl', - `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', - `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - `ds_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', - `conf_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配置类型', - `ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称', - `instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实例', - `port` int DEFAULT NULL COMMENT '端口', - `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据源表'; - --- ---------------------------- --- Records of gen_datasource_conf --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for gen_field_type --- ---------------------------- -DROP TABLE IF EXISTS `gen_field_type`; -CREATE TABLE `gen_field_type` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `column_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', - `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', - `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - PRIMARY KEY (`id`), - UNIQUE KEY `column_type` (`column_type`) -) ENGINE=InnoDB AUTO_INCREMENT=1634915190321451010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字段类型管理'; - --- ---------------------------- --- Records of gen_field_type --- ---------------------------- -BEGIN; -INSERT INTO `gen_field_type` VALUES (1, 'datetime', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (2, 'date', 'LocalDate', 'java.time.LocalDate', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (3, 'tinyint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (4, 'smallint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (5, 'mediumint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (6, 'int', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (7, 'integer', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (8, 'bigint', 'Long', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (9, 'float', 'Float', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (10, 'double', 'Double', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (11, 'decimal', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (12, 'bit', 'Boolean', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (13, 'char', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (14, 'varchar', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (15, 'tinytext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (16, 'text', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (17, 'mediumtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (18, 'longtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (19, 'timestamp', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (20, 'NUMBER', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (21, 'BINARY_INTEGER', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (22, 'BINARY_FLOAT', 'Float', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (23, 'BINARY_DOUBLE', 'Double', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (24, 'VARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (25, 'NVARCHAR', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (26, 'NVARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (27, 'CLOB', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (28, 'int8', 'Long', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (29, 'int4', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (30, 'int2', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (31, 'numeric', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -INSERT INTO `gen_field_type` VALUES (32, 'json', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); -COMMIT; - --- ---------------------------- --- Table structure for gen_group --- ---------------------------- -DROP TABLE IF EXISTS `gen_group`; -CREATE TABLE `gen_group` ( - `id` bigint NOT NULL, - `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组名称', - `group_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组描述', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', - `create_time` datetime DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改人', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组'; - --- ---------------------------- --- Records of gen_group --- ---------------------------- -BEGIN; -INSERT INTO `gen_group` VALUES (1, '增删改查', '单表增删改查', ' ', ' ', NULL, NULL, '0'); -COMMIT; - --- ---------------------------- --- Table structure for gen_table --- ---------------------------- -DROP TABLE IF EXISTS `gen_table`; -CREATE TABLE `gen_table` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名', - `class_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类名', - `db_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', - `table_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '说明', - `author` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '作者', - `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', - `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目包名', - `version` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目版本号', - `i18n` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否生成带有i18n 0 不带有 1带有', - `style` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '代码风格', - `child_table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表名称', - `main_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表关联键', - `child_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联键', - `generator_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成方式 0:zip压缩包 1:自定义目录', - `backend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端生成路径', - `frontend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端生成路径', - `module_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模块名', - `function_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '功能名', - `form_layout` tinyint DEFAULT NULL COMMENT '表单布局 1:一列 2:两列', - `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源ID', - `baseclass_id` bigint DEFAULT NULL COMMENT '基类ID', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `table_name` (`table_name`,`ds_name`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表'; - --- ---------------------------- --- Records of gen_table --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for gen_table_column --- ---------------------------- -DROP TABLE IF EXISTS `gen_table_column`; -CREATE TABLE `gen_table_column` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', - `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源名称', - `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名称', - `field_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段名称', - `field_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', - `field_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段说明', - `attr_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性名', - `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', - `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', - `sort` int DEFAULT NULL COMMENT '排序', - `auto_fill` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动填充 DEFAULT、INSERT、UPDATE、INSERT_UPDATE', - `primary_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '主键 0:否 1:是', - `base_field` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '基类字段 0:否 1:是', - `form_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单项 0:否 1:是', - `form_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单必填 0:否 1:是', - `form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单类型', - `form_validator` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单效验', - `grid_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表项 0:否 1:是', - `grid_sort` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表排序 0:否 1:是', - `query_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '查询项 0:否 1:是', - `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询方式', - `query_form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询表单类型', - `field_dict` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表字段'; - --- ---------------------------- --- Records of gen_table_column --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for gen_template --- ---------------------------- -DROP TABLE IF EXISTS `gen_template`; -CREATE TABLE `gen_template` ( - `id` bigint NOT NULL COMMENT '主键', - `template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称', - `generator_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板路径', - `template_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板描述', - `template_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板代码', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板'; - --- ---------------------------- --- Records of gen_template --- ---------------------------- -BEGIN; -INSERT INTO `gen_template` VALUES (1, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pig.common.core.util.R;\nimport com.pig4cloud.pig.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.api.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.attrType == \'String\')\n#set($expression=\"StrUtil.isNotBlank\")\n#else\n#set($expression=\"Objects.nonNull\")\n#end\n#if($field.queryType == \'=\')\n wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight($expression($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @param ids 导出指定ID\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className},${pk.attrType}[] ids) {\n return ${className}Service.list(Wrappers.lambdaQuery(${className}).in(ArrayUtil.isNotEmpty(ids), ${ClassName}Entity::$str.getProperty($pk.attrName), ids));\n }\n}', '2023-02-23 01:16:17', '2023-08-28 22:48:06', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (2, 'Service', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java', 'Service', 'package ${package}.${moduleName}.service;\n\n#if($ChildClassName)\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport com.baomidou.mybatisplus.extension.service.IService;\n#end\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n\n#if($ChildClassName)\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(Long[] ids);\n\n Boolean removeChild(Long[] ids);\n#else\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:16:53', '2023-06-04 10:35:25', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (3, 'ServiceImpl', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java', 'ServiceImpl', 'package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n#if($ChildClassName)\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\n#end\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n#if($ChildClassName)\n@RequiredArgsConstructor\n#end\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n#if($ChildClassName)\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#set($getChildPkName=$str.getProperty(${pk.attrName}))\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.getId());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(Long[] ids) {\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery().in(${ChildClassName}Entity::$str.getProperty($childField), ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(Long[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n#end\n}', '2023-02-23 01:17:36', '2023-08-27 23:29:58', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (4, '实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ClassName}Entity.java', 'Entity', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n#if($ChildClassName)\nimport com.alibaba.excel.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n private $field.attrType $field.attrName;\n#end\n#if($ChildClassName)\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n#end\n}', '2023-02-23 01:17:53', '2023-08-27 22:26:06', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (5, 'Mapper', '${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java', 'Mapper', 'package ${package}.${moduleName}.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n\n}', '2023-02-23 01:18:18', '2023-08-28 22:47:02', '0', ' ', 'admin'); -INSERT INTO `gen_template` VALUES (6, 'Mapper.xml', '${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml', 'Mapper.xml', '\n\n\n\n\n \n#foreach ($field in $fieldList)\n #if($field.primaryPk)\n \n #end\n #if(!$field.primaryPk)\n \n #end\n#end\n \n', '2023-02-23 01:18:35', '2023-06-04 10:34:56', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (7, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 \n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\');\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\');', '2023-02-23 01:19:08', '2023-08-28 22:06:16', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (8, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (9, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-28 22:53:55', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (10, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-08-27 22:23:19', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (11, 'i18n英文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/en.ts', 'i18n英文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'import ${ClassName}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'${field.attrName}\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'input ${field.attrName}\',\n#end\n }\n}', '2023-02-23 01:20:25', '2023-06-04 10:49:25', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (12, 'i18n中文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/zh-cn.ts', 'i18n中文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'导入${tableComment}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n }\n}', '2023-02-23 01:20:40', '2023-06-04 10:49:28', '0', '', 'admin'); -COMMIT; - --- ---------------------------- --- Table structure for gen_template_group --- ---------------------------- -DROP TABLE IF EXISTS `gen_template_group`; -CREATE TABLE `gen_template_group` ( - `group_id` bigint NOT NULL COMMENT '分组id', - `template_id` bigint NOT NULL COMMENT '模板id', - PRIMARY KEY (`group_id`,`template_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组关联表'; - --- ---------------------------- --- Records of gen_template_group --- ---------------------------- -BEGIN; -INSERT INTO `gen_template_group` VALUES (1, 1); -INSERT INTO `gen_template_group` VALUES (1, 2); -INSERT INTO `gen_template_group` VALUES (1, 3); -INSERT INTO `gen_template_group` VALUES (1, 4); -INSERT INTO `gen_template_group` VALUES (1, 5); -INSERT INTO `gen_template_group` VALUES (1, 6); -INSERT INTO `gen_template_group` VALUES (1, 7); -INSERT INTO `gen_template_group` VALUES (1, 8); -INSERT INTO `gen_template_group` VALUES (1, 9); -INSERT INTO `gen_template_group` VALUES (1, 10); -INSERT INTO `gen_template_group` VALUES (1, 11); -INSERT INTO `gen_template_group` VALUES (1, 12); -COMMIT; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/pig_config.sql b/db/pig_config.sql index 71d9940e..bb59cc5f 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -37,13 +37,13 @@ CREATE TABLE `config_info` ( -- Records of config_info -- ---------------------------- BEGIN; -INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pig\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n type-handlers-package: com.pig4cloud.pig.common.mybatis.handler\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n shrink-whitespaces-in-sql: true\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server', '61f0d191090a905dc8b177e86821a1f5', '2022-05-08 12:10:37', '2023-09-06 14:55:57', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '74f53b71c7799aa754da75662378b93c', '2022-05-08 12:10:37', '2022-06-04 14:15:35', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'cf786dbe3b07074fc187bf2eab3266b1', '2022-05-08 12:10:37', '2023-01-28 14:05:36', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 代码生成模块\n - id: pig-quartz\n uri: lb://pig-quartz\n predicates:\n - Path=/job/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', '11cb9c81a30d39657fa1f6a7c1f6768f', '2022-05-08 12:10:37', '2023-09-06 14:57:03', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\nfile:\n bucketName: s3demo \n local:\n enable: true\n base-path: /Users/lengleng/Downloads/img', '48f8db128aeb5debb331bae49ff37908', '2022-05-08 12:10:37', '2023-07-07 14:44:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_job?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构 (第一次启动自动创建表,后续改成never 即可)\n jdbc:\n initialize-schema: always\n\n', '7a2859cbd056ef554b6163f5c70dfcf5', '2023-07-02 12:24:33', '2023-08-17 20:44:54', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pig\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n type-handlers-package: com.pig4cloud.pig.common.mybatis.handler\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n shrink-whitespaces-in-sql: true\n', 'f83479ef911a69ef597de3de2cdf573a', '2022-05-08 12:10:37', '2024-04-07 12:19:24', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n\n\nsecurity:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', '7e1b6667226adbd1505ddae118b473bf', '2022-05-08 12:10:37', '2024-04-07 12:20:21', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', '98a9b427c9109be68b9192a0aae60ff2', '2022-05-08 12:10:37', '2024-04-07 14:39:08', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 代码生成模块\n - id: pig-quartz\n uri: lb://pig-quartz\n predicates:\n - Path=/job/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs', '6ef9265e4a4298c5f4fdb9fbbf846818', '2022-05-08 12:10:37', '2024-04-07 12:22:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\nfile:\n bucketName: s3demo \n local:\n enable: true\n base-path: /Users/lengleng/Downloads/img', '48f8db128aeb5debb331bae49ff37908', '2022-05-08 12:10:37', '2023-07-07 14:44:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构 (第一次启动自动创建表,后续改成never 即可)\n jdbc:\n initialize-schema: always\n\n', '976b20c3858fc7f218d4ac8aab847396', '2023-07-02 12:24:33', '2024-04-07 14:38:58', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); COMMIT; -- ---------------------------- diff --git a/db/pig_job.sql b/db/pig_job.sql deleted file mode 100644 index f78adefa..00000000 --- a/db/pig_job.sql +++ /dev/null @@ -1,58 +0,0 @@ -DROP DATABASE IF EXISTS `pig_job`; - -CREATE DATABASE `pig_job` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; - -USE pig_job; - --- ---------------------------- --- Table structure for sys_job --- ---------------------------- -DROP TABLE IF EXISTS `sys_job`; -CREATE TABLE `sys_job` ( - `job_id` bigint NOT NULL COMMENT '任务id', - `job_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务名称', - `job_group` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务组名', - `job_order` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', - `job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', - `execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空', - `class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', - `method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法', - `method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值', - `cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式', - `misfire_policy` varchar(20) CHARACTER SET utf8mb4 DEFAULT '3' COMMENT '错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行)', - `job_tenant_type` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '1、多租户任务;2、非多租户任务', - `job_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(1、未发布;2、运行中;3、暂停;4、删除;)', - `job_execute_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(0正常 1异常)', - `create_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', - `start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间', - `previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间', - `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间', - `remark` varchar(500) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息', - PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表'; - --- ---------------------------- -DROP TABLE IF EXISTS `sys_job_log`; -CREATE TABLE `sys_job_log` ( - `job_log_id` bigint NOT NULL COMMENT '任务日志ID', - `job_id` bigint NOT NULL COMMENT '任务id', - `job_name` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务名称', - `job_group` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务组名', - `job_order` char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', - `job_type` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', - `execute_path` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空', - `class_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', - `method_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务方法', - `method_params_value` varchar(2000) CHARACTER SET utf8 DEFAULT NULL COMMENT '参数值', - `cron_expression` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'cron执行表达式', - `job_message` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '日志信息', - `job_log_status` char(1) CHARACTER SET utf8 DEFAULT '0' COMMENT '执行状态(0正常 1失败)', - `execute_time` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '执行时间', - `exception_info` varchar(2000) CHARACTER SET utf8 DEFAULT '' COMMENT '异常信息', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`job_log_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务执行日志表'; -commit; diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 3f6c1ebd..350af39f 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -86,17 +86,22 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - + + + cloud + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index 889d22a3..efd2b08e 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -96,17 +96,25 @@ + + + cloud + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + + - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - src/main/resources diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index c2f11c7e..42ae061a 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -112,16 +112,21 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - + + + cloud + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + diff --git a/pig-visual/pig-quartz/pom.xml b/pig-visual/pig-quartz/pom.xml index eb145622..85b40448 100644 --- a/pig-visual/pig-quartz/pom.xml +++ b/pig-visual/pig-quartz/pom.xml @@ -76,16 +76,21 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - + + + cloud + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + diff --git a/pom.xml b/pom.xml index 457246a5..99c162ef 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,8 @@ 1.10 3.0.5 3.0.0 - 3.0.3 + 4.3.0 + 1.6.9 2.4.0 0.32.0 http://192.168.0.100:2375 @@ -268,7 +269,7 @@ - dev + cloud dev -- Gitee From 48b7068fada80cf6eedc16c447bb9b29b61980a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 12:27:54 +0800 Subject: [PATCH 198/238] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20knife4j=203.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-boot/pom.xml | 5 ++--- pig-common/pig-common-bom/pom.xml | 11 ++++------- pig-gateway/pom.xml | 1 + pom.xml | 3 +-- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/pig-boot/pom.xml b/pig-boot/pom.xml index a0fe46d6..a7fe2a86 100755 --- a/pig-boot/pom.xml +++ b/pig-boot/pom.xml @@ -73,11 +73,10 @@ org.springdoc springdoc-openapi-ui - ${springdoc.version} - com.github.xiaoymin - knife4j-openapi3-spring-boot-starter + io.springboot + knife4j-boot-openapi3-ui ${knife4j.version} diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index b392d9dd..d8385a78 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -21,7 +21,6 @@ 1.8 1.8 1.2.83 - 3.0.3 1.6.9 2.2.0 3.5.5 @@ -34,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.26 + 5.8.27 2.7.4 1.8.4 4.9.9 @@ -110,12 +109,10 @@ mysql-connector-j ${mysql.version} - - - io.springboot - knife4j-openapi3-ui - ${knife4j.version} + org.springdoc + springdoc-openapi-ui + ${springdoc.version} org.springdoc diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 14ea1f90..ab966828 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -96,6 +96,7 @@ io.springboot knife4j-openapi3-ui + ${knife4j.version} diff --git a/pom.xml b/pom.xml index 99c162ef..d3160567 100644 --- a/pom.xml +++ b/pom.xml @@ -44,8 +44,7 @@ 3.1 1.10 3.0.5 - 3.0.0 - 4.3.0 + 3.0.5 1.6.9 2.4.0 0.32.0 -- Gitee From 7c886d6b3a559f657e8b56120cb73dd638ec18b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 12:31:34 +0800 Subject: [PATCH 199/238] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20mybatis-plus=203.5?= =?UTF-8?q?.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-common/pig-common-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index d8385a78..8048d804 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -23,7 +23,7 @@ 1.2.83 1.6.9 2.2.0 - 3.5.5 + 3.5.6 4.3.0 8.0.33 1.6.1 -- Gitee From 78f056a179cf6dc70dfee2defb6546d75e0f3834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 12:48:33 +0800 Subject: [PATCH 200/238] :art: Improving structure / format of the code. --- .../auth/config/WebSecurityConfiguration.java | 2 - .../pig/common/core/util/RedisUtils.java | 124 ++---- .../feign/PigFeignAutoConfiguration.java | 1 - .../openfeign/PigFeignClientsRegistrar.java | 414 +++++++++--------- .../resolver/SqlFilterArgumentResolver.java | 2 +- .../admin/controller/SysLogController.java | 2 +- .../pig/admin/service/SysLogService.java | 5 +- .../admin/service/impl/SysLogServiceImpl.java | 5 +- .../service/impl/SysUserServiceImpl.java | 6 +- 9 files changed, 260 insertions(+), 301 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java index 76dc965f..651590aa 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java @@ -35,7 +35,6 @@ public class WebSecurityConfiguration { /** * spring security 默认的安全策略 - * * @param http security注入点 * @return SecurityFilterChain * @throws Exception @@ -60,7 +59,6 @@ public class WebSecurityConfiguration { * 暴露静态资源 *

        * https://github.com/spring-projects/spring-security/issues/10938 - * * @param http * @return * @throws Exception diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java index 82184d4e..87143f37 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -24,34 +24,31 @@ public class RedisUtils { /** * 指定缓存失效时间 - * - * @param key 键 + * @param key 键 * @param time 时间(秒) */ public boolean expire(String key, long time) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); Optional.ofNullable(redisTemplate) - .filter(template -> time > 0) - .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); + .filter(template -> time > 0) + .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); return true; } /** * 根据 key 获取过期时间 - * * @param key 键 不能为null * @return 时间(秒) 返回0代表为永久有效 */ public long getExpire(Object key) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); return Optional.ofNullable(redisTemplate) - .map(template -> template.getExpire(key, TimeUnit.SECONDS)) - .orElse(-1L); + .map(template -> template.getExpire(key, TimeUnit.SECONDS)) + .orElse(-1L); } /** * 查找匹配key - * * @param pattern key * @return / */ @@ -73,10 +70,9 @@ public class RedisUtils { /** * 分页查询 key - * * @param patternKey key - * @param page 页码 - * @param size 每页数目 + * @param page 页码 + * @param size 每页数目 * @return / */ public List findKeysForPage(String patternKey, int page, int size) { @@ -108,7 +104,6 @@ public class RedisUtils { /** * 判断key是否存在 - * * @param key 键 * @return true 存在 false不存在 */ @@ -119,7 +114,6 @@ public class RedisUtils { /** * 删除缓存 - * * @param keys 可以传一个值 或多个 */ public void del(String... keys) { @@ -131,24 +125,22 @@ public class RedisUtils { /** * 获取锁 - * - * @param lockKey 锁key - * @param value value + * @param lockKey 锁key + * @param value value * @param expireTime:单位-秒 * @return boolean */ public boolean getLock(String lockKey, String value, int expireTime) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); return Optional.ofNullable(redisTemplate) - .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) - .orElse(false); + .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) + .orElse(false); } /** * 释放锁 - * * @param lockKey 锁key - * @param value value + * @param value value * @return boolean */ public boolean releaseLock(String lockKey, String value) { @@ -156,9 +148,9 @@ public class RedisUtils { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) - .map(Convert::toLong) - .filter(SUCCESS::equals) - .isPresent(); + .map(Convert::toLong) + .filter(SUCCESS::equals) + .isPresent(); } // ============================String============================= @@ -175,7 +167,6 @@ public class RedisUtils { /** * 批量获取 - * * @param keys * @return */ @@ -186,8 +177,7 @@ public class RedisUtils { /** * 普通缓存放入 - * - * @param key 键 + * @param key 键 * @param value 值 * @return true成功 false失败 */ @@ -202,10 +192,9 @@ public class RedisUtils { /** * 普通缓存放入并设置时间 - * - * @param key 键 + * @param key 键 * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean set(String key, Object value, long time) { @@ -213,7 +202,7 @@ public class RedisUtils { return Optional.ofNullable(redisTemplate).map(template -> { if (time > 0) { template.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { + } else { template.opsForValue().set(key, value); } return true; @@ -222,10 +211,9 @@ public class RedisUtils { /** * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间 + * @param key 键 + * @param value 值 + * @param time 时间 * @param timeUnit 类型 * @return true成功 false 失败 */ @@ -234,7 +222,7 @@ public class RedisUtils { Optional.ofNullable(redisTemplate).map(template -> { if (time > 0) { template.opsForValue().set(key, value, time, timeUnit); - } else { + } else { template.opsForValue().set(key, value); } return true; @@ -246,8 +234,7 @@ public class RedisUtils { /** * HashGet - * - * @param key 键 不能为null + * @param key 键 不能为null * @param hashKey 项 不能为null * @return 值 */ @@ -258,7 +245,6 @@ public class RedisUtils { /** * 获取hashKey对应的所有键值 - * * @param key 键 * @return 对应的多个键值 */ @@ -284,9 +270,8 @@ public class RedisUtils { /** * HashSet 并设置时间 - * - * @param key 键 - * @param map 对应多个键值 + * @param key 键 + * @param map 对应多个键值 * @param time 时间(秒) * @return true成功 false失败 */ @@ -319,11 +304,10 @@ public class RedisUtils { /** * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 + * @param key 键 + * @param item 项 * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 * @return true 成功 false失败 */ public boolean hset(String key, String item, Object value, long time) { @@ -339,8 +323,7 @@ public class RedisUtils { /** * 删除hash表中的值 - * - * @param key 键 不能为null + * @param key 键 不能为null * @param item 项 可以使多个 不能为null */ public void hdel(String key, Object... item) { @@ -350,8 +333,7 @@ public class RedisUtils { /** * 判断hash表中是否有该项的值 - * - * @param key 键 不能为null + * @param key 键 不能为null * @param item 项 不能为null * @return true 存在 false不存在 */ @@ -362,10 +344,9 @@ public class RedisUtils { /** * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * - * @param key 键 + * @param key 键 * @param item 项 - * @param by 要增加几(大于0) + * @param by 要增加几(大于0) * @return */ public double hincr(String key, String item, double by) { @@ -375,10 +356,9 @@ public class RedisUtils { /** * hash递减 - * - * @param key 键 + * @param key 键 * @param item 项 - * @param by 要减少记(小于0) + * @param by 要减少记(小于0) * @return */ public double hdecr(String key, String item, double by) { @@ -411,8 +391,7 @@ public class RedisUtils { /** * 将数据放入set缓存 - * - * @param key 键 + * @param key 键 * @param values 值 可以是多个 * @return 成功个数 */ @@ -439,7 +418,6 @@ public class RedisUtils { /** * 获取set缓存的长度 - * * @param key 键 * @return */ @@ -462,7 +440,6 @@ public class RedisUtils { /** * 获集合key1和集合key2的差集元素 - * * @param key 键 * @return */ @@ -475,10 +452,9 @@ public class RedisUtils { /** * 获取list缓存的内容 - * - * @param key 键 + * @param key 键 * @param start 开始 - * @param end 结束 0 到 -1代表所有值 + * @param end 结束 0 到 -1代表所有值 * @return */ public List lGet(String key, long start, long end) { @@ -488,7 +464,6 @@ public class RedisUtils { /** * 获取list缓存的长度 - * * @param key 键 * @return */ @@ -499,8 +474,7 @@ public class RedisUtils { /** * 通过索引 获取list中的值 - * - * @param key 键 + * @param key 键 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */ @@ -511,8 +485,7 @@ public class RedisUtils { /** * 将list放入缓存 - * - * @param key 键 + * @param key 键 * @param value 值 * @return */ @@ -540,8 +513,7 @@ public class RedisUtils { /** * 将list放入缓存 - * - * @param key 键 + * @param key 键 * @param value 值 * @return */ @@ -553,10 +525,9 @@ public class RedisUtils { /** * 将list放入缓存 - * - * @param key 键 + * @param key 键 * @param value 值 - * @param time 时间(秒) + * @param time 时间(秒) * @return */ public boolean lSet(String key, List value, long time) { @@ -570,8 +541,7 @@ public class RedisUtils { /** * 根据索引修改list中的某条数据 - * - * @param key 键 + * @param key 键 * @param index 索引 * @param value 值 * @return / @@ -584,8 +554,7 @@ public class RedisUtils { /** * 移除N个值为value - * - * @param key 键 + * @param key 键 * @param count 移除多少个 * @param value 值 * @return 移除的个数 @@ -597,7 +566,6 @@ public class RedisUtils { /** * 将zSet数据放入缓存 - * * @param key * @param time * @param tuples @@ -615,7 +583,6 @@ public class RedisUtils { /** * Sorted set:有序集合获取 - * * @param key * @param min * @param max @@ -630,7 +597,6 @@ public class RedisUtils { /** * Sorted set:有序集合获取 正序 - * * @param key * @param start * @param end diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index 997409ec..4af9c4e2 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -68,7 +68,6 @@ public class PigFeignAutoConfiguration { /** * set connection close header - * * @return RequestInterceptor */ @Bean diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 9ce54857..5df6f772 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -48,213 +48,213 @@ import java.util.Map; */ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, BeanClassLoaderAware, EnvironmentAware { - private final static String BASE_URL = "http://127.0.0.1:${server.port}${server.servlet.context-path}"; - - @Getter - private ClassLoader beanClassLoader; - - @Getter - private Environment environment; - - @Override - public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { - registerFeignClients(registry); - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.beanClassLoader = classLoader; - } - - private void registerFeignClients(BeanDefinitionRegistry registry) { - - List feignClients = new ArrayList<>( - SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())); - - // 支持 springboot 2.7 + 最新版本的配置方式 - ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); - // 如果 spring.factories 里为空 - if (feignClients.isEmpty()) { - return; - } - for (String className : feignClients) { - try { - Class clazz = beanClassLoader.loadClass(className); - AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(clazz, - FeignClient.class); - if (attributes == null) { - continue; - } - - // 如果是单体项目自动注入 & url 为空 - Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); - // 如果已经存在该 bean,支持原生的 Feign - if (registry.containsBeanDefinition(className) && isMicro) { - continue; - } - - registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); - - validate(attributes); - BeanDefinitionBuilder definition = BeanDefinitionBuilder - .genericBeanDefinition(FeignClientFactoryBean.class); - definition.addPropertyValue("url", getUrl(registry, attributes)); - definition.addPropertyValue("path", getPath(attributes)); - String name = getName(attributes); - definition.addPropertyValue("name", name); - - // 兼容最新版本的 spring-cloud-openfeign,尚未发布 - StringBuilder aliasBuilder = new StringBuilder(18); - if (attributes.containsKey("contextId")) { - String contextId = getContextId(attributes); - aliasBuilder.append(contextId); - definition.addPropertyValue("contextId", contextId); - } else { - aliasBuilder.append(name); - } - - definition.addPropertyValue("type", className); - definition.addPropertyValue("decode404", attributes.get("decode404")); - definition.addPropertyValue("fallback", attributes.get("fallback")); - definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); - definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); - - AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); - - // alias - String alias = aliasBuilder.append("FeignClient").toString(); - - // has a default, won't be null - boolean primary = (Boolean) attributes.get("primary"); - - beanDefinition.setPrimary(primary); - - String qualifier = getQualifier(attributes); - if (StringUtils.hasText(qualifier)) { - alias = qualifier; - } - - BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, - new String[]{alias}); - BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); - - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - } - - /** - * Return the class used by {@link SpringFactoriesLoader} to load configuration - * candidates. - * - * @return the factory class - */ - private Class getSpringFactoriesLoaderFactoryClass() { - return PigFeignAutoConfiguration.class; - } - - private void validate(Map attributes) { - AnnotationAttributes annotation = AnnotationAttributes.fromMap(attributes); - // This blows up if an aliased property is overspecified - FeignClientsRegistrar.validateFallback(annotation.getClass("fallback")); - FeignClientsRegistrar.validateFallbackFactory(annotation.getClass("fallbackFactory")); - } - - private String getName(Map attributes) { - String name = (String) attributes.get("serviceId"); - if (!StringUtils.hasText(name)) { - name = (String) attributes.get("name"); - } - if (!StringUtils.hasText(name)) { - name = (String) attributes.get("value"); - } - name = resolve(name); - return FeignClientsRegistrar.getName(name); - } - - private String getContextId(Map attributes) { - String contextId = (String) attributes.get("contextId"); - if (!StringUtils.hasText(contextId)) { - return getName(attributes); - } - - contextId = resolve(contextId); - return FeignClientsRegistrar.getName(contextId); - } - - private String resolve(String value) { - if (StringUtils.hasText(value)) { - return this.environment.resolvePlaceholders(value); - } - return value; - } - - private String getUrl(BeanDefinitionRegistry registry, Map attributes) { - - // 如果是单体项目自动注入 & url 为空 - Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); - - if (isMicro) { - return null; - } - - String url = resolve(BASE_URL); - - return FeignClientsRegistrar.getUrl(url); - } - - private String getPath(Map attributes) { - String path = resolve((String) attributes.get("path")); - return FeignClientsRegistrar.getPath(path); - } - - @Nullable - private String getQualifier(@Nullable Map client) { - if (client == null) { - return null; - } - String qualifier = (String) client.get("qualifier"); - if (StringUtils.hasText(qualifier)) { - return qualifier; - } - return null; - } - - @Nullable - private String getClientName(@Nullable Map client) { - if (client == null) { - return null; - } - String value = (String) client.get("contextId"); - if (!StringUtils.hasText(value)) { - value = (String) client.get("value"); - } - if (!StringUtils.hasText(value)) { - value = (String) client.get("name"); - } - if (!StringUtils.hasText(value)) { - value = (String) client.get("serviceId"); - } - if (StringUtils.hasText(value)) { - return value; - } - - throw new IllegalStateException( - "Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName()); - } - - private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); - builder.addConstructorArgValue(name); - builder.addConstructorArgValue(configuration); - registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), - builder.getBeanDefinition()); - } - - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; + private final static String BASE_URL = "http://127.0.0.1:${server.port}${server.servlet.context-path}"; + + @Getter + private ClassLoader beanClassLoader; + + @Getter + private Environment environment; + + @Override + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + registerFeignClients(registry); + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = classLoader; + } + + private void registerFeignClients(BeanDefinitionRegistry registry) { + + List feignClients = new ArrayList<>( + SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())); + + // 支持 springboot 2.7 + 最新版本的配置方式 + ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); + // 如果 spring.factories 里为空 + if (feignClients.isEmpty()) { + return; + } + for (String className : feignClients) { + try { + Class clazz = beanClassLoader.loadClass(className); + AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(clazz, + FeignClient.class); + if (attributes == null) { + continue; + } + + // 如果是单体项目自动注入 & url 为空 + Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); + // 如果已经存在该 bean,支持原生的 Feign + if (registry.containsBeanDefinition(className) && isMicro) { + continue; + } + + registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); + + validate(attributes); + BeanDefinitionBuilder definition = BeanDefinitionBuilder + .genericBeanDefinition(FeignClientFactoryBean.class); + definition.addPropertyValue("url", getUrl(registry, attributes)); + definition.addPropertyValue("path", getPath(attributes)); + String name = getName(attributes); + definition.addPropertyValue("name", name); + + // 兼容最新版本的 spring-cloud-openfeign,尚未发布 + StringBuilder aliasBuilder = new StringBuilder(18); + if (attributes.containsKey("contextId")) { + String contextId = getContextId(attributes); + aliasBuilder.append(contextId); + definition.addPropertyValue("contextId", contextId); + } else { + aliasBuilder.append(name); + } + + definition.addPropertyValue("type", className); + definition.addPropertyValue("decode404", attributes.get("decode404")); + definition.addPropertyValue("fallback", attributes.get("fallback")); + definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); + definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + + AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); + + // alias + String alias = aliasBuilder.append("FeignClient").toString(); + + // has a default, won't be null + boolean primary = (Boolean) attributes.get("primary"); + + beanDefinition.setPrimary(primary); + + String qualifier = getQualifier(attributes); + if (StringUtils.hasText(qualifier)) { + alias = qualifier; + } + + BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, + new String[]{alias}); + BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + + /** + * Return the class used by {@link SpringFactoriesLoader} to load configuration + * candidates. + * + * @return the factory class + */ + private Class getSpringFactoriesLoaderFactoryClass() { + return PigFeignAutoConfiguration.class; + } + + private void validate(Map attributes) { + AnnotationAttributes annotation = AnnotationAttributes.fromMap(attributes); + // This blows up if an aliased property is overspecified + FeignClientsRegistrar.validateFallback(annotation.getClass("fallback")); + FeignClientsRegistrar.validateFallbackFactory(annotation.getClass("fallbackFactory")); + } + + private String getName(Map attributes) { + String name = (String) attributes.get("serviceId"); + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("name"); + } + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("value"); + } + name = resolve(name); + return FeignClientsRegistrar.getName(name); + } + + private String getContextId(Map attributes) { + String contextId = (String) attributes.get("contextId"); + if (!StringUtils.hasText(contextId)) { + return getName(attributes); + } + + contextId = resolve(contextId); + return FeignClientsRegistrar.getName(contextId); + } + + private String resolve(String value) { + if (StringUtils.hasText(value)) { + return this.environment.resolvePlaceholders(value); + } + return value; + } + + private String getUrl(BeanDefinitionRegistry registry, Map attributes) { + + // 如果是单体项目自动注入 & url 为空 + Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); + + if (isMicro) { + return null; + } + + String url = resolve(BASE_URL); + + return FeignClientsRegistrar.getUrl(url); + } + + private String getPath(Map attributes) { + String path = resolve((String) attributes.get("path")); + return FeignClientsRegistrar.getPath(path); + } + + @Nullable + private String getQualifier(@Nullable Map client) { + if (client == null) { + return null; + } + String qualifier = (String) client.get("qualifier"); + if (StringUtils.hasText(qualifier)) { + return qualifier; + } + return null; + } + + @Nullable + private String getClientName(@Nullable Map client) { + if (client == null) { + return null; + } + String value = (String) client.get("contextId"); + if (!StringUtils.hasText(value)) { + value = (String) client.get("value"); + } + if (!StringUtils.hasText(value)) { + value = (String) client.get("name"); + } + if (!StringUtils.hasText(value)) { + value = (String) client.get("serviceId"); + } + if (StringUtils.hasText(value)) { + return value; + } + + throw new IllegalStateException( + "Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName()); + } + + private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); + builder.addConstructorArgValue(name); + builder.addConstructorArgValue(configuration); + registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), + builder.getBeanDefinition()); + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; } } diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 43c846de..b2fca5f9 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -95,7 +95,7 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) .filter(desc -> !SqlInjectionUtils.check(desc)) .map(OrderItem::desc) - .collect(Collectors.toList()))); + .collect(Collectors.toList()))); page.addOrder(orderItemList); return page; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index 017a69f6..a30dc100 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -100,7 +100,7 @@ public class SysLogController { @ResponseExcel @GetMapping("/export") @PreAuthorize("@pms.hasPermission('sys_log_export')") - public List export(SysLogDTO sysLog) { + public List export(SysLogDTO sysLog) { return sysLogService.getList(sysLog); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java index bd3ef183..d5744321 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java @@ -55,10 +55,9 @@ public interface SysLogService extends IService { /** * 查询日志列表 - * * @param sysLog 查询条件 - * @return List - */ + * @return List + */ List getList(SysLogDTO sysLog); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index ba21436f..db3c3436 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -52,7 +52,6 @@ public class SysLogServiceImpl extends ServiceImpl impleme /** * 插入日志 - * * @param sysLog 日志对象 * @return true/false */ @@ -65,7 +64,6 @@ public class SysLogServiceImpl extends ServiceImpl impleme /** * 查询日志列表 - * * @param sysLog 查询条件 * @return List */ @@ -76,7 +74,6 @@ public class SysLogServiceImpl extends ServiceImpl impleme /** * 构建查询条件 - * * @param sysLog 前端条件 * @return LambdaQueryWrapper */ @@ -88,7 +85,7 @@ public class SysLogServiceImpl extends ServiceImpl impleme if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) - .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); } return wrapper; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index 20b8ecdb..efcdb30a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -445,9 +445,9 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override public R checkPassword(String password) { String username = SecurityUtils.getUser().getUsername(); - SysUser condition = new SysUser(); - condition.setUsername(username); - SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); + SysUser condition = new SysUser(); + condition.setUsername(username); + SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); if (!ENCODER.matches(password, sysUser.getPassword())) { log.info("原密码错误"); -- Gitee From 0e1db4c146d88d0a2c64f505206885896c365b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 13:07:03 +0800 Subject: [PATCH 201/238] =?UTF-8?q?:wrench:=20pom.xml=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-boot/pom.xml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/pig-boot/pom.xml b/pig-boot/pom.xml index a7fe2a86..6ffd8e33 100755 --- a/pig-boot/pom.xml +++ b/pig-boot/pom.xml @@ -30,33 +30,28 @@ pig 单体版本启动 - + com.pig4cloud pig-auth ${revision} - - - org.springframework.boot - spring-boot-maven-plugin - - + com.pig4cloud - pig-codegen + pig-upms-biz ${revision} - + com.pig4cloud - pig-quartz + pig-codegen ${revision} - + com.pig4cloud - pig-upms-biz + pig-quartz ${revision} -- Gitee From 2b3ab7745e4626a4e6fa7f809bc2ea887897ceba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 13:30:29 +0800 Subject: [PATCH 202/238] :bookmark: Releasing / Version tags. 3.8.0 --- README.md | 5 +++-- pig-common/pig-common-bom/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 046777f9..9c606de3 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ | Spring Cloud | 2021.0.8 | | Spring Cloud Alibaba | 2021.0.6.0 | | Spring Authorization Server | 0.4.4 | -| Mybatis Plus | 3.5.5 | -| hutool | 5.8.22 | +| Mybatis Plus | 3.5.6 | +| hutool | 5.8.27 | ### 模块说明 @@ -54,6 +54,7 @@ pig-ui -- https://gitee.com/log4j/pig-ui pig ├── pig-auth -- 授权服务提供[3000] +├── pig-boot -- 单体模式启动[9999] └── pig-common -- 系统公共模块 ├── pig-common-bom -- 全局依赖管理控制 ├── pig-common-core -- 公共工具类核心包 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 8048d804..472dd22d 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -14,7 +14,7 @@ pig cloud parent - 3.7.4-JDK8 + 3.8.0-JDK8 2.7.18 UTF-8 2.17.1 diff --git a/pom.xml b/pom.xml index d3160567..d3bed98b 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ - 3.7.4-JDK8 + 3.8.0-JDK8 2.7.18 2021.0.8 2021.0.6.0 -- Gitee From 6d9177fc2a94ae597dfe0a850607637bf73d04db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 13:55:25 +0800 Subject: [PATCH 203/238] =?UTF-8?q?:green=5Fheart:=20Fixing=20CI=20Build.?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/issue.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE/issue.yml b/.gitee/ISSUE_TEMPLATE/issue.yml index a122b21b..5a6c8f75 100644 --- a/.gitee/ISSUE_TEMPLATE/issue.yml +++ b/.gitee/ISSUE_TEMPLATE/issue.yml @@ -6,13 +6,8 @@ body: attributes: label: PIG版本 options: - - "3.6" - - "3.5" - - "3.4" - - "3.3" - - "3.2" - - "3.1" - - "3.0" + - "3.8" + - "3.7" validations: required: true - type: checkboxes -- Gitee From 6564d8b1ffd6b08a77d40d9d5f764e3f5b9815a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 9 Apr 2024 14:25:37 +0800 Subject: [PATCH 204/238] :memo: Writing docs. edit README.md --- README.md | 53 ++++++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 046777f9..f776655e 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,33 @@

        Build Status - Coverage Status - Downloads - Downloads + Coverage Status + Downloads + Downloads

        ## 系统说明 -- 基于 Spring Cloud 2021 、Spring Boot 2.7、 OAuth2 的 RBAC **权限管理系统** -- 基于数据驱动视图的理念封装 element-plus,即使没有 vue 的使用经验也能快速上手 -- 提供对常见容器化支持 Docker、Kubernetes、Rancher2 支持 -- 提供 lambda 、stream api 、webflux 的生产实践 +- 基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC **企业快速开发平台**, 同时支持微服务架构和单体架构 +- 提供对 Spring Authorization Server 生产级实践,支持多种安全授权模式 +- 提供对常见容器化方案支持 Kubernetes、Rancher2 、Kubesphere、EDAS、SAE 支持 -## 文档视频 +#### 分支说明 -[ 🚀🚀🚀 低代码数据可视化](http://datav.pig4cloud.com) +- jdk17: java17/21 + springboot 3.2 + springcloud 2023 +- master: java8 + springboot 2.7 + springcloud 2021 + +#### 文档视频 -[ 配套文档 wiki.pig4cloud.com](https://wiki.pig4cloud.com) +- 🔥 [ 配套文档 wiki.pig4cloud.com](https://wiki.pig4cloud.com) -[ 配套视频 tv.pig4cloud.com](https://www.bilibili.com/video/BV12t411B7e9) +#### 其他产品 -[PIGX 在线体验 pigx.pigx.top](http://pigx.pigx.top) +- 👉🏻 [PIGX 在线体验](http://home.pig4cloud.com:38081) -[产品白皮书 paper.pig4cloud.com](https://paper.pig4cloud.com) +- 👉🏻 [自研BPMN工作流引擎](http://home.pig4cloud.com:38082) + +- 👉🏻 [大模型 RAG 知识库](http://home.pig4cloud.com:38083) ## 微信群 [禁广告] @@ -31,21 +35,17 @@ ## 快速开始 -### 分支说明 - -- master: java8 + springboot 2.7 + springcloud 2021 -- jdk17: java17 + springboot 3.1 + springcloud 2022 - ### 核心依赖 | 依赖 | 版本 | |-----------------------------|------------| -| Spring Boot | 2.7.18 | -| Spring Cloud | 2021.0.8 | -| Spring Cloud Alibaba | 2021.0.6.0 | -| Spring Authorization Server | 0.4.4 | -| Mybatis Plus | 3.5.5 | -| hutool | 5.8.22 | +| Spring Boot | 3.2.4 | +| Spring Cloud | 2023.0.1 | +| Spring Cloud Alibaba | 2022.0.0.0 | +| Spring Authorization Server | 1.2.3 | +| Mybatis Plus | 3.5.6 | +| Vue | 3.4 | +| Element Plus | 2.6 | ### 模块说明 @@ -53,12 +53,12 @@ pig-ui -- https://gitee.com/log4j/pig-ui pig +├── pig-boot -- 单体模式启动器[9999] ├── pig-auth -- 授权服务提供[3000] └── pig-common -- 系统公共模块 ├── pig-common-bom -- 全局依赖管理控制 ├── pig-common-core -- 公共工具类核心包 ├── pig-common-datasource -- 动态数据源包 - ├── pig-common-job -- xxl-job 封装 ├── pig-common-log -- 日志服务 ├── pig-common-oss -- 文件上传工具类 ├── pig-common-mybatis -- mybatis 扩展封装 @@ -84,12 +84,11 @@ pig 提供了详细的[部署文档 wiki.pig4cloud.com](https://www.yuque.com/pi 请务必**完全按照**文档部署运行章节 进行操作,减少踩坑弯路!! - ### Docker 运行 ``` # 下载并运行服务端代码 -git clone https://gitee.com/log4j/pig.git +git clone https://gitee.com/log4j/pig.git -b jdk17 cd pig && mvn clean install && docker-compose up -d -- Gitee From 9fe2ed3ba41c19c01287a0730c7bc481007987d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Wed, 10 Apr 2024 18:22:34 +0800 Subject: [PATCH 205/238] =?UTF-8?q?=F0=9F=90=9B=20=E4=BB=A4=E7=89=8C?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3=E8=B7=AF=E5=BE=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pig4cloud/pig/admin/controller/SysTokenController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java index 77c31f03..0865d90c 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java @@ -39,7 +39,7 @@ import java.util.Map; */ @RestController @AllArgsConstructor -@RequestMapping("/token") +@RequestMapping("/sys-token") @Tag(description = "token", name = "令牌管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysTokenController { -- Gitee From 22e33cf29458264ba7f278510640852fdd36ea0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Wed, 17 Apr 2024 13:34:09 +0800 Subject: [PATCH 206/238] =?UTF-8?q?:sparkles:=20Introducing=20new=20featur?= =?UTF-8?q?es.=20=E6=94=AF=E6=8C=81=E6=9B=B4=E4=BC=98=E9=9B=85=E7=9A=84?= =?UTF-8?q?=E6=89=93=E5=8C=85=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d3bed98b..9f5b5cec 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,6 @@
        - pig-boot pig-register pig-gateway pig-auth @@ -280,5 +279,11 @@ true + + boot + + pig-boot + + -- Gitee From e7a20be23392bf744600ff88862b853668375f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Wed, 17 Apr 2024 14:14:52 +0800 Subject: [PATCH 207/238] :art: Improving structure / format of the code. --- .../auth/config/WebSecurityConfiguration.java | 30 +- .../pig/auth/endpoint/ImageCodeEndpoint.java | 30 +- .../support/filter/PasswordDecoderFilter.java | 66 +- .../support/filter/ValidateCodeFilter.java | 161 ++-- .../PigBootSecurityServerConfiguration.java | 170 ++-- .../servlet/RepeatBodyRequestWrapper.java | 104 +-- .../pig/common/core/util/RedisUtils.java | 92 +-- .../core/PigFeignRequestCloseInterceptor.java | 17 +- .../openfeign/PigFeignClientsRegistrar.java | 11 +- .../resolver/SqlFilterArgumentResolver.java | 87 +- .../config/OpenAPIMetadataConfiguration.java | 8 +- .../admin/controller/SysLogController.java | 82 +- .../pig/admin/service/SysLogService.java | 38 +- .../admin/service/impl/SysLogServiceImpl.java | 2 +- .../service/impl/SysUserServiceImpl.java | 744 +++++++++--------- .../quartz/util/JavaClassTaskInvok.java | 3 +- 16 files changed, 817 insertions(+), 828 deletions(-) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java index 651590aa..be513a64 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java @@ -42,14 +42,14 @@ public class WebSecurityConfiguration { @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*") - .permitAll()// 开放自定义的部分端点 - .anyRequest() - .authenticated()) - .headers() - .frameOptions() - .sameOrigin()// 避免iframe同源无法登录 - .and() - .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 + .permitAll()// 开放自定义的部分端点 + .anyRequest() + .authenticated()) + .headers() + .frameOptions() + .sameOrigin()// 避免iframe同源无法登录 + .and() + .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 // 处理 UsernamePasswordAuthenticationToken http.authenticationProvider(new PigDaoAuthenticationProvider()); return http.build(); @@ -67,13 +67,13 @@ public class WebSecurityConfiguration { @Order(0) SecurityFilterChain resources(HttpSecurity http) throws Exception { http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/code/image", "/css/**", "/error")) - .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) - .requestCache() - .disable() - .securityContext() - .disable() - .sessionManagement() - .disable(); + .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) + .requestCache() + .disable() + .securityContext() + .disable() + .sessionManagement() + .disable(); return http.build(); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java index 17665e35..42bed102 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java @@ -24,25 +24,25 @@ import java.util.concurrent.TimeUnit; @RequiredArgsConstructor public class ImageCodeEndpoint { - private static final Integer DEFAULT_IMAGE_WIDTH = 100; + private static final Integer DEFAULT_IMAGE_WIDTH = 100; - private static final Integer DEFAULT_IMAGE_HEIGHT = 40; + private static final Integer DEFAULT_IMAGE_HEIGHT = 40; - private final StringRedisTemplate redisTemplate; + private final StringRedisTemplate redisTemplate; - /** - * 创建图形验证码 - */ - @SneakyThrows - @GetMapping("/image") - public void image(String randomStr, HttpServletResponse response) { - ArithmeticCaptcha captcha = new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT); + /** + * 创建图形验证码 + */ + @SneakyThrows + @GetMapping("/image") + public void image(String randomStr, HttpServletResponse response) { + ArithmeticCaptcha captcha = new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT); - String result = captcha.text(); - redisTemplate.opsForValue() - .set(CacheConstants.DEFAULT_CODE_KEY + randomStr, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); - // 转换流信息写出 - captcha.out(response.getOutputStream()); + String result = captcha.text(); + redisTemplate.opsForValue() + .set(CacheConstants.DEFAULT_CODE_KEY + randomStr, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + // 转换流信息写出 + captcha.out(response.getOutputStream()); } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java index ac33ed28..c756e752 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/PasswordDecoderFilter.java @@ -47,46 +47,46 @@ import java.util.Map; @RequiredArgsConstructor public class PasswordDecoderFilter extends OncePerRequestFilter { - private final AuthSecurityConfigProperties authSecurityConfigProperties; + private final AuthSecurityConfigProperties authSecurityConfigProperties; - private static final String PASSWORD = "password"; + private static final String PASSWORD = "password"; - private static final String KEY_ALGORITHM = "AES"; + private static final String KEY_ALGORITHM = "AES"; - static { - // 关闭hutool 强制关闭Bouncy Castle库的依赖 - SecureUtil.disableBouncyCastle(); - } + static { + // 关闭hutool 强制关闭Bouncy Castle库的依赖 + SecureUtil.disableBouncyCastle(); + } - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { - // 不是登录请求,直接向下执行 - if (!StrUtil.containsAnyIgnoreCase(request.getRequestURI(), SecurityConstants.OAUTH_TOKEN_URL)) { - chain.doFilter(request, response); - return; - } + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + // 不是登录请求,直接向下执行 + if (!StrUtil.containsAnyIgnoreCase(request.getRequestURI(), SecurityConstants.OAUTH_TOKEN_URL)) { + chain.doFilter(request, response); + return; + } - // 将请求流转换为可多次读取的请求流 - RepeatBodyRequestWrapper requestWrapper = new RepeatBodyRequestWrapper(request); - Map parameterMap = requestWrapper.getParameterMap(); + // 将请求流转换为可多次读取的请求流 + RepeatBodyRequestWrapper requestWrapper = new RepeatBodyRequestWrapper(request); + Map parameterMap = requestWrapper.getParameterMap(); - // 构建前端对应解密AES 因子 - AES aes = new AES(Mode.CFB, Padding.NoPadding, - new SecretKeySpec(authSecurityConfigProperties.getEncodeKey().getBytes(), KEY_ALGORITHM), - new IvParameterSpec(authSecurityConfigProperties.getEncodeKey().getBytes())); + // 构建前端对应解密AES 因子 + AES aes = new AES(Mode.CFB, Padding.NoPadding, + new SecretKeySpec(authSecurityConfigProperties.getEncodeKey().getBytes(), KEY_ALGORITHM), + new IvParameterSpec(authSecurityConfigProperties.getEncodeKey().getBytes())); - parameterMap.forEach((k, v) -> { - String[] values = parameterMap.get(k); - if (!PASSWORD.equals(k) || ArrayUtil.isEmpty(values)) { - return; - } + parameterMap.forEach((k, v) -> { + String[] values = parameterMap.get(k); + if (!PASSWORD.equals(k) || ArrayUtil.isEmpty(values)) { + return; + } - // 解密密码 - String decryptPassword = aes.decryptStr(values[0]); - parameterMap.put(k, new String[]{decryptPassword}); - }); - chain.doFilter(requestWrapper, response); - } + // 解密密码 + String decryptPassword = aes.decryptStr(values[0]); + parameterMap.put(k, new String[] { decryptPassword }); + }); + chain.doFilter(requestWrapper, response); + } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java index 4b528b5f..3863251d 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/filter/ValidateCodeFilter.java @@ -40,86 +40,87 @@ import java.util.Optional; @RequiredArgsConstructor public class ValidateCodeFilter extends OncePerRequestFilter { - private final AuthSecurityConfigProperties authSecurityConfigProperties; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - - String requestUrl = request.getServletPath(); - - // 不是登录URL 请求直接跳过 - if (!SecurityConstants.OAUTH_TOKEN_URL.equals(requestUrl)) { - filterChain.doFilter(request, response); - return; - } - - // 如果登录URL 但是刷新token的请求,直接向下执行 - String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); - if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { - filterChain.doFilter(request, response); - return; - } - - // 客户端配置跳过验证码 - boolean isIgnoreClient = authSecurityConfigProperties.getIgnoreClients().contains(WebUtils.getClientId()); - if (isIgnoreClient) { - filterChain.doFilter(request, response); - return; - } - - // 校验验证码 1. 客户端开启验证码 2. 短信模式 - try { - checkCode(); - filterChain.doFilter(request, response); - } catch (ValidateCodeException validateCodeException) { - throw new OAuth2AuthenticationException(validateCodeException.getMessage()); - } - } - - /** - * 校验验证码 - */ - private void checkCode() throws ValidateCodeException { - Optional request = WebUtils.getRequest(); - String code = request.get().getParameter("code"); - - if (StrUtil.isBlank(code)) { - throw new ValidateCodeException("验证码不能为空"); - } - - String randomStr = request.get().getParameter("randomStr"); - - // https://gitee.com/log4j/pig/issues/IWA0D - String mobile = request.get().getParameter("mobile"); - if (StrUtil.isNotBlank(mobile)) { - randomStr = mobile; - } - - String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; - RedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class); - if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { - throw new ValidateCodeException("验证码不合法"); - } - - Object codeObj = redisTemplate.opsForValue().get(key); - - if (codeObj == null) { - throw new ValidateCodeException("验证码不合法"); - } - - String saveCode = codeObj.toString(); - if (StrUtil.isBlank(saveCode)) { - redisTemplate.delete(key); - throw new ValidateCodeException("验证码不合法"); - } - - if (!StrUtil.equals(saveCode, code)) { - redisTemplate.delete(key); - throw new ValidateCodeException("验证码不合法"); - } - - redisTemplate.delete(key); + private final AuthSecurityConfigProperties authSecurityConfigProperties; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + String requestUrl = request.getServletPath(); + + // 不是登录URL 请求直接跳过 + if (!SecurityConstants.OAUTH_TOKEN_URL.equals(requestUrl)) { + filterChain.doFilter(request, response); + return; + } + + // 如果登录URL 但是刷新token的请求,直接向下执行 + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { + filterChain.doFilter(request, response); + return; + } + + // 客户端配置跳过验证码 + boolean isIgnoreClient = authSecurityConfigProperties.getIgnoreClients().contains(WebUtils.getClientId()); + if (isIgnoreClient) { + filterChain.doFilter(request, response); + return; + } + + // 校验验证码 1. 客户端开启验证码 2. 短信模式 + try { + checkCode(); + filterChain.doFilter(request, response); + } + catch (ValidateCodeException validateCodeException) { + throw new OAuth2AuthenticationException(validateCodeException.getMessage()); + } + } + + /** + * 校验验证码 + */ + private void checkCode() throws ValidateCodeException { + Optional request = WebUtils.getRequest(); + String code = request.get().getParameter("code"); + + if (StrUtil.isBlank(code)) { + throw new ValidateCodeException("验证码不能为空"); + } + + String randomStr = request.get().getParameter("randomStr"); + + // https://gitee.com/log4j/pig/issues/IWA0D + String mobile = request.get().getParameter("mobile"); + if (StrUtil.isNotBlank(mobile)) { + randomStr = mobile; + } + + String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; + RedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class); + if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { + throw new ValidateCodeException("验证码不合法"); + } + + Object codeObj = redisTemplate.opsForValue().get(key); + + if (codeObj == null) { + throw new ValidateCodeException("验证码不合法"); + } + + String saveCode = codeObj.toString(); + if (StrUtil.isBlank(saveCode)) { + redisTemplate.delete(key); + throw new ValidateCodeException("验证码不合法"); + } + + if (!StrUtil.equals(saveCode, code)) { + redisTemplate.delete(key); + throw new ValidateCodeException("验证码不合法"); + } + + redisTemplate.delete(key); } } diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java b/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java index 7f6f25b2..7b8a5ff7 100644 --- a/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java +++ b/pig-boot/src/main/java/com/pig4cloud/pig/bootstrap/PigBootSecurityServerConfiguration.java @@ -59,91 +59,91 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class PigBootSecurityServerConfiguration { - private final ResourceAuthExceptionEntryPoint resourceAuthExceptionEntryPoint; - - private final OpaqueTokenIntrospector customOpaqueTokenIntrospector; - - private final AuthenticationConverter accessTokenRequestConverter; - - private final OAuth2AuthorizationService authorizationService; - - private final PigBearerTokenExtractor pigBearerTokenExtractor; - - private final PasswordDecoderFilter passwordDecoderFilter; - - private final OAuth2TokenGenerator oAuth2TokenGenerator; - - private final ValidateCodeFilter validateCodeFilter; - - private final PermitAllUrlProperties permitAllUrl; - - @Bean - @Order(Ordered.HIGHEST_PRECEDENCE) - public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { - OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); - - http.addFilterAfter(passwordDecoderFilter, UsernamePasswordAuthenticationFilter.class); - http.addFilterAfter(validateCodeFilter, UsernamePasswordAuthenticationFilter.class); - http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 - tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter) // 注入自定义的授权认证Converter - .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 - .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 - }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 - oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 - .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 - .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))) - .authorizationService(authorizationService) - .authorizationServerSettings( - AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build()); - - AntPathRequestMatcher[] requestMatchers = permitAllUrl.getUrls() - .stream() - .map(AntPathRequestMatcher::new) - .collect(Collectors.toList()) - .toArray(new AntPathRequestMatcher[]{}); - - http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers) - .permitAll() - .anyRequest() - .authenticated()) - .oauth2ResourceServer( - oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) - .authenticationEntryPoint(resourceAuthExceptionEntryPoint) - .bearerTokenResolver(pigBearerTokenExtractor)) - .exceptionHandling(configurer -> configurer.authenticationEntryPoint(resourceAuthExceptionEntryPoint)) - .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) - .csrf(AbstractHttpConfigurer::disable); - - DefaultSecurityFilterChain securityFilterChain = http.build(); - - // 注入自定义授权模式实现 - addCustomOAuth2GrantAuthenticationProvider(http); - return securityFilterChain; - } - - /** - * 注入授权模式实现提供方 - *

        - * 1. 密码模式
        - * 2. 短信登录
        - */ - @SuppressWarnings("unchecked") - private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) { - AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); - OAuth2AuthorizationService authorizationService = http.getSharedObject(OAuth2AuthorizationService.class); - - OAuth2ResourceOwnerPasswordAuthenticationProvider resourceOwnerPasswordAuthenticationProvider = new OAuth2ResourceOwnerPasswordAuthenticationProvider( - authenticationManager, authorizationService, oAuth2TokenGenerator); - - OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider( - authenticationManager, authorizationService, oAuth2TokenGenerator); - - // 处理 UsernamePasswordAuthenticationToken - http.authenticationProvider(new PigDaoAuthenticationProvider()); - // 处理 OAuth2ResourceOwnerPasswordAuthenticationToken - http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider); - // 处理 OAuth2ResourceOwnerSmsAuthenticationToken - http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); + private final ResourceAuthExceptionEntryPoint resourceAuthExceptionEntryPoint; + + private final OpaqueTokenIntrospector customOpaqueTokenIntrospector; + + private final AuthenticationConverter accessTokenRequestConverter; + + private final OAuth2AuthorizationService authorizationService; + + private final PigBearerTokenExtractor pigBearerTokenExtractor; + + private final PasswordDecoderFilter passwordDecoderFilter; + + private final OAuth2TokenGenerator oAuth2TokenGenerator; + + private final ValidateCodeFilter validateCodeFilter; + + private final PermitAllUrlProperties permitAllUrl; + + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); + + http.addFilterAfter(passwordDecoderFilter, UsernamePasswordAuthenticationFilter.class); + http.addFilterAfter(validateCodeFilter, UsernamePasswordAuthenticationFilter.class); + http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 + tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter) // 注入自定义的授权认证Converter + .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 + .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 + }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 + oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 + .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))) + .authorizationService(authorizationService) + .authorizationServerSettings( + AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build()); + + AntPathRequestMatcher[] requestMatchers = permitAllUrl.getUrls() + .stream() + .map(AntPathRequestMatcher::new) + .collect(Collectors.toList()) + .toArray(new AntPathRequestMatcher[] {}); + + http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers) + .permitAll() + .anyRequest() + .authenticated()) + .oauth2ResourceServer( + oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) + .authenticationEntryPoint(resourceAuthExceptionEntryPoint) + .bearerTokenResolver(pigBearerTokenExtractor)) + .exceptionHandling(configurer -> configurer.authenticationEntryPoint(resourceAuthExceptionEntryPoint)) + .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .csrf(AbstractHttpConfigurer::disable); + + DefaultSecurityFilterChain securityFilterChain = http.build(); + + // 注入自定义授权模式实现 + addCustomOAuth2GrantAuthenticationProvider(http); + return securityFilterChain; + } + + /** + * 注入授权模式实现提供方 + *

        + * 1. 密码模式
        + * 2. 短信登录
        + */ + @SuppressWarnings("unchecked") + private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + OAuth2AuthorizationService authorizationService = http.getSharedObject(OAuth2AuthorizationService.class); + + OAuth2ResourceOwnerPasswordAuthenticationProvider resourceOwnerPasswordAuthenticationProvider = new OAuth2ResourceOwnerPasswordAuthenticationProvider( + authenticationManager, authorizationService, oAuth2TokenGenerator); + + OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider( + authenticationManager, authorizationService, oAuth2TokenGenerator); + + // 处理 UsernamePasswordAuthenticationToken + http.authenticationProvider(new PigDaoAuthenticationProvider()); + // 处理 OAuth2ResourceOwnerPasswordAuthenticationToken + http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider); + // 处理 OAuth2ResourceOwnerSmsAuthenticationToken + http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); } } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java index d04feb6c..598b75ab 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/servlet/RepeatBodyRequestWrapper.java @@ -38,66 +38,66 @@ import java.util.Map; @Slf4j public class RepeatBodyRequestWrapper extends HttpServletRequestWrapper { - private final byte[] bodyByteArray; + private final byte[] bodyByteArray; - private final Map parameterMap; + private final Map parameterMap; - public RepeatBodyRequestWrapper(HttpServletRequest request) { - super(request); - this.bodyByteArray = getByteBody(request); - this.parameterMap = super.getParameterMap(); - } + public RepeatBodyRequestWrapper(HttpServletRequest request) { + super(request); + this.bodyByteArray = getByteBody(request); + this.parameterMap = super.getParameterMap(); + } - @Override - public BufferedReader getReader() { - return ObjectUtils.isEmpty(this.bodyByteArray) ? null - : new BufferedReader(new InputStreamReader(getInputStream())); - } + @Override + public BufferedReader getReader() { + return ObjectUtils.isEmpty(this.bodyByteArray) ? null + : new BufferedReader(new InputStreamReader(getInputStream())); + } - @Override - public ServletInputStream getInputStream() { - final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.bodyByteArray); - return new ServletInputStream() { - @Override - public boolean isFinished() { - return false; - } + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.bodyByteArray); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } - @Override - public boolean isReady() { - return false; - } + @Override + public boolean isReady() { + return false; + } - @Override - public void setReadListener(ReadListener readListener) { - // doNoting - } + @Override + public void setReadListener(ReadListener readListener) { + // doNoting + } - @Override - public int read() { - return byteArrayInputStream.read(); - } - }; - } + @Override + public int read() { + return byteArrayInputStream.read(); + } + }; + } - private static byte[] getByteBody(HttpServletRequest request) { - byte[] body = new byte[0]; - try { - body = StreamUtils.copyToByteArray(request.getInputStream()); - } catch (IOException e) { - log.error("解析流中数据异常", e); - } - return body; - } + private static byte[] getByteBody(HttpServletRequest request) { + byte[] body = new byte[0]; + try { + body = StreamUtils.copyToByteArray(request.getInputStream()); + } + catch (IOException e) { + log.error("解析流中数据异常", e); + } + return body; + } - /** - * 重写 getParameterMap() 方法 解决 undertow 中流被读取后,会进行标记,从而导致无法正确获取 body 中的表单数据的问题 - * - * @return Map parameterMap - */ - @Override - public Map getParameterMap() { - return this.parameterMap; - } + /** + * 重写 getParameterMap() 方法 解决 undertow 中流被读取后,会进行标记,从而导致无法正确获取 body 中的表单数据的问题 + * @return Map parameterMap + */ + @Override + public Map getParameterMap() { + return this.parameterMap; + } } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java index 87143f37..62856f15 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -24,14 +24,14 @@ public class RedisUtils { /** * 指定缓存失效时间 - * @param key 键 + * @param key 键 * @param time 时间(秒) */ public boolean expire(String key, long time) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); Optional.ofNullable(redisTemplate) - .filter(template -> time > 0) - .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); + .filter(template -> time > 0) + .ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS)); return true; } @@ -43,8 +43,8 @@ public class RedisUtils { public long getExpire(Object key) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); return Optional.ofNullable(redisTemplate) - .map(template -> template.getExpire(key, TimeUnit.SECONDS)) - .orElse(-1L); + .map(template -> template.getExpire(key, TimeUnit.SECONDS)) + .orElse(-1L); } /** @@ -71,8 +71,8 @@ public class RedisUtils { /** * 分页查询 key * @param patternKey key - * @param page 页码 - * @param size 每页数目 + * @param page 页码 + * @param size 每页数目 * @return / */ public List findKeysForPage(String patternKey, int page, int size) { @@ -125,22 +125,22 @@ public class RedisUtils { /** * 获取锁 - * @param lockKey 锁key - * @param value value + * @param lockKey 锁key + * @param value value * @param expireTime:单位-秒 * @return boolean */ public boolean getLock(String lockKey, String value, int expireTime) { RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); return Optional.ofNullable(redisTemplate) - .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) - .orElse(false); + .map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS)) + .orElse(false); } /** * 释放锁 * @param lockKey 锁key - * @param value value + * @param value value * @return boolean */ public boolean releaseLock(String lockKey, String value) { @@ -148,9 +148,9 @@ public class RedisUtils { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value)) - .map(Convert::toLong) - .filter(SUCCESS::equals) - .isPresent(); + .map(Convert::toLong) + .filter(SUCCESS::equals) + .isPresent(); } // ============================String============================= @@ -177,7 +177,7 @@ public class RedisUtils { /** * 普通缓存放入 - * @param key 键 + * @param key 键 * @param value 值 * @return true成功 false失败 */ @@ -192,9 +192,9 @@ public class RedisUtils { /** * 普通缓存放入并设置时间 - * @param key 键 + * @param key 键 * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean set(String key, Object value, long time) { @@ -202,7 +202,8 @@ public class RedisUtils { return Optional.ofNullable(redisTemplate).map(template -> { if (time > 0) { template.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { + } + else { template.opsForValue().set(key, value); } return true; @@ -211,9 +212,9 @@ public class RedisUtils { /** * 普通缓存放入并设置时间 - * @param key 键 - * @param value 值 - * @param time 时间 + * @param key 键 + * @param value 值 + * @param time 时间 * @param timeUnit 类型 * @return true成功 false 失败 */ @@ -222,7 +223,8 @@ public class RedisUtils { Optional.ofNullable(redisTemplate).map(template -> { if (time > 0) { template.opsForValue().set(key, value, time, timeUnit); - } else { + } + else { template.opsForValue().set(key, value); } return true; @@ -234,7 +236,7 @@ public class RedisUtils { /** * HashGet - * @param key 键 不能为null + * @param key 键 不能为null * @param hashKey 项 不能为null * @return 值 */ @@ -270,8 +272,8 @@ public class RedisUtils { /** * HashSet 并设置时间 - * @param key 键 - * @param map 对应多个键值 + * @param key 键 + * @param map 对应多个键值 * @param time 时间(秒) * @return true成功 false失败 */ @@ -304,10 +306,10 @@ public class RedisUtils { /** * 向一张hash表中放入数据,如果不存在将创建 - * @param key 键 - * @param item 项 + * @param key 键 + * @param item 项 * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 * @return true 成功 false失败 */ public boolean hset(String key, String item, Object value, long time) { @@ -323,7 +325,7 @@ public class RedisUtils { /** * 删除hash表中的值 - * @param key 键 不能为null + * @param key 键 不能为null * @param item 项 可以使多个 不能为null */ public void hdel(String key, Object... item) { @@ -333,7 +335,7 @@ public class RedisUtils { /** * 判断hash表中是否有该项的值 - * @param key 键 不能为null + * @param key 键 不能为null * @param item 项 不能为null * @return true 存在 false不存在 */ @@ -344,9 +346,9 @@ public class RedisUtils { /** * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * @param key 键 + * @param key 键 * @param item 项 - * @param by 要增加几(大于0) + * @param by 要增加几(大于0) * @return */ public double hincr(String key, String item, double by) { @@ -356,9 +358,9 @@ public class RedisUtils { /** * hash递减 - * @param key 键 + * @param key 键 * @param item 项 - * @param by 要减少记(小于0) + * @param by 要减少记(小于0) * @return */ public double hdecr(String key, String item, double by) { @@ -391,7 +393,7 @@ public class RedisUtils { /** * 将数据放入set缓存 - * @param key 键 + * @param key 键 * @param values 值 可以是多个 * @return 成功个数 */ @@ -452,9 +454,9 @@ public class RedisUtils { /** * 获取list缓存的内容 - * @param key 键 + * @param key 键 * @param start 开始 - * @param end 结束 0 到 -1代表所有值 + * @param end 结束 0 到 -1代表所有值 * @return */ public List lGet(String key, long start, long end) { @@ -474,7 +476,7 @@ public class RedisUtils { /** * 通过索引 获取list中的值 - * @param key 键 + * @param key 键 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */ @@ -485,7 +487,7 @@ public class RedisUtils { /** * 将list放入缓存 - * @param key 键 + * @param key 键 * @param value 值 * @return */ @@ -513,7 +515,7 @@ public class RedisUtils { /** * 将list放入缓存 - * @param key 键 + * @param key 键 * @param value 值 * @return */ @@ -525,9 +527,9 @@ public class RedisUtils { /** * 将list放入缓存 - * @param key 键 + * @param key 键 * @param value 值 - * @param time 时间(秒) + * @param time 时间(秒) * @return */ public boolean lSet(String key, List value, long time) { @@ -541,7 +543,7 @@ public class RedisUtils { /** * 根据索引修改list中的某条数据 - * @param key 键 + * @param key 键 * @param index 索引 * @param value 值 * @return / @@ -554,7 +556,7 @@ public class RedisUtils { /** * 移除N个值为value - * @param key 键 + * @param key 键 * @param count 移除多少个 * @param value 值 * @return 移除的个数 diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java index c8ae0d6e..c2851035 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignRequestCloseInterceptor.java @@ -11,14 +11,13 @@ import org.springframework.http.HttpHeaders; */ public class PigFeignRequestCloseInterceptor implements RequestInterceptor { - /** - * set connection close - * - * @param template - */ - @Override - public void apply(feign.RequestTemplate template) { - template.header(HttpHeaders.CONNECTION, "close"); - } + /** + * set connection close + * @param template + */ + @Override + public void apply(feign.RequestTemplate template) { + template.header(HttpHeaders.CONNECTION, "close"); + } } diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 5df6f772..6f9f0511 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -97,7 +97,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, validate(attributes); BeanDefinitionBuilder definition = BeanDefinitionBuilder - .genericBeanDefinition(FeignClientFactoryBean.class); + .genericBeanDefinition(FeignClientFactoryBean.class); definition.addPropertyValue("url", getUrl(registry, attributes)); definition.addPropertyValue("path", getPath(attributes)); String name = getName(attributes); @@ -109,7 +109,8 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, String contextId = getContextId(attributes); aliasBuilder.append(contextId); definition.addPropertyValue("contextId", contextId); - } else { + } + else { aliasBuilder.append(name); } @@ -135,10 +136,11 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, - new String[]{alias}); + new String[] { alias }); BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); - } catch (ClassNotFoundException e) { + } + catch (ClassNotFoundException e) { e.printStackTrace(); } } @@ -147,7 +149,6 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, /** * Return the class used by {@link SpringFactoriesLoader} to load configuration * candidates. - * * @return the factory class */ private Class getSpringFactoriesLoaderFactoryClass() { diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index b2fca5f9..45041bac 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -45,56 +45,55 @@ import java.util.stream.Collectors; @Slf4j public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver { - /** - * 判断Controller是否包含page 参数 - * - * @param parameter 参数 - * @return 是否过滤 - */ - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.getParameterType().equals(Page.class); - } + /** + * 判断Controller是否包含page 参数 + * @param parameter 参数 + * @return 是否过滤 + */ + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.getParameterType().equals(Page.class); + } - /** - * @param parameter 入参集合 - * @param mavContainer model 和 view - * @param webRequest web相关 - * @param binderFactory 入参解析 - * @return 检查后新的page对象 - *

        - * page 只支持查询 GET .如需解析POST获取请求报文体处理 - */ - @Override - public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + /** + * @param parameter 入参集合 + * @param mavContainer model 和 view + * @param webRequest web相关 + * @param binderFactory 入参解析 + * @return 检查后新的page对象 + *

        + * page 只支持查询 GET .如需解析POST获取请求报文体处理 + */ + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { - HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - String[] ascs = request.getParameterValues("ascs"); - String[] descs = request.getParameterValues("descs"); - String current = request.getParameter("current"); - String size = request.getParameter("size"); + String[] ascs = request.getParameterValues("ascs"); + String[] descs = request.getParameterValues("descs"); + String current = request.getParameter("current"); + String size = request.getParameter("size"); - Page page = new Page<>(); - if (StrUtil.isNotBlank(current)) { - page.setCurrent(Long.parseLong(current)); - } + Page page = new Page<>(); + if (StrUtil.isNotBlank(current)) { + page.setCurrent(Long.parseLong(current)); + } - if (StrUtil.isNotBlank(size)) { - page.setSize(Long.parseLong(size)); - } + if (StrUtil.isNotBlank(size)) { + page.setSize(Long.parseLong(size)); + } - List orderItemList = new ArrayList<>(); - Optional.ofNullable(ascs) - .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) - .filter(asc -> !SqlInjectionUtils.check(asc)) - .map(OrderItem::asc) - .collect(Collectors.toList()))); - Optional.ofNullable(descs) - .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) - .filter(desc -> !SqlInjectionUtils.check(desc)) - .map(OrderItem::desc) + List orderItemList = new ArrayList<>(); + Optional.ofNullable(ascs) + .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) + .filter(asc -> !SqlInjectionUtils.check(asc)) + .map(OrderItem::asc) + .collect(Collectors.toList()))); + Optional.ofNullable(descs) + .ifPresent(s -> orderItemList.addAll(Arrays.stream(s) + .filter(desc -> !SqlInjectionUtils.check(desc)) + .map(OrderItem::desc) .collect(Collectors.toList()))); page.addOrder(orderItemList); diff --git a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java index 573f9f2a..3a272049 100644 --- a/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java +++ b/pig-common/pig-common-swagger/src/main/java/com/pig4cloud/pig/common/swagger/config/OpenAPIMetadataConfiguration.java @@ -20,11 +20,11 @@ public class OpenAPIMetadataConfiguration implements InitializingBean, Applicati @Override public void afterPropertiesSet() throws Exception { - String[] beanNamesForType = applicationContext.getBeanNamesForType(ServiceInstance.class); + String[] beanNamesForType = applicationContext.getBeanNamesForType(ServiceInstance.class); - if (beanNamesForType.length == 0) { - return; - } + if (beanNamesForType.length == 0) { + return; + } ServiceInstance serviceInstance = applicationContext.getBean(ServiceInstance.class); serviceInstance.getMetadata().put("spring-doc", path); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index a30dc100..982a9e03 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -53,53 +53,49 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysLogController { - private final SysLogService sysLogService; + private final SysLogService sysLogService; - /** - * 简单分页查询 - * - * @param page 分页对象 - * @param sysLog 系统日志 - * @return - */ - @GetMapping("/page") - public R getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { - return R.ok(sysLogService.getLogByPage(page, sysLog)); - } + /** + * 简单分页查询 + * @param page 分页对象 + * @param sysLog 系统日志 + * @return + */ + @GetMapping("/page") + public R getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { + return R.ok(sysLogService.getLogByPage(page, sysLog)); + } - /** - * 批量删除日志 - * - * @param ids ID - * @return success/false - */ - @DeleteMapping - @PreAuthorize("@pms.hasPermission('sys_log_del')") - public R removeByIds(@RequestBody Long[] ids) { - return R.ok(sysLogService.removeBatchByIds(CollUtil.toList(ids))); - } + /** + * 批量删除日志 + * @param ids ID + * @return success/false + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_log_del')") + public R removeByIds(@RequestBody Long[] ids) { + return R.ok(sysLogService.removeBatchByIds(CollUtil.toList(ids))); + } - /** - * 插入日志 - * - * @param sysLog 日志实体 - * @return success/false - */ - @Inner - @PostMapping("/save") - public R save(@Valid @RequestBody SysLog sysLog) { - return R.ok(sysLogService.saveLog(sysLog)); - } + /** + * 插入日志 + * @param sysLog 日志实体 + * @return success/false + */ + @Inner + @PostMapping("/save") + public R save(@Valid @RequestBody SysLog sysLog) { + return R.ok(sysLogService.saveLog(sysLog)); + } - /** - * 导出excel 表格 - * - * @param sysLog 查询条件 - * @return - */ - @ResponseExcel - @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('sys_log_export')") + /** + * 导出excel 表格 + * @param sysLog 查询条件 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_log_export')") public List export(SysLogDTO sysLog) { return sysLogService.getList(sysLog); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java index d5744321..7beb8813 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysLogService.java @@ -36,26 +36,24 @@ import java.util.List; */ public interface SysLogService extends IService { - /** - * 分页查询日志 - * - * @param page - * @param sysLog - * @return - */ - Page getLogByPage(Page page, SysLogDTO sysLog); - - /** - * 插入日志 - * - * @param sysLog 日志对象 - * @return true/false - */ - Boolean saveLog(SysLog sysLog); - - /** - * 查询日志列表 - * @param sysLog 查询条件 + /** + * 分页查询日志 + * @param page + * @param sysLog + * @return + */ + Page getLogByPage(Page page, SysLogDTO sysLog); + + /** + * 插入日志 + * @param sysLog 日志对象 + * @return true/false + */ + Boolean saveLog(SysLog sysLog); + + /** + * 查询日志列表 + * @param sysLog 查询条件 * @return List */ List getList(SysLogDTO sysLog); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index db3c3436..624f5a5e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -85,7 +85,7 @@ public class SysLogServiceImpl extends ServiceImpl impleme if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) - .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); } return wrapper; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index efcdb30a..42525864 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -69,382 +69,374 @@ import java.util.stream.Collectors; @AllArgsConstructor public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); - - private final SysMenuService sysMenuService; - - private final SysRoleService sysRoleService; - - private final SysPostService sysPostService; - - private final SysDeptService sysDeptService; - - private final SysUserRoleMapper sysUserRoleMapper; - - private final SysUserPostMapper sysUserPostMapper; - - private final CacheManager cacheManager; - - /** - * 保存用户信息 - * - * @param userDto DTO 对象 - * @return success/fail - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveUser(UserDTO userDto) { - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); - sysUser.setCreateBy(userDto.getUsername()); - sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - baseMapper.insert(sysUser); - // 保存用户岗位信息 - Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { - posts.stream().map(postId -> { - SysUserPost userPost = new SysUserPost(); - userPost.setUserId(sysUser.getUserId()); - userPost.setPostId(postId); - return userPost; - }).forEach(sysUserPostMapper::insert); - }); - - // 如果角色为空,赋默认角色 - if (CollUtil.isEmpty(userDto.getRole())) { - // 获取默认角色编码 - String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - // 默认角色 - SysRole sysRole = sysRoleService - .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); - userDto.setRole(Collections.singletonList(sysRole.getRoleId())); - } - - // 插入用户角色关系表 - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(sysUserRoleMapper::insert); - return Boolean.TRUE; - } - - /** - * 通过查用户的全部信息 - * - * @param sysUser 用户 - * @return - */ - @Override - public UserInfo findUserInfo(SysUser sysUser) { - UserInfo userInfo = new UserInfo(); - userInfo.setSysUser(sysUser); - // 设置角色列表 (ID) - List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) - .stream() - .map(SysRole::getRoleId) - .collect(Collectors.toList()); - userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); - - // 设置权限列表(menu.permission) - Set permissions = new HashSet<>(); - roleIds.forEach(roleId -> { - List permissionList = sysMenuService.findMenuByRoleId(roleId) - .stream() - .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) - .map(SysMenu::getPermission) - .collect(Collectors.toList()); - permissions.addAll(permissionList); - }); - userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); - return userInfo; - } - - /** - * 分页查询用户信息(含有角色信息) - * - * @param page 分页对象 - * @param userDTO 参数列表 - * @return - */ - @Override - public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { - return baseMapper.getUserVosPage(page, userDTO); - } - - /** - * 通过ID查询用户信息 - * - * @param id 用户ID - * @return 用户信息 - */ - @Override - public UserVO selectUserVoById(Long id) { - return baseMapper.getUserVoById(id); - } - - /** - * 删除用户 - * - * @param ids 用户ID 列表 - * @return Boolean - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean deleteUserByIds(Long[] ids) { - // 删除 spring cache - List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); - Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); - for (SysUser sysUser : userList) { - // 立即删除 - cache.evictIfPresent(sysUser.getUsername()); - } - - sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); - this.removeBatchByIds(CollUtil.toList(ids)); - return Boolean.TRUE; - } - - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R updateUserInfo(UserDTO userDto) { - SysUser sysUser = new SysUser(); - sysUser.setPhone(userDto.getPhone()); - sysUser.setUserId(SecurityUtils.getUser().getId()); - sysUser.setAvatar(userDto.getAvatar()); - sysUser.setNickname(userDto.getNickname()); - sysUser.setName(userDto.getName()); - sysUser.setEmail(userDto.getEmail()); - return R.ok(this.updateById(sysUser)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public Boolean updateUser(UserDTO userDto) { - // 更新用户表信息 - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setUpdateTime(LocalDateTime.now()); - if (StrUtil.isNotBlank(userDto.getPassword())) { - sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - } - this.updateById(sysUser); - - // 更新用户角色表 - sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(SysUserRole::insert); - - // 更新用户岗位表 - sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); - userDto.getPost().stream().map(postId -> { - SysUserPost userPost = new SysUserPost(); - userPost.setUserId(sysUser.getUserId()); - userPost.setPostId(postId); - return userPost; - }).forEach(SysUserPost::insert); - return Boolean.TRUE; - } - - /** - * 查询全部的用户 - * - * @param userDTO 查询条件 - * @return list - */ - @Override - public List listUser(UserDTO userDTO) { - // 根据数据权限查询全部的用户信息 - List voList = baseMapper.selectVoList(userDTO); - // 转换成execl 对象输出 - return voList.stream().map(userVO -> { - UserExcelVO excelVO = new UserExcelVO(); - BeanUtils.copyProperties(userVO, excelVO); - String roleNameList = userVO.getRoleList() - .stream() - .map(SysRole::getRoleName) - .collect(Collectors.joining(StrUtil.COMMA)); - excelVO.setRoleNameList(roleNameList); - String postNameList = userVO.getPostList() - .stream() - .map(SysPost::getPostName) - .collect(Collectors.joining(StrUtil.COMMA)); - excelVO.setPostNameList(postNameList); - return excelVO; - }).collect(Collectors.toList()); - } - - /** - * excel 导入用户, 插入正确的 错误的提示行号 - * - * @param excelVOList excel 列表数据 - * @param bindingResult 错误数据 - * @return ok fail - */ - @Override - public R importUser(List excelVOList, BindingResult bindingResult) { - // 通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - List deptList = sysDeptService.list(); - List roleList = sysRoleService.list(); - List postList = sysPostService.list(); - - // 执行数据插入操作 组装 UserDto - for (UserExcelVO excel : excelVOList) { - // 个性化校验逻辑 - List userList = this.list(); - - Set errorMsg = new HashSet<>(); - // 校验用户名是否存在 - boolean exsitUserName = userList.stream() - .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); - - if (exsitUserName) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); - } - - // 判断输入的部门名称列表是否合法 - Optional deptOptional = deptList.stream() - .filter(dept -> excel.getDeptName().equals(dept.getName())) - .findFirst(); - if (!deptOptional.isPresent()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); - } - - // 判断输入的角色名称列表是否合法 - List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); - List roleCollList = roleList.stream() - .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) - .collect(Collectors.toList()); - - if (roleCollList.size() != roleNameList.size()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); - } - - // 判断输入的部门名称列表是否合法 - List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); - List postCollList = postList.stream() - .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) - .collect(Collectors.toList()); - - if (postCollList.size() != postNameList.size()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); - } - - // 数据合法情况 - if (CollUtil.isEmpty(errorMsg)) { - insertExcelUser(excel, deptOptional, roleCollList, postCollList); - } else { - // 数据不合法情况 - errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); - } - - } - - if (CollUtil.isNotEmpty(errorMessageList)) { - return R.failed(errorMessageList); - } - return R.ok(); - } - - /** - * 插入excel User - */ - private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, - List postCollList) { - UserDTO userDTO = new UserDTO(); - userDTO.setUsername(excel.getUsername()); - userDTO.setPhone(excel.getPhone()); - userDTO.setNickname(excel.getNickname()); - userDTO.setName(excel.getName()); - userDTO.setEmail(excel.getEmail()); - // 批量导入初始密码为手机号 - userDTO.setPassword(userDTO.getPhone()); - // 根据部门名称查询部门ID - userDTO.setDeptId(deptOptional.get().getDeptId()); - // 插入岗位名称 - List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); - userDTO.setPost(postIdList); - // 根据角色名称查询角色ID - List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); - userDTO.setRole(roleIdList); - // 插入用户 - this.saveUser(userDTO); - } - - /** - * 注册用户 赋予用户默认角色 - * - * @param userDto 用户信息 - * @return success/false - */ - @Override - @Transactional(rollbackFor = Exception.class) - public R registerUser(UserDTO userDto) { - // 判断用户名是否存在 - SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); - if (sysUser != null) { - String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); - return R.failed(message); - } - return R.ok(saveUser(userDto)); - } - - /** - * 锁定用户 - * - * @param username 用户名 - * @return - */ - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") - public R lockUser(String username) { - SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - - if (Objects.nonNull(sysUser)) { - sysUser.setLockFlag(CommonConstants.STATUS_LOCK); - baseMapper.updateById(sysUser); - } - return R.ok(); - } - - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R changePassword(UserDTO userDto) { - SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); - if (Objects.isNull(sysUser)) { - return R.failed("用户不存在"); - } - - if (StrUtil.isEmpty(userDto.getPassword())) { - return R.failed("原密码不能为空"); - } - - if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { - log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); - } - - if (StrUtil.isEmpty(userDto.getNewpassword1())) { - return R.failed("新密码不能为空"); - } - String password = ENCODER.encode(userDto.getNewpassword1()); - - this.update(Wrappers.lambdaUpdate() - .set(SysUser::getPassword, password) - .eq(SysUser::getUserId, sysUser.getUserId())); - return R.ok(); - } - - @Override - public R checkPassword(String password) { - String username = SecurityUtils.getUser().getUsername(); + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); + + private final SysMenuService sysMenuService; + + private final SysRoleService sysRoleService; + + private final SysPostService sysPostService; + + private final SysDeptService sysDeptService; + + private final SysUserRoleMapper sysUserRoleMapper; + + private final SysUserPostMapper sysUserPostMapper; + + private final CacheManager cacheManager; + + /** + * 保存用户信息 + * @param userDto DTO 对象 + * @return success/fail + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveUser(UserDTO userDto) { + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); + sysUser.setCreateBy(userDto.getUsername()); + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + baseMapper.insert(sysUser); + // 保存用户岗位信息 + Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { + posts.stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(sysUserPostMapper::insert); + }); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService + .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); + return Boolean.TRUE; + } + + /** + * 通过查用户的全部信息 + * @param sysUser 用户 + * @return + */ + @Override + public UserInfo findUserInfo(SysUser sysUser) { + UserInfo userInfo = new UserInfo(); + userInfo.setSysUser(sysUser); + // 设置角色列表 (ID) + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) + .stream() + .map(SysRole::getRoleId) + .collect(Collectors.toList()); + userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + + // 设置权限列表(menu.permission) + Set permissions = new HashSet<>(); + roleIds.forEach(roleId -> { + List permissionList = sysMenuService.findMenuByRoleId(roleId) + .stream() + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) + .map(SysMenu::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); + userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); + return userInfo; + } + + /** + * 分页查询用户信息(含有角色信息) + * @param page 分页对象 + * @param userDTO 参数列表 + * @return + */ + @Override + public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { + return baseMapper.getUserVosPage(page, userDTO); + } + + /** + * 通过ID查询用户信息 + * @param id 用户ID + * @return 用户信息 + */ + @Override + public UserVO selectUserVoById(Long id) { + return baseMapper.getUserVoById(id); + } + + /** + * 删除用户 + * @param ids 用户ID 列表 + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteUserByIds(Long[] ids) { + // 删除 spring cache + List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + for (SysUser sysUser : userList) { + // 立即删除 + cache.evictIfPresent(sysUser.getUsername()); + } + + sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); + this.removeBatchByIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R updateUserInfo(UserDTO userDto) { + SysUser sysUser = new SysUser(); + sysUser.setPhone(userDto.getPhone()); + sysUser.setUserId(SecurityUtils.getUser().getId()); + sysUser.setAvatar(userDto.getAvatar()); + sysUser.setNickname(userDto.getNickname()); + sysUser.setName(userDto.getName()); + sysUser.setEmail(userDto.getEmail()); + return R.ok(this.updateById(sysUser)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public Boolean updateUser(UserDTO userDto) { + // 更新用户表信息 + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setUpdateTime(LocalDateTime.now()); + if (StrUtil.isNotBlank(userDto.getPassword())) { + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + } + this.updateById(sysUser); + + // 更新用户角色表 + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(SysUserRole::insert); + + // 更新用户岗位表 + sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); + userDto.getPost().stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(SysUserPost::insert); + return Boolean.TRUE; + } + + /** + * 查询全部的用户 + * @param userDTO 查询条件 + * @return list + */ + @Override + public List listUser(UserDTO userDTO) { + // 根据数据权限查询全部的用户信息 + List voList = baseMapper.selectVoList(userDTO); + // 转换成execl 对象输出 + return voList.stream().map(userVO -> { + UserExcelVO excelVO = new UserExcelVO(); + BeanUtils.copyProperties(userVO, excelVO); + String roleNameList = userVO.getRoleList() + .stream() + .map(SysRole::getRoleName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setRoleNameList(roleNameList); + String postNameList = userVO.getPostList() + .stream() + .map(SysPost::getPostName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setPostNameList(postNameList); + return excelVO; + }).collect(Collectors.toList()); + } + + /** + * excel 导入用户, 插入正确的 错误的提示行号 + * @param excelVOList excel 列表数据 + * @param bindingResult 错误数据 + * @return ok fail + */ + @Override + public R importUser(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + List deptList = sysDeptService.list(); + List roleList = sysRoleService.list(); + List postList = sysPostService.list(); + + // 执行数据插入操作 组装 UserDto + for (UserExcelVO excel : excelVOList) { + // 个性化校验逻辑 + List userList = this.list(); + + Set errorMsg = new HashSet<>(); + // 校验用户名是否存在 + boolean exsitUserName = userList.stream() + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + + if (exsitUserName) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); + } + + // 判断输入的部门名称列表是否合法 + Optional deptOptional = deptList.stream() + .filter(dept -> excel.getDeptName().equals(dept.getName())) + .findFirst(); + if (!deptOptional.isPresent()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); + } + + // 判断输入的角色名称列表是否合法 + List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); + List roleCollList = roleList.stream() + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); + + if (roleCollList.size() != roleNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); + } + + // 判断输入的部门名称列表是否合法 + List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); + List postCollList = postList.stream() + .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) + .collect(Collectors.toList()); + + if (postCollList.size() != postNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelUser(excel, deptOptional, roleCollList, postCollList); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + + } + + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 插入excel User + */ + private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, + List postCollList) { + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(excel.getUsername()); + userDTO.setPhone(excel.getPhone()); + userDTO.setNickname(excel.getNickname()); + userDTO.setName(excel.getName()); + userDTO.setEmail(excel.getEmail()); + // 批量导入初始密码为手机号 + userDTO.setPassword(userDTO.getPhone()); + // 根据部门名称查询部门ID + userDTO.setDeptId(deptOptional.get().getDeptId()); + // 插入岗位名称 + List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); + userDTO.setPost(postIdList); + // 根据角色名称查询角色ID + List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); + userDTO.setRole(roleIdList); + // 插入用户 + this.saveUser(userDTO); + } + + /** + * 注册用户 赋予用户默认角色 + * @param userDto 用户信息 + * @return success/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R registerUser(UserDTO userDto) { + // 判断用户名是否存在 + SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); + if (sysUser != null) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + return R.ok(saveUser(userDto)); + } + + /** + * 锁定用户 + * @param username 用户名 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") + public R lockUser(String username) { + SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + + if (Objects.nonNull(sysUser)) { + sysUser.setLockFlag(CommonConstants.STATUS_LOCK); + baseMapper.updateById(sysUser); + } + return R.ok(); + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R changePassword(UserDTO userDto) { + SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); + if (Objects.isNull(sysUser)) { + return R.failed("用户不存在"); + } + + if (StrUtil.isEmpty(userDto.getPassword())) { + return R.failed("原密码不能为空"); + } + + if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { + log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); + } + + if (StrUtil.isEmpty(userDto.getNewpassword1())) { + return R.failed("新密码不能为空"); + } + String password = ENCODER.encode(userDto.getNewpassword1()); + + this.update(Wrappers.lambdaUpdate() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, sysUser.getUserId())); + return R.ok(); + } + + @Override + public R checkPassword(String password) { + String username = SecurityUtils.getUser().getUsername(); SysUser condition = new SysUser(); condition.setUsername(username); SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java index 7692477a..58bedcf6 100644 --- a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/util/JavaClassTaskInvok.java @@ -64,7 +64,8 @@ public class JavaClassTaskInvok implements ITaskInvok { catch (ClassNotFoundException e) { log.error("定时任务java反射类没有找到,执行任务:{}", sysJob.getClassName()); throw new TaskException("定时任务java反射类没有找到,执行任务:" + sysJob.getClassName()); - } catch (IllegalAccessException | InstantiationException e) { + } + catch (IllegalAccessException | InstantiationException e) { log.error("定时任务java反射类异常,执行任务:{}", sysJob.getClassName()); throw new TaskException("定时任务java反射类异常,执行任务:" + sysJob.getClassName()); } -- Gitee From 51765dabff82d843d3c876e571fa17093b712e05 Mon Sep 17 00:00:00 2001 From: travisbikkle Date: Wed, 17 Apr 2024 21:02:35 +0800 Subject: [PATCH 208/238] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=9A=84=E8=A1=A8=E5=8D=95=E5=89=8D=E7=AB=AF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=89=80=E6=9C=89=E5=AD=97=E6=AE=B5=E9=83=BD=E6=98=AF=E5=BF=85?= =?UTF-8?q?=E5=A1=AB=E5=AD=97=E6=AE=B5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/pig.sql b/db/pig.sql index 72c6123b..39ea365d 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -934,7 +934,7 @@ INSERT INTO `gen_template` VALUES (6, 'Mapper.xml', '${backendPath}/src/main/res INSERT INTO `gen_template` VALUES (7, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 \n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\');\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\');', '2023-02-23 01:19:08', '2023-08-28 22:06:16', '0', ' ', ' '); INSERT INTO `gen_template` VALUES (8, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', ' ', ' '); INSERT INTO `gen_template` VALUES (9, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-28 22:53:55', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (10, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-08-27 22:23:19', '0', '', 'admin'); +INSERT INTO `gen_template` VALUES (10, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-08-27 22:23:19', '0', '', 'admin'); INSERT INTO `gen_template` VALUES (11, 'i18n英文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/en.ts', 'i18n英文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'import ${ClassName}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'${field.attrName}\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'input ${field.attrName}\',\n#end\n }\n}', '2023-02-23 01:20:25', '2023-06-04 10:49:25', '0', '', 'admin'); INSERT INTO `gen_template` VALUES (12, 'i18n中文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/zh-cn.ts', 'i18n中文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'导入${tableComment}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n }\n}', '2023-02-23 01:20:40', '2023-06-04 10:49:28', '0', '', 'admin'); COMMIT; -- Gitee From b4773869f73489afc741cf810b6c27b3fb4f1655 Mon Sep 17 00:00:00 2001 From: travisbikkle Date: Thu, 18 Apr 2024 08:57:16 +0800 Subject: [PATCH 209/238] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=90=8E=E4=BB=A3=E7=A0=81el-col=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/pig.sql b/db/pig.sql index 39ea365d..f24f3b88 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -933,7 +933,7 @@ INSERT INTO `gen_template` VALUES (5, 'Mapper', '${backendPath}/src/main/java/${ INSERT INTO `gen_template` VALUES (6, 'Mapper.xml', '${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml', 'Mapper.xml', '\n\n\n\n\n \n#foreach ($field in $fieldList)\n #if($field.primaryPk)\n \n #end\n #if(!$field.primaryPk)\n \n #end\n#end\n \n', '2023-02-23 01:18:35', '2023-06-04 10:34:56', '0', ' ', ' '); INSERT INTO `gen_template` VALUES (7, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 \n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\');\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\');', '2023-02-23 01:19:08', '2023-08-28 22:06:16', '0', ' ', ' '); INSERT INTO `gen_template` VALUES (8, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (9, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-28 22:53:55', '0', '', 'admin'); +INSERT INTO `gen_template` VALUES (9, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-28 22:53:55', '0', '', 'admin'); INSERT INTO `gen_template` VALUES (10, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-08-27 22:23:19', '0', '', 'admin'); INSERT INTO `gen_template` VALUES (11, 'i18n英文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/en.ts', 'i18n英文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'import ${ClassName}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'${field.attrName}\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'input ${field.attrName}\',\n#end\n }\n}', '2023-02-23 01:20:25', '2023-06-04 10:49:25', '0', '', 'admin'); INSERT INTO `gen_template` VALUES (12, 'i18n中文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/zh-cn.ts', 'i18n中文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'导入${tableComment}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n }\n}', '2023-02-23 01:20:40', '2023-06-04 10:49:28', '0', '', 'admin'); -- Gitee From 05920c2bf3e37b15094b9747e074417acd3c2c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 18 Apr 2024 21:24:02 +0800 Subject: [PATCH 210/238] =?UTF-8?q?:recycle:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81.=E9=87=8D=E6=9E=84feign=20client=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=9A=84url=20=E8=A6=86=E7=9B=96=E5=85=A8=E5=B1=80=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openfeign/PigFeignClientsRegistrar.java | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 5df6f772..05e7e899 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -34,6 +34,7 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; import org.springframework.lang.Nullable; +import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -67,12 +68,11 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } private void registerFeignClients(BeanDefinitionRegistry registry) { - - List feignClients = new ArrayList<>( - SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())); + List feignClients = new ArrayList<>(); // 支持 springboot 2.7 + 最新版本的配置方式 ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); + // 如果 spring.factories 里为空 if (feignClients.isEmpty()) { return; @@ -93,12 +93,13 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, continue; } - registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); + registerClientConfiguration(registry, getClientName(attributes), className, + attributes.get("configuration")); validate(attributes); BeanDefinitionBuilder definition = BeanDefinitionBuilder - .genericBeanDefinition(FeignClientFactoryBean.class); - definition.addPropertyValue("url", getUrl(registry, attributes)); + .genericBeanDefinition(FeignClientFactoryBean.class); + definition.addPropertyValue("url", getUrl(attributes)); definition.addPropertyValue("path", getPath(attributes)); String name = getName(attributes); definition.addPropertyValue("name", name); @@ -109,13 +110,19 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, String contextId = getContextId(attributes); aliasBuilder.append(contextId); definition.addPropertyValue("contextId", contextId); - } else { + } + else { aliasBuilder.append(name); } definition.addPropertyValue("type", className); - definition.addPropertyValue("decode404", attributes.get("decode404")); - definition.addPropertyValue("fallback", attributes.get("fallback")); + definition.addPropertyValue("dismiss404", + Boolean.parseBoolean(String.valueOf(attributes.get("dismiss404")))); + Object fallbackFactory = attributes.get("fallbackFactory"); + if (fallbackFactory != null) { + definition.addPropertyValue("fallbackFactory", fallbackFactory instanceof Class ? fallbackFactory + : ClassUtils.resolveClassName(fallbackFactory.toString(), null)); + } definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); @@ -135,10 +142,11 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, - new String[]{alias}); + new String[] { alias }); BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); - } catch (ClassNotFoundException e) { + } + catch (ClassNotFoundException e) { e.printStackTrace(); } } @@ -147,7 +155,6 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, /** * Return the class used by {@link SpringFactoriesLoader} to load configuration * candidates. - * * @return the factory class */ private Class getSpringFactoriesLoaderFactoryClass() { @@ -190,7 +197,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, return value; } - private String getUrl(BeanDefinitionRegistry registry, Map attributes) { + private String getUrl(Map attributes) { // 如果是单体项目自动注入 & url 为空 Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); @@ -199,7 +206,15 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, return null; } - String url = resolve(BASE_URL); + Object objUrl = attributes.get("url"); + + String url = ""; + if (StringUtils.hasText(objUrl.toString())) { + url = resolve(objUrl.toString()); + } + else { + url = resolve(BASE_URL); + } return FeignClientsRegistrar.getUrl(url); } @@ -252,6 +267,16 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, builder.getBeanDefinition()); } + private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object className, + Object configuration) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); + builder.addConstructorArgValue(name); + builder.addConstructorArgValue(className); + builder.addConstructorArgValue(configuration); + registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), + builder.getBeanDefinition()); + } + @Override public void setEnvironment(Environment environment) { this.environment = environment; -- Gitee From 357cf26b4fdb07a6c138e37056b73b6f0327753c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 18 Apr 2024 22:53:12 +0800 Subject: [PATCH 211/238] =?UTF-8?q?:recycle:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81.=E4=BC=98=E5=8C=96=20quartz=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=B8=B8=E7=94=A8=E9=85=8D=E7=BD=AE=E6=8A=BD?= =?UTF-8?q?=E5=8F=96=E8=87=B3=20quartz-config.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig_config.sql | 2 +- .../daemon/quartz/config/PigQuartzConfig.java | 3 +++ .../src/main/resources/quartz-config.yml | 24 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 pig-visual/pig-quartz/src/main/resources/quartz-config.yml diff --git a/db/pig_config.sql b/db/pig_config.sql index bb59cc5f..8f685ff4 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -43,7 +43,7 @@ INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_c INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 代码生成模块\n - id: pig-quartz\n uri: lb://pig-quartz\n predicates:\n - Path=/job/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs', '6ef9265e4a4298c5f4fdb9fbbf846818', '2022-05-08 12:10:37', '2024-04-07 12:22:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\nfile:\n bucketName: s3demo \n local:\n enable: true\n base-path: /Users/lengleng/Downloads/img', '48f8db128aeb5debb331bae49ff37908', '2022-05-08 12:10:37', '2023-07-07 14:44:09', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构 (第一次启动自动创建表,后续改成never 即可)\n jdbc:\n initialize-schema: always\n\n', '976b20c3858fc7f218d4ac8aab847396', '2023-07-02 12:24:33', '2024-04-07 14:38:58', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (7, 'pig-quartz-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n', '8d9725a73216310178d2835de13c4ebf', '2023-07-02 12:24:33', '2024-04-18 22:36:12', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); COMMIT; -- ---------------------------- diff --git a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java index 76dfe308..5355fd32 100644 --- a/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java +++ b/pig-visual/pig-quartz/src/main/java/com/pig4cloud/pig/daemon/quartz/config/PigQuartzConfig.java @@ -17,6 +17,7 @@ package com.pig4cloud.pig.daemon.quartz.config; +import com.pig4cloud.pig.common.core.factory.YamlPropertySourceFactory; import org.quartz.Calendar; import org.quartz.JobDetail; import org.quartz.Scheduler; @@ -30,6 +31,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @@ -42,6 +44,7 @@ import java.util.Properties; */ @EnableAsync @Configuration +@PropertySource(value = "classpath:quartz-config.yml", factory = YamlPropertySourceFactory.class) @ConditionalOnClass({ Scheduler.class, SchedulerFactoryBean.class }) @EnableConfigurationProperties({ QuartzProperties.class }) public class PigQuartzConfig { diff --git a/pig-visual/pig-quartz/src/main/resources/quartz-config.yml b/pig-visual/pig-quartz/src/main/resources/quartz-config.yml new file mode 100644 index 00000000..11c5e4af --- /dev/null +++ b/pig-visual/pig-quartz/src/main/resources/quartz-config.yml @@ -0,0 +1,24 @@ +# 如下配置为使用数据库存储定时任务,属性不经常修改,所以不放在 application.yml 中统一管理 +spring: + quartz: + properties: + org: + quartz: + scheduler: + instanceName: clusteredScheduler + instanceId: AUTO + jobStore: + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore # 数据库存储 + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # 数据库代理 + tablePrefix: QRTZ_ # 表前缀 + isClustered: true # 集群 + clusterCheckinInterval: 30000 # 集群检查间隔 + useProperties: false + threadPool: + class: org.quartz.simpl.SimpleThreadPool # 线程池 + threadCount: 50 # 线程数量 + threadPriority: 5 # 线程优先级 + threadsInheritContextClassLoaderOfInitializingThread: true # 是否继承类加载器 + job-store-type: jdbc # 持久化到数据库 + jdbc: + initialize-schema: never # 不初始化表结构 -- Gitee From e558af372a18f38f8b7c847aecd4f9dfce7e70dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 19 Apr 2024 21:23:47 +0800 Subject: [PATCH 212/238] =?UTF-8?q?:recycle:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81.=E7=AE=80=E5=8C=96=E9=85=8D=E7=BD=AE=20quartz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 3 +++ pig-boot/src/main/resources/application.yml | 27 ------------------- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/pig-boot/src/main/resources/application-dev.yml b/pig-boot/src/main/resources/application-dev.yml index 3908f850..a2076028 100644 --- a/pig-boot/src/main/resources/application-dev.yml +++ b/pig-boot/src/main/resources/application-dev.yml @@ -1,4 +1,7 @@ spring: + # 缓存相关配置 + cache: + type: redis redis: host: pig-redis # 数据库相关配置 diff --git a/pig-boot/src/main/resources/application.yml b/pig-boot/src/main/resources/application.yml index d5c37198..7a9ab332 100644 --- a/pig-boot/src/main/resources/application.yml +++ b/pig-boot/src/main/resources/application.yml @@ -6,33 +6,6 @@ server: spring: application: name: @project.artifactId@ - # 缓存相关配置 - cache: - type: redis - # 定时任务属性配置 - quartz: - properties: - org: - quartz: - scheduler: - instanceName: clusteredScheduler - instanceId: AUTO - jobStore: - class: org.springframework.scheduling.quartz.LocalDataSourceJobStore - driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate - tablePrefix: QRTZ_ - isClustered: true - clusterCheckinInterval: 10000 - useProperties: false - threadPool: - class: org.quartz.simpl.SimpleThreadPool - threadCount: 50 - threadPriority: 5 - threadsInheritContextClassLoaderOfInitializingThread: true - job-store-type: jdbc - jdbc: - initialize-schema: always # 生产注意设置为 never - startup-delay: 10 # 上传文件大小限制 servlet: multipart: -- Gitee From 88c19d45b984dcac1ff674cbb3b7b93664731a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 19 Apr 2024 21:26:43 +0800 Subject: [PATCH 213/238] =?UTF-8?q?=F0=9F=A7=90=20=E4=BC=98=E5=8C=96=20qua?= =?UTF-8?q?rtz=20=E7=9B=B8=E5=85=B3SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/pig.sql b/db/pig.sql index f24f3b88..ab7c26dd 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -695,8 +695,8 @@ CREATE TABLE `sys_job` ( `start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间', `previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间', `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间', - `remark` varchar(500) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息', - PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE + PRIMARY KEY (`job_id`) USING BTREE, + UNIQUE KEY `job_name_group_idx` (`job_name`,`job_group`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表'; -- ---------------------------- -- Gitee From 09cbd8d6e9ab3752c940561e1d963b7b870bf077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 19 Apr 2024 21:29:04 +0800 Subject: [PATCH 214/238] =?UTF-8?q?=F0=9F=A7=90=20=E4=BC=98=E5=8C=96=20qua?= =?UTF-8?q?rtz=20=E7=9B=B8=E5=85=B3SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) diff --git a/db/pig.sql b/db/pig.sql index ab7c26dd..2f459f2e 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -967,4 +967,170 @@ INSERT INTO `gen_template_group` VALUES (1, 11); INSERT INTO `gen_template_group` VALUES (1, 12); COMMIT; +# +# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar +# +# PLEASE consider using mysql with innodb tables to avoid locking issues +# +# In your Quartz properties file, you'll need to set +# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +# + +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + + +CREATE TABLE QRTZ_JOB_DETAILS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + JOB_NAME VARCHAR(200) NOT NULL, + JOB_GROUP VARCHAR(200) NOT NULL, + DESCRIPTION VARCHAR(250) NULL, + JOB_CLASS_NAME VARCHAR(250) NOT NULL, + IS_DURABLE VARCHAR(1) NOT NULL, + IS_NONCONCURRENT VARCHAR(1) NOT NULL, + IS_UPDATE_DATA VARCHAR(1) NOT NULL, + REQUESTS_RECOVERY VARCHAR(1) NOT NULL, + JOB_DATA BLOB NULL, + PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +); + +CREATE TABLE QRTZ_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + JOB_NAME VARCHAR(200) NOT NULL, + JOB_GROUP VARCHAR(200) NOT NULL, + DESCRIPTION VARCHAR(250) NULL, + NEXT_FIRE_TIME BIGINT(13) NULL, + PREV_FIRE_TIME BIGINT(13) NULL, + PRIORITY INTEGER NULL, + TRIGGER_STATE VARCHAR(16) NOT NULL, + TRIGGER_TYPE VARCHAR(8) NOT NULL, + START_TIME BIGINT(13) NOT NULL, + END_TIME BIGINT(13) NULL, + CALENDAR_NAME VARCHAR(200) NULL, + MISFIRE_INSTR SMALLINT(2) NULL, + JOB_DATA BLOB NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) + REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) +); + +CREATE TABLE QRTZ_SIMPLE_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + REPEAT_COUNT BIGINT(7) NOT NULL, + REPEAT_INTERVAL BIGINT(12) NOT NULL, + TIMES_TRIGGERED BIGINT(10) NOT NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +CREATE TABLE QRTZ_CRON_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + CRON_EXPRESSION VARCHAR(200) NOT NULL, + TIME_ZONE_ID VARCHAR(80), + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +CREATE TABLE QRTZ_SIMPROP_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 INT NULL, + INT_PROP_2 INT NULL, + LONG_PROP_1 BIGINT NULL, + LONG_PROP_2 BIGINT NULL, + DEC_PROP_1 NUMERIC(13,4) NULL, + DEC_PROP_2 NUMERIC(13,4) NULL, + BOOL_PROP_1 VARCHAR(1) NULL, + BOOL_PROP_2 VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +CREATE TABLE QRTZ_BLOB_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + BLOB_DATA BLOB NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +CREATE TABLE QRTZ_CALENDARS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + CALENDAR_NAME VARCHAR(200) NOT NULL, + CALENDAR BLOB NOT NULL, + PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) +); + +CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) +); + +CREATE TABLE QRTZ_FIRED_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + ENTRY_ID VARCHAR(95) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + INSTANCE_NAME VARCHAR(200) NOT NULL, + FIRED_TIME BIGINT(13) NOT NULL, + SCHED_TIME BIGINT(13) NOT NULL, + PRIORITY INTEGER NOT NULL, + STATE VARCHAR(16) NOT NULL, + JOB_NAME VARCHAR(200) NULL, + JOB_GROUP VARCHAR(200) NULL, + IS_NONCONCURRENT VARCHAR(1) NULL, + REQUESTS_RECOVERY VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME,ENTRY_ID) +); + +CREATE TABLE QRTZ_SCHEDULER_STATE + ( + SCHED_NAME VARCHAR(120) NOT NULL, + INSTANCE_NAME VARCHAR(200) NOT NULL, + LAST_CHECKIN_TIME BIGINT(13) NOT NULL, + CHECKIN_INTERVAL BIGINT(13) NOT NULL, + PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) +); + +CREATE TABLE QRTZ_LOCKS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + LOCK_NAME VARCHAR(40) NOT NULL, + PRIMARY KEY (SCHED_NAME,LOCK_NAME) +); + SET FOREIGN_KEY_CHECKS = 1; -- Gitee From e9e0a039c050cb336ccc4be31dd77960f38a6de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 19 Apr 2024 21:36:06 +0800 Subject: [PATCH 215/238] =?UTF-8?q?=F0=9F=94=A7=20=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=90=84=E7=A7=8D=E4=BE=9D=E8=B5=96=E7=9A=84=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E9=80=A0=E6=88=90=20BeanPostProcessorChecker?= =?UTF-8?q?=20=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openfeign/PigFeignClientsRegistrar.java | 42 ++++--------------- .../init/ApplicationLoggerInitializer.java | 4 ++ 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 05e7e899..6f9f0511 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -34,7 +34,6 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; import org.springframework.lang.Nullable; -import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -68,11 +67,12 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } private void registerFeignClients(BeanDefinitionRegistry registry) { - List feignClients = new ArrayList<>(); + + List feignClients = new ArrayList<>( + SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())); // 支持 springboot 2.7 + 最新版本的配置方式 ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); - // 如果 spring.factories 里为空 if (feignClients.isEmpty()) { return; @@ -93,13 +93,12 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, continue; } - registerClientConfiguration(registry, getClientName(attributes), className, - attributes.get("configuration")); + registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); validate(attributes); BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition(FeignClientFactoryBean.class); - definition.addPropertyValue("url", getUrl(attributes)); + definition.addPropertyValue("url", getUrl(registry, attributes)); definition.addPropertyValue("path", getPath(attributes)); String name = getName(attributes); definition.addPropertyValue("name", name); @@ -116,13 +115,8 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, } definition.addPropertyValue("type", className); - definition.addPropertyValue("dismiss404", - Boolean.parseBoolean(String.valueOf(attributes.get("dismiss404")))); - Object fallbackFactory = attributes.get("fallbackFactory"); - if (fallbackFactory != null) { - definition.addPropertyValue("fallbackFactory", fallbackFactory instanceof Class ? fallbackFactory - : ClassUtils.resolveClassName(fallbackFactory.toString(), null)); - } + definition.addPropertyValue("decode404", attributes.get("decode404")); + definition.addPropertyValue("fallback", attributes.get("fallback")); definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); @@ -197,7 +191,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, return value; } - private String getUrl(Map attributes) { + private String getUrl(BeanDefinitionRegistry registry, Map attributes) { // 如果是单体项目自动注入 & url 为空 Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); @@ -206,15 +200,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, return null; } - Object objUrl = attributes.get("url"); - - String url = ""; - if (StringUtils.hasText(objUrl.toString())) { - url = resolve(objUrl.toString()); - } - else { - url = resolve(BASE_URL); - } + String url = resolve(BASE_URL); return FeignClientsRegistrar.getUrl(url); } @@ -267,16 +253,6 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, builder.getBeanDefinition()); } - private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object className, - Object configuration) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); - builder.addConstructorArgValue(name); - builder.addConstructorArgValue(className); - builder.addConstructorArgValue(configuration); - registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), - builder.getBeanDefinition()); - } - @Override public void setEnvironment(Environment environment) { this.environment = environment; diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java index 1ba935a0..f9a3fcd6 100644 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/init/ApplicationLoggerInitializer.java @@ -39,6 +39,10 @@ public class ApplicationLoggerInitializer implements EnvironmentPostProcessor, O // 避免 sentinel 1.8.4+ 心跳日志过大 System.setProperty("csp.sentinel.log.level", "OFF"); + + // 避免各种依赖的地方组件造成 BeanPostProcessorChecker 警告 + System.setProperty("logging.level.org.springframework.context.support.PostProcessorRegistrationDelegate", + "ERROR"); } @Override -- Gitee From fdb8b5f24ce399e036a270781ce171a9394fae18 Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 24 Apr 2024 03:21:04 +0000 Subject: [PATCH 216/238] =?UTF-8?q?java8=E7=89=88=E6=9C=AC=E5=8D=95?= =?UTF-8?q?=E4=BD=93=E5=90=AF=E5=8A=A8=EF=BC=8C=E8=84=9A=E6=9C=AC=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=BC=BA=E5=A4=B1=E5=AF=BC=E8=87=B4=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lbw --- db/pig.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/pig.sql b/db/pig.sql index 2f459f2e..bd16063a 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -695,6 +695,7 @@ CREATE TABLE `sys_job` ( `start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间', `previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间', `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间', + `remark` varchar(255) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息', PRIMARY KEY (`job_id`) USING BTREE, UNIQUE KEY `job_name_group_idx` (`job_name`,`job_group`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表'; -- Gitee From 1839c8851a6565cf733736d82ed537579c106034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 10 Jun 2024 08:33:17 +0800 Subject: [PATCH 217/238] add docker mirror --- db/Dockerfile | 2 +- docker-compose.yml | 2 +- pig-auth/Dockerfile | 2 +- pig-gateway/Dockerfile | 2 +- pig-register/Dockerfile | 2 +- pig-upms/pig-upms-biz/Dockerfile | 2 +- pig-visual/pig-codegen/Dockerfile | 2 +- pig-visual/pig-monitor/Dockerfile | 2 +- pig-visual/pig-quartz/Dockerfile | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/db/Dockerfile b/db/Dockerfile index 951fed68..bbb75be7 100644 --- a/db/Dockerfile +++ b/db/Dockerfile @@ -1,4 +1,4 @@ -FROM mysql/mysql-server:8.0.31 +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/mysql/mysql-server:8.0.32 MAINTAINER lengleng(wangiegie@gmail.com) diff --git a/docker-compose.yml b/docker-compose.yml index bebfe470..1e774a0d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: - spring_cloud_default pig-redis: - image: redis:7.0.0 + image: registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/redis ports: - 6379:6379 restart: always diff --git a/pig-auth/Dockerfile b/pig-auth/Dockerfile index e2440b2a..80098bcb 100755 --- a/pig-auth/Dockerfile +++ b/pig-auth/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-auth diff --git a/pig-gateway/Dockerfile b/pig-gateway/Dockerfile index c20004d3..97c729ed 100755 --- a/pig-gateway/Dockerfile +++ b/pig-gateway/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-gateway diff --git a/pig-register/Dockerfile b/pig-register/Dockerfile index 43df994a..c2bdf8b0 100644 --- a/pig-register/Dockerfile +++ b/pig-register/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-register diff --git a/pig-upms/pig-upms-biz/Dockerfile b/pig-upms/pig-upms-biz/Dockerfile index 7c0bbc2e..f7d3945a 100644 --- a/pig-upms/pig-upms-biz/Dockerfile +++ b/pig-upms/pig-upms-biz/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-upms-biz diff --git a/pig-visual/pig-codegen/Dockerfile b/pig-visual/pig-codegen/Dockerfile index 0b87aa88..679b9014 100644 --- a/pig-visual/pig-codegen/Dockerfile +++ b/pig-visual/pig-codegen/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-codegen diff --git a/pig-visual/pig-monitor/Dockerfile b/pig-visual/pig-monitor/Dockerfile index ffa4ad7c..a068ad9b 100755 --- a/pig-visual/pig-monitor/Dockerfile +++ b/pig-visual/pig-monitor/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-monitor diff --git a/pig-visual/pig-quartz/Dockerfile b/pig-visual/pig-quartz/Dockerfile index 36f1e6a7..fa260c4b 100644 --- a/pig-visual/pig-quartz/Dockerfile +++ b/pig-visual/pig-quartz/Dockerfile @@ -1,4 +1,4 @@ -FROM moxm/java:1.8-full +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:1.8-full WORKDIR /pig-quartz -- Gitee From 60f7509d24a0acfbc7f9c72d2b68610dd9fd18a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 10 Jun 2024 08:38:00 +0800 Subject: [PATCH 218/238] =?UTF-8?q?=F0=9F=90=B3=20add=20docker=20mirror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/Dockerfile b/db/Dockerfile index bbb75be7..ea8127e7 100644 --- a/db/Dockerfile +++ b/db/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/mysql/mysql-server:8.0.32 +FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/mysql-server:8.0.32 MAINTAINER lengleng(wangiegie@gmail.com) -- Gitee From 88c4237a91bed84e56728a233456b465bf5028d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 10 Jun 2024 08:48:41 +0800 Subject: [PATCH 219/238] =?UTF-8?q?=F0=9F=92=9A=20=E5=A2=9E=E5=8A=A0=20CI?= =?UTF-8?q?=20=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA=20Git=20Repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 💚 增加 CI ,支持多个 Git Repo 💚 增加 CI ,支持多个 Git Repo --- .github/workflows/maven.yml | 2 +- .github/workflows/mirror.yml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 79b631a0..229ab6a6 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java-version: [ 8, 11, 17 ] + java-version: [ 8 ] steps: - uses: actions/checkout@v3 - name: Set up JDK ${{ matrix.java-version }} diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 112d4506..ac0eab3d 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -14,3 +14,12 @@ jobs: with: source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@code.gitlink.org.cn:lengleng/pig.git" + - name: Delete existing repository + run: sudo rm -rf /home/runner/work/pig/pig + + - uses: wearerequired/git-mirror-action@master #同步至 gitee + env: + SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} + with: + source-repo: "git@github.com:pig-mesh/pig.git" + destination-repo: "git@gitee.com:log4j/pig.git" -- Gitee From 3aa60808fa7da6802acc7c67efdc6557ad952f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 10 Jun 2024 08:56:14 +0800 Subject: [PATCH 220/238] =?UTF-8?q?=F0=9F=92=9A=20=E5=A2=9E=E5=8A=A0=20CI?= =?UTF-8?q?=20=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA=20Git=20Repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/mirror.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index ac0eab3d..249dce9f 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -8,18 +8,19 @@ jobs: gitlink: runs-on: ubuntu-latest steps: - - uses: wearerequired/git-mirror-action@master #同步至 gitlink + - name: Checkout repository + uses: actions/checkout@v3 + + - name: gitlink + uses: wearerequired/git-mirror-action@master #同步至 gitlink env: SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} with: - source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@code.gitlink.org.cn:lengleng/pig.git" - - name: Delete existing repository - run: sudo rm -rf /home/runner/work/pig/pig - - uses: wearerequired/git-mirror-action@master #同步至 gitee + - name: gitee + uses: wearerequired/git-mirror-action@master #同步至 gitlink env: SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} with: - source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@gitee.com:log4j/pig.git" -- Gitee From f45eb1d18a68e7b00f72a78d7f582014a0f21eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 10 Jun 2024 09:02:35 +0800 Subject: [PATCH 221/238] =?UTF-8?q?=F0=9F=92=9A=20=E5=A2=9E=E5=8A=A0=20CI?= =?UTF-8?q?=20=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA=20Git=20Repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/mirror.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 249dce9f..2e4a36dd 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -8,19 +8,20 @@ jobs: gitlink: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: gitlink - uses: wearerequired/git-mirror-action@master #同步至 gitlink + - uses: wearerequired/git-mirror-action@master #同步至 gitlink env: SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} with: + source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@code.gitlink.org.cn:lengleng/pig.git" - - - name: gitee - uses: wearerequired/git-mirror-action@master #同步至 gitlink + gitee: + runs-on: ubuntu-latest + container: + image: "centos:7" + steps: + - uses: wearerequired/git-mirror-action@master #同步至 gitee env: SSH_PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} with: + source-repo: "git@github.com:pig-mesh/pig.git" destination-repo: "git@gitee.com:log4j/pig.git" -- Gitee From 1ab4b9f63c7da2eaa9db97971bb9960c30ad0fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Wed, 29 May 2024 16:47:39 +0800 Subject: [PATCH 222/238] =?UTF-8?q?=F0=9F=90=9B=20fix=20=E5=8D=95=E4=BD=93?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-auth/pom.xml | 3 +++ pig-upms/pig-upms-biz/pom.xml | 3 +++ pig-visual/pig-codegen/pom.xml | 3 +++ pig-visual/pig-quartz/pom.xml | 3 +++ 4 files changed, 12 insertions(+) diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 350af39f..19eca575 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -87,6 +87,9 @@ + + boot + cloud diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index efd2b08e..11458c5b 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -97,6 +97,9 @@ + + boot + cloud diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index 42ae061a..3243edb5 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -113,6 +113,9 @@ + + boot + cloud diff --git a/pig-visual/pig-quartz/pom.xml b/pig-visual/pig-quartz/pom.xml index 85b40448..b46a20fe 100644 --- a/pig-visual/pig-quartz/pom.xml +++ b/pig-visual/pig-quartz/pom.xml @@ -77,6 +77,9 @@ + + boot + cloud -- Gitee From f68358b3555d26e312a80b96106cd7d98ad25098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 11 Jul 2024 13:06:55 +0800 Subject: [PATCH 223/238] =?UTF-8?q?=F0=9F=94=90=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E5=B1=8F=E8=94=BD=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E5=AD=97=E6=AE=B5=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/issue.yml | 13 ++++++++----- .../java/com/pig4cloud/pig/admin/api/vo/UserVO.java | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE/issue.yml b/.gitee/ISSUE_TEMPLATE/issue.yml index 5a6c8f75..bfc777ac 100644 --- a/.gitee/ISSUE_TEMPLATE/issue.yml +++ b/.gitee/ISSUE_TEMPLATE/issue.yml @@ -1,25 +1,28 @@ name: 问题咨询 -description: "![扫码加入微信群](https://minio.pigx.top/oss/1648184189.png)" +description: "请尽可能详细的描述问题,提供足够的上下文,一分钟的描述不需要期望别人花半小时帮你排查" body: - type: dropdown id: version attributes: label: PIG版本 options: + - "不处理PIGX或其他魔改版本" - "3.8" - "3.7" validations: required: true - type: checkboxes + validations: + required: true attributes: - label: 是否修改了包名 + label: 架构 options: - - label: 是 - required: false + - label: 微服务架构 + - label: 单体架构 - type: textarea id: desired-solution attributes: label: 问题描述 - description: 详细问题,提供相应截图和日志 + description: 详细问题,提供相应截图和日志,一分钟的描述不需要期望别人花半小时帮你排查 validations: required: true diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java index a42f357a..e67d72db 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/UserVO.java @@ -19,6 +19,7 @@ package com.pig4cloud.pig.admin.api.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.pig4cloud.pig.admin.api.entity.SysPost; import com.pig4cloud.pig.admin.api.entity.SysRole; import io.swagger.v3.oas.annotations.media.Schema; @@ -53,13 +54,13 @@ public class UserVO implements Serializable { /** * 密码 */ - @Schema(description = "密码") + @JsonIgnore private String password; /** * 随机盐 */ - @Schema(description = "随机盐") + @JsonIgnore private String salt; /** -- Gitee From 3aa92c6e2d485455adb8de94ebd7479f82909470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 21 Jul 2024 15:46:55 +0800 Subject: [PATCH 224/238] upgrade(spring cloud aliabab): 2021.0.6.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9f5b5cec..43ab6502 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 3.8.0-JDK8 2.7.18 2021.0.8 - 2021.0.6.0 + 2021.0.6.1 UTF-8 1.8 1.8 -- Gitee From 1b0caff5f1f1895d59d3fc813723f9d094b768ba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 13:28:07 +0000 Subject: [PATCH 225/238] upgrade(bom): mybatis-plus 3.5.7 dynamic-datasource 4.3.1 --- pig-common/pig-common-bom/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 472dd22d..0e713e75 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -23,8 +23,8 @@ 1.2.83 1.6.9 2.2.0 - 3.5.6 - 4.3.0 + 3.5.7 + 4.3.1 8.0.33 1.6.1 1.2.6 @@ -33,7 +33,7 @@ 1.0.5 2.0.2 2.3.5 - 5.8.27 + 5.8.29 2.7.4 1.8.4 4.9.9 -- Gitee From 675f4478db1b78708e721c4862d07e0fe41ead32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 15 Jul 2024 10:33:50 +0800 Subject: [PATCH 226/238] =?UTF-8?q?fix(=E8=B5=84=E6=BA=90=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8):=20=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8=E6=89=94=E5=87=BA403=20=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/feign/sentinel/handle/GlobalBizExceptionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java index 3dccbf3c..489d0f1b 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java @@ -91,7 +91,7 @@ public class GlobalBizExceptionHandler { String msg = SpringSecurityMessageSource.getAccessor() .getMessage("AbstractAccessDecisionManager.accessDenied", e.getMessage()); log.warn("拒绝授权异常信息 ex={}", msg); - return R.failed(e.getLocalizedMessage()); + return R.failed(msg); } /** -- Gitee From f8775499f230dc85628e1dc7dffc03d086f8d497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Thu, 27 Jun 2024 16:14:25 +0800 Subject: [PATCH 227/238] =?UTF-8?q?=E2=99=BB=EF=B8=8F#5739=20DictResolver?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AD=97=E5=85=B8=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=86=85=E9=83=A8=E8=B0=83=E7=94=A8=EF=BC=8C=E4=B8=8D=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E4=BA=8Etoken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/api/feign/RemoteDictService.java | 4 +- .../admin/controller/SysDictController.java | 388 ++++++++++-------- 2 files changed, 212 insertions(+), 180 deletions(-) diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDictService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDictService.java index 3ca11474..b018b5e5 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDictService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteDictService.java @@ -3,6 +3,7 @@ package com.pig4cloud.pig.admin.api.feign; import com.pig4cloud.pig.admin.api.entity.SysDictItem; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.NoToken; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -23,7 +24,8 @@ public interface RemoteDictService { * @param type 字典类型 * @return 同类型字典 */ - @GetMapping("/dict/type/{type}") + @NoToken + @GetMapping("/dict/remote/type/{type}") R> getDictByType(@PathVariable("type") String type); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index 1a30028c..28c06926 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -30,6 +30,7 @@ import com.pig4cloud.pig.admin.service.SysDictService; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -59,184 +60,213 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysDictController { - private final SysDictService sysDictService; - - private final SysDictItemService sysDictItemService; - - /** - * 通过ID查询字典信息 - * @param id ID - * @return 字典信息 - */ - @GetMapping("/details/{id}") - public R getById(@PathVariable Long id) { - return R.ok(sysDictService.getById(id)); - } - - /** - * 查询字典信息 - * @param query 查询信息 - * @return 字典信息 - */ - @GetMapping("/details") - public R getDetails(@ParameterObject SysDict query) { - return R.ok(sysDictService.getOne(Wrappers.query(query), false)); - } - - /** - * 分页查询字典信息 - * @param page 分页对象 - * @return 分页对象 - */ - @GetMapping("/page") - public R getDictPage(@ParameterObject Page page, @ParameterObject SysDict sysDict) { - return R.ok(sysDictService.page(page, - Wrappers.lambdaQuery() - .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, sysDict.getSystemFlag()) - .like(StrUtil.isNotBlank(sysDict.getDictType()), SysDict::getDictType, sysDict.getDictType()))); - } - - /** - * 通过字典类型查找字典 - * @param type 类型 - * @return 同类型字典 - */ - @GetMapping("/type/{type}") - @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") - public R> getDictByType(@PathVariable String type) { - return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); - } - - /** - * 添加字典 - * @param sysDict 字典信息 - * @return success、false - */ - @SysLog("添加字典") - @PostMapping - @PreAuthorize("@pms.hasPermission('sys_dict_add')") - public R save(@Valid @RequestBody SysDict sysDict) { - sysDictService.save(sysDict); - return R.ok(sysDict); - } - - /** - * 删除字典,并且清除字典缓存 - * @param ids ID - * @return R - */ - @SysLog("删除字典") - @DeleteMapping - @PreAuthorize("@pms.hasPermission('sys_dict_del')") - @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public R removeById(@RequestBody Long[] ids) { - return R.ok(sysDictService.removeDictByIds(ids)); - } - - /** - * 修改字典 - * @param sysDict 字典信息 - * @return success/false - */ - @PutMapping - @SysLog("修改字典") - @PreAuthorize("@pms.hasPermission('sys_dict_edit')") - public R updateById(@Valid @RequestBody SysDict sysDict) { - return sysDictService.updateDict(sysDict); - } - - /** - * 分页查询 - * @param name 名称或者字典项 - * @return - */ - @GetMapping("/list") - public R getDictList(String name) { - return R.ok(sysDictService.list(Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(name), SysDict::getDictType, name) - .or() - .like(StrUtil.isNotBlank(name), SysDict::getDescription, name))); - } - - /** - * 分页查询 - * @param page 分页对象 - * @param sysDictItem 字典项 - * @return - */ - @GetMapping("/item/page") - public R getSysDictItemPage(Page page, SysDictItem sysDictItem) { - return R.ok(sysDictItemService.page(page, Wrappers.query(sysDictItem))); - } - - /** - * 通过id查询字典项 - * @param id id - * @return R - */ - @GetMapping("/item/details/{id}") - public R getDictItemById(@PathVariable("id") Long id) { - return R.ok(sysDictItemService.getById(id)); - } - - /** - * 查询字典项详情 - * @param query 查询条件 - * @return R - */ - @GetMapping("/item/details") - public R getDictItemDetails(SysDictItem query) { - return R.ok(sysDictItemService.getOne(Wrappers.query(query), false)); - } - - /** - * 新增字典项 - * @param sysDictItem 字典项 - * @return R - */ - @SysLog("新增字典项") - @PostMapping("/item") - @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public R save(@RequestBody SysDictItem sysDictItem) { - return R.ok(sysDictItemService.save(sysDictItem)); - } - - /** - * 修改字典项 - * @param sysDictItem 字典项 - * @return R - */ - @SysLog("修改字典项") - @PutMapping("/item") - public R updateById(@RequestBody SysDictItem sysDictItem) { - return sysDictItemService.updateDictItem(sysDictItem); - } - - /** - * 通过id删除字典项 - * @param id id - * @return R - */ - @SysLog("删除字典项") - @DeleteMapping("/item/{id}") - public R removeDictItemById(@PathVariable Long id) { - return sysDictItemService.removeDictItem(id); - } - - /** - * 同步缓存字典 - * @return R - */ - @SysLog("同步字典") - @PutMapping("/sync") - public R sync() { - return sysDictService.syncDictCache(); - } - - @ResponseExcel - @GetMapping("/export") - public List export(SysDictItem sysDictItem) { - return sysDictItemService.list(Wrappers.query(sysDictItem)); - } + private final SysDictService sysDictService; + + private final SysDictItemService sysDictItemService; + + /** + * 通过ID查询字典信息 + * + * @param id ID + * @return 字典信息 + */ + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysDictService.getById(id)); + } + + /** + * 查询字典信息 + * + * @param query 查询信息 + * @return 字典信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysDict query) { + return R.ok(sysDictService.getOne(Wrappers.query(query), false)); + } + + /** + * 分页查询字典信息 + * + * @param page 分页对象 + * @return 分页对象 + */ + @GetMapping("/page") + public R getDictPage(@ParameterObject Page page, @ParameterObject SysDict sysDict) { + return R.ok(sysDictService.page(page, + Wrappers.lambdaQuery() + .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, sysDict.getSystemFlag()) + .like(StrUtil.isNotBlank(sysDict.getDictType()), SysDict::getDictType, sysDict.getDictType()))); + } + + + /** + * 添加字典 + * + * @param sysDict 字典信息 + * @return success、false + */ + @SysLog("添加字典") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_dict_add')") + public R save(@Valid @RequestBody SysDict sysDict) { + sysDictService.save(sysDict); + return R.ok(sysDict); + } + + /** + * 删除字典,并且清除字典缓存 + * + * @param ids ID + * @return R + */ + @SysLog("删除字典") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_dict_del')") + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysDictService.removeDictByIds(ids)); + } + + /** + * 修改字典 + * + * @param sysDict 字典信息 + * @return success/false + */ + @PutMapping + @SysLog("修改字典") + @PreAuthorize("@pms.hasPermission('sys_dict_edit')") + public R updateById(@Valid @RequestBody SysDict sysDict) { + return sysDictService.updateDict(sysDict); + } + + /** + * 分页查询 + * + * @param name 名称或者字典项 + * @return + */ + @GetMapping("/list") + public R getDictList(String name) { + return R.ok(sysDictService.list(Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(name), SysDict::getDictType, name) + .or() + .like(StrUtil.isNotBlank(name), SysDict::getDescription, name))); + } + + /** + * 分页查询 + * + * @param page 分页对象 + * @param sysDictItem 字典项 + * @return + */ + @GetMapping("/item/page") + public R getSysDictItemPage(Page page, SysDictItem sysDictItem) { + return R.ok(sysDictItemService.page(page, Wrappers.query(sysDictItem))); + } + + /** + * 通过id查询字典项 + * + * @param id id + * @return R + */ + @GetMapping("/item/details/{id}") + public R getDictItemById(@PathVariable("id") Long id) { + return R.ok(sysDictItemService.getById(id)); + } + + /** + * 查询字典项详情 + * + * @param query 查询条件 + * @return R + */ + @GetMapping("/item/details") + public R getDictItemDetails(SysDictItem query) { + return R.ok(sysDictItemService.getOne(Wrappers.query(query), false)); + } + + /** + * 新增字典项 + * + * @param sysDictItem 字典项 + * @return R + */ + @SysLog("新增字典项") + @PostMapping("/item") + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R save(@RequestBody SysDictItem sysDictItem) { + return R.ok(sysDictItemService.save(sysDictItem)); + } + + /** + * 修改字典项 + * + * @param sysDictItem 字典项 + * @return R + */ + @SysLog("修改字典项") + @PutMapping("/item") + public R updateById(@RequestBody SysDictItem sysDictItem) { + return sysDictItemService.updateDictItem(sysDictItem); + } + + /** + * 通过id删除字典项 + * + * @param id id + * @return R + */ + @SysLog("删除字典项") + @DeleteMapping("/item/{id}") + public R removeDictItemById(@PathVariable Long id) { + return sysDictItemService.removeDictItem(id); + } + + /** + * 同步缓存字典 + * + * @return R + */ + @SysLog("同步字典") + @PutMapping("/sync") + public R sync() { + return sysDictService.syncDictCache(); + } + + @ResponseExcel + @GetMapping("/export") + public List export(SysDictItem sysDictItem) { + return sysDictItemService.list(Wrappers.query(sysDictItem)); + } + + /** + * 通过字典类型查找字典 + * + * @param type 类型 + * @return 同类型字典 + */ + @GetMapping("/type/{type}") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") + public R> getDictByType(@PathVariable String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); + } + + /** + * 通过字典类型查找字典 (针对feign调用) + * TODO: 兼容性方案,代码重复 + * @param type 类型 + * @return 同类型字典 + */ + @Inner + @GetMapping("/remote/type/{type}") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") + public R> getRemoteDictByType(@PathVariable String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); + } } -- Gitee From 6ee9e5fa3b99e834557201ece6764630d740b866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sat, 1 Jun 2024 12:29:24 +0800 Subject: [PATCH 228/238] =?UTF-8?q?=E2=9C=A8=20add=20=20NoToken=20Feign=20?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E8=87=AA=E5=8A=A8=E7=BB=B4=E6=8A=A4header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/auth/endpoint/PigTokenEndpoint.java | 9 ++- .../pig/common/feign/annotation/NoToken.java | 15 +++++ .../core/PigFeignInnerRequestInterceptor.java | 34 ++++++++++ .../pig/common/log/event/SysLogListener.java | 63 +++++++++---------- .../service/PigAppUserDetailsServiceImpl.java | 2 +- .../service/PigUserDetailsServiceImpl.java | 56 ++++++++--------- pig-upms/pig-upms-api/pom.xml | 5 +- .../api/feign/RemoteClientDetailsService.java | 19 +++--- .../pig/admin/api/feign/RemoteLogService.java | 9 ++- .../admin/api/feign/RemoteParamService.java | 20 +++--- .../admin/api/feign/RemoteTokenService.java | 56 ++++++++--------- .../admin/api/feign/RemoteUserService.java | 32 ++++------ .../pig/admin/api/util/ParamResolver.java | 3 +- .../admin/controller/SysTokenController.java | 5 +- .../admin/controller/SysUserController.java | 3 +- .../service/impl/SysUserServiceImpl.java | 6 +- 16 files changed, 183 insertions(+), 154 deletions(-) create mode 100644 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/NoToken.java create mode 100644 pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignInnerRequestInterceptor.java diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java index 8212bbc1..f9ae29cf 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java @@ -27,7 +27,6 @@ import com.pig4cloud.pig.admin.api.vo.TokenVo; import com.pig4cloud.pig.auth.support.handler.PigAuthenticationFailureEventHandler; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.CommonConstants; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.RetOps; import com.pig4cloud.pig.common.core.util.SpringContextHolder; @@ -35,8 +34,6 @@ import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.pig.common.security.util.OAuth2EndpointUtils; import com.pig4cloud.pig.common.security.util.OAuth2ErrorCodesExpand; import com.pig4cloud.pig.common.security.util.OAuthClientException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -62,6 +59,8 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.security.Principal; import java.util.List; import java.util.Map; @@ -109,7 +108,7 @@ public class PigTokenEndpoint { @RequestParam(OAuth2ParameterNames.SCOPE) String scope, @RequestParam(OAuth2ParameterNames.STATE) String state) { SysOauthClientDetails clientDetails = RetOps - .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)) + .of(clientDetailsService.getClientDetailsById(clientId)) .getData() .orElseThrow(() -> new OAuthClientException("clientId 不合法")); @@ -171,7 +170,7 @@ public class PigTokenEndpoint { * @param token token */ @Inner - @DeleteMapping("/{token}") + @DeleteMapping("/remove/{token}") public R removeToken(@PathVariable("token") String token) { OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); if (authorization == null) { diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/NoToken.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/NoToken.java new file mode 100644 index 00000000..ba946af4 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/NoToken.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pig.common.feign.annotation; + +import java.lang.annotation.*; + +/** + * 服务无token调用声明注解 + *

        + * 只有发起方没有 token 时候才需要添加此注解, @NoToken + @Inner + *

        + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface NoToken { +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignInnerRequestInterceptor.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignInnerRequestInterceptor.java new file mode 100644 index 00000000..f4181291 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/core/PigFeignInnerRequestInterceptor.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pig.common.feign.core; + +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import com.pig4cloud.pig.common.feign.annotation.NoToken; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.springframework.core.Ordered; + +import java.lang.reflect.Method; + +/** + * @author lengleng + * @date 2024/6/1 + */ +public class PigFeignInnerRequestInterceptor implements RequestInterceptor, Ordered { + /** + * Called for every request. Add data using methods on the supplied {@link RequestTemplate}. + * + * @param template + */ + @Override + public void apply(RequestTemplate template) { + Method method = template.methodMetadata().method(); + NoToken noToken = method.getAnnotation(NoToken.class); + if (noToken != null) { + template.header(SecurityConstants.FROM, SecurityConstants.FROM_IN); + } + } + + @Override + public int getOrder() { + return Integer.MIN_VALUE; + } +} diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java index 581db9c5..7fb2df31 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/event/SysLogListener.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.pig4cloud.pig.admin.api.entity.SysLog; import com.pig4cloud.pig.admin.api.feign.RemoteLogService; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.jackson.PigJavaTimeModule; import com.pig4cloud.pig.common.log.config.PigLogProperties; import lombok.RequiredArgsConstructor; @@ -45,45 +44,45 @@ import java.util.Objects; @RequiredArgsConstructor public class SysLogListener implements InitializingBean { - // new 一个 避免日志脱敏策略影响全局ObjectMapper - private final static ObjectMapper objectMapper = new ObjectMapper(); + // new 一个 避免日志脱敏策略影响全局ObjectMapper + private final static ObjectMapper objectMapper = new ObjectMapper(); - private final RemoteLogService remoteLogService; + private final RemoteLogService remoteLogService; - private final PigLogProperties logProperties; + private final PigLogProperties logProperties; - @SneakyThrows - @Async - @Order - @EventListener(SysLogEvent.class) - public void saveSysLog(SysLogEvent event) { - SysLogEventSource source = (SysLogEventSource) event.getSource(); - SysLog sysLog = new SysLog(); - BeanUtils.copyProperties(source, sysLog); + @SneakyThrows + @Async + @Order + @EventListener(SysLogEvent.class) + public void saveSysLog(SysLogEvent event) { + SysLogEventSource source = (SysLogEventSource) event.getSource(); + SysLog sysLog = new SysLog(); + BeanUtils.copyProperties(source, sysLog); - // json 格式刷参数放在异步中处理,提升性能 - if (Objects.nonNull(source.getBody())) { - String params = objectMapper.writeValueAsString(source.getBody()); - sysLog.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); - } + // json 格式刷参数放在异步中处理,提升性能 + if (Objects.nonNull(source.getBody())) { + String params = objectMapper.writeValueAsString(source.getBody()); + sysLog.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); + } - remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN); - } + remoteLogService.saveLog(sysLog); + } - @Override - public void afterPropertiesSet() { - objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); - String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); + @Override + public void afterPropertiesSet() { + objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); + String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); - FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", - SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); - objectMapper.setFilterProvider(filters); - objectMapper.registerModule(new PigJavaTimeModule()); - } + FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", + SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); + objectMapper.setFilterProvider(filters); + objectMapper.registerModule(new PigJavaTimeModule()); + } - @JsonFilter("filter properties by name") - class PropertyFilterMixIn { + @JsonFilter("filter properties by name") + class PropertyFilterMixIn { - } + } } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java index 93a718af..9875968d 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigAppUserDetailsServiceImpl.java @@ -57,7 +57,7 @@ public class PigAppUserDetailsServiceImpl implements PigUserDetailsService { UserDTO userDTO = new UserDTO(); userDTO.setPhone(phone); - R result = remoteUserService.info(userDTO, SecurityConstants.FROM_IN); + R result = remoteUserService.info(userDTO); UserDetails userDetails = getUserDetails(result); if (cache != null) { diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java index a997a928..a31a9231 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsServiceImpl.java @@ -20,7 +20,6 @@ import com.pig4cloud.pig.admin.api.dto.UserDTO; import com.pig4cloud.pig.admin.api.dto.UserInfo; import com.pig4cloud.pig.admin.api.feign.RemoteUserService; import com.pig4cloud.pig.common.core.constant.CacheConstants; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.R; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -40,36 +39,37 @@ import org.springframework.security.core.userdetails.UserDetails; @RequiredArgsConstructor public class PigUserDetailsServiceImpl implements PigUserDetailsService { - private final RemoteUserService remoteUserService; + private final RemoteUserService remoteUserService; - private final CacheManager cacheManager; + private final CacheManager cacheManager; - /** - * 用户名密码登录 - * @param username 用户名 - * @return - */ - @Override - @SneakyThrows - public UserDetails loadUserByUsername(String username) { - Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); - if (cache != null && cache.get(username) != null) { - return (PigUser) cache.get(username).get(); - } + /** + * 用户名密码登录 + * + * @param username 用户名 + * @return + */ + @Override + @SneakyThrows + public UserDetails loadUserByUsername(String username) { + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + if (cache != null && cache.get(username) != null) { + return (PigUser) cache.get(username).get(); + } - UserDTO userDTO = new UserDTO(); - userDTO.setUsername(username); - R result = remoteUserService.info(userDTO, SecurityConstants.FROM_IN); - UserDetails userDetails = getUserDetails(result); - if (cache != null) { - cache.put(username, userDetails); - } - return userDetails; - } + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(username); + R result = remoteUserService.info(userDTO); + UserDetails userDetails = getUserDetails(result); + if (cache != null) { + cache.put(username, userDetails); + } + return userDetails; + } - @Override - public int getOrder() { - return Integer.MIN_VALUE; - } + @Override + public int getOrder() { + return Integer.MIN_VALUE; + } } diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index 0af724eb..d0853895 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -38,9 +38,8 @@ - org.springframework.cloud - spring-cloud-openfeign-core - true + com.pig4cloud + pig-common-feign diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java index af15361f..d95ccebc 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java @@ -23,6 +23,7 @@ import com.pig4cloud.pig.admin.api.entity.SysOauthClientDetails; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.NoToken; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -37,15 +38,15 @@ import java.util.List; @FeignClient(contextId = "remoteClientDetailsService", value = ServiceNameConstants.UMPS_SERVICE) public interface RemoteClientDetailsService { - /** - * 通过clientId 查询客户端信息 - * @param clientId 用户名 - * @param from 调用标志 - * @return R - */ - @GetMapping("/client/getClientDetailsById/{clientId}") - R getClientDetailsById(@PathVariable("clientId") String clientId, - @RequestHeader(SecurityConstants.FROM) String from); + /** + * 通过clientId 查询客户端信息 (未登录,需要无token 内部调用) + * + * @param clientId 用户名 + * @return R + */ + @NoToken + @GetMapping("/client/getClientDetailsById/{clientId}") + R getClientDetailsById(@PathVariable("clientId") String clientId); /** * 查询全部客户端 diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java index b547825d..652ee5e3 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteLogService.java @@ -20,13 +20,12 @@ package com.pig4cloud.pig.admin.api.feign; import com.pig4cloud.pig.admin.api.entity.SysLog; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.NoToken; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; /** * @author lengleng @@ -36,12 +35,12 @@ import org.springframework.web.bind.annotation.RequestHeader; public interface RemoteLogService { /** - * 保存日志 + * 保存日志 (异步多线程调用,无token) * @param sysLog 日志实体 - * @param from 是否内部调用 * @return succes、false */ + @NoToken @PostMapping("/log/save") - R saveLog(@RequestBody SysLog sysLog, @RequestHeader(SecurityConstants.FROM) String from); + R saveLog(@RequestBody SysLog sysLog); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java index 712f45bc..afaa96c3 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteParamService.java @@ -1,12 +1,11 @@ package com.pig4cloud.pig.admin.api.feign; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.NoToken; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestHeader; /** * @author lengleng @@ -17,13 +16,14 @@ import org.springframework.web.bind.annotation.RequestHeader; @FeignClient(contextId = "remoteParamService", value = ServiceNameConstants.UMPS_SERVICE) public interface RemoteParamService { - /** - * 通过key 查询参数配置 - * @param key key - * @param from 声明成内部调用,避免MQ 等无法调用 - * @return - */ - @GetMapping("/param/publicValue/{key}") - R getByKey(@PathVariable("key") String key, @RequestHeader(SecurityConstants.FROM) String from); + /** + * 通过key 查询参数配置 + * + * @param key key + * @NoToken 声明成内部调用,避免MQ 等无法调用 + */ + @NoToken + @GetMapping("/param/publicValue/{key}") + R getByKey(@PathVariable("key") String key); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java index 85d64872..725d9c76 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteTokenService.java @@ -18,9 +18,9 @@ package com.pig4cloud.pig.admin.api.feign; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.NoToken; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -33,34 +33,34 @@ import java.util.Map; @FeignClient(contextId = "remoteTokenService", value = ServiceNameConstants.AUTH_SERVICE) public interface RemoteTokenService { - /** - * 分页查询token 信息 - * @param from 内部调用标志 - * @param params 分页参数 - * @param from 内部调用标志 - * @return page - */ - @PostMapping("/token/page") - R getTokenPage(@RequestBody Map params, @RequestHeader(SecurityConstants.FROM) String from); + /** + * 分页查询token 信息 + * + * @param params 分页参数 + * @return page + */ + @NoToken + @PostMapping("/token/page") + R getTokenPage(@RequestBody Map params); - /** - * 删除token - * @param from 内部调用标志 - * @param token token - * @param from 内部调用标志 - * @return - */ - @DeleteMapping("/token/{token}") - R removeTokenById(@PathVariable("token") String token, @RequestHeader(SecurityConstants.FROM) String from); + /** + * 删除token + * + * @param token token + * @return + */ + @NoToken + @DeleteMapping("/token/remove/{token}") + R removeTokenById(@PathVariable("token") String token); - /** - * 校验令牌获取用户信息 - * @param token - * @param from - * @return - */ - @GetMapping("/token/query-token") - R> queryToken(@RequestParam("token") String token, - @RequestHeader(SecurityConstants.FROM) String from); + /** + * 校验令牌获取用户信息 + * + * @param token + * @return + */ + @NoToken + @GetMapping("/token/query-token") + R> queryToken(@RequestParam("token") String token); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java index e1f6b4da..3e77e0d8 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java @@ -21,15 +21,12 @@ package com.pig4cloud.pig.admin.api.feign; import com.pig4cloud.pig.admin.api.dto.UserDTO; import com.pig4cloud.pig.admin.api.dto.UserInfo; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.constant.ServiceNameConstants; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.NoToken; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.SpringQueryMap; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestHeader; /** * @author lengleng @@ -38,22 +35,15 @@ import org.springframework.web.bind.annotation.RequestHeader; @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UMPS_SERVICE) public interface RemoteUserService { - /** - * 通过用户名查询用户、角色信息 - * @param user 用户查询对象 - * @param from 调用标志 - * @return R - */ - @GetMapping("/user/info/query") - R info(@SpringQueryMap UserDTO user, @RequestHeader(SecurityConstants.FROM) String from); - - /** - * 锁定用户 - * @param username 用户名 - * @param from 调用标识 - * @return - */ - @PutMapping("/user/lock/{username}") - R lockUser(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + /** + * (未登录状态调用,需要加 @NoToken) + * 通过用户名查询用户、角色信息 + * + * @param user 用户查询对象 + * @return R + */ + @NoToken + @GetMapping("/user/info/query") + R info(@SpringQueryMap UserDTO user); } diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java index 51d0337b..9b4e43a0 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/util/ParamResolver.java @@ -3,7 +3,6 @@ package com.pig4cloud.pig.admin.api.util; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.admin.api.feign.RemoteParamService; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.SpringContextHolder; import lombok.experimental.UtilityClass; @@ -44,7 +43,7 @@ public class ParamResolver { RemoteParamService remoteParamService = SpringContextHolder.getBean(RemoteParamService.class); - String result = remoteParamService.getByKey(key, SecurityConstants.FROM_IN).getData(); + String result = remoteParamService.getByKey(key).getData(); if (StrUtil.isNotBlank(result)) { return Convert.convert(clazz, result); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java index 0865d90c..bd7fa70d 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysTokenController.java @@ -18,7 +18,6 @@ package com.pig4cloud.pig.admin.controller; import com.pig4cloud.pig.admin.api.feign.RemoteTokenService; -import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -53,7 +52,7 @@ public class SysTokenController { */ @RequestMapping("/page") public R getTokenPage(@RequestBody Map params) { - return remoteTokenService.getTokenPage(params, SecurityConstants.FROM_IN); + return remoteTokenService.getTokenPage(params); } /** @@ -66,7 +65,7 @@ public class SysTokenController { @PreAuthorize("@pms.hasPermission('sys_token_del')") public R removeById(@RequestBody String[] tokens) { for (String token : tokens) { - remoteTokenService.removeTokenById(token, SecurityConstants.FROM_IN); + remoteTokenService.removeTokenById(token); } return R.ok(); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java index 48f2467f..5a436145 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java @@ -38,7 +38,6 @@ import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import javax.validation.Valid; import lombok.AllArgsConstructor; import org.springdoc.api.annotations.ParameterObject; import org.springframework.http.HttpHeaders; @@ -46,6 +45,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; /** @@ -202,7 +202,6 @@ public class SysUserController { * @param username 用户名 * @return R */ - @Inner @PutMapping("/lock/{username}") public R lockUser(@PathVariable String username) { return userService.lockUser(username); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index 42525864..f65a2aca 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -22,7 +22,6 @@ package com.pig4cloud.pig.admin.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -436,10 +435,7 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override public R checkPassword(String password) { - String username = SecurityUtils.getUser().getUsername(); - SysUser condition = new SysUser(); - condition.setUsername(username); - SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); + SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); if (!ENCODER.matches(password, sysUser.getPassword())) { log.info("原密码错误"); -- Gitee From 52452222eeb4f01cb6808d0a9bad145b7716cb03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sat, 1 Jun 2024 11:41:42 +0800 Subject: [PATCH 229/238] =?UTF-8?q?=F0=9F=94=90=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/api/feign/RemoteClientDetailsService.java | 9 --------- .../pig/admin/controller/SysClientController.java | 11 +---------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java index d95ccebc..6033d742 100644 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteClientDetailsService.java @@ -29,8 +29,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestHeader; -import java.util.List; - /** * @author lengleng * @date 2020/12/05 @@ -48,12 +46,5 @@ public interface RemoteClientDetailsService { @GetMapping("/client/getClientDetailsById/{clientId}") R getClientDetailsById(@PathVariable("clientId") String clientId); - /** - * 查询全部客户端 - * @param from 调用标识 - * @return R - */ - @GetMapping("/client/list") - R> listClientDetails(@RequestHeader(SecurityConstants.FROM) String from); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java index 708fa28f..418bb58a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysClientController.java @@ -124,22 +124,13 @@ public class SysClientController { return R.ok(clientDetailsService.updateClientById(clientDetails)); } - @Inner(false) + @Inner @GetMapping("/getClientDetailsById/{clientId}") public R getClientDetailsById(@PathVariable String clientId) { return R.ok(clientDetailsService.getOne( Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false)); } - /** - * 查询全部客户端 - * @return - */ - @Inner(false) - @GetMapping("/list") - public R listClients() { - return R.ok(clientDetailsService.list()); - } /** * 同步缓存字典 -- Gitee From 1516dd709ac60023b3637fe35a22db8e4b00d52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 21 Jul 2024 16:05:39 +0800 Subject: [PATCH 230/238] =?UTF-8?q?=E2=9C=A8=20add=20=20NoToken=20Feign=20?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E8=87=AA=E5=8A=A8=E7=BB=B4=E6=8A=A4header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PigRemoteRegisteredClientRepository.java | 189 +++++---- .../admin/controller/SysDictController.java | 401 +++++++++--------- 2 files changed, 288 insertions(+), 302 deletions(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java index 9e7c217c..7d805801 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java @@ -33,98 +33,101 @@ import java.util.Optional; @RequiredArgsConstructor public class PigRemoteRegisteredClientRepository implements RegisteredClientRepository { - /** - * 刷新令牌有效期默认 30 天 - */ - private final static int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; - - /** - * 请求令牌有效期默认 12 小时 - */ - private final static int accessTokenValiditySeconds = 60 * 60 * 12; - - private final RemoteClientDetailsService clientDetailsService; - - /** - * Saves the registered client. - * - *

        - * IMPORTANT: Sensitive information should be encoded externally from the - * implementation, e.g. {@link RegisteredClient#getClientSecret()} - * @param registeredClient the {@link RegisteredClient} - */ - @Override - public void save(RegisteredClient registeredClient) { - } - - /** - * Returns the registered client identified by the provided {@code id}, or - * {@code null} if not found. - * @param id the registration identifier - * @return the {@link RegisteredClient} if found, otherwise {@code null} - */ - @Override - public RegisteredClient findById(String id) { - throw new UnsupportedOperationException(); - } - - /** - * Returns the registered client identified by the provided {@code clientId}, or - * {@code null} if not found. - * @param clientId the client identifier - * @return the {@link RegisteredClient} if found, otherwise {@code null} - */ - - /** - * 重写原生方法支持redis缓存 - * @param clientId - * @return - */ - @Override - @SneakyThrows - @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") - public RegisteredClient findByClientId(String clientId) { - - SysOauthClientDetails clientDetails = RetOps - .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)) - .getData() - .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( - new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); - - RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) - .clientId(clientDetails.getClientId()) - .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) - .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); - - for (String authorizedGrantType : clientDetails.getAuthorizedGrantTypes()) { - builder.authorizationGrantType(new AuthorizationGrantType(authorizedGrantType)); - } - - // 回调地址 - Optional.ofNullable(clientDetails.getWebServerRedirectUri()) - .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) - .filter(StrUtil::isNotBlank) - .forEach(builder::redirectUri)); - - // scope - Optional.ofNullable(clientDetails.getScope()) - .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) - .filter(StrUtil::isNotBlank) - .forEach(builder::scope)); - - return builder - .tokenSettings(TokenSettings.builder() - .accessTokenFormat(OAuth2TokenFormat.REFERENCE) - .accessTokenTimeToLive(Duration.ofSeconds( - Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) - .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) - .orElse(refreshTokenValiditySeconds))) - .build()) - .clientSettings(ClientSettings.builder() - .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) - .build()) - .build(); - - } + /** + * 刷新令牌有效期默认 30 天 + */ + private final static int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; + + /** + * 请求令牌有效期默认 12 小时 + */ + private final static int accessTokenValiditySeconds = 60 * 60 * 12; + + private final RemoteClientDetailsService clientDetailsService; + + /** + * Saves the registered client. + * + *

        + * IMPORTANT: Sensitive information should be encoded externally from the + * implementation, e.g. {@link RegisteredClient#getClientSecret()} + * + * @param registeredClient the {@link RegisteredClient} + */ + @Override + public void save(RegisteredClient registeredClient) { + } + + /** + * Returns the registered client identified by the provided {@code id}, or + * {@code null} if not found. + * + * @param id the registration identifier + * @return the {@link RegisteredClient} if found, otherwise {@code null} + */ + @Override + public RegisteredClient findById(String id) { + throw new UnsupportedOperationException(); + } + + /** + * Returns the registered client identified by the provided {@code clientId}, or + * {@code null} if not found. + * @param clientId the client identifier + * @return the {@link RegisteredClient} if found, otherwise {@code null} + */ + + /** + * 重写原生方法支持redis缓存 + * + * @param clientId + * @return + */ + @Override + @SneakyThrows + @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") + public RegisteredClient findByClientId(String clientId) { + + SysOauthClientDetails clientDetails = RetOps + .of(clientDetailsService.getClientDetailsById(clientId)) + .getData() + .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( + new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); + + RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) + .clientId(clientDetails.getClientId()) + .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + + for (String authorizedGrantType : clientDetails.getAuthorizedGrantTypes()) { + builder.authorizationGrantType(new AuthorizationGrantType(authorizedGrantType)); + } + + // 回调地址 + Optional.ofNullable(clientDetails.getWebServerRedirectUri()) + .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::redirectUri)); + + // scope + Optional.ofNullable(clientDetails.getScope()) + .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::scope)); + + return builder + .tokenSettings(TokenSettings.builder() + .accessTokenFormat(OAuth2TokenFormat.REFERENCE) + .accessTokenTimeToLive(Duration.ofSeconds( + Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) + .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) + .orElse(refreshTokenValiditySeconds))) + .build()) + .clientSettings(ClientSettings.builder() + .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) + .build()) + .build(); + + } } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index 28c06926..1ee262fb 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -34,7 +34,6 @@ import com.pig4cloud.pig.common.security.annotation.Inner; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import javax.validation.Valid; import lombok.AllArgsConstructor; import org.springdoc.api.annotations.ParameterObject; import org.springframework.cache.annotation.CacheEvict; @@ -43,6 +42,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; /** @@ -60,213 +60,196 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SysDictController { - private final SysDictService sysDictService; - - private final SysDictItemService sysDictItemService; - - /** - * 通过ID查询字典信息 - * - * @param id ID - * @return 字典信息 - */ - @GetMapping("/details/{id}") - public R getById(@PathVariable Long id) { - return R.ok(sysDictService.getById(id)); - } - - /** - * 查询字典信息 - * - * @param query 查询信息 - * @return 字典信息 - */ - @GetMapping("/details") - public R getDetails(@ParameterObject SysDict query) { - return R.ok(sysDictService.getOne(Wrappers.query(query), false)); - } - - /** - * 分页查询字典信息 - * - * @param page 分页对象 - * @return 分页对象 - */ - @GetMapping("/page") - public R getDictPage(@ParameterObject Page page, @ParameterObject SysDict sysDict) { - return R.ok(sysDictService.page(page, - Wrappers.lambdaQuery() - .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, sysDict.getSystemFlag()) - .like(StrUtil.isNotBlank(sysDict.getDictType()), SysDict::getDictType, sysDict.getDictType()))); - } - - - /** - * 添加字典 - * - * @param sysDict 字典信息 - * @return success、false - */ - @SysLog("添加字典") - @PostMapping - @PreAuthorize("@pms.hasPermission('sys_dict_add')") - public R save(@Valid @RequestBody SysDict sysDict) { - sysDictService.save(sysDict); - return R.ok(sysDict); - } - - /** - * 删除字典,并且清除字典缓存 - * - * @param ids ID - * @return R - */ - @SysLog("删除字典") - @DeleteMapping - @PreAuthorize("@pms.hasPermission('sys_dict_del')") - @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public R removeById(@RequestBody Long[] ids) { - return R.ok(sysDictService.removeDictByIds(ids)); - } - - /** - * 修改字典 - * - * @param sysDict 字典信息 - * @return success/false - */ - @PutMapping - @SysLog("修改字典") - @PreAuthorize("@pms.hasPermission('sys_dict_edit')") - public R updateById(@Valid @RequestBody SysDict sysDict) { - return sysDictService.updateDict(sysDict); - } - - /** - * 分页查询 - * - * @param name 名称或者字典项 - * @return - */ - @GetMapping("/list") - public R getDictList(String name) { - return R.ok(sysDictService.list(Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(name), SysDict::getDictType, name) - .or() - .like(StrUtil.isNotBlank(name), SysDict::getDescription, name))); - } - - /** - * 分页查询 - * - * @param page 分页对象 - * @param sysDictItem 字典项 - * @return - */ - @GetMapping("/item/page") - public R getSysDictItemPage(Page page, SysDictItem sysDictItem) { - return R.ok(sysDictItemService.page(page, Wrappers.query(sysDictItem))); - } - - /** - * 通过id查询字典项 - * - * @param id id - * @return R - */ - @GetMapping("/item/details/{id}") - public R getDictItemById(@PathVariable("id") Long id) { - return R.ok(sysDictItemService.getById(id)); - } - - /** - * 查询字典项详情 - * - * @param query 查询条件 - * @return R - */ - @GetMapping("/item/details") - public R getDictItemDetails(SysDictItem query) { - return R.ok(sysDictItemService.getOne(Wrappers.query(query), false)); - } - - /** - * 新增字典项 - * - * @param sysDictItem 字典项 - * @return R - */ - @SysLog("新增字典项") - @PostMapping("/item") - @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) - public R save(@RequestBody SysDictItem sysDictItem) { - return R.ok(sysDictItemService.save(sysDictItem)); - } - - /** - * 修改字典项 - * - * @param sysDictItem 字典项 - * @return R - */ - @SysLog("修改字典项") - @PutMapping("/item") - public R updateById(@RequestBody SysDictItem sysDictItem) { - return sysDictItemService.updateDictItem(sysDictItem); - } - - /** - * 通过id删除字典项 - * - * @param id id - * @return R - */ - @SysLog("删除字典项") - @DeleteMapping("/item/{id}") - public R removeDictItemById(@PathVariable Long id) { - return sysDictItemService.removeDictItem(id); - } - - /** - * 同步缓存字典 - * - * @return R - */ - @SysLog("同步字典") - @PutMapping("/sync") - public R sync() { - return sysDictService.syncDictCache(); - } - - @ResponseExcel - @GetMapping("/export") - public List export(SysDictItem sysDictItem) { - return sysDictItemService.list(Wrappers.query(sysDictItem)); - } - - /** - * 通过字典类型查找字典 - * - * @param type 类型 - * @return 同类型字典 - */ - @GetMapping("/type/{type}") - @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") - public R> getDictByType(@PathVariable String type) { - return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); - } - - /** - * 通过字典类型查找字典 (针对feign调用) - * TODO: 兼容性方案,代码重复 - * @param type 类型 - * @return 同类型字典 - */ - @Inner - @GetMapping("/remote/type/{type}") - @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") - public R> getRemoteDictByType(@PathVariable String type) { - return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); - } + private final SysDictService sysDictService; + + private final SysDictItemService sysDictItemService; + + /** + * 通过ID查询字典信息 + * @param id ID + * @return 字典信息 + */ + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysDictService.getById(id)); + } + + /** + * 查询字典信息 + * @param query 查询信息 + * @return 字典信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysDict query) { + return R.ok(sysDictService.getOne(Wrappers.query(query), false)); + } + + /** + * 分页查询字典信息 + * @param page 分页对象 + * @return 分页对象 + */ + @GetMapping("/page") + public R getDictPage(@ParameterObject Page page, @ParameterObject SysDict sysDict) { + return R.ok(sysDictService.page(page, + Wrappers.lambdaQuery() + .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, sysDict.getSystemFlag()) + .like(StrUtil.isNotBlank(sysDict.getDictType()), SysDict::getDictType, sysDict.getDictType()))); + } + + /** + * 添加字典 + * @param sysDict 字典信息 + * @return success、false + */ + @SysLog("添加字典") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_dict_add')") + public R save(@Valid @RequestBody SysDict sysDict) { + sysDictService.save(sysDict); + return R.ok(sysDict); + } + + /** + * 删除字典,并且清除字典缓存 + * @param ids ID + * @return R + */ + @SysLog("删除字典") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_dict_del')") + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysDictService.removeDictByIds(ids)); + } + + /** + * 修改字典 + * @param sysDict 字典信息 + * @return success/false + */ + @PutMapping + @SysLog("修改字典") + @PreAuthorize("@pms.hasPermission('sys_dict_edit')") + public R updateById(@Valid @RequestBody SysDict sysDict) { + return sysDictService.updateDict(sysDict); + } + + /** + * 分页查询 + * @param name 名称或者字典项 + * @return + */ + @GetMapping("/list") + public R getDictList(String name) { + return R.ok(sysDictService.list(Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(name), SysDict::getDictType, name) + .or() + .like(StrUtil.isNotBlank(name), SysDict::getDescription, name))); + } + + /** + * 分页查询 + * @param page 分页对象 + * @param sysDictItem 字典项 + * @return + */ + @GetMapping("/item/page") + public R getSysDictItemPage(Page page, SysDictItem sysDictItem) { + return R.ok(sysDictItemService.page(page, Wrappers.query(sysDictItem))); + } + + /** + * 通过id查询字典项 + * @param id id + * @return R + */ + @GetMapping("/item/details/{id}") + public R getDictItemById(@PathVariable("id") Long id) { + return R.ok(sysDictItemService.getById(id)); + } + + /** + * 查询字典项详情 + * @param query 查询条件 + * @return R + */ + @GetMapping("/item/details") + public R getDictItemDetails(SysDictItem query) { + return R.ok(sysDictItemService.getOne(Wrappers.query(query), false)); + } + + /** + * 新增字典项 + * @param sysDictItem 字典项 + * @return R + */ + @SysLog("新增字典项") + @PostMapping("/item") + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R save(@RequestBody SysDictItem sysDictItem) { + return R.ok(sysDictItemService.save(sysDictItem)); + } + + /** + * 修改字典项 + * @param sysDictItem 字典项 + * @return R + */ + @SysLog("修改字典项") + @PutMapping("/item") + public R updateById(@RequestBody SysDictItem sysDictItem) { + return sysDictItemService.updateDictItem(sysDictItem); + } + + /** + * 通过id删除字典项 + * @param id id + * @return R + */ + @SysLog("删除字典项") + @DeleteMapping("/item/{id}") + public R removeDictItemById(@PathVariable Long id) { + return sysDictItemService.removeDictItem(id); + } + + /** + * 同步缓存字典 + * @return R + */ + @SysLog("同步字典") + @PutMapping("/sync") + public R sync() { + return sysDictService.syncDictCache(); + } + + @ResponseExcel + @GetMapping("/export") + public List export(SysDictItem sysDictItem) { + return sysDictItemService.list(Wrappers.query(sysDictItem)); + } + + /** + * 通过字典类型查找字典 + * @param type 类型 + * @return 同类型字典 + */ + @GetMapping("/type/{type}") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") + public R> getDictByType(@PathVariable String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); + } + + /** + * 通过字典类型查找字典 (针对feign调用) TODO: 兼容性方案,代码重复 + * @param type 类型 + * @return 同类型字典 + */ + @Inner + @GetMapping("/remote/type/{type}") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") + public R> getRemoteDictByType(@PathVariable String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); + } } -- Gitee From 468057ed48d9090cc5bc966dc821427c814500c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 22 Jul 2024 11:00:47 +0800 Subject: [PATCH 231/238] =?UTF-8?q?=E2=9C=A8=20add=20=20NoToken=20Feign=20?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E8=87=AA=E5=8A=A8=E7=BB=B4=E6=8A=A4header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/PigFeignAutoConfiguration.java | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index 4af9c4e2..6f5772f4 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -20,6 +20,7 @@ import com.alibaba.cloud.sentinel.feign.SentinelFeignAutoConfiguration; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pig.common.feign.core.PigFeignInnerRequestInterceptor; import com.pig4cloud.pig.common.feign.core.PigFeignRequestCloseInterceptor; import com.pig4cloud.pig.common.feign.sentinel.ext.PigSentinelFeign; import com.pig4cloud.pig.common.feign.sentinel.handle.PigUrlBlockHandler; @@ -46,33 +47,43 @@ import org.springframework.context.annotation.Scope; @AutoConfigureBefore(SentinelFeignAutoConfiguration.class) public class PigFeignAutoConfiguration { - @Bean - @Scope("prototype") - @ConditionalOnMissingBean - @ConditionalOnProperty(name = "feign.sentinel.enabled") - public Feign.Builder feignSentinelBuilder() { - return PigSentinelFeign.builder(); - } + @Bean + @Scope("prototype") + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "feign.sentinel.enabled") + public Feign.Builder feignSentinelBuilder() { + return PigSentinelFeign.builder(); + } - @Bean - @ConditionalOnMissingBean - public BlockExceptionHandler blockExceptionHandler(ObjectMapper objectMapper) { - return new PigUrlBlockHandler(objectMapper); - } + @Bean + @ConditionalOnMissingBean + public BlockExceptionHandler blockExceptionHandler(ObjectMapper objectMapper) { + return new PigUrlBlockHandler(objectMapper); + } - @Bean - @ConditionalOnMissingBean - public RequestOriginParser requestOriginParser() { - return new PigHeaderRequestOriginParser(); - } + @Bean + @ConditionalOnMissingBean + public RequestOriginParser requestOriginParser() { + return new PigHeaderRequestOriginParser(); + } - /** - * set connection close header - * @return RequestInterceptor - */ - @Bean - public RequestInterceptor pigFeignRequestCloseInterceptor() { - return new PigFeignRequestCloseInterceptor(); - } + /** + * set connection close header + * + * @return RequestInterceptor + */ + @Bean + public RequestInterceptor pigFeignRequestCloseInterceptor() { + return new PigFeignRequestCloseInterceptor(); + } + /** + * pig feign 内部请求拦截器 + * + * @return {@link RequestInterceptor } + */ + @Bean + public RequestInterceptor pigFeignInnerRequestInterceptor() { + return new PigFeignInnerRequestInterceptor(); + } } -- Gitee From 39bd777750ba2fb35462be936c2682cc8ede8384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 22 Jul 2024 11:01:45 +0800 Subject: [PATCH 232/238] =?UTF-8?q?refactor(=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90):=20=E6=94=AF=E6=8C=81=E6=A8=A1=E6=9D=BF=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E6=9B=B4=E6=96=B0=E5=92=8C=E6=9B=B4=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=BA=93=20schema=20=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pig-visual/pig-codegen/pom.xml | 270 ++++++++++-------- .../pig/codegen/PigCodeGenApplication.java | 2 + .../config/PigCodeGenDefaultProperties.java | 76 +++++ .../controller/GenDsConfController.java | 10 +- .../controller/GenGroupController.java | 10 +- .../controller/GenTableController.java | 100 +++---- .../controller/GenTemplateController.java | 30 +- .../controller/GeneratorController.java | 1 - .../pig/codegen/entity/GenTable.java | 21 ++ .../pig/codegen/mapper/GenGroupMapper.java | 4 +- .../pig/codegen/mapper/GeneratorMapper.java | 97 ------- .../codegen/mapper/GeneratorMysqlMapper.java | 31 -- .../pig/codegen/service/GenGroupService.java | 10 +- .../service/GenTableColumnService.java | 10 - .../pig/codegen/service/GenTableService.java | 45 +-- .../codegen/service/GenTemplateService.java | 13 + .../impl/GenDatasourceConfServiceImpl.java | 11 +- .../service/impl/GenGroupServiceImpl.java | 6 +- .../impl/GenTableColumnServiceImpl.java | 1 + .../service/impl/GenTableServiceImpl.java | 191 ++++++++----- .../service/impl/GenTemplateServiceImpl.java | 160 +++++++++++ .../service/impl/GeneratorServiceImpl.java | 63 +++- .../pig/codegen/util/AutoFillEnum.java | 12 + .../codegen/util/CommonColumnFiledEnum.java | 16 +- .../pig4cloud/pig/codegen/util/GenKit.java | 42 --- .../pig/codegen/util/GeneratorStyleEnum.java | 29 ++ .../pig/codegen/util/GeneratorTypeEnum.java | 21 -- .../pig/codegen/util/VFormConfigConsts.java | 25 ++ .../pig/codegen/util/VFormTypeEnum.java | 22 ++ .../pig/codegen/util/vo/GenCreateTableVO.java | 95 ++++++ .../codegen/util/vo/GenTemplateFileVO.java | 38 +++ .../pig/codegen/util/vo/GroupVo.java | 2 +- .../main/resources/mapper/GenGroupMapper.xml | 4 +- .../main/resources/mapper/GenTableMapper.xml | 5 +- .../resources/mapper/GeneratorMySqlMapper.xml | 48 ---- .../src/main/resources/template/config.json | 12 - 36 files changed, 943 insertions(+), 590 deletions(-) create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/config/PigCodeGenDefaultProperties.java delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java delete mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/AutoFillEnum.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorStyleEnum.java delete mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorTypeEnum.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormConfigConsts.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormTypeEnum.java create mode 100755 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenCreateTableVO.java create mode 100644 pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenTemplateFileVO.java delete mode 100755 pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml delete mode 100644 pig-visual/pig-codegen/src/main/resources/template/config.json diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index 3243edb5..c3fe29e1 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -1,135 +1,151 @@ - - - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + + com.pig4cloud + pig-visual + ${revision} + - - com.pig4cloud - pig-visual - ${revision} - + pig-codegen + jar - pig-codegen - jar + 代码生成模块 - 代码生成模块 + + 0.0.6 + 8.7.2-20240717 + 1.10 + - - - - com.pig4cloud - pig-common-swagger - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.pig4cloud - pig-common-feign - - - - com.pig4cloud - pig-common-datasource - - - com.baomidou - mybatis-plus-boot-starter - - - com.mysql - mysql-connector-j - - - - cn.hutool - hutool-json - - - com.pig4cloud - pig-common-core - - - commons-configuration - commons-configuration - ${configuration.version} - - - - com.pig4cloud - pig-common-log - - - - com.pig4cloud - pig-common-security - - - - org.apache.velocity - velocity-engine-core - ${velocity.version} - - - org.apache.velocity.tools - velocity-tools-generic - ${velocity.tool.version} - - - - io.springboot.plugin - screw-spring-boot-starter - ${screw.version} - - - - org.springframework.boot - spring-boot-starter-undertow - - + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pig-common-mybatis + + + + com.pig4cloud + pig-common-datasource + + + + com.baomidou + mybatis-plus-boot-starter + + + com.mysql + mysql-connector-j + + + + org.anyline + anyline-environment-spring-data-jdbc + ${anyline.version} + + + org.anyline + anyline-data-jdbc-mysql + ${anyline.version} + + + + com.pig4cloud + pig-common-core + + + cn.hutool + hutool-json + + + commons-configuration + commons-configuration + ${configuration.version} + + + + com.pig4cloud + pig-common-swagger + + + + com.pig4cloud + pig-common-xss + + + com.pig4cloud + pig-common-security + + + com.pig4cloud + pig-common-log + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + org.apache.velocity.tools + velocity-tools-generic + ${velocity.tool.version} + + + + group.springframework.plugin + screw-spring-boot-starter + ${screw.version} + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-undertow + + - - - boot - - - cloud - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - - - + + + cloud + + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + false + + + + + + + boot + + diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java index d49de955..fe8dcfba 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/PigCodeGenApplication.java @@ -19,6 +19,7 @@ package com.pig4cloud.pig.codegen; import com.pig4cloud.pig.common.datasource.annotation.EnableDynamicDataSource; import com.pig4cloud.pig.common.security.annotation.EnablePigResourceServer; +import com.pig4cloud.pig.common.swagger.annotation.EnablePigDoc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @@ -28,6 +29,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; * @date 2018/07/29 代码生成模块 */ @EnableDynamicDataSource +@EnablePigDoc("gen") @EnableDiscoveryClient @EnablePigResourceServer @SpringBootApplication diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/config/PigCodeGenDefaultProperties.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/config/PigCodeGenDefaultProperties.java new file mode 100644 index 00000000..0e8a48f5 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/config/PigCodeGenDefaultProperties.java @@ -0,0 +1,76 @@ +package com.pig4cloud.pig.codegen.config; + +import cn.smallbun.screw.core.constant.DefaultConstants; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 代码生成默认配置类 + * + * @author lengleng + * @date 2024/7/15 + */ +@Data +@Configuration(proxyBeanMethods = false) +@ConfigurationProperties(prefix = PigCodeGenDefaultProperties.PREFIX) +public class PigCodeGenDefaultProperties { + + public static final String PREFIX = "codegen"; + + /** + * 是否开启在线更新 + */ + private boolean autoCheckVersion = true; + + /** + * 模板项目地址 + */ + private String onlineUrl = DefaultConstants.CGTM_URL; + + /** + * 生成代码的包名 + */ + private String packageName = "com.pig4cloud.pig"; + + /** + * 生成代码的版本 + */ + private String version = "1.0.0"; + + /** + * 生成代码的模块名 + */ + private String moduleName = "admin"; + + /** + * 生成代码的后端路径 + */ + private String backendPath = "pig"; + + /** + * 生成代码的前端路径 + */ + private String frontendPath = "pig-ui"; + + /** + * 生成代码的作者 + */ + private String author = "pig"; + + /** + * 生成代码的邮箱 + */ + private String email = "sw@pigx.vip"; + + /** + * 表单布局(一列、两列) + */ + private Integer formLayout = 2; + + /** + * 下载方式 (0 文件下载、1写入目录) + */ + private String generatorType = "0"; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java index ec22c8ed..133480b6 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenDsConfController.java @@ -18,7 +18,6 @@ package com.pig4cloud.pig.codegen.controller; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.ContentType; import cn.smallbun.screw.boot.config.Screw; import cn.smallbun.screw.boot.properties.ScrewProperties; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; @@ -30,6 +29,7 @@ import com.pig4cloud.pig.codegen.service.GenDatasourceConfService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.SpringContextHolder; import com.pig4cloud.pig.common.security.annotation.Inner; +import com.pig4cloud.pig.common.xss.core.XssCleanIgnore; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.http.HttpHeaders; @@ -93,6 +93,7 @@ public class GenDsConfController { * @return R */ @PostMapping + @XssCleanIgnore public R save(@RequestBody GenDatasourceConf datasourceConf) { return R.ok(datasourceConfService.saveDsByEnc(datasourceConf)); } @@ -103,6 +104,7 @@ public class GenDsConfController { * @return R */ @PutMapping + @XssCleanIgnore public R updateById(@RequestBody GenDatasourceConf conf) { return R.ok(datasourceConfService.updateDsByEnc(conf)); } @@ -133,11 +135,11 @@ public class GenDsConfController { ScrewProperties screwProperties = SpringContextHolder.getBean(ScrewProperties.class); // 生成 - byte[] data = screw.documentGeneration(dataSource, screwProperties).toByteArray(); + byte[] data = screw.documentGeneration(dsName, dataSource, screwProperties).toByteArray(); response.reset(); response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length)); - response.setContentType(ContentType.OCTET_STREAM.getValue()); - IoUtil.write(response.getOutputStream(), Boolean.TRUE, data); + response.setContentType("application/octet-stream"); + IoUtil.write(response.getOutputStream(), Boolean.FALSE, data); } } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java index c603101f..ecf3a493 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenGroupController.java @@ -23,7 +23,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.codegen.entity.GenGroupEntity; import com.pig4cloud.pig.codegen.service.GenGroupService; -import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.GroupVO; import com.pig4cloud.pig.codegen.util.vo.TemplateGroupDTO; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; @@ -104,7 +104,7 @@ public class GenGroupController { @SysLog("修改模板分组") @PutMapping @PreAuthorize("@pms.hasPermission('codegen_group_edit')") - public R updateById(@RequestBody GroupVo groupVo) { + public R updateById(@RequestBody GroupVO groupVo) { genGroupService.updateGroupAndTemplateById(groupVo); return R.ok(); } @@ -135,10 +135,14 @@ public class GenGroupController { return genGroupService.list(Wrappers.query(genGroup)); } + /** + * @return 响应信息主体 + */ @GetMapping("/list") @Operation(summary = "查询列表", description = "查询列表") public R list() { - List list = genGroupService.list(); + List list = genGroupService + .list(Wrappers.lambdaQuery().orderByDesc(GenGroupEntity::getCreateTime)); return R.ok(list); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java index 4ee48193..e03449ee 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTableController.java @@ -61,86 +61,57 @@ public class GenTableController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") public R getTablePage(Page page, GenTable table) { - - return R.ok(tableService.list(page, table)); + return R.ok(tableService.queryTablePage(page, table)); } /** - * 通过id查询列属性 + * 通过id查询表信息(代码生成设置 + 表 + 字段设置) * @param id id * @return R */ @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") - public R getById(@PathVariable("id") Long id) { + public R getTable(@PathVariable("id") Long id) { return R.ok(tableService.getById(id)); } /** - * 新增列属性 - * @param table 列属性 - * @return R - */ - @Operation(summary = "新增列属性", description = "新增列属性") - @SysLog("新增列属性") - @PostMapping - public R save(@RequestBody GenTable table) { - return R.ok(tableService.save(table)); - } - - /** - * 修改列属性 - * @param table 列属性 - * @return R + * 查询数据源所有表 + * @param dsName 数据源 */ - @Operation(summary = "修改列属性", description = "修改列属性") - @SysLog("修改列属性") - @PutMapping - public R updateById(@RequestBody GenTable table) { - return R.ok(tableService.updateById(table)); + @GetMapping("/list/{dsName}") + public R listTable(@PathVariable("dsName") String dsName) { + return R.ok(tableService.queryTableList(dsName)); } /** - * 通过id删除列属性 - * @param id id - * @return R + * 获取表信息 + * @param dsName 数据源 + * @param tableName 表名称 */ - @Operation(summary = "通过id删除列属性", description = "通过id删除列属性") - @SysLog("通过id删除列属性") - @DeleteMapping("/{id}") - public R removeById(@PathVariable Long id) { - return R.ok(tableService.removeById(id)); + @GetMapping("/{dsName}/{tableName}") + public R getTable(@PathVariable("dsName") String dsName, @PathVariable String tableName) { + return R.ok(tableService.queryOrBuildTable(dsName, tableName)); } /** - * 导出excel 表格 - * @param table 查询条件 - * @return excel 文件流 + * 查询表DDL语句 + * @param dsName 数据源 + * @param tableName 表名称 */ - @ResponseExcel - @GetMapping("/export") - public List export(GenTable table) { - return tableService.list(Wrappers.query(table)); - } - - @GetMapping("/list/{dsName}") - public R listTable(@PathVariable("dsName") String dsName) { - return R.ok(tableService.queryDsAllTable(dsName)); - } - @GetMapping("/column/{dsName}/{tableName}") - public R column(@PathVariable("dsName") String dsName, @PathVariable String tableName) { - return R.ok(tableService.queryColumn(dsName, tableName)); + public R getColumn(@PathVariable("dsName") String dsName, @PathVariable String tableName) throws Exception { + return R.ok(tableService.queryTableColumn(dsName, tableName)); } /** - * 获取表信息 + * 查询表DDL语句 * @param dsName 数据源 * @param tableName 表名称 */ - @GetMapping("/{dsName}/{tableName}") - public R info(@PathVariable("dsName") String dsName, @PathVariable String tableName) { - return R.ok(tableService.queryOrBuildTable(dsName, tableName)); + @GetMapping("/ddl/{dsName}/{tableName}") + public R getDdl(@PathVariable("dsName") String dsName, @PathVariable String tableName) throws Exception { + return R.ok(tableService.queryTableDdl(dsName, tableName)); } /** @@ -149,7 +120,7 @@ public class GenTableController { * @param tableName 表名称 */ @GetMapping("/sync/{dsName}/{tableName}") - public R sync(@PathVariable("dsName") String dsName, @PathVariable String tableName) { + public R syncTable(@PathVariable("dsName") String dsName, @PathVariable String tableName) { // 表配置删除 tableService.remove( Wrappers.lambdaQuery().eq(GenTable::getDsName, dsName).eq(GenTable::getTableName, tableName)); @@ -160,6 +131,18 @@ public class GenTableController { return R.ok(tableService.queryOrBuildTable(dsName, tableName)); } + /** + * 修改列属性 + * @param table 列属性 + * @return R + */ + @Operation(summary = "修改列属性", description = "修改列属性") + @SysLog("修改列属性") + @PutMapping + public R updateById(@RequestBody GenTable table) { + return R.ok(tableService.updateById(table)); + } + /** * 修改表字段数据 * @param dsName 数据源 @@ -173,4 +156,15 @@ public class GenTableController { return R.ok(); } + /** + * 导出excel 表格 + * @param table 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + public List export(GenTable table) { + return tableService.list(Wrappers.query(table)); + } + } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java index 4b122c5f..7f64ee68 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GenTemplateController.java @@ -26,6 +26,7 @@ import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; import com.pig4cloud.pig.codegen.service.GenTemplateService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.pig.common.xss.core.XssCleanIgnore; import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -61,7 +62,7 @@ public class GenTemplateController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('codegen_template_view')") - public R getgenTemplatePage(Page page, GenTemplateEntity genTemplate) { + public R getGenTemplatePage(Page page, GenTemplateEntity genTemplate) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() .like(genTemplate.getId() != null, GenTemplateEntity::getId, genTemplate.getId()) .like(StrUtil.isNotEmpty(genTemplate.getTemplateName()), GenTemplateEntity::getTemplateName, @@ -77,7 +78,8 @@ public class GenTemplateController { @GetMapping("/list") @PreAuthorize("@pms.hasPermission('codegen_template_view')") public R list() { - return R.ok(genTemplateService.list(Wrappers.emptyWrapper())); + return R.ok(genTemplateService + .list(Wrappers.lambdaQuery().orderByDesc(GenTemplateEntity::getCreateTime))); } /** @@ -97,6 +99,7 @@ public class GenTemplateController { * @param genTemplate 模板 * @return R */ + @XssCleanIgnore @Operation(summary = "新增模板", description = "新增模板") @SysLog("新增模板") @PostMapping @@ -110,6 +113,7 @@ public class GenTemplateController { * @param genTemplate 模板 * @return R */ + @XssCleanIgnore @Operation(summary = "修改模板", description = "修改模板") @SysLog("修改模板") @PutMapping @@ -143,4 +147,26 @@ public class GenTemplateController { return genTemplateService.list(Wrappers.query(genTemplate)); } + /** + * 在线更新模板 + * @return R + */ + @Operation(summary = "在线更新模板", description = "在线更新模板") + @GetMapping("/online") + @PreAuthorize("@pms.hasPermission('codegen_template_view')") + public R online() { + return genTemplateService.onlineUpdate(); + } + + /** + * 检查版本 + * @return {@link R } + */ + @Operation(summary = "在线检查模板", description = "在线检查模板") + @GetMapping("/checkVersion") + @PreAuthorize("@pms.hasPermission('codegen_template_view')") + public R checkVersion() { + return genTemplateService.checkVersion(); + } + } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java index 224bcfc3..5d7fa0f1 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/controller/GeneratorController.java @@ -70,7 +70,6 @@ public class GeneratorController { byte[] data = outputStream.toByteArray(); response.reset(); - response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s.zip", tableIds)); response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length)); response.setContentType("application/octet-stream; charset=UTF-8"); diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java index ca25c3b9..efec0b5e 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/entity/GenTable.java @@ -157,12 +157,33 @@ public class GenTable extends Model { */ private Long style; + /** + * 子表名称 + */ + private String childTableName; + + /** + * 主表关联键 + */ + private String mainField; + + /** + * 子表关联键 + */ + private String childField; + /** * 字段列表 */ @TableField(exist = false) private List fieldList; + /** + * 子表字段列表 + */ + @TableField(exist = false) + private List childFieldList; + /** * 代码风格(模版分组信息) */ diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java index 146e2fa1..b6039317 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GenGroupMapper.java @@ -19,7 +19,7 @@ package com.pig4cloud.pig.codegen.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.pig4cloud.pig.codegen.entity.GenGroupEntity; -import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.GroupVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -32,6 +32,6 @@ import org.apache.ibatis.annotations.Param; @Mapper public interface GenGroupMapper extends BaseMapper { - GroupVo getGroupVoById(@Param("id") Long id); + GroupVO getGroupVoById(@Param("id") Long id); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java deleted file mode 100755 index 6952289a..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMapper.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pig.codegen.mapper; - -import com.baomidou.dynamic.datasource.annotation.DS; -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.pig4cloud.pig.codegen.entity.ColumnEntity; -import org.apache.ibatis.annotations.Param; - -import java.util.List; -import java.util.Map; - -/** - * 代码生成器 - * - * @author lengleng - * @date 2018-07-30 - */ -public interface GeneratorMapper extends BaseMapper { - - /** - * 查询全部的表 - * @return - */ - @InterceptorIgnore(tenantLine = "true") - List> queryTable(); - - /** - * 分页查询表格 - * @param page 分页信息 - * @param tableName 表名称 - * @return - */ - @InterceptorIgnore(tenantLine = "true") - IPage> queryTable(Page page, @Param("tableName") String tableName); - - /** - * 查询表信息 - * @param tableName 表名称 - * @param dsName 数据源名称 - * @return - */ - @DS("#last") - @InterceptorIgnore(tenantLine = "true") - Map queryTable(@Param("tableName") String tableName, String dsName); - - /** - * 分页查询表分页信息 - * @param page - * @param tableName - * @param dsName - * @return - */ - @DS("#last") - @InterceptorIgnore(tenantLine = "true") - IPage selectTableColumn(Page page, @Param("tableName") String tableName, - @Param("dsName") String dsName); - - /** - * 查询表全部列信息 - * @param tableName - * @param dsName - * @return - */ - @DS("#last") - @InterceptorIgnore(tenantLine = "true") - List selectTableColumn(@Param("tableName") String tableName, @Param("dsName") String dsName); - - /** - * 查询表全部列信息 - * @param tableName 表名称 - * @param dsName 数据源名称 - * @return - */ - @DS("#last") - @InterceptorIgnore(tenantLine = "true") - List> selectMapTableColumn(@Param("tableName") String tableName, String dsName); - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java deleted file mode 100755 index 26a7cb63..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/mapper/GeneratorMysqlMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pig.codegen.mapper; - -import org.apache.ibatis.annotations.Mapper; - -/** - * 支持 mysql 代码生成器 - * - * @author lengleng - * @date 2020-12-11 - */ -@Mapper -public interface GeneratorMysqlMapper extends GeneratorMapper { - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java index 555d1405..69fce638 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenGroupService.java @@ -19,7 +19,7 @@ package com.pig4cloud.pig.codegen.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.codegen.entity.GenGroupEntity; -import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.GroupVO; import com.pig4cloud.pig.codegen.util.vo.TemplateGroupDTO; /** @@ -33,7 +33,7 @@ public interface GenGroupService extends IService { void saveGenGroup(TemplateGroupDTO genTemplateGroup); /** - * 删除分组关系 + * 删除分组极其关系 * @param ids */ void delGroupAndTemplate(Long[] ids); @@ -42,12 +42,12 @@ public interface GenGroupService extends IService { * 查询group数据 * @param id */ - GroupVo getGroupVoById(Long id); + GroupVO getGroupVoById(Long id); /** * 更新group数据 - * @param groupVo + * @param GroupVo */ - void updateGroupAndTemplateById(GroupVo groupVo); + void updateGroupAndTemplateById(GroupVO GroupVo); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java index 812ab1ba..2cfa0aac 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableColumnService.java @@ -30,18 +30,8 @@ import java.util.List; */ public interface GenTableColumnService extends IService { - /** - * 初始化字段列表 - * @param tableFieldList 表字段列表 - */ void initFieldList(List tableFieldList); - /** - * 更新表字段 - * @param dsName 数据源名称 - * @param tableName 表名称 - * @param tableFieldList 表字段列表 - */ void updateTableField(String dsName, String tableName, List tableFieldList); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java index 0b41754d..84d8f169 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTableService.java @@ -21,9 +21,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.codegen.entity.GenTable; +import org.anyline.metadata.Table; import java.util.List; -import java.util.Map; /** * 列属性 @@ -34,40 +34,43 @@ import java.util.Map; public interface GenTableService extends IService { /** - * 获取默认配置信息 - * @return 默认配置信息 - */ - Map getGeneratorConfig(); - - /** - * 分页查询表格列表 - * @param page 分页对象 + * 查询对应数据源的表 + * @param page 分页信息 * @param table 查询条件 - * @return 表格列表分页结果 + * @return 表 */ - IPage list(Page page, GenTable table); + IPage queryTablePage(Page page, GenTable table); /** - * 根据数据源名称和表名查询或构建表格 - * @param dsName 数据源名称 + * 查询表信息(列),然后插入到中间表中 + * @param dsName 数据源 * @param tableName 表名 - * @return 查询到的表格信息 + * @return GenTable */ GenTable queryOrBuildTable(String dsName, String tableName); /** - * 查询指定数据源下的所有表格 + * 查询表ddl 语句 * @param dsName 数据源名称 - * @return 所有表格的列表 + * @param tableName 表名称 + * @return ddl 语句 + * @throws Exception */ - List> queryDsAllTable(String dsName); + String queryTableDdl(String dsName, String tableName) throws Exception; /** - * 查询指定数据源和表名的列信息 + * 查询数据源里面的全部表 * @param dsName 数据源名称 - * @param tableName 表名 - * @return 列信息列表 + * @return table + */ + List queryTableList(String dsName); + + /** + * 查询表的全部字段 + * @param dsName 数据源 + * @param tableName 表名称 + * @return column */ - List> queryColumn(String dsName, String tableName); + List queryTableColumn(String dsName, String tableName); } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java index a465dc20..0e0a137e 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/GenTemplateService.java @@ -19,6 +19,7 @@ package com.pig4cloud.pig.codegen.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import com.pig4cloud.pig.common.core.util.R; /** * 模板 @@ -28,4 +29,16 @@ import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; */ public interface GenTemplateService extends IService { + /** + * 检查版本 + * @return {@link R } + */ + R checkVersion(); + + /** + * 在线更新 + * @return {@link R } + */ + R onlineUpdate(); + } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java index 5b83efb2..543f12a5 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java @@ -19,9 +19,8 @@ package com.pig4cloud.pig.codegen.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.creator.DataSourceCreator; import com.baomidou.dynamic.datasource.creator.DataSourceProperty; -import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; -import com.baomidou.dynamic.datasource.creator.druid.DruidConfig; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.codegen.entity.GenDatasourceConf; import com.pig4cloud.pig.codegen.mapper.GenDatasourceConfMapper; @@ -53,7 +52,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl tableFieldList) { AtomicInteger sort = new AtomicInteger(); this.updateBatchById(tableFieldList.stream() diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java index 9c11e95e..32508ce7 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTableServiceImpl.java @@ -16,40 +16,43 @@ */ package com.pig4cloud.pig.codegen.service.impl; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.io.resource.ClassPathResource; -import cn.hutool.core.map.MapUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.NamingCase; import cn.hutool.core.util.EnumUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.codegen.config.PigCodeGenDefaultProperties; import com.pig4cloud.pig.codegen.entity.GenGroupEntity; import com.pig4cloud.pig.codegen.entity.GenTable; import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; import com.pig4cloud.pig.codegen.mapper.GenTableMapper; -import com.pig4cloud.pig.codegen.mapper.GeneratorMapper; import com.pig4cloud.pig.codegen.service.GenGroupService; import com.pig4cloud.pig.codegen.service.GenTableColumnService; import com.pig4cloud.pig.codegen.service.GenTableService; +import com.pig4cloud.pig.codegen.util.AutoFillEnum; import com.pig4cloud.pig.codegen.util.BoolFillEnum; import com.pig4cloud.pig.codegen.util.CommonColumnFiledEnum; import com.pig4cloud.pig.codegen.util.GenKit; -import com.pig4cloud.pig.codegen.util.GeneratorTypeEnum; import lombok.RequiredArgsConstructor; +import org.anyline.metadata.Column; +import org.anyline.metadata.Database; +import org.anyline.metadata.Table; +import org.anyline.proxy.ServiceProxy; +import org.anyline.service.AnylineService; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * 列属性 @@ -61,53 +64,83 @@ import java.util.Objects; @RequiredArgsConstructor public class GenTableServiceImpl extends ServiceImpl implements GenTableService { - /** - * 默认配置信息 - */ - private static final String CONFIG_PATH = "template/config.json"; + private final PigCodeGenDefaultProperties configurationProperties; private final GenTableColumnService columnService; private final GenGroupService genGroupService; /** - * 获取配置信息 - * @return + * 查询表ddl 语句 + * @param dsName 数据源名称 + * @param tableName 表名称 + * @return ddl 语句 + * @throws Exception */ @Override - public Map getGeneratorConfig() { - ClassPathResource classPathResource = new ClassPathResource(CONFIG_PATH); - JSONObject jsonObject = JSONUtil.parseObj(IoUtil.readUtf8(classPathResource.getStream())); - return jsonObject.getRaw(); + public String queryTableDdl(String dsName, String tableName) throws Exception { + // 手动切换数据源 + DynamicDataSourceContextHolder.push(dsName); + Table table = ServiceProxy.metadata().table(tableName); // 获取表结构 + table.execute(false);// 不执行SQL + ServiceProxy.ddl().create(table); + return table.getDdl();// 返回创建表的DDL } + /** + * 查询表的全部字段 + * @param dsName 数据源 + * @param tableName 表名称 + * @return column + */ @Override - public List> queryDsAllTable(String dsName) { - GeneratorMapper mapper = GenKit.getMapper(dsName); + public List queryTableColumn(String dsName, String tableName) { // 手动切换数据源 DynamicDataSourceContextHolder.push(dsName); - return mapper.queryTable(); + return ServiceProxy.metadata().columns(tableName).values().stream().map(Column::getName).collect(Collectors.toList()); } + /** + * 查询对应数据源的表 + * @param page 分页信息 + * @param table 查询条件 + * @return 表 + */ @Override - public List> queryColumn(String dsName, String tableName) { - GeneratorMapper mapper = GenKit.getMapper(dsName); - return mapper.selectMapTableColumn(tableName, dsName); + public IPage queryTablePage(Page
        page, GenTable table) { + // 手动切换数据源 + DynamicDataSourceContextHolder.push(table.getDsName()); + List
        tableList = ServiceProxy.metadata().tables().values().stream().filter(t -> { + if (StrUtil.isBlank(table.getTableName())) { + return true; + } + return StrUtil.containsIgnoreCase(t.getName(false), table.getTableName()); + }).collect(Collectors.toList()); + + // 根据 page 进行分页 + List
        records = CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tableList); + page.setTotal(tableList.size()); + page.setRecords(records); + return page; } + /** + * 查询数据源里面的全部表 + * @param dsName 数据源名称 + * @return table + */ @Override - public IPage list(Page page, GenTable table) { - GeneratorMapper mapper = GenKit.getMapper(table.getDsName()); + public List queryTableList(String dsName) { // 手动切换数据源 - DynamicDataSourceContextHolder.push(table.getDsName()); - return mapper.queryTable(page, table.getTableName()); + DynamicDataSourceContextHolder.push(dsName); + return ServiceProxy.metadata().tables().values().stream().map(Table::getName).collect(Collectors.toList()); } /** - * 获取表信息 - * @param dsName - * @param tableName - * @return + * 查询表信息(列),然后插入到中间表中 + * @param dsName 数据源 + * @param tableName 表名 + * @return GenTable */ @Override public GenTable queryOrBuildTable(String dsName, String tableName) { @@ -132,75 +165,87 @@ public class GenTableServiceImpl extends ServiceImpl i @Transactional(rollbackFor = Exception.class) public GenTable tableImport(String dsName, String tableName) { - GeneratorMapper mapper = GenKit.getMapper(dsName); // 手动切换数据源 DynamicDataSourceContextHolder.push(dsName); // 查询表是否存在 GenTable table = new GenTable(); - // 从数据库获取表信息 - Map queryTable = mapper.queryTable(tableName, dsName); - + AnylineService service = ServiceProxy.service(); + Table tableMetadata = service.metadata().table(tableName); + Database database = service.metadata().database(); // 获取默认表配置信息 () - Map generatorConfig = getGeneratorConfig(); - JSONObject project = (JSONObject) generatorConfig.get("project"); - JSONObject developer = (JSONObject) generatorConfig.get("developer"); - - table.setPackageName(project.getStr("packageName")); - table.setVersion(project.getStr("version")); - table.setBackendPath(project.getStr("backendPath")); - table.setFrontendPath(project.getStr("frontendPath")); - table.setAuthor(developer.getStr("author")); - table.setEmail(developer.getStr("email")); + + table.setPackageName(configurationProperties.getPackageName()); + table.setVersion(configurationProperties.getVersion()); + table.setBackendPath(configurationProperties.getBackendPath()); + table.setFrontendPath(configurationProperties.getFrontendPath()); + table.setAuthor(configurationProperties.getAuthor()); + table.setEmail(configurationProperties.getEmail()); table.setTableName(tableName); table.setDsName(dsName); - table.setTableComment(MapUtil.getStr(queryTable, "tableComment")); - table.setDbType(MapUtil.getStr(queryTable, "dbType")); - table.setFormLayout(2); - table.setGeneratorType(GeneratorTypeEnum.ZIP_DOWNLOAD.getValue()); + table.setTableComment(tableMetadata.getComment()); + + table.setDbType(database.getDatabase().title()); + table.setFormLayout(configurationProperties.getFormLayout()); + table.setGeneratorType(configurationProperties.getGeneratorType()); table.setClassName(NamingCase.toPascalCase(tableName)); - table.setModuleName(GenKit.getModuleName(table.getPackageName())); + // 模块名称默认为 admin + table.setModuleName(configurationProperties.getModuleName()); table.setFunctionName(GenKit.getFunctionName(tableName)); table.setCreateTime(LocalDateTime.now()); + + // 使用默认数据源 + DynamicDataSourceContextHolder.clear(); this.save(table); // 获取原生字段数据 - List> queryColumnList = mapper.selectMapTableColumn(tableName, dsName); - List tableFieldList = new ArrayList<>(); + List tableFieldList = getGenTableColumnEntities(dsName, tableName, tableMetadata); + + // 初始化字段数据 + columnService.initFieldList(tableFieldList); + // 保存列数据 + columnService.saveOrUpdateBatch(tableFieldList); + + table.setFieldList(tableFieldList); + return table; + } - for (Map columnMap : queryColumnList) { - String columnName = MapUtil.getStr(columnMap, "columnName"); + /** + * 获取表字段信息 + * @param dsName 数据源信息 + * @param tableName 表名称 + * @param tableMetadata 表的元数据 + * @return list + */ + private static @NotNull List getGenTableColumnEntities(String dsName, String tableName, + Table tableMetadata) { + List tableFieldList = new ArrayList<>(); + LinkedHashMap columns = tableMetadata.getColumns(); + columns.forEach((columnName, column) -> { GenTableColumnEntity genTableColumnEntity = new GenTableColumnEntity(); genTableColumnEntity.setTableName(tableName); genTableColumnEntity.setDsName(dsName); - genTableColumnEntity.setFieldName(MapUtil.getStr(columnMap, "columnName")); - genTableColumnEntity.setFieldComment(MapUtil.getStr(columnMap, "comments")); - genTableColumnEntity.setFieldType(MapUtil.getStr(columnMap, "dataType")); - String columnKey = MapUtil.getStr(columnMap, "columnKey"); - genTableColumnEntity.setAutoFill("DEFAULT"); - genTableColumnEntity.setPrimaryPk((StringUtils.isNotBlank(columnKey) && "PRI".equalsIgnoreCase(columnKey)) - ? BoolFillEnum.TRUE.getValue() : BoolFillEnum.FALSE.getValue()); - genTableColumnEntity.setAutoFill("DEFAULT"); + genTableColumnEntity.setFieldName(column.getName()); + genTableColumnEntity.setFieldComment(column.getComment()); + genTableColumnEntity.setFieldType(column.getTypeName()); + genTableColumnEntity.setPrimaryPk( + column.isPrimaryKey() == 1 ? BoolFillEnum.TRUE.getValue() : BoolFillEnum.FALSE.getValue()); + genTableColumnEntity.setAutoFill(AutoFillEnum.DEFAULT.name()); genTableColumnEntity.setFormItem(BoolFillEnum.TRUE.getValue()); genTableColumnEntity.setGridItem(BoolFillEnum.TRUE.getValue()); // 审计字段处理 - if (EnumUtil.contains(CommonColumnFiledEnum.class, columnName)) { - CommonColumnFiledEnum commonColumnFiledEnum = CommonColumnFiledEnum.valueOf(columnName); + if (EnumUtil.contains(CommonColumnFiledEnum.class, column.getName())) { + CommonColumnFiledEnum commonColumnFiledEnum = CommonColumnFiledEnum.valueOf(column.getName()); genTableColumnEntity.setFormItem(commonColumnFiledEnum.getFormItem()); genTableColumnEntity.setGridItem(commonColumnFiledEnum.getGridItem()); genTableColumnEntity.setAutoFill(commonColumnFiledEnum.getAutoFill()); genTableColumnEntity.setSort(commonColumnFiledEnum.getSort()); } tableFieldList.add(genTableColumnEntity); - } - // 初始化字段数据 - columnService.initFieldList(tableFieldList); - // 保存列数据 - columnService.saveOrUpdateBatch(tableFieldList); - table.setFieldList(tableFieldList); - return table; + }); + return tableFieldList; } } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java index 45d4f4d6..b92d2886 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenTemplateServiceImpl.java @@ -16,11 +16,35 @@ */ package com.pig4cloud.pig.codegen.service.impl; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpStatus; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.smallbun.screw.core.constant.DefaultConstants; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pig.codegen.config.PigCodeGenDefaultProperties; +import com.pig4cloud.pig.codegen.entity.GenGroupEntity; import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; +import com.pig4cloud.pig.codegen.entity.GenTemplateGroupEntity; +import com.pig4cloud.pig.codegen.mapper.GenGroupMapper; +import com.pig4cloud.pig.codegen.mapper.GenTemplateGroupMapper; import com.pig4cloud.pig.codegen.mapper.GenTemplateMapper; import com.pig4cloud.pig.codegen.service.GenTemplateService; +import com.pig4cloud.pig.codegen.util.vo.GenTemplateFileVO; +import com.pig4cloud.pig.common.core.exception.CheckedException; +import com.pig4cloud.pig.common.core.util.R; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * 模板 @@ -28,8 +52,144 @@ import org.springframework.stereotype.Service; * @author PIG * @date 2023-02-21 11:08:43 */ +@Slf4j @Service +@RequiredArgsConstructor public class GenTemplateServiceImpl extends ServiceImpl implements GenTemplateService { + private final GenTemplateGroupMapper genTemplateGroupMapper; + + private final GenGroupMapper genGroupMapper; + + private final PigCodeGenDefaultProperties defaultProperties; + + /** + * 在线更新 + * @return {@link R } + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R onlineUpdate() { + // 获取 config.json 和 version 文件 + Map configAndVersion = getConfigAndVersion(); + JSONObject configJsonObj = (JSONObject) configAndVersion.get("configJsonObj"); + String versionFile = (String) configAndVersion.get("versionFile"); + + // 查询出全部的模板组名称 + Set cgtmConfigGroupNames = configJsonObj.keySet(); + + String cgtmConfigGroupName = cgtmConfigGroupNames.iterator().next(); + // 根据模板组名称+version 查询是否存在,不存在则新增,存在跳过 + boolean exists = genGroupMapper.exists(Wrappers.lambdaQuery() + .eq(GenGroupEntity::getGroupName, cgtmConfigGroupName + versionFile)); + + if (exists) { + return R.failed("已是最新版本,无需更新!"); + } + + // 插入新的模板组(名称 + VERSION), 再解析 config.json group 里面的所有模板 + insertTemplateFiles(versionFile, configJsonObj, cgtmConfigGroupName); + return R.ok("更新成功,版本号:" + versionFile); + } + + /** + * 检查版本 + * @return {@link R } + */ + public R checkVersion() { + // 关闭在线更新提示 + if (!defaultProperties.isAutoCheckVersion()) { + return R.ok(true); + } + + // 获取 config.json 和 version 文件 + Map configAndVersion = getConfigAndVersion(); + JSONObject configJsonObj = (JSONObject) configAndVersion.get("configJsonObj"); + String versionFile = (String) configAndVersion.get("versionFile"); + + // 查询出全部的模板组名称 + Set cgtmConfigGroupNames = configJsonObj.keySet(); + + String cgtmConfigGroupName = cgtmConfigGroupNames.iterator().next(); + // 根据模板组名称+version 查询是否存在,不存在则新增,存在跳过 + boolean exists = genGroupMapper.exists(Wrappers.lambdaQuery() + .eq(GenGroupEntity::getGroupName, cgtmConfigGroupName + versionFile)); + + return R.ok(exists); + } + + /** + * 获取配置和版本 + * @return {@link Map }<{@link String }, {@link Object }> + */ + private Map getConfigAndVersion() { + // 获取 config.json 和 version 文件 + String configFile = getCGTMFile("config.json"); + String versionFile = getCGTMFile("VERSION"); + + // 解析 config.json + JSONObject configJsonObj = JSONUtil.parseObj(configFile); + + // 将 configJsonObj 和 versionFile 放入 Map 中 + Map configAndVersion = new HashMap<>(); + configAndVersion.put("configJsonObj", configJsonObj); + configAndVersion.put("versionFile", versionFile); + + return configAndVersion; + } + + /** + * 插入模板文件 + * @param version 版本 + * @param configJsonObj config.json + * @param groupName 组名称 + */ + private void insertTemplateFiles(String version, JSONObject configJsonObj, String groupName) { + // 创建新的 group + GenGroupEntity genGroupEntity = new GenGroupEntity(); + genGroupEntity.setGroupName(groupName + version); + genGroupMapper.insert(genGroupEntity); + + // 解析json配置文件 + List templateFileVOList = configJsonObj.getBeanList(groupName, GenTemplateFileVO.class); + for (GenTemplateFileVO genTemplateFileVO : templateFileVOList) { + // 1. 获取模板文件 + String templateFile = getCGTMFile(genTemplateFileVO.getTemplateFile()); + + // 2. 插入模板文件 + GenTemplateEntity genTemplateEntity = new GenTemplateEntity(); + genTemplateEntity.setTemplateName(genTemplateFileVO.getTemplateName() + version); + genTemplateEntity.setTemplateDesc(genTemplateFileVO.getTemplateName() + version); + genTemplateEntity.setTemplateCode(templateFile); + genTemplateEntity.setGeneratorPath(genTemplateFileVO.getGeneratorPath()); + baseMapper.insert(genTemplateEntity); + + // 3. 插入模板组关联 + GenTemplateGroupEntity genTemplateGroupEntity = new GenTemplateGroupEntity(); + genTemplateGroupEntity.setTemplateId(genTemplateEntity.getId()); + genTemplateGroupEntity.setGroupId(genGroupEntity.getId()); + genTemplateGroupMapper.insert(genTemplateGroupEntity); + } + } + + /** + * 获取 cgtmfile + * @param fileName 文件名 + * @return {@link String } + */ + private String getCGTMFile(String fileName) { + HttpResponse response = HttpRequest + .get(String.format("%s/CGTM/raw/master/%s", DefaultConstants.CGTM_URL, fileName)) + .execute(); + + if (response.getStatus() == HttpStatus.HTTP_OK || StrUtil.isNotBlank(response.body())) { + return response.body(); + } + else { + log.warn("在线更新模板失败:{} ,Http Code:{}", fileName, response.getStatus()); + throw new CheckedException("在线更新模板失败,任务终止!"); + } + } + } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java index 00010d12..d1690dba 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java @@ -21,21 +21,22 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.NamingCase; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; +import com.pig4cloud.pig.codegen.config.PigCodeGenDefaultProperties; import com.pig4cloud.pig.codegen.entity.GenTable; import com.pig4cloud.pig.codegen.entity.GenTableColumnEntity; import com.pig4cloud.pig.codegen.entity.GenTemplateEntity; import com.pig4cloud.pig.codegen.service.*; import com.pig4cloud.pig.codegen.util.VelocityKit; -import com.pig4cloud.pig.codegen.util.vo.GroupVo; +import com.pig4cloud.pig.codegen.util.vo.GroupVO; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringBootVersion; import org.springframework.stereotype.Service; -import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -55,6 +56,8 @@ import java.util.zip.ZipOutputStream; @RequiredArgsConstructor public class GeneratorServiceImpl implements GeneratorService { + private final PigCodeGenDefaultProperties configurationProperties; + private final GenTableColumnService columnService; private final GenFieldTypeService fieldTypeService; @@ -76,13 +79,11 @@ public class GeneratorServiceImpl implements GeneratorService { Long style = (Long) dataModel.get("style"); - GroupVo groupVo = genGroupService.getGroupVoById(style); + GroupVO groupVo = genGroupService.getGroupVoById(style); List templateList = groupVo.getTemplateList(); - Map generatorConfig = tableService.getGeneratorConfig(); - JSONObject project = (JSONObject) generatorConfig.get("project"); - String frontendPath = project.getStr("frontendPath"); - String backendPath = project.getStr("backendPath"); + String frontendPath = configurationProperties.getFrontendPath(); + String backendPath = configurationProperties.getBackendPath(); for (GenTemplateEntity template : templateList) { String templateCode = template.getTemplateCode(); @@ -118,10 +119,8 @@ public class GeneratorServiceImpl implements GeneratorService { // 获取模板列表,Lambda 表达式简化代码 List templateList = genGroupService.getGroupVoById(style).getTemplateList(); - Map generatorConfig = tableService.getGeneratorConfig(); - JSONObject project = (JSONObject) generatorConfig.get("project"); - String frontendPath = project.getStr("frontendPath"); - String backendPath = project.getStr("backendPath"); + String frontendPath = configurationProperties.getFrontendPath(); + String backendPath = configurationProperties.getBackendPath(); return templateList.stream().map(template -> { String templateCode = template.getTemplateCode(); @@ -186,9 +185,11 @@ public class GeneratorServiceImpl implements GeneratorService { Map dataModel = new HashMap<>(); // 填充数据模型 + dataModel.put("opensource", true); + dataModel.put("isSpringBoot3", isSpringBoot3()); dataModel.put("dbType", table.getDbType()); dataModel.put("package", table.getPackageName()); - dataModel.put("packagePath", table.getPackageName().replace(".", File.separator)); + dataModel.put("packagePath", table.getPackageName().replace(".", "/")); dataModel.put("version", table.getVersion()); dataModel.put("moduleName", table.getModuleName()); dataModel.put("ModuleName", StrUtil.upperFirst(table.getModuleName())); @@ -212,9 +213,45 @@ public class GeneratorServiceImpl implements GeneratorService { dataModel.put("backendPath", table.getBackendPath()); dataModel.put("frontendPath", table.getFrontendPath()); + + // 设置子表 + String childTableName = table.getChildTableName(); + if (StrUtil.isNotBlank(childTableName)) { + List childFieldList = columnService.lambdaQuery() + .eq(GenTableColumnEntity::getDsName, table.getDsName()) + .eq(GenTableColumnEntity::getTableName, table.getChildTableName()) + .list(); + dataModel.put("childFieldList", childFieldList); + dataModel.put("childTableName", childTableName); + dataModel.put("mainField", NamingCase.toCamelCase(table.getMainField())); + dataModel.put("childField", NamingCase.toCamelCase(table.getChildField())); + dataModel.put("ChildClassName", NamingCase.toPascalCase(childTableName)); + dataModel.put("childClassName", StrUtil.lowerFirst(NamingCase.toPascalCase(childTableName))); + // 设置是否是多租户模式 (判断字段列表中是否包含 tenant_id 字段) + childFieldList.stream() + .filter(genTableColumnEntity -> genTableColumnEntity.getFieldName().equals("tenant_id")) + .findFirst() + .ifPresent(columnEntity -> dataModel.put("isChildTenant", true)); + } + + // 设置是否是多租户模式 (判断字段列表中是否包含 tenant_id 字段) + table.getFieldList() + .stream() + .filter(genTableColumnEntity -> genTableColumnEntity.getFieldName().equals("tenant_id")) + .findFirst() + .ifPresent(columnEntity -> dataModel.put("isTenant", true)); + return dataModel; } + /** + * 判断当前是否是 SpringBoot3 版本 + * @return true/fasle + */ + private boolean isSpringBoot3() { + return StrUtil.startWith(SpringBootVersion.getVersion(), "3"); + } + /** * 将表字段按照类型分组并存储到数据模型中 * @param dataModel 存储数据的 Map 对象 diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/AutoFillEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/AutoFillEnum.java new file mode 100644 index 00000000..5bc1471f --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/AutoFillEnum.java @@ -0,0 +1,12 @@ +package com.pig4cloud.pig.codegen.util; + +/** + * 字段自动填充 枚举 + * + * @author 阿沐 babamu@126.com + */ +public enum AutoFillEnum { + + DEFAULT, INSERT, UPDATE, INSERT_UPDATE, CREATE; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java index 5ef0f830..7f7545f4 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/CommonColumnFiledEnum.java @@ -16,36 +16,36 @@ public enum CommonColumnFiledEnum { /** * create_by 字段 */ - create_by("0", "0", "INSERT", 100), + create_by("0", "0", AutoFillEnum.INSERT.name(), 100), /** * create_time 字段 */ - create_time("0", "0", "INSERT", 101), + create_time("0", "0", AutoFillEnum.INSERT.name(), 101), /** * update_by 字段 */ - update_by("0", "0", "INSERT_UPDATE", 102), + update_by("0", "0", AutoFillEnum.INSERT_UPDATE.name(), 102), /** * update_time 字段 */ - update_time("0", "0", "INSERT_UPDATE", 103), + update_time("0", "0", AutoFillEnum.INSERT_UPDATE.name(), 103), /** * del_flag 字段 */ - del_flag("0", "0", "DEFAULT", 104), + del_flag("0", "0", AutoFillEnum.DEFAULT.name(), 104), /** * tenant_id 字段 */ - tenant_id("0", "0", "DEFAULT", 105); + tenant_id("0", "0", AutoFillEnum.DEFAULT.name(), 105); /** - * 表单是否默认显示 + * 表单是否默认显示 1/0 */ private String formItem; /** - * 表格是否默认显示 + * 表格是否默认显示 1/0 */ private String gridItem; diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java index 057c4165..4ac3a1a6 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GenKit.java @@ -1,16 +1,7 @@ package com.pig4cloud.pig.codegen.util; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.pig4cloud.pig.codegen.entity.GenDatasourceConf; -import com.pig4cloud.pig.codegen.mapper.GenDatasourceConfMapper; -import com.pig4cloud.pig.codegen.mapper.GeneratorMapper; -import com.pig4cloud.pig.common.core.util.SpringContextHolder; -import com.pig4cloud.pig.common.datasource.enums.DsJdbcUrlEnum; import lombok.experimental.UtilityClass; -import org.springframework.context.ApplicationContext; - -import java.util.Map; /** * 代码生成工具类 @@ -39,37 +30,4 @@ public class GenKit { return StrUtil.subAfter(packageName, ".", true); } - /** - * 获取数据源对应方言的mapper - * @param dsName 数据源名称 - * @return GeneratorMapper - */ - public GeneratorMapper getMapper(String dsName) { - // 获取目标数据源数据库类型 - GenDatasourceConfMapper datasourceConfMapper = SpringContextHolder.getBean(GenDatasourceConfMapper.class); - GenDatasourceConf datasourceConf = datasourceConfMapper - .selectOne(Wrappers.lambdaQuery().eq(GenDatasourceConf::getName, dsName)); - - String dbConfType; - // 默认MYSQL 数据源 - if (datasourceConf == null) { - dbConfType = DsJdbcUrlEnum.MYSQL.getDbName(); - } - else { - dbConfType = datasourceConf.getDsType(); - } - // 获取全部数据实现 - ApplicationContext context = SpringContextHolder.getApplicationContext(); - Map beansOfType = context.getBeansOfType(GeneratorMapper.class); - - // 根据数据类型选择mapper - for (String key : beansOfType.keySet()) { - if (StrUtil.containsIgnoreCase(key, dbConfType)) { - return beansOfType.get(key); - } - } - - throw new IllegalArgumentException("dsName 不合法: " + dsName); - } - } diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorStyleEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorStyleEnum.java new file mode 100644 index 00000000..e05fc50e --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorStyleEnum.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pig.codegen.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成主题 + * + * @author 冷冷 + */ +@Getter +@AllArgsConstructor +public enum GeneratorStyleEnum { + + VFORM_JSON(1L, "element-plus 风格"), + + VFORM_FORM(2L, "uview 风格"); + + /** + * 对应模板ID + */ + private Long templateId; + + /** + * 描述 + */ + private String desc; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorTypeEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorTypeEnum.java deleted file mode 100644 index e991e883..00000000 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/GeneratorTypeEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pig4cloud.pig.codegen.util; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public enum GeneratorTypeEnum { - - /** - * zip压缩包 0 - */ - ZIP_DOWNLOAD("0"), - /** - * 自定义目录 1 - */ - CUSTOM_DIRECTORY("1"); - - private final String value; - -} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormConfigConsts.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormConfigConsts.java new file mode 100644 index 00000000..e6c6daee --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormConfigConsts.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pig.codegen.util; + +/** + * vform 的通用变量 + * + * @author lengleng + * @date 2023/6/5 + */ +public interface VFormConfigConsts { + + String widgetList = "widgetList"; + + String groupKey = "groupKey"; + + String type = "type"; + + String options = "options"; + + String span = "span"; + + String cols = "cols"; + + String key = "key"; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormTypeEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormTypeEnum.java new file mode 100644 index 00000000..840fea18 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/VFormTypeEnum.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pig.codegen.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * vfrom 字段类型 + * + * @author lengleng + * @date 2023/6/5 + */ +@Getter +@AllArgsConstructor +public enum VFormTypeEnum { + + GRID("grid"), + + GRID_COL("grid-col"); + + private final String type; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenCreateTableVO.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenCreateTableVO.java new file mode 100755 index 00000000..ec971723 --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenCreateTableVO.java @@ -0,0 +1,95 @@ +package com.pig4cloud.pig.codegen.util.vo; +/* + * Copyright (c) 2018-2025, luolin All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: luolin (766488893@qq.com) + */ + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + * 自动创建表管理 + * + * @author luolin + * @date 2022-09-23 21:56:11 + */ +@Data +@Schema(description = "自动创建表管理") +public class GenCreateTableVO { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @Schema(description = "主键ID") + private Long id; + + /** + * 表名称 + */ + @NotBlank(message = "表名称不能为空") + @Schema(description = "表名称") + private String tableName; + + /** + * 表注释 + */ + @NotBlank(message = "表注释不能为空") + @Schema(description = "表注释") + private String comments; + + /** + * 数据源名称 + */ + @NotBlank(message = "数据源名称不能为空") + @Schema(description = "数据源名称") + private String dsName; + + /** + * 主键策略 + */ + @NotBlank(message = "主键策略不能为空") + @Schema(description = "主键策略") + private String pkPolicy; + + /** + * 创建人 + */ + @Schema(description = "创建人") + private Long createUser; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 表字段信息 + */ + @Schema(description = "表字段信息") + private String columnsInfo; + + /** + * 字段信息 + */ + @Schema(description = "字段信息") + private String columnInfo; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenTemplateFileVO.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenTemplateFileVO.java new file mode 100644 index 00000000..aff2918d --- /dev/null +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GenTemplateFileVO.java @@ -0,0 +1,38 @@ +package com.pig4cloud.pig.codegen.util.vo; + +import lombok.Data; + +/** + * @author lengleng + * @date 2024/7/13 + *

        + * CGTM 文件路径 + *

        + * { "templateName": "Controller", "generatorPath": + * "${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java", + * "templateDesc": "后台Controller", "templateFile": "temps/Controller" }, + */ +@Data +public class GenTemplateFileVO { + + /** + * 模板名称 + */ + private String templateName; + + /** + * 路径 + */ + private String generatorPath; + + /** + * 模板 desc + */ + private String templateDesc; + + /** + * 模板文件 + */ + private String templateFile; + +} diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java index 23f6abb5..e46feda9 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java @@ -9,7 +9,7 @@ import lombok.Data; import java.util.List; @Data -public class GroupVo { +public class GroupVO { /** * id diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml index 83d36147..efc2ef0d 100644 --- a/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenGroupMapper.xml @@ -3,12 +3,12 @@ - + + select="com.pig4cloud.pig.codegen.mapper.GenTemplateMapper.listTemplateById" column="group_id"> diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml index e9a64953..633c857f 100644 --- a/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml +++ b/pig-visual/pig-codegen/src/main/resources/mapper/GenTableMapper.xml @@ -23,7 +23,7 @@ - + @@ -38,8 +38,7 @@ - - + diff --git a/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml b/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml deleted file mode 100755 index ca5b9eb9..00000000 --- a/pig-visual/pig-codegen/src/main/resources/mapper/GeneratorMySqlMapper.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - SELECT - column_name columnName, - data_type dataType, - column_comment comments, - column_key columnKey, - extra, - is_nullable AS isNullable, - column_type AS columnType - FROM - information_schema.COLUMNS - WHERE - table_name = #{tableName} and table_schema = (select database()) order by ordinal_position - - - - - - - diff --git a/pig-visual/pig-codegen/src/main/resources/template/config.json b/pig-visual/pig-codegen/src/main/resources/template/config.json deleted file mode 100644 index 4f33f5d0..00000000 --- a/pig-visual/pig-codegen/src/main/resources/template/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "project": { - "packageName": "com.pig4cloud.pig", - "version": "1.0.0", - "backendPath": "pig", - "frontendPath": "pig-ui" - }, - "developer": { - "author": "pig", - "email": "pig4cloud@qq.com" - } -} -- Gitee From 5da72127a061e6757b7dadfe6f0729e37d10c4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 22 Jul 2024 11:03:44 +0800 Subject: [PATCH 233/238] =?UTF-8?q?doc(=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=84=9A=E6=9C=AC):=20=E5=88=A0=E9=99=A4SQL=E4=B8=AD=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E6=A8=A1?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 41 ----------------------------------------- 1 file changed, 41 deletions(-) diff --git a/db/pig.sql b/db/pig.sql index bd16063a..5a981e80 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -822,12 +822,6 @@ CREATE TABLE `gen_group` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组'; --- ---------------------------- --- Records of gen_group --- ---------------------------- -BEGIN; -INSERT INTO `gen_group` VALUES (1, '增删改查', '单表增删改查', ' ', ' ', NULL, NULL, '0'); -COMMIT; -- ---------------------------- -- Table structure for gen_table @@ -922,23 +916,6 @@ CREATE TABLE `gen_template` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板'; --- ---------------------------- --- Records of gen_template --- ---------------------------- -BEGIN; -INSERT INTO `gen_template` VALUES (1, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pig.common.core.util.R;\nimport com.pig4cloud.pig.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.api.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.attrType == \'String\')\n#set($expression=\"StrUtil.isNotBlank\")\n#else\n#set($expression=\"Objects.nonNull\")\n#end\n#if($field.queryType == \'=\')\n wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight($expression($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @param ids 导出指定ID\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className},${pk.attrType}[] ids) {\n return ${className}Service.list(Wrappers.lambdaQuery(${className}).in(ArrayUtil.isNotEmpty(ids), ${ClassName}Entity::$str.getProperty($pk.attrName), ids));\n }\n}', '2023-02-23 01:16:17', '2023-08-28 22:48:06', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (2, 'Service', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java', 'Service', 'package ${package}.${moduleName}.service;\n\n#if($ChildClassName)\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport com.baomidou.mybatisplus.extension.service.IService;\n#end\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n\n#if($ChildClassName)\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(Long[] ids);\n\n Boolean removeChild(Long[] ids);\n#else\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:16:53', '2023-06-04 10:35:25', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (3, 'ServiceImpl', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java', 'ServiceImpl', 'package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n#if($ChildClassName)\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\n#end\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n#if($ChildClassName)\n@RequiredArgsConstructor\n#end\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n#if($ChildClassName)\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#set($getChildPkName=$str.getProperty(${pk.attrName}))\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.getId());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(Long[] ids) {\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery().in(${ChildClassName}Entity::$str.getProperty($childField), ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(Long[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n#end\n}', '2023-02-23 01:17:36', '2023-08-27 23:29:58', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (4, '实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ClassName}Entity.java', 'Entity', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n#if($ChildClassName)\nimport com.alibaba.excel.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n private $field.attrType $field.attrName;\n#end\n#if($ChildClassName)\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n#end\n}', '2023-02-23 01:17:53', '2023-08-27 22:26:06', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (5, 'Mapper', '${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java', 'Mapper', 'package ${package}.${moduleName}.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n\n}', '2023-02-23 01:18:18', '2023-08-28 22:47:02', '0', ' ', 'admin'); -INSERT INTO `gen_template` VALUES (6, 'Mapper.xml', '${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml', 'Mapper.xml', '\n\n\n\n\n \n#foreach ($field in $fieldList)\n #if($field.primaryPk)\n \n #end\n #if(!$field.primaryPk)\n \n #end\n#end\n \n', '2023-02-23 01:18:35', '2023-06-04 10:34:56', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (7, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 \n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\');\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\');\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\');\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name)\nvalues (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\');', '2023-02-23 01:19:08', '2023-08-28 22:06:16', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (8, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', ' ', ' '); -INSERT INTO `gen_template` VALUES (9, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-28 22:53:55', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (10, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-08-27 22:23:19', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (11, 'i18n英文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/en.ts', 'i18n英文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'import ${ClassName}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'${field.attrName}\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'input ${field.attrName}\',\n#end\n }\n}', '2023-02-23 01:20:25', '2023-06-04 10:49:25', '0', '', 'admin'); -INSERT INTO `gen_template` VALUES (12, 'i18n中文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/zh-cn.ts', 'i18n中文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'导入${tableComment}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n }\n}', '2023-02-23 01:20:40', '2023-06-04 10:49:28', '0', '', 'admin'); -COMMIT; -- ---------------------------- -- Table structure for gen_template_group @@ -950,24 +927,6 @@ CREATE TABLE `gen_template_group` ( PRIMARY KEY (`group_id`,`template_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组关联表'; --- ---------------------------- --- Records of gen_template_group --- ---------------------------- -BEGIN; -INSERT INTO `gen_template_group` VALUES (1, 1); -INSERT INTO `gen_template_group` VALUES (1, 2); -INSERT INTO `gen_template_group` VALUES (1, 3); -INSERT INTO `gen_template_group` VALUES (1, 4); -INSERT INTO `gen_template_group` VALUES (1, 5); -INSERT INTO `gen_template_group` VALUES (1, 6); -INSERT INTO `gen_template_group` VALUES (1, 7); -INSERT INTO `gen_template_group` VALUES (1, 8); -INSERT INTO `gen_template_group` VALUES (1, 9); -INSERT INTO `gen_template_group` VALUES (1, 10); -INSERT INTO `gen_template_group` VALUES (1, 11); -INSERT INTO `gen_template_group` VALUES (1, 12); -COMMIT; - # # Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar # -- Gitee From 011441b9f7d3e8a04761b53845220a916e4e4829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Mon, 22 Jul 2024 11:19:43 +0800 Subject: [PATCH 234/238] feat(release): v3.8.1 --- README.md | 8 ++++---- pig-common/pig-common-bom/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9c606de3..76975a9c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

        - Build Status + Build Status Coverage Status Downloads Downloads @@ -42,10 +42,10 @@ |-----------------------------|------------| | Spring Boot | 2.7.18 | | Spring Cloud | 2021.0.8 | -| Spring Cloud Alibaba | 2021.0.6.0 | +| Spring Cloud Alibaba | 2021.0.6.1 | | Spring Authorization Server | 0.4.4 | -| Mybatis Plus | 3.5.6 | -| hutool | 5.8.27 | +| Mybatis Plus | 3.5.7 | +| hutool | 5.8.29 | ### 模块说明 diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index 0e713e75..9c1c1ac1 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -14,7 +14,7 @@ pig cloud parent - 3.8.0-JDK8 + 3.8.1-JDK8 2.7.18 UTF-8 2.17.1 diff --git a/pom.xml b/pom.xml index 43ab6502..56b80365 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ - 3.8.0-JDK8 + 3.8.1-JDK8 2.7.18 2021.0.8 2021.0.6.1 -- Gitee From 6affe64e92500ff4b5ba8ebdeef005f98cf218e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Fri, 2 Aug 2024 19:14:09 +0800 Subject: [PATCH 235/238] refactor(security): Validator.isMobile randomStr --- .../com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java index 42bed102..6197f134 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/ImageCodeEndpoint.java @@ -1,5 +1,6 @@ package com.pig4cloud.pig.auth.endpoint; +import cn.hutool.core.lang.Validator; import com.pig4cloud.pig.common.core.constant.CacheConstants; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import io.springboot.captcha.ArithmeticCaptcha; @@ -38,6 +39,10 @@ public class ImageCodeEndpoint { public void image(String randomStr, HttpServletResponse response) { ArithmeticCaptcha captcha = new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT); + if (Validator.isMobile(randomStr)) { + return; + } + String result = captcha.text(); redisTemplate.opsForValue() .set(CacheConstants.DEFAULT_CODE_KEY + randomStr, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); -- Gitee From a4da82747e9a09217e0762686c713504c0d6d3cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 6 Aug 2024 12:36:34 +0800 Subject: [PATCH 236/238] refactor(codegen): GroupVo -> GroupVO --- .../pig4cloud/pig/codegen/util/vo/{GroupVo.java => GroupVO.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/{GroupVo.java => GroupVO.java} (100%) diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVO.java similarity index 100% rename from pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVo.java rename to pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/util/vo/GroupVO.java -- Gitee From 779a0ccd39c1f9bc106fe14f5d3d24ab26c9ef40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 13 Aug 2024 09:27:47 +0800 Subject: [PATCH 237/238] =?UTF-8?q?fix(=E9=94=81=E5=AE=9A):=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bug: 用户管理列表页切换状态不生效 Closes IAJID5 --- .../service/impl/SysUserServiceImpl.java | 766 +++++++++--------- pig-visual/pig-codegen/pom.xml | 2 +- 2 files changed, 390 insertions(+), 378 deletions(-) diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index f65a2aca..cfe872d7 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -68,382 +68,394 @@ import java.util.stream.Collectors; @AllArgsConstructor public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); - - private final SysMenuService sysMenuService; - - private final SysRoleService sysRoleService; - - private final SysPostService sysPostService; - - private final SysDeptService sysDeptService; - - private final SysUserRoleMapper sysUserRoleMapper; - - private final SysUserPostMapper sysUserPostMapper; - - private final CacheManager cacheManager; - - /** - * 保存用户信息 - * @param userDto DTO 对象 - * @return success/fail - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean saveUser(UserDTO userDto) { - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); - sysUser.setCreateBy(userDto.getUsername()); - sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - baseMapper.insert(sysUser); - // 保存用户岗位信息 - Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { - posts.stream().map(postId -> { - SysUserPost userPost = new SysUserPost(); - userPost.setUserId(sysUser.getUserId()); - userPost.setPostId(postId); - return userPost; - }).forEach(sysUserPostMapper::insert); - }); - - // 如果角色为空,赋默认角色 - if (CollUtil.isEmpty(userDto.getRole())) { - // 获取默认角色编码 - String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - // 默认角色 - SysRole sysRole = sysRoleService - .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); - userDto.setRole(Collections.singletonList(sysRole.getRoleId())); - } - - // 插入用户角色关系表 - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(sysUserRoleMapper::insert); - return Boolean.TRUE; - } - - /** - * 通过查用户的全部信息 - * @param sysUser 用户 - * @return - */ - @Override - public UserInfo findUserInfo(SysUser sysUser) { - UserInfo userInfo = new UserInfo(); - userInfo.setSysUser(sysUser); - // 设置角色列表 (ID) - List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) - .stream() - .map(SysRole::getRoleId) - .collect(Collectors.toList()); - userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); - - // 设置权限列表(menu.permission) - Set permissions = new HashSet<>(); - roleIds.forEach(roleId -> { - List permissionList = sysMenuService.findMenuByRoleId(roleId) - .stream() - .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) - .map(SysMenu::getPermission) - .collect(Collectors.toList()); - permissions.addAll(permissionList); - }); - userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); - return userInfo; - } - - /** - * 分页查询用户信息(含有角色信息) - * @param page 分页对象 - * @param userDTO 参数列表 - * @return - */ - @Override - public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { - return baseMapper.getUserVosPage(page, userDTO); - } - - /** - * 通过ID查询用户信息 - * @param id 用户ID - * @return 用户信息 - */ - @Override - public UserVO selectUserVoById(Long id) { - return baseMapper.getUserVoById(id); - } - - /** - * 删除用户 - * @param ids 用户ID 列表 - * @return Boolean - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean deleteUserByIds(Long[] ids) { - // 删除 spring cache - List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); - Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); - for (SysUser sysUser : userList) { - // 立即删除 - cache.evictIfPresent(sysUser.getUsername()); - } - - sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); - this.removeBatchByIds(CollUtil.toList(ids)); - return Boolean.TRUE; - } - - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R updateUserInfo(UserDTO userDto) { - SysUser sysUser = new SysUser(); - sysUser.setPhone(userDto.getPhone()); - sysUser.setUserId(SecurityUtils.getUser().getId()); - sysUser.setAvatar(userDto.getAvatar()); - sysUser.setNickname(userDto.getNickname()); - sysUser.setName(userDto.getName()); - sysUser.setEmail(userDto.getEmail()); - return R.ok(this.updateById(sysUser)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public Boolean updateUser(UserDTO userDto) { - // 更新用户表信息 - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(userDto, sysUser); - sysUser.setUpdateTime(LocalDateTime.now()); - if (StrUtil.isNotBlank(userDto.getPassword())) { - sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - } - this.updateById(sysUser); - - // 更新用户角色表 - sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); - userDto.getRole().stream().map(roleId -> { - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); - return userRole; - }).forEach(SysUserRole::insert); - - // 更新用户岗位表 - sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); - userDto.getPost().stream().map(postId -> { - SysUserPost userPost = new SysUserPost(); - userPost.setUserId(sysUser.getUserId()); - userPost.setPostId(postId); - return userPost; - }).forEach(SysUserPost::insert); - return Boolean.TRUE; - } - - /** - * 查询全部的用户 - * @param userDTO 查询条件 - * @return list - */ - @Override - public List listUser(UserDTO userDTO) { - // 根据数据权限查询全部的用户信息 - List voList = baseMapper.selectVoList(userDTO); - // 转换成execl 对象输出 - return voList.stream().map(userVO -> { - UserExcelVO excelVO = new UserExcelVO(); - BeanUtils.copyProperties(userVO, excelVO); - String roleNameList = userVO.getRoleList() - .stream() - .map(SysRole::getRoleName) - .collect(Collectors.joining(StrUtil.COMMA)); - excelVO.setRoleNameList(roleNameList); - String postNameList = userVO.getPostList() - .stream() - .map(SysPost::getPostName) - .collect(Collectors.joining(StrUtil.COMMA)); - excelVO.setPostNameList(postNameList); - return excelVO; - }).collect(Collectors.toList()); - } - - /** - * excel 导入用户, 插入正确的 错误的提示行号 - * @param excelVOList excel 列表数据 - * @param bindingResult 错误数据 - * @return ok fail - */ - @Override - public R importUser(List excelVOList, BindingResult bindingResult) { - // 通用校验获取失败的数据 - List errorMessageList = (List) bindingResult.getTarget(); - List deptList = sysDeptService.list(); - List roleList = sysRoleService.list(); - List postList = sysPostService.list(); - - // 执行数据插入操作 组装 UserDto - for (UserExcelVO excel : excelVOList) { - // 个性化校验逻辑 - List userList = this.list(); - - Set errorMsg = new HashSet<>(); - // 校验用户名是否存在 - boolean exsitUserName = userList.stream() - .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); - - if (exsitUserName) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); - } - - // 判断输入的部门名称列表是否合法 - Optional deptOptional = deptList.stream() - .filter(dept -> excel.getDeptName().equals(dept.getName())) - .findFirst(); - if (!deptOptional.isPresent()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); - } - - // 判断输入的角色名称列表是否合法 - List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); - List roleCollList = roleList.stream() - .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) - .collect(Collectors.toList()); - - if (roleCollList.size() != roleNameList.size()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); - } - - // 判断输入的部门名称列表是否合法 - List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); - List postCollList = postList.stream() - .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) - .collect(Collectors.toList()); - - if (postCollList.size() != postNameList.size()) { - errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); - } - - // 数据合法情况 - if (CollUtil.isEmpty(errorMsg)) { - insertExcelUser(excel, deptOptional, roleCollList, postCollList); - } - else { - // 数据不合法情况 - errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); - } - - } - - if (CollUtil.isNotEmpty(errorMessageList)) { - return R.failed(errorMessageList); - } - return R.ok(); - } - - /** - * 插入excel User - */ - private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, - List postCollList) { - UserDTO userDTO = new UserDTO(); - userDTO.setUsername(excel.getUsername()); - userDTO.setPhone(excel.getPhone()); - userDTO.setNickname(excel.getNickname()); - userDTO.setName(excel.getName()); - userDTO.setEmail(excel.getEmail()); - // 批量导入初始密码为手机号 - userDTO.setPassword(userDTO.getPhone()); - // 根据部门名称查询部门ID - userDTO.setDeptId(deptOptional.get().getDeptId()); - // 插入岗位名称 - List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); - userDTO.setPost(postIdList); - // 根据角色名称查询角色ID - List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); - userDTO.setRole(roleIdList); - // 插入用户 - this.saveUser(userDTO); - } - - /** - * 注册用户 赋予用户默认角色 - * @param userDto 用户信息 - * @return success/false - */ - @Override - @Transactional(rollbackFor = Exception.class) - public R registerUser(UserDTO userDto) { - // 判断用户名是否存在 - SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); - if (sysUser != null) { - String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); - return R.failed(message); - } - return R.ok(saveUser(userDto)); - } - - /** - * 锁定用户 - * @param username 用户名 - * @return - */ - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") - public R lockUser(String username) { - SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - - if (Objects.nonNull(sysUser)) { - sysUser.setLockFlag(CommonConstants.STATUS_LOCK); - baseMapper.updateById(sysUser); - } - return R.ok(); - } - - @Override - @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") - public R changePassword(UserDTO userDto) { - SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); - if (Objects.isNull(sysUser)) { - return R.failed("用户不存在"); - } - - if (StrUtil.isEmpty(userDto.getPassword())) { - return R.failed("原密码不能为空"); - } - - if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { - log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); - } - - if (StrUtil.isEmpty(userDto.getNewpassword1())) { - return R.failed("新密码不能为空"); - } - String password = ENCODER.encode(userDto.getNewpassword1()); - - this.update(Wrappers.lambdaUpdate() - .set(SysUser::getPassword, password) - .eq(SysUser::getUserId, sysUser.getUserId())); - return R.ok(); - } - - @Override - public R checkPassword(String password) { - SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); - - if (!ENCODER.matches(password, sysUser.getPassword())) { - log.info("原密码错误"); - return R.failed("密码输入错误"); - } - else { - return R.ok(); - } - } + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); + + private final SysMenuService sysMenuService; + + private final SysRoleService sysRoleService; + + private final SysPostService sysPostService; + + private final SysDeptService sysDeptService; + + private final SysUserRoleMapper sysUserRoleMapper; + + private final SysUserPostMapper sysUserPostMapper; + + private final CacheManager cacheManager; + + /** + * 保存用户信息 + * + * @param userDto DTO 对象 + * @return success/fail + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveUser(UserDTO userDto) { + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); + sysUser.setCreateBy(userDto.getUsername()); + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + baseMapper.insert(sysUser); + // 保存用户岗位信息 + Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { + posts.stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(sysUserPostMapper::insert); + }); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService + .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); + return Boolean.TRUE; + } + + /** + * 通过查用户的全部信息 + * + * @param sysUser 用户 + * @return + */ + @Override + public UserInfo findUserInfo(SysUser sysUser) { + UserInfo userInfo = new UserInfo(); + userInfo.setSysUser(sysUser); + // 设置角色列表 (ID) + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) + .stream() + .map(SysRole::getRoleId) + .collect(Collectors.toList()); + userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + + // 设置权限列表(menu.permission) + Set permissions = new HashSet<>(); + roleIds.forEach(roleId -> { + List permissionList = sysMenuService.findMenuByRoleId(roleId) + .stream() + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())) + .map(SysMenu::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); + userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); + return userInfo; + } + + /** + * 分页查询用户信息(含有角色信息) + * + * @param page 分页对象 + * @param userDTO 参数列表 + * @return + */ + @Override + public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { + return baseMapper.getUserVosPage(page, userDTO); + } + + /** + * 通过ID查询用户信息 + * + * @param id 用户ID + * @return 用户信息 + */ + @Override + public UserVO selectUserVoById(Long id) { + return baseMapper.getUserVoById(id); + } + + /** + * 删除用户 + * + * @param ids 用户ID 列表 + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteUserByIds(Long[] ids) { + // 删除 spring cache + List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + for (SysUser sysUser : userList) { + // 立即删除 + cache.evictIfPresent(sysUser.getUsername()); + } + + sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); + this.removeBatchByIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R updateUserInfo(UserDTO userDto) { + SysUser sysUser = new SysUser(); + sysUser.setPhone(userDto.getPhone()); + sysUser.setUserId(SecurityUtils.getUser().getId()); + sysUser.setAvatar(userDto.getAvatar()); + sysUser.setNickname(userDto.getNickname()); + sysUser.setName(userDto.getName()); + sysUser.setEmail(userDto.getEmail()); + return R.ok(this.updateById(sysUser)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public Boolean updateUser(UserDTO userDto) { + // 更新用户表信息 + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setUpdateTime(LocalDateTime.now()); + if (StrUtil.isNotBlank(userDto.getPassword())) { + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + } + this.updateById(sysUser); + + // 更新用户角色表 + if (Objects.nonNull(userDto.getRole())) { + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(SysUserRole::insert); + } + + + // 更新用户岗位表 + if (Objects.nonNull(userDto.getPost())) { + sysUserPostMapper.delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); + userDto.getPost().stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(SysUserPost::insert); + } + return Boolean.TRUE; + } + + /** + * 查询全部的用户 + * + * @param userDTO 查询条件 + * @return list + */ + @Override + public List listUser(UserDTO userDTO) { + // 根据数据权限查询全部的用户信息 + List voList = baseMapper.selectVoList(userDTO); + // 转换成execl 对象输出 + return voList.stream().map(userVO -> { + UserExcelVO excelVO = new UserExcelVO(); + BeanUtils.copyProperties(userVO, excelVO); + String roleNameList = userVO.getRoleList() + .stream() + .map(SysRole::getRoleName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setRoleNameList(roleNameList); + String postNameList = userVO.getPostList() + .stream() + .map(SysPost::getPostName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setPostNameList(postNameList); + return excelVO; + }).collect(Collectors.toList()); + } + + /** + * excel 导入用户, 插入正确的 错误的提示行号 + * + * @param excelVOList excel 列表数据 + * @param bindingResult 错误数据 + * @return ok fail + */ + @Override + public R importUser(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + List deptList = sysDeptService.list(); + List roleList = sysRoleService.list(); + List postList = sysPostService.list(); + + // 执行数据插入操作 组装 UserDto + for (UserExcelVO excel : excelVOList) { + // 个性化校验逻辑 + List userList = this.list(); + + Set errorMsg = new HashSet<>(); + // 校验用户名是否存在 + boolean exsitUserName = userList.stream() + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + + if (exsitUserName) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); + } + + // 判断输入的部门名称列表是否合法 + Optional deptOptional = deptList.stream() + .filter(dept -> excel.getDeptName().equals(dept.getName())) + .findFirst(); + if (!deptOptional.isPresent()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); + } + + // 判断输入的角色名称列表是否合法 + List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); + List roleCollList = roleList.stream() + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); + + if (roleCollList.size() != roleNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); + } + + // 判断输入的部门名称列表是否合法 + List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); + List postCollList = postList.stream() + .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) + .collect(Collectors.toList()); + + if (postCollList.size() != postNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelUser(excel, deptOptional, roleCollList, postCollList); + } else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + + } + + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 插入excel User + */ + private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, + List postCollList) { + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(excel.getUsername()); + userDTO.setPhone(excel.getPhone()); + userDTO.setNickname(excel.getNickname()); + userDTO.setName(excel.getName()); + userDTO.setEmail(excel.getEmail()); + // 批量导入初始密码为手机号 + userDTO.setPassword(userDTO.getPhone()); + // 根据部门名称查询部门ID + userDTO.setDeptId(deptOptional.get().getDeptId()); + // 插入岗位名称 + List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); + userDTO.setPost(postIdList); + // 根据角色名称查询角色ID + List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); + userDTO.setRole(roleIdList); + // 插入用户 + this.saveUser(userDTO); + } + + /** + * 注册用户 赋予用户默认角色 + * + * @param userDto 用户信息 + * @return success/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R registerUser(UserDTO userDto) { + // 判断用户名是否存在 + SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); + if (sysUser != null) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + return R.ok(saveUser(userDto)); + } + + /** + * 锁定用户 + * + * @param username 用户名 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") + public R lockUser(String username) { + SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + + if (Objects.nonNull(sysUser)) { + sysUser.setLockFlag(CommonConstants.STATUS_LOCK); + baseMapper.updateById(sysUser); + } + return R.ok(); + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R changePassword(UserDTO userDto) { + SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); + if (Objects.isNull(sysUser)) { + return R.failed("用户不存在"); + } + + if (StrUtil.isEmpty(userDto.getPassword())) { + return R.failed("原密码不能为空"); + } + + if (!ENCODER.matches(userDto.getPassword(), sysUser.getPassword())) { + log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); + } + + if (StrUtil.isEmpty(userDto.getNewpassword1())) { + return R.failed("新密码不能为空"); + } + String password = ENCODER.encode(userDto.getNewpassword1()); + + this.update(Wrappers.lambdaUpdate() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, sysUser.getUserId())); + return R.ok(); + } + + @Override + public R checkPassword(String password) { + SysUser sysUser = baseMapper.selectById(SecurityUtils.getUser().getId()); + + if (!ENCODER.matches(password, sysUser.getPassword())) { + log.info("原密码错误"); + return R.failed("密码输入错误"); + } else { + return R.ok(); + } + } } diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index c3fe29e1..31990373 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -16,7 +16,7 @@ 0.0.6 - 8.7.2-20240717 + 8.7.2-20240808 1.10 -- Gitee From 439aaeab5e086805d44142bd0c5fbe17722928d1 Mon Sep 17 00:00:00 2001 From: huyue Date: Thu, 6 Feb 2025 10:38:52 +0800 Subject: [PATCH 238/238] =?UTF-8?q?=E5=8D=95=E4=BD=93=E7=89=88=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E8=B0=83=E7=94=A8=E4=BB=8Ehttp=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0service=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/local/LocalClientDetailsService.java | 46 +++++++ .../pig4cloud/pig/local/LocalDictService.java | 48 +++++++ .../pig4cloud/pig/local/LocalLogService.java | 45 +++++++ .../pig/local/LocalParamService.java | 44 ++++++ .../pig/local/LocalTokenService.java | 125 ++++++++++++++++++ .../pig4cloud/pig/local/LocalUserService.java | 58 ++++++++ .../openfeign/PigFeignClientsRegistrar.java | 2 +- 7 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/local/LocalClientDetailsService.java create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/local/LocalDictService.java create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/local/LocalLogService.java create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/local/LocalParamService.java create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/local/LocalTokenService.java create mode 100644 pig-boot/src/main/java/com/pig4cloud/pig/local/LocalUserService.java diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalClientDetailsService.java b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalClientDetailsService.java new file mode 100644 index 00000000..fa0ff12d --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalClientDetailsService.java @@ -0,0 +1,46 @@ +//The MIT License (MIT) +// +// Copyright (c) Harry +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +package com.pig4cloud.pig.local; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pig.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pig.admin.api.feign.RemoteClientDetailsService; +import com.pig4cloud.pig.admin.service.SysOauthClientDetailsService; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: Harry + * @date: 2025-02-06 10:21 + * @desc: LocalClientDetailsService + */ +@Service +public class LocalClientDetailsService implements RemoteClientDetailsService { + @Autowired + private SysOauthClientDetailsService clientDetailsService; + + @Override + public R getClientDetailsById(String clientId) { + return R.ok(clientDetailsService.getOne( + Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false)); + } +} diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalDictService.java b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalDictService.java new file mode 100644 index 00000000..bb8eb32f --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalDictService.java @@ -0,0 +1,48 @@ +//The MIT License (MIT) +// +// Copyright (c) Harry +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +package com.pig4cloud.pig.local; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pig.admin.api.entity.SysDictItem; +import com.pig4cloud.pig.admin.api.feign.RemoteDictService; +import com.pig4cloud.pig.admin.service.SysDictItemService; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author: Harry + * @date: 2025-02-06 10:24 + * @desc: LocalDictService + */ +@Service +public class LocalDictService implements RemoteDictService { + + @Autowired + private SysDictItemService sysDictItemService; + + @Override + public R> getDictByType(String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); + } +} diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalLogService.java b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalLogService.java new file mode 100644 index 00000000..3002c3f2 --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalLogService.java @@ -0,0 +1,45 @@ +//The MIT License (MIT) +// +// Copyright (c) Harry +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +package com.pig4cloud.pig.local; + +import com.pig4cloud.pig.admin.api.entity.SysLog; +import com.pig4cloud.pig.admin.api.feign.RemoteLogService; +import com.pig4cloud.pig.admin.service.SysLogService; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: Harry + * @date: 2025-02-06 10:26 + * @desc: LocalLogService + */ +@Service +public class LocalLogService implements RemoteLogService { + + @Autowired + private SysLogService sysLogService;; + + @Override + public R saveLog(SysLog sysLog) { + return R.ok(sysLogService.saveLog(sysLog)); + } +} diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalParamService.java b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalParamService.java new file mode 100644 index 00000000..ac9962ef --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalParamService.java @@ -0,0 +1,44 @@ +//The MIT License (MIT) +// +// Copyright (c) Harry +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +package com.pig4cloud.pig.local; + +import com.pig4cloud.pig.admin.api.feign.RemoteParamService; +import com.pig4cloud.pig.admin.service.SysPublicParamService; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: Harry + * @date: 2025-02-06 10:28 + * @desc: LocalParamService + */ +@Service +public class LocalParamService implements RemoteParamService{ + + @Autowired + private SysPublicParamService sysPublicParamService; + + @Override + public R getByKey(String key) { + return R.ok(sysPublicParamService.getSysPublicParamKeyToValue(key)); + } +} diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalTokenService.java b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalTokenService.java new file mode 100644 index 00000000..93f59e1b --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalTokenService.java @@ -0,0 +1,125 @@ +//The MIT License (MIT) +// +// Copyright (c) Harry +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +package com.pig4cloud.pig.local; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.TemporalAccessorUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pig.admin.api.feign.RemoteClientDetailsService; +import com.pig4cloud.pig.admin.api.feign.RemoteTokenService; +import com.pig4cloud.pig.admin.api.vo.TokenVo; +import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.constant.CommonConstants; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.authentication.event.LogoutSuccessEvent; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author: Harry + * @date: 2025-02-06 10:30 + * @desc: LocalTokenService + */ +@Service +public class LocalTokenService implements RemoteTokenService { + + + @Autowired + private OAuth2AuthorizationService authorizationService; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private CacheManager cacheManager; + + @Override + public R getTokenPage(Map params) { + // 根据分页参数获取对应数据 + String key = String.format("%s::*", CacheConstants.PROJECT_OAUTH_ACCESS); + int current = MapUtil.getInt(params, CommonConstants.CURRENT); + int size = MapUtil.getInt(params, CommonConstants.SIZE); + Set keys = redisTemplate.keys(key); + List pages = keys.stream().skip((current - 1) * size).limit(size).collect(Collectors.toList()); + Page result = new Page(current, size); + + List tokenVoList = redisTemplate.opsForValue().multiGet(pages).stream().map(obj -> { + OAuth2Authorization authorization = (OAuth2Authorization) obj; + TokenVo tokenVo = new TokenVo(); + tokenVo.setClientId(authorization.getRegisteredClientId()); + tokenVo.setId(authorization.getId()); + tokenVo.setUsername(authorization.getPrincipalName()); + OAuth2Authorization.Token accessToken = authorization.getAccessToken(); + tokenVo.setAccessToken(accessToken.getToken().getTokenValue()); + + String expiresAt = TemporalAccessorUtil.format(accessToken.getToken().getExpiresAt(), + DatePattern.NORM_DATETIME_PATTERN); + tokenVo.setExpiresAt(expiresAt); + + String issuedAt = TemporalAccessorUtil.format(accessToken.getToken().getIssuedAt(), + DatePattern.NORM_DATETIME_PATTERN); + tokenVo.setIssuedAt(issuedAt); + return tokenVo; + }).collect(Collectors.toList()); + result.setRecords(tokenVoList); + result.setTotal(keys.size()); + return R.ok(result); + } + + @Override + public R removeTokenById(String token) { + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (authorization == null) { + return R.ok(); + } + + OAuth2Authorization.Token accessToken = authorization.getAccessToken(); + if (accessToken == null || StrUtil.isBlank(accessToken.getToken().getTokenValue())) { + return R.ok(); + } + // 清空用户信息(立即删除) + cacheManager.getCache(CacheConstants.USER_DETAILS).evictIfPresent(authorization.getPrincipalName()); + // 清空access token + authorizationService.remove(authorization); + // 处理自定义退出事件,保存相关日志 + SpringContextHolder.publishEvent(new LogoutSuccessEvent(new PreAuthenticatedAuthenticationToken( + authorization.getPrincipalName(), authorization.getRegisteredClientId()))); + return R.ok(); + } + + @Override + public R> queryToken(String token) { + return null; + } +} diff --git a/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalUserService.java b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalUserService.java new file mode 100644 index 00000000..e929b5a4 --- /dev/null +++ b/pig-boot/src/main/java/com/pig4cloud/pig/local/LocalUserService.java @@ -0,0 +1,58 @@ +//The MIT License (MIT) +// +// Copyright (c) Harry +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +package com.pig4cloud.pig.local; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pig.admin.api.dto.UserDTO; +import com.pig4cloud.pig.admin.api.dto.UserInfo; +import com.pig4cloud.pig.admin.api.entity.SysUser; +import com.pig4cloud.pig.admin.api.feign.RemoteUserService; +import com.pig4cloud.pig.admin.service.SysUserService; +import com.pig4cloud.pig.common.core.exception.ErrorCodes; +import com.pig4cloud.pig.common.core.util.MsgUtils; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: Harry + * @date: 2025-02-06 09:22 + * @desc: LocalUserService + */ +@Service +public class LocalUserService implements RemoteUserService { + + @Autowired + private SysUserService sysUserService; + + @Override + public R info(UserDTO user) { + SysUser sysUser = sysUserService.getOne(Wrappers.query() + .lambda() + .eq(StrUtil.isNotBlank(user.getUsername()), SysUser::getUsername, user.getUsername()) + .eq(StrUtil.isNotBlank(user.getPhone()), SysUser::getPhone, user.getPhone())); + if (sysUser == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, user.getUsername())); + } + return R.ok(sysUserService.findUserInfo(sysUser)); + } +} diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 6f9f0511..2fef1a2b 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -89,7 +89,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, // 如果是单体项目自动注入 & url 为空 Boolean isMicro = environment.getProperty("spring.cloud.nacos.discovery.enabled", Boolean.class, true); // 如果已经存在该 bean,支持原生的 Feign - if (registry.containsBeanDefinition(className) && isMicro) { + if (!isMicro || registry.containsBeanDefinition(className)) { continue; } -- Gitee