From fc0b04a0dacf3dd228f2366b86affd184ac03d38 Mon Sep 17 00:00:00 2001 From: "felix.ma" Date: Fri, 24 Apr 2020 14:39:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=89=8D=E6=AE=B5=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=94=B9=E4=B8=BAspringboot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- carrera-console/carrera-boot/pom.xml | 244 ++ .../carrera/console/ConsoleApplication.java | 52 + .../offset/RocketMQProduceOffsetFetcher.java | 76 + .../console/common/util/CacheLockUtils.java | 16 + .../console/common/util/CodecsUtils.java | 73 + .../console/common/util/FastJsonUtils.java | 26 + .../console/common/util/HostUtils.java | 40 + .../carrera/console/common/util/LogUtils.java | 14 + .../config/ApplicationStartedLintener.java | 28 + .../carrera/console/config/ConsoleConfig.java | 71 + .../console/config/SpringBeanConfig.java | 77 + .../didi/carrera/console/dao/BaseMapper.java | 5 + .../com/didi/carrera/console/dao/DaoUtil.java | 14 + .../console/dao/MybatisInterceptor.java | 150 + .../dao/dict/ClusterMqServerRelationType.java | 42 + .../dict/ConsumeSubscriptionAlarmType.java | 46 + .../dao/dict/ConsumeSubscriptionApiType.java | 46 + .../dict/ConsumeSubscriptionBigDataType.java | 46 + .../dict/ConsumeSubscriptionConsumeType.java | 46 + .../dict/ConsumeSubscriptionHttpMethod.java | 46 + .../dict/ConsumeSubscriptionMsgPushType.java | 47 + .../dao/dict/ConsumeSubscriptionMsgType.java | 47 + .../ConsumeSubscriptionPressureTraffic.java | 46 + .../carrera/console/dao/dict/IsDelete.java | 46 + .../carrera/console/dao/dict/IsEnable.java | 54 + .../console/dao/dict/MqServerType.java | 45 + .../carrera/console/dao/dict/NodeType.java | 54 + .../dao/dict/TopicCompressionType.java | 46 + .../console/dao/dict/TopicDelayTopic.java | 46 + .../console/dao/dict/TopicProduceMode.java | 62 + .../console/dao/mapper/ClusterMapper.java | 31 + .../mapper/ClusterMqserverRelationMapper.java | 31 + .../dao/mapper/ConsumeGroupMapper.java | 31 + .../dao/mapper/ConsumeSubscriptionMapper.java | 37 + .../carrera/console/dao/mapper/IdcMapper.java | 31 + .../console/dao/mapper/MqServerMapper.java | 32 + .../console/dao/mapper/NodeMapper.java | 31 + .../console/dao/mapper/TopicConfMapper.java | 31 + .../console/dao/mapper/TopicMapper.java | 37 + .../custom/ConsumeGroupCustomMapper.java | 121 + .../ConsumeSubscriptionCustomMapper.java | 278 ++ .../mapper/custom/TopicConfCustomMapper.java | 11 + .../dao/mapper/custom/TopicCustomMapper.java | 114 + .../carrera/console/dao/model/Cluster.java | 202 ++ .../console/dao/model/ClusterCriteria.java | 801 +++++ .../dao/model/ClusterMqserverRelation.java | 220 ++ .../ClusterMqserverRelationCriteria.java | 851 +++++ .../console/dao/model/ConsumeGroup.java | 423 +++ .../dao/model/ConsumeGroupCriteria.java | 1451 +++++++++ .../dao/model/ConsumeSubscription.java | 884 ++++++ .../model/ConsumeSubscriptionCriteria.java | 2821 +++++++++++++++++ .../didi/carrera/console/dao/model/Idc.java | 148 + .../console/dao/model/IdcCriteria.java | 601 ++++ .../carrera/console/dao/model/MqServer.java | 166 + .../console/dao/model/MqServerCriteria.java | 661 ++++ .../didi/carrera/console/dao/model/Node.java | 202 ++ .../console/dao/model/NodeCriteria.java | 771 +++++ .../didi/carrera/console/dao/model/Topic.java | 441 +++ .../carrera/console/dao/model/TopicConf.java | 387 +++ .../console/dao/model/TopicConfCriteria.java | 1361 ++++++++ .../console/dao/model/TopicCriteria.java | 1451 +++++++++ .../dao/model/custom/ConsumeGroupConfig.java | 53 + .../custom/ConsumeSubscriptionConfig.java | 136 + .../custom/CustomConsumeSubscription.java | 85 + .../custom/CustomSubscriptionStateCount.java | 44 + .../dao/model/custom/CustomTopicConf.java | 158 + .../dao/model/custom/TopicConfConfig.java | 27 + .../console/dao/model/custom/TopicConfig.java | 51 + .../didi/carrera/console/data/Message.java | 85 + .../ClusterMqserverRelationService.java | 21 + .../console/service/ClusterService.java | 18 + .../console/service/ConsumeGroupService.java | 46 + .../service/ConsumeSubscriptionService.java | 63 + .../console/service/MqServerService.java | 21 + .../carrera/console/service/NodeService.java | 27 + .../console/service/OffsetManagerService.java | 16 + .../console/service/RmqAdminService.java | 25 + .../console/service/TopicConfService.java | 32 + .../carrera/console/service/TopicService.java | 52 + .../console/service/ZKV4ConfigService.java | 49 + .../console/service/bean/PageModel.java | 97 + .../exception/ConvertDataException.java | 6 + .../service/exception/MqException.java | 12 + .../service/exception/ZkConfigException.java | 8 + .../ClusterMqserverRelationServiceImpl.java | 70 + .../service/impl/ClusterServiceImpl.java | 54 + .../service/impl/ConsumeGroupServiceImpl.java | 439 +++ .../impl/ConsumeSubscriptionServiceImpl.java | 827 +++++ .../service/impl/MqServerServiceImpl.java | 103 + .../console/service/impl/NodeServiceImpl.java | 166 + .../impl/OffsetManagerServiceImpl.java | 325 ++ .../service/impl/RmqAdminServiceImpl.java | 338 ++ .../service/impl/TopicConfServiceImpl.java | 142 + .../service/impl/TopicServiceImpl.java | 698 ++++ .../service/impl/ZKV4ConfigServiceImpl.java | 1073 +++++++ .../service/vo/ConsumeGroupSearchItemVo.java | 34 + .../console/service/vo/ConsumeGroupVo.java | 65 + .../service/vo/GroupConsumeStateVo.java | 121 + .../console/service/vo/SearchItemVo.java | 36 + .../service/vo/SubscriptionOrderListVo.java | 79 + .../console/service/vo/TopicConfVo.java | 136 + .../console/service/vo/TopicListGroupVo.java | 68 + .../console/service/vo/TopicMessageVo.java | 88 + .../console/service/vo/TopicOrderVo.java | 30 + .../console/service/vo/TopicSimpleVo.java | 41 + .../console/service/vo/TopicStateVo.java | 88 + .../console/web/AbstractBaseController.java | 148 + .../console/web/ConsoleBaseResponse.java | 100 + .../web/controller/LoginInterceptor.java | 58 + .../web/controller/bo/AcceptTopicConfBo.java | 48 + .../console/web/controller/bo/BaseBo.java | 27 + .../web/controller/bo/BaseOrderBo.java | 59 + .../web/controller/bo/ConsumeGroupBo.java | 269 ++ .../bo/ConsumeGroupResetOffsetBo.java | 110 + .../bo/ConsumeSubscriptionBaseBo.java | 645 ++++ .../bo/ConsumeSubscriptionOrderBo.java | 33 + .../console/web/controller/bo/MqServerBo.java | 53 + .../console/web/controller/bo/NodeBo.java | 64 + .../web/controller/bo/TopicConfBo.java | 130 + .../web/controller/bo/TopicOrderBo.java | 334 ++ .../console/ConsumeGroupController.java | 78 + .../ConsumeSubscriptionController.java | 46 + .../controller/console/TopicController.java | 58 + .../controller/odin/InternalController.java | 235 ++ .../AnotherFieldEqualsSpecifiedValue.java | 41 + ...herFieldEqualsSpecifiedValueValidator.java | 46 + .../web/filter/ConsoleExceptionFilter.java | 102 + .../web/filter/JsonMessageConverter.java | 155 + .../console/web/filter/RequestContext.java | 217 ++ .../carrera/console/web/util/CookieUtil.java | 31 + .../web/util/DateTimePropertyEditor.java | 41 + .../carrera/console/web/util/DateUtil.java | 762 +++++ .../console/web/util/RemoteSource.java | 16 + .../carrera/console/web/util/RequestUtil.java | 32 + .../web/util/StringPropertyEditor.java | 23 + .../src/main/resources/application.yml | 29 + .../src/main/resources/console.yaml | 4 + .../src/main/resources/mybatis-config.xml | 17 + .../src/main/resources/nonelogback.xml | 113 + .../resources/sqlmap/ddmq/ClusterMapper.xml | 273 ++ .../ddmq/ClusterMqserverRelationMapper.xml | 291 ++ .../sqlmap/ddmq/ConsumeGroupCustomMapper.xml | 50 + .../sqlmap/ddmq/ConsumeGroupMapper.xml | 433 +++ .../ddmq/ConsumeSubscriptionCustomMapper.xml | 110 + .../sqlmap/ddmq/ConsumeSubscriptionMapper.xml | 926 ++++++ .../main/resources/sqlmap/ddmq/IdcMapper.xml | 226 ++ .../resources/sqlmap/ddmq/MqServerMapper.xml | 243 ++ .../main/resources/sqlmap/ddmq/NodeMapper.xml | 273 ++ .../sqlmap/ddmq/TopicConfCustomMapper.xml | 37 + .../resources/sqlmap/ddmq/TopicConfMapper.xml | 416 +++ .../sqlmap/ddmq/TopicCustomMapper.xml | 62 + .../resources/sqlmap/ddmq/TopicMapper.xml | 518 +++ .../src/main/resources/static/.gitkeep | 0 .../src/main/resources/static/1.index.css | 1 + .../src/main/resources/static/ddmq-logo.svg | 1 + .../src/main/resources/static/favicon.ico | Bin 0 -> 3757 bytes .../main/resources/static/iconfont/demo.css | 370 +++ .../static/iconfont/demo_fontclass.html | 388 +++ .../static/iconfont/demo_symbol.html | 527 +++ .../static/iconfont/demo_unicode.html | 426 +++ .../resources/static/iconfont/iconfont.css | 133 + .../resources/static/iconfont/iconfont.eot | Bin 0 -> 12764 bytes .../resources/static/iconfont/iconfont.js | 1 + .../resources/static/iconfont/iconfont.svg | 200 ++ .../resources/static/iconfont/iconfont.ttf | Bin 0 -> 12596 bytes .../resources/static/iconfont/iconfont.woff | Bin 0 -> 7900 bytes .../src/main/resources/static/index.css | 8 + .../src/main/resources/static/index.html | 24 + .../src/main/resources/static/index.js | 1 + .../main/resources/static/logo-with-text.png | Bin 0 -> 11677 bytes .../src/main/resources/static/vendors.js | 44 + .../build/webpack.dev.config.js | 2 +- .../src/components/sidebar/index.vue | 2 +- carrera-console/control.sh | 12 +- carrera-docker/Dockerfile | 13 +- carrera-docker/play-ddmq.sh | 4 +- carrera-docker/start.sh | 2 +- 177 files changed, 32588 insertions(+), 15 deletions(-) create mode 100644 carrera-console/carrera-boot/pom.xml create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/ConsoleApplication.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/offset/RocketMQProduceOffsetFetcher.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CacheLockUtils.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CodecsUtils.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/FastJsonUtils.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/HostUtils.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/LogUtils.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ApplicationStartedLintener.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ConsoleConfig.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/SpringBeanConfig.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/BaseMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/DaoUtil.java create mode 100755 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/MybatisInterceptor.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ClusterMqServerRelationType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionAlarmType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionApiType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionBigDataType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionConsumeType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionHttpMethod.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgPushType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionPressureTraffic.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsDelete.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsEnable.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/MqServerType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/NodeType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicCompressionType.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicDelayTopic.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicProduceMode.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMqserverRelationMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeGroupMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeSubscriptionMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/IdcMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/MqServerMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/NodeMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicConfMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeGroupCustomMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeSubscriptionCustomMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicConfCustomMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicCustomMapper.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Cluster.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelation.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelationCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroup.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroupCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscription.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscriptionCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Idc.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/IdcCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServer.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServerCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Node.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/NodeCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Topic.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConf.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConfCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicCriteria.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeGroupConfig.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeSubscriptionConfig.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomConsumeSubscription.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomSubscriptionStateCount.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomTopicConf.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfConfig.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfig.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/data/Message.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterMqserverRelationService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeGroupService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeSubscriptionService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/MqServerService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/NodeService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/OffsetManagerService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/RmqAdminService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicConfService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ZKV4ConfigService.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/bean/PageModel.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ConvertDataException.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/MqException.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ZkConfigException.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterMqserverRelationServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeGroupServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeSubscriptionServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/MqServerServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/NodeServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/OffsetManagerServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/RmqAdminServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicConfServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ZKV4ConfigServiceImpl.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupSearchItemVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/GroupConsumeStateVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SearchItemVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SubscriptionOrderListVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicConfVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicListGroupVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicMessageVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicOrderVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicSimpleVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicStateVo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/AbstractBaseController.java create mode 100755 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/ConsoleBaseResponse.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/LoginInterceptor.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/AcceptTopicConfBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseOrderBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupResetOffsetBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionBaseBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionOrderBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/MqServerBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/NodeBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicConfBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicOrderBo.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeGroupController.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeSubscriptionController.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/TopicController.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/odin/InternalController.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValue.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValueValidator.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/ConsoleExceptionFilter.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/JsonMessageConverter.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/RequestContext.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/CookieUtil.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateTimePropertyEditor.java create mode 100755 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateUtil.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RemoteSource.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RequestUtil.java create mode 100644 carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/StringPropertyEditor.java create mode 100644 carrera-console/carrera-boot/src/main/resources/application.yml create mode 100644 carrera-console/carrera-boot/src/main/resources/console.yaml create mode 100755 carrera-console/carrera-boot/src/main/resources/mybatis-config.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/nonelogback.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMqserverRelationMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupCustomMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionCustomMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/IdcMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/MqServerMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/NodeMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfCustomMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicCustomMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicMapper.xml create mode 100644 carrera-console/carrera-boot/src/main/resources/static/.gitkeep create mode 100644 carrera-console/carrera-boot/src/main/resources/static/1.index.css create mode 100644 carrera-console/carrera-boot/src/main/resources/static/ddmq-logo.svg create mode 100644 carrera-console/carrera-boot/src/main/resources/static/favicon.ico create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/demo.css create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_fontclass.html create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_symbol.html create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_unicode.html create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.css create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.eot create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.js create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.svg create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.ttf create mode 100644 carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.woff create mode 100644 carrera-console/carrera-boot/src/main/resources/static/index.css create mode 100644 carrera-console/carrera-boot/src/main/resources/static/index.html create mode 100644 carrera-console/carrera-boot/src/main/resources/static/index.js create mode 100644 carrera-console/carrera-boot/src/main/resources/static/logo-with-text.png create mode 100644 carrera-console/carrera-boot/src/main/resources/static/vendors.js diff --git a/carrera-console/carrera-boot/pom.xml b/carrera-console/carrera-boot/pom.xml new file mode 100644 index 0000000..bd6719a --- /dev/null +++ b/carrera-console/carrera-boot/pom.xml @@ -0,0 +1,244 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.5.RELEASE + + + 4.0.0 + + com.xiaojukeji.ddmq + carrera-boot + 1.0-SNAPSHOT + + + UTF-8 + zh_CN + 1.8 + 3.6.1 + + 1.0.31 + 8.0.16 + 4.2.5 + + 1.7.25 + 1.2.3 + + + + + org.projectlombok + lombok + + + com.alibaba + druid + ${druid-version} + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.2 + + + + mysql + mysql-connector-java + ${mysql-connector-version} + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-jdbc + + + + javax.transaction + jta + 1.1 + + + com.atomikos + atomikos-util + 4.0.2 + + + com.atomikos + transactions + 4.0.2 + + + com.atomikos + transactions-jta + 4.0.2 + + + com.atomikos + transactions-jdbc + 4.0.2 + + + com.atomikos + transactions-api + 4.0.2 + + + + org.aspectj + aspectjrt + 1.8.10 + + + org.aspectj + aspectjweaver + 1.8.10 + + + + org.apache.commons + commons-lang3 + 3.4 + + + commons-beanutils + commons-beanutils + 1.9.2 + + + + com.xiaojukeji.ddmq + carrera-common + 1.0.0-SNAPSHOT + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-slf4j-impl + + + + + + commons-fileupload + commons-fileupload + 1.3.3 + + + org.yaml + snakeyaml + + + com.google.guava + guava + 21.0 + + + org.apache.commons + commons-collections4 + 4.1 + + + org.hibernate + hibernate-validator + 5.0.2.Final + + + com.alibaba + fastjson + 1.2.36 + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + ch.qos.logback + logback-core + ${logback.version} + + + + org.slf4j + log4j-over-slf4j + ${slf4j.version} + runtime + + + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + runtime + + + + + org.slf4j + jul-to-slf4j + ${slf4j.version} + runtime + + + + + org.bgee.log4jdbc-log4j2 + log4jdbc-log4j2-jdbc4 + 1.15 + runtime + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/ConsoleApplication.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/ConsoleApplication.java new file mode 100644 index 0000000..8da6ea9 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/ConsoleApplication.java @@ -0,0 +1,52 @@ +package com.didi.carrera.console; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +@Slf4j +@SpringBootApplication +@MapperScan("com.didi.carrera.console.dao.mapper") +public class ConsoleApplication { + public static void main(String[] args) { + SpringApplication app = new SpringApplication(ConsoleApplication.class); + Environment env = app.run(args).getEnvironment(); + log(env); + } + + /** + * 格式化运行成功后输出项目地址 + * + * @param env + */ + private static void log(Environment env) { + String name = env.getProperty("spring.application.name"); + String port = env.getProperty("server.port"); + String path = env.getProperty("server.servlet.context-path"); + String ssl = env.getProperty("server.ssl.enabled"); + String http = "true".equals(ssl) ? "https" : "http"; + String address = null; + try { + address = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + address = "127.0.0.1"; + e.printStackTrace(); + } + name = StringUtils.isEmpty(name) ? "" : name; + port = StringUtils.isEmpty(port) ? "8080" : port; + path = StringUtils.isEmpty(path) ? "" : path; + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + + "Local: \t\t{}://localhost:{}{}\n\t" + + "External: \t{}://{}:{}{}" + + "\n----------------------------------------------------------", + name, http, port, path, http, address, port, path); + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/offset/RocketMQProduceOffsetFetcher.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/offset/RocketMQProduceOffsetFetcher.java new file mode 100644 index 0000000..6bff2a3 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/offset/RocketMQProduceOffsetFetcher.java @@ -0,0 +1,76 @@ +package com.didi.carrera.console.common.offset; + +import com.google.common.collect.Maps; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.common.admin.ConsumeStats; +import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.common.protocol.body.AllMaxOffset; +import org.apache.rocketmq.common.protocol.body.ClusterInfo; +import org.apache.rocketmq.common.protocol.route.BrokerData; +import org.apache.rocketmq.tools.admin.DefaultMQAdminExt; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +public class RocketMQProduceOffsetFetcher { + + private static final Logger LOGGER = LoggerFactory.getLogger(RocketMQProduceOffsetFetcher.class); + + private DefaultMQAdminExt defaultMQAdminExt; + + public RocketMQProduceOffsetFetcher(String namesvrAddr) { + this.defaultMQAdminExt = new DefaultMQAdminExt(); + defaultMQAdminExt.setNamesrvAddr(namesvrAddr); + defaultMQAdminExt.setInstanceName("admin-" + System.currentTimeMillis()); + } + + public void start() throws MQClientException { + defaultMQAdminExt.start(); + } + + public void shutdown() { + defaultMQAdminExt.shutdown(); + } + + public Collection getBrokers() { + try { + ClusterInfo clusterInfo = defaultMQAdminExt.examineBrokerClusterInfo(); + Map brokerAddrTable = clusterInfo.getBrokerAddrTable(); + return brokerAddrTable.values(); + } catch (Exception e) { + LOGGER.error("GetBrokers Exception", e); + } + return Collections.emptyList(); + } + + public Map getMaxOffset(Collection brokers) { + HashMap offsetTable = Maps.newHashMap(); + if (CollectionUtils.isNotEmpty(brokers)) { + for (BrokerData broker : brokers) { + try { + AllMaxOffset allMaxOffset = defaultMQAdminExt.getAllMaxOffset(broker.selectBrokerAddr()); + for (Map.Entry> entry : allMaxOffset.getOffsetTable().entrySet()) { + for (Map.Entry entry1 : entry.getValue().entrySet()) { + MessageQueue mq = new MessageQueue(entry.getKey(), broker.getBrokerName(), entry1.getKey()); + offsetTable.put(mq, entry1.getValue()); + } + } + } catch (Exception e) { + LOGGER.error("GetMaxOffset Exception", e); + } + } + } + return offsetTable; + } + + public ConsumeStats getConsumeStats(String group, String topic) throws Exception { + return defaultMQAdminExt.examineConsumeStats(group, topic); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CacheLockUtils.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CacheLockUtils.java new file mode 100644 index 0000000..04f1a37 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CacheLockUtils.java @@ -0,0 +1,16 @@ +package com.didi.carrera.console.common.util; + +import java.util.concurrent.ConcurrentHashMap; + + +public class CacheLockUtils { + private static final ConcurrentHashMap CACHE_LOCK = new ConcurrentHashMap<>(); + + public static boolean lock(String key) { + return CACHE_LOCK.putIfAbsent(key, 1) == null; + } + + public static void unlock(String key) { + CACHE_LOCK.remove(key); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CodecsUtils.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CodecsUtils.java new file mode 100644 index 0000000..4910977 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/CodecsUtils.java @@ -0,0 +1,73 @@ +package com.didi.carrera.console.common.util; + + +public class CodecsUtils { + /** + * This method is used to judge whether byte[] is utf-8 encoding principle + * @param bytes + * @return true for bytes is utf-8 encoding principle + */ + public static boolean isUtf8(byte[] bytes) { + int len = bytes.length; + for (int i = 0; i < len; ++i) { + if (((bytes[i] >>> 7) & 0x1) == 0) { // 0xxxxxxxx + continue; + } else if (((bytes[i] >>> 5) & 0x7) == 0x6) { // 110xxxxx + for (int j = 0; j < 1; ++j) { + if (isRegular(bytes[i+1])) { + i += 1; + } else { + return false; + } + } + continue; + } else if (((bytes[i] >>> 4) & 0xf) == 0xe) { // 1110xxxx + for (int j = 0; j < 2; ++j) { + if (isRegular(bytes[i+1])) { + i += 1; + } else { + return false; + } + } + continue; + } else if (((bytes[i] >>> 3) & 0x1f) == 0x1e) { // 11110xxx + for (int j = 0; j < 3; ++j) { + if (isRegular(bytes[i+1])) { + i += 1; + } else { + return false; + } + } + continue; + } else if (((bytes[i] >>> 2) & 0x3f) == 0x3e) { // 1110xxxx + for (int j = 0; j < 4; ++j) { + if (isRegular(bytes[i+1])) { + i += 1; + } else { + return false; + } + } + continue; + } else if (((bytes[i] >>> 1) & 0x7f) == 0x7e) { // 1110xxxx + for (int j = 0; j < 5; ++j) { + if (isRegular(bytes[i+1])) { + i += 1; + } else { + return false; + } + } + continue; + } + } + return true; + } + + /** + * This method supports isUtf8 method to judge whether byte b is 10xxxxxx + * @param b + * @return result of judgement + */ + private static boolean isRegular(byte b) { + return ((b >>> 6) & 0x3) == 0x2; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/FastJsonUtils.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/FastJsonUtils.java new file mode 100644 index 0000000..d6b1ee5 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/FastJsonUtils.java @@ -0,0 +1,26 @@ +package com.didi.carrera.console.common.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson.serializer.SerializerFeature; + + +public class FastJsonUtils { + + public static String toJsonString(Object obj) { + return JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect); + } + + public static String toJson(Object obj) { + return JSON.toJSONString(obj); + } + + public static T toObject(String json, Class cls) { + return JSON.parseObject(json, cls); + } + + public static T toObject(String json, TypeReference typeReference) { + return JSON.parseObject(json, typeReference); + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/HostUtils.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/HostUtils.java new file mode 100644 index 0000000..63e545f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/HostUtils.java @@ -0,0 +1,40 @@ +package com.didi.carrera.console.common.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.regex.Pattern; + + +public class HostUtils { + private static final Logger logger = LoggerFactory.getLogger(HostUtils.class); + + public static final Pattern IP_PATTERN = Pattern.compile("^[\\d.:]+$"); + + public static String getIp(String host) { + if (IP_PATTERN.matcher(host).matches()) { + return host; + } + + try { + InetAddress address = InetAddress.getByName(host); + return address.getHostAddress(); + } catch (UnknownHostException e) { + logger.error("get ip exception", e); + return host; + } + } + + public static String getIpPortFromHost(String host, int defaultPort) { + String[] hostArr = host.split(":"); + String hostIp = getIp(hostArr[0]); + if (hostArr.length == 2) { + hostIp = hostIp + ":" + hostArr[1]; + } else { + hostIp = hostIp + ":" + defaultPort; + } + return hostIp; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/LogUtils.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/LogUtils.java new file mode 100644 index 0000000..73816cb --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/common/util/LogUtils.java @@ -0,0 +1,14 @@ +package com.didi.carrera.console.common.util; + +import java.util.Random; + + +public class LogUtils { + + private static final Random random = new Random(); + + public static String genLogid() { + Long logid = (System.currentTimeMillis() << 22) + random.nextInt(1 << 23); + return logid.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ApplicationStartedLintener.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ApplicationStartedLintener.java new file mode 100644 index 0000000..10b1938 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ApplicationStartedLintener.java @@ -0,0 +1,28 @@ +package com.didi.carrera.console.config; + +import com.didi.carrera.console.service.ZKV4ConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class ApplicationStartedLintener { + @Autowired + private ZKV4ConfigService zkv4ConfigService; + + + @EventListener(ApplicationReadyEvent.class) + public void onApplicationStartedListener() { + log.info("应用启动成功,开始注册zk"); + try { + zkv4ConfigService.initZkPath(); + zkv4ConfigService.initAllZk(); + log.info("zk注册成功"); + } catch (Exception e) { + log.error("zk注册失败", e); + } + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ConsoleConfig.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ConsoleConfig.java new file mode 100644 index 0000000..5a6d873 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/ConsoleConfig.java @@ -0,0 +1,71 @@ +package com.didi.carrera.console.config; + +import org.yaml.snakeyaml.Yaml; + +import java.io.InputStream; +import java.util.List; + +public class ConsoleConfig { + private String zookeeper; + private static ConsoleConfig consoleConfig; + private String env; + + private List carreraAdminUser; + + private List carreraAdminPassword; + + public String getZookeeper() { + return zookeeper; + } + + public void setZookeeper(String zookeeper) { + this.zookeeper = zookeeper; + } + + public String getEnv() { + return env; + } + + public void setEnv(String env) { + this.env = env; + } + + public static ConsoleConfig instance() { + return consoleConfig; + } + + public List getCarreraAdminUser() { + return carreraAdminUser; + } + + public void setCarreraAdminUser(List carreraAdminUser) { + this.carreraAdminUser = carreraAdminUser; + } + + public List getCarreraAdminPassword() { + return carreraAdminPassword; + } + + public void setCarreraAdminPassword(List carreraAdminPassword) { + this.carreraAdminPassword = carreraAdminPassword; + } + + static { + Yaml yaml = new Yaml(); + try (InputStream inputStream = ConsoleConfig.class.getResourceAsStream("/console.yaml")) { + consoleConfig = yaml.loadAs(inputStream, ConsoleConfig.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public String toString() { + return "ConsoleConfig{" + + "zookeeper='" + zookeeper + '\'' + + ", env='" + env + '\'' + + ", carreraAdminUser=" + carreraAdminUser + + ", carreraAdminPassword=" + carreraAdminPassword + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/SpringBeanConfig.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/SpringBeanConfig.java new file mode 100644 index 0000000..3763a07 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/config/SpringBeanConfig.java @@ -0,0 +1,77 @@ +package com.didi.carrera.console.config; + +import com.atomikos.icatch.jta.UserTransactionImp; +import com.atomikos.icatch.jta.UserTransactionManager; +import com.didi.carrera.console.web.controller.LoginInterceptor; +import com.xiaojukeji.carrera.biz.ZkService; +import com.xiaojukeji.carrera.biz.ZkServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.jta.JtaTransactionManager; +import org.springframework.transaction.jta.TransactionFactory; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.transaction.SystemException; +import javax.transaction.TransactionManager; +import javax.transaction.UserTransaction; + +@Configuration +@EnableTransactionManagement +@Slf4j +public class SpringBeanConfig implements WebMvcConfigurer { + + @Value("${console.carrera.zookeeper}") + private String zkHost; + + @Bean + public ZkService getZkService() { + try { + return new ZkServiceImpl(zkHost, true); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Bean + @Primary + public TransactionManager atomikosTransactionManager() { + UserTransactionManager userTransactionManager = new UserTransactionManager(); + userTransactionManager.setForceShutdown(false); + return userTransactionManager; + } + + @Bean + @Primary + public UserTransaction atomikosUserTransaction() { + try { + UserTransactionImp userTransactionImp = new UserTransactionImp(); + userTransactionImp.setTransactionTimeout(300); + return userTransactionImp; + } catch (SystemException e) { + e.printStackTrace(); + } + return null; + } + + @Bean + @Primary + public TransactionFactory jtaTransactionManager(TransactionManager atomikosTransactionManager, UserTransaction atomikosUserTransaction) { + JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(); + jtaTransactionManager.setTransactionManager(atomikosTransactionManager); + jtaTransactionManager.setUserTransaction(atomikosUserTransaction); + jtaTransactionManager.setAllowCustomIsolationLevels(true); + jtaTransactionManager.setDefaultTimeout(300); + return jtaTransactionManager; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**"); + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/BaseMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/BaseMapper.java new file mode 100644 index 0000000..cbf0d6b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/BaseMapper.java @@ -0,0 +1,5 @@ +package com.didi.carrera.console.dao; + + +public interface BaseMapper { +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/DaoUtil.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/DaoUtil.java new file mode 100644 index 0000000..fc004cd --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/DaoUtil.java @@ -0,0 +1,14 @@ +package com.didi.carrera.console.dao; + +import org.apache.commons.lang3.StringUtils; + + +public class DaoUtil { + + public static String getLikeField(String field) { + if(StringUtils.isEmpty(field)) { + return null; + } + return "%" + field + "%"; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/MybatisInterceptor.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/MybatisInterceptor.java new file mode 100755 index 0000000..6fc479c --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/MybatisInterceptor.java @@ -0,0 +1,150 @@ +package com.didi.carrera.console.dao; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.ParameterMapping; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Plugin; +import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.apache.ibatis.type.TypeHandlerRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.List; +import java.util.Properties; +import java.util.regex.Matcher; + +@Intercepts({ + @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), + @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, + RowBounds.class, ResultHandler.class})}) +public class MybatisInterceptor implements Interceptor { + + + protected static final String SHOW_DETAILSQL_KEY = "showDetailSql"; + protected static final String SHOW_COSTTIME_KEY = "showCostTime"; + protected static final String SLOW_SQL_MS_KEY = "slowSqlMs"; + + protected static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + protected Logger log = LoggerFactory.getLogger(MybatisInterceptor.class); + + private boolean showDetailSql = true; + private boolean showCostTime = true; + private long slowSqlMs = 0; + + public Object intercept(Invocation invocation) throws Throwable { + Object returnValue; + if (showDetailSql || showCostTime) { + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; + Object parameter = null; + if (invocation.getArgs().length > 1) { + parameter = invocation.getArgs()[1]; + } + String sqlId = mappedStatement.getId(); + BoundSql boundSql = mappedStatement.getBoundSql(parameter); + Configuration configuration = mappedStatement.getConfiguration(); + + long start = System.currentTimeMillis(); + returnValue = invocation.proceed(); + long end = System.currentTimeMillis(); + long time = (end - start); + + String sql = getSql(configuration, boundSql, sqlId, time); + if (slowSqlMs != 0 && time > slowSqlMs) { + log.warn(sql); + } else { + log.info(sql); + } + } else { + returnValue = invocation.proceed(); + } + return returnValue; + } + + public String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) { + StringBuilder str = new StringBuilder(100); + str.append(sqlId); + if (showDetailSql) { + str.append("||"); + str.append(showSql(configuration, boundSql)); + } + if (showCostTime) { + str.append("||cost="); + str.append(time); + str.append("ms"); + } + return str.toString(); + } + + private String getParameterValue(Object obj) { + String value; + if (obj instanceof String) { + value = "'" + obj.toString() + "'"; + } else if (obj instanceof Date) { + value = "'" + DateFormatUtils.format((Date) obj, DATE_FORMAT) + "'"; + } else { + if (obj != null) { + value = obj.toString(); + } else { + value = ""; + } + } + return Matcher.quoteReplacement(value); + } + + public String showSql(Configuration configuration, BoundSql boundSql) { + Object parameterObject = boundSql.getParameterObject(); + List parameterMappings = boundSql.getParameterMappings(); + // Remove unnecessary empty characters + String sql = boundSql.getSql().replaceAll("[\\s]+", " "); + + if(parameterMappings.size() > 200) { + return sql; + } + if (parameterMappings.size() > 0 && parameterObject != null) { + TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); + if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { + sql = sql.replaceFirst("\\?", getParameterValue(parameterObject)); + } else { + MetaObject metaObject = configuration.newMetaObject(parameterObject); + for (ParameterMapping parameterMapping : parameterMappings) { + String propertyName = parameterMapping.getProperty(); + if (metaObject.hasGetter(propertyName)) { + Object obj = metaObject.getValue(propertyName); + sql = sql.replaceFirst("\\?", getParameterValue(obj)); + } else if (boundSql.hasAdditionalParameter(propertyName)) { + Object obj = boundSql.getAdditionalParameter(propertyName); + sql = sql.replaceFirst("\\?", getParameterValue(obj)); + } + } + } + } + return sql; + } + + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + public void setProperties(Properties properties) { + if (properties != null) { + String showDetailSql = properties.getProperty(SHOW_DETAILSQL_KEY, Boolean.TRUE.toString()); + String showCostTime = properties.getProperty(SHOW_COSTTIME_KEY, Boolean.TRUE.toString()); + String slowSqlMs = properties.getProperty(SLOW_SQL_MS_KEY, "0"); + this.showDetailSql = Boolean.parseBoolean(showDetailSql); + this.showCostTime = Boolean.parseBoolean(showCostTime); + this.slowSqlMs = Long.parseLong(slowSqlMs); + } + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ClusterMqServerRelationType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ClusterMqServerRelationType.java new file mode 100644 index 0000000..55a144f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ClusterMqServerRelationType.java @@ -0,0 +1,42 @@ +package com.didi.carrera.console.dao.dict; + + +public enum ClusterMqServerRelationType { + P_PROXY((byte)0, "pproxy"), + C_PROXY((byte)1, "cproxy"); + + private byte index; + + private String name; + + ClusterMqServerRelationType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ClusterMqServerRelationType getByIndex(byte index) { + ClusterMqServerRelationType[] all = values(); + for (ClusterMqServerRelationType type : all) { + if (type.getIndex() == index) { + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionAlarmType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionAlarmType.java new file mode 100644 index 0000000..f43a0d2 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionAlarmType.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionAlarmType { + EXTEND_GROUP_CONFIG((byte)0, "Same as group alarm configuration"), + SEPARATE_CONFIG((byte)1, "own alarm configuration"); + + private byte index; + + private String name; + + ConsumeSubscriptionAlarmType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionAlarmType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionAlarmType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionApiType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionApiType.java new file mode 100644 index 0000000..70494be --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionApiType.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionApiType { + HIGH_LEVEL((byte)1, "highlevel"), + LOW_LEVEL((byte)2, "lowlevel"); + + private byte index; + + private String name; + + ConsumeSubscriptionApiType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionApiType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionApiType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionBigDataType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionBigDataType.java new file mode 100644 index 0000000..9487d03 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionBigDataType.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionBigDataType { + HDFS((byte)0, "hdfs"), + HBASE((byte)1, "hbase"), + REDIS((byte)2, "redis"); + + private byte index; + + private String name; + + ConsumeSubscriptionBigDataType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionBigDataType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionBigDataType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionConsumeType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionConsumeType.java new file mode 100644 index 0000000..8845c36 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionConsumeType.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionConsumeType { + SDK((byte)1, "SDK"), + HTTP((byte)2, "HTTP"), + BIG_DATA((byte)3, "Write straightly to other component"); + + private byte index; + + private String name; + + ConsumeSubscriptionConsumeType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionConsumeType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionConsumeType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionHttpMethod.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionHttpMethod.java new file mode 100644 index 0000000..f824db4 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionHttpMethod.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionHttpMethod { + POST((byte)0, "POST"), + GET((byte)1, "GET"); + + private byte index; + + private String name; + + ConsumeSubscriptionHttpMethod(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionHttpMethod getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionHttpMethod level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgPushType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgPushType.java new file mode 100644 index 0000000..a639b19 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgPushType.java @@ -0,0 +1,47 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionMsgPushType { + + FORM_PARAMS((byte)1, "Post Body:params="), + FORM_PARAMS2((byte)2, "Post Body:flatten message's first layer to key=value"); + + private byte index; + + private String name; + + ConsumeSubscriptionMsgPushType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionMsgPushType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionMsgPushType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgType.java new file mode 100644 index 0000000..c99374d --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionMsgType.java @@ -0,0 +1,47 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionMsgType { + JSON((byte)1, "JSON"), + TEXT((byte)2, "Text"), + BINARY((byte)3, "Binary"); + + private byte index; + + private String name; + + ConsumeSubscriptionMsgType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionMsgType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionMsgType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionPressureTraffic.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionPressureTraffic.java new file mode 100644 index 0000000..85d176f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/ConsumeSubscriptionPressureTraffic.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum ConsumeSubscriptionPressureTraffic { + DISABLE((byte)0, "not consume pressure traffic"), + ENABLE((byte)1, "consume pressure traffic"); + + private byte index; + + private String name; + + ConsumeSubscriptionPressureTraffic(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionPressureTraffic getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionPressureTraffic level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsDelete.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsDelete.java new file mode 100644 index 0000000..93dc75a --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsDelete.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum IsDelete { + NO((byte)0, "normal"), + YES((byte)1, "deleted"); + + private byte index; + + private String name; + + IsDelete(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static IsDelete getByIndex(byte index) { + List all = Arrays.asList(values()); + for (IsDelete level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsEnable.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsEnable.java new file mode 100644 index 0000000..2c477e0 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/IsEnable.java @@ -0,0 +1,54 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum IsEnable { + ENABLE((byte)0, "enable"), + DISABLE((byte)1, "disable"); + + private byte index; + + private String name; + + IsEnable(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static IsEnable getByIndex(byte index) { + List all = Arrays.asList(values()); + for (IsEnable level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + + public static boolean isEnable(Byte index) { + if(index == null) { + return false; + } + + return index == ENABLE.index; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/MqServerType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/MqServerType.java new file mode 100644 index 0000000..4b55ea6 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/MqServerType.java @@ -0,0 +1,45 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum MqServerType { + ROCKETMQ((byte)0, "rocketmq"), + KAFKA((byte)1, "kafka"); + + private byte index; + + private String name; + + MqServerType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static MqServerType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (MqServerType type : all) { + if (type.getIndex() == index) { + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/NodeType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/NodeType.java new file mode 100644 index 0000000..a754814 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/NodeType.java @@ -0,0 +1,54 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum NodeType { + + ROCKETMQ_BROKER_MASTER((byte)1, "rocketmq broker master"), + + ROCKETMQ_NAMESERVER((byte)2, "rocketmq nameserver"), + + PRODUCER_PROXY((byte)3, "producer proxy"), + + CONSUMER_PROXY((byte)4, "consumer proxy"), + + ROCKETMQ_BROKER_SLAVE((byte)9, "rocketmq broker slave"); + + private byte index; + + private String name; + + NodeType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static NodeType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (NodeType item : all) { + if (item.getIndex() == index) { + return item; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicCompressionType.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicCompressionType.java new file mode 100644 index 0000000..28751e3 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicCompressionType.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum TopicCompressionType { + + RMQ_COMPRESSION((byte)0, "RMQ"), + SNAPPY_COMPRESSION((byte)1, "Snappy"); + + private byte index; + + private String name; + + TopicCompressionType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static TopicCompressionType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (TopicCompressionType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicDelayTopic.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicDelayTopic.java new file mode 100644 index 0000000..4c3bd15 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicDelayTopic.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + + +public enum TopicDelayTopic { + DELAY_TOPIC((byte)0, "delay topic"), + REAL_TIME_TOPIC((byte)1, "real-time topic"); + + private byte index; + + private String name; + + TopicDelayTopic(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static TopicDelayTopic getByIndex(byte index) { + List all = Arrays.asList(values()); + for (TopicDelayTopic level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicProduceMode.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicProduceMode.java new file mode 100644 index 0000000..b0c8f36 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/dict/TopicProduceMode.java @@ -0,0 +1,62 @@ +package com.didi.carrera.console.dao.dict; + +import java.util.Arrays; +import java.util.List; + +import com.xiaojukeji.carrera.config.v4.TopicConfig; + + +public enum TopicProduceMode { + SAME_IDC((byte) 0, "同机房生产"), + OTHER((byte) 1, "自定义"); + + private byte index; + + private String name; + + TopicProduceMode(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static TopicProduceMode getByIndex(byte index) { + List all = Arrays.asList(values()); + for (TopicProduceMode level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + + public static TopicConfig.ProduceMode getZkMode(Byte index) { + if(index == null) { + return null; + } + + if(index == SAME_IDC.index) { + return TopicConfig.ProduceMode.SAME_IDC; + } else if (index == OTHER.index) { + return TopicConfig.ProduceMode.OTHER; + } + + return null; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMapper.java new file mode 100644 index 0000000..ec189d6 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMapper.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.Cluster; +import com.didi.carrera.console.dao.model.ClusterCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface ClusterMapper { + long countByExample(ClusterCriteria example); + + int deleteByExample(ClusterCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(Cluster record); + + int insertSelective(Cluster record); + + List selectByExample(ClusterCriteria example); + + Cluster selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") Cluster record, @Param("example") ClusterCriteria example); + + int updateByExample(@Param("record") Cluster record, @Param("example") ClusterCriteria example); + + int updateByPrimaryKeySelective(Cluster record); + + int updateByPrimaryKey(Cluster record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMqserverRelationMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMqserverRelationMapper.java new file mode 100644 index 0000000..1ecbd94 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ClusterMqserverRelationMapper.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.ClusterMqserverRelation; +import com.didi.carrera.console.dao.model.ClusterMqserverRelationCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface ClusterMqserverRelationMapper { + long countByExample(ClusterMqserverRelationCriteria example); + + int deleteByExample(ClusterMqserverRelationCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(ClusterMqserverRelation record); + + int insertSelective(ClusterMqserverRelation record); + + List selectByExample(ClusterMqserverRelationCriteria example); + + ClusterMqserverRelation selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") ClusterMqserverRelation record, @Param("example") ClusterMqserverRelationCriteria example); + + int updateByExample(@Param("record") ClusterMqserverRelation record, @Param("example") ClusterMqserverRelationCriteria example); + + int updateByPrimaryKeySelective(ClusterMqserverRelation record); + + int updateByPrimaryKey(ClusterMqserverRelation record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeGroupMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeGroupMapper.java new file mode 100644 index 0000000..a3aeee2 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeGroupMapper.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.dao.model.ConsumeGroupCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface ConsumeGroupMapper { + long countByExample(ConsumeGroupCriteria example); + + int deleteByExample(ConsumeGroupCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(ConsumeGroup record); + + int insertSelective(ConsumeGroup record); + + List selectByExample(ConsumeGroupCriteria example); + + ConsumeGroup selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") ConsumeGroup record, @Param("example") ConsumeGroupCriteria example); + + int updateByExample(@Param("record") ConsumeGroup record, @Param("example") ConsumeGroupCriteria example); + + int updateByPrimaryKeySelective(ConsumeGroup record); + + int updateByPrimaryKey(ConsumeGroup record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeSubscriptionMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeSubscriptionMapper.java new file mode 100644 index 0000000..88c93a7 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/ConsumeSubscriptionMapper.java @@ -0,0 +1,37 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.dao.model.ConsumeSubscriptionCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface ConsumeSubscriptionMapper { + long countByExample(ConsumeSubscriptionCriteria example); + + int deleteByExample(ConsumeSubscriptionCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(ConsumeSubscription record); + + int insertSelective(ConsumeSubscription record); + + List selectByExampleWithBLOBs(ConsumeSubscriptionCriteria example); + + List selectByExample(ConsumeSubscriptionCriteria example); + + ConsumeSubscription selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") ConsumeSubscription record, @Param("example") ConsumeSubscriptionCriteria example); + + int updateByExampleWithBLOBs(@Param("record") ConsumeSubscription record, @Param("example") ConsumeSubscriptionCriteria example); + + int updateByExample(@Param("record") ConsumeSubscription record, @Param("example") ConsumeSubscriptionCriteria example); + + int updateByPrimaryKeySelective(ConsumeSubscription record); + + int updateByPrimaryKeyWithBLOBs(ConsumeSubscription record); + + int updateByPrimaryKey(ConsumeSubscription record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/IdcMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/IdcMapper.java new file mode 100644 index 0000000..bcf0d88 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/IdcMapper.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.Idc; +import com.didi.carrera.console.dao.model.IdcCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface IdcMapper { + long countByExample(IdcCriteria example); + + int deleteByExample(IdcCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(Idc record); + + int insertSelective(Idc record); + + List selectByExample(IdcCriteria example); + + Idc selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") Idc record, @Param("example") IdcCriteria example); + + int updateByExample(@Param("record") Idc record, @Param("example") IdcCriteria example); + + int updateByPrimaryKeySelective(Idc record); + + int updateByPrimaryKey(Idc record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/MqServerMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/MqServerMapper.java new file mode 100644 index 0000000..dc45c15 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/MqServerMapper.java @@ -0,0 +1,32 @@ +package com.didi.carrera.console.dao.mapper; + +import java.util.List; + +import com.didi.carrera.console.dao.model.MqServer; +import com.didi.carrera.console.dao.model.MqServerCriteria; +import org.apache.ibatis.annotations.Param; + + +public interface MqServerMapper { + long countByExample(MqServerCriteria example); + + int deleteByExample(MqServerCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(MqServer record); + + int insertSelective(MqServer record); + + List selectByExample(MqServerCriteria example); + + MqServer selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") MqServer record, @Param("example") MqServerCriteria example); + + int updateByExample(@Param("record") MqServer record, @Param("example") MqServerCriteria example); + + int updateByPrimaryKeySelective(MqServer record); + + int updateByPrimaryKey(MqServer record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/NodeMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/NodeMapper.java new file mode 100644 index 0000000..86bb727 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/NodeMapper.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.Node; +import com.didi.carrera.console.dao.model.NodeCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface NodeMapper { + long countByExample(NodeCriteria example); + + int deleteByExample(NodeCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(Node record); + + int insertSelective(Node record); + + List selectByExample(NodeCriteria example); + + Node selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") Node record, @Param("example") NodeCriteria example); + + int updateByExample(@Param("record") Node record, @Param("example") NodeCriteria example); + + int updateByPrimaryKeySelective(Node record); + + int updateByPrimaryKey(Node record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicConfMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicConfMapper.java new file mode 100644 index 0000000..7b8b6c6 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicConfMapper.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.TopicConf; +import com.didi.carrera.console.dao.model.TopicConfCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface TopicConfMapper { + long countByExample(TopicConfCriteria example); + + int deleteByExample(TopicConfCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(TopicConf record); + + int insertSelective(TopicConf record); + + List selectByExample(TopicConfCriteria example); + + TopicConf selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") TopicConf record, @Param("example") TopicConfCriteria example); + + int updateByExample(@Param("record") TopicConf record, @Param("example") TopicConfCriteria example); + + int updateByPrimaryKeySelective(TopicConf record); + + int updateByPrimaryKey(TopicConf record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicMapper.java new file mode 100644 index 0000000..35e629f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/TopicMapper.java @@ -0,0 +1,37 @@ +package com.didi.carrera.console.dao.mapper; + +import com.didi.carrera.console.dao.model.Topic; +import com.didi.carrera.console.dao.model.TopicCriteria; +import java.util.List; +import org.apache.ibatis.annotations.Param; + + +public interface TopicMapper { + long countByExample(TopicCriteria example); + + int deleteByExample(TopicCriteria example); + + int deleteByPrimaryKey(Long id); + + int insert(Topic record); + + int insertSelective(Topic record); + + List selectByExampleWithBLOBs(TopicCriteria example); + + List selectByExample(TopicCriteria example); + + Topic selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") Topic record, @Param("example") TopicCriteria example); + + int updateByExampleWithBLOBs(@Param("record") Topic record, @Param("example") TopicCriteria example); + + int updateByExample(@Param("record") Topic record, @Param("example") TopicCriteria example); + + int updateByPrimaryKeySelective(Topic record); + + int updateByPrimaryKeyWithBLOBs(Topic record); + + int updateByPrimaryKey(Topic record); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeGroupCustomMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeGroupCustomMapper.java new file mode 100644 index 0000000..962c961 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeGroupCustomMapper.java @@ -0,0 +1,121 @@ +package com.didi.carrera.console.dao.mapper.custom; + +import java.util.List; + +import com.didi.carrera.console.dao.BaseMapper; +import com.didi.carrera.console.dao.model.ConsumeGroup; +import org.apache.ibatis.annotations.Param; + + +public interface ConsumeGroupCustomMapper extends BaseMapper { + + List selectByCondition(@Param("contacters") String user, @Param("text") String text, @Param("limit") Integer index, @Param("size") Integer pageSize); + + Integer selectCountByCondition(@Param("contacters") String user, @Param("text") String text); + +// @Insert(SCRIPT_START + +// "insert into consume_group\n" + +// " \n" + +// " \n" + +// " id,\n" + +// " \n" + +// " \n" + +// " group_name,\n" + +// " \n" + +// " \n" + +// " department,\n" + +// " \n" + +// " \n" + +// " service,\n" + +// " \n" + +// " \n" + +// " contacters,\n" + +// " \n" + +// " \n" + +// " alarm_is_enable,\n" + +// " \n" + +// " \n" + +// " alarm_group,\n" + +// " \n" + +// " \n" + +// " alarm_level,\n" + +// " \n" + +// " \n" + +// " alarm_msg_lag,\n" + +// " \n" + +// " \n" + +// " alarm_delay_time,\n" + +// " \n" + +// " \n" + +// " extra_params,\n" + +// " \n" + +// " \n" + +// " config,\n" + +// " \n" + +// " \n" + +// " remark,\n" + +// " \n" + +// " \n" + +// " is_delete,\n" + +// " \n" + +// " \n" + +// " create_time,\n" + +// " \n" + +// " \n" + +// " modify_time,\n" + +// " \n" + +// " \n" + +// " \n" + +// " \n" + +// " #{id,jdbcType=BIGINT},\n" + +// " \n" + +// " \n" + +// " #{groupName,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{department,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{service,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{contacters,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{alarmIsEnable,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{alarmGroup,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{alarmLevel,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{alarmMsgLag,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{alarmDelayTime,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{extraParams,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{config,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{remark,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{isDelete,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{createTime,jdbcType=TIMESTAMP},\n" + +// " \n" + +// " \n" + +// " #{modifyTime,jdbcType=TIMESTAMP},\n" + +// " \n" + +// " " + +// SCRIPT_END) +// int insertSelectiveWithPrimaryKey(ConsumeGroup consumeGroup); + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeSubscriptionCustomMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeSubscriptionCustomMapper.java new file mode 100644 index 0000000..7992d23 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/ConsumeSubscriptionCustomMapper.java @@ -0,0 +1,278 @@ +package com.didi.carrera.console.dao.mapper.custom; + +import java.util.List; + +import com.didi.carrera.console.dao.BaseMapper; +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.dao.model.custom.CustomConsumeSubscription; +import com.didi.carrera.console.dao.model.custom.CustomSubscriptionStateCount; +import org.apache.ibatis.annotations.Param; + + +public interface ConsumeSubscriptionCustomMapper extends BaseMapper { + + List selectByTopicIdClusterId(@Param("topicId") Long topicId, @Param("clusterId") Long clusterId); + + List selectStateCountByGroupId(List list); + + List selectByCondition(@Param("contacters") String user, @Param("groupId") Long groupId, @Param("clusterId") Long clusterId, @Param("consumeType") Integer consumeType, @Param("state") Integer state, @Param("text") String text, @Param("limit") Integer index, @Param("size") Integer pageSize); + + Integer selectCountByCondition(@Param("contacters") String user, @Param("groupId") Long groupId, @Param("clusterId") Long clusterId, @Param("consumeType") Integer consumeType, @Param("state") Integer state, @Param("text") String text); + + +// @Insert(SCRIPT_START + +// "insert into consume_subscription\n" + +// " \n" + +// " \n" + +// " id,\n" + +// " \n" + +// " \n" + +// " group_id,\n" + +// " \n" + +// " \n" + +// " group_name,\n" + +// " \n" + +// " \n" + +// " topic_id,\n" + +// " \n" + +// " \n" + +// " topic_name,\n" + +// " \n" + +// " \n" + +// " cluster_id,\n" + +// " \n" + +// " \n" + +// " cluster_name,\n" + +// " \n" + +// " \n" + +// " pressure_traffic,\n" + +// " \n" + +// " \n" + +// " max_tps,\n" + +// " \n" + +// " \n" + +// " alarm_type,\n" + +// " \n" + +// " \n" + +// " alarm_is_enable,\n" + +// " \n" + +// " \n" + +// " alarm_level,\n" + +// " \n" + +// " \n" + +// " alarm_msg_lag,\n" + +// " \n" + +// " \n" + +// " alarm_delay_time,\n" + +// " \n" + +// " \n" + +// " api_type,\n" + +// " \n" + +// " \n" + +// " consume_timeout,\n" + +// " \n" + +// " \n" + +// " error_retry_times,\n" + +// " \n" + +// " \n" + +// " retry_intervals,\n" + +// " \n" + +// " \n" + +// " msg_type,\n" + +// " \n" + +// " \n" + +// " enable_groovy,\n" + +// " \n" + +// " \n" + +// " enable_transit,\n" + +// " \n" + +// " \n" + +// " transit,\n" + +// " \n" + +// " \n" + +// " enable_order,\n" + +// " \n" + +// " \n" + +// " order_key,\n" + +// " \n" + +// " \n" + +// " consume_type,\n" + +// " \n" + +// " \n" + +// " urls,\n" + +// " \n" + +// " \n" + +// " http_method,\n" + +// " \n" + +// " \n" + +// " http_headers,\n" + +// " \n" + +// " \n" + +// " http_query_params,\n" + +// " \n" + +// " \n" + +// " msg_push_type,\n" + +// " \n" + +// " \n" + +// " http_token,\n" + +// " \n" + +// " \n" + +// " push_max_concurrency,\n" + +// " \n" + +// " \n" + +// " actions,\n" + +// " \n" + +// " \n" + +// " config,\n" + +// " \n" + +// " \n" + +// " state,\n" + +// " \n" + +// " \n" + +// " extra_params,\n" + +// " \n" + +// " \n" + +// " remark,\n" + +// " \n" + +// " \n" + +// " is_delete,\n" + +// " \n" + +// " \n" + +// " create_time,\n" + +// " \n" + +// " \n" + +// " modify_time,\n" + +// " \n" + +// " \n" + +// " groovy,\n" + +// " \n" + +// " \n" + +// " \n" + +// " \n" + +// " #{id,jdbcType=BIGINT},\n" + +// " \n" + +// " \n" + +// " #{groupId,jdbcType=BIGINT},\n" + +// " \n" + +// " \n" + +// " #{groupName,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{topicId,jdbcType=BIGINT},\n" + +// " \n" + +// " \n" + +// " #{topicName,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{clusterId,jdbcType=BIGINT},\n" + +// " \n" + +// " \n" + +// " #{clusterName,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{pressureTraffic,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{maxTps,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{alarmType,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{alarmIsEnable,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{alarmLevel,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{alarmMsgLag,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{alarmDelayTime,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{apiType,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{consumeTimeout,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{errorRetryTimes,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{retryIntervals,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{msgType,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{enableGroovy,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{enableTransit,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{transit,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{enableOrder,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{orderKey,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{consumeType,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{urls,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{httpMethod,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{httpHeaders,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{httpQueryParams,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{msgPushType,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{httpToken,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{pushMaxConcurrency,jdbcType=INTEGER},\n" + +// " \n" + +// " \n" + +// " #{actions,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{config,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{state,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{extraParams,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{remark,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{isDelete,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{createTime,jdbcType=TIMESTAMP},\n" + +// " \n" + +// " \n" + +// " #{modifyTime,jdbcType=TIMESTAMP},\n" + +// " \n" + +// " \n" + +// " #{groovy,jdbcType=LONGVARCHAR},\n" + +// " \n" + +// " " + +// SCRIPT_END) +// int insertSelectiveWithPrimaryKey(ConsumeSubscription consumeSubscription); + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicConfCustomMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicConfCustomMapper.java new file mode 100644 index 0000000..6702bee --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicConfCustomMapper.java @@ -0,0 +1,11 @@ +package com.didi.carrera.console.dao.mapper.custom; + +import java.util.List; + +import com.didi.carrera.console.dao.model.custom.CustomTopicConf; + + +public interface TopicConfCustomMapper { + + List selectByTopicId(List list); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicCustomMapper.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicCustomMapper.java new file mode 100644 index 0000000..f190f7e --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/mapper/custom/TopicCustomMapper.java @@ -0,0 +1,114 @@ +package com.didi.carrera.console.dao.mapper.custom; + +import java.util.List; + +import com.didi.carrera.console.dao.BaseMapper; +import com.didi.carrera.console.dao.model.Topic; +import org.apache.ibatis.annotations.Param; + + +public interface TopicCustomMapper extends BaseMapper { + + List selectByCondition(@Param("clusterId") Long clusterId, @Param("contacters") String user, @Param("text") String text, @Param("limit") Integer curPage, @Param("size") Integer pageSize); + + Integer selectCountByCondition(@Param("clusterId") Long clusterId, @Param("contacters") String user, @Param("text") String text); + +// @Insert(SCRIPT_START + +// "insert into topic\n" + +// " \n" + +// " \n" + +// " id,\n" + +// " \n" + +// " \n" + +// " topic_name,\n" + +// " \n" + +// " \n" + +// " department,\n" + +// " \n" + +// " \n" + +// " service,\n" + +// " \n" + +// " \n" + +// " contacters,\n" + +// " \n" + +// " \n" + +// " alarm_group,\n" + +// " \n" + +// " \n" + +// " delay_topic,\n" + +// " \n" + +// " \n" + +// " state,\n" + +// " \n" + +// " \n" + +// " config,\n" + +// " \n" + +// " \n" + +// " description,\n" + +// " \n" + +// " \n" + +// " extra_params,\n" + +// " \n" + +// " \n" + +// " is_delete,\n" + +// " \n" + +// " \n" + +// " create_time,\n" + +// " \n" + +// " \n" + +// " modify_time,\n" + +// " \n" + +// " \n" + +// " topic_schema,\n" + +// " \n" + +// " \n" + +// " \n" + +// " \n" + +// " #{id,jdbcType=BIGINT},\n" + +// " \n" + +// " \n" + +// " #{topicName,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{department,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{service,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{contacters,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{alarmGroup,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{delayTopic,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{state,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{config,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{description,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{extraParams,jdbcType=VARCHAR},\n" + +// " \n" + +// " \n" + +// " #{isDelete,jdbcType=TINYINT},\n" + +// " \n" + +// " \n" + +// " #{createTime,jdbcType=TIMESTAMP},\n" + +// " \n" + +// " \n" + +// " #{modifyTime,jdbcType=TIMESTAMP},\n" + +// " \n" + +// " \n" + +// " #{topicSchema,jdbcType=LONGVARCHAR},\n" + +// " \n" + +// " " + +// SCRIPT_END) +// int insertSelectiveWithPrimaryKey(Topic topic); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Cluster.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Cluster.java new file mode 100644 index 0000000..af84e8b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Cluster.java @@ -0,0 +1,202 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; + + +public class Cluster implements Serializable { + /** + * 自增id + * default = null + * length = 20 + */ + private Long id; + + /** + * 集群名称 + * default = + * length = 256 + */ + private String name; + + /** + * 描述信息 + * default = + * length = 1024 + */ + private String description; + + /** + * idc table primarykey + * default = 0 + * length = 19 + */ + private Long idcId; + + /** + * 集群所属机房 + * default = gz01 + * length = 256 + */ + private String idc; + + /** + * 备注 + * default = + * length = 1024 + */ + private String remark; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : description.trim(); + } + + public Long getIdcId() { + return idcId; + } + + public void setIdcId(Long idcId) { + this.idcId = idcId; + } + + public String getIdc() { + return idc; + } + + public void setIdc(String idc) { + this.idc = idc == null ? null : idc.trim(); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + Cluster other = (Cluster) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getDescription() == null ? other.getDescription() == null : this.getDescription().equals(other.getDescription())) + && (this.getIdcId() == null ? other.getIdcId() == null : this.getIdcId().equals(other.getIdcId())) + && (this.getIdc() == null ? other.getIdc() == null : this.getIdc().equals(other.getIdc())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getDescription() == null) ? 0 : getDescription().hashCode()); + result = prime * result + ((getIdcId() == null) ? 0 : getIdcId().hashCode()); + result = prime * result + ((getIdc() == null) ? 0 : getIdc().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", name=" + name + + ", description=" + description + + ", idcId=" + idcId + + ", idc=" + idc + + ", remark=" + remark + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterCriteria.java new file mode 100644 index 0000000..c87c8d4 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterCriteria.java @@ -0,0 +1,801 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class ClusterCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public ClusterCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("name is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("name is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("name =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("name <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("name >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("name >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("name <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("name <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("name like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("name not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("name in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("name not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("name between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("name not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andDescriptionIsNull() { + addCriterion("description is null"); + return (Criteria) this; + } + + public Criteria andDescriptionIsNotNull() { + addCriterion("description is not null"); + return (Criteria) this; + } + + public Criteria andDescriptionEqualTo(String value) { + addCriterion("description =", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotEqualTo(String value) { + addCriterion("description <>", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionGreaterThan(String value) { + addCriterion("description >", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionGreaterThanOrEqualTo(String value) { + addCriterion("description >=", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionLessThan(String value) { + addCriterion("description <", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionLessThanOrEqualTo(String value) { + addCriterion("description <=", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionLike(String value) { + addCriterion("description like", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotLike(String value) { + addCriterion("description not like", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionIn(List values) { + addCriterion("description in", values, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotIn(List values) { + addCriterion("description not in", values, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionBetween(String value1, String value2) { + addCriterion("description between", value1, value2, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotBetween(String value1, String value2) { + addCriterion("description not between", value1, value2, "description"); + return (Criteria) this; + } + + public Criteria andIdcIdIsNull() { + addCriterion("idc_id is null"); + return (Criteria) this; + } + + public Criteria andIdcIdIsNotNull() { + addCriterion("idc_id is not null"); + return (Criteria) this; + } + + public Criteria andIdcIdEqualTo(Long value) { + addCriterion("idc_id =", value, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdNotEqualTo(Long value) { + addCriterion("idc_id <>", value, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdGreaterThan(Long value) { + addCriterion("idc_id >", value, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdGreaterThanOrEqualTo(Long value) { + addCriterion("idc_id >=", value, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdLessThan(Long value) { + addCriterion("idc_id <", value, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdLessThanOrEqualTo(Long value) { + addCriterion("idc_id <=", value, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdIn(List values) { + addCriterion("idc_id in", values, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdNotIn(List values) { + addCriterion("idc_id not in", values, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdBetween(Long value1, Long value2) { + addCriterion("idc_id between", value1, value2, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIdNotBetween(Long value1, Long value2) { + addCriterion("idc_id not between", value1, value2, "idcId"); + return (Criteria) this; + } + + public Criteria andIdcIsNull() { + addCriterion("idc is null"); + return (Criteria) this; + } + + public Criteria andIdcIsNotNull() { + addCriterion("idc is not null"); + return (Criteria) this; + } + + public Criteria andIdcEqualTo(String value) { + addCriterion("idc =", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcNotEqualTo(String value) { + addCriterion("idc <>", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcGreaterThan(String value) { + addCriterion("idc >", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcGreaterThanOrEqualTo(String value) { + addCriterion("idc >=", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcLessThan(String value) { + addCriterion("idc <", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcLessThanOrEqualTo(String value) { + addCriterion("idc <=", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcLike(String value) { + addCriterion("idc like", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcNotLike(String value) { + addCriterion("idc not like", value, "idc"); + return (Criteria) this; + } + + public Criteria andIdcIn(List values) { + addCriterion("idc in", values, "idc"); + return (Criteria) this; + } + + public Criteria andIdcNotIn(List values) { + addCriterion("idc not in", values, "idc"); + return (Criteria) this; + } + + public Criteria andIdcBetween(String value1, String value2) { + addCriterion("idc between", value1, value2, "idc"); + return (Criteria) this; + } + + public Criteria andIdcNotBetween(String value1, String value2) { + addCriterion("idc not between", value1, value2, "idc"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelation.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelation.java new file mode 100644 index 0000000..a091d18 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelation.java @@ -0,0 +1,220 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; + + +public class ClusterMqserverRelation implements Serializable { + /** + * 自增id + * default = null + * length = 20 + */ + private Long id; + + /** + * 集群id + * default = 0 + * length = 19 + */ + private Long clusterId; + + /** + * 集群名称 + * default = + * length = 256 + */ + private String clusterName; + + /** + * mqserver id + * default = 0 + * length = 19 + */ + private Long mqServerId; + + /** + * mqserver名称 + * default = + * length = 256 + */ + private String mqServerName; + + /** + * 集群配置 + * default = + * length = 2048 + */ + private String proxyConf; + + /** + * 集群和mqserver关联类型,0:pproxy 1:cproxy + * default = 0 + * length = 3 + */ + private Byte type; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName == null ? null : clusterName.trim(); + } + + public Long getMqServerId() { + return mqServerId; + } + + public void setMqServerId(Long mqServerId) { + this.mqServerId = mqServerId; + } + + public String getMqServerName() { + return mqServerName; + } + + public void setMqServerName(String mqServerName) { + this.mqServerName = mqServerName == null ? null : mqServerName.trim(); + } + + public String getProxyConf() { + return proxyConf; + } + + public void setProxyConf(String proxyConf) { + this.proxyConf = proxyConf == null ? null : proxyConf.trim(); + } + + public Byte getType() { + return type; + } + + public void setType(Byte type) { + this.type = type; + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + ClusterMqserverRelation other = (ClusterMqserverRelation) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getClusterId() == null ? other.getClusterId() == null : this.getClusterId().equals(other.getClusterId())) + && (this.getClusterName() == null ? other.getClusterName() == null : this.getClusterName().equals(other.getClusterName())) + && (this.getMqServerId() == null ? other.getMqServerId() == null : this.getMqServerId().equals(other.getMqServerId())) + && (this.getMqServerName() == null ? other.getMqServerName() == null : this.getMqServerName().equals(other.getMqServerName())) + && (this.getProxyConf() == null ? other.getProxyConf() == null : this.getProxyConf().equals(other.getProxyConf())) + && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getClusterId() == null) ? 0 : getClusterId().hashCode()); + result = prime * result + ((getClusterName() == null) ? 0 : getClusterName().hashCode()); + result = prime * result + ((getMqServerId() == null) ? 0 : getMqServerId().hashCode()); + result = prime * result + ((getMqServerName() == null) ? 0 : getMqServerName().hashCode()); + result = prime * result + ((getProxyConf() == null) ? 0 : getProxyConf().hashCode()); + result = prime * result + ((getType() == null) ? 0 : getType().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", clusterId=" + clusterId + + ", clusterName=" + clusterName + + ", mqServerId=" + mqServerId + + ", mqServerName=" + mqServerName + + ", proxyConf=" + proxyConf + + ", type=" + type + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelationCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelationCriteria.java new file mode 100644 index 0000000..23ee911 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ClusterMqserverRelationCriteria.java @@ -0,0 +1,851 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class ClusterMqserverRelationCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public ClusterMqserverRelationCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNull() { + addCriterion("cluster_id is null"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNotNull() { + addCriterion("cluster_id is not null"); + return (Criteria) this; + } + + public Criteria andClusterIdEqualTo(Long value) { + addCriterion("cluster_id =", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotEqualTo(Long value) { + addCriterion("cluster_id <>", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThan(Long value) { + addCriterion("cluster_id >", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThanOrEqualTo(Long value) { + addCriterion("cluster_id >=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThan(Long value) { + addCriterion("cluster_id <", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThanOrEqualTo(Long value) { + addCriterion("cluster_id <=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdIn(List values) { + addCriterion("cluster_id in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotIn(List values) { + addCriterion("cluster_id not in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdBetween(Long value1, Long value2) { + addCriterion("cluster_id between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotBetween(Long value1, Long value2) { + addCriterion("cluster_id not between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterNameIsNull() { + addCriterion("cluster_name is null"); + return (Criteria) this; + } + + public Criteria andClusterNameIsNotNull() { + addCriterion("cluster_name is not null"); + return (Criteria) this; + } + + public Criteria andClusterNameEqualTo(String value) { + addCriterion("cluster_name =", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotEqualTo(String value) { + addCriterion("cluster_name <>", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameGreaterThan(String value) { + addCriterion("cluster_name >", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameGreaterThanOrEqualTo(String value) { + addCriterion("cluster_name >=", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLessThan(String value) { + addCriterion("cluster_name <", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLessThanOrEqualTo(String value) { + addCriterion("cluster_name <=", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLike(String value) { + addCriterion("cluster_name like", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotLike(String value) { + addCriterion("cluster_name not like", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameIn(List values) { + addCriterion("cluster_name in", values, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotIn(List values) { + addCriterion("cluster_name not in", values, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameBetween(String value1, String value2) { + addCriterion("cluster_name between", value1, value2, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotBetween(String value1, String value2) { + addCriterion("cluster_name not between", value1, value2, "clusterName"); + return (Criteria) this; + } + + public Criteria andMqServerIdIsNull() { + addCriterion("mq_server_id is null"); + return (Criteria) this; + } + + public Criteria andMqServerIdIsNotNull() { + addCriterion("mq_server_id is not null"); + return (Criteria) this; + } + + public Criteria andMqServerIdEqualTo(Long value) { + addCriterion("mq_server_id =", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdNotEqualTo(Long value) { + addCriterion("mq_server_id <>", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdGreaterThan(Long value) { + addCriterion("mq_server_id >", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdGreaterThanOrEqualTo(Long value) { + addCriterion("mq_server_id >=", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdLessThan(Long value) { + addCriterion("mq_server_id <", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdLessThanOrEqualTo(Long value) { + addCriterion("mq_server_id <=", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdIn(List values) { + addCriterion("mq_server_id in", values, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdNotIn(List values) { + addCriterion("mq_server_id not in", values, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdBetween(Long value1, Long value2) { + addCriterion("mq_server_id between", value1, value2, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdNotBetween(Long value1, Long value2) { + addCriterion("mq_server_id not between", value1, value2, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerNameIsNull() { + addCriterion("mq_server_name is null"); + return (Criteria) this; + } + + public Criteria andMqServerNameIsNotNull() { + addCriterion("mq_server_name is not null"); + return (Criteria) this; + } + + public Criteria andMqServerNameEqualTo(String value) { + addCriterion("mq_server_name =", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotEqualTo(String value) { + addCriterion("mq_server_name <>", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameGreaterThan(String value) { + addCriterion("mq_server_name >", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameGreaterThanOrEqualTo(String value) { + addCriterion("mq_server_name >=", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameLessThan(String value) { + addCriterion("mq_server_name <", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameLessThanOrEqualTo(String value) { + addCriterion("mq_server_name <=", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameLike(String value) { + addCriterion("mq_server_name like", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotLike(String value) { + addCriterion("mq_server_name not like", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameIn(List values) { + addCriterion("mq_server_name in", values, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotIn(List values) { + addCriterion("mq_server_name not in", values, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameBetween(String value1, String value2) { + addCriterion("mq_server_name between", value1, value2, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotBetween(String value1, String value2) { + addCriterion("mq_server_name not between", value1, value2, "mqServerName"); + return (Criteria) this; + } + + public Criteria andProxyConfIsNull() { + addCriterion("proxy_conf is null"); + return (Criteria) this; + } + + public Criteria andProxyConfIsNotNull() { + addCriterion("proxy_conf is not null"); + return (Criteria) this; + } + + public Criteria andProxyConfEqualTo(String value) { + addCriterion("proxy_conf =", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfNotEqualTo(String value) { + addCriterion("proxy_conf <>", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfGreaterThan(String value) { + addCriterion("proxy_conf >", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfGreaterThanOrEqualTo(String value) { + addCriterion("proxy_conf >=", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfLessThan(String value) { + addCriterion("proxy_conf <", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfLessThanOrEqualTo(String value) { + addCriterion("proxy_conf <=", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfLike(String value) { + addCriterion("proxy_conf like", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfNotLike(String value) { + addCriterion("proxy_conf not like", value, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfIn(List values) { + addCriterion("proxy_conf in", values, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfNotIn(List values) { + addCriterion("proxy_conf not in", values, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfBetween(String value1, String value2) { + addCriterion("proxy_conf between", value1, value2, "proxyConf"); + return (Criteria) this; + } + + public Criteria andProxyConfNotBetween(String value1, String value2) { + addCriterion("proxy_conf not between", value1, value2, "proxyConf"); + return (Criteria) this; + } + + public Criteria andTypeIsNull() { + addCriterion("type is null"); + return (Criteria) this; + } + + public Criteria andTypeIsNotNull() { + addCriterion("type is not null"); + return (Criteria) this; + } + + public Criteria andTypeEqualTo(Byte value) { + addCriterion("type =", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotEqualTo(Byte value) { + addCriterion("type <>", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThan(Byte value) { + addCriterion("type >", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("type >=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThan(Byte value) { + addCriterion("type <", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThanOrEqualTo(Byte value) { + addCriterion("type <=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeIn(List values) { + addCriterion("type in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotIn(List values) { + addCriterion("type not in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeBetween(Byte value1, Byte value2) { + addCriterion("type between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotBetween(Byte value1, Byte value2) { + addCriterion("type not between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroup.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroup.java new file mode 100644 index 0000000..328baad --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroup.java @@ -0,0 +1,423 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.TypeReference; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.dao.model.custom.ConsumeGroupConfig; +import org.apache.commons.lang3.StringUtils; + + +public class ConsumeGroup implements Serializable { + /** + * 主键id + * default = null + * length = 20 + */ + private Long id; + + /** + * groupname + * default = + * length = 256 + */ + private String groupName; + + /** + * 成本分摊方 + * default = + * length = 256 + */ + private String service; + + /** + * 部门,;分割 + * default = + * length = 256 + */ + private String department; + + /** + * 负责rd,;分割 + * default = + * length = 512 + */ + private String contacters; + + /** + * 0启用报警 1禁用报警 + * default = 0 + * length = 3 + */ + private Byte alarmIsEnable; + + /** + * 报警组信息, ;分割 + * default = + * length = 256 + */ + private List alarmGroup; + + /** + * 报警级别,默认 二级报警,1,2,3级报警 + * default = 2 + * length = 3 + */ + private Byte alarmLevel; + + /** + * 消息积压报警阈值,默认积压10000条 + * default = 10000 + * length = 10 + */ + private Integer alarmMsgLag; + + /** + * 消息延迟报警时间,单位ms,默认5分钟 + * default = 300000 + * length = 10 + */ + private Integer alarmDelayTime; + + /** + * 是否广播消费 0启用 1禁用,默认1 + * default = 1 + * length = 3 + */ + private Byte broadcastConsume; + + /** + * 0同机房消费 1跨机房消费 2自定义,默认1 + * default = 1 + * length = 3 + */ + private Byte consumeMode; + + /** + * 自定义消费模式,map结构,key为client idc,value为cproxy idc列表 + * default = + * length = 2048 + */ + private Map> consumeModeMapper; + + /** + * 额外参数 + * default = + * length = 2048 + */ + private Map extraParams; + + /** + * 运维端配置参数 + * default = + * length = 2048 + */ + private ConsumeGroupConfig config; + + /** + * group 备注 + * default = + * length = 256 + */ + private String remark; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName == null ? null : groupName.trim(); + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service == null ? null : service.trim(); + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department == null ? null : department.trim(); + } + + public String getContacters() { + return contacters; + } + + public void setContacters(String contacters) { + this.contacters = contacters == null ? null : contacters.trim(); + } + + public Byte getAlarmIsEnable() { + return alarmIsEnable; + } + + public void setAlarmIsEnable(Byte alarmIsEnable) { + this.alarmIsEnable = alarmIsEnable; + } + + public String getAlarmGroup() { + return this.alarmGroup == null ? null : FastJsonUtils.toJsonString(alarmGroup); + } + + public void setAlarmGroup(String alarmGroup) { + this.alarmGroup = StringUtils.isBlank(alarmGroup) ? null : FastJsonUtils.toObject(alarmGroup, List.class); + } + + public List getGroupAlarmGroup() { + return alarmGroup; + } + + public void setGroupAlarmGroup(List alarmGroup) { + this.alarmGroup = alarmGroup; + } + + + public Byte getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(Byte alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public Integer getAlarmMsgLag() { + return alarmMsgLag; + } + + public void setAlarmMsgLag(Integer alarmMsgLag) { + this.alarmMsgLag = alarmMsgLag; + } + + public Integer getAlarmDelayTime() { + return alarmDelayTime; + } + + public void setAlarmDelayTime(Integer alarmDelayTime) { + this.alarmDelayTime = alarmDelayTime; + } + + public Byte getBroadcastConsume() { + return broadcastConsume; + } + + public void setBroadcastConsume(Byte broadcastConsume) { + this.broadcastConsume = broadcastConsume; + } + + public Byte getConsumeMode() { + return consumeMode; + } + + public void setConsumeMode(Byte consumeMode) { + this.consumeMode = consumeMode; + } + + public String getConsumeModeMapper() { + return this.consumeModeMapper == null ? null : FastJsonUtils.toJsonString(consumeModeMapper); + } + + public void setConsumeModeMapper(String consumeModeMapper) { + this.consumeModeMapper = StringUtils.isBlank(consumeModeMapper) ? null : FastJsonUtils.toObject(consumeModeMapper, new TypeReference/*server idc*/>>() { + }); + } + + public Map/*server idc*/> getGroupConsumeModeMapper() { + return consumeModeMapper; + } + + public void setGroupConsumeModeMapper(Map/*server idc*/> consumeModeMapper) { + this.consumeModeMapper = consumeModeMapper; + } + + public String getExtraParams() { + return this.extraParams == null ? null : FastJsonUtils.toJsonString(extraParams); + } + + public void setExtraParams(String extraParams) { + this.extraParams = StringUtils.isBlank(extraParams) ? null : FastJsonUtils.toObject(extraParams, Map.class); + } + + public Map getGroupExtraParams() { + return extraParams; + } + + public void setGroupExtraParams(Map extraParams) { + this.extraParams = extraParams; + } + + public ConsumeGroupConfig getConsumeGroupConfig() { + return config; + } + + public void setConsumeGroupConfig(ConsumeGroupConfig config) { + this.config = config; + } + + public String getConfig() { + return this.config == null ? null : FastJsonUtils.toJsonString(config); + } + + public void setConfig(String config) { + this.config = StringUtils.isBlank(config) ? null : FastJsonUtils.toObject(config, ConsumeGroupConfig.class); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + ConsumeGroup other = (ConsumeGroup) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getGroupName() == null ? other.getGroupName() == null : this.getGroupName().equals(other.getGroupName())) + && (this.getService() == null ? other.getService() == null : this.getService().equals(other.getService())) + && (this.getDepartment() == null ? other.getDepartment() == null : this.getDepartment().equals(other.getDepartment())) + && (this.getContacters() == null ? other.getContacters() == null : this.getContacters().equals(other.getContacters())) + && (this.getAlarmIsEnable() == null ? other.getAlarmIsEnable() == null : this.getAlarmIsEnable().equals(other.getAlarmIsEnable())) + && (this.getAlarmGroup() == null ? other.getAlarmGroup() == null : this.getAlarmGroup().equals(other.getAlarmGroup())) + && (this.getAlarmLevel() == null ? other.getAlarmLevel() == null : this.getAlarmLevel().equals(other.getAlarmLevel())) + && (this.getAlarmMsgLag() == null ? other.getAlarmMsgLag() == null : this.getAlarmMsgLag().equals(other.getAlarmMsgLag())) + && (this.getAlarmDelayTime() == null ? other.getAlarmDelayTime() == null : this.getAlarmDelayTime().equals(other.getAlarmDelayTime())) + && (this.getBroadcastConsume() == null ? other.getBroadcastConsume() == null : this.getBroadcastConsume().equals(other.getBroadcastConsume())) + && (this.getConsumeMode() == null ? other.getConsumeMode() == null : this.getConsumeMode().equals(other.getConsumeMode())) + && (this.getConsumeModeMapper() == null ? other.getConsumeModeMapper() == null : this.getConsumeModeMapper().equals(other.getConsumeModeMapper())) + && (this.getExtraParams() == null ? other.getExtraParams() == null : this.getExtraParams().equals(other.getExtraParams())) + && (this.getConfig() == null ? other.getConfig() == null : this.getConfig().equals(other.getConfig())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getGroupName() == null) ? 0 : getGroupName().hashCode()); + result = prime * result + ((getService() == null) ? 0 : getService().hashCode()); + result = prime * result + ((getDepartment() == null) ? 0 : getDepartment().hashCode()); + result = prime * result + ((getContacters() == null) ? 0 : getContacters().hashCode()); + result = prime * result + ((getAlarmIsEnable() == null) ? 0 : getAlarmIsEnable().hashCode()); + result = prime * result + ((getAlarmGroup() == null) ? 0 : getAlarmGroup().hashCode()); + result = prime * result + ((getAlarmLevel() == null) ? 0 : getAlarmLevel().hashCode()); + result = prime * result + ((getAlarmMsgLag() == null) ? 0 : getAlarmMsgLag().hashCode()); + result = prime * result + ((getAlarmDelayTime() == null) ? 0 : getAlarmDelayTime().hashCode()); + result = prime * result + ((getBroadcastConsume() == null) ? 0 : getBroadcastConsume().hashCode()); + result = prime * result + ((getConsumeMode() == null) ? 0 : getConsumeMode().hashCode()); + result = prime * result + ((getConsumeModeMapper() == null) ? 0 : getConsumeModeMapper().hashCode()); + result = prime * result + ((getExtraParams() == null) ? 0 : getExtraParams().hashCode()); + result = prime * result + ((getConfig() == null) ? 0 : getConfig().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", groupName=" + groupName + + ", service=" + service + + ", department=" + department + + ", contacters=" + contacters + + ", alarmIsEnable=" + alarmIsEnable + + ", alarmGroup=" + alarmGroup + + ", alarmLevel=" + alarmLevel + + ", alarmMsgLag=" + alarmMsgLag + + ", alarmDelayTime=" + alarmDelayTime + + ", broadcastConsume=" + broadcastConsume + + ", consumeMode=" + consumeMode + + ", consumeModeMapper=" + consumeModeMapper + + ", extraParams=" + extraParams + + ", config=" + config + + ", remark=" + remark + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroupCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroupCriteria.java new file mode 100644 index 0000000..2c153db --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeGroupCriteria.java @@ -0,0 +1,1451 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class ConsumeGroupCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public ConsumeGroupCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andGroupNameIsNull() { + addCriterion("group_name is null"); + return (Criteria) this; + } + + public Criteria andGroupNameIsNotNull() { + addCriterion("group_name is not null"); + return (Criteria) this; + } + + public Criteria andGroupNameEqualTo(String value) { + addCriterion("group_name =", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotEqualTo(String value) { + addCriterion("group_name <>", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameGreaterThan(String value) { + addCriterion("group_name >", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameGreaterThanOrEqualTo(String value) { + addCriterion("group_name >=", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameLessThan(String value) { + addCriterion("group_name <", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameLessThanOrEqualTo(String value) { + addCriterion("group_name <=", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameLike(String value) { + addCriterion("group_name like", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotLike(String value) { + addCriterion("group_name not like", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameIn(List values) { + addCriterion("group_name in", values, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotIn(List values) { + addCriterion("group_name not in", values, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameBetween(String value1, String value2) { + addCriterion("group_name between", value1, value2, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotBetween(String value1, String value2) { + addCriterion("group_name not between", value1, value2, "groupName"); + return (Criteria) this; + } + + public Criteria andServiceIsNull() { + addCriterion("service is null"); + return (Criteria) this; + } + + public Criteria andServiceIsNotNull() { + addCriterion("service is not null"); + return (Criteria) this; + } + + public Criteria andServiceEqualTo(String value) { + addCriterion("service =", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotEqualTo(String value) { + addCriterion("service <>", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceGreaterThan(String value) { + addCriterion("service >", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceGreaterThanOrEqualTo(String value) { + addCriterion("service >=", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceLessThan(String value) { + addCriterion("service <", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceLessThanOrEqualTo(String value) { + addCriterion("service <=", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceLike(String value) { + addCriterion("service like", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotLike(String value) { + addCriterion("service not like", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceIn(List values) { + addCriterion("service in", values, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotIn(List values) { + addCriterion("service not in", values, "service"); + return (Criteria) this; + } + + public Criteria andServiceBetween(String value1, String value2) { + addCriterion("service between", value1, value2, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotBetween(String value1, String value2) { + addCriterion("service not between", value1, value2, "service"); + return (Criteria) this; + } + + public Criteria andDepartmentIsNull() { + addCriterion("department is null"); + return (Criteria) this; + } + + public Criteria andDepartmentIsNotNull() { + addCriterion("department is not null"); + return (Criteria) this; + } + + public Criteria andDepartmentEqualTo(String value) { + addCriterion("department =", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotEqualTo(String value) { + addCriterion("department <>", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentGreaterThan(String value) { + addCriterion("department >", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentGreaterThanOrEqualTo(String value) { + addCriterion("department >=", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentLessThan(String value) { + addCriterion("department <", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentLessThanOrEqualTo(String value) { + addCriterion("department <=", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentLike(String value) { + addCriterion("department like", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotLike(String value) { + addCriterion("department not like", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentIn(List values) { + addCriterion("department in", values, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotIn(List values) { + addCriterion("department not in", values, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentBetween(String value1, String value2) { + addCriterion("department between", value1, value2, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotBetween(String value1, String value2) { + addCriterion("department not between", value1, value2, "department"); + return (Criteria) this; + } + + public Criteria andContactersIsNull() { + addCriterion("contacters is null"); + return (Criteria) this; + } + + public Criteria andContactersIsNotNull() { + addCriterion("contacters is not null"); + return (Criteria) this; + } + + public Criteria andContactersEqualTo(String value) { + addCriterion("contacters =", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotEqualTo(String value) { + addCriterion("contacters <>", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersGreaterThan(String value) { + addCriterion("contacters >", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersGreaterThanOrEqualTo(String value) { + addCriterion("contacters >=", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersLessThan(String value) { + addCriterion("contacters <", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersLessThanOrEqualTo(String value) { + addCriterion("contacters <=", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersLike(String value) { + addCriterion("contacters like", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotLike(String value) { + addCriterion("contacters not like", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersIn(List values) { + addCriterion("contacters in", values, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotIn(List values) { + addCriterion("contacters not in", values, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersBetween(String value1, String value2) { + addCriterion("contacters between", value1, value2, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotBetween(String value1, String value2) { + addCriterion("contacters not between", value1, value2, "contacters"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIsNull() { + addCriterion("alarm_is_enable is null"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIsNotNull() { + addCriterion("alarm_is_enable is not null"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableEqualTo(Byte value) { + addCriterion("alarm_is_enable =", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotEqualTo(Byte value) { + addCriterion("alarm_is_enable <>", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableGreaterThan(Byte value) { + addCriterion("alarm_is_enable >", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableGreaterThanOrEqualTo(Byte value) { + addCriterion("alarm_is_enable >=", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableLessThan(Byte value) { + addCriterion("alarm_is_enable <", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableLessThanOrEqualTo(Byte value) { + addCriterion("alarm_is_enable <=", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIn(List values) { + addCriterion("alarm_is_enable in", values, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotIn(List values) { + addCriterion("alarm_is_enable not in", values, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableBetween(Byte value1, Byte value2) { + addCriterion("alarm_is_enable between", value1, value2, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotBetween(Byte value1, Byte value2) { + addCriterion("alarm_is_enable not between", value1, value2, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmGroupIsNull() { + addCriterion("alarm_group is null"); + return (Criteria) this; + } + + public Criteria andAlarmGroupIsNotNull() { + addCriterion("alarm_group is not null"); + return (Criteria) this; + } + + public Criteria andAlarmGroupEqualTo(String value) { + addCriterion("alarm_group =", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotEqualTo(String value) { + addCriterion("alarm_group <>", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupGreaterThan(String value) { + addCriterion("alarm_group >", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupGreaterThanOrEqualTo(String value) { + addCriterion("alarm_group >=", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupLessThan(String value) { + addCriterion("alarm_group <", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupLessThanOrEqualTo(String value) { + addCriterion("alarm_group <=", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupLike(String value) { + addCriterion("alarm_group like", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotLike(String value) { + addCriterion("alarm_group not like", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupIn(List values) { + addCriterion("alarm_group in", values, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotIn(List values) { + addCriterion("alarm_group not in", values, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupBetween(String value1, String value2) { + addCriterion("alarm_group between", value1, value2, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotBetween(String value1, String value2) { + addCriterion("alarm_group not between", value1, value2, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmLevelIsNull() { + addCriterion("alarm_level is null"); + return (Criteria) this; + } + + public Criteria andAlarmLevelIsNotNull() { + addCriterion("alarm_level is not null"); + return (Criteria) this; + } + + public Criteria andAlarmLevelEqualTo(Byte value) { + addCriterion("alarm_level =", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelNotEqualTo(Byte value) { + addCriterion("alarm_level <>", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelGreaterThan(Byte value) { + addCriterion("alarm_level >", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelGreaterThanOrEqualTo(Byte value) { + addCriterion("alarm_level >=", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelLessThan(Byte value) { + addCriterion("alarm_level <", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelLessThanOrEqualTo(Byte value) { + addCriterion("alarm_level <=", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelIn(List values) { + addCriterion("alarm_level in", values, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelNotIn(List values) { + addCriterion("alarm_level not in", values, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelBetween(Byte value1, Byte value2) { + addCriterion("alarm_level between", value1, value2, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelNotBetween(Byte value1, Byte value2) { + addCriterion("alarm_level not between", value1, value2, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagIsNull() { + addCriterion("alarm_msg_lag is null"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagIsNotNull() { + addCriterion("alarm_msg_lag is not null"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagEqualTo(Integer value) { + addCriterion("alarm_msg_lag =", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagNotEqualTo(Integer value) { + addCriterion("alarm_msg_lag <>", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagGreaterThan(Integer value) { + addCriterion("alarm_msg_lag >", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagGreaterThanOrEqualTo(Integer value) { + addCriterion("alarm_msg_lag >=", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagLessThan(Integer value) { + addCriterion("alarm_msg_lag <", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagLessThanOrEqualTo(Integer value) { + addCriterion("alarm_msg_lag <=", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagIn(List values) { + addCriterion("alarm_msg_lag in", values, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagNotIn(List values) { + addCriterion("alarm_msg_lag not in", values, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagBetween(Integer value1, Integer value2) { + addCriterion("alarm_msg_lag between", value1, value2, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagNotBetween(Integer value1, Integer value2) { + addCriterion("alarm_msg_lag not between", value1, value2, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeIsNull() { + addCriterion("alarm_delay_time is null"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeIsNotNull() { + addCriterion("alarm_delay_time is not null"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeEqualTo(Integer value) { + addCriterion("alarm_delay_time =", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeNotEqualTo(Integer value) { + addCriterion("alarm_delay_time <>", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeGreaterThan(Integer value) { + addCriterion("alarm_delay_time >", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeGreaterThanOrEqualTo(Integer value) { + addCriterion("alarm_delay_time >=", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeLessThan(Integer value) { + addCriterion("alarm_delay_time <", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeLessThanOrEqualTo(Integer value) { + addCriterion("alarm_delay_time <=", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeIn(List values) { + addCriterion("alarm_delay_time in", values, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeNotIn(List values) { + addCriterion("alarm_delay_time not in", values, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeBetween(Integer value1, Integer value2) { + addCriterion("alarm_delay_time between", value1, value2, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeNotBetween(Integer value1, Integer value2) { + addCriterion("alarm_delay_time not between", value1, value2, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeIsNull() { + addCriterion("broadcast_consume is null"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeIsNotNull() { + addCriterion("broadcast_consume is not null"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeEqualTo(Byte value) { + addCriterion("broadcast_consume =", value, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeNotEqualTo(Byte value) { + addCriterion("broadcast_consume <>", value, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeGreaterThan(Byte value) { + addCriterion("broadcast_consume >", value, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeGreaterThanOrEqualTo(Byte value) { + addCriterion("broadcast_consume >=", value, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeLessThan(Byte value) { + addCriterion("broadcast_consume <", value, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeLessThanOrEqualTo(Byte value) { + addCriterion("broadcast_consume <=", value, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeIn(List values) { + addCriterion("broadcast_consume in", values, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeNotIn(List values) { + addCriterion("broadcast_consume not in", values, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeBetween(Byte value1, Byte value2) { + addCriterion("broadcast_consume between", value1, value2, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andBroadcastConsumeNotBetween(Byte value1, Byte value2) { + addCriterion("broadcast_consume not between", value1, value2, "broadcastConsume"); + return (Criteria) this; + } + + public Criteria andConsumeModeIsNull() { + addCriterion("consume_mode is null"); + return (Criteria) this; + } + + public Criteria andConsumeModeIsNotNull() { + addCriterion("consume_mode is not null"); + return (Criteria) this; + } + + public Criteria andConsumeModeEqualTo(Byte value) { + addCriterion("consume_mode =", value, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeNotEqualTo(Byte value) { + addCriterion("consume_mode <>", value, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeGreaterThan(Byte value) { + addCriterion("consume_mode >", value, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeGreaterThanOrEqualTo(Byte value) { + addCriterion("consume_mode >=", value, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeLessThan(Byte value) { + addCriterion("consume_mode <", value, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeLessThanOrEqualTo(Byte value) { + addCriterion("consume_mode <=", value, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeIn(List values) { + addCriterion("consume_mode in", values, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeNotIn(List values) { + addCriterion("consume_mode not in", values, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeBetween(Byte value1, Byte value2) { + addCriterion("consume_mode between", value1, value2, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeNotBetween(Byte value1, Byte value2) { + addCriterion("consume_mode not between", value1, value2, "consumeMode"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperIsNull() { + addCriterion("consume_mode_mapper is null"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperIsNotNull() { + addCriterion("consume_mode_mapper is not null"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperEqualTo(String value) { + addCriterion("consume_mode_mapper =", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperNotEqualTo(String value) { + addCriterion("consume_mode_mapper <>", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperGreaterThan(String value) { + addCriterion("consume_mode_mapper >", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperGreaterThanOrEqualTo(String value) { + addCriterion("consume_mode_mapper >=", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperLessThan(String value) { + addCriterion("consume_mode_mapper <", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperLessThanOrEqualTo(String value) { + addCriterion("consume_mode_mapper <=", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperLike(String value) { + addCriterion("consume_mode_mapper like", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperNotLike(String value) { + addCriterion("consume_mode_mapper not like", value, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperIn(List values) { + addCriterion("consume_mode_mapper in", values, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperNotIn(List values) { + addCriterion("consume_mode_mapper not in", values, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperBetween(String value1, String value2) { + addCriterion("consume_mode_mapper between", value1, value2, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andConsumeModeMapperNotBetween(String value1, String value2) { + addCriterion("consume_mode_mapper not between", value1, value2, "consumeModeMapper"); + return (Criteria) this; + } + + public Criteria andExtraParamsIsNull() { + addCriterion("extra_params is null"); + return (Criteria) this; + } + + public Criteria andExtraParamsIsNotNull() { + addCriterion("extra_params is not null"); + return (Criteria) this; + } + + public Criteria andExtraParamsEqualTo(String value) { + addCriterion("extra_params =", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotEqualTo(String value) { + addCriterion("extra_params <>", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsGreaterThan(String value) { + addCriterion("extra_params >", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsGreaterThanOrEqualTo(String value) { + addCriterion("extra_params >=", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLessThan(String value) { + addCriterion("extra_params <", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLessThanOrEqualTo(String value) { + addCriterion("extra_params <=", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLike(String value) { + addCriterion("extra_params like", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotLike(String value) { + addCriterion("extra_params not like", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsIn(List values) { + addCriterion("extra_params in", values, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotIn(List values) { + addCriterion("extra_params not in", values, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsBetween(String value1, String value2) { + addCriterion("extra_params between", value1, value2, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotBetween(String value1, String value2) { + addCriterion("extra_params not between", value1, value2, "extraParams"); + return (Criteria) this; + } + + public Criteria andConfigIsNull() { + addCriterion("config is null"); + return (Criteria) this; + } + + public Criteria andConfigIsNotNull() { + addCriterion("config is not null"); + return (Criteria) this; + } + + public Criteria andConfigEqualTo(String value) { + addCriterion("config =", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotEqualTo(String value) { + addCriterion("config <>", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThan(String value) { + addCriterion("config >", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThanOrEqualTo(String value) { + addCriterion("config >=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThan(String value) { + addCriterion("config <", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThanOrEqualTo(String value) { + addCriterion("config <=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLike(String value) { + addCriterion("config like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotLike(String value) { + addCriterion("config not like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigIn(List values) { + addCriterion("config in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotIn(List values) { + addCriterion("config not in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigBetween(String value1, String value2) { + addCriterion("config between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotBetween(String value1, String value2) { + addCriterion("config not between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscription.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscription.java new file mode 100644 index 0000000..b7cb2cf --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscription.java @@ -0,0 +1,884 @@ +package com.didi.carrera.console.dao.model; + +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.dao.model.custom.ConsumeSubscriptionConfig; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + + +public class ConsumeSubscription implements Serializable { + /** + * 自增id + * default = null + * length = 20 + */ + private Long id; + + /** + * 组id + * default = 0 + * length = 19 + */ + private Long groupId; + + /** + * 组名称 + * default = + * length = 256 + */ + private String groupName; + + /** + * topic主键id + * default = 0 + * length = 19 + */ + private Long topicId; + + /** + * topic名称 + * default = + * length = 256 + */ + private String topicName; + + /** + * 集群id + * default = 0 + * length = 19 + */ + private Long clusterId; + + /** + * 集群名称 + * default = + * length = 256 + */ + private String clusterName; + + /** + * 0 否不接收压测流量,1 接收压测流量,默认0否不接收压测流量 + * default = 0 + * length = 3 + */ + private Byte pressureTraffic; + + /** + * 限流tps + * default = 1000.00 + * length = 11 + */ + private Double maxTps; + + /** + * 报警类型:0.继承消费组配置 1.单独配置 + * default = 0 + * length = 3 + */ + private Byte alarmType; + + /** + * 0启用报警 1禁用报警 + * default = 0 + * length = 3 + */ + private Byte alarmIsEnable; + + /** + * 报警级别,默认 二级报警,1,2,3级报警 + * default = 2 + * length = 3 + */ + private Byte alarmLevel; + + /** + * 消息积压报警阈值,默认积压10000条 + * default = 10000 + * length = 10 + */ + private Integer alarmMsgLag; + + /** + * 消息延迟报警时间,单位ms,默认5分钟 + * default = 300000 + * length = 10 + */ + private Integer alarmDelayTime; + + /** + * 使用消息接口类型,1:highlevel 2 lowlevel,默认1 + * default = 1 + * length = 3 + */ + private Byte apiType; + + /** + * 消息超时时间,默认1000ms,单位ms + * default = 1000 + * length = 10 + */ + private Integer consumeTimeout; + + /** + * 消息错误重试次数,默认3次,-1 为一直重试 + * default = 3 + * length = 10 + */ + private Integer errorRetryTimes; + + /** + * 消息重试间隔,分号分隔 + * default = + * length = 1024 + */ + private List retryIntervals; + + /** + * 消息类型:1Json 2text 3二进制数据 + * default = 0 + * length = 3 + */ + private Byte msgType; + + /** + * 是否启用groovy 0 启用 1禁用 + * default = 0 + * length = 3 + */ + private Byte enableGroovy; + + /** + * 是否启用Transit 0 启用 1禁用 + * default = 0 + * length = 3 + */ + private Byte enableTransit; + + /** + * 是否启用保序,0启用 1禁用 + * default = 0 + * length = 3 + */ + private Byte enableOrder; + + /** + * 保序key + * default = + * length = 512 + */ + private String orderKey; + + /** + * 消费类型:1SDK 2HTTP 3直写第三方组件 + * default = 0 + * length = 3 + */ + private Byte consumeType; + + /** + * 写入类型,0:hdfs 1:hbase 2:redis + * default = 0 + * length = 3 + */ + private Byte bigDataType; + + /** + * 大数据配置内容,json格式 + * default = + * length = 2048 + */ + private String bigDataConfig; + + /** + * url列表,多个以分号分隔 + * default = + * length = 2048 + */ + private List urls; + + /** + * 0 Post 1Get + * default = 0 + * length = 3 + */ + private Byte httpMethod; + + /** + * header 分号分隔,key:val;key:val + * default = + * length = 1024 + */ + private Map httpHeaders; + + /** + * queryParmas,分号分隔,key:val;key:val + * default = + * length = 1024 + */ + private Map httpQueryParams; + + /** + * 消息推送方式:1.放在http消息体 2.param= 3.消息体第一层打平 + * default = 0 + * length = 3 + */ + private Byte msgPushType; + + /** + * token 校验 + * default = + * length = 1024 + */ + private String httpToken; + + /** + * http消息支持最大并发 + * default = 0 + * length = 10 + */ + private Integer pushMaxConcurrency; + + /** + * 消息链,根据config配置推算出actions + * default = + * length = 1024 + */ + private List actions; + + /** + * 运维端配置参数 + * default = + * length = 2048 + */ + private ConsumeSubscriptionConfig config; + + /** + * 消息订阅状态,0:启用 1:禁用 + * default = 0 + * length = 3 + */ + private Byte state; + + /** + * 额外参数 + * default = + * length = 2048 + */ + private Map extraParams; + + /** + * 备注 + * default = + * length = 1024 + */ + private String remark; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + /** + * groovy脚本 + * default = null + * length = 65535 + */ + private String groovy; + + /** + * transit json字符串,key->val + * default = + * length = 1024 + */ + private Map transit; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName == null ? null : groupName.trim(); + } + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName == null ? null : topicName.trim(); + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName == null ? null : clusterName.trim(); + } + + public Byte getPressureTraffic() { + return pressureTraffic; + } + + public void setPressureTraffic(Byte pressureTraffic) { + this.pressureTraffic = pressureTraffic; + } + + public Double getMaxTps() { + return maxTps; + } + + public void setMaxTps(Double maxTps) { + this.maxTps = maxTps; + } + + public Byte getAlarmType() { + return alarmType; + } + + public void setAlarmType(Byte alarmType) { + this.alarmType = alarmType; + } + + public Byte getAlarmIsEnable() { + return alarmIsEnable; + } + + public void setAlarmIsEnable(Byte alarmIsEnable) { + this.alarmIsEnable = alarmIsEnable; + } + + public Byte getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(Byte alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public Integer getAlarmMsgLag() { + return alarmMsgLag; + } + + public void setAlarmMsgLag(Integer alarmMsgLag) { + this.alarmMsgLag = alarmMsgLag; + } + + public Integer getAlarmDelayTime() { + return alarmDelayTime; + } + + public void setAlarmDelayTime(Integer alarmDelayTime) { + this.alarmDelayTime = alarmDelayTime; + } + + public Byte getApiType() { + return apiType; + } + + public void setApiType(Byte apiType) { + this.apiType = apiType; + } + + public Integer getConsumeTimeout() { + return consumeTimeout; + } + + public void setConsumeTimeout(Integer consumeTimeout) { + this.consumeTimeout = consumeTimeout; + } + + public Integer getErrorRetryTimes() { + return errorRetryTimes; + } + + public void setErrorRetryTimes(Integer errorRetryTimes) { + this.errorRetryTimes = errorRetryTimes; + } + + public String getRetryIntervals() { + return this.retryIntervals == null ? null : FastJsonUtils.toJsonString(retryIntervals); + } + + public void setRetryIntervals(String retryIntervals) { + this.retryIntervals = StringUtils.isBlank(retryIntervals) ? null : FastJsonUtils.toObject(retryIntervals, List.class); + } + + public List getSubRetryIntervals() { + return retryIntervals; + } + + public void setSubRetryIntervals(List retryIntervals) { + this.retryIntervals = retryIntervals; + } + + public Byte getMsgType() { + return msgType; + } + + public void setMsgType(Byte msgType) { + this.msgType = msgType; + } + + public Byte getEnableGroovy() { + return enableGroovy; + } + + public void setEnableGroovy(Byte enableGroovy) { + this.enableGroovy = enableGroovy; + } + + public Byte getEnableTransit() { + return enableTransit; + } + + public void setEnableTransit(Byte enableTransit) { + this.enableTransit = enableTransit; + } + + public Byte getEnableOrder() { + return enableOrder; + } + + public void setEnableOrder(Byte enableOrder) { + this.enableOrder = enableOrder; + } + + public String getOrderKey() { + return orderKey; + } + + public void setOrderKey(String orderKey) { + this.orderKey = orderKey == null ? null : orderKey.trim(); + } + + public Byte getConsumeType() { + return consumeType; + } + + public void setConsumeType(Byte consumeType) { + this.consumeType = consumeType; + } + + public Byte getBigDataType() { + return bigDataType; + } + + public void setBigDataType(Byte bigDataType) { + this.bigDataType = bigDataType; + } + + public String getBigDataConfig() { + return bigDataConfig; + } + + public void setBigDataConfig(String bigDataConfig) { + this.bigDataConfig = bigDataConfig == null ? null : bigDataConfig.trim(); + } + + public String getUrls() { + return this.urls == null ? null : FastJsonUtils.toJsonString(urls); + } + + public void setUrls(String urls) { + this.urls = StringUtils.isBlank(urls) ? null : FastJsonUtils.toObject(urls, List.class); + } + + public List getSubUrls() { + return urls; + } + + public void setSubUrls(List urls) { + this.urls = urls; + } + + public Byte getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(Byte httpMethod) { + this.httpMethod = httpMethod; + } + + public String getHttpHeaders() { + return this.httpHeaders == null ? null : FastJsonUtils.toJsonString(httpHeaders); + } + + public void setHttpHeaders(String httpHeaders) { + this.httpHeaders = StringUtils.isBlank(httpHeaders) ? null : FastJsonUtils.toObject(httpHeaders, Map.class); + } + + public Map getSubHttpHeaders() { + return httpHeaders; + } + + public void setSubHttpHeaders(Map httpHeaders) { + this.httpHeaders = httpHeaders; + } + + public String getHttpQueryParams() { + return this.httpQueryParams == null ? null : FastJsonUtils.toJsonString(httpQueryParams); + } + + public void setHttpQueryParams(String httpQueryParams) { + this.httpQueryParams = StringUtils.isBlank(httpQueryParams) ? null : FastJsonUtils.toObject(httpQueryParams, Map.class); + } + + public Map getSubHttpQueryParams() { + return httpQueryParams; + } + + public void setSubHttpQueryParams(Map httpQueryParams) { + this.httpQueryParams = httpQueryParams; + } + + public Byte getMsgPushType() { + return msgPushType; + } + + public void setMsgPushType(Byte msgPushType) { + this.msgPushType = msgPushType; + } + + public String getHttpToken() { + return httpToken; + } + + public void setHttpToken(String httpToken) { + this.httpToken = httpToken == null ? null : httpToken.trim(); + } + + public Integer getPushMaxConcurrency() { + return pushMaxConcurrency; + } + + public void setPushMaxConcurrency(Integer pushMaxConcurrency) { + this.pushMaxConcurrency = pushMaxConcurrency; + } + + public String getActions() { + return this.actions == null ? null : FastJsonUtils.toJsonString(actions); + } + + public void setActions(String actions) { + this.actions = StringUtils.isBlank(actions) ? null : FastJsonUtils.toObject(actions, List.class); + } + + public List getSubActions() { + return actions; + } + + public void setSubActions(List actions) { + this.actions = actions; + } + + public String getConfig() { + return this.config == null ? null : FastJsonUtils.toJsonString(this.config); + } + + public void setConfig(String config) { + this.config = StringUtils.isBlank(config) ? null : FastJsonUtils.toObject(config, ConsumeSubscriptionConfig.class); + } + + public ConsumeSubscriptionConfig getConsumeSubscriptionConfig() { + return config; + } + + public void setConsumeSubscriptionConfig(ConsumeSubscriptionConfig config) { + this.config = config; + } + + public Byte getState() { + return state; + } + + public void setState(Byte state) { + this.state = state; + } + + public String getExtraParams() { + return this.extraParams == null ? null : FastJsonUtils.toJsonString(extraParams); + } + + public void setExtraParams(String extraParams) { + this.extraParams = StringUtils.isBlank(extraParams) ? null : FastJsonUtils.toObject(extraParams, Map.class); + } + + public Map getSubExtraParams() { + return extraParams; + } + + public void setSubExtraParams(Map extraParams) { + this.extraParams = extraParams; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getGroovy() { + return groovy; + } + + public void setGroovy(String groovy) { + this.groovy = groovy == null ? null : groovy.trim(); + } + + public String getTransit() { + return this.transit == null ? null : FastJsonUtils.toJsonString(transit); + } + + public void setTransit(String transit) { + this.transit = StringUtils.isBlank(transit) ? null : FastJsonUtils.toObject(transit, Map.class); + } + + public Map getSubTransit() { + return transit; + } + + public void setSubTransit(Map transit) { + this.transit = transit; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + ConsumeSubscription other = (ConsumeSubscription) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getGroupId() == null ? other.getGroupId() == null : this.getGroupId().equals(other.getGroupId())) + && (this.getGroupName() == null ? other.getGroupName() == null : this.getGroupName().equals(other.getGroupName())) + && (this.getTopicId() == null ? other.getTopicId() == null : this.getTopicId().equals(other.getTopicId())) + && (this.getTopicName() == null ? other.getTopicName() == null : this.getTopicName().equals(other.getTopicName())) + && (this.getClusterId() == null ? other.getClusterId() == null : this.getClusterId().equals(other.getClusterId())) + && (this.getClusterName() == null ? other.getClusterName() == null : this.getClusterName().equals(other.getClusterName())) + && (this.getPressureTraffic() == null ? other.getPressureTraffic() == null : this.getPressureTraffic().equals(other.getPressureTraffic())) + && (this.getMaxTps() == null ? other.getMaxTps() == null : this.getMaxTps().equals(other.getMaxTps())) + && (this.getAlarmType() == null ? other.getAlarmType() == null : this.getAlarmType().equals(other.getAlarmType())) + && (this.getAlarmIsEnable() == null ? other.getAlarmIsEnable() == null : this.getAlarmIsEnable().equals(other.getAlarmIsEnable())) + && (this.getAlarmLevel() == null ? other.getAlarmLevel() == null : this.getAlarmLevel().equals(other.getAlarmLevel())) + && (this.getAlarmMsgLag() == null ? other.getAlarmMsgLag() == null : this.getAlarmMsgLag().equals(other.getAlarmMsgLag())) + && (this.getAlarmDelayTime() == null ? other.getAlarmDelayTime() == null : this.getAlarmDelayTime().equals(other.getAlarmDelayTime())) + && (this.getApiType() == null ? other.getApiType() == null : this.getApiType().equals(other.getApiType())) + && (this.getConsumeTimeout() == null ? other.getConsumeTimeout() == null : this.getConsumeTimeout().equals(other.getConsumeTimeout())) + && (this.getErrorRetryTimes() == null ? other.getErrorRetryTimes() == null : this.getErrorRetryTimes().equals(other.getErrorRetryTimes())) + && (this.getRetryIntervals() == null ? other.getRetryIntervals() == null : this.getRetryIntervals().equals(other.getRetryIntervals())) + && (this.getMsgType() == null ? other.getMsgType() == null : this.getMsgType().equals(other.getMsgType())) + && (this.getEnableGroovy() == null ? other.getEnableGroovy() == null : this.getEnableGroovy().equals(other.getEnableGroovy())) + && (this.getEnableTransit() == null ? other.getEnableTransit() == null : this.getEnableTransit().equals(other.getEnableTransit())) + && (this.getEnableOrder() == null ? other.getEnableOrder() == null : this.getEnableOrder().equals(other.getEnableOrder())) + && (this.getOrderKey() == null ? other.getOrderKey() == null : this.getOrderKey().equals(other.getOrderKey())) + && (this.getConsumeType() == null ? other.getConsumeType() == null : this.getConsumeType().equals(other.getConsumeType())) + && (this.getBigDataType() == null ? other.getBigDataType() == null : this.getBigDataType().equals(other.getBigDataType())) + && (this.getBigDataConfig() == null ? other.getBigDataConfig() == null : this.getBigDataConfig().equals(other.getBigDataConfig())) + && (this.getUrls() == null ? other.getUrls() == null : this.getUrls().equals(other.getUrls())) + && (this.getHttpMethod() == null ? other.getHttpMethod() == null : this.getHttpMethod().equals(other.getHttpMethod())) + && (this.getHttpHeaders() == null ? other.getHttpHeaders() == null : this.getHttpHeaders().equals(other.getHttpHeaders())) + && (this.getHttpQueryParams() == null ? other.getHttpQueryParams() == null : this.getHttpQueryParams().equals(other.getHttpQueryParams())) + && (this.getMsgPushType() == null ? other.getMsgPushType() == null : this.getMsgPushType().equals(other.getMsgPushType())) + && (this.getHttpToken() == null ? other.getHttpToken() == null : this.getHttpToken().equals(other.getHttpToken())) + && (this.getPushMaxConcurrency() == null ? other.getPushMaxConcurrency() == null : this.getPushMaxConcurrency().equals(other.getPushMaxConcurrency())) + && (this.getActions() == null ? other.getActions() == null : this.getActions().equals(other.getActions())) + && (this.getConfig() == null ? other.getConfig() == null : this.getConfig().equals(other.getConfig())) + && (this.getState() == null ? other.getState() == null : this.getState().equals(other.getState())) + && (this.getExtraParams() == null ? other.getExtraParams() == null : this.getExtraParams().equals(other.getExtraParams())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())) + && (this.getGroovy() == null ? other.getGroovy() == null : this.getGroovy().equals(other.getGroovy())) + && (this.getTransit() == null ? other.getTransit() == null : this.getTransit().equals(other.getTransit())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getGroupId() == null) ? 0 : getGroupId().hashCode()); + result = prime * result + ((getGroupName() == null) ? 0 : getGroupName().hashCode()); + result = prime * result + ((getTopicId() == null) ? 0 : getTopicId().hashCode()); + result = prime * result + ((getTopicName() == null) ? 0 : getTopicName().hashCode()); + result = prime * result + ((getClusterId() == null) ? 0 : getClusterId().hashCode()); + result = prime * result + ((getClusterName() == null) ? 0 : getClusterName().hashCode()); + result = prime * result + ((getPressureTraffic() == null) ? 0 : getPressureTraffic().hashCode()); + result = prime * result + ((getMaxTps() == null) ? 0 : getMaxTps().hashCode()); + result = prime * result + ((getAlarmType() == null) ? 0 : getAlarmType().hashCode()); + result = prime * result + ((getAlarmIsEnable() == null) ? 0 : getAlarmIsEnable().hashCode()); + result = prime * result + ((getAlarmLevel() == null) ? 0 : getAlarmLevel().hashCode()); + result = prime * result + ((getAlarmMsgLag() == null) ? 0 : getAlarmMsgLag().hashCode()); + result = prime * result + ((getAlarmDelayTime() == null) ? 0 : getAlarmDelayTime().hashCode()); + result = prime * result + ((getApiType() == null) ? 0 : getApiType().hashCode()); + result = prime * result + ((getConsumeTimeout() == null) ? 0 : getConsumeTimeout().hashCode()); + result = prime * result + ((getErrorRetryTimes() == null) ? 0 : getErrorRetryTimes().hashCode()); + result = prime * result + ((getRetryIntervals() == null) ? 0 : getRetryIntervals().hashCode()); + result = prime * result + ((getMsgType() == null) ? 0 : getMsgType().hashCode()); + result = prime * result + ((getEnableGroovy() == null) ? 0 : getEnableGroovy().hashCode()); + result = prime * result + ((getEnableTransit() == null) ? 0 : getEnableTransit().hashCode()); + result = prime * result + ((getEnableOrder() == null) ? 0 : getEnableOrder().hashCode()); + result = prime * result + ((getOrderKey() == null) ? 0 : getOrderKey().hashCode()); + result = prime * result + ((getConsumeType() == null) ? 0 : getConsumeType().hashCode()); + result = prime * result + ((getBigDataType() == null) ? 0 : getBigDataType().hashCode()); + result = prime * result + ((getBigDataConfig() == null) ? 0 : getBigDataConfig().hashCode()); + result = prime * result + ((getUrls() == null) ? 0 : getUrls().hashCode()); + result = prime * result + ((getHttpMethod() == null) ? 0 : getHttpMethod().hashCode()); + result = prime * result + ((getHttpHeaders() == null) ? 0 : getHttpHeaders().hashCode()); + result = prime * result + ((getHttpQueryParams() == null) ? 0 : getHttpQueryParams().hashCode()); + result = prime * result + ((getMsgPushType() == null) ? 0 : getMsgPushType().hashCode()); + result = prime * result + ((getHttpToken() == null) ? 0 : getHttpToken().hashCode()); + result = prime * result + ((getPushMaxConcurrency() == null) ? 0 : getPushMaxConcurrency().hashCode()); + result = prime * result + ((getActions() == null) ? 0 : getActions().hashCode()); + result = prime * result + ((getConfig() == null) ? 0 : getConfig().hashCode()); + result = prime * result + ((getState() == null) ? 0 : getState().hashCode()); + result = prime * result + ((getExtraParams() == null) ? 0 : getExtraParams().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + result = prime * result + ((getGroovy() == null) ? 0 : getGroovy().hashCode()); + result = prime * result + ((getTransit() == null) ? 0 : getTransit().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", groupId=" + groupId + + ", groupName=" + groupName + + ", topicId=" + topicId + + ", topicName=" + topicName + + ", clusterId=" + clusterId + + ", clusterName=" + clusterName + + ", pressureTraffic=" + pressureTraffic + + ", maxTps=" + maxTps + + ", alarmType=" + alarmType + + ", alarmIsEnable=" + alarmIsEnable + + ", alarmLevel=" + alarmLevel + + ", alarmMsgLag=" + alarmMsgLag + + ", alarmDelayTime=" + alarmDelayTime + + ", apiType=" + apiType + + ", consumeTimeout=" + consumeTimeout + + ", errorRetryTimes=" + errorRetryTimes + + ", retryIntervals=" + retryIntervals + + ", msgType=" + msgType + + ", enableGroovy=" + enableGroovy + + ", enableTransit=" + enableTransit + + ", enableOrder=" + enableOrder + + ", orderKey=" + orderKey + + ", consumeType=" + consumeType + + ", bigDataType=" + bigDataType + + ", bigDataConfig=" + bigDataConfig + + ", urls=" + urls + + ", httpMethod=" + httpMethod + + ", httpHeaders=" + httpHeaders + + ", httpQueryParams=" + httpQueryParams + + ", msgPushType=" + msgPushType + + ", httpToken=" + httpToken + + ", pushMaxConcurrency=" + pushMaxConcurrency + + ", actions=" + actions + + ", config=" + config + + ", state=" + state + + ", extraParams=" + extraParams + + ", remark=" + remark + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", groovy=" + groovy + + ", transit=" + transit + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscriptionCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscriptionCriteria.java new file mode 100644 index 0000000..c85eb38 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/ConsumeSubscriptionCriteria.java @@ -0,0 +1,2821 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class ConsumeSubscriptionCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public ConsumeSubscriptionCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andGroupIdIsNull() { + addCriterion("group_id is null"); + return (Criteria) this; + } + + public Criteria andGroupIdIsNotNull() { + addCriterion("group_id is not null"); + return (Criteria) this; + } + + public Criteria andGroupIdEqualTo(Long value) { + addCriterion("group_id =", value, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdNotEqualTo(Long value) { + addCriterion("group_id <>", value, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdGreaterThan(Long value) { + addCriterion("group_id >", value, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdGreaterThanOrEqualTo(Long value) { + addCriterion("group_id >=", value, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdLessThan(Long value) { + addCriterion("group_id <", value, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdLessThanOrEqualTo(Long value) { + addCriterion("group_id <=", value, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdIn(List values) { + addCriterion("group_id in", values, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdNotIn(List values) { + addCriterion("group_id not in", values, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdBetween(Long value1, Long value2) { + addCriterion("group_id between", value1, value2, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupIdNotBetween(Long value1, Long value2) { + addCriterion("group_id not between", value1, value2, "groupId"); + return (Criteria) this; + } + + public Criteria andGroupNameIsNull() { + addCriterion("group_name is null"); + return (Criteria) this; + } + + public Criteria andGroupNameIsNotNull() { + addCriterion("group_name is not null"); + return (Criteria) this; + } + + public Criteria andGroupNameEqualTo(String value) { + addCriterion("group_name =", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotEqualTo(String value) { + addCriterion("group_name <>", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameGreaterThan(String value) { + addCriterion("group_name >", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameGreaterThanOrEqualTo(String value) { + addCriterion("group_name >=", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameLessThan(String value) { + addCriterion("group_name <", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameLessThanOrEqualTo(String value) { + addCriterion("group_name <=", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameLike(String value) { + addCriterion("group_name like", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotLike(String value) { + addCriterion("group_name not like", value, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameIn(List values) { + addCriterion("group_name in", values, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotIn(List values) { + addCriterion("group_name not in", values, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameBetween(String value1, String value2) { + addCriterion("group_name between", value1, value2, "groupName"); + return (Criteria) this; + } + + public Criteria andGroupNameNotBetween(String value1, String value2) { + addCriterion("group_name not between", value1, value2, "groupName"); + return (Criteria) this; + } + + public Criteria andTopicIdIsNull() { + addCriterion("topic_id is null"); + return (Criteria) this; + } + + public Criteria andTopicIdIsNotNull() { + addCriterion("topic_id is not null"); + return (Criteria) this; + } + + public Criteria andTopicIdEqualTo(Long value) { + addCriterion("topic_id =", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdNotEqualTo(Long value) { + addCriterion("topic_id <>", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdGreaterThan(Long value) { + addCriterion("topic_id >", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdGreaterThanOrEqualTo(Long value) { + addCriterion("topic_id >=", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdLessThan(Long value) { + addCriterion("topic_id <", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdLessThanOrEqualTo(Long value) { + addCriterion("topic_id <=", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdIn(List values) { + addCriterion("topic_id in", values, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdNotIn(List values) { + addCriterion("topic_id not in", values, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdBetween(Long value1, Long value2) { + addCriterion("topic_id between", value1, value2, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdNotBetween(Long value1, Long value2) { + addCriterion("topic_id not between", value1, value2, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicNameIsNull() { + addCriterion("topic_name is null"); + return (Criteria) this; + } + + public Criteria andTopicNameIsNotNull() { + addCriterion("topic_name is not null"); + return (Criteria) this; + } + + public Criteria andTopicNameEqualTo(String value) { + addCriterion("topic_name =", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotEqualTo(String value) { + addCriterion("topic_name <>", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameGreaterThan(String value) { + addCriterion("topic_name >", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameGreaterThanOrEqualTo(String value) { + addCriterion("topic_name >=", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLessThan(String value) { + addCriterion("topic_name <", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLessThanOrEqualTo(String value) { + addCriterion("topic_name <=", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLike(String value) { + addCriterion("topic_name like", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotLike(String value) { + addCriterion("topic_name not like", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameIn(List values) { + addCriterion("topic_name in", values, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotIn(List values) { + addCriterion("topic_name not in", values, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameBetween(String value1, String value2) { + addCriterion("topic_name between", value1, value2, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotBetween(String value1, String value2) { + addCriterion("topic_name not between", value1, value2, "topicName"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNull() { + addCriterion("cluster_id is null"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNotNull() { + addCriterion("cluster_id is not null"); + return (Criteria) this; + } + + public Criteria andClusterIdEqualTo(Long value) { + addCriterion("cluster_id =", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotEqualTo(Long value) { + addCriterion("cluster_id <>", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThan(Long value) { + addCriterion("cluster_id >", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThanOrEqualTo(Long value) { + addCriterion("cluster_id >=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThan(Long value) { + addCriterion("cluster_id <", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThanOrEqualTo(Long value) { + addCriterion("cluster_id <=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdIn(List values) { + addCriterion("cluster_id in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotIn(List values) { + addCriterion("cluster_id not in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdBetween(Long value1, Long value2) { + addCriterion("cluster_id between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotBetween(Long value1, Long value2) { + addCriterion("cluster_id not between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterNameIsNull() { + addCriterion("cluster_name is null"); + return (Criteria) this; + } + + public Criteria andClusterNameIsNotNull() { + addCriterion("cluster_name is not null"); + return (Criteria) this; + } + + public Criteria andClusterNameEqualTo(String value) { + addCriterion("cluster_name =", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotEqualTo(String value) { + addCriterion("cluster_name <>", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameGreaterThan(String value) { + addCriterion("cluster_name >", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameGreaterThanOrEqualTo(String value) { + addCriterion("cluster_name >=", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLessThan(String value) { + addCriterion("cluster_name <", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLessThanOrEqualTo(String value) { + addCriterion("cluster_name <=", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLike(String value) { + addCriterion("cluster_name like", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotLike(String value) { + addCriterion("cluster_name not like", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameIn(List values) { + addCriterion("cluster_name in", values, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotIn(List values) { + addCriterion("cluster_name not in", values, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameBetween(String value1, String value2) { + addCriterion("cluster_name between", value1, value2, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotBetween(String value1, String value2) { + addCriterion("cluster_name not between", value1, value2, "clusterName"); + return (Criteria) this; + } + + public Criteria andPressureTrafficIsNull() { + addCriterion("pressure_traffic is null"); + return (Criteria) this; + } + + public Criteria andPressureTrafficIsNotNull() { + addCriterion("pressure_traffic is not null"); + return (Criteria) this; + } + + public Criteria andPressureTrafficEqualTo(Byte value) { + addCriterion("pressure_traffic =", value, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficNotEqualTo(Byte value) { + addCriterion("pressure_traffic <>", value, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficGreaterThan(Byte value) { + addCriterion("pressure_traffic >", value, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficGreaterThanOrEqualTo(Byte value) { + addCriterion("pressure_traffic >=", value, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficLessThan(Byte value) { + addCriterion("pressure_traffic <", value, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficLessThanOrEqualTo(Byte value) { + addCriterion("pressure_traffic <=", value, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficIn(List values) { + addCriterion("pressure_traffic in", values, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficNotIn(List values) { + addCriterion("pressure_traffic not in", values, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficBetween(Byte value1, Byte value2) { + addCriterion("pressure_traffic between", value1, value2, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andPressureTrafficNotBetween(Byte value1, Byte value2) { + addCriterion("pressure_traffic not between", value1, value2, "pressureTraffic"); + return (Criteria) this; + } + + public Criteria andMaxTpsIsNull() { + addCriterion("max_tps is null"); + return (Criteria) this; + } + + public Criteria andMaxTpsIsNotNull() { + addCriterion("max_tps is not null"); + return (Criteria) this; + } + + public Criteria andMaxTpsEqualTo(Double value) { + addCriterion("max_tps =", value, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsNotEqualTo(Double value) { + addCriterion("max_tps <>", value, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsGreaterThan(Double value) { + addCriterion("max_tps >", value, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsGreaterThanOrEqualTo(Double value) { + addCriterion("max_tps >=", value, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsLessThan(Double value) { + addCriterion("max_tps <", value, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsLessThanOrEqualTo(Double value) { + addCriterion("max_tps <=", value, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsIn(List values) { + addCriterion("max_tps in", values, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsNotIn(List values) { + addCriterion("max_tps not in", values, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsBetween(Double value1, Double value2) { + addCriterion("max_tps between", value1, value2, "maxTps"); + return (Criteria) this; + } + + public Criteria andMaxTpsNotBetween(Double value1, Double value2) { + addCriterion("max_tps not between", value1, value2, "maxTps"); + return (Criteria) this; + } + + public Criteria andAlarmTypeIsNull() { + addCriterion("alarm_type is null"); + return (Criteria) this; + } + + public Criteria andAlarmTypeIsNotNull() { + addCriterion("alarm_type is not null"); + return (Criteria) this; + } + + public Criteria andAlarmTypeEqualTo(Byte value) { + addCriterion("alarm_type =", value, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeNotEqualTo(Byte value) { + addCriterion("alarm_type <>", value, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeGreaterThan(Byte value) { + addCriterion("alarm_type >", value, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("alarm_type >=", value, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeLessThan(Byte value) { + addCriterion("alarm_type <", value, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeLessThanOrEqualTo(Byte value) { + addCriterion("alarm_type <=", value, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeIn(List values) { + addCriterion("alarm_type in", values, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeNotIn(List values) { + addCriterion("alarm_type not in", values, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeBetween(Byte value1, Byte value2) { + addCriterion("alarm_type between", value1, value2, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmTypeNotBetween(Byte value1, Byte value2) { + addCriterion("alarm_type not between", value1, value2, "alarmType"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIsNull() { + addCriterion("alarm_is_enable is null"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIsNotNull() { + addCriterion("alarm_is_enable is not null"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableEqualTo(Byte value) { + addCriterion("alarm_is_enable =", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotEqualTo(Byte value) { + addCriterion("alarm_is_enable <>", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableGreaterThan(Byte value) { + addCriterion("alarm_is_enable >", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableGreaterThanOrEqualTo(Byte value) { + addCriterion("alarm_is_enable >=", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableLessThan(Byte value) { + addCriterion("alarm_is_enable <", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableLessThanOrEqualTo(Byte value) { + addCriterion("alarm_is_enable <=", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIn(List values) { + addCriterion("alarm_is_enable in", values, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotIn(List values) { + addCriterion("alarm_is_enable not in", values, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableBetween(Byte value1, Byte value2) { + addCriterion("alarm_is_enable between", value1, value2, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotBetween(Byte value1, Byte value2) { + addCriterion("alarm_is_enable not between", value1, value2, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmLevelIsNull() { + addCriterion("alarm_level is null"); + return (Criteria) this; + } + + public Criteria andAlarmLevelIsNotNull() { + addCriterion("alarm_level is not null"); + return (Criteria) this; + } + + public Criteria andAlarmLevelEqualTo(Byte value) { + addCriterion("alarm_level =", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelNotEqualTo(Byte value) { + addCriterion("alarm_level <>", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelGreaterThan(Byte value) { + addCriterion("alarm_level >", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelGreaterThanOrEqualTo(Byte value) { + addCriterion("alarm_level >=", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelLessThan(Byte value) { + addCriterion("alarm_level <", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelLessThanOrEqualTo(Byte value) { + addCriterion("alarm_level <=", value, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelIn(List values) { + addCriterion("alarm_level in", values, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelNotIn(List values) { + addCriterion("alarm_level not in", values, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelBetween(Byte value1, Byte value2) { + addCriterion("alarm_level between", value1, value2, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmLevelNotBetween(Byte value1, Byte value2) { + addCriterion("alarm_level not between", value1, value2, "alarmLevel"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagIsNull() { + addCriterion("alarm_msg_lag is null"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagIsNotNull() { + addCriterion("alarm_msg_lag is not null"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagEqualTo(Integer value) { + addCriterion("alarm_msg_lag =", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagNotEqualTo(Integer value) { + addCriterion("alarm_msg_lag <>", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagGreaterThan(Integer value) { + addCriterion("alarm_msg_lag >", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagGreaterThanOrEqualTo(Integer value) { + addCriterion("alarm_msg_lag >=", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagLessThan(Integer value) { + addCriterion("alarm_msg_lag <", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagLessThanOrEqualTo(Integer value) { + addCriterion("alarm_msg_lag <=", value, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagIn(List values) { + addCriterion("alarm_msg_lag in", values, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagNotIn(List values) { + addCriterion("alarm_msg_lag not in", values, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagBetween(Integer value1, Integer value2) { + addCriterion("alarm_msg_lag between", value1, value2, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmMsgLagNotBetween(Integer value1, Integer value2) { + addCriterion("alarm_msg_lag not between", value1, value2, "alarmMsgLag"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeIsNull() { + addCriterion("alarm_delay_time is null"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeIsNotNull() { + addCriterion("alarm_delay_time is not null"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeEqualTo(Integer value) { + addCriterion("alarm_delay_time =", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeNotEqualTo(Integer value) { + addCriterion("alarm_delay_time <>", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeGreaterThan(Integer value) { + addCriterion("alarm_delay_time >", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeGreaterThanOrEqualTo(Integer value) { + addCriterion("alarm_delay_time >=", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeLessThan(Integer value) { + addCriterion("alarm_delay_time <", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeLessThanOrEqualTo(Integer value) { + addCriterion("alarm_delay_time <=", value, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeIn(List values) { + addCriterion("alarm_delay_time in", values, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeNotIn(List values) { + addCriterion("alarm_delay_time not in", values, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeBetween(Integer value1, Integer value2) { + addCriterion("alarm_delay_time between", value1, value2, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andAlarmDelayTimeNotBetween(Integer value1, Integer value2) { + addCriterion("alarm_delay_time not between", value1, value2, "alarmDelayTime"); + return (Criteria) this; + } + + public Criteria andApiTypeIsNull() { + addCriterion("api_type is null"); + return (Criteria) this; + } + + public Criteria andApiTypeIsNotNull() { + addCriterion("api_type is not null"); + return (Criteria) this; + } + + public Criteria andApiTypeEqualTo(Byte value) { + addCriterion("api_type =", value, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeNotEqualTo(Byte value) { + addCriterion("api_type <>", value, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeGreaterThan(Byte value) { + addCriterion("api_type >", value, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("api_type >=", value, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeLessThan(Byte value) { + addCriterion("api_type <", value, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeLessThanOrEqualTo(Byte value) { + addCriterion("api_type <=", value, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeIn(List values) { + addCriterion("api_type in", values, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeNotIn(List values) { + addCriterion("api_type not in", values, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeBetween(Byte value1, Byte value2) { + addCriterion("api_type between", value1, value2, "apiType"); + return (Criteria) this; + } + + public Criteria andApiTypeNotBetween(Byte value1, Byte value2) { + addCriterion("api_type not between", value1, value2, "apiType"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutIsNull() { + addCriterion("consume_timeout is null"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutIsNotNull() { + addCriterion("consume_timeout is not null"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutEqualTo(Integer value) { + addCriterion("consume_timeout =", value, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutNotEqualTo(Integer value) { + addCriterion("consume_timeout <>", value, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutGreaterThan(Integer value) { + addCriterion("consume_timeout >", value, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutGreaterThanOrEqualTo(Integer value) { + addCriterion("consume_timeout >=", value, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutLessThan(Integer value) { + addCriterion("consume_timeout <", value, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutLessThanOrEqualTo(Integer value) { + addCriterion("consume_timeout <=", value, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutIn(List values) { + addCriterion("consume_timeout in", values, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutNotIn(List values) { + addCriterion("consume_timeout not in", values, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutBetween(Integer value1, Integer value2) { + addCriterion("consume_timeout between", value1, value2, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andConsumeTimeoutNotBetween(Integer value1, Integer value2) { + addCriterion("consume_timeout not between", value1, value2, "consumeTimeout"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesIsNull() { + addCriterion("error_retry_times is null"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesIsNotNull() { + addCriterion("error_retry_times is not null"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesEqualTo(Integer value) { + addCriterion("error_retry_times =", value, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesNotEqualTo(Integer value) { + addCriterion("error_retry_times <>", value, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesGreaterThan(Integer value) { + addCriterion("error_retry_times >", value, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesGreaterThanOrEqualTo(Integer value) { + addCriterion("error_retry_times >=", value, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesLessThan(Integer value) { + addCriterion("error_retry_times <", value, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesLessThanOrEqualTo(Integer value) { + addCriterion("error_retry_times <=", value, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesIn(List values) { + addCriterion("error_retry_times in", values, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesNotIn(List values) { + addCriterion("error_retry_times not in", values, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesBetween(Integer value1, Integer value2) { + addCriterion("error_retry_times between", value1, value2, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andErrorRetryTimesNotBetween(Integer value1, Integer value2) { + addCriterion("error_retry_times not between", value1, value2, "errorRetryTimes"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsIsNull() { + addCriterion("retry_intervals is null"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsIsNotNull() { + addCriterion("retry_intervals is not null"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsEqualTo(String value) { + addCriterion("retry_intervals =", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsNotEqualTo(String value) { + addCriterion("retry_intervals <>", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsGreaterThan(String value) { + addCriterion("retry_intervals >", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsGreaterThanOrEqualTo(String value) { + addCriterion("retry_intervals >=", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsLessThan(String value) { + addCriterion("retry_intervals <", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsLessThanOrEqualTo(String value) { + addCriterion("retry_intervals <=", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsLike(String value) { + addCriterion("retry_intervals like", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsNotLike(String value) { + addCriterion("retry_intervals not like", value, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsIn(List values) { + addCriterion("retry_intervals in", values, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsNotIn(List values) { + addCriterion("retry_intervals not in", values, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsBetween(String value1, String value2) { + addCriterion("retry_intervals between", value1, value2, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andRetryIntervalsNotBetween(String value1, String value2) { + addCriterion("retry_intervals not between", value1, value2, "retryIntervals"); + return (Criteria) this; + } + + public Criteria andMsgTypeIsNull() { + addCriterion("msg_type is null"); + return (Criteria) this; + } + + public Criteria andMsgTypeIsNotNull() { + addCriterion("msg_type is not null"); + return (Criteria) this; + } + + public Criteria andMsgTypeEqualTo(Byte value) { + addCriterion("msg_type =", value, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeNotEqualTo(Byte value) { + addCriterion("msg_type <>", value, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeGreaterThan(Byte value) { + addCriterion("msg_type >", value, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("msg_type >=", value, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeLessThan(Byte value) { + addCriterion("msg_type <", value, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeLessThanOrEqualTo(Byte value) { + addCriterion("msg_type <=", value, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeIn(List values) { + addCriterion("msg_type in", values, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeNotIn(List values) { + addCriterion("msg_type not in", values, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeBetween(Byte value1, Byte value2) { + addCriterion("msg_type between", value1, value2, "msgType"); + return (Criteria) this; + } + + public Criteria andMsgTypeNotBetween(Byte value1, Byte value2) { + addCriterion("msg_type not between", value1, value2, "msgType"); + return (Criteria) this; + } + + public Criteria andEnableGroovyIsNull() { + addCriterion("enable_groovy is null"); + return (Criteria) this; + } + + public Criteria andEnableGroovyIsNotNull() { + addCriterion("enable_groovy is not null"); + return (Criteria) this; + } + + public Criteria andEnableGroovyEqualTo(Byte value) { + addCriterion("enable_groovy =", value, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyNotEqualTo(Byte value) { + addCriterion("enable_groovy <>", value, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyGreaterThan(Byte value) { + addCriterion("enable_groovy >", value, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyGreaterThanOrEqualTo(Byte value) { + addCriterion("enable_groovy >=", value, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyLessThan(Byte value) { + addCriterion("enable_groovy <", value, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyLessThanOrEqualTo(Byte value) { + addCriterion("enable_groovy <=", value, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyIn(List values) { + addCriterion("enable_groovy in", values, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyNotIn(List values) { + addCriterion("enable_groovy not in", values, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyBetween(Byte value1, Byte value2) { + addCriterion("enable_groovy between", value1, value2, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableGroovyNotBetween(Byte value1, Byte value2) { + addCriterion("enable_groovy not between", value1, value2, "enableGroovy"); + return (Criteria) this; + } + + public Criteria andEnableTransitIsNull() { + addCriterion("enable_transit is null"); + return (Criteria) this; + } + + public Criteria andEnableTransitIsNotNull() { + addCriterion("enable_transit is not null"); + return (Criteria) this; + } + + public Criteria andEnableTransitEqualTo(Byte value) { + addCriterion("enable_transit =", value, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitNotEqualTo(Byte value) { + addCriterion("enable_transit <>", value, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitGreaterThan(Byte value) { + addCriterion("enable_transit >", value, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitGreaterThanOrEqualTo(Byte value) { + addCriterion("enable_transit >=", value, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitLessThan(Byte value) { + addCriterion("enable_transit <", value, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitLessThanOrEqualTo(Byte value) { + addCriterion("enable_transit <=", value, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitIn(List values) { + addCriterion("enable_transit in", values, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitNotIn(List values) { + addCriterion("enable_transit not in", values, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitBetween(Byte value1, Byte value2) { + addCriterion("enable_transit between", value1, value2, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableTransitNotBetween(Byte value1, Byte value2) { + addCriterion("enable_transit not between", value1, value2, "enableTransit"); + return (Criteria) this; + } + + public Criteria andEnableOrderIsNull() { + addCriterion("enable_order is null"); + return (Criteria) this; + } + + public Criteria andEnableOrderIsNotNull() { + addCriterion("enable_order is not null"); + return (Criteria) this; + } + + public Criteria andEnableOrderEqualTo(Byte value) { + addCriterion("enable_order =", value, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderNotEqualTo(Byte value) { + addCriterion("enable_order <>", value, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderGreaterThan(Byte value) { + addCriterion("enable_order >", value, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderGreaterThanOrEqualTo(Byte value) { + addCriterion("enable_order >=", value, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderLessThan(Byte value) { + addCriterion("enable_order <", value, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderLessThanOrEqualTo(Byte value) { + addCriterion("enable_order <=", value, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderIn(List values) { + addCriterion("enable_order in", values, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderNotIn(List values) { + addCriterion("enable_order not in", values, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderBetween(Byte value1, Byte value2) { + addCriterion("enable_order between", value1, value2, "enableOrder"); + return (Criteria) this; + } + + public Criteria andEnableOrderNotBetween(Byte value1, Byte value2) { + addCriterion("enable_order not between", value1, value2, "enableOrder"); + return (Criteria) this; + } + + public Criteria andOrderKeyIsNull() { + addCriterion("order_key is null"); + return (Criteria) this; + } + + public Criteria andOrderKeyIsNotNull() { + addCriterion("order_key is not null"); + return (Criteria) this; + } + + public Criteria andOrderKeyEqualTo(String value) { + addCriterion("order_key =", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyNotEqualTo(String value) { + addCriterion("order_key <>", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyGreaterThan(String value) { + addCriterion("order_key >", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyGreaterThanOrEqualTo(String value) { + addCriterion("order_key >=", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyLessThan(String value) { + addCriterion("order_key <", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyLessThanOrEqualTo(String value) { + addCriterion("order_key <=", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyLike(String value) { + addCriterion("order_key like", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyNotLike(String value) { + addCriterion("order_key not like", value, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyIn(List values) { + addCriterion("order_key in", values, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyNotIn(List values) { + addCriterion("order_key not in", values, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyBetween(String value1, String value2) { + addCriterion("order_key between", value1, value2, "orderKey"); + return (Criteria) this; + } + + public Criteria andOrderKeyNotBetween(String value1, String value2) { + addCriterion("order_key not between", value1, value2, "orderKey"); + return (Criteria) this; + } + + public Criteria andConsumeTypeIsNull() { + addCriterion("consume_type is null"); + return (Criteria) this; + } + + public Criteria andConsumeTypeIsNotNull() { + addCriterion("consume_type is not null"); + return (Criteria) this; + } + + public Criteria andConsumeTypeEqualTo(Byte value) { + addCriterion("consume_type =", value, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeNotEqualTo(Byte value) { + addCriterion("consume_type <>", value, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeGreaterThan(Byte value) { + addCriterion("consume_type >", value, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("consume_type >=", value, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeLessThan(Byte value) { + addCriterion("consume_type <", value, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeLessThanOrEqualTo(Byte value) { + addCriterion("consume_type <=", value, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeIn(List values) { + addCriterion("consume_type in", values, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeNotIn(List values) { + addCriterion("consume_type not in", values, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeBetween(Byte value1, Byte value2) { + addCriterion("consume_type between", value1, value2, "consumeType"); + return (Criteria) this; + } + + public Criteria andConsumeTypeNotBetween(Byte value1, Byte value2) { + addCriterion("consume_type not between", value1, value2, "consumeType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeIsNull() { + addCriterion("big_data_type is null"); + return (Criteria) this; + } + + public Criteria andBigDataTypeIsNotNull() { + addCriterion("big_data_type is not null"); + return (Criteria) this; + } + + public Criteria andBigDataTypeEqualTo(Byte value) { + addCriterion("big_data_type =", value, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeNotEqualTo(Byte value) { + addCriterion("big_data_type <>", value, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeGreaterThan(Byte value) { + addCriterion("big_data_type >", value, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("big_data_type >=", value, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeLessThan(Byte value) { + addCriterion("big_data_type <", value, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeLessThanOrEqualTo(Byte value) { + addCriterion("big_data_type <=", value, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeIn(List values) { + addCriterion("big_data_type in", values, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeNotIn(List values) { + addCriterion("big_data_type not in", values, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeBetween(Byte value1, Byte value2) { + addCriterion("big_data_type between", value1, value2, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataTypeNotBetween(Byte value1, Byte value2) { + addCriterion("big_data_type not between", value1, value2, "bigDataType"); + return (Criteria) this; + } + + public Criteria andBigDataConfigIsNull() { + addCriterion("big_data_config is null"); + return (Criteria) this; + } + + public Criteria andBigDataConfigIsNotNull() { + addCriterion("big_data_config is not null"); + return (Criteria) this; + } + + public Criteria andBigDataConfigEqualTo(String value) { + addCriterion("big_data_config =", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigNotEqualTo(String value) { + addCriterion("big_data_config <>", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigGreaterThan(String value) { + addCriterion("big_data_config >", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigGreaterThanOrEqualTo(String value) { + addCriterion("big_data_config >=", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigLessThan(String value) { + addCriterion("big_data_config <", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigLessThanOrEqualTo(String value) { + addCriterion("big_data_config <=", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigLike(String value) { + addCriterion("big_data_config like", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigNotLike(String value) { + addCriterion("big_data_config not like", value, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigIn(List values) { + addCriterion("big_data_config in", values, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigNotIn(List values) { + addCriterion("big_data_config not in", values, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigBetween(String value1, String value2) { + addCriterion("big_data_config between", value1, value2, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andBigDataConfigNotBetween(String value1, String value2) { + addCriterion("big_data_config not between", value1, value2, "bigDataConfig"); + return (Criteria) this; + } + + public Criteria andUrlsIsNull() { + addCriterion("urls is null"); + return (Criteria) this; + } + + public Criteria andUrlsIsNotNull() { + addCriterion("urls is not null"); + return (Criteria) this; + } + + public Criteria andUrlsEqualTo(String value) { + addCriterion("urls =", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsNotEqualTo(String value) { + addCriterion("urls <>", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsGreaterThan(String value) { + addCriterion("urls >", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsGreaterThanOrEqualTo(String value) { + addCriterion("urls >=", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsLessThan(String value) { + addCriterion("urls <", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsLessThanOrEqualTo(String value) { + addCriterion("urls <=", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsLike(String value) { + addCriterion("urls like", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsNotLike(String value) { + addCriterion("urls not like", value, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsIn(List values) { + addCriterion("urls in", values, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsNotIn(List values) { + addCriterion("urls not in", values, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsBetween(String value1, String value2) { + addCriterion("urls between", value1, value2, "urls"); + return (Criteria) this; + } + + public Criteria andUrlsNotBetween(String value1, String value2) { + addCriterion("urls not between", value1, value2, "urls"); + return (Criteria) this; + } + + public Criteria andHttpMethodIsNull() { + addCriterion("http_method is null"); + return (Criteria) this; + } + + public Criteria andHttpMethodIsNotNull() { + addCriterion("http_method is not null"); + return (Criteria) this; + } + + public Criteria andHttpMethodEqualTo(Byte value) { + addCriterion("http_method =", value, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodNotEqualTo(Byte value) { + addCriterion("http_method <>", value, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodGreaterThan(Byte value) { + addCriterion("http_method >", value, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodGreaterThanOrEqualTo(Byte value) { + addCriterion("http_method >=", value, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodLessThan(Byte value) { + addCriterion("http_method <", value, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodLessThanOrEqualTo(Byte value) { + addCriterion("http_method <=", value, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodIn(List values) { + addCriterion("http_method in", values, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodNotIn(List values) { + addCriterion("http_method not in", values, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodBetween(Byte value1, Byte value2) { + addCriterion("http_method between", value1, value2, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpMethodNotBetween(Byte value1, Byte value2) { + addCriterion("http_method not between", value1, value2, "httpMethod"); + return (Criteria) this; + } + + public Criteria andHttpHeadersIsNull() { + addCriterion("http_headers is null"); + return (Criteria) this; + } + + public Criteria andHttpHeadersIsNotNull() { + addCriterion("http_headers is not null"); + return (Criteria) this; + } + + public Criteria andHttpHeadersEqualTo(String value) { + addCriterion("http_headers =", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersNotEqualTo(String value) { + addCriterion("http_headers <>", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersGreaterThan(String value) { + addCriterion("http_headers >", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersGreaterThanOrEqualTo(String value) { + addCriterion("http_headers >=", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersLessThan(String value) { + addCriterion("http_headers <", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersLessThanOrEqualTo(String value) { + addCriterion("http_headers <=", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersLike(String value) { + addCriterion("http_headers like", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersNotLike(String value) { + addCriterion("http_headers not like", value, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersIn(List values) { + addCriterion("http_headers in", values, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersNotIn(List values) { + addCriterion("http_headers not in", values, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersBetween(String value1, String value2) { + addCriterion("http_headers between", value1, value2, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpHeadersNotBetween(String value1, String value2) { + addCriterion("http_headers not between", value1, value2, "httpHeaders"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsIsNull() { + addCriterion("http_query_params is null"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsIsNotNull() { + addCriterion("http_query_params is not null"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsEqualTo(String value) { + addCriterion("http_query_params =", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsNotEqualTo(String value) { + addCriterion("http_query_params <>", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsGreaterThan(String value) { + addCriterion("http_query_params >", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsGreaterThanOrEqualTo(String value) { + addCriterion("http_query_params >=", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsLessThan(String value) { + addCriterion("http_query_params <", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsLessThanOrEqualTo(String value) { + addCriterion("http_query_params <=", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsLike(String value) { + addCriterion("http_query_params like", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsNotLike(String value) { + addCriterion("http_query_params not like", value, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsIn(List values) { + addCriterion("http_query_params in", values, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsNotIn(List values) { + addCriterion("http_query_params not in", values, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsBetween(String value1, String value2) { + addCriterion("http_query_params between", value1, value2, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andHttpQueryParamsNotBetween(String value1, String value2) { + addCriterion("http_query_params not between", value1, value2, "httpQueryParams"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeIsNull() { + addCriterion("msg_push_type is null"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeIsNotNull() { + addCriterion("msg_push_type is not null"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeEqualTo(Byte value) { + addCriterion("msg_push_type =", value, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeNotEqualTo(Byte value) { + addCriterion("msg_push_type <>", value, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeGreaterThan(Byte value) { + addCriterion("msg_push_type >", value, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("msg_push_type >=", value, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeLessThan(Byte value) { + addCriterion("msg_push_type <", value, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeLessThanOrEqualTo(Byte value) { + addCriterion("msg_push_type <=", value, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeIn(List values) { + addCriterion("msg_push_type in", values, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeNotIn(List values) { + addCriterion("msg_push_type not in", values, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeBetween(Byte value1, Byte value2) { + addCriterion("msg_push_type between", value1, value2, "msgPushType"); + return (Criteria) this; + } + + public Criteria andMsgPushTypeNotBetween(Byte value1, Byte value2) { + addCriterion("msg_push_type not between", value1, value2, "msgPushType"); + return (Criteria) this; + } + + public Criteria andHttpTokenIsNull() { + addCriterion("http_token is null"); + return (Criteria) this; + } + + public Criteria andHttpTokenIsNotNull() { + addCriterion("http_token is not null"); + return (Criteria) this; + } + + public Criteria andHttpTokenEqualTo(String value) { + addCriterion("http_token =", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenNotEqualTo(String value) { + addCriterion("http_token <>", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenGreaterThan(String value) { + addCriterion("http_token >", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenGreaterThanOrEqualTo(String value) { + addCriterion("http_token >=", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenLessThan(String value) { + addCriterion("http_token <", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenLessThanOrEqualTo(String value) { + addCriterion("http_token <=", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenLike(String value) { + addCriterion("http_token like", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenNotLike(String value) { + addCriterion("http_token not like", value, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenIn(List values) { + addCriterion("http_token in", values, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenNotIn(List values) { + addCriterion("http_token not in", values, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenBetween(String value1, String value2) { + addCriterion("http_token between", value1, value2, "httpToken"); + return (Criteria) this; + } + + public Criteria andHttpTokenNotBetween(String value1, String value2) { + addCriterion("http_token not between", value1, value2, "httpToken"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyIsNull() { + addCriterion("push_max_concurrency is null"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyIsNotNull() { + addCriterion("push_max_concurrency is not null"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyEqualTo(Integer value) { + addCriterion("push_max_concurrency =", value, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyNotEqualTo(Integer value) { + addCriterion("push_max_concurrency <>", value, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyGreaterThan(Integer value) { + addCriterion("push_max_concurrency >", value, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyGreaterThanOrEqualTo(Integer value) { + addCriterion("push_max_concurrency >=", value, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyLessThan(Integer value) { + addCriterion("push_max_concurrency <", value, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyLessThanOrEqualTo(Integer value) { + addCriterion("push_max_concurrency <=", value, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyIn(List values) { + addCriterion("push_max_concurrency in", values, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyNotIn(List values) { + addCriterion("push_max_concurrency not in", values, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyBetween(Integer value1, Integer value2) { + addCriterion("push_max_concurrency between", value1, value2, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andPushMaxConcurrencyNotBetween(Integer value1, Integer value2) { + addCriterion("push_max_concurrency not between", value1, value2, "pushMaxConcurrency"); + return (Criteria) this; + } + + public Criteria andActionsIsNull() { + addCriterion("actions is null"); + return (Criteria) this; + } + + public Criteria andActionsIsNotNull() { + addCriterion("actions is not null"); + return (Criteria) this; + } + + public Criteria andActionsEqualTo(String value) { + addCriterion("actions =", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsNotEqualTo(String value) { + addCriterion("actions <>", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsGreaterThan(String value) { + addCriterion("actions >", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsGreaterThanOrEqualTo(String value) { + addCriterion("actions >=", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsLessThan(String value) { + addCriterion("actions <", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsLessThanOrEqualTo(String value) { + addCriterion("actions <=", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsLike(String value) { + addCriterion("actions like", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsNotLike(String value) { + addCriterion("actions not like", value, "actions"); + return (Criteria) this; + } + + public Criteria andActionsIn(List values) { + addCriterion("actions in", values, "actions"); + return (Criteria) this; + } + + public Criteria andActionsNotIn(List values) { + addCriterion("actions not in", values, "actions"); + return (Criteria) this; + } + + public Criteria andActionsBetween(String value1, String value2) { + addCriterion("actions between", value1, value2, "actions"); + return (Criteria) this; + } + + public Criteria andActionsNotBetween(String value1, String value2) { + addCriterion("actions not between", value1, value2, "actions"); + return (Criteria) this; + } + + public Criteria andConfigIsNull() { + addCriterion("config is null"); + return (Criteria) this; + } + + public Criteria andConfigIsNotNull() { + addCriterion("config is not null"); + return (Criteria) this; + } + + public Criteria andConfigEqualTo(String value) { + addCriterion("config =", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotEqualTo(String value) { + addCriterion("config <>", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThan(String value) { + addCriterion("config >", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThanOrEqualTo(String value) { + addCriterion("config >=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThan(String value) { + addCriterion("config <", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThanOrEqualTo(String value) { + addCriterion("config <=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLike(String value) { + addCriterion("config like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotLike(String value) { + addCriterion("config not like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigIn(List values) { + addCriterion("config in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotIn(List values) { + addCriterion("config not in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigBetween(String value1, String value2) { + addCriterion("config between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotBetween(String value1, String value2) { + addCriterion("config not between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andStateIsNull() { + addCriterion("state is null"); + return (Criteria) this; + } + + public Criteria andStateIsNotNull() { + addCriterion("state is not null"); + return (Criteria) this; + } + + public Criteria andStateEqualTo(Byte value) { + addCriterion("state =", value, "state"); + return (Criteria) this; + } + + public Criteria andStateNotEqualTo(Byte value) { + addCriterion("state <>", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThan(Byte value) { + addCriterion("state >", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThanOrEqualTo(Byte value) { + addCriterion("state >=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThan(Byte value) { + addCriterion("state <", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThanOrEqualTo(Byte value) { + addCriterion("state <=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateIn(List values) { + addCriterion("state in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateNotIn(List values) { + addCriterion("state not in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateBetween(Byte value1, Byte value2) { + addCriterion("state between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andStateNotBetween(Byte value1, Byte value2) { + addCriterion("state not between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andExtraParamsIsNull() { + addCriterion("extra_params is null"); + return (Criteria) this; + } + + public Criteria andExtraParamsIsNotNull() { + addCriterion("extra_params is not null"); + return (Criteria) this; + } + + public Criteria andExtraParamsEqualTo(String value) { + addCriterion("extra_params =", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotEqualTo(String value) { + addCriterion("extra_params <>", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsGreaterThan(String value) { + addCriterion("extra_params >", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsGreaterThanOrEqualTo(String value) { + addCriterion("extra_params >=", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLessThan(String value) { + addCriterion("extra_params <", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLessThanOrEqualTo(String value) { + addCriterion("extra_params <=", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLike(String value) { + addCriterion("extra_params like", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotLike(String value) { + addCriterion("extra_params not like", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsIn(List values) { + addCriterion("extra_params in", values, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotIn(List values) { + addCriterion("extra_params not in", values, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsBetween(String value1, String value2) { + addCriterion("extra_params between", value1, value2, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotBetween(String value1, String value2) { + addCriterion("extra_params not between", value1, value2, "extraParams"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Idc.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Idc.java new file mode 100644 index 0000000..c270fdb --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Idc.java @@ -0,0 +1,148 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; + + +public class Idc implements Serializable { + /** + * 自增id + * default = null + * length = 20 + */ + private Long id; + + /** + * 集群名称 + * default = + * length = 256 + */ + private String name; + + /** + * 备注 + * default = + * length = 1024 + */ + private String remark; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + Idc other = (Idc) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", name=" + name + + ", remark=" + remark + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/IdcCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/IdcCriteria.java new file mode 100644 index 0000000..49b0c66 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/IdcCriteria.java @@ -0,0 +1,601 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class IdcCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public IdcCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("name is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("name is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("name =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("name <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("name >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("name >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("name <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("name <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("name like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("name not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("name in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("name not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("name between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("name not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServer.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServer.java new file mode 100644 index 0000000..7926b67 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServer.java @@ -0,0 +1,166 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; + + +public class MqServer implements Serializable { + /** + * 自增id + * default = null + * length = 20 + */ + private Long id; + + /** + * mq 集群名称 + * default = + * length = 256 + */ + private String name; + + /** + * mq 集群地址 + * default = + * length = 512 + */ + private String addr; + + /** + * mq 集群类型 0:rmq 1:kafka 2:virtual kafka + * default = 0 + * length = 3 + */ + private Byte type; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr == null ? null : addr.trim(); + } + + public Byte getType() { + return type; + } + + public void setType(Byte type) { + this.type = type; + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + MqServer other = (MqServer) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getAddr() == null ? other.getAddr() == null : this.getAddr().equals(other.getAddr())) + && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getAddr() == null) ? 0 : getAddr().hashCode()); + result = prime * result + ((getType() == null) ? 0 : getType().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", name=" + name + + ", addr=" + addr + + ", type=" + type + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServerCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServerCriteria.java new file mode 100644 index 0000000..7681e08 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/MqServerCriteria.java @@ -0,0 +1,661 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class MqServerCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public MqServerCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("name is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("name is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("name =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("name <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("name >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("name >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("name <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("name <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("name like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("name not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("name in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("name not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("name between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("name not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andAddrIsNull() { + addCriterion("addr is null"); + return (Criteria) this; + } + + public Criteria andAddrIsNotNull() { + addCriterion("addr is not null"); + return (Criteria) this; + } + + public Criteria andAddrEqualTo(String value) { + addCriterion("addr =", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrNotEqualTo(String value) { + addCriterion("addr <>", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrGreaterThan(String value) { + addCriterion("addr >", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrGreaterThanOrEqualTo(String value) { + addCriterion("addr >=", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrLessThan(String value) { + addCriterion("addr <", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrLessThanOrEqualTo(String value) { + addCriterion("addr <=", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrLike(String value) { + addCriterion("addr like", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrNotLike(String value) { + addCriterion("addr not like", value, "addr"); + return (Criteria) this; + } + + public Criteria andAddrIn(List values) { + addCriterion("addr in", values, "addr"); + return (Criteria) this; + } + + public Criteria andAddrNotIn(List values) { + addCriterion("addr not in", values, "addr"); + return (Criteria) this; + } + + public Criteria andAddrBetween(String value1, String value2) { + addCriterion("addr between", value1, value2, "addr"); + return (Criteria) this; + } + + public Criteria andAddrNotBetween(String value1, String value2) { + addCriterion("addr not between", value1, value2, "addr"); + return (Criteria) this; + } + + public Criteria andTypeIsNull() { + addCriterion("type is null"); + return (Criteria) this; + } + + public Criteria andTypeIsNotNull() { + addCriterion("type is not null"); + return (Criteria) this; + } + + public Criteria andTypeEqualTo(Byte value) { + addCriterion("type =", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotEqualTo(Byte value) { + addCriterion("type <>", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThan(Byte value) { + addCriterion("type >", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("type >=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThan(Byte value) { + addCriterion("type <", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThanOrEqualTo(Byte value) { + addCriterion("type <=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeIn(List values) { + addCriterion("type in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotIn(List values) { + addCriterion("type not in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeBetween(Byte value1, Byte value2) { + addCriterion("type between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotBetween(Byte value1, Byte value2) { + addCriterion("type not between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Node.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Node.java new file mode 100644 index 0000000..cbb0f4c --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Node.java @@ -0,0 +1,202 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; + + +public class Node implements Serializable { + /** + * 自增id + * default = null + * length = 20 + */ + private Long id; + + /** + * 集群id + * default = 0 + * length = 19 + */ + private Long clusterId; + + /** + * 机型id + * default = 0 + * length = 19 + */ + private Long modelId; + + /** + * broker主节点 + * default = 0 + * length = 19 + */ + private Long masterId; + + /** + * 机器地址 ip:port + * default = + * length = 128 + */ + private String host; + + /** + * node类型, kafkabroker, rmqbroker xxxx + * default = 0 + * length = 3 + */ + private Byte nodeType; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public Long getModelId() { + return modelId; + } + + public void setModelId(Long modelId) { + this.modelId = modelId; + } + + public Long getMasterId() { + return masterId; + } + + public void setMasterId(Long masterId) { + this.masterId = masterId; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host == null ? null : host.trim(); + } + + public Byte getNodeType() { + return nodeType; + } + + public void setNodeType(Byte nodeType) { + this.nodeType = nodeType; + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + Node other = (Node) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getClusterId() == null ? other.getClusterId() == null : this.getClusterId().equals(other.getClusterId())) + && (this.getModelId() == null ? other.getModelId() == null : this.getModelId().equals(other.getModelId())) + && (this.getMasterId() == null ? other.getMasterId() == null : this.getMasterId().equals(other.getMasterId())) + && (this.getHost() == null ? other.getHost() == null : this.getHost().equals(other.getHost())) + && (this.getNodeType() == null ? other.getNodeType() == null : this.getNodeType().equals(other.getNodeType())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getClusterId() == null) ? 0 : getClusterId().hashCode()); + result = prime * result + ((getModelId() == null) ? 0 : getModelId().hashCode()); + result = prime * result + ((getMasterId() == null) ? 0 : getMasterId().hashCode()); + result = prime * result + ((getHost() == null) ? 0 : getHost().hashCode()); + result = prime * result + ((getNodeType() == null) ? 0 : getNodeType().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", clusterId=" + clusterId + + ", modelId=" + modelId + + ", masterId=" + masterId + + ", host=" + host + + ", nodeType=" + nodeType + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/NodeCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/NodeCriteria.java new file mode 100644 index 0000000..288e45b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/NodeCriteria.java @@ -0,0 +1,771 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class NodeCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public NodeCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNull() { + addCriterion("cluster_id is null"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNotNull() { + addCriterion("cluster_id is not null"); + return (Criteria) this; + } + + public Criteria andClusterIdEqualTo(Long value) { + addCriterion("cluster_id =", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotEqualTo(Long value) { + addCriterion("cluster_id <>", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThan(Long value) { + addCriterion("cluster_id >", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThanOrEqualTo(Long value) { + addCriterion("cluster_id >=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThan(Long value) { + addCriterion("cluster_id <", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThanOrEqualTo(Long value) { + addCriterion("cluster_id <=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdIn(List values) { + addCriterion("cluster_id in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotIn(List values) { + addCriterion("cluster_id not in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdBetween(Long value1, Long value2) { + addCriterion("cluster_id between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotBetween(Long value1, Long value2) { + addCriterion("cluster_id not between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); + return (Criteria) this; + } + + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); + return (Criteria) this; + } + + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); + return (Criteria) this; + } + + public Criteria andMasterIdIsNull() { + addCriterion("master_id is null"); + return (Criteria) this; + } + + public Criteria andMasterIdIsNotNull() { + addCriterion("master_id is not null"); + return (Criteria) this; + } + + public Criteria andMasterIdEqualTo(Long value) { + addCriterion("master_id =", value, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdNotEqualTo(Long value) { + addCriterion("master_id <>", value, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdGreaterThan(Long value) { + addCriterion("master_id >", value, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdGreaterThanOrEqualTo(Long value) { + addCriterion("master_id >=", value, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdLessThan(Long value) { + addCriterion("master_id <", value, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdLessThanOrEqualTo(Long value) { + addCriterion("master_id <=", value, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdIn(List values) { + addCriterion("master_id in", values, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdNotIn(List values) { + addCriterion("master_id not in", values, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdBetween(Long value1, Long value2) { + addCriterion("master_id between", value1, value2, "masterId"); + return (Criteria) this; + } + + public Criteria andMasterIdNotBetween(Long value1, Long value2) { + addCriterion("master_id not between", value1, value2, "masterId"); + return (Criteria) this; + } + + public Criteria andHostIsNull() { + addCriterion("host is null"); + return (Criteria) this; + } + + public Criteria andHostIsNotNull() { + addCriterion("host is not null"); + return (Criteria) this; + } + + public Criteria andHostEqualTo(String value) { + addCriterion("host =", value, "host"); + return (Criteria) this; + } + + public Criteria andHostNotEqualTo(String value) { + addCriterion("host <>", value, "host"); + return (Criteria) this; + } + + public Criteria andHostGreaterThan(String value) { + addCriterion("host >", value, "host"); + return (Criteria) this; + } + + public Criteria andHostGreaterThanOrEqualTo(String value) { + addCriterion("host >=", value, "host"); + return (Criteria) this; + } + + public Criteria andHostLessThan(String value) { + addCriterion("host <", value, "host"); + return (Criteria) this; + } + + public Criteria andHostLessThanOrEqualTo(String value) { + addCriterion("host <=", value, "host"); + return (Criteria) this; + } + + public Criteria andHostLike(String value) { + addCriterion("host like", value, "host"); + return (Criteria) this; + } + + public Criteria andHostNotLike(String value) { + addCriterion("host not like", value, "host"); + return (Criteria) this; + } + + public Criteria andHostIn(List values) { + addCriterion("host in", values, "host"); + return (Criteria) this; + } + + public Criteria andHostNotIn(List values) { + addCriterion("host not in", values, "host"); + return (Criteria) this; + } + + public Criteria andHostBetween(String value1, String value2) { + addCriterion("host between", value1, value2, "host"); + return (Criteria) this; + } + + public Criteria andHostNotBetween(String value1, String value2) { + addCriterion("host not between", value1, value2, "host"); + return (Criteria) this; + } + + public Criteria andNodeTypeIsNull() { + addCriterion("node_type is null"); + return (Criteria) this; + } + + public Criteria andNodeTypeIsNotNull() { + addCriterion("node_type is not null"); + return (Criteria) this; + } + + public Criteria andNodeTypeEqualTo(Byte value) { + addCriterion("node_type =", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotEqualTo(Byte value) { + addCriterion("node_type <>", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeGreaterThan(Byte value) { + addCriterion("node_type >", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("node_type >=", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeLessThan(Byte value) { + addCriterion("node_type <", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeLessThanOrEqualTo(Byte value) { + addCriterion("node_type <=", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeIn(List values) { + addCriterion("node_type in", values, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotIn(List values) { + addCriterion("node_type not in", values, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeBetween(Byte value1, Byte value2) { + addCriterion("node_type between", value1, value2, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotBetween(Byte value1, Byte value2) { + addCriterion("node_type not between", value1, value2, "nodeType"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Topic.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Topic.java new file mode 100644 index 0000000..95c4a25 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/Topic.java @@ -0,0 +1,441 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.TypeReference; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.dao.model.custom.TopicConfig; +import org.apache.commons.lang3.StringUtils; + + +public class Topic implements Serializable { + /** + * 主键id + * default = null + * length = 20 + */ + private Long id; + + /** + * topic名称 + * default = + * length = 256 + */ + private String topicName; + + /** + * 成本分摊方 + * default = + * length = 256 + */ + private String service; + + /** + * 部门 一级部门 - 二级部门 + * default = + * length = 256 + */ + private String department; + + /** + * 联系人,;分割 + * default = + * length = 1024 + */ + private String contacters; + + /** + * 报警组信息, ;分割 + * default = + * length = 256 + */ + private List alarmGroup; + + /** + * 是否启用报警,0 启用 1禁用,默认启用 + * default = 0 + * length = 3 + */ + private Byte alarmIsEnable; + + /** + * 是否是延时Topic,0 延时 1非延时,默认1 + * default = 1 + * length = 3 + */ + private Byte delayTopic; + + /** + * 是否需要审核订阅信息 0需要审核订阅信息 1不需要审核订阅信息,默认1 + * default = 1 + * length = 3 + */ + private Byte needAuditSubinfo; + + /** + * 是否启用schema校验 0启用 1禁用,默认1 + * default = 1 + * length = 3 + */ + private Byte enableSchemaVerify; + + /** + * 0 同机房生产 1 自定义,默认0 + * default = 0 + * length = 3 + */ + private Byte produceMode; + + /** + * 生产模式自定义,map结构,key为client idc,value为pproxy idc列表 + * default = + * length = 2048 + */ + private Map/*pproxy idc*/> produceModeMapper; + + /** + * topic状态,0启用,1禁用 + * default = 0 + * length = 3 + */ + private Byte state; + + /** + * 运维端配置参数 + * default = + * length = 2048 + */ + private TopicConfig config; + + /** + * topic描述信息 + * default = + * length = 1024 + */ + private String description; + + /** + * 额外参数 + * default = + * length = 2048 + */ + private Map extraParams; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + /** + * topicschema + * default = null + * length = 65535 + */ + private String topicSchema; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName == null ? null : topicName.trim(); + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service == null ? null : service.trim(); + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department == null ? null : department.trim(); + } + + public String getContacters() { + return contacters; + } + + public void setContacters(String contacters) { + this.contacters = contacters == null ? null : contacters.trim(); + } + + public String getAlarmGroup() { + return this.alarmGroup == null ? null : FastJsonUtils.toJsonString(alarmGroup); + } + + public void setAlarmGroup(String alarmGroup) { + this.alarmGroup = StringUtils.isBlank(alarmGroup) ? null : FastJsonUtils.toObject(alarmGroup, List.class); + } + + public List getTopicAlarmGroup() { + return alarmGroup; + } + + public void setTopicAlarmGroup(List alarmGroup) { + this.alarmGroup = alarmGroup; + } + + public Byte getAlarmIsEnable() { + return alarmIsEnable; + } + + public void setAlarmIsEnable(Byte alarmIsEnable) { + this.alarmIsEnable = alarmIsEnable; + } + + public Byte getDelayTopic() { + return delayTopic; + } + + public void setDelayTopic(Byte delayTopic) { + this.delayTopic = delayTopic; + } + + public Byte getNeedAuditSubinfo() { + return needAuditSubinfo; + } + + public void setNeedAuditSubinfo(Byte needAuditSubinfo) { + this.needAuditSubinfo = needAuditSubinfo; + } + + public Byte getEnableSchemaVerify() { + return enableSchemaVerify; + } + + public void setEnableSchemaVerify(Byte enableSchemaVerify) { + this.enableSchemaVerify = enableSchemaVerify; + } + + public Byte getProduceMode() { + return produceMode; + } + + public void setProduceMode(Byte produceMode) { + this.produceMode = produceMode; + } + + public String getProduceModeMapper() { + return this.produceModeMapper == null ? null : FastJsonUtils.toJsonString(produceModeMapper); + } + + public void setProduceModeMapper(String produceModeMapper) { + this.produceModeMapper = StringUtils.isBlank(produceModeMapper) ? null : FastJsonUtils.toObject(produceModeMapper, new TypeReference/*pproxy idc*/>>() { + }); + } + + public Map/*pproxy idc*/> getTopicProduceModeMapper() { + return produceModeMapper; + } + + public void setTopicProduceModeMapper(Map/*pproxy idc*/> produceModeMapper) { + this.produceModeMapper = produceModeMapper; + } + + + public Byte getState() { + return state; + } + + public void setState(Byte state) { + this.state = state; + } + + public TopicConfig getTopicConfig() { + return config; + } + + public void setTopicConfig(TopicConfig config) { + this.config = config; + } + + public String getConfig() { + return this.config == null ? null : FastJsonUtils.toJsonString(config); + } + + public void setConfig(String config) { + this.config = StringUtils.isBlank(config) ? null : FastJsonUtils.toObject(config, TopicConfig.class); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : description.trim(); + } + + public String getExtraParams() { + return this.extraParams == null ? null : FastJsonUtils.toJsonString(extraParams); + } + + public void setExtraParams(String extraParams) { + this.extraParams = StringUtils.isBlank(extraParams) ? null : FastJsonUtils.toObject(extraParams, Map.class); + } + + public Map getTopicExtraParams() { + return extraParams; + } + + public void setTopicExtraParams(Map extraParams) { + this.extraParams = extraParams; + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getTopicSchema() { + return topicSchema; + } + + public void setTopicSchema(String topicSchema) { + this.topicSchema = topicSchema == null ? null : topicSchema.trim(); + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + Topic other = (Topic) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getTopicName() == null ? other.getTopicName() == null : this.getTopicName().equals(other.getTopicName())) + && (this.getService() == null ? other.getService() == null : this.getService().equals(other.getService())) + && (this.getDepartment() == null ? other.getDepartment() == null : this.getDepartment().equals(other.getDepartment())) + && (this.getContacters() == null ? other.getContacters() == null : this.getContacters().equals(other.getContacters())) + && (this.getAlarmGroup() == null ? other.getAlarmGroup() == null : this.getAlarmGroup().equals(other.getAlarmGroup())) + && (this.getAlarmIsEnable() == null ? other.getAlarmIsEnable() == null : this.getAlarmIsEnable().equals(other.getAlarmIsEnable())) + && (this.getDelayTopic() == null ? other.getDelayTopic() == null : this.getDelayTopic().equals(other.getDelayTopic())) + && (this.getNeedAuditSubinfo() == null ? other.getNeedAuditSubinfo() == null : this.getNeedAuditSubinfo().equals(other.getNeedAuditSubinfo())) + && (this.getEnableSchemaVerify() == null ? other.getEnableSchemaVerify() == null : this.getEnableSchemaVerify().equals(other.getEnableSchemaVerify())) + && (this.getProduceMode() == null ? other.getProduceMode() == null : this.getProduceMode().equals(other.getProduceMode())) + && (this.getProduceModeMapper() == null ? other.getProduceModeMapper() == null : this.getProduceModeMapper().equals(other.getProduceModeMapper())) + && (this.getState() == null ? other.getState() == null : this.getState().equals(other.getState())) + && (this.getConfig() == null ? other.getConfig() == null : this.getConfig().equals(other.getConfig())) + && (this.getDescription() == null ? other.getDescription() == null : this.getDescription().equals(other.getDescription())) + && (this.getExtraParams() == null ? other.getExtraParams() == null : this.getExtraParams().equals(other.getExtraParams())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())) + && (this.getTopicSchema() == null ? other.getTopicSchema() == null : this.getTopicSchema().equals(other.getTopicSchema())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getTopicName() == null) ? 0 : getTopicName().hashCode()); + result = prime * result + ((getService() == null) ? 0 : getService().hashCode()); + result = prime * result + ((getDepartment() == null) ? 0 : getDepartment().hashCode()); + result = prime * result + ((getContacters() == null) ? 0 : getContacters().hashCode()); + result = prime * result + ((getAlarmGroup() == null) ? 0 : getAlarmGroup().hashCode()); + result = prime * result + ((getAlarmIsEnable() == null) ? 0 : getAlarmIsEnable().hashCode()); + result = prime * result + ((getDelayTopic() == null) ? 0 : getDelayTopic().hashCode()); + result = prime * result + ((getNeedAuditSubinfo() == null) ? 0 : getNeedAuditSubinfo().hashCode()); + result = prime * result + ((getEnableSchemaVerify() == null) ? 0 : getEnableSchemaVerify().hashCode()); + result = prime * result + ((getProduceMode() == null) ? 0 : getProduceMode().hashCode()); + result = prime * result + ((getProduceModeMapper() == null) ? 0 : getProduceModeMapper().hashCode()); + result = prime * result + ((getState() == null) ? 0 : getState().hashCode()); + result = prime * result + ((getConfig() == null) ? 0 : getConfig().hashCode()); + result = prime * result + ((getDescription() == null) ? 0 : getDescription().hashCode()); + result = prime * result + ((getExtraParams() == null) ? 0 : getExtraParams().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + result = prime * result + ((getTopicSchema() == null) ? 0 : getTopicSchema().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", topicName=" + topicName + + ", service=" + service + + ", department=" + department + + ", contacters=" + contacters + + ", alarmGroup=" + alarmGroup + + ", alarmIsEnable=" + alarmIsEnable + + ", delayTopic=" + delayTopic + + ", needAuditSubinfo=" + needAuditSubinfo + + ", enableSchemaVerify=" + enableSchemaVerify + + ", produceMode=" + produceMode + + ", produceModeMapper=" + produceModeMapper + + ", state=" + state + + ", config=" + config + + ", description=" + description + + ", extraParams=" + extraParams + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", topicSchema=" + topicSchema + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConf.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConf.java new file mode 100644 index 0000000..fcbf689 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConf.java @@ -0,0 +1,387 @@ +package com.didi.carrera.console.dao.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +import com.alibaba.fastjson.TypeReference; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.dao.model.custom.TopicConfConfig; +import org.apache.commons.lang3.StringUtils; + + +public class TopicConf implements Serializable { + /** + * 主键id + * default = null + * length = 20 + */ + private Long id; + + /** + * topic 主键id + * default = 0 + * length = 19 + */ + private Long topicId; + + /** + * topic名称 + * default = + * length = 256 + */ + private String topicName; + + /** + * 集群id + * default = 0 + * length = 19 + */ + private Long clusterId; + + /** + * 集群名称 + * default = + * length = 256 + */ + private String clusterName; + + /** + * mqserver id + * default = 0 + * length = 19 + */ + private Long mqServerId; + + /** + * mqserver名称 + * default = + * length = 256 + */ + private String mqServerName; + + /** + * server对应的机房id + * default = 0 + * length = 19 + */ + private Long serverIdcId; + + /** + * server对应的机房名称 + * default = + * length = 256 + */ + private String serverIdcName; + + /** + * clientidc对应的id和value + * default = + * length = 1024 + */ + private Map clientIdc; + + /** + * 预估生产tps,默认1024 + * default = 1024 + * length = 10 + */ + private Integer produceTps; + + /** + * 消息平均大小,单位字节 + * default = 0 + * length = 10 + */ + private Integer msgAvgSize; + + /** + * 消息最大大小,单位字节 + * default = 0 + * length = 10 + */ + private Integer msgMaxSize; + + /** + * topic状态,0启用,1禁用 + * default = 0 + * length = 3 + */ + private Byte state; + + /** + * 运维端配置参数 + * default = + * length = 2048 + */ + private TopicConfConfig config; + + /** + * 是否删除 0:未删除 1:删除 + * default = 0 + * length = 3 + */ + private Byte isDelete; + + /** + * 创建时间 + * default = 1970-01-01 00:00:00 + * length = 19 + */ + private Date createTime; + + /** + * 修改时间 + * default = CURRENT_TIMESTAMP + * length = 19 + */ + private Date modifyTime; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName == null ? null : topicName.trim(); + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName == null ? null : clusterName.trim(); + } + + public Long getMqServerId() { + return mqServerId; + } + + public void setMqServerId(Long mqServerId) { + this.mqServerId = mqServerId; + } + + public String getMqServerName() { + return mqServerName; + } + + public void setMqServerName(String mqServerName) { + this.mqServerName = mqServerName == null ? null : mqServerName.trim(); + } + + public Long getServerIdcId() { + return serverIdcId; + } + + public void setServerIdcId(Long serverIdcId) { + this.serverIdcId = serverIdcId; + } + + public String getServerIdcName() { + return serverIdcName; + } + + public void setServerIdcName(String serverIdcName) { + this.serverIdcName = serverIdcName == null ? null : serverIdcName.trim(); + } + + public String getClientIdc() { + return this.clientIdc == null ? null : FastJsonUtils.toJsonString(clientIdc); + } + + public void setClientIdc(String clientIdc) { + this.clientIdc = StringUtils.isBlank(clientIdc) ? null : FastJsonUtils.toObject(clientIdc, new TypeReference>() { + }); + } + + public Map getTopicConfClientIdc() { + return clientIdc; + } + + public void setTopicConfClientIdc(Map clientIdcMapper) { + this.clientIdc = clientIdcMapper; + } + + public Integer getProduceTps() { + return produceTps; + } + + public void setProduceTps(Integer produceTps) { + this.produceTps = produceTps; + } + + public Integer getMsgAvgSize() { + return msgAvgSize; + } + + public void setMsgAvgSize(Integer msgAvgSize) { + this.msgAvgSize = msgAvgSize; + } + + public Integer getMsgMaxSize() { + return msgMaxSize; + } + + public void setMsgMaxSize(Integer msgMaxSize) { + this.msgMaxSize = msgMaxSize; + } + + public Byte getState() { + return state; + } + + public void setState(Byte state) { + this.state = state; + } + + public TopicConfConfig getTopicConfConfig() { + return config; + } + + public void setTopicConfig(TopicConfConfig config) { + this.config = config; + } + + public String getConfig() { + return this.config == null ? null : FastJsonUtils.toJsonString(config); + } + + public void setConfig(String config) { + this.config = StringUtils.isBlank(config) ? null : FastJsonUtils.toObject(config, TopicConfConfig.class); + } + + public Byte getIsDelete() { + return isDelete; + } + + public void setIsDelete(Byte isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + TopicConf other = (TopicConf) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getTopicId() == null ? other.getTopicId() == null : this.getTopicId().equals(other.getTopicId())) + && (this.getTopicName() == null ? other.getTopicName() == null : this.getTopicName().equals(other.getTopicName())) + && (this.getClusterId() == null ? other.getClusterId() == null : this.getClusterId().equals(other.getClusterId())) + && (this.getClusterName() == null ? other.getClusterName() == null : this.getClusterName().equals(other.getClusterName())) + && (this.getMqServerId() == null ? other.getMqServerId() == null : this.getMqServerId().equals(other.getMqServerId())) + && (this.getMqServerName() == null ? other.getMqServerName() == null : this.getMqServerName().equals(other.getMqServerName())) + && (this.getServerIdcId() == null ? other.getServerIdcId() == null : this.getServerIdcId().equals(other.getServerIdcId())) + && (this.getServerIdcName() == null ? other.getServerIdcName() == null : this.getServerIdcName().equals(other.getServerIdcName())) + && (this.getClientIdc() == null ? other.getClientIdc() == null : this.getClientIdc().equals(other.getClientIdc())) + && (this.getProduceTps() == null ? other.getProduceTps() == null : this.getProduceTps().equals(other.getProduceTps())) + && (this.getMsgAvgSize() == null ? other.getMsgAvgSize() == null : this.getMsgAvgSize().equals(other.getMsgAvgSize())) + && (this.getMsgMaxSize() == null ? other.getMsgMaxSize() == null : this.getMsgMaxSize().equals(other.getMsgMaxSize())) + && (this.getState() == null ? other.getState() == null : this.getState().equals(other.getState())) + && (this.getConfig() == null ? other.getConfig() == null : this.getConfig().equals(other.getConfig())) + && (this.getIsDelete() == null ? other.getIsDelete() == null : this.getIsDelete().equals(other.getIsDelete())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) + && (this.getModifyTime() == null ? other.getModifyTime() == null : this.getModifyTime().equals(other.getModifyTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getTopicId() == null) ? 0 : getTopicId().hashCode()); + result = prime * result + ((getTopicName() == null) ? 0 : getTopicName().hashCode()); + result = prime * result + ((getClusterId() == null) ? 0 : getClusterId().hashCode()); + result = prime * result + ((getClusterName() == null) ? 0 : getClusterName().hashCode()); + result = prime * result + ((getMqServerId() == null) ? 0 : getMqServerId().hashCode()); + result = prime * result + ((getMqServerName() == null) ? 0 : getMqServerName().hashCode()); + result = prime * result + ((getServerIdcId() == null) ? 0 : getServerIdcId().hashCode()); + result = prime * result + ((getServerIdcName() == null) ? 0 : getServerIdcName().hashCode()); + result = prime * result + ((getClientIdc() == null) ? 0 : getClientIdc().hashCode()); + result = prime * result + ((getProduceTps() == null) ? 0 : getProduceTps().hashCode()); + result = prime * result + ((getMsgAvgSize() == null) ? 0 : getMsgAvgSize().hashCode()); + result = prime * result + ((getMsgMaxSize() == null) ? 0 : getMsgMaxSize().hashCode()); + result = prime * result + ((getState() == null) ? 0 : getState().hashCode()); + result = prime * result + ((getConfig() == null) ? 0 : getConfig().hashCode()); + result = prime * result + ((getIsDelete() == null) ? 0 : getIsDelete().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getModifyTime() == null) ? 0 : getModifyTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", topicId=" + topicId + + ", topicName=" + topicName + + ", clusterId=" + clusterId + + ", clusterName=" + clusterName + + ", mqServerId=" + mqServerId + + ", mqServerName=" + mqServerName + + ", serverIdcId=" + serverIdcId + + ", serverIdcName=" + serverIdcName + + ", clientIdc=" + clientIdc + + ", produceTps=" + produceTps + + ", msgAvgSize=" + msgAvgSize + + ", msgMaxSize=" + msgMaxSize + + ", state=" + state + + ", config=" + config + + ", isDelete=" + isDelete + + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + + ", serialVersionUID=" + serialVersionUID + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConfCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConfCriteria.java new file mode 100644 index 0000000..712d9bd --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicConfCriteria.java @@ -0,0 +1,1361 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class TopicConfCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public TopicConfCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTopicIdIsNull() { + addCriterion("topic_id is null"); + return (Criteria) this; + } + + public Criteria andTopicIdIsNotNull() { + addCriterion("topic_id is not null"); + return (Criteria) this; + } + + public Criteria andTopicIdEqualTo(Long value) { + addCriterion("topic_id =", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdNotEqualTo(Long value) { + addCriterion("topic_id <>", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdGreaterThan(Long value) { + addCriterion("topic_id >", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdGreaterThanOrEqualTo(Long value) { + addCriterion("topic_id >=", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdLessThan(Long value) { + addCriterion("topic_id <", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdLessThanOrEqualTo(Long value) { + addCriterion("topic_id <=", value, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdIn(List values) { + addCriterion("topic_id in", values, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdNotIn(List values) { + addCriterion("topic_id not in", values, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdBetween(Long value1, Long value2) { + addCriterion("topic_id between", value1, value2, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicIdNotBetween(Long value1, Long value2) { + addCriterion("topic_id not between", value1, value2, "topicId"); + return (Criteria) this; + } + + public Criteria andTopicNameIsNull() { + addCriterion("topic_name is null"); + return (Criteria) this; + } + + public Criteria andTopicNameIsNotNull() { + addCriterion("topic_name is not null"); + return (Criteria) this; + } + + public Criteria andTopicNameEqualTo(String value) { + addCriterion("topic_name =", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotEqualTo(String value) { + addCriterion("topic_name <>", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameGreaterThan(String value) { + addCriterion("topic_name >", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameGreaterThanOrEqualTo(String value) { + addCriterion("topic_name >=", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLessThan(String value) { + addCriterion("topic_name <", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLessThanOrEqualTo(String value) { + addCriterion("topic_name <=", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLike(String value) { + addCriterion("topic_name like", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotLike(String value) { + addCriterion("topic_name not like", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameIn(List values) { + addCriterion("topic_name in", values, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotIn(List values) { + addCriterion("topic_name not in", values, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameBetween(String value1, String value2) { + addCriterion("topic_name between", value1, value2, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotBetween(String value1, String value2) { + addCriterion("topic_name not between", value1, value2, "topicName"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNull() { + addCriterion("cluster_id is null"); + return (Criteria) this; + } + + public Criteria andClusterIdIsNotNull() { + addCriterion("cluster_id is not null"); + return (Criteria) this; + } + + public Criteria andClusterIdEqualTo(Long value) { + addCriterion("cluster_id =", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotEqualTo(Long value) { + addCriterion("cluster_id <>", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThan(Long value) { + addCriterion("cluster_id >", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdGreaterThanOrEqualTo(Long value) { + addCriterion("cluster_id >=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThan(Long value) { + addCriterion("cluster_id <", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdLessThanOrEqualTo(Long value) { + addCriterion("cluster_id <=", value, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdIn(List values) { + addCriterion("cluster_id in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotIn(List values) { + addCriterion("cluster_id not in", values, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdBetween(Long value1, Long value2) { + addCriterion("cluster_id between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterIdNotBetween(Long value1, Long value2) { + addCriterion("cluster_id not between", value1, value2, "clusterId"); + return (Criteria) this; + } + + public Criteria andClusterNameIsNull() { + addCriterion("cluster_name is null"); + return (Criteria) this; + } + + public Criteria andClusterNameIsNotNull() { + addCriterion("cluster_name is not null"); + return (Criteria) this; + } + + public Criteria andClusterNameEqualTo(String value) { + addCriterion("cluster_name =", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotEqualTo(String value) { + addCriterion("cluster_name <>", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameGreaterThan(String value) { + addCriterion("cluster_name >", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameGreaterThanOrEqualTo(String value) { + addCriterion("cluster_name >=", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLessThan(String value) { + addCriterion("cluster_name <", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLessThanOrEqualTo(String value) { + addCriterion("cluster_name <=", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameLike(String value) { + addCriterion("cluster_name like", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotLike(String value) { + addCriterion("cluster_name not like", value, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameIn(List values) { + addCriterion("cluster_name in", values, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotIn(List values) { + addCriterion("cluster_name not in", values, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameBetween(String value1, String value2) { + addCriterion("cluster_name between", value1, value2, "clusterName"); + return (Criteria) this; + } + + public Criteria andClusterNameNotBetween(String value1, String value2) { + addCriterion("cluster_name not between", value1, value2, "clusterName"); + return (Criteria) this; + } + + public Criteria andMqServerIdIsNull() { + addCriterion("mq_server_id is null"); + return (Criteria) this; + } + + public Criteria andMqServerIdIsNotNull() { + addCriterion("mq_server_id is not null"); + return (Criteria) this; + } + + public Criteria andMqServerIdEqualTo(Long value) { + addCriterion("mq_server_id =", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdNotEqualTo(Long value) { + addCriterion("mq_server_id <>", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdGreaterThan(Long value) { + addCriterion("mq_server_id >", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdGreaterThanOrEqualTo(Long value) { + addCriterion("mq_server_id >=", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdLessThan(Long value) { + addCriterion("mq_server_id <", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdLessThanOrEqualTo(Long value) { + addCriterion("mq_server_id <=", value, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdIn(List values) { + addCriterion("mq_server_id in", values, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdNotIn(List values) { + addCriterion("mq_server_id not in", values, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdBetween(Long value1, Long value2) { + addCriterion("mq_server_id between", value1, value2, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerIdNotBetween(Long value1, Long value2) { + addCriterion("mq_server_id not between", value1, value2, "mqServerId"); + return (Criteria) this; + } + + public Criteria andMqServerNameIsNull() { + addCriterion("mq_server_name is null"); + return (Criteria) this; + } + + public Criteria andMqServerNameIsNotNull() { + addCriterion("mq_server_name is not null"); + return (Criteria) this; + } + + public Criteria andMqServerNameEqualTo(String value) { + addCriterion("mq_server_name =", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotEqualTo(String value) { + addCriterion("mq_server_name <>", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameGreaterThan(String value) { + addCriterion("mq_server_name >", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameGreaterThanOrEqualTo(String value) { + addCriterion("mq_server_name >=", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameLessThan(String value) { + addCriterion("mq_server_name <", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameLessThanOrEqualTo(String value) { + addCriterion("mq_server_name <=", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameLike(String value) { + addCriterion("mq_server_name like", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotLike(String value) { + addCriterion("mq_server_name not like", value, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameIn(List values) { + addCriterion("mq_server_name in", values, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotIn(List values) { + addCriterion("mq_server_name not in", values, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameBetween(String value1, String value2) { + addCriterion("mq_server_name between", value1, value2, "mqServerName"); + return (Criteria) this; + } + + public Criteria andMqServerNameNotBetween(String value1, String value2) { + addCriterion("mq_server_name not between", value1, value2, "mqServerName"); + return (Criteria) this; + } + + public Criteria andServerIdcIdIsNull() { + addCriterion("server_idc_id is null"); + return (Criteria) this; + } + + public Criteria andServerIdcIdIsNotNull() { + addCriterion("server_idc_id is not null"); + return (Criteria) this; + } + + public Criteria andServerIdcIdEqualTo(Long value) { + addCriterion("server_idc_id =", value, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdNotEqualTo(Long value) { + addCriterion("server_idc_id <>", value, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdGreaterThan(Long value) { + addCriterion("server_idc_id >", value, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdGreaterThanOrEqualTo(Long value) { + addCriterion("server_idc_id >=", value, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdLessThan(Long value) { + addCriterion("server_idc_id <", value, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdLessThanOrEqualTo(Long value) { + addCriterion("server_idc_id <=", value, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdIn(List values) { + addCriterion("server_idc_id in", values, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdNotIn(List values) { + addCriterion("server_idc_id not in", values, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdBetween(Long value1, Long value2) { + addCriterion("server_idc_id between", value1, value2, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcIdNotBetween(Long value1, Long value2) { + addCriterion("server_idc_id not between", value1, value2, "serverIdcId"); + return (Criteria) this; + } + + public Criteria andServerIdcNameIsNull() { + addCriterion("server_idc_name is null"); + return (Criteria) this; + } + + public Criteria andServerIdcNameIsNotNull() { + addCriterion("server_idc_name is not null"); + return (Criteria) this; + } + + public Criteria andServerIdcNameEqualTo(String value) { + addCriterion("server_idc_name =", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameNotEqualTo(String value) { + addCriterion("server_idc_name <>", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameGreaterThan(String value) { + addCriterion("server_idc_name >", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameGreaterThanOrEqualTo(String value) { + addCriterion("server_idc_name >=", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameLessThan(String value) { + addCriterion("server_idc_name <", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameLessThanOrEqualTo(String value) { + addCriterion("server_idc_name <=", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameLike(String value) { + addCriterion("server_idc_name like", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameNotLike(String value) { + addCriterion("server_idc_name not like", value, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameIn(List values) { + addCriterion("server_idc_name in", values, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameNotIn(List values) { + addCriterion("server_idc_name not in", values, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameBetween(String value1, String value2) { + addCriterion("server_idc_name between", value1, value2, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andServerIdcNameNotBetween(String value1, String value2) { + addCriterion("server_idc_name not between", value1, value2, "serverIdcName"); + return (Criteria) this; + } + + public Criteria andClientIdcIsNull() { + addCriterion("client_idc is null"); + return (Criteria) this; + } + + public Criteria andClientIdcIsNotNull() { + addCriterion("client_idc is not null"); + return (Criteria) this; + } + + public Criteria andClientIdcEqualTo(String value) { + addCriterion("client_idc =", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcNotEqualTo(String value) { + addCriterion("client_idc <>", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcGreaterThan(String value) { + addCriterion("client_idc >", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcGreaterThanOrEqualTo(String value) { + addCriterion("client_idc >=", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcLessThan(String value) { + addCriterion("client_idc <", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcLessThanOrEqualTo(String value) { + addCriterion("client_idc <=", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcLike(String value) { + addCriterion("client_idc like", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcNotLike(String value) { + addCriterion("client_idc not like", value, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcIn(List values) { + addCriterion("client_idc in", values, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcNotIn(List values) { + addCriterion("client_idc not in", values, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcBetween(String value1, String value2) { + addCriterion("client_idc between", value1, value2, "clientIdc"); + return (Criteria) this; + } + + public Criteria andClientIdcNotBetween(String value1, String value2) { + addCriterion("client_idc not between", value1, value2, "clientIdc"); + return (Criteria) this; + } + + public Criteria andProduceTpsIsNull() { + addCriterion("produce_tps is null"); + return (Criteria) this; + } + + public Criteria andProduceTpsIsNotNull() { + addCriterion("produce_tps is not null"); + return (Criteria) this; + } + + public Criteria andProduceTpsEqualTo(Integer value) { + addCriterion("produce_tps =", value, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsNotEqualTo(Integer value) { + addCriterion("produce_tps <>", value, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsGreaterThan(Integer value) { + addCriterion("produce_tps >", value, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsGreaterThanOrEqualTo(Integer value) { + addCriterion("produce_tps >=", value, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsLessThan(Integer value) { + addCriterion("produce_tps <", value, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsLessThanOrEqualTo(Integer value) { + addCriterion("produce_tps <=", value, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsIn(List values) { + addCriterion("produce_tps in", values, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsNotIn(List values) { + addCriterion("produce_tps not in", values, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsBetween(Integer value1, Integer value2) { + addCriterion("produce_tps between", value1, value2, "produceTps"); + return (Criteria) this; + } + + public Criteria andProduceTpsNotBetween(Integer value1, Integer value2) { + addCriterion("produce_tps not between", value1, value2, "produceTps"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeIsNull() { + addCriterion("msg_avg_size is null"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeIsNotNull() { + addCriterion("msg_avg_size is not null"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeEqualTo(Integer value) { + addCriterion("msg_avg_size =", value, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeNotEqualTo(Integer value) { + addCriterion("msg_avg_size <>", value, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeGreaterThan(Integer value) { + addCriterion("msg_avg_size >", value, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeGreaterThanOrEqualTo(Integer value) { + addCriterion("msg_avg_size >=", value, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeLessThan(Integer value) { + addCriterion("msg_avg_size <", value, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeLessThanOrEqualTo(Integer value) { + addCriterion("msg_avg_size <=", value, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeIn(List values) { + addCriterion("msg_avg_size in", values, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeNotIn(List values) { + addCriterion("msg_avg_size not in", values, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeBetween(Integer value1, Integer value2) { + addCriterion("msg_avg_size between", value1, value2, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgAvgSizeNotBetween(Integer value1, Integer value2) { + addCriterion("msg_avg_size not between", value1, value2, "msgAvgSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeIsNull() { + addCriterion("msg_max_size is null"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeIsNotNull() { + addCriterion("msg_max_size is not null"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeEqualTo(Integer value) { + addCriterion("msg_max_size =", value, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeNotEqualTo(Integer value) { + addCriterion("msg_max_size <>", value, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeGreaterThan(Integer value) { + addCriterion("msg_max_size >", value, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeGreaterThanOrEqualTo(Integer value) { + addCriterion("msg_max_size >=", value, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeLessThan(Integer value) { + addCriterion("msg_max_size <", value, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeLessThanOrEqualTo(Integer value) { + addCriterion("msg_max_size <=", value, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeIn(List values) { + addCriterion("msg_max_size in", values, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeNotIn(List values) { + addCriterion("msg_max_size not in", values, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeBetween(Integer value1, Integer value2) { + addCriterion("msg_max_size between", value1, value2, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andMsgMaxSizeNotBetween(Integer value1, Integer value2) { + addCriterion("msg_max_size not between", value1, value2, "msgMaxSize"); + return (Criteria) this; + } + + public Criteria andStateIsNull() { + addCriterion("state is null"); + return (Criteria) this; + } + + public Criteria andStateIsNotNull() { + addCriterion("state is not null"); + return (Criteria) this; + } + + public Criteria andStateEqualTo(Byte value) { + addCriterion("state =", value, "state"); + return (Criteria) this; + } + + public Criteria andStateNotEqualTo(Byte value) { + addCriterion("state <>", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThan(Byte value) { + addCriterion("state >", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThanOrEqualTo(Byte value) { + addCriterion("state >=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThan(Byte value) { + addCriterion("state <", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThanOrEqualTo(Byte value) { + addCriterion("state <=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateIn(List values) { + addCriterion("state in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateNotIn(List values) { + addCriterion("state not in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateBetween(Byte value1, Byte value2) { + addCriterion("state between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andStateNotBetween(Byte value1, Byte value2) { + addCriterion("state not between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andConfigIsNull() { + addCriterion("config is null"); + return (Criteria) this; + } + + public Criteria andConfigIsNotNull() { + addCriterion("config is not null"); + return (Criteria) this; + } + + public Criteria andConfigEqualTo(String value) { + addCriterion("config =", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotEqualTo(String value) { + addCriterion("config <>", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThan(String value) { + addCriterion("config >", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThanOrEqualTo(String value) { + addCriterion("config >=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThan(String value) { + addCriterion("config <", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThanOrEqualTo(String value) { + addCriterion("config <=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLike(String value) { + addCriterion("config like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotLike(String value) { + addCriterion("config not like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigIn(List values) { + addCriterion("config in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotIn(List values) { + addCriterion("config not in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigBetween(String value1, String value2) { + addCriterion("config between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotBetween(String value1, String value2) { + addCriterion("config not between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicCriteria.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicCriteria.java new file mode 100644 index 0000000..c8683e2 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/TopicCriteria.java @@ -0,0 +1,1451 @@ +package com.didi.carrera.console.dao.model; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +public class TopicCriteria { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + protected Integer start; + + protected Integer end; + + public TopicCriteria() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + return new Criteria(); + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + public void setStart(Integer start) { + this.start=start; + } + + public Integer getStart() { + return start; + } + + public void setEnd(Integer end) { + this.end=end; + } + + public Integer getEnd() { + return end; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTopicNameIsNull() { + addCriterion("topic_name is null"); + return (Criteria) this; + } + + public Criteria andTopicNameIsNotNull() { + addCriterion("topic_name is not null"); + return (Criteria) this; + } + + public Criteria andTopicNameEqualTo(String value) { + addCriterion("topic_name =", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotEqualTo(String value) { + addCriterion("topic_name <>", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameGreaterThan(String value) { + addCriterion("topic_name >", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameGreaterThanOrEqualTo(String value) { + addCriterion("topic_name >=", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLessThan(String value) { + addCriterion("topic_name <", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLessThanOrEqualTo(String value) { + addCriterion("topic_name <=", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameLike(String value) { + addCriterion("topic_name like", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotLike(String value) { + addCriterion("topic_name not like", value, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameIn(List values) { + addCriterion("topic_name in", values, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotIn(List values) { + addCriterion("topic_name not in", values, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameBetween(String value1, String value2) { + addCriterion("topic_name between", value1, value2, "topicName"); + return (Criteria) this; + } + + public Criteria andTopicNameNotBetween(String value1, String value2) { + addCriterion("topic_name not between", value1, value2, "topicName"); + return (Criteria) this; + } + + public Criteria andServiceIsNull() { + addCriterion("service is null"); + return (Criteria) this; + } + + public Criteria andServiceIsNotNull() { + addCriterion("service is not null"); + return (Criteria) this; + } + + public Criteria andServiceEqualTo(String value) { + addCriterion("service =", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotEqualTo(String value) { + addCriterion("service <>", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceGreaterThan(String value) { + addCriterion("service >", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceGreaterThanOrEqualTo(String value) { + addCriterion("service >=", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceLessThan(String value) { + addCriterion("service <", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceLessThanOrEqualTo(String value) { + addCriterion("service <=", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceLike(String value) { + addCriterion("service like", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotLike(String value) { + addCriterion("service not like", value, "service"); + return (Criteria) this; + } + + public Criteria andServiceIn(List values) { + addCriterion("service in", values, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotIn(List values) { + addCriterion("service not in", values, "service"); + return (Criteria) this; + } + + public Criteria andServiceBetween(String value1, String value2) { + addCriterion("service between", value1, value2, "service"); + return (Criteria) this; + } + + public Criteria andServiceNotBetween(String value1, String value2) { + addCriterion("service not between", value1, value2, "service"); + return (Criteria) this; + } + + public Criteria andDepartmentIsNull() { + addCriterion("department is null"); + return (Criteria) this; + } + + public Criteria andDepartmentIsNotNull() { + addCriterion("department is not null"); + return (Criteria) this; + } + + public Criteria andDepartmentEqualTo(String value) { + addCriterion("department =", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotEqualTo(String value) { + addCriterion("department <>", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentGreaterThan(String value) { + addCriterion("department >", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentGreaterThanOrEqualTo(String value) { + addCriterion("department >=", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentLessThan(String value) { + addCriterion("department <", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentLessThanOrEqualTo(String value) { + addCriterion("department <=", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentLike(String value) { + addCriterion("department like", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotLike(String value) { + addCriterion("department not like", value, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentIn(List values) { + addCriterion("department in", values, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotIn(List values) { + addCriterion("department not in", values, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentBetween(String value1, String value2) { + addCriterion("department between", value1, value2, "department"); + return (Criteria) this; + } + + public Criteria andDepartmentNotBetween(String value1, String value2) { + addCriterion("department not between", value1, value2, "department"); + return (Criteria) this; + } + + public Criteria andContactersIsNull() { + addCriterion("contacters is null"); + return (Criteria) this; + } + + public Criteria andContactersIsNotNull() { + addCriterion("contacters is not null"); + return (Criteria) this; + } + + public Criteria andContactersEqualTo(String value) { + addCriterion("contacters =", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotEqualTo(String value) { + addCriterion("contacters <>", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersGreaterThan(String value) { + addCriterion("contacters >", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersGreaterThanOrEqualTo(String value) { + addCriterion("contacters >=", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersLessThan(String value) { + addCriterion("contacters <", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersLessThanOrEqualTo(String value) { + addCriterion("contacters <=", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersLike(String value) { + addCriterion("contacters like", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotLike(String value) { + addCriterion("contacters not like", value, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersIn(List values) { + addCriterion("contacters in", values, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotIn(List values) { + addCriterion("contacters not in", values, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersBetween(String value1, String value2) { + addCriterion("contacters between", value1, value2, "contacters"); + return (Criteria) this; + } + + public Criteria andContactersNotBetween(String value1, String value2) { + addCriterion("contacters not between", value1, value2, "contacters"); + return (Criteria) this; + } + + public Criteria andAlarmGroupIsNull() { + addCriterion("alarm_group is null"); + return (Criteria) this; + } + + public Criteria andAlarmGroupIsNotNull() { + addCriterion("alarm_group is not null"); + return (Criteria) this; + } + + public Criteria andAlarmGroupEqualTo(String value) { + addCriterion("alarm_group =", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotEqualTo(String value) { + addCriterion("alarm_group <>", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupGreaterThan(String value) { + addCriterion("alarm_group >", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupGreaterThanOrEqualTo(String value) { + addCriterion("alarm_group >=", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupLessThan(String value) { + addCriterion("alarm_group <", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupLessThanOrEqualTo(String value) { + addCriterion("alarm_group <=", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupLike(String value) { + addCriterion("alarm_group like", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotLike(String value) { + addCriterion("alarm_group not like", value, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupIn(List values) { + addCriterion("alarm_group in", values, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotIn(List values) { + addCriterion("alarm_group not in", values, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupBetween(String value1, String value2) { + addCriterion("alarm_group between", value1, value2, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmGroupNotBetween(String value1, String value2) { + addCriterion("alarm_group not between", value1, value2, "alarmGroup"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIsNull() { + addCriterion("alarm_is_enable is null"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIsNotNull() { + addCriterion("alarm_is_enable is not null"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableEqualTo(Byte value) { + addCriterion("alarm_is_enable =", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotEqualTo(Byte value) { + addCriterion("alarm_is_enable <>", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableGreaterThan(Byte value) { + addCriterion("alarm_is_enable >", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableGreaterThanOrEqualTo(Byte value) { + addCriterion("alarm_is_enable >=", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableLessThan(Byte value) { + addCriterion("alarm_is_enable <", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableLessThanOrEqualTo(Byte value) { + addCriterion("alarm_is_enable <=", value, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableIn(List values) { + addCriterion("alarm_is_enable in", values, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotIn(List values) { + addCriterion("alarm_is_enable not in", values, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableBetween(Byte value1, Byte value2) { + addCriterion("alarm_is_enable between", value1, value2, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andAlarmIsEnableNotBetween(Byte value1, Byte value2) { + addCriterion("alarm_is_enable not between", value1, value2, "alarmIsEnable"); + return (Criteria) this; + } + + public Criteria andDelayTopicIsNull() { + addCriterion("delay_topic is null"); + return (Criteria) this; + } + + public Criteria andDelayTopicIsNotNull() { + addCriterion("delay_topic is not null"); + return (Criteria) this; + } + + public Criteria andDelayTopicEqualTo(Byte value) { + addCriterion("delay_topic =", value, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicNotEqualTo(Byte value) { + addCriterion("delay_topic <>", value, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicGreaterThan(Byte value) { + addCriterion("delay_topic >", value, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicGreaterThanOrEqualTo(Byte value) { + addCriterion("delay_topic >=", value, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicLessThan(Byte value) { + addCriterion("delay_topic <", value, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicLessThanOrEqualTo(Byte value) { + addCriterion("delay_topic <=", value, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicIn(List values) { + addCriterion("delay_topic in", values, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicNotIn(List values) { + addCriterion("delay_topic not in", values, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicBetween(Byte value1, Byte value2) { + addCriterion("delay_topic between", value1, value2, "delayTopic"); + return (Criteria) this; + } + + public Criteria andDelayTopicNotBetween(Byte value1, Byte value2) { + addCriterion("delay_topic not between", value1, value2, "delayTopic"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoIsNull() { + addCriterion("need_audit_subinfo is null"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoIsNotNull() { + addCriterion("need_audit_subinfo is not null"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoEqualTo(Byte value) { + addCriterion("need_audit_subinfo =", value, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoNotEqualTo(Byte value) { + addCriterion("need_audit_subinfo <>", value, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoGreaterThan(Byte value) { + addCriterion("need_audit_subinfo >", value, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoGreaterThanOrEqualTo(Byte value) { + addCriterion("need_audit_subinfo >=", value, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoLessThan(Byte value) { + addCriterion("need_audit_subinfo <", value, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoLessThanOrEqualTo(Byte value) { + addCriterion("need_audit_subinfo <=", value, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoIn(List values) { + addCriterion("need_audit_subinfo in", values, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoNotIn(List values) { + addCriterion("need_audit_subinfo not in", values, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoBetween(Byte value1, Byte value2) { + addCriterion("need_audit_subinfo between", value1, value2, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andNeedAuditSubinfoNotBetween(Byte value1, Byte value2) { + addCriterion("need_audit_subinfo not between", value1, value2, "needAuditSubinfo"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyIsNull() { + addCriterion("enable_schema_verify is null"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyIsNotNull() { + addCriterion("enable_schema_verify is not null"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyEqualTo(Byte value) { + addCriterion("enable_schema_verify =", value, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyNotEqualTo(Byte value) { + addCriterion("enable_schema_verify <>", value, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyGreaterThan(Byte value) { + addCriterion("enable_schema_verify >", value, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyGreaterThanOrEqualTo(Byte value) { + addCriterion("enable_schema_verify >=", value, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyLessThan(Byte value) { + addCriterion("enable_schema_verify <", value, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyLessThanOrEqualTo(Byte value) { + addCriterion("enable_schema_verify <=", value, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyIn(List values) { + addCriterion("enable_schema_verify in", values, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyNotIn(List values) { + addCriterion("enable_schema_verify not in", values, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyBetween(Byte value1, Byte value2) { + addCriterion("enable_schema_verify between", value1, value2, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andEnableSchemaVerifyNotBetween(Byte value1, Byte value2) { + addCriterion("enable_schema_verify not between", value1, value2, "enableSchemaVerify"); + return (Criteria) this; + } + + public Criteria andProduceModeIsNull() { + addCriterion("produce_mode is null"); + return (Criteria) this; + } + + public Criteria andProduceModeIsNotNull() { + addCriterion("produce_mode is not null"); + return (Criteria) this; + } + + public Criteria andProduceModeEqualTo(Byte value) { + addCriterion("produce_mode =", value, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeNotEqualTo(Byte value) { + addCriterion("produce_mode <>", value, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeGreaterThan(Byte value) { + addCriterion("produce_mode >", value, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeGreaterThanOrEqualTo(Byte value) { + addCriterion("produce_mode >=", value, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeLessThan(Byte value) { + addCriterion("produce_mode <", value, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeLessThanOrEqualTo(Byte value) { + addCriterion("produce_mode <=", value, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeIn(List values) { + addCriterion("produce_mode in", values, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeNotIn(List values) { + addCriterion("produce_mode not in", values, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeBetween(Byte value1, Byte value2) { + addCriterion("produce_mode between", value1, value2, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeNotBetween(Byte value1, Byte value2) { + addCriterion("produce_mode not between", value1, value2, "produceMode"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperIsNull() { + addCriterion("produce_mode_mapper is null"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperIsNotNull() { + addCriterion("produce_mode_mapper is not null"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperEqualTo(String value) { + addCriterion("produce_mode_mapper =", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperNotEqualTo(String value) { + addCriterion("produce_mode_mapper <>", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperGreaterThan(String value) { + addCriterion("produce_mode_mapper >", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperGreaterThanOrEqualTo(String value) { + addCriterion("produce_mode_mapper >=", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperLessThan(String value) { + addCriterion("produce_mode_mapper <", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperLessThanOrEqualTo(String value) { + addCriterion("produce_mode_mapper <=", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperLike(String value) { + addCriterion("produce_mode_mapper like", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperNotLike(String value) { + addCriterion("produce_mode_mapper not like", value, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperIn(List values) { + addCriterion("produce_mode_mapper in", values, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperNotIn(List values) { + addCriterion("produce_mode_mapper not in", values, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperBetween(String value1, String value2) { + addCriterion("produce_mode_mapper between", value1, value2, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andProduceModeMapperNotBetween(String value1, String value2) { + addCriterion("produce_mode_mapper not between", value1, value2, "produceModeMapper"); + return (Criteria) this; + } + + public Criteria andStateIsNull() { + addCriterion("state is null"); + return (Criteria) this; + } + + public Criteria andStateIsNotNull() { + addCriterion("state is not null"); + return (Criteria) this; + } + + public Criteria andStateEqualTo(Byte value) { + addCriterion("state =", value, "state"); + return (Criteria) this; + } + + public Criteria andStateNotEqualTo(Byte value) { + addCriterion("state <>", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThan(Byte value) { + addCriterion("state >", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThanOrEqualTo(Byte value) { + addCriterion("state >=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThan(Byte value) { + addCriterion("state <", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThanOrEqualTo(Byte value) { + addCriterion("state <=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateIn(List values) { + addCriterion("state in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateNotIn(List values) { + addCriterion("state not in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateBetween(Byte value1, Byte value2) { + addCriterion("state between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andStateNotBetween(Byte value1, Byte value2) { + addCriterion("state not between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andConfigIsNull() { + addCriterion("config is null"); + return (Criteria) this; + } + + public Criteria andConfigIsNotNull() { + addCriterion("config is not null"); + return (Criteria) this; + } + + public Criteria andConfigEqualTo(String value) { + addCriterion("config =", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotEqualTo(String value) { + addCriterion("config <>", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThan(String value) { + addCriterion("config >", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThanOrEqualTo(String value) { + addCriterion("config >=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThan(String value) { + addCriterion("config <", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThanOrEqualTo(String value) { + addCriterion("config <=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLike(String value) { + addCriterion("config like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotLike(String value) { + addCriterion("config not like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigIn(List values) { + addCriterion("config in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotIn(List values) { + addCriterion("config not in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigBetween(String value1, String value2) { + addCriterion("config between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotBetween(String value1, String value2) { + addCriterion("config not between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andDescriptionIsNull() { + addCriterion("description is null"); + return (Criteria) this; + } + + public Criteria andDescriptionIsNotNull() { + addCriterion("description is not null"); + return (Criteria) this; + } + + public Criteria andDescriptionEqualTo(String value) { + addCriterion("description =", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotEqualTo(String value) { + addCriterion("description <>", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionGreaterThan(String value) { + addCriterion("description >", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionGreaterThanOrEqualTo(String value) { + addCriterion("description >=", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionLessThan(String value) { + addCriterion("description <", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionLessThanOrEqualTo(String value) { + addCriterion("description <=", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionLike(String value) { + addCriterion("description like", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotLike(String value) { + addCriterion("description not like", value, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionIn(List values) { + addCriterion("description in", values, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotIn(List values) { + addCriterion("description not in", values, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionBetween(String value1, String value2) { + addCriterion("description between", value1, value2, "description"); + return (Criteria) this; + } + + public Criteria andDescriptionNotBetween(String value1, String value2) { + addCriterion("description not between", value1, value2, "description"); + return (Criteria) this; + } + + public Criteria andExtraParamsIsNull() { + addCriterion("extra_params is null"); + return (Criteria) this; + } + + public Criteria andExtraParamsIsNotNull() { + addCriterion("extra_params is not null"); + return (Criteria) this; + } + + public Criteria andExtraParamsEqualTo(String value) { + addCriterion("extra_params =", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotEqualTo(String value) { + addCriterion("extra_params <>", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsGreaterThan(String value) { + addCriterion("extra_params >", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsGreaterThanOrEqualTo(String value) { + addCriterion("extra_params >=", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLessThan(String value) { + addCriterion("extra_params <", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLessThanOrEqualTo(String value) { + addCriterion("extra_params <=", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsLike(String value) { + addCriterion("extra_params like", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotLike(String value) { + addCriterion("extra_params not like", value, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsIn(List values) { + addCriterion("extra_params in", values, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotIn(List values) { + addCriterion("extra_params not in", values, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsBetween(String value1, String value2) { + addCriterion("extra_params between", value1, value2, "extraParams"); + return (Criteria) this; + } + + public Criteria andExtraParamsNotBetween(String value1, String value2) { + addCriterion("extra_params not between", value1, value2, "extraParams"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNull() { + addCriterion("is_delete is null"); + return (Criteria) this; + } + + public Criteria andIsDeleteIsNotNull() { + addCriterion("is_delete is not null"); + return (Criteria) this; + } + + public Criteria andIsDeleteEqualTo(Byte value) { + addCriterion("is_delete =", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotEqualTo(Byte value) { + addCriterion("is_delete <>", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThan(Byte value) { + addCriterion("is_delete >", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteGreaterThanOrEqualTo(Byte value) { + addCriterion("is_delete >=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThan(Byte value) { + addCriterion("is_delete <", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteLessThanOrEqualTo(Byte value) { + addCriterion("is_delete <=", value, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteIn(List values) { + addCriterion("is_delete in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotIn(List values) { + addCriterion("is_delete not in", values, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteBetween(Byte value1, Byte value2) { + addCriterion("is_delete between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andIsDeleteNotBetween(Byte value1, Byte value2) { + addCriterion("is_delete not between", value1, value2, "isDelete"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeGroupConfig.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeGroupConfig.java new file mode 100644 index 0000000..1ad641e --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeGroupConfig.java @@ -0,0 +1,53 @@ +package com.didi.carrera.console.dao.model.custom; + +import java.io.Serializable; + +import com.alibaba.fastjson.annotation.JSONField; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.xiaojukeji.carrera.config.v4.cproxy.RedisConfiguration; +import org.apache.commons.lang3.StringUtils; + + +public class ConsumeGroupConfig implements Serializable { + + public static final String key_asyncThreads = "asyncThreads"; + public static final String key_redisConfigStr = "redisConfigStr"; + + + private Integer asyncThreads = 8; + private RedisConfiguration redisConfig; + + public Integer getAsyncThreads() { + return asyncThreads; + } + + public void setAsyncThreads(Integer asyncThreads) { + this.asyncThreads = asyncThreads; + } + + public RedisConfiguration getRedisConfig() { + return redisConfig; + } + + public void setRedisConfig(RedisConfiguration redisConfig) { + this.redisConfig = redisConfig; + } + + public void setRedisConfigStr(String redisConfigStr) { + this.redisConfig = StringUtils.isBlank(redisConfigStr) ? null : FastJsonUtils.toObject(redisConfigStr, RedisConfiguration.class); + } + + @JSONField(serialize = false) + public String getRedisConfigStr() { + return this.redisConfig == null ? null : FastJsonUtils.toJson(redisConfig); + } + + @Override + public String toString() { + return "ConsumeGroupConfig{" + + "asyncThreads=" + asyncThreads + + ", redisConfig=" + redisConfig + + '}'; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeSubscriptionConfig.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeSubscriptionConfig.java new file mode 100644 index 0000000..ef7b0b2 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/ConsumeSubscriptionConfig.java @@ -0,0 +1,136 @@ +package com.didi.carrera.console.dao.model.custom; + +import com.google.common.collect.Lists; +import com.xiaojukeji.carrera.config.AppendContext; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +public class ConsumeSubscriptionConfig implements Serializable { + + public static final String key_fetchThreads = "fetchThreads"; + public static final String key_concurrency = "concurrency"; + public static final String key_maxPullBatchSize = "maxPullBatchSize"; + public static final String key_httpMaxTps = "httpMaxTps"; + public static final String key_maxConsumeLag = "maxConsumeLag"; + + + private Integer fetchThreads = 1; + + private Integer concurrency = 1024; + + private Integer maxPullBatchSize = 8; + + private Double httpMaxTps = -1D; + + private List appendContext = Lists.newArrayList(AppendContext.values()); + + private boolean needResetOffset = false; + + private Integer maxConsumeLag = -1; + + private boolean isOldDbData = false; + + private boolean binlog = false; + + private Map> proxies; + + public Integer getFetchThreads() { + return fetchThreads; + } + + public void setFetchThreads(Integer fetchThreads) { + this.fetchThreads = fetchThreads; + } + + public Integer getConcurrency() { + return concurrency; + } + + public void setConcurrency(Integer concurrency) { + this.concurrency = concurrency; + } + + public Integer getMaxPullBatchSize() { + return maxPullBatchSize; + } + + public void setMaxPullBatchSize(Integer maxPullBatchSize) { + this.maxPullBatchSize = maxPullBatchSize; + } + + public List getAppendContext() { + return appendContext; + } + + public void setAppendContext(List appendContext) { + this.appendContext = appendContext; + } + + public boolean isNeedResetOffset() { + return needResetOffset; + } + + public void setNeedResetOffset(boolean needResetOffset) { + this.needResetOffset = needResetOffset; + } + + public Integer getMaxConsumeLag() { + return maxConsumeLag; + } + + public void setMaxConsumeLag(Integer maxConsumeLag) { + this.maxConsumeLag = maxConsumeLag; + } + + public boolean isOldDbData() { + return isOldDbData; + } + + public void setOldDbData(boolean oldDbData) { + isOldDbData = oldDbData; + } + + public Double getHttpMaxTps() { + return httpMaxTps; + } + + public void setHttpMaxTps(Double httpMaxTps) { + this.httpMaxTps = httpMaxTps; + } + + public boolean isBinlog() { + return binlog; + } + + public void setBinlog(boolean binlog) { + this.binlog = binlog; + } + + public Map> getProxies() { + return proxies; + } + + public void setProxies(Map> proxies) { + this.proxies = proxies; + } + + @Override + public String toString() { + return "ConsumeSubscriptionConfig{" + + "fetchThreads=" + fetchThreads + + ", concurrency=" + concurrency + + ", maxPullBatchSize=" + maxPullBatchSize + + ", httpMaxTps=" + httpMaxTps + + ", appendContext=" + appendContext + + ", needResetOffset=" + needResetOffset + + ", maxConsumeLag=" + maxConsumeLag + + ", isOldDbData=" + isOldDbData + + ", binlog=" + binlog + + ", proxies=" + proxies + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomConsumeSubscription.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomConsumeSubscription.java new file mode 100644 index 0000000..2e6fefe --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomConsumeSubscription.java @@ -0,0 +1,85 @@ +package com.didi.carrera.console.dao.model.custom; + +import java.io.Serializable; +import java.util.Date; + + +public class CustomConsumeSubscription implements Serializable { + + private Long groupId; + private String groupName; + private String contacters; + private Long topicId; + private Long clusterId; + private Byte state; + private Date createTime; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getContacters() { + return contacters; + } + + public void setContacters(String contacters) { + this.contacters = contacters; + } + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public Byte getState() { + return state; + } + + public void setState(Byte state) { + this.state = state; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "CustomConsumeSubscription{" + + "groupId=" + groupId + + ", groupName='" + groupName + '\'' + + ", contacters='" + contacters + '\'' + + ", topicId=" + topicId + + ", clusterId=" + clusterId + + ", state=" + state + + ", createTime=" + createTime + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomSubscriptionStateCount.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomSubscriptionStateCount.java new file mode 100644 index 0000000..5afe550 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomSubscriptionStateCount.java @@ -0,0 +1,44 @@ +package com.didi.carrera.console.dao.model.custom; + +import java.io.Serializable; + + +public class CustomSubscriptionStateCount implements Serializable { + + private Long groupId; + private Integer state; + private Integer count; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "CustomSubscriptionStateCount{" + + "groupId=" + groupId + + ", state=" + state + + ", count=" + count + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomTopicConf.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomTopicConf.java new file mode 100644 index 0000000..1c72c70 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/CustomTopicConf.java @@ -0,0 +1,158 @@ +package com.didi.carrera.console.dao.model.custom; + +import java.io.Serializable; +import java.util.Map; + +import com.alibaba.fastjson.TypeReference; +import com.didi.carrera.console.common.util.FastJsonUtils; +import org.apache.commons.lang3.StringUtils; + + +public class CustomTopicConf implements Serializable { + + private Long topicId; + private Long confId; + private Long clusterId; + private String clusterName; + private Long mqServerId; + private String mqServerName; + private Long serverIdcId; + private String serverIdcName; + private Map clientIdc; + private Integer produceTps; + private Integer msgAvgSize; + private Integer msgMaxSize; + private Integer consumerNum; + private TopicConfConfig config; + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public Long getConfId() { + return confId; + } + + public void setConfId(Long confId) { + this.confId = confId; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public Long getMqServerId() { + return mqServerId; + } + + public void setMqServerId(Long mqServerId) { + this.mqServerId = mqServerId; + } + + public String getMqServerName() { + return mqServerName; + } + + public void setMqServerName(String mqServerName) { + this.mqServerName = mqServerName; + } + + public Integer getProduceTps() { + return produceTps; + } + + public void setProduceTps(Integer produceTps) { + this.produceTps = produceTps; + } + + public Integer getMsgAvgSize() { + return msgAvgSize; + } + + public void setMsgAvgSize(Integer msgAvgSize) { + this.msgAvgSize = msgAvgSize; + } + + public Integer getMsgMaxSize() { + return msgMaxSize; + } + + public void setMsgMaxSize(Integer msgMaxSize) { + this.msgMaxSize = msgMaxSize; + } + + public Integer getConsumerNum() { + return consumerNum; + } + + public void setConsumerNum(Integer consumerNum) { + this.consumerNum = consumerNum; + } + + public TopicConfConfig getTopicConfConfig() { + return config; + } + + public void setTopicConfig(TopicConfConfig config) { + this.config = config; + } + + public String getConfig() { + return this.config == null ? null : FastJsonUtils.toJsonString(config); + } + + public void setConfig(String config) { + this.config = StringUtils.isBlank(config) ? null : FastJsonUtils.toObject(config, TopicConfConfig.class); + } + + public Long getServerIdcId() { + return serverIdcId; + } + + public void setServerIdcId(Long serverIdcId) { + this.serverIdcId = serverIdcId; + } + + public String getServerIdcName() { + return serverIdcName; + } + + public void setServerIdcName(String serverIdcName) { + this.serverIdcName = serverIdcName; + } + + + + public String getClientIdc() { + return this.clientIdc == null ? null : FastJsonUtils.toJsonString(clientIdc); + } + + public void setClientIdc(String clientIdc) { + this.clientIdc = StringUtils.isBlank(clientIdc) ? null : FastJsonUtils.toObject(clientIdc, new TypeReference>() { + }); + } + + public Map getTopicConfClientIdc() { + return clientIdc; + } + + public void setTopicConfClientIdc(Map clientIdcMapper) { + this.clientIdc = clientIdcMapper; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfConfig.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfConfig.java new file mode 100644 index 0000000..8527c9b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfConfig.java @@ -0,0 +1,27 @@ +package com.didi.carrera.console.dao.model.custom; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; + + +public class TopicConfConfig implements Serializable { + public static final String key_proxies = "proxies"; + + private Map> proxies; + + public Map> getProxies() { + return proxies; + } + + public void setProxies(Map> proxies) { + this.proxies = proxies; + } + + @Override + public String toString() { + return "TopicConfConfig{" + + "proxies=" + proxies + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfig.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfig.java new file mode 100644 index 0000000..f96fd21 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/dao/model/custom/TopicConfig.java @@ -0,0 +1,51 @@ +package com.didi.carrera.console.dao.model.custom; + +import com.didi.carrera.console.dao.dict.TopicCompressionType; + +import java.io.Serializable; + + +public class TopicConfig implements Serializable { + public static final String key_useCache = "useCache"; + public static final String key_autoBatch = "autoBatch"; + public static final String key_compressionType = "compressionType"; + + private boolean useCache = true; + + private boolean autoBatch = false; + + private Byte compressionType = TopicCompressionType.RMQ_COMPRESSION.getIndex(); + + public boolean isUseCache() { + return useCache; + } + + public void setUseCache(boolean useCache) { + this.useCache = useCache; + } + + public boolean isAutoBatch() { + return autoBatch; + } + + public void setAutoBatch(boolean autoBatch) { + this.autoBatch = autoBatch; + } + + public Byte getCompressionType() { + return compressionType; + } + + public void setCompressionType(Byte compressionType) { + this.compressionType = compressionType; + } + + @Override + public String toString() { + return "TopicConfig{" + + "useCache=" + useCache + + ", autoBatch=" + autoBatch + + ", compressionType=" + compressionType + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/data/Message.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/data/Message.java new file mode 100644 index 0000000..d0a645d --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/data/Message.java @@ -0,0 +1,85 @@ +package com.didi.carrera.console.data; + + +public class Message { + + private String tags; + private String keys; + private Integer storeSize; + private Long bornTimestamp; + + private String qid; + private long offset; + private String body; + + public Message(String qid, long offset, String body, String tags, String keys, Integer storeSize, Long bornTimestamp) { + this.tags = tags; + this.keys = keys; + this.storeSize = storeSize; + this.bornTimestamp = bornTimestamp; + this.qid = qid; + this.offset = offset; + this.body = body; + } + + public String getQid() { + return qid; + } + + public void setQid(String qid) { + this.qid = qid; + } + + public long getOffset() { + return offset; + } + + public void setOffset(long offset) { + this.offset = offset; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + public String getKeys() { + return keys; + } + + public void setKeys(String keys) { + this.keys = keys; + } + + public Integer getStoreSize() { + return storeSize; + } + + public void setStoreSize(Integer storeSize) { + this.storeSize = storeSize; + } + + public Long getBornTimestamp() { + return bornTimestamp; + } + + public void setBornTimestamp(Long bornTimestamp) { + this.bornTimestamp = bornTimestamp; + } + + @Override + public String toString() { + return super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterMqserverRelationService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterMqserverRelationService.java new file mode 100644 index 0000000..1e01c57 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterMqserverRelationService.java @@ -0,0 +1,21 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.dict.ClusterMqServerRelationType; +import com.didi.carrera.console.dao.model.ClusterMqserverRelation; + +import java.util.List; + + +public interface ClusterMqserverRelationService { + + List findByClusterId(Long clusterId); + + List findByClusterId(Long clusterId, ClusterMqServerRelationType type); + + List findByMqServerId(Long mqServerId); + + boolean insert(ClusterMqserverRelation relation); + + boolean updateByPrimaryKey(ClusterMqserverRelation relation); + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterService.java new file mode 100644 index 0000000..22ee662 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ClusterService.java @@ -0,0 +1,18 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.model.Cluster; + +import java.util.List; +import java.util.Map; + + +public interface ClusterService { + + Cluster findById(Long clusterId); + + Cluster findByClusterName(String clusterName); + + List findAll(); + + Map findMap(); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeGroupService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeGroupService.java new file mode 100644 index 0000000..312ff26 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeGroupService.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.service.bean.PageModel; +import com.didi.carrera.console.service.vo.ConsumeGroupSearchItemVo; +import com.didi.carrera.console.service.vo.ConsumeGroupVo; +import com.didi.carrera.console.service.vo.GroupConsumeStateVo; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupBo; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupResetOffsetBo; + +import java.util.List; + + +public interface ConsumeGroupService { + ConsumeGroup findByGroupName(String groupName); + + ConsumeGroup findById(Long groupId); + + List findById(List idList); + + List findByClusterId(Long clusterId); + + List findAll(); + + ConsoleBaseResponse> findAll(String user, String text, Integer curPage, Integer pageSize); + + ConsoleBaseResponse create(ConsumeGroupBo groupBo) throws Exception; + + ConsoleBaseResponse changeState(String user, Long groupId, Integer state) throws Exception; + + ConsoleBaseResponse> getConsumeState(String user, Long groupId, Long topicId, Long clusterId); + + ConsoleBaseResponse resetOffset(ConsumeGroupResetOffsetBo resetOffsetBo) throws Exception; + + ConsoleBaseResponse findSearchItem(String user, Long groupId); + + boolean validUserExist(String user, Long groupId); + + ConsoleBaseResponse> findAllWithoutPage(String user); + + ConsoleBaseResponse delete(String user, Long groupId) throws Exception; + + void insertOrUpdate(ConsumeGroup group); + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeSubscriptionService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeSubscriptionService.java new file mode 100644 index 0000000..d590333 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ConsumeSubscriptionService.java @@ -0,0 +1,63 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.dao.model.custom.CustomConsumeSubscription; +import com.didi.carrera.console.dao.model.custom.CustomSubscriptionStateCount; +import com.didi.carrera.console.service.bean.PageModel; +import com.didi.carrera.console.service.exception.ZkConfigException; +import com.didi.carrera.console.service.vo.SearchItemVo; +import com.didi.carrera.console.service.vo.SubscriptionOrderListVo; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupResetOffsetBo; +import com.didi.carrera.console.web.controller.bo.ConsumeSubscriptionOrderBo; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + + +public interface ConsumeSubscriptionService { + + ConsoleBaseResponse validateConsumeSubscriptionBo(ConsumeSubscriptionOrderBo subscriptionBo) throws ZkConfigException; + + List findByTopicIdClusterId(Long topicId, Long clusterId); + + ConsoleBaseResponse findByGroupClusterTopicId(Long groupId, Long clusterId, Long topicId); + + List findByNotNullGroupClusterTopicId(Long groupId, Long clusterId, Long topicId); + + ConsumeSubscription findById(Long subId); + + List findEnableByGroupId(Long groupId); + + List findEnableByClusterId(Long clusterId); + + List findByClusterId(Long clusterId); + + ConsoleBaseResponse> findAll(String user, String text, Long clusterId, Long groupId, Integer consumeType, Integer state, Integer curPage, @RequestParam Integer pageSize); + + ConsoleBaseResponse changeState(String user, Long subId, Integer state) throws Exception; + + ConsoleBaseResponse changeState(Long groupId, Integer state) throws Exception; + + List findByGroupId(Long groupId); + + List findStateCountByGroupId(List groupIds); + + ConsoleBaseResponse createConsumeSubscription(ConsumeSubscriptionOrderBo subscriptionBo) throws Exception; + + ConsoleBaseResponse resetOffset(ConsumeGroupResetOffsetBo resetOffsetBo) throws Exception; + + ConsoleBaseResponse delete(String user, Long subId) throws Exception; + + ConsoleBaseResponse deleteByGroupId(String user, Long groupId) throws Exception; + + ConsoleBaseResponse> findMsgPushType(String user); + + List findAll(); + + ConsoleBaseResponse addCProxy(String clusterName, String host) throws Exception; + ConsoleBaseResponse addCProxy(String groupName, String clusterName, String host) throws Exception; + ConsoleBaseResponse removeCProxy(String host) throws Exception; + ConsoleBaseResponse removeCProxy(String groupName, String host) throws Exception; + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/MqServerService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/MqServerService.java new file mode 100644 index 0000000..fea4b3f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/MqServerService.java @@ -0,0 +1,21 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.model.MqServer; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.MqServerBo; + +import java.util.List; + + +public interface MqServerService { + + List findAll(); + + MqServer findById(Long mqServerId); + + MqServer findByName(String mqServerName); + + ConsoleBaseResponse create(MqServerBo bo) throws Exception; + + boolean updateAddrById(Long mqServerId, String addr); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/NodeService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/NodeService.java new file mode 100644 index 0000000..1dc01b3 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/NodeService.java @@ -0,0 +1,27 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.dict.NodeType; +import com.didi.carrera.console.dao.model.Node; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.NodeBo; + +import java.util.List; + + +public interface NodeService { + + Node findById(Long nodeId); + + List findByClusterId(Long clusterId); + + List findByClusterIdNodeType(Long clusterId, NodeType nodeType); + + List findByHostNodeType(String host, NodeType nodeType); + + List findByClusterHostNodeType(Long clusterId, String host, NodeType nodeType); + + ConsoleBaseResponse create(NodeBo bo) throws Exception; + + List findAll(); + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/OffsetManagerService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/OffsetManagerService.java new file mode 100644 index 0000000..7831269 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/OffsetManagerService.java @@ -0,0 +1,16 @@ +package com.didi.carrera.console.service; + +import java.util.Date; +import java.util.Map; + + +public interface OffsetManagerService { + void resetOffsetToLatest(Long clusterId, Long groupId, Long topicId) throws Exception; + + void resetOffsetByTime(Long clusterId, Long groupId, Long topicId, Date time) throws Exception; + + void resetOffsetByOffset(Long clusterId, Long groupId, Long topicId, String qid, long offset) throws Exception; + + Map> getProduceOffset(Long clusterId, Long topicId) throws Exception; + Map> getConsumeOffset(Long clusterId, Long groupId, Long topicId) throws Exception; +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/RmqAdminService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/RmqAdminService.java new file mode 100644 index 0000000..0e7a965 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/RmqAdminService.java @@ -0,0 +1,25 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.data.Message; +import org.apache.rocketmq.common.admin.TopicStatsTable; +import org.apache.rocketmq.common.protocol.body.ClusterInfo; + +import java.util.Date; + + +public interface RmqAdminService { + + void createTopic(Long clusterId, String topic) throws Exception; + + Message queryLatestMessage(String nameServer, String topic) throws Exception; + + TopicStatsTable queryTopicConsumeState(String nameServer, String topic) throws Exception; + + void resetOffsetToLatest(String nameServer, String group, String topic) throws Exception; + + void resetOffsetByTime(String nameServer, String group, String topic, Date date) throws Exception; + + ClusterInfo examineBrokerClusterInfo(String nameServer) throws Exception; + + String getClusterName(String nameServer) throws Exception; +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicConfService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicConfService.java new file mode 100644 index 0000000..f370911 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicConfService.java @@ -0,0 +1,32 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.model.TopicConf; +import com.didi.carrera.console.dao.model.custom.CustomTopicConf; + +import java.util.List; + + +public interface TopicConfService { + + List findByTopicId(List topicIds); + + List findByTopicId(Long topicId); + + List findByClusterId(Long clusterId); + + List findByTopicClusterId(Long topicId, Long clusterId); + + boolean insert(TopicConf conf) throws Exception; + + boolean insert(List confList) throws Exception; + + boolean updateByPrimaryKey(TopicConf conf) throws Exception; + + boolean deleteByIds(List configIds); + + List findAll(); + + List findTopicByClusterIdWithDeleted(Long clusterId); + + List findByTopicClusterIds(List topicIds, List clusterIds); +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicService.java new file mode 100644 index 0000000..80c81ba --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/TopicService.java @@ -0,0 +1,52 @@ +package com.didi.carrera.console.service; + +import com.didi.carrera.console.dao.model.Topic; +import com.didi.carrera.console.service.bean.PageModel; +import com.didi.carrera.console.service.vo.TopicListGroupVo; +import com.didi.carrera.console.service.vo.TopicMessageVo; +import com.didi.carrera.console.service.vo.TopicOrderVo; +import com.didi.carrera.console.service.vo.TopicSimpleVo; +import com.didi.carrera.console.service.vo.TopicStateVo; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.AcceptTopicConfBo; +import com.didi.carrera.console.web.controller.bo.TopicConfBo; +import com.didi.carrera.console.web.controller.bo.TopicOrderBo; + +import java.util.List; + + +public interface TopicService { + + Topic findByTopicName(String topicName); + + List findByTopicNameWithDelete(String topicName); + + List findByClusterId(Long clusterId); + + List findById(List idList); + + Topic findById(Long topicId); + + ConsoleBaseResponse validateTopicBo(TopicOrderBo topicInfo); + + ConsoleBaseResponse> findAll(Long clusterId, String text, String user, Integer curPage, Integer pageSize); + + ConsoleBaseResponse> findAllSimple(String user); + + List findAllWithoutPage(); + + ConsoleBaseResponse> findGroup(String user, Long topicId, Long clusterId); + + ConsoleBaseResponse create(TopicOrderBo topicOrderBo) throws Exception; + + ConsoleBaseResponse> findState(String user, Long topicId, Long clusterId); + + ConsoleBaseResponse findMessage(String user, Long topicId, Long clusterId); + + ConsoleBaseResponse findVoById(Long topicId); + + ConsoleBaseResponse addPProxy(String clusterName, String host) throws Exception; + ConsoleBaseResponse addPProxy(String topicName, String clusterName, String host) throws Exception; + ConsoleBaseResponse removePProxy(String host) throws Exception; + ConsoleBaseResponse removePProxy(String topicName, String host) throws Exception; +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ZKV4ConfigService.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ZKV4ConfigService.java new file mode 100644 index 0000000..50adcb9 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/ZKV4ConfigService.java @@ -0,0 +1,49 @@ +package com.didi.carrera.console.service; + +import java.util.Set; + +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.service.exception.ZkConfigException; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.xiaojukeji.carrera.config.v4.GroupConfig; +import com.xiaojukeji.carrera.config.v4.cproxy.UpstreamTopic; + + +public interface ZKV4ConfigService { + void updateTopicConfig(Long topicId, Set clusterIdSet) throws Exception; + + void updateSubConfig(Long groupId, Set clusterIdSet) throws Exception; + + void onlyUpdateGroupConfig(Long groupId) throws Exception; + + void updatePProxyConfig(Long nodeId) throws Exception; + + void updateCProxyConfig(Long nodeId) throws Exception; + + void updateBrokerConfig(Long mqServerId) throws Exception; + + void initAllZk() throws Exception; + + void initZkPath() throws Exception; + + ConsoleBaseResponse pushCproxyConfig(String host) throws Exception; + + ConsoleBaseResponse pushPproxyConfig(String host) throws Exception; + + ConsoleBaseResponse pushTopicConfig(String topicName) throws Exception; + + ConsoleBaseResponse pushGroupConfig(String groupName) throws Exception; + + ConsoleBaseResponse pushTopicByCluster(String clusterName) throws Exception; + + ConsoleBaseResponse pushGroupByCluster(String clusterName) throws Exception; + + ConsoleBaseResponse pushPProxyByCluster(String clusterName) throws Exception; + + ConsoleBaseResponse pushCProxyByCluster(String clusterName) throws Exception; + + UpstreamTopic buildUpstreamTopic(GroupConfig groupConfig, ConsumeSubscription subscription, String brokerCluster) throws ZkConfigException; + + void updatePProxyConfigByClusterId(String topic, Set clusterIdSet) throws Exception; + void updateCProxyConfigByClusterId(String group, Set clusterIdSet) throws Exception; +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/bean/PageModel.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/bean/PageModel.java new file mode 100644 index 0000000..24163ab --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/bean/PageModel.java @@ -0,0 +1,97 @@ +package com.didi.carrera.console.service.bean; + +import com.alibaba.fastjson.annotation.JSONField; +import com.google.common.collect.Lists; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.List; + + +public class PageModel { + + private Integer curPage; + private Integer pageSize; + private Integer totalSize; + private Integer totalPage; + + private List list; + + public PageModel(Integer curPageNum, Integer pageSize, Integer totalSize) { + this.curPage = curPageNum; + this.pageSize = pageSize; + this.totalSize = totalSize; + this.totalPage = (this.totalSize - 1) / this.pageSize + 1; + + if (curPageNum < 1) { + this.curPage = 1; + } else if (curPageNum > this.totalPage) { + this.curPage = this.totalPage; + } else { + this.curPage = curPageNum; + } + } + + public Integer getCurPage() { + return curPage; + } + + public void setCurPage(Integer curPage) { + this.curPage = curPage; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getTotalSize() { + return totalSize; + } + + public void setTotalSize(Integer totalSize) { + this.totalSize = totalSize; + } + + public Integer getTotalPage() { + return totalPage; + } + + public void setTotalPage(Integer totalPage) { + this.totalPage = totalPage; + } + + @JSONField(serialize = false) + public Integer getPageIndex() { + return (curPage-1) * pageSize; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public void addListItem(T t) { + if(CollectionUtils.isEmpty(list)) { + list = Lists.newArrayList(); + } + + list.add(t); + } + + @Override + public String toString() { + return "PageModel{" + + "curPage=" + curPage + + ", pageSize=" + pageSize + + ", totalSize=" + totalSize + + ", totalPage=" + totalPage + + ", list=" + list + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ConvertDataException.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ConvertDataException.java new file mode 100644 index 0000000..651670a --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ConvertDataException.java @@ -0,0 +1,6 @@ +package com.didi.carrera.console.service.exception; + + +public class ConvertDataException extends Exception { + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/MqException.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/MqException.java new file mode 100644 index 0000000..b4f8c16 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/MqException.java @@ -0,0 +1,12 @@ +package com.didi.carrera.console.service.exception; + + +public class MqException extends Exception { + public MqException(String message) { + super(message); + } + + public MqException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ZkConfigException.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ZkConfigException.java new file mode 100644 index 0000000..1f0a4b4 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/exception/ZkConfigException.java @@ -0,0 +1,8 @@ +package com.didi.carrera.console.service.exception; + + +public class ZkConfigException extends Exception { + public ZkConfigException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterMqserverRelationServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterMqserverRelationServiceImpl.java new file mode 100644 index 0000000..cbf336e --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterMqserverRelationServiceImpl.java @@ -0,0 +1,70 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.dao.dict.ClusterMqServerRelationType; +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.mapper.ClusterMqserverRelationMapper; +import com.didi.carrera.console.dao.model.ClusterMqserverRelation; +import com.didi.carrera.console.dao.model.ClusterMqserverRelationCriteria; +import com.didi.carrera.console.service.ClusterMqserverRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service +public class ClusterMqserverRelationServiceImpl implements ClusterMqserverRelationService { + + @Autowired + private ClusterMqserverRelationMapper clusterMqserverRelationMapper; + + private List findByCondition(Long clusterId, Long mqServerId, ClusterMqServerRelationType type) { + ClusterMqserverRelationCriteria cmrc = getClusterMqserverRelationCriteria(clusterId, mqServerId, type); + + return clusterMqserverRelationMapper.selectByExample(cmrc); + } + + private ClusterMqserverRelationCriteria getClusterMqserverRelationCriteria(Long clusterId, Long mqServerId, ClusterMqServerRelationType type) { + ClusterMqserverRelationCriteria cmrc = new ClusterMqserverRelationCriteria(); + ClusterMqserverRelationCriteria.Criteria cmrcc = cmrc.createCriteria(); + cmrcc.andIsDeleteEqualTo(IsDelete.NO.getIndex()); + if(clusterId != null && clusterId > 0) { + cmrcc.andClusterIdEqualTo(clusterId); + } + + if(mqServerId != null && mqServerId > 0) { + cmrcc.andMqServerIdEqualTo(mqServerId); + } + + if(type != null) { + cmrcc.andTypeEqualTo(type.getIndex()); + } + return cmrc; + } + + @Override + public List findByClusterId(Long clusterId) { + return findByCondition(clusterId, null, null); + } + + @Override + public List findByClusterId(Long clusterId, ClusterMqServerRelationType type) { + return findByCondition(clusterId, null, type); + } + + @Override + public List findByMqServerId(Long mqServerId) { + return findByCondition(null, mqServerId, null); + } + + @Override + public boolean insert(ClusterMqserverRelation relation) { + relation.setId(null); + return clusterMqserverRelationMapper.insertSelective(relation) > 0; + } + + @Override + public boolean updateByPrimaryKey(ClusterMqserverRelation relation) { + return clusterMqserverRelationMapper.updateByPrimaryKeySelective(relation) > 0; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterServiceImpl.java new file mode 100644 index 0000000..be8906f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ClusterServiceImpl.java @@ -0,0 +1,54 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.mapper.ClusterMapper; +import com.didi.carrera.console.dao.model.Cluster; +import com.didi.carrera.console.dao.model.ClusterCriteria; +import com.didi.carrera.console.service.ClusterService; +import com.google.common.collect.Maps; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + + +@Service("didiClusterServiceImpl") +public class ClusterServiceImpl implements ClusterService { + + @Autowired + private ClusterMapper clusterMapper; + + @Override + public Cluster findById(Long clusterId) { + return clusterMapper.selectByPrimaryKey(clusterId); + } + + @Override + public Cluster findByClusterName(String clusterName) { + ClusterCriteria cc = new ClusterCriteria(); + cc.createCriteria().andNameEqualTo(clusterName).andIsDeleteEqualTo(IsDelete.NO.getIndex()); + List list = clusterMapper.selectByExample(cc); + if (CollectionUtils.isNotEmpty(list)) { + return list.get(0); + } + + return null; + } + + @Override + public List findAll() { + ClusterCriteria cc = new ClusterCriteria(); + cc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + return clusterMapper.selectByExample(cc); + } + + + @Override + public Map findMap() { + Map map = Maps.newHashMap(); + findAll().forEach(cluster -> map.put(cluster.getId(), cluster)); + return map; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeGroupServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeGroupServiceImpl.java new file mode 100644 index 0000000..41bd010 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeGroupServiceImpl.java @@ -0,0 +1,439 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.dao.DaoUtil; +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.IsEnable; +import com.didi.carrera.console.dao.dict.MqServerType; +import com.didi.carrera.console.dao.mapper.ConsumeGroupMapper; +import com.didi.carrera.console.dao.mapper.custom.ConsumeGroupCustomMapper; +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.dao.model.ConsumeGroupCriteria; +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.dao.model.MqServer; +import com.didi.carrera.console.dao.model.TopicConf; +import com.didi.carrera.console.dao.model.custom.ConsumeGroupConfig; +import com.didi.carrera.console.dao.model.custom.CustomSubscriptionStateCount; +import com.didi.carrera.console.service.ConsumeGroupService; +import com.didi.carrera.console.service.ConsumeSubscriptionService; +import com.didi.carrera.console.service.MqServerService; +import com.didi.carrera.console.service.OffsetManagerService; +import com.didi.carrera.console.service.RmqAdminService; +import com.didi.carrera.console.service.TopicConfService; +import com.didi.carrera.console.service.ZKV4ConfigService; +import com.didi.carrera.console.service.bean.PageModel; +import com.didi.carrera.console.service.vo.ConsumeGroupSearchItemVo; +import com.didi.carrera.console.service.vo.ConsumeGroupVo; +import com.didi.carrera.console.service.vo.GroupConsumeStateVo; +import com.didi.carrera.console.service.vo.SearchItemVo; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupBo; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupResetOffsetBo; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.common.admin.TopicStatsTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +@Service("didiConsumeGroupServiceImpl") +@EnableTransactionManagement +public class ConsumeGroupServiceImpl implements ConsumeGroupService { + private static final Logger LOGGER = LoggerFactory.getLogger(ConsumeGroupServiceImpl.class); + + @Autowired + private ConsumeGroupCustomMapper consumeGroupCustomMapper; + + @Autowired + private ConsumeGroupMapper consumeGroupMapper; + + @Autowired + private ZKV4ConfigService zkv4ConfigService; + + @Resource(name = "didiConsumeSubscriptionServiceImpl") + private ConsumeSubscriptionService consumeSubscriptionService; + + @Resource(name = "didiTopicConfServiceImpl") + private TopicConfService topicConfService; + + @Resource(name = "didiMqServerServiceImpl") + private MqServerService mqServerService; + + @Resource(name = "didiOffsetManagerServiceImpl") + private OffsetManagerService offsetManagerService; + + @Resource(name = "didiRmqAdminServiceImpl") + private RmqAdminService rmqAdminService; + + @Override + public ConsumeGroup findByGroupName(String groupName) { + ConsumeGroupCriteria cgc = new ConsumeGroupCriteria(); + cgc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andGroupNameEqualTo(groupName); + List list = consumeGroupMapper.selectByExample(cgc); + if (CollectionUtils.isEmpty(list)) { + return null; + } + + return list.get(0); + } + + @Override + public ConsumeGroup findById(Long groupId) { + return consumeGroupMapper.selectByPrimaryKey(groupId); + } + + @Override + public List findById(List idList) { + ConsumeGroupCriteria cgc = new ConsumeGroupCriteria(); + cgc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andIdIn(idList); + return consumeGroupMapper.selectByExample(cgc); + } + + @Override + public List findByClusterId(Long clusterId) { + List subList = consumeSubscriptionService.findByClusterId(clusterId); + if (CollectionUtils.isEmpty(subList)) { + return Collections.emptyList(); + } + + Set groupIdSet = Sets.newHashSet(); + subList.forEach(sub -> groupIdSet.add(sub.getGroupId())); + + return findById(Lists.newArrayList(groupIdSet)); + } + + @Override + public List findAll() { + ConsumeGroupCriteria cgc = new ConsumeGroupCriteria(); + cgc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + return consumeGroupMapper.selectByExample(cgc); + } + + @Override + public ConsoleBaseResponse> findAllWithoutPage(String user) { + user = DaoUtil.getLikeField(user + ";"); + ConsumeGroupCriteria cgc = new ConsumeGroupCriteria(); + cgc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andContactersLike(user); + cgc.setOrderByClause("create_time desc"); + + List list = consumeGroupMapper.selectByExample(cgc); + + return ConsoleBaseResponse.success(Lists.newArrayList(getConsumeGroupVoMap(list).values())); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse delete(String user, Long groupId) throws Exception { + ConsumeGroup group = findById(groupId); + if (group == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, String.format("groupId<%s>subscription info not exist.", groupId)); + } + + ConsoleBaseResponse ret = consumeSubscriptionService.deleteByGroupId(user, groupId); + if (ret.isSuccess()) { + deleteById(user, groupId); + } + + return ConsoleBaseResponse.success(); + } + + private void deleteById(String user, Long subId) { + ConsumeGroup group = new ConsumeGroup(); + group.setIsDelete(IsDelete.YES.getIndex()); + group.setId(subId); + group.setRemark(user); + consumeGroupMapper.updateByPrimaryKeySelective(group); + + } + + @Override + public ConsoleBaseResponse> findAll(String user, String text, Integer curPage, Integer pageSize) { + return findAllByCondition(user, text, curPage, pageSize); + } + + private ConsoleBaseResponse> findAllByCondition(String user, String text, Integer curPage, Integer pageSize) { + if (!StringUtils.isEmpty(user)) { + user = DaoUtil.getLikeField(user + ";"); + } + + if (!StringUtils.isEmpty(text)) { + text = DaoUtil.getLikeField(text); + } + + Integer totalCount = consumeGroupCustomMapper.selectCountByCondition(user, text); + PageModel pageModel = new PageModel<>(curPage, pageSize, totalCount); + if (totalCount == 0) { + pageModel.setList(Collections.emptyList()); + return ConsoleBaseResponse.success(pageModel); + } + + List list = consumeGroupCustomMapper.selectByCondition(user, text, pageModel.getPageIndex(), pageModel.getPageSize()); + if (CollectionUtils.isEmpty(list)) { + pageModel.setList(Collections.emptyList()); + return ConsoleBaseResponse.success(pageModel); + } + + Map retMap = getConsumeGroupVoMap(list); + fillSubCount(retMap, Lists.newArrayList(retMap.keySet())); + + pageModel.setList(Lists.newArrayList(retMap.values())); + return ConsoleBaseResponse.success(pageModel); + } + + private Map getConsumeGroupVoMap(List list) { + Map retMap = Maps.newLinkedHashMap(); + list.forEach(consumeGroup -> { + ConsumeGroupVo vo = ConsumeGroupVo.buildConsumeGroupVo(consumeGroup); + retMap.put(consumeGroup.getId(), vo); + }); + + return retMap; + } + + private void fillSubCount(Map retMap, List groupIdList) { + List consumeNumList = consumeSubscriptionService.findStateCountByGroupId(groupIdList); + if (CollectionUtils.isNotEmpty(consumeNumList)) { + consumeNumList.forEach(item -> { + if (retMap.containsKey(item.getGroupId())) { + ConsumeGroupVo vo = retMap.get(item.getGroupId()); + int subNum = vo.getSubscriptionNum() == null ? 0 : vo.getSubscriptionNum(); + vo.setSubscriptionNum(subNum + item.getCount()); + + if (IsEnable.isEnable(item.getState().byteValue())) { + int subEnableNum = vo.getSubscriptionEnableNum() == null ? 0 : vo.getSubscriptionEnableNum(); + vo.setSubscriptionEnableNum(subEnableNum + item.getCount()); + } + } + }); + } + } + + private List findByGroupNameWithDelete(String groupName) { + ConsumeGroupCriteria cgc = new ConsumeGroupCriteria(); + cgc.createCriteria().andGroupNameEqualTo(groupName); + + return consumeGroupMapper.selectByExample(cgc); + } + + private ConsoleBaseResponse validConsumeGroupBo(ConsumeGroupBo groupBo) { + if (!groupBo.isModify() && CollectionUtils.isNotEmpty(findByGroupNameWithDelete(groupBo.getGroupName()))) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "consumer group already exist."); + } + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse create(ConsumeGroupBo groupBo) throws Exception { + ConsoleBaseResponse validRet = validConsumeGroupBo(groupBo); + if (!validRet.isSuccess()) { + return validRet; + } + + groupBo.setContacters(groupBo.getContacters().toLowerCase()); + + ConsumeGroup group = groupBo.buildConsumeGroup(); + if (groupBo.isModify()) { + group.setId(groupBo.getGroupId()); + + ConsumeGroup dbGroup = findById(groupBo.getGroupId()); + if (dbGroup == null || dbGroup.getIsDelete() == IsDelete.YES.getIndex()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "groupId<" + groupBo.getGroupId() + "> not exist"); + } + group.setConsumeGroupConfig(dbGroup.getConsumeGroupConfig() == null ? new ConsumeGroupConfig() : dbGroup.getConsumeGroupConfig()); + + insertOrUpdate(group); + } else { + group.setId(null); + group.setConsumeGroupConfig(new ConsumeGroupConfig()); + group.setCreateTime(new Date()); + group.setIsDelete(IsDelete.NO.getIndex()); + + insertOrUpdate(group); + } + pushV4ZkInfo(group.getId()); + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void insertOrUpdate(ConsumeGroup group) { + if (group.getId() != null && group.getId() > 0) { + consumeGroupMapper.updateByPrimaryKeySelective(group); + } else { + consumeGroupMapper.insertSelective(group); + } + } + + private void pushV4ZkInfo(Long groupId) throws Exception { + zkv4ConfigService.onlyUpdateGroupConfig(groupId); + } + + @Override + public boolean validUserExist(String user, Long groupId) { + if (StringUtils.isBlank(user)) { + return false; + } + + ConsumeGroupCriteria csc = new ConsumeGroupCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andIdEqualTo(groupId).andContactersLike(DaoUtil.getLikeField(user)); + return consumeGroupMapper.countByExample(csc) > 0; + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse changeState(String user, Long groupId, Integer state) throws Exception { + if (IsEnable.getByIndex(state.byteValue()) == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "only 0 or 1"); + } + + if (!validUserExist(user, groupId)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, user + "not authorized"); + } + return consumeSubscriptionService.changeState(groupId, state); + } + + private boolean primaryKeyIsNull(Long id) { + return id == null || id.equals(0L); + } + + @Override + public ConsoleBaseResponse> getConsumeState(String user, Long groupId, Long topicId, Long clusterId) { + if (primaryKeyIsNull(groupId)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "consumerGroup is empty"); + } + + List list = consumeSubscriptionService.findByNotNullGroupClusterTopicId(groupId, clusterId, topicId); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription info not found"); + } + + ConsumeSubscription sub = list.get(0); + + return ConsoleBaseResponse.success(buildGroupConsumeStateVoList(groupId, sub.getTopicId(), sub.getClusterId(), sub)); + } + + private List buildGroupConsumeStateVoList(Long groupId, Long topicId, Long clusterId, ConsumeSubscription sub) { + List voList = Lists.newArrayList(); + Map> minOffsetMap = getRmqTopicMinOffsetMap(topicId, clusterId); + try { + Map> consumeOffsetMap = offsetManagerService.getConsumeOffset(clusterId, groupId, topicId); + Map> produceOffsetMap = offsetManagerService.getProduceOffset(clusterId, topicId); + + consumeOffsetMap.forEach((mqType, offsetMap) -> offsetMap.forEach((qid, consumeOffset) -> { + GroupConsumeStateVo vo = new GroupConsumeStateVo(); + BeanUtils.copyProperties(sub, vo); + voList.add(vo); + + if (MqServerType.ROCKETMQ.getName().equalsIgnoreCase(mqType)) { + vo.setQid(qid); + vo.setConsumeOffset(consumeOffset); + vo.setMinOffset(minOffsetMap.get("min").getOrDefault(qid, null)); + vo.setMaxOffset(minOffsetMap.get("max").containsKey(qid) ? minOffsetMap.get("max").get(qid) : null); + vo.setLag(getConsumeLag(produceOffsetMap, MqServerType.ROCKETMQ.getName(), qid, consumeOffset)); + } else { + vo.setQid(qid); + vo.setConsumeOffset(consumeOffset); + vo.setMinOffset(null); + vo.setLag(getConsumeLag(produceOffsetMap, MqServerType.KAFKA.getName(), qid, consumeOffset)); + } + })); + } catch (Exception e) { + LOGGER.error("build GroupConsumeStateVo exception", e); + } + + return voList; + } + + private long getConsumeLag(Map> produceOffsetMap, String mqType, String qid, Long consumeOffset) { + long produceOffset = -1L; + if (produceOffsetMap.containsKey(mqType) && produceOffsetMap.get(mqType).containsKey(qid)) { + produceOffset = produceOffsetMap.get(mqType).remove(qid); + } + return produceOffset > consumeOffset ? produceOffset - consumeOffset : 0; + } + + private Map> getRmqTopicMinOffsetMap(Long topicId, Long clusterId) { + List confList = topicConfService.findByTopicClusterId(topicId, clusterId); + MqServer rmqServer = null; + TopicConf topicConf = null; + for (TopicConf conf : confList) { + MqServer mqServer = mqServerService.findById(conf.getMqServerId()); + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + topicConf = conf; + rmqServer = mqServer; + } + } + Map> ret = Maps.newHashMap(); + Map minOffsetMap = Maps.newHashMap(); + Map maxOffsetMap = Maps.newHashMap(); + ret.put("min", minOffsetMap); + ret.put("max", maxOffsetMap); + if (rmqServer == null) { + return ret; + } + + try { + TopicStatsTable statsTable = rmqAdminService.queryTopicConsumeState(rmqServer.getAddr(), topicConf.getTopicName()); + statsTable.getOffsetTable().forEach(((messageQueue, topicOffset) -> { + minOffsetMap.put(RmqAdminServiceImpl.getNewQid(messageQueue), topicOffset.getMinOffset()); + maxOffsetMap.put(RmqAdminServiceImpl.getNewQid(messageQueue), topicOffset.getMaxOffset()); + })); + + return ret; + } catch (Exception e) { + LOGGER.error("queryTopicConsumeState exception, topic:" + topicConf.getTopicName() + ", mqserver:" + topicConf.getMqServerName()); + return ret; + } + } + + @Override + public ConsoleBaseResponse resetOffset(ConsumeGroupResetOffsetBo resetOffsetBo) throws Exception { + return consumeSubscriptionService.resetOffset(resetOffsetBo); + } + + @Override + public ConsoleBaseResponse findSearchItem(String user, Long groupId) { + ConsumeGroupSearchItemVo vo = new ConsumeGroupSearchItemVo(); + vo.setCluster(Lists.newArrayList()); + vo.setTopic(Lists.newArrayList()); + + List list = consumeSubscriptionService.findByGroupId(groupId); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.success(vo); + } + + Map clusterMap = Maps.newHashMap(); + Map topicMap = Maps.newHashMap(); + list.forEach(sub -> { + if (!clusterMap.containsKey(sub.getClusterId())) { + clusterMap.put(sub.getClusterId(), new SearchItemVo(sub.getClusterId(), sub.getClusterName())); + } + + if (!topicMap.containsKey(sub.getTopicId())) { + topicMap.put(sub.getTopicId(), new SearchItemVo(sub.getTopicId(), sub.getTopicName())); + } + }); + vo.getCluster().addAll(clusterMap.values()); + vo.getTopic().addAll(topicMap.values()); + + return ConsoleBaseResponse.success(vo); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeSubscriptionServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeSubscriptionServiceImpl.java new file mode 100644 index 0000000..79cfeec --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ConsumeSubscriptionServiceImpl.java @@ -0,0 +1,827 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.common.util.CacheLockUtils; +import com.didi.carrera.console.common.util.HostUtils; +import com.didi.carrera.console.dao.DaoUtil; +import com.didi.carrera.console.dao.dict.ConsumeSubscriptionMsgPushType; +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.IsEnable; +import com.didi.carrera.console.dao.dict.NodeType; +import com.didi.carrera.console.dao.mapper.ConsumeSubscriptionMapper; +import com.didi.carrera.console.dao.mapper.custom.ConsumeSubscriptionCustomMapper; +import com.didi.carrera.console.dao.model.Cluster; +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.dao.model.ConsumeSubscriptionCriteria; +import com.didi.carrera.console.dao.model.Node; +import com.didi.carrera.console.dao.model.Topic; +import com.didi.carrera.console.dao.model.custom.ConsumeSubscriptionConfig; +import com.didi.carrera.console.dao.model.custom.CustomConsumeSubscription; +import com.didi.carrera.console.dao.model.custom.CustomSubscriptionStateCount; +import com.didi.carrera.console.service.ClusterService; +import com.didi.carrera.console.service.ConsumeGroupService; +import com.didi.carrera.console.service.ConsumeSubscriptionService; +import com.didi.carrera.console.service.NodeService; +import com.didi.carrera.console.service.OffsetManagerService; +import com.didi.carrera.console.service.TopicService; +import com.didi.carrera.console.service.ZKV4ConfigService; +import com.didi.carrera.console.service.exception.ZkConfigException; +import com.didi.carrera.console.service.bean.PageModel; +import com.didi.carrera.console.service.vo.SearchItemVo; +import com.didi.carrera.console.service.vo.SubscriptionOrderListVo; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupResetOffsetBo; +import com.didi.carrera.console.web.controller.bo.ConsumeSubscriptionOrderBo; +import com.didi.carrera.console.web.controller.bo.NodeBo; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.xiaojukeji.carrera.config.Actions; +import com.xiaojukeji.carrera.config.AppendContext; +import com.xiaojukeji.carrera.config.v4.GroupConfig; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + + +@Service("didiConsumeSubscriptionServiceImpl") +@EnableTransactionManagement +public class ConsumeSubscriptionServiceImpl implements ConsumeSubscriptionService { + private static final Logger LOGGER = LoggerFactory.getLogger(ConsumeSubscriptionServiceImpl.class); + + @Autowired + private ConsumeSubscriptionCustomMapper consumeSubscriptionCustomMapper; + + @Autowired + private ConsumeSubscriptionMapper consumeSubscriptionMapper; + + @Resource(name = "didiConsumeGroupServiceImpl") + private ConsumeGroupService consumeGroupService; + + @Resource(name = "didiOffsetManagerServiceImpl") + private OffsetManagerService offsetManagerService; + + @Autowired + private ZKV4ConfigService zkv4ConfigService; + + @Resource(name = "didiTopicServiceImpl") + private TopicService topicService; + + @Resource(name = "didiClusterServiceImpl") + private ClusterService clusterService; + + @Resource(name = "didiNodeServiceImpl") + private NodeService nodeService; + + @Override + public ConsoleBaseResponse validateConsumeSubscriptionBo(ConsumeSubscriptionOrderBo subscriptionBo) throws ZkConfigException { + Topic topic = topicService.findById(subscriptionBo.getTopicId()); + if (topic == null) { + LOGGER.info("validate error:topic not exist ", subscriptionBo.getTopicId()); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topic not exist"); + } + + subscriptionBo.setTopicName(topic.getTopicName()); + + ConsumeGroup group = consumeGroupService.findById(subscriptionBo.getGroupId()); + if (group == null) { + LOGGER.info("validate error:group not exist ", subscriptionBo.getGroupId()); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "group not exist"); + } + + subscriptionBo.setGroupName(group.getGroupName()); + + for (Long clusterId : subscriptionBo.getClusters().values()) { + Cluster cluster = clusterService.findById(clusterId); + if (cluster == null) { + LOGGER.info("validate error:cluster not exist ", clusterId); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster<" + subscriptionBo.getClusters().get(clusterId) + ">not exist"); + } + + subscriptionBo.getClusters().put(cluster.getName(), clusterId); + } + + if (!subscriptionBo.isModify()) { + for (Long clusterId : subscriptionBo.getClusters().values()) { + if (findByIds(subscriptionBo.getGroupId(), clusterId, subscriptionBo.getTopicId()) != null) { + LOGGER.info("validate error:subscription exist ", subscriptionBo.getGroupId(), clusterId, subscriptionBo.getTopicId()); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription existed"); + } + } + } else { + ConsumeSubscription dbSub = findById(subscriptionBo.getSubId()); + if (dbSub == null || dbSub.getIsDelete() == IsDelete.YES.getIndex()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription not found"); + } + + if (IsEnable.isEnable(dbSub.getState())) { + validateMixAction(subscriptionBo.getSubId(), subscriptionBo.getGroupId(), subscriptionBo.buildActions()); + } + } + + com.xiaojukeji.carrera.config.v4.cproxy.UpstreamTopic upstreamTopic = buildUpstreamTopicV4(subscriptionBo); + + try { + if (!upstreamTopic.validate()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "UpstreamTopic validate Failed"); + } + } catch (Exception e) { + LOGGER.error("validate error:" + e.getMessage(), e); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, e.getMessage()); + } + + return ConsoleBaseResponse.success(); + } + + private com.xiaojukeji.carrera.config.v4.cproxy.UpstreamTopic buildUpstreamTopicV4(ConsumeSubscriptionOrderBo subscriptionBo) throws ZkConfigException { + ConsumeSubscription subscription = subscriptionBo.buildConsumeSubscription(); + subscription.setState(IsEnable.DISABLE.getIndex()); + + ConsumeSubscriptionConfig config = new ConsumeSubscriptionConfig(); + subscription.setConsumeSubscriptionConfig(config); + return zkv4ConfigService.buildUpstreamTopic(new GroupConfig(), subscription, "0"); + } + + @Override + public List findAll() { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + return consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + } + + private void initProxies(ConsumeSubscription sub) { + ConsumeGroup group = consumeGroupService.findById(sub.getGroupId()); + if (group == null) { + throw new RuntimeException("group not found, subId=" + sub.getId()); + } + doInitProxies(sub); + } + + private void doInitProxies(ConsumeSubscription sub) { + ConsumeSubscriptionConfig config = sub.getConsumeSubscriptionConfig(); + if (config.getProxies() == null) { + config.setProxies(Maps.newHashMap()); + } + config.getProxies().clear(); + + List nodeList; + String clusterName = sub.getClusterName(); + + nodeList = nodeService.findByClusterIdNodeType(sub.getClusterId(), NodeType.CONSUMER_PROXY); + + if (CollectionUtils.isNotEmpty(nodeList)) { + Set hostSet = nodeList.stream().map(n -> HostUtils.getIpPortFromHost(n.getHost(), ZKV4ConfigServiceImpl.DEFAULT_CPROXY_PORT)).collect(Collectors.toSet()); + config.getProxies().computeIfAbsent("C_" + clusterName, s -> Sets.newHashSet()).addAll(hostSet); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse addCProxy(String clusterName, String host) throws Exception { + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster not found"); + } + + if (!validNodeExist(host, cluster, NodeType.CONSUMER_PROXY)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "host not found"); + } + + List subscriptionList = findByClusterId(cluster.getId()); + if (CollectionUtils.isEmpty(subscriptionList)) { + return ConsoleBaseResponse.success(); + } + addCProxy(host, subscriptionList); + + return ConsoleBaseResponse.success(); + } + + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse addCProxy(String groupName, String clusterName, String host) throws Exception { + ConsumeGroup group = consumeGroupService.findByGroupName(groupName); + if (group == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "group not found"); + } + + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster not found"); + } + + if (!validNodeExist(host, cluster, NodeType.CONSUMER_PROXY)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "host not found"); + } + + List subscriptionList = findByNotNullGroupClusterTopicId(group.getId(), cluster.getId(), null); + if (CollectionUtils.isEmpty(subscriptionList)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription not found"); + } + addCProxy(host, subscriptionList); + + return ConsoleBaseResponse.success(); + } + + private boolean validNodeExist(String host, Cluster cluster, NodeType nodeType) { + List nodeList = nodeService.findByClusterHostNodeType(cluster.getId(), host, nodeType); + if (CollectionUtils.isEmpty(nodeList)) { + String ip = HostUtils.getIp(host); + if (host.equals(ip)) { + return createCProxyNode(host, cluster, nodeType); + } + nodeList = nodeService.findByClusterHostNodeType(cluster.getId(), host, nodeType); + if (CollectionUtils.isEmpty(nodeList)) { + return createCProxyNode(host, cluster, nodeType); + } + } + return true; + } + + private boolean createCProxyNode(String host, Cluster cluster, NodeType nodeType) { + try { + NodeBo nodeBo = new NodeBo(); + nodeBo.setClusterid(cluster.getId()); + nodeBo.setHost(host); + nodeBo.setNodetype(nodeType.getIndex()); + nodeService.create(nodeBo); + return true; + } catch (Exception e) { + LOGGER.error("create node error {}, {}", host, cluster); + return false; + } + } + + private void addCProxy(String host, List subList) throws Exception { + String ipPort = HostUtils.getIpPortFromHost(host, ZKV4ConfigServiceImpl.DEFAULT_CPROXY_PORT); + Set clusterIds = Sets.newHashSet(); + for (ConsumeSubscription sub : subList) { + if (sub.getConsumeSubscriptionConfig() != null && MapUtils.isNotEmpty(sub.getConsumeSubscriptionConfig().getProxies())) { + Map> proxyMap = sub.getConsumeSubscriptionConfig().getProxies(); + for (Map.Entry> entry : proxyMap.entrySet()) { + Set ipLists = entry.getValue(); + if (!ipLists.contains(ipPort)) { + ipLists.add(ipPort); + clusterIds.add(sub.getClusterId()); + updateByPrimaryKey(sub); + + pushV4ZkInfo(sub.getGroupId(), null); + LOGGER.info("add cproxy {} success, subId={}, group={}, topic={}, cluster={}", ipPort, sub.getId(), sub.getGroupName(), sub.getTopicName(), sub.getClusterName()); + } + } + } + } + if (CollectionUtils.isNotEmpty(clusterIds)) { + zkv4ConfigService.updateCProxyConfigByClusterId("addCProxy", clusterIds); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse removeCProxy(String host) throws Exception { + List subList = findAll(); + removeCProxy(host, subList); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse removeCProxy(String groupName, String host) throws Exception { + ConsumeGroup group = consumeGroupService.findByGroupName(groupName); + if (group == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "groupName not found"); + } + List subList = findByGroupId(group.getId()); + if (CollectionUtils.isEmpty(subList)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription not found"); + } + removeCProxy(host, subList); + + return ConsoleBaseResponse.success(); + } + + private void removeCProxy(String host, List subList) throws Exception { + String ipPort = HostUtils.getIpPortFromHost(host, ZKV4ConfigServiceImpl.DEFAULT_CPROXY_PORT); + Set clusterIds = Sets.newHashSet(); + for (ConsumeSubscription sub : subList) { + if (sub.getConsumeSubscriptionConfig() != null && MapUtils.isNotEmpty(sub.getConsumeSubscriptionConfig().getProxies())) { + Map> proxyMap = sub.getConsumeSubscriptionConfig().getProxies(); + for (Set ipLists : proxyMap.values()) { + if (ipLists.contains(ipPort)) { + ipLists.remove(ipPort); + clusterIds.add(sub.getClusterId()); + updateByPrimaryKey(sub); + + pushV4ZkInfo(sub.getGroupId(), null); + LOGGER.info("remove cproxy {} success, subId={}, group={}, topic={}, cluster={}", ipPort, sub.getId(), sub.getGroupName(), sub.getTopicName(), sub.getClusterName()); + } + } + } + } + if (CollectionUtils.isNotEmpty(clusterIds)) { + zkv4ConfigService.updateCProxyConfigByClusterId("removeCProxy", clusterIds); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse createConsumeSubscription(ConsumeSubscriptionOrderBo subscriptionBo) throws Exception { + ConsoleBaseResponse validateBo = validateConsumeSubscriptionBo(subscriptionBo); + if (!validateBo.isSuccess()) { + return validateBo; + } + + ConsumeSubscription subscription = subscriptionBo.buildConsumeSubscription(); + + if (!subscriptionBo.isModify()) { + for (Map.Entry entry : subscriptionBo.getClusters().entrySet()) { + Long clusterId = entry.getValue(); + String clusterName = entry.getKey(); + subscription.setClusterId(clusterId); + subscription.setClusterName(clusterName); + + subscription.setId(null); + ConsumeSubscriptionConfig config = new ConsumeSubscriptionConfig(); + if (subscription.getSubActions().contains(Actions.PULL_SERVER)) { + config.setAppendContext(null); + } + config.setNeedResetOffset(true); + + subscription.setConsumeSubscriptionConfig(config); + subscription.setIsDelete(IsDelete.NO.getIndex()); + subscription.setCreateTime(new Date()); + //创建默认禁用 + subscription.setState(IsEnable.DISABLE.getIndex()); + + initProxies(subscription); + + consumeSubscriptionMapper.insertSelective(subscription); + } + } else { + subscription.setId(subscriptionBo.getSubId()); + + subscription.setGroupName(null); + subscription.setTopicName(null); + subscription.setClusterName(null); + subscription.setClusterId(null); + ConsumeSubscription dbSub = findById(subscriptionBo.getSubId()); + if (dbSub == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subId<" + subscriptionBo.getSubId() + "> not found"); + } + + updateSubConfig(subscription, dbSub); + } + + pushV4ZkInfo(subscription.getGroupId(), null); + return ConsoleBaseResponse.success(); + } + + private void updateSubConfig(ConsumeSubscription subscription, ConsumeSubscription dbSub) throws Exception { + ConsumeSubscriptionConfig config = dbSub.getConsumeSubscriptionConfig(); + if (dbSub.getSubActions().contains(Actions.ASYNC_HTTP) && subscription.getSubActions().contains(Actions.PULL_SERVER)) { + config.setAppendContext(null); + } else if (dbSub.getSubActions().contains(Actions.PULL_SERVER) && subscription.getSubActions().contains(Actions.ASYNC_HTTP)) { + config.setAppendContext(Lists.newArrayList(AppendContext.values())); + } else if (dbSub.getSubActions().contains(Actions.ASYNC_HTTP) && subscription.getSubActions().contains(Actions.ASYNC_HTTP)) { + config.setAppendContext(Lists.newArrayList(AppendContext.values())); + } + + subscription.setConsumeSubscriptionConfig(config); + + updateByPrimaryKey(subscription); + } + + private void updateByPrimaryKey(ConsumeSubscription subscription) { + consumeSubscriptionMapper.updateByPrimaryKeySelective(subscription); + } + + @Override + public List findByNotNullGroupClusterTopicId(Long groupId, Long clusterId, Long topicId) { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + ConsumeSubscriptionCriteria.Criteria cscc = csc.createCriteria(); + cscc.andIsDeleteEqualTo(IsDelete.NO.getIndex()); + if (groupId != null) { + cscc.andGroupIdEqualTo(groupId); + } + if (clusterId != null) { + cscc.andClusterIdEqualTo(clusterId); + } + if (topicId != null) { + cscc.andTopicIdEqualTo(topicId); + } + + return consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + } + + @Override + public List findEnableByClusterId(Long clusterId) { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andClusterIdEqualTo(clusterId).andStateEqualTo(IsEnable.ENABLE.getIndex()); + return consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + } + + @Override + public List findEnableByGroupId(Long groupId) { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andGroupIdEqualTo(groupId).andStateEqualTo(IsEnable.ENABLE.getIndex()); + return consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + } + + @Override + public List findByClusterId(Long clusterId) { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andClusterIdEqualTo(clusterId); + return consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + } + + @Override + public List findByTopicIdClusterId(Long topicId, Long clusterId) { + return consumeSubscriptionCustomMapper.selectByTopicIdClusterId(topicId, clusterId); + } + + @Override + public ConsumeSubscription findById(Long subId) { + return consumeSubscriptionMapper.selectByPrimaryKey(subId); + } + + private Map getClusterMap() { + Map clusterMap = Maps.newHashMap(); + clusterService.findAll().forEach(cluster -> clusterMap.put(cluster.getId(), cluster)); + return clusterMap; + } + + @Override + public ConsoleBaseResponse> findAll(String user, String text, Long clusterId, Long groupId, Integer consumeType, Integer state, Integer curPage, Integer pageSize) { + return findAllByCondition(user, text, clusterId, groupId, consumeType, state, curPage, pageSize); + } + + private ConsoleBaseResponse> findAllByCondition(String user, String text, Long clusterId, Long groupId, Integer consumeType, Integer state, Integer curPage, Integer pageSize) { + + if (StringUtils.isNotEmpty(user)) { + user = DaoUtil.getLikeField(user); + } + if (StringUtils.isNotEmpty(text)) { + text = DaoUtil.getLikeField(text); + } + + Integer totalCount = consumeSubscriptionCustomMapper.selectCountByCondition(user, groupId, clusterId, consumeType, state, text); + PageModel pageModel = new PageModel<>(curPage, pageSize, totalCount); + if (totalCount == 0) { + pageModel.setList(Collections.emptyList()); + return ConsoleBaseResponse.success(pageModel); + } + + List list = consumeSubscriptionCustomMapper.selectByCondition(user, groupId, clusterId, consumeType, state, text, pageModel.getPageIndex(), pageModel.getPageSize()); + if (CollectionUtils.isEmpty(list)) { + pageModel.setList(Collections.emptyList()); + return ConsoleBaseResponse.success(pageModel); + } + + Map clusterMap = getClusterMap(); + + List retList = Lists.newArrayList(); + list.forEach(sub -> retList.add(SubscriptionOrderListVo.buildSubscriptionListVo(sub, clusterMap.get(sub.getClusterId()).getIdcId(), clusterMap.get(sub.getClusterId()).getIdc(), clusterMap.get(sub.getClusterId()).getDescription()))); + + pageModel.setList(retList); + return ConsoleBaseResponse.success(pageModel); + } + + @Override + public ConsoleBaseResponse findByGroupClusterTopicId(Long groupId, Long clusterId, Long topicId) { + ConsumeSubscription sub = findByIds(groupId, clusterId, topicId); + if (sub == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription info not found"); + } + + Cluster cluster = clusterService.findById(sub.getClusterId()); + + return ConsoleBaseResponse.success(SubscriptionOrderListVo.buildSubscriptionListVo(sub, cluster.getIdcId(), cluster.getIdc(), cluster.getDescription())); + } + + private ConsumeSubscription findByIds(Long groupId, Long clusterId, Long topicId) { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andGroupIdEqualTo(groupId).andClusterIdEqualTo(clusterId).andTopicIdEqualTo(topicId); + + List list = consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + if (CollectionUtils.isEmpty(list)) { + return null; + } + return list.get(0); + } + + private String getStateLockKey(Long id) { + return "CARRERA_GROUP_STAT_LOCK_" + id; + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse changeState(String user, Long subId, Integer state) throws Exception { + ConsumeSubscription sub = findById(subId); + if (!consumeGroupService.validUserExist(user, sub.getGroupId())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, user + "not authorized"); + } + if (IsEnable.getByIndex(state.byteValue()) == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "only 0 or 1"); + } + + return updateSubStateById(sub, state); + } + + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse changeState(Long groupId, Integer state) throws Exception { + List list = findByGroupId(groupId); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "not subscription info found"); + } + for (ConsumeSubscription sub : list) { + updateSubStateById(sub, state); + } + return ConsoleBaseResponse.success(); + } + + private ConsoleBaseResponse updateSubStateById(ConsumeSubscription subscription, Integer state) throws Exception { + if (subscription == null || subscription.getIsDelete() == IsDelete.YES.getIndex()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription<" + (subscription == null ? "" : subscription.getId()) + ">not found"); + } + + if (subscription.getState() == state.byteValue()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription<" + subscription.getId() + ">is " + IsEnable.getByIndex(state.byteValue()).getName() + " state"); + } + + if (IsEnable.isEnable(state.byteValue())) { + validateMixAction(subscription.getId(), subscription.getGroupId(), subscription.getSubActions()); + } + + + if (!CacheLockUtils.lock(getStateLockKey(subscription.getGroupId()))) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, subscription.getGroupName() + "is" + IsEnable.getByIndex(state.byteValue()).getName() + ""); + } + + try { + boolean updateConfig = false; + ConsumeSubscriptionConfig config = subscription.getConsumeSubscriptionConfig(); + if (IsEnable.isEnable(state.byteValue()) && config.isNeedResetOffset()) { + try { + offsetManagerService.resetOffsetToLatest(subscription.getClusterId(), subscription.getGroupId(), subscription.getTopicId()); + } catch (Exception e) { + LOGGER.error("resetOffsetToLatest exception", e); + } + + updateConfig = true; + config.setNeedResetOffset(false); + } + ConsumeSubscription cs = new ConsumeSubscription(); + cs.setId(subscription.getId()); + if (updateConfig) { + cs.setConsumeSubscriptionConfig(config); + } + cs.setState(state.byteValue()); + int ret = consumeSubscriptionMapper.updateByPrimaryKeySelective(cs); + if (ret > 0) { + Set clusterIdSet = Sets.newHashSet(subscription.getClusterId()); + pushV4ZkInfo(subscription.getGroupId(), clusterIdSet); + } + } finally { + CacheLockUtils.unlock(getStateLockKey(subscription.getGroupId())); + } + return ConsoleBaseResponse.success(); + } + + private void validateMixAction(Long subId, Long groupId, List actions) { + List subList = findEnableByGroupId(groupId); + if (CollectionUtils.isEmpty(subList)) { + return; + } + + int lowLevelCount = 0; + int httpCount = 0; + int totalCount = subList.size(); + boolean containsCurSub = false; + + for (ConsumeSubscription sub : subList) { + if (sub.getId().equals(subId)) { + containsCurSub = true; + continue; + } + if (sub.getActions().contains(Actions.LowLevel)) { + lowLevelCount++; + } + if (sub.getActions().contains(Actions.ASYNC_HTTP)) { + httpCount++; + } + } + + if (!containsCurSub) { + totalCount++; + } + + if (actions.contains(Actions.LowLevel)) { + lowLevelCount++; + } + + if (actions.contains(Actions.ASYNC_HTTP)) { + httpCount++; + } + + if (lowLevelCount > 0 && lowLevelCount != totalCount) { + LOGGER.info("validate error:subscription can not mix low-level and non-low-level topics ", subId, groupId); + throw new RuntimeException("HighLevel and LowLevel can not mixed"); + } + + if (httpCount > 0 && httpCount != totalCount) { + LOGGER.info("validate error:subscription can not mix SDK and Http ", subId, groupId); + throw new RuntimeException("SDK and Http can not mixed"); + } + } + + private void pushV4ZkInfo(Long groupId, Set clusterIdSet) throws Exception { + zkv4ConfigService.updateSubConfig(groupId, clusterIdSet); + } + + @Override + public List findByGroupId(Long groupId) { + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andGroupIdEqualTo(groupId); + + return consumeSubscriptionMapper.selectByExampleWithBLOBs(csc); + } + + @Override + public List findStateCountByGroupId(List groupIds) { + if (CollectionUtils.isEmpty(groupIds)) { + return Collections.emptyList(); + } + return consumeSubscriptionCustomMapper.selectStateCountByGroupId(groupIds); + } + + private ConsoleBaseResponse validateConsumeGroupResetOffsetBo(ConsumeGroupResetOffsetBo resetOffsetBo) { + if (!consumeGroupService.validUserExist(resetOffsetBo.getUser(), resetOffsetBo.getGroupId())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, resetOffsetBo.getUser() + "not authorized"); + } + + ConsumeSubscription sub = findByIds(resetOffsetBo.getGroupId(), resetOffsetBo.getClusterId(), resetOffsetBo.getTopicId()); + if (sub == null) { + LOGGER.info("validate error:subscription not exist ", resetOffsetBo.getGroupId(), resetOffsetBo.getClusterId(), resetOffsetBo.getTopicId()); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "subscription not found"); + } + + if (IsEnable.isEnable(sub.getState())) { + LOGGER.info("validate error:subscription must is disable ", sub.getId(), resetOffsetBo.getGroupId(), resetOffsetBo.getClusterId(), resetOffsetBo.getTopicId()); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Reset Offset require disable subscription first!"); + } + + if (resetOffsetBo.getResetType().byteValue() == ConsumeSubscriptionResetType.RESET_BY_TIME.getIndex() && resetOffsetBo.getResetTime() == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Please Specify Timestamp"); + } + + if (resetOffsetBo.getResetType().byteValue() == ConsumeSubscriptionResetType.RESET_BY_OFFSET.getIndex() && (resetOffsetBo.getOffset() == null || resetOffsetBo.getOffset().equals(0L))) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Please Specify Offset Value"); + } + + return ConsoleBaseResponse.success(); + } + + @Override + public ConsoleBaseResponse resetOffset(ConsumeGroupResetOffsetBo resetOffsetBo) throws Exception { + ConsoleBaseResponse validateBo = validateConsumeGroupResetOffsetBo(resetOffsetBo); + if (!validateBo.isSuccess()) { + return validateBo; + } + + switch (ConsumeSubscriptionResetType.getByIndex(resetOffsetBo.getResetType().byteValue())) { + case RESET_TO_LATEST: + offsetManagerService.resetOffsetToLatest(resetOffsetBo.getClusterId(), resetOffsetBo.getGroupId(), resetOffsetBo.getTopicId()); + break; + case RESET_BY_TIME: + offsetManagerService.resetOffsetByTime(resetOffsetBo.getClusterId(), resetOffsetBo.getGroupId(), resetOffsetBo.getTopicId(), resetOffsetBo.getResetTime()); + break; + case RESET_BY_OFFSET: + offsetManagerService.resetOffsetByOffset(resetOffsetBo.getClusterId(), resetOffsetBo.getGroupId(), resetOffsetBo.getTopicId(), resetOffsetBo.getQid(), resetOffsetBo.getOffset()); + break; + } + + return ConsoleBaseResponse.success(); + } + + private boolean deleteById(String user, Long subId) throws Exception { + ConsumeSubscription sub = new ConsumeSubscription(); + sub.setIsDelete(IsDelete.YES.getIndex()); + sub.setId(subId); + sub.setRemark(user); + updateByPrimaryKey(sub); + return true; + } + + private boolean deleteByIds(String user, List subIds) throws Exception { + ConsumeSubscription sub = new ConsumeSubscription(); + sub.setIsDelete(IsDelete.YES.getIndex()); + sub.setRemark(user); + + ConsumeSubscriptionCriteria csc = new ConsumeSubscriptionCriteria(); + csc.createCriteria().andIdIn(subIds); + consumeSubscriptionMapper.updateByExampleSelective(sub, csc); + return true; + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse delete(String user, Long subId) throws Exception { + ConsumeSubscription sub = findById(subId); + if (sub == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, String.format("subId<%s>not found", subId)); + } + + deleteById(user, subId); + + Set clusterIdSet = Sets.newHashSet(sub.getClusterId()); + pushV4ZkInfo(sub.getGroupId(), clusterIdSet); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse deleteByGroupId(String user, Long groupId) throws Exception { + List list = findByGroupId(groupId); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.success(); + } + + deleteByIds(user, list.stream().map(ConsumeSubscription::getId).collect(Collectors.toList())); + + Set clusterIdSet = list.stream().map(ConsumeSubscription::getClusterId).collect(Collectors.toSet()); + pushV4ZkInfo(groupId, clusterIdSet); + + return ConsoleBaseResponse.success(); + } + + @Override + public ConsoleBaseResponse> findMsgPushType(String user) { + List list = Lists.newArrayList(); + for (ConsumeSubscriptionMsgPushType type : ConsumeSubscriptionMsgPushType.values()) { + SearchItemVo vo = new SearchItemVo((long) type.getIndex(), type.getName()); + list.add(vo); + } + return ConsoleBaseResponse.success(list); + } + + public enum ConsumeSubscriptionResetType { + //1.重置到最新2.按时间点重置 3. 重置到指定offset + RESET_TO_LATEST((byte) 1, "reset to latest"), + RESET_BY_TIME((byte) 2, "reset by time"), + RESET_BY_OFFSET((byte) 3, "reset by offset"); + + private byte index; + + private String name; + + ConsumeSubscriptionResetType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public void setIndex(byte index) { + this.index = index; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public static ConsumeSubscriptionResetType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (ConsumeSubscriptionResetType item : all) { + if (item.getIndex() == index) { + return item; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/MqServerServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/MqServerServiceImpl.java new file mode 100644 index 0000000..de30a7b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/MqServerServiceImpl.java @@ -0,0 +1,103 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.MqServerType; +import com.didi.carrera.console.dao.mapper.MqServerMapper; +import com.didi.carrera.console.dao.model.MqServer; +import com.didi.carrera.console.dao.model.MqServerCriteria; +import com.didi.carrera.console.service.MqServerService; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.MqServerBo; +import com.google.common.collect.Maps; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; + + +@Service("didiMqServerServiceImpl") +public class MqServerServiceImpl implements MqServerService { + private static final Logger LOGGER = LoggerFactory.getLogger(MqServerServiceImpl.class); + + @Autowired + private MqServerMapper mqServerMapper; + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse create(MqServerBo bo) throws Exception { + if (findByName(bo.getName()) != null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster name existed"); + } + + if(bo.getType() == MqServerType.ROCKETMQ.getIndex()) { + if(!bo.getAddr().contains(";") && bo.getAddr().split(":").length > 2) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "RMQ cluster address must be separated by semicolon"); + } + } else { + if(!bo.getAddr().contains(",") && bo.getAddr().split(":").length > 2) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Kafka cluster address must be separated by comma"); + } + } + + MqServer mqServer = new MqServer(); + BeanUtils.copyProperties(bo, mqServer); + mqServer.setIsDelete(IsDelete.NO.getIndex()); + mqServer.setCreateTime(new Date()); + + mqServerMapper.insertSelective(mqServer); + + Map map = Maps.newHashMap(); + map.put("id", mqServer.getId()); + return ConsoleBaseResponse.success(map); + } + + @Override + public boolean updateAddrById(Long mqServerId, String addr) { + MqServer mqServer = findById(mqServerId); + if (mqServer == null) { + LOGGER.error("mq_server not found id = {}", mqServerId); + return false; + } + mqServer.setAddr(addr); + mqServerMapper.updateByPrimaryKeySelective(mqServer); + return true; + } + + @Override + public List findAll() { + MqServerCriteria msc = new MqServerCriteria(); + msc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + return mqServerMapper.selectByExample(msc); + } + + @Override + public MqServer findById(Long mqServerId) { + MqServerCriteria msc = new MqServerCriteria(); + msc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andIdEqualTo(mqServerId); + List list = mqServerMapper.selectByExample(msc); + if (CollectionUtils.isEmpty(list)) { + return null; + } + return list.get(0); + } + + @Override + public MqServer findByName(String mqServerName) { + MqServerCriteria msc = new MqServerCriteria(); + msc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andNameEqualTo(mqServerName); + List list = mqServerMapper.selectByExample(msc); + if (CollectionUtils.isEmpty(list)) { + return null; + } + return list.get(0); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/NodeServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/NodeServiceImpl.java new file mode 100644 index 0000000..b1a7d7a --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/NodeServiceImpl.java @@ -0,0 +1,166 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.NodeType; +import com.didi.carrera.console.dao.mapper.NodeMapper; +import com.didi.carrera.console.dao.model.Cluster; +import com.didi.carrera.console.dao.model.ClusterMqserverRelation; +import com.didi.carrera.console.dao.model.Node; +import com.didi.carrera.console.dao.model.NodeCriteria; +import com.didi.carrera.console.service.ClusterMqserverRelationService; +import com.didi.carrera.console.service.ClusterService; +import com.didi.carrera.console.service.NodeService; +import com.didi.carrera.console.service.ZKV4ConfigService; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.NodeBo; +import com.google.common.collect.Maps; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + + +@Service("didiNodeServiceImpl") +public class NodeServiceImpl implements NodeService { + private static final Logger LOGGER = LoggerFactory.getLogger(NodeServiceImpl.class); + + @Autowired + private NodeMapper nodeMapper; + + @Autowired + private ClusterMqserverRelationService clusterMqserverRelationService; + + @Autowired + private ZKV4ConfigService zkv4ConfigService; + + @Resource(name = "didiClusterServiceImpl") + private ClusterService clusterService; + + @Override + public List findByClusterId(Long clusterId) { + NodeCriteria nc = new NodeCriteria(); + nc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andClusterIdEqualTo(clusterId); + return nodeMapper.selectByExample(nc); + } + + @Override + public Node findById(Long nodeId) { + Node node = nodeMapper.selectByPrimaryKey(nodeId); + if (node == null) { + return null; + } + + return node; + } + + @Override + public List findAll() { + NodeCriteria nc = new NodeCriteria(); + nc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + return nodeMapper.selectByExample(nc); + } + + @Override + public List findByClusterIdNodeType(Long clusterId, NodeType nodeType) { + NodeCriteria nc = new NodeCriteria(); + nc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andClusterIdEqualTo(clusterId).andNodeTypeEqualTo(nodeType.getIndex()); + return nodeMapper.selectByExample(nc); + } + + @Override + public List findByHostNodeType(String host, NodeType nodeType) { + NodeCriteria nc = new NodeCriteria(); + nc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andHostEqualTo(host).andNodeTypeEqualTo(nodeType.getIndex()); + return nodeMapper.selectByExample(nc); + } + + @Override + public List findByClusterHostNodeType(Long clusterId, String host, NodeType nodeType) { + NodeCriteria nc = new NodeCriteria(); + nc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andClusterIdEqualTo(clusterId).andHostEqualTo(host).andNodeTypeEqualTo(nodeType.getIndex()); + return nodeMapper.selectByExample(nc); + } + + + private List findByCondition(Node node) { + NodeCriteria nc = new NodeCriteria(); + NodeCriteria.Criteria ncc = nc.createCriteria(); + ncc.andIsDeleteEqualTo(IsDelete.NO.getIndex()); + if (node.getClusterId() != null) { + ncc.andClusterIdEqualTo(node.getClusterId()); + } + if (node.getNodeType() != null && NodeType.getByIndex(node.getNodeType()) != null) { + ncc.andNodeTypeEqualTo(node.getNodeType()); + } + if (node.getHost() != null) { + ncc.andHostEqualTo(node.getHost()); + } + if (node.getMasterId() != null) { + ncc.andMasterIdEqualTo(node.getMasterId()); + } + return nodeMapper.selectByExample(nc); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse create(NodeBo bo) throws Exception { + + Node node = new Node(); + node.setClusterId(bo.getClusterid()); + node.setNodeType(bo.getNodetype()); + node.setHost(bo.getHost()); + node.setModelId(bo.getModelid()); + node.setIsDelete(IsDelete.NO.getIndex()); + node.setCreateTime(new Date()); + + create(node); + + Map ret = Maps.newHashMap(); + ret.put("id", node.getId()); + return ConsoleBaseResponse.success(ret); + } + + private Long create(Node node) throws Exception { + Cluster cluster = clusterService.findById(node.getClusterId()); + if (cluster == null) { + throw new RuntimeException("cluster not found"); + } + + if (CollectionUtils.isNotEmpty(findByCondition(node))) { + throw new RuntimeException("node existed"); + } + + nodeMapper.insertSelective(node); + updateV4Zk(node, cluster); + + return node.getId(); + } + + private void updateV4Zk(Node node, Cluster cluster) throws Exception { + Byte nodeType = node.getNodeType(); + if (nodeType == NodeType.CONSUMER_PROXY.getIndex()) { + zkv4ConfigService.updateCProxyConfig(node.getId()); + } else if (nodeType == NodeType.PRODUCER_PROXY.getIndex()) { + zkv4ConfigService.updatePProxyConfig(node.getId()); + } else if (nodeType == NodeType.ROCKETMQ_BROKER_MASTER.getIndex() || nodeType == NodeType.ROCKETMQ_BROKER_SLAVE.getIndex()) { + List relationList = clusterMqserverRelationService.findByClusterId(cluster.getId()); + if (CollectionUtils.isEmpty(relationList)) { + LOGGER.warn("MqServer Relation not found, cluster=" + cluster.getName()); + return; + } + + for (ClusterMqserverRelation relation : relationList) { + zkv4ConfigService.updateBrokerConfig(relation.getMqServerId()); + } + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/OffsetManagerServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/OffsetManagerServiceImpl.java new file mode 100644 index 0000000..dd6fcf4 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/OffsetManagerServiceImpl.java @@ -0,0 +1,325 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.common.offset.RocketMQProduceOffsetFetcher; +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.MqServerType; +import com.didi.carrera.console.dao.model.Cluster; +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.dao.model.MqServer; +import com.didi.carrera.console.dao.model.Topic; +import com.didi.carrera.console.dao.model.TopicConf; +import com.didi.carrera.console.service.ClusterService; +import com.didi.carrera.console.service.ConsumeGroupService; +import com.didi.carrera.console.service.ConsumeSubscriptionService; +import com.didi.carrera.console.service.exception.MqException; +import com.didi.carrera.console.service.MqServerService; +import com.didi.carrera.console.service.OffsetManagerService; +import com.didi.carrera.console.service.RmqAdminService; +import com.didi.carrera.console.service.TopicConfService; +import com.didi.carrera.console.service.TopicService; +import com.didi.carrera.console.web.controller.bo.ConsumeSubscriptionOrderBo; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.rocketmq.client.exception.MQClientException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.PreDestroy; +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +@Service("didiOffsetManagerServiceImpl") +public class OffsetManagerServiceImpl implements OffsetManagerService { + private static final Logger LOGGER = LoggerFactory.getLogger(OffsetManagerServiceImpl.class); + + @Resource(name = "didiClusterServiceImpl") + private ClusterService clusterService; + + @Resource(name = "didiConsumeGroupServiceImpl") + private ConsumeGroupService consumeGroupService; + + @Resource(name = "didiTopicConfServiceImpl") + private TopicConfService topicConfService; + + @Resource(name = "didiTopicServiceImpl") + private TopicService topicService; + + @Resource(name = "didiMqServerServiceImpl") + private MqServerService mqServerService; + + @Resource(name = "didiRmqAdminServiceImpl") + private RmqAdminService rmqAdminService; + + @Resource(name = "didiConsumeSubscriptionServiceImpl") + private ConsumeSubscriptionService consumeSubscriptionService; + + private ConcurrentMap rocketMQProduceOffsetFetcherMap = new ConcurrentHashMap<>(); + + @Override + public void resetOffsetToLatest(Long clusterId, Long groupId, Long topicId) throws Exception { + Cluster cluster = clusterService.findById(clusterId); + if (cluster == null || cluster.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(clusterId + " cluster not found"); + } + + ConsumeGroup group = consumeGroupService.findById(groupId); + if (group == null || group.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(groupId + " consumerGroup not found"); + } + + Topic topic = topicService.findById(topicId); + if (topic == null || topic.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(topicId + " Topic not found"); + } + + List subList = consumeSubscriptionService.findByNotNullGroupClusterTopicId(groupId, clusterId, topicId); + if (CollectionUtils.isEmpty(subList)) { + throw new MqException("subscription not found"); + } + + ConsumeSubscription sub = subList.get(0); + if (MapUtils.isNotEmpty(sub.getSubExtraParams()) && sub.getSubExtraParams().containsKey(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER)) { + String tmpCluster = sub.getSubExtraParams().get(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER); + String[] arr = tmpCluster.split(";"); + for (String _cluster : arr) { + MqServer mqServer = mqServerService.findByName(_cluster); + if (mqServer == null) { + throw new MqException("subId<" + sub.getId() + ">'s cluster info <" + _cluster + "> error"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + rmqAdminService.resetOffsetToLatest(mqServer.getAddr(), group.getGroupName(), topic.getTopicName()); + } + + } + return; + } + + List confList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(confList)) { + throw new MqException("Topic<" + topicId + ">not found in cluster <" + clusterId + ">"); + } + + for (TopicConf conf : confList) { + MqServer mqServer = mqServerService.findById(conf.getMqServerId()); + if (mqServer == null || mqServer.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(conf.getMqServerId() + " MqServer not found"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + rmqAdminService.resetOffsetToLatest(mqServer.getAddr(), group.getGroupName(), topic.getTopicName()); + } + } + } + + @Override + public void resetOffsetByTime(Long clusterId, Long groupId, Long topicId, Date time) throws Exception { + Cluster cluster = clusterService.findById(clusterId); + if (cluster == null || cluster.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(clusterId + " cluster not found"); + } + + ConsumeGroup group = consumeGroupService.findById(groupId); + if (group == null || group.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(groupId + " consumerGroup not found"); + } + + Topic topic = topicService.findById(topicId); + if (topic == null || topic.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(topicId + " Topic not found"); + } + + List confList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(confList)) { + throw new MqException("Topic<" + topicId + ">not found in cluster<" + clusterId + ">"); + } + + List subList = consumeSubscriptionService.findByNotNullGroupClusterTopicId(groupId, clusterId, topicId); + if (CollectionUtils.isEmpty(subList)) { + throw new MqException("subscription not found"); + } + + ConsumeSubscription sub = subList.get(0); + if (MapUtils.isNotEmpty(sub.getSubExtraParams()) && sub.getSubExtraParams().containsKey(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER)) { + String tmpCluster = sub.getSubExtraParams().get(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER); + String[] arr = tmpCluster.split(";"); + for (String _cluster : arr) { + MqServer mqServer = mqServerService.findByName(_cluster); + if (mqServer == null) { + throw new MqException("subId<" + sub.getId() + ">'s cluster info <" + _cluster + ">error"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + rmqAdminService.resetOffsetByTime(mqServer.getAddr(), group.getGroupName(), topic.getTopicName(), time); + } else { + throw new MqException("Kafka do not support reset Offset by timestamp"); + } + } + return; + } + + for (TopicConf conf : confList) { + MqServer mqServer = mqServerService.findById(conf.getMqServerId()); + if (mqServer == null || mqServer.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(conf.getMqServerId() + " MqServer not found"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + rmqAdminService.resetOffsetByTime(mqServer.getAddr(), group.getGroupName(), topic.getTopicName(), time); + } else { + throw new MqException("Kafka do not support reset Offset by timestamp"); + } + } + } + + @Override + public void resetOffsetByOffset(Long clusterId, Long groupId, Long topicId, String qid, long offset) throws Exception { + Cluster cluster = clusterService.findById(clusterId); + if (cluster == null || cluster.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(clusterId + " cluster not found"); + } + + ConsumeGroup group = consumeGroupService.findById(groupId); + if (group == null || group.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(groupId + " consumerGroup not found"); + } + + Topic topic = topicService.findById(topicId); + if (topic == null || topic.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(topicId + " Topic not found"); + } + + List subList = consumeSubscriptionService.findByNotNullGroupClusterTopicId(groupId, clusterId, topicId); + if (CollectionUtils.isEmpty(subList)) { + throw new MqException("subscription not found"); + } + + ConsumeSubscription sub = subList.get(0); + if (MapUtils.isNotEmpty(sub.getSubExtraParams()) && sub.getSubExtraParams().containsKey(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER)) { + String tmpCluster = sub.getSubExtraParams().get(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER); + String[] arr = tmpCluster.split(";"); + for (String _cluster : arr) { + MqServer mqServer = mqServerService.findByName(_cluster); + if (mqServer == null) { + throw new MqException("subId<" + sub.getId() + ">'s cluster info<" + _cluster + ">error"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + throw new MqException("RocketMQ do not support reset by offset value"); + } else { + + } + } + return; + } + + List confList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(confList)) { + throw new MqException("Topic<" + topicId + ">not found in cluster<" + clusterId + ">"); + } + + for (TopicConf conf : confList) { + MqServer mqServer = mqServerService.findById(conf.getMqServerId()); + if (mqServer == null || mqServer.getIsDelete() == IsDelete.YES.getIndex()) { + throw new MqException(conf.getMqServerId() + " MqServer not found"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + throw new MqException("RocketMQ do not support reset by offset value"); + } else { + + } + } + } + + @Override + public Map> getProduceOffset(Long clusterId, Long topicId) throws Exception { + List topicConfList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(topicConfList)) throw new MqException("unexist topic"); + + return getProduceOffsetMap(topicConfList.get(0).getTopicName(), topicConfList.get(0)); + } + + @Override + public Map> getConsumeOffset(Long clusterId, Long groupId, Long topicId) throws Exception { + List topicConfList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(topicConfList)) throw new MqException("unexist topic"); + + ConsumeGroup group = consumeGroupService.findById(groupId); + if (group == null) { + throw new MqException("unexist groupId"); + } + + return getConsumeOffsetMap(group.getGroupName(), topicConfList.get(0).getTopicName(), topicConfList); + } + + private Map> getProduceOffsetMap(String topic, TopicConf topicConf) throws MqException { + Map> returnMap = new HashMap<>(); + + MqServer mqServer = mqServerService.findById(topicConf.getMqServerId()); + if (mqServer == null) { + throw new MqException("unexist mqserver"); + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + RocketMQProduceOffsetFetcher fetcher = getRocketMQProduceOffsetFetcher(mqServer); + + Map maxOffsets = new HashMap<>(); + fetcher.getMaxOffset(fetcher.getBrokers()).entrySet().stream().filter(entry -> entry.getKey().getTopic().equals(topic)) + .forEach(entry -> maxOffsets.put(RmqAdminServiceImpl.getNewQid(entry.getKey()), entry.getValue())); + returnMap.put(MqServerType.ROCKETMQ.getName(), maxOffsets); + } else { + + } + return returnMap; + } + + private Map> getConsumeOffsetMap(String group, String topic, List topicConfList) throws Exception { + Map> returnMap = new HashMap<>(); + + for (TopicConf topicConf : topicConfList) { + + MqServer mqServer = mqServerService.findById(topicConf.getMqServerId()); + if (mqServer == null) throw new MqException("unexist mqserver"); + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + RocketMQProduceOffsetFetcher fetcher = getRocketMQProduceOffsetFetcher(mqServer); + + Map consumeOffsets = new HashMap<>(); + fetcher.getConsumeStats(group, topic).getOffsetTable().forEach((mq, offset) -> consumeOffsets.put(RmqAdminServiceImpl.getNewQid(mq), offset.getConsumerOffset())); + returnMap.put(MqServerType.ROCKETMQ.getName(), consumeOffsets); + } else { + + } + } + return returnMap; + } + + private RocketMQProduceOffsetFetcher getRocketMQProduceOffsetFetcher(MqServer mqServer) { + return rocketMQProduceOffsetFetcherMap.computeIfAbsent(mqServer.getId(), mqserverId -> { + try { + RocketMQProduceOffsetFetcher fetcher = new RocketMQProduceOffsetFetcher(mqServer.getAddr()); + fetcher.start(); + return fetcher; + } catch (MQClientException e) { + LOGGER.error("start rocketmq produce fetcher error, mqserverId:" + mqserverId, e); + throw new RuntimeException("start RocketMQProduceOffsetFetcher error, name=" + mqServer.getName() + ",nameServer:" + mqServer.getAddr()); + } + }); + } + + @PreDestroy + public void destory() { + LOGGER.info("OffsetManagerServiceImpl shutdown start"); + rocketMQProduceOffsetFetcherMap.forEach((k, v) -> v.shutdown()); + LOGGER.info("OffsetManagerServiceImpl shutdown end"); + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/RmqAdminServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/RmqAdminServiceImpl.java new file mode 100644 index 0000000..a34a514 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/RmqAdminServiceImpl.java @@ -0,0 +1,338 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.common.util.CodecsUtils; +import com.didi.carrera.console.dao.dict.ClusterMqServerRelationType; +import com.didi.carrera.console.dao.dict.MqServerType; +import com.didi.carrera.console.dao.model.Cluster; +import com.didi.carrera.console.dao.model.ClusterMqserverRelation; +import com.didi.carrera.console.dao.model.MqServer; +import com.didi.carrera.console.service.ClusterMqserverRelationService; +import com.didi.carrera.console.service.ClusterService; +import com.didi.carrera.console.service.exception.MqException; +import com.didi.carrera.console.service.MqServerService; +import com.didi.carrera.console.service.RmqAdminService; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.didi.carrera.console.data.Message; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer; +import org.apache.rocketmq.client.consumer.PullResult; +import org.apache.rocketmq.client.consumer.PullStatus; +import org.apache.rocketmq.client.exception.MQBrokerException; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.TopicConfig; +import org.apache.rocketmq.common.admin.TopicStatsTable; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.common.protocol.ResponseCode; +import org.apache.rocketmq.common.protocol.body.ClusterInfo; +import org.apache.rocketmq.common.protocol.body.ConsumerConnection; +import org.apache.rocketmq.common.protocol.route.BrokerData; +import org.apache.rocketmq.common.protocol.route.QueueData; +import org.apache.rocketmq.common.protocol.route.TopicRouteData; +import org.apache.rocketmq.remoting.exception.RemotingException; +import org.apache.rocketmq.tools.admin.DefaultMQAdminExt; +import org.apache.rocketmq.tools.admin.MQAdminExt; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PreDestroy; +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + + +@Service("didiRmqAdminServiceImpl") +public class RmqAdminServiceImpl implements RmqAdminService { + private static final Logger LOGGER = LoggerFactory.getLogger(RmqAdminServiceImpl.class); + + private static final int DEFAULT_READ_QUEUE_NUMS = 8; + private static final int DEFAULT_WRITE_QUEUE_NUMS = 8; + + private Map mqAdminExtMap = new ConcurrentHashMap<>(); + private Map mqPullConsumerMap = new ConcurrentHashMap<>(); + + private static final String CONSOLE_CONSUMER_GROUP = "CONSOLE_CONSUMER_GROUP"; + + @Resource(name = "didiClusterServiceImpl") + private ClusterService clusterService; + + @Resource(name = "didiMqServerServiceImpl") + private MqServerService mqServerService; + + @Autowired + private ClusterMqserverRelationService clusterMqserverRelationService; + + @Override + public void createTopic(Long clusterId, String topic) throws Exception { + createTopic(clusterId, topic, DEFAULT_READ_QUEUE_NUMS, DEFAULT_WRITE_QUEUE_NUMS); + } + + private void createTopic(Long clusterId, String topic, int readQueueNums, int writeQueueNums) throws Exception { + Cluster cluster = clusterService.findById(clusterId); + if (cluster == null) { + throw new MqException("[RMQ] cluster not found, clusterId=" + clusterId); + } + + List relationList = clusterMqserverRelationService.findByClusterId(clusterId, ClusterMqServerRelationType.P_PROXY); + if (CollectionUtils.isEmpty(relationList)) { + throw new MqException("[RMQ] cluster not bind to MqServer, clusterId=" + clusterId); + } + + Map mqServerMap = Maps.newHashMap(); + mqServerService.findAll().forEach(server -> mqServerMap.put(server.getId(), server)); + + List bindRmqList = Lists.newArrayList(); + for (ClusterMqserverRelation relation : relationList) { + if (!mqServerMap.containsKey(relation.getMqServerId())) { + throw new MqException("[RMQ] MqServer not found, mqServerId=" + relation.getMqServerId()); + } + if (mqServerMap.get(relation.getMqServerId()).getType() == MqServerType.ROCKETMQ.getIndex()) { + if (StringUtils.isBlank(mqServerMap.get(relation.getMqServerId()).getAddr())) { + throw new MqException("[RMQ] MqServer NameServer info empty, mqServer=" + mqServerMap.get(relation.getMqServerId()).getName()); + } + bindRmqList.add(mqServerMap.get(relation.getMqServerId())); + } + } + + if (bindRmqList.size() != 1) { + List mqServerNameList = bindRmqList.stream().map(MqServer::getName).collect(Collectors.toList()); + throw new MqException("[RMQ] " + cluster.getName() + "bind multiple RMQ<" + mqServerNameList + ">"); + } + + String rmqCluster = getClusterName(bindRmqList.get(0).getAddr()); + + createTopic(rmqCluster, bindRmqList.get(0), topic, readQueueNums, writeQueueNums); + } + + + private Set getMasterBrokerByBrokerName(String nameServer, String rmqClusterName) throws Exception { + ClusterInfo clusterInfoSerializeWrapper = examineBrokerClusterInfo(nameServer); + Set brokerNameSet = clusterInfoSerializeWrapper.getClusterAddrTable().get(rmqClusterName); + + if (brokerNameSet == null) { + throw new RuntimeException("Make sure the specified clusterName exists or the nameserver which connected is correct"); + } + + Set masterSet = Sets.newHashSet(); + + for (String brokerName : brokerNameSet) { + BrokerData brokerData = clusterInfoSerializeWrapper.getBrokerAddrTable().get(brokerName); + if (brokerData != null) { + String addr = brokerData.getBrokerAddrs().get(MixAll.MASTER_ID); + if (addr != null) { + masterSet.add(addr); + } + } + } + + return masterSet; + } + + private void createTopic(String rmqClusterName, MqServer mqServer, String topic, int readQueueNums, int writeQueueNums) throws MqException { + DefaultMQAdminExt defaultMQAdminExt = getMQAdminExt(mqServer.getAddr()); + + if (isTopicExist(topic, defaultMQAdminExt)) { + LOGGER.info("rmq topic has exist, namesvr={}, topic={}", mqServer.getAddr(), topic); + return; + } + + try { + Set masterSet = getMasterBrokerByBrokerName(mqServer.getAddr(), rmqClusterName); + + TopicConfig topicConfig = new TopicConfig(); + topicConfig.setReadQueueNums(readQueueNums); + topicConfig.setWriteQueueNums(writeQueueNums); + topicConfig.setTopicName(topic); + for (String addr : masterSet) { + defaultMQAdminExt.createAndUpdateTopicConfig(addr, topicConfig); + } + } catch (Exception e) { + LOGGER.error("[RMQ] createTopic exception, topic:" + topic + ", rmqClusterName:" + rmqClusterName, e); + throw new MqException("[RMQ] create topic<" + topic + "> error:" + e.getMessage(), e); + } + } + + private boolean isTopicExist(String topic, DefaultMQAdminExt defaultMQAdminExt) throws MqException { + try { + TopicStatsTable topicStatsTable = defaultMQAdminExt.examineTopicStats(topic); + if (topicStatsTable == null || MapUtils.isEmpty(topicStatsTable.getOffsetTable())) { + return false; + } + return true; + } catch (MQClientException e) { + if (e.getResponseCode() == ResponseCode.TOPIC_NOT_EXIST) { + return false; + } + throw new MqException("get topic status error, " + e.getMessage(), e); + } catch (InterruptedException | RemotingException | MQBrokerException e) { + throw new MqException("get topic status error, " + e.getMessage(), e); + } + } + + @Override + public Message queryLatestMessage(String nameServer, String topic) throws Exception { + DefaultMQAdminExt defaultMQAdminExt = getMQAdminExt(nameServer); + + TopicRouteData topicRouteData = defaultMQAdminExt.examineTopicRouteInfo(topic); + if (topicRouteData == null) { + throw new MqException("[RMQ] topic<" + topic + "> route info is null"); + } + + List queueDatas = topicRouteData.getQueueDatas(); + Collections.shuffle(queueDatas); + for (QueueData queueData : queueDatas) { + for (int i = 0; i < queueData.getReadQueueNums(); i++) { + long maxOffsets = defaultMQAdminExt.maxOffset(new MessageQueue(topic, queueData.getBrokerName(), i)); + if (maxOffsets <= 0) { + continue; + } + Message msg = queryMessageByOffset(nameServer, topic, queueData.getBrokerName(), i, maxOffsets - 1); + if (msg != null) { + return msg; + } + } + } + + throw new MqException("[RMQ] fetch rmq latestmsg error, not exist"); + } + + private Message queryMessageByOffset(String nameServer, String topic, String brokerName, Integer qid, long offset) throws Exception { + DefaultMQPullConsumer mqPullConsumer = getMqPullConsumer(nameServer); + + MessageQueue mq = new MessageQueue(); + mq.setTopic(topic); + mq.setBrokerName(brokerName); + mq.setQueueId(qid); + + PullResult pullResult = mqPullConsumer.pull(mq, "*", offset, 1, 5000); + if (pullResult == null || pullResult.getPullStatus() != PullStatus.FOUND) { + throw new MqException(String.format("[RMQ] message not exsit, nsrv:%s, topic:%s, brokerName:%s, qid:%s, offset:%d", nameServer, topic, brokerName, qid, offset)); + } + + MessageExt messageExt = pullResult.getMsgFoundList().get(0); + if (messageExt.getBody().length == 0) { + return null; + } + + String msg; + if (CodecsUtils.isUtf8(messageExt.getBody())) { + msg = new String(messageExt.getBody(), "UTF-8"); + } else { + msg = java.util.Base64.getEncoder().encodeToString(messageExt.getBody()); + } + return new Message(brokerName + "_" + qid, offset, msg, messageExt.getTags(), messageExt.getKeys(), messageExt.getStoreSize(), messageExt.getBornTimestamp()); + } + + @Override + public TopicStatsTable queryTopicConsumeState(String nameServer, String topic) throws Exception { + DefaultMQAdminExt defaultMQAdminExt = getMQAdminExt(nameServer); + return defaultMQAdminExt.examineTopicStats(topic); + } + + + @Override + public void resetOffsetToLatest(String nameServer, String group, String topic) throws Exception { + DefaultMQAdminExt defaultMQAdminExt = getMQAdminExt(nameServer); + + if (isRmqConsumerConnect(defaultMQAdminExt, group, topic)) { + throw new RuntimeException(String.format("%s订阅%s的消费正在停止中,请稍后再试", group, topic)); + } + + defaultMQAdminExt.resetOffsetByTimestampOld(group, topic, -1, true); + } + + private boolean isRmqConsumerConnect(MQAdminExt mqAdminExt, String group, String topic) { + try { + ConsumerConnection connection = mqAdminExt.examineConsumerConnectionInfo(group); + if (connection == null || MapUtils.isEmpty(connection.getSubscriptionTable())) { + return false; + } + return connection.getSubscriptionTable().containsKey(topic); + } catch (Exception e) { + LOGGER.error("mqAdminExt.examineConsumerConnectionInfo(" + group + ") exception", e); + return false; + } + } + + @Override + public void resetOffsetByTime(String nameServer, String group, String topic, Date date) throws Exception { + DefaultMQAdminExt defaultMQAdminExt = getMQAdminExt(nameServer); + if (isRmqConsumerConnect(defaultMQAdminExt, group, topic)) { + throw new RuntimeException(String.format("%s订阅%s的消费正在停止中,请稍后再试", group, topic)); + } + defaultMQAdminExt.resetOffsetByTimestampOld(group, topic, date.getTime(), true); + } + + @Override + public ClusterInfo examineBrokerClusterInfo(String nameServer) throws Exception { + DefaultMQAdminExt defaultMQAdminExt = getMQAdminExt(nameServer); + return defaultMQAdminExt.examineBrokerClusterInfo(); + } + + + @Override + public String getClusterName(String nameServer) throws Exception { + ClusterInfo clusterInfo = examineBrokerClusterInfo(nameServer); + + String[] clusterNameArr = clusterInfo.retrieveAllClusterNames(); + if (ArrayUtils.isEmpty(clusterNameArr)) { + throw new MqException(String.format("can't found cluster info, namesvr=%s", nameServer)); + } + + return clusterNameArr[0]; + } + + private DefaultMQAdminExt getMQAdminExt(String addr) { + return mqAdminExtMap.computeIfAbsent(addr, s -> { + try { + DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt(); + defaultMQAdminExt.setNamesrvAddr(addr); + defaultMQAdminExt.setInstanceName(String.valueOf(System.currentTimeMillis())); + defaultMQAdminExt.start(); + return defaultMQAdminExt; + } catch (MQClientException e) { + LOGGER.error("[RMQ] start mqadminext error, nameServer:" + addr, e); + throw new RuntimeException("[RMQ] start mqAdminExt error, nameServer:" + addr); + } + }); + } + + private DefaultMQPullConsumer getMqPullConsumer(String addr) { + return mqPullConsumerMap.computeIfAbsent(addr, s -> { + try { + DefaultMQPullConsumer mqPullConsumer = new DefaultMQPullConsumer(CONSOLE_CONSUMER_GROUP); + mqPullConsumer.setNamesrvAddr(addr); + mqPullConsumer.setInstanceName(String.valueOf(System.currentTimeMillis())); + mqPullConsumer.start(); + return mqPullConsumer; + } catch (MQClientException e) { + LOGGER.error("start mqPullConsumer error, addr:" + addr, e); + throw new RuntimeException("[RMQ] start mqPullConsumer error, nameServer:" + addr); + } + }); + } + + public static String getNewQid(MessageQueue mq) { + return mq.getBrokerName() + "_" + mq.getQueueId(); + } + + @PreDestroy + public void destory() { + LOGGER.info("RmqAdminServiceImpl shutdown"); + mqAdminExtMap.values().forEach(DefaultMQAdminExt::shutdown); + mqPullConsumerMap.values().forEach(DefaultMQPullConsumer::shutdown); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicConfServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicConfServiceImpl.java new file mode 100644 index 0000000..5ab8741 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicConfServiceImpl.java @@ -0,0 +1,142 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.MqServerType; +import com.didi.carrera.console.dao.mapper.TopicConfMapper; +import com.didi.carrera.console.dao.mapper.custom.TopicConfCustomMapper; +import com.didi.carrera.console.dao.model.TopicConf; +import com.didi.carrera.console.dao.model.TopicConfCriteria; +import com.didi.carrera.console.dao.model.custom.CustomTopicConf; +import com.didi.carrera.console.service.MqServerService; +import com.didi.carrera.console.service.RmqAdminService; +import com.didi.carrera.console.service.TopicConfService; +import com.google.common.collect.Lists; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + + +@Service("didiTopicConfServiceImpl") +public class TopicConfServiceImpl implements TopicConfService { + private static final Logger LOGGER = LoggerFactory.getLogger(TopicConfServiceImpl.class); + + @Autowired + private TopicConfMapper topicConfMapper; + + @Autowired + private TopicConfCustomMapper topicConfCustomMapper; + + @Resource(name = "didiMqServerServiceImpl") + private MqServerService mqServerService; + + @Resource(name = "didiRmqAdminServiceImpl") + private RmqAdminService rmqAdminService; + + @Override + public List findByTopicId(List topicIds) { + return topicConfCustomMapper.selectByTopicId(topicIds); + } + + @Override + public List findByTopicClusterIds(List topicIds, List clusterIds) { + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andTopicIdIn(topicIds).andClusterIdIn(clusterIds); + return topicConfMapper.selectByExample(tcc); + } + + @Override + public List findByTopicId(Long topicId) { + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andTopicIdEqualTo(topicId); + return topicConfMapper.selectByExample(tcc); + } + + @Override + public List findByClusterId(Long clusterId) { + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andClusterIdEqualTo(clusterId); + return topicConfMapper.selectByExample(tcc); + } + + @Override + public List findTopicByClusterIdWithDeleted(Long clusterId) { + List ret = Lists.newArrayList(); + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andClusterIdEqualTo(clusterId); + List list = topicConfMapper.selectByExample(tcc); + if(CollectionUtils.isEmpty(list)) { + return ret; + } + ret.addAll(list.stream().map(TopicConf::getTopicId).collect(Collectors.toSet())); + return ret; + } + + @Override + public List findAll() { + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + return topicConfMapper.selectByExample(tcc); + } + + + @Override + public List findByTopicClusterId(Long topicId, Long clusterId) { + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andTopicIdEqualTo(topicId).andClusterIdEqualTo(clusterId); + return topicConfMapper.selectByExample(tcc); + } + + @Override + public boolean deleteByIds(List configIds) { + TopicConf conf = new TopicConf(); + conf.setIsDelete(IsDelete.YES.getIndex()); + + TopicConfCriteria tcc = new TopicConfCriteria(); + tcc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andIdIn(configIds); + topicConfMapper.updateByExampleSelective(conf, tcc); + + return true; + } + + @Override + public boolean updateByPrimaryKey(TopicConf conf) throws Exception { + return topicConfMapper.updateByPrimaryKeySelective(conf) > 0; + } + + @Override + public boolean insert(TopicConf conf) throws Exception { + conf.setId(null); + + if (topicConfMapper.insertSelective(conf) > 0) { + if (mqServerService.findById(conf.getMqServerId()).getType() == MqServerType.ROCKETMQ.getIndex()) { + LOGGER.info("create rmq broker topic, conf:{}", conf); + rmqAdminService.createTopic(conf.getClusterId(), conf.getTopicName()); + } else { + LOGGER.info("conf mqserver is Kafka, skip create broker topic", conf); + } + + return true; + } + return false; + } + + @Override + public boolean insert(List confList) throws Exception { + if (CollectionUtils.isEmpty(confList)) { + return true; + } + + final boolean[] ret = {false}; + for (TopicConf conf : confList) { + ret[0] = insert(conf); + } + + return ret[0]; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicServiceImpl.java new file mode 100644 index 0000000..2244f2f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/TopicServiceImpl.java @@ -0,0 +1,698 @@ +package com.didi.carrera.console.service.impl; + +import com.didi.carrera.console.common.util.HostUtils; +import com.didi.carrera.console.dao.dict.IsDelete; +import com.didi.carrera.console.dao.dict.IsEnable; +import com.didi.carrera.console.dao.dict.MqServerType; +import com.didi.carrera.console.dao.dict.NodeType; +import com.didi.carrera.console.dao.mapper.TopicMapper; +import com.didi.carrera.console.dao.mapper.custom.TopicCustomMapper; +import com.didi.carrera.console.dao.model.*; +import com.didi.carrera.console.dao.model.custom.CustomConsumeSubscription; +import com.didi.carrera.console.dao.model.custom.CustomTopicConf; +import com.didi.carrera.console.dao.model.custom.TopicConfConfig; +import com.didi.carrera.console.dao.model.custom.TopicConfig; +import com.didi.carrera.console.data.Message; +import com.didi.carrera.console.service.*; +import com.didi.carrera.console.service.bean.PageModel; +import com.didi.carrera.console.service.vo.*; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.AcceptTopicConfBo; +import com.didi.carrera.console.web.controller.bo.NodeBo; +import com.didi.carrera.console.web.controller.bo.TopicConfBo; +import com.didi.carrera.console.web.controller.bo.TopicOrderBo; +import com.didi.carrera.console.web.util.DateUtil; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.common.admin.TopicStatsTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + + +@Service("didiTopicServiceImpl") +@EnableTransactionManagement +public class TopicServiceImpl implements TopicService { + private static final Logger LOGGER = LoggerFactory.getLogger(TopicServiceImpl.class); + + @Autowired + private TopicMapper topicMapper; + + @Autowired + private TopicCustomMapper topicCustomMapper; + + @Resource(name = "didiClusterServiceImpl") + private ClusterService clusterService; + + @Resource(name = "didiConsumeSubscriptionServiceImpl") + private ConsumeSubscriptionService consumeSubscriptionService; + + @Resource(name = "didiTopicConfServiceImpl") + private TopicConfService topicConfService; + + @Resource(name = "didiMqServerServiceImpl") + private MqServerService mqServerService; + + @Autowired + private ZKV4ConfigService zkv4ConfigService; + + @Resource(name = "didiRmqAdminServiceImpl") + private RmqAdminService rmqAdminService; + + @Resource(name = "didiNodeServiceImpl") + private NodeService nodeService; + + public ConsoleBaseResponse validateTopicBo(TopicOrderBo topicInfo) { + if (!topicInfo.isModify() && CollectionUtils.isNotEmpty(findByTopicNameWithDelete(topicInfo.getTopicName()))) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Topic existed"); + } + + if (CollectionUtils.isEmpty(topicInfo.getConf())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Please specify cluster config"); + } + + Map mqServerMap = getAllMqServer(); + + if (IsEnable.isEnable(topicInfo.getEnableSchemaVerify()) && StringUtils.isEmpty(topicInfo.getSchema())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "Enable Schema verify,Schema can not be empty"); + } + + Map clusterCountMap = Maps.newHashMap(); + topicInfo.getConf().forEach(conf -> clusterCountMap.computeIfAbsent(conf.getClusterId(), s -> new AtomicInteger(0)).incrementAndGet()); + + List dbConfList = null; + Map dbClusterCountMap = Maps.newHashMap(); + if (topicInfo.isModify()) { + dbConfList = topicConfService.findByTopicId(topicInfo.getTopicId()); + if (CollectionUtils.isNotEmpty(dbConfList)) { + dbConfList.forEach(conf -> dbClusterCountMap.computeIfAbsent(conf.getClusterId(), s -> new AtomicInteger(0)).incrementAndGet()); + } + + for (Map.Entry entry : clusterCountMap.entrySet()) { + if (entry.getValue().get() > 1 && (!dbClusterCountMap.containsKey(entry.getKey()) || dbClusterCountMap.get(entry.getKey()).get() <= 1)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster<" + entry.getKey() + ">repeated"); + } else if (dbClusterCountMap.containsKey(entry.getKey()) && dbClusterCountMap.get(entry.getKey()).get() > 1 && dbClusterCountMap.get(entry.getKey()).get() != entry.getValue().get()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "multi-cluster<" + entry.getKey() + ">number can not be modified"); + } + } + + } else { + for (Map.Entry entry : clusterCountMap.entrySet()) { + if (entry.getValue().get() > 1) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster<" + entry.getKey() + ">repeated"); + } + } + } + + Map> confIdcMap = Maps.newHashMap(); + for (T bo : topicInfo.getConf()) { + Cluster cluster = clusterService.findById(bo.getClusterId()); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster<" + bo.getClusterName() + ">not found"); + } else { + bo.setClusterName(cluster.getName()); + } + + if (confIdcMap.containsKey(bo.getServerIdcId())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群 " + confIdcMap.get(bo.getServerIdcId()).get(0) + " 和 " + bo.getClusterName() + " 同属于一个IDC, 不允许重复添加"); + } else { + confIdcMap.put(bo.getServerIdcId(), Lists.newArrayList(bo.getClusterName())); + } + + if (bo instanceof AcceptTopicConfBo) { + AcceptTopicConfBo acceptBo = (AcceptTopicConfBo) bo; + if (acceptBo.getMqServerId() == null || acceptBo.getMqServerId().equals(0L)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "必须指定mqServerId"); + } + if (!mqServerMap.containsKey(acceptBo.getMqServerId())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "mqServerId<" + acceptBo.getMqServerId() + ">不存在"); + } + + acceptBo.setMqServerName(mqServerMap.get(acceptBo.getMqServerId()).getName()); + } + } + + if (topicInfo.isModify()) { + if (CollectionUtils.isNotEmpty(dbConfList)) { + for (TopicConf topicConf : dbConfList) { + List groupList = consumeSubscriptionService.findByTopicIdClusterId(topicConf.getTopicId(), topicConf.getClusterId()); + + if (CollectionUtils.isNotEmpty(groupList) && !clusterCountMap.containsKey(topicConf.getClusterId())) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群 " + topicConf.getClusterName() + " 已经被订阅,必须先删除订阅,才能删除此集群"); + } + } + + } + } + return ConsoleBaseResponse.success(); + } + + + private Map getAllMqServer() { + Map mqServerMap = Maps.newHashMap(); + mqServerService.findAll().forEach(server -> mqServerMap.put(server.getId(), server)); + + return mqServerMap; + } + + private void setProxies(TopicConf topicConf) { + TopicConfConfig config = new TopicConfConfig(); + config.setProxies(Maps.newHashMap()); + topicConf.setTopicConfig(config); + + List nodeList = nodeService.findByClusterIdNodeType(topicConf.getClusterId(), NodeType.PRODUCER_PROXY); + if (CollectionUtils.isNotEmpty(nodeList)) { + Set hostSet = nodeList.stream().map(n -> HostUtils.getIpPortFromHost(n.getHost(), ZKV4ConfigServiceImpl.DEFAULT_PPROXY_PORT)).collect(Collectors.toSet()); + + config.getProxies().computeIfAbsent("P_" + topicConf.getClusterName(), s -> Sets.newHashSet()).addAll(hostSet); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse addPProxy(String clusterName, String host) throws Exception { + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster not found"); + } + if (!validNodeExist(host, cluster)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "host not found"); + } + + List confList = topicConfService.findByClusterId(cluster.getId()); + if (CollectionUtils.isEmpty(confList)) { + return ConsoleBaseResponse.success(); + } + + addPProxy(host, confList); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse addPProxy(String topicName, String clusterName, String host) throws Exception { + Topic topic = findByTopicName(topicName); + if (topic == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topic not found"); + } + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster not found"); + } + if (!validNodeExist(host, cluster)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "host not found"); + } + + List confList = topicConfService.findByTopicClusterId(topic.getId(), cluster.getId()); + if (CollectionUtils.isEmpty(confList)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topic conf not found"); + } + + addPProxy(host, confList); + + return ConsoleBaseResponse.success(); + } + + private boolean validNodeExist(String host, Cluster cluster) { + List nodeList = nodeService.findByClusterHostNodeType(cluster.getId(), host, NodeType.PRODUCER_PROXY); + if (CollectionUtils.isEmpty(nodeList)) { + String ip = HostUtils.getIp(host); + if (host.equals(ip)) { + return createPProxyNode(host, cluster); + } + nodeList = nodeService.findByClusterHostNodeType(cluster.getId(), host, NodeType.PRODUCER_PROXY); + if (CollectionUtils.isEmpty(nodeList)) { + return createPProxyNode(host, cluster); + } + } + return true; + } + + private boolean createPProxyNode(String host, Cluster cluster) { + try { + NodeBo nodeBo = new NodeBo(); + nodeBo.setClusterid(cluster.getId()); + nodeBo.setHost(host); + nodeBo.setNodetype(NodeType.PRODUCER_PROXY.getIndex()); + nodeService.create(nodeBo); + return true; + } catch (Exception e) { + LOGGER.error("create node error {}, {}", host, cluster); + return false; + } + } + + private void addPProxy(String host, List confList) throws Exception { + String ipPort = HostUtils.getIpPortFromHost(host, ZKV4ConfigServiceImpl.DEFAULT_PPROXY_PORT); + Set clusterIds = Sets.newHashSet(); + for (TopicConf topicConf : confList) { + if (topicConf.getTopicConfConfig() != null && MapUtils.isNotEmpty(topicConf.getTopicConfConfig().getProxies())) { + Map> proxyMap = topicConf.getTopicConfConfig().getProxies(); + for (Set ipLists : proxyMap.values()) { + if (ipLists.contains(ipPort)) { + continue; + } + + ipLists.add(ipPort); + clusterIds.add(topicConf.getClusterId()); + topicConfService.updateByPrimaryKey(topicConf); + pushV4ZkInfo(topicConf.getTopicId(), null); + + LOGGER.info("add pproxy {} success, topicConfId={}, topic={}", ipPort, topicConf.getId(), topicConf.getTopicName()); + } + } + } + if (CollectionUtils.isNotEmpty(clusterIds)) { + zkv4ConfigService.updatePProxyConfigByClusterId("addPProxy", clusterIds); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse removePProxy(String host) throws Exception { + List confList = topicConfService.findAll(); + removePProxy(host, confList); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse removePProxy(String topicName, String host) throws Exception { + Topic topic = findByTopicName(topicName); + if (topic == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topicName not found"); + } + List confList = topicConfService.findByTopicId(topic.getId()); + if (CollectionUtils.isEmpty(confList)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topic conf not found"); + } + removePProxy(host, confList); + + return ConsoleBaseResponse.success(); + } + + private void removePProxy(String host, List confList) throws Exception { + String ipPort = HostUtils.getIpPortFromHost(host, ZKV4ConfigServiceImpl.DEFAULT_PPROXY_PORT); + Set clusterIds = Sets.newHashSet(); + for (TopicConf topicConf : confList) { + if (topicConf.getTopicConfConfig() != null && MapUtils.isNotEmpty(topicConf.getTopicConfConfig().getProxies())) { + Map> proxyMap = topicConf.getTopicConfConfig().getProxies(); + for (Set ipLists : proxyMap.values()) { + if (ipLists.contains(ipPort)) { + ipLists.remove(ipPort); + clusterIds.add(topicConf.getClusterId()); + topicConfService.updateByPrimaryKey(topicConf); + pushV4ZkInfo(topicConf.getTopicId(), null); + + LOGGER.info("remove pproxy {} success, topicConfId={}, topic={}", ipPort, topicConf.getId(), topicConf.getTopicName()); + } + } + } + } + if (CollectionUtils.isNotEmpty(clusterIds)) { + zkv4ConfigService.updatePProxyConfigByClusterId("removePProxy", clusterIds); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse create(TopicOrderBo topicOrderBo) throws Exception { + ConsoleBaseResponse validateBo = validateTopicBo(topicOrderBo); + if (!validateBo.isSuccess()) { + return validateBo; + } + + Topic topic = topicOrderBo.buildTopic(); + List confList = topicOrderBo.buildTopicConf(); + Set clusterIdSet = Sets.newHashSet(); + Set dbClusterIdSet = Sets.newHashSet(); + Set changedClusterIdSet = Sets.newHashSet(); + + Map newClusterMqserverMap = Maps.newHashMap(); + Map oldClusterMqserverMap = Maps.newHashMap(); + Map newConfBoMap = Maps.newHashMap(); + topicOrderBo.getConf().forEach(conf -> newConfBoMap.put(getClusterMqserverIdKey(conf.getClusterId(), conf.getMqServerId()), conf)); + + confList.forEach(conf -> { + conf.setId(null); + conf.setIsDelete(IsDelete.NO.getIndex()); + conf.setCreateTime(new Date()); + conf.setState(IsEnable.ENABLE.getIndex()); + + newClusterMqserverMap.put(getClusterMqserverIdKey(conf.getClusterId(), conf.getMqServerId()), conf); + clusterIdSet.add(conf.getClusterId()); + }); + changedClusterIdSet.addAll(clusterIdSet); + + if (!topicOrderBo.isModify()) { + topic.setId(null); + topic.setIsDelete(IsDelete.NO.getIndex()); + topic.setCreateTime(new Date()); + topic.setState(IsEnable.ENABLE.getIndex()); + topic.setTopicConfig(new TopicConfig()); + + topicMapper.insertSelective(topic); + + for (TopicConf conf : confList) { + conf.setTopicId(topic.getId()); + setProxies(conf); + topicConfService.insert(conf); + } + } else { + Topic dbTopic = findById(topic.getId()); + if (dbTopic == null || dbTopic.getIsDelete() == IsDelete.YES.getIndex()) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topicId<" + topic.getId() + "> not found"); + } + topic.setTopicConfig(dbTopic.getTopicConfig() == null ? new TopicConfig() : dbTopic.getTopicConfig()); + + List dbConfList = topicConfService.findByTopicId(topic.getId()); + if (CollectionUtils.isNotEmpty(dbConfList)) { + dbConfList.forEach(conf -> { + dbClusterIdSet.add(conf.getClusterId()); + oldClusterMqserverMap.put(getClusterMqserverIdKey(conf.getClusterId(), conf.getMqServerId()), conf); + }); + } + + changedClusterIdSet.addAll(dbClusterIdSet); + + topicMapper.updateByPrimaryKeySelective(topic); + + for (Map.Entry entry : newClusterMqserverMap.entrySet()) { + String key = entry.getKey(); + TopicConf newConf = entry.getValue(); + if (oldClusterMqserverMap.containsKey(key)) { + newConf.setId(oldClusterMqserverMap.get(key).getId()); + newConf.setTopicConfig(oldClusterMqserverMap.get(key).getTopicConfConfig()); + topicConfService.updateByPrimaryKey(newConf); + oldClusterMqserverMap.remove(key); + } else { + setProxies(newConf); + topicConfService.insert(newConf); + } + } + + if (MapUtils.isNotEmpty(oldClusterMqserverMap)) { + topicConfService.deleteByIds(oldClusterMqserverMap.values().stream().map(TopicConf::getId).collect(Collectors.toList())); + } + + } + + Set v4ClusterSet = Sets.newHashSet(changedClusterIdSet); + Set retainClusterSet = Sets.newHashSet(dbClusterIdSet); + retainClusterSet.retainAll(clusterIdSet); + v4ClusterSet.removeAll(retainClusterSet); + pushV4ZkInfo(topic.getId(), v4ClusterSet); + return ConsoleBaseResponse.success(); + } + + private String getClusterMqserverIdKey(Long clusterId, Long mqServerId) { + return clusterId + "_" + mqServerId; + } + + private void pushV4ZkInfo(Long topicId, Set clusterIds) throws Exception { + zkv4ConfigService.updateTopicConfig(topicId, clusterIds); + } + + @Override + public Topic findByTopicName(String topicName) { + TopicCriteria tc = new TopicCriteria(); + tc.createCriteria().andTopicNameEqualTo(topicName).andIsDeleteEqualTo(IsDelete.NO.getIndex()); + List list = topicMapper.selectByExampleWithBLOBs(tc); + if (CollectionUtils.isEmpty(list)) { + return null; + } + + return list.get(0); + } + + @Override + public List findByTopicNameWithDelete(String topicName) { + TopicCriteria tc = new TopicCriteria(); + tc.createCriteria().andTopicNameEqualTo(topicName); + return topicMapper.selectByExampleWithBLOBs(tc); + } + + @Override + public List findById(List idList) { + TopicCriteria tc = new TopicCriteria(); + tc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()).andIdIn(idList); + return topicMapper.selectByExampleWithBLOBs(tc); + } + + @Override + public Topic findById(Long topicId) { + return topicMapper.selectByPrimaryKey(topicId); + } + + @Override + public List findByClusterId(Long clusterId) { + List confList = topicConfService.findByClusterId(clusterId); + if (CollectionUtils.isEmpty(confList)) { + return Collections.emptyList(); + } + + Set topicIdSet = Sets.newHashSet(); + confList.forEach(conf -> topicIdSet.add(conf.getTopicId())); + + return findById(Lists.newArrayList(topicIdSet)); + } + + private ConsoleBaseResponse> findListByPage(Long clusterId, String text, String user, Integer curPage, Integer pageSize) { + if (StringUtils.isNotEmpty(user)) { + user = user + ";"; + } + Integer totalCount = topicCustomMapper.selectCountByCondition(clusterId, user, text); + PageModel pageModel = new PageModel<>(curPage, pageSize, totalCount); + if (totalCount == 0) { + pageModel.setList(Collections.emptyList()); + return ConsoleBaseResponse.success(pageModel); + } + + List list = topicCustomMapper.selectByCondition(clusterId, user, text, pageModel.getPageIndex(), pageModel.getPageSize()); + if (CollectionUtils.isEmpty(list)) { + pageModel.setList(Collections.emptyList()); + return ConsoleBaseResponse.success(pageModel); + } + + List confList = topicConfService.findByTopicId(getTopicIdList(list)); + + pageModel.setList(Lists.newArrayList(getTopicVoMap(list, confList, true).values())); + + return ConsoleBaseResponse.success(pageModel); + } + + private List getTopicIdList(List list) { + List idList = Lists.newArrayListWithCapacity(list.size()); + list.forEach(t -> idList.add(t.getId())); + return idList; + } + + private Map getTopicVoMap(List list, List confList, Boolean needExtraParams) { + Map topicVoMap = Maps.newLinkedHashMap(); + list.forEach((topic -> { + TopicOrderVo vo = TopicOrderVo.buildTopicVo(topic); + topicVoMap.put(topic.getId(), vo); + })); + if (CollectionUtils.isNotEmpty(confList)) { + Map clusterMap = clusterService.findMap(); + + confList.forEach(conf -> { + if (topicVoMap.containsKey(conf.getTopicId())) { + try { + TopicConfVo confVo = TopicConfVo.buildTopicConfVo(conf); + confVo.setClusterDesc(clusterMap.get(conf.getClusterId()).getDescription()); + topicVoMap.get(conf.getTopicId()).addConf(confVo); + + } catch (Exception e) { + LOGGER.error("getTopicVoMap exception", e); + } + } + }); + } + return topicVoMap; + } + + @Override + public ConsoleBaseResponse findVoById(Long topicId) { + Topic topic = findById(topicId); + if (topic == null) { + return ConsoleBaseResponse.success(); + } + + List confList = topicConfService.findByTopicId(Lists.newArrayList(topicId)); + return ConsoleBaseResponse.success(getTopicVoMap(Lists.newArrayList(topic), confList, false).get(topicId)); + } + + @Override + public ConsoleBaseResponse> findAll(Long clusterId, String text, String user, Integer curPage, Integer pageSize) { + return findListByPage(clusterId, text, null, curPage, pageSize); + } + + @Override + public ConsoleBaseResponse> findAllSimple(String user) { + List list = findAllWithoutPage(); + List voList = Lists.newArrayListWithCapacity(list.size()); + list.forEach((topic -> voList.add(TopicSimpleVo.buildVo(topic)))); + return ConsoleBaseResponse.success(voList); + } + + + @Override + public List findAllWithoutPage() { + TopicCriteria tc = new TopicCriteria(); + tc.createCriteria().andIsDeleteEqualTo(IsDelete.NO.getIndex()); + tc.setOrderByClause("create_time desc"); + + return topicMapper.selectByExample(tc); + } + + @Override + public ConsoleBaseResponse> findGroup(String user, Long topicId, Long clusterId) { + List list = consumeSubscriptionService.findByTopicIdClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.success(); + } + + List voList = Lists.newArrayListWithCapacity(list.size()); + list.forEach(sub -> { + TopicListGroupVo vo = new TopicListGroupVo(); + BeanUtils.copyProperties(sub, vo); + voList.add(vo); + }); + + return ConsoleBaseResponse.success(voList); + } + + @Override + public ConsoleBaseResponse> findState(String user, Long topicId, Long clusterId) { + List confList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(confList)) { + return ConsoleBaseResponse.success(); + } + + MqServer rmqServer = null; + TopicConf topicConf = null; + for (TopicConf conf : confList) { + MqServer mqServer = mqServerService.findById(conf.getMqServerId()); + if (mqServer == null) { + continue; + } + + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + rmqServer = mqServer; + topicConf = conf; + } + } + + if (rmqServer == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "only support query RMQ cluster state"); + } + + final TopicConf conf = topicConf; + List voList = Lists.newArrayList(); + try { + TopicStatsTable topicStatsTable = rmqAdminService.queryTopicConsumeState(rmqServer.getAddr(), topicConf.getTopicName()); + topicStatsTable.getOffsetTable().forEach(((messageQueue, topicOffset) -> { + TopicStateVo vo = new TopicStateVo(); + vo.setTopicId(conf.getTopicId()); + vo.setTopicName(conf.getTopicName()); + vo.setClusterId(conf.getClusterId()); + vo.setQid(getRmqQid(conf.getClusterName(), RmqAdminServiceImpl.getNewQid(messageQueue))); + vo.setMaxOffset(topicOffset.getMaxOffset()); + vo.setMinOffset(topicOffset.getMinOffset()); + vo.setLastUpdateTime(topicOffset.getLastUpdateTimestamp() <= 0 ? "2 days ago(data is kept for 2 days only)" : DateUtil.longToString(topicOffset.getLastUpdateTimestamp(), DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS_CN)); + voList.add(vo); + })); + } catch (Exception e) { + LOGGER.error("Query Topic State Exception", e); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "no data,retry later"); + } + + return ConsoleBaseResponse.success(voList); + } + + private String getBrokerQid(String prefix, String clusterName, String qid) { + return prefix + "_" + clusterName + "_" + qid; + } + + private String getRmqQid(String clusterName, String qid) { + return getBrokerQid("R", clusterName, qid); + } + + private String getKafkaQid(String clusterName, String qid) { + return getBrokerQid("K", clusterName, qid); + } + + + @Override + public ConsoleBaseResponse findMessage(String user, Long topicId, Long clusterId) { + List confList = topicConfService.findByTopicClusterId(topicId, clusterId); + if (CollectionUtils.isEmpty(confList)) { + return ConsoleBaseResponse.success(); + } + + MqServer rmqServer = null; + TopicConf topicConf = null; + for (TopicConf conf : confList) { + MqServer mqServer = mqServerService.findById(conf.getMqServerId()); + if (mqServer == null) { + continue; + } + rmqServer = mqServer; + topicConf = conf; + } + + if (rmqServer == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "cluster info not found"); + } + + Message message = null; + try { + if (rmqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + message = rmqAdminService.queryLatestMessage(rmqServer.getAddr(), topicConf.getTopicName()); + } + } catch (Exception e) { + LOGGER.error("query Topic latest message Exception, topic=" + topicConf.getTopicName(), e); + } + + TopicMessageVo vo = new TopicMessageVo(); + vo.setTopicId(topicConf.getTopicId()); + vo.setTopicName(topicConf.getTopicName()); + vo.setClusterId(topicConf.getClusterId()); + vo.setClusterName(topicConf.getClusterName()); + + if (message == null) { + vo.setQid(""); + vo.setOffset(0L); + vo.setMsg("no msg"); + } else { + if (rmqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + vo.setQid(getRmqQid(topicConf.getClusterName(), message.getQid())); + } else { + vo.setQid(getKafkaQid(topicConf.getClusterName(), message.getQid())); + } + + vo.setOffset(message.getOffset()); + vo.setMsg(message.getBody()); + } + + return ConsoleBaseResponse.success(vo); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ZKV4ConfigServiceImpl.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ZKV4ConfigServiceImpl.java new file mode 100644 index 0000000..f81be87 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/impl/ZKV4ConfigServiceImpl.java @@ -0,0 +1,1073 @@ +package com.didi.carrera.console.service.impl; + +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.TypeReference; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.common.util.HostUtils; +import com.didi.carrera.console.config.ConsoleConfig; +import com.didi.carrera.console.dao.dict.*; +import com.didi.carrera.console.dao.model.*; +import com.didi.carrera.console.dao.model.custom.ConsumeGroupConfig; +import com.didi.carrera.console.service.*; +import com.didi.carrera.console.service.exception.ZkConfigException; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.ConsumeSubscriptionOrderBo; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.xiaojukeji.carrera.biz.ZkService; +import com.xiaojukeji.carrera.config.Actions; +import com.xiaojukeji.carrera.config.CompressType; +import com.xiaojukeji.carrera.config.ConfigurationValidator; +import com.xiaojukeji.carrera.config.v4.*; +import com.xiaojukeji.carrera.config.v4.cproxy.*; +import com.xiaojukeji.carrera.config.v4.pproxy.CarreraConfiguration; +import com.xiaojukeji.carrera.config.v4.pproxy.RocketmqConfiguration; +import com.xiaojukeji.carrera.config.v4.pproxy.TopicConfiguration; +import com.xiaojukeji.carrera.dynamic.ParameterDynamicConfig; +import com.xiaojukeji.carrera.dynamic.ParameterDynamicZookeeper; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + + +@Service +public class ZKV4ConfigServiceImpl implements ZKV4ConfigService { + private static final Logger LOGGER = LoggerFactory.getLogger(ZKV4ConfigServiceImpl.class); + + public static final int DEFAULT_BROKER_PORT = 10911; + public static final int DEFAULT_PPROXY_PORT = 9613; + public static final int DEFAULT_CPROXY_PORT = 9713; + + private static final int DEFAULT_MIN_CONCURRENCY = 1000; + + @Resource(name = "didiClusterServiceImpl") + private ClusterService clusterService; + + @Resource(name = "didiTopicServiceImpl") + private TopicService topicService; + + @Resource(name = "didiTopicConfServiceImpl") + private TopicConfService topicConfService; + + @Resource(name = "didiConsumeSubscriptionServiceImpl") + private ConsumeSubscriptionService consumeSubscriptionService; + + @Resource(name = "didiConsumeGroupServiceImpl") + private ConsumeGroupService consumeGroupService; + + @Resource(name = "didiNodeServiceImpl") + private NodeService nodeService; + + @Resource(name = "didiMqServerServiceImpl") + private MqServerService mqServerService; + + @Autowired + private ClusterMqserverRelationService mqserverRelationService; + + @Autowired + private ZkService zkService; + + private Map getMqServerMap() { + Map mqServerMap = Maps.newHashMap(); + mqServerService.findAll().forEach(mqServer -> mqServerMap.put(mqServer.getId(), mqServer)); + return mqServerMap; + } + + private Map getMqServerNameMap() { + Map mqServerMap = Maps.newHashMap(); + mqServerService.findAll().forEach(mqServer -> mqServerMap.put(mqServer.getName(), mqServer)); + return mqServerMap; + } + + private Map getClusterMap() { + Map clusterMap = Maps.newHashMap(); + clusterService.findAll().forEach(cluster -> clusterMap.put(cluster.getId(), cluster)); + return clusterMap; + } + +// @PostConstruct + public void initZkData() { + LOGGER.info("start initZkData"); + + List children = zkService.getChildren("/"); + if (CollectionUtils.isNotEmpty(children) && children.contains("carrera")) { + LOGGER.info("already inited, skip."); + return; + } + + try { + initAllZk(); + initZkPath(); + } catch (Exception e) { + LOGGER.error("failed to init zk on cluster init, possible zk not startup.", e); + } + } + + @Override + public void initZkPath() throws Exception { + ParameterDynamicZookeeper parameterDynamic = null; + try { + ParameterDynamicConfig config = new ParameterDynamicConfig(ConsoleConfig.instance().getZookeeper()); + config.setConfigCentre(true); + parameterDynamic = new ParameterDynamicZookeeper(config); + parameterDynamic.setData("/carrera/v4/config/topic", "default"); + parameterDynamic.setData("/carrera/v4/config/group", "default"); + parameterDynamic.setData("/carrera/v4/config/pproxy", "default"); + parameterDynamic.setData("/carrera/v4/config/cproxy", "default"); + parameterDynamic.setData("/carrera/v4/config/broker", "default"); + parameterDynamic.setData("/carrera/v4/config/monitor/host", "default"); + parameterDynamic.setData("/carrera/v4/config/monitor/assigned", "default"); + + LOGGER.info("init all zk path success"); + } finally { + if (parameterDynamic != null) { + parameterDynamic.shutdown(); + } + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushCproxyConfig(String host) throws Exception { + List nodeList = nodeService.findByHostNodeType(host, NodeType.CONSUMER_PROXY); + if (CollectionUtils.isEmpty(nodeList)) { + nodeList = nodeService.findByHostNodeType(HostUtils.getIp(host), NodeType.CONSUMER_PROXY); + } + + if (CollectionUtils.isEmpty(nodeList)) { + LOGGER.warn("[ZK_V4] not found cproxy node, host={}", host); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "host不存在"); + } + updateCProxyConfig(nodeList.get(0).getId()); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushPproxyConfig(String host) throws Exception { + List nodeList = nodeService.findByHostNodeType(host, NodeType.PRODUCER_PROXY); + if (CollectionUtils.isEmpty(nodeList)) { + nodeList = nodeService.findByHostNodeType(HostUtils.getIp(host), NodeType.PRODUCER_PROXY); + } + + if (CollectionUtils.isEmpty(nodeList)) { + LOGGER.warn("[ZK_V4] not found pproxy node, host={}", host); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "host不存在"); + } + updatePProxyConfig(nodeList.get(0).getId()); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushTopicConfig(String topicName) throws Exception { + Topic topic = topicService.findByTopicName(topicName); + if (topic == null) { + LOGGER.warn("[ZK_V4] not found topic, topic={}", topicName); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topic不存在"); + } + return pushTopicConfig(topic); + } + + private ConsoleBaseResponse pushTopicConfig(Topic topic) throws Exception { + List confList = topicConfService.findByTopicId(topic.getId()); + if (CollectionUtils.isEmpty(confList)) { + LOGGER.warn("[ZK_V4] not found topic conf, topic={}", topic.getTopicName()); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "topic conf不存在"); + } + updateTopicConfig(topic.getId(), confList.stream().map(TopicConf::getClusterId).collect(Collectors.toSet())); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushGroupConfig(String groupName) throws Exception { + ConsumeGroup group = consumeGroupService.findByGroupName(groupName); + if (group == null) { + LOGGER.warn("[ZK_V4] not found group, group={}", groupName); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "group不存在"); + } + return pushGroupConfig(group); + } + + private ConsoleBaseResponse pushGroupConfig(ConsumeGroup group) throws Exception { + List subList = consumeSubscriptionService.findByGroupId(group.getId()); + updateSubConfig(group.getId(), subList.stream().map(ConsumeSubscription::getClusterId).collect(Collectors.toSet())); + + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushTopicByCluster(String clusterName) throws Exception { + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群不存在"); + } + List list = topicConfService.findTopicByClusterIdWithDeleted(cluster.getId()); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群不存在topic"); + } + Set clusters = Sets.newHashSet(); + for (Long topicId : list) { + List confList = topicConfService.findByTopicId(topicId); + clusters.addAll(confList.stream().map(TopicConf::getClusterId).collect(Collectors.toSet())); + updateTopicConfig(topicId, null); + } + updatePProxyConfigByClusterId("pushTopicByCluster", clusters); + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushGroupByCluster(String clusterName) throws Exception { + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群不存在"); + } + List list = consumeGroupService.findByClusterId(cluster.getId()); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群暂无订阅"); + } + + Set clusters = Sets.newHashSet(); + for (ConsumeGroup group : list) { + List subList = consumeSubscriptionService.findByGroupId(group.getId()); + + clusters.addAll(subList.stream().map(ConsumeSubscription::getClusterId).collect(Collectors.toSet())); + updateSubConfig(group.getId(), null); + } + + updateCProxyConfigByClusterId("pushGroupByCluster", clusters); + return ConsoleBaseResponse.success(); + } + + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushPProxyByCluster(String clusterName) throws Exception { + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群不存在"); + } + List list = nodeService.findByClusterIdNodeType(cluster.getId(), NodeType.PRODUCER_PROXY); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群暂无PProxy"); + } + + for (Node node : list) { + updatePProxyConfig(node.getId()); + } + return ConsoleBaseResponse.success(); + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ConsoleBaseResponse pushCProxyByCluster(String clusterName) throws Exception { + Cluster cluster = clusterService.findByClusterName(clusterName); + if (cluster == null) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群不存在"); + } + List list = nodeService.findByClusterIdNodeType(cluster.getId(), NodeType.CONSUMER_PROXY); + if (CollectionUtils.isEmpty(list)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "集群暂无CProxy"); + } + + for (Node node : list) { + updateCProxyConfig(node.getId()); + } + return ConsoleBaseResponse.success(); + } + + @Override + public void initAllZk() throws Exception { + List topicList = topicService.findAllWithoutPage(); + for (Topic topic : topicList) { + updateTopicConfig(topic.getId(), null); + } + + List groupList = consumeGroupService.findAll(); + for (ConsumeGroup consumeGroup : groupList) { + updateSubConfig(consumeGroup.getId(), null); + } + + List nodeList = nodeService.findAll(); + for (Node node : nodeList) { + NodeType nodeType = NodeType.getByIndex(node.getNodeType()); + if (nodeType == null) { + continue; + } + switch (nodeType) { + case PRODUCER_PROXY: + updatePProxyConfig(node.getId()); + break; + case CONSUMER_PROXY: + updateCProxyConfig(node.getId()); + break; + default: + break; + } + } + + List mqServerList = mqServerService.findAll(); + for (MqServer mqServer : mqServerList) { + if (mqServer.getType() == MqServerType.ROCKETMQ.getIndex()) { + updateBrokerConfig(mqServer.getId()); + } + } + } + + @Override + public void updateTopicConfig(Long topicId, Set clusterIdSet) throws Exception { + Topic topic = topicService.findById(topicId); + if (topic == null) { + LOGGER.warn("[ZK_V4_Topic] topic not found, topicId={}", topicId); + throw new ZkConfigException(String.format("[Topic] topic not found, topicId=%s", topicId)); + } + + TopicConfig zkTopicConfig = zkService.getTopic(topic.getTopicName()); + if (topic.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn("[ZK_V4_Topic] topic is deleted, delete it from zk, topicId={}, topic={}", topicId, topic.getTopicName()); + if (zkTopicConfig != null) { + zkService.deleteTopic(topic.getTopicName()); + updatePProxyConfigByClusterId(topic.getTopicName(), clusterIdSet); + } + return; + } + List topicConfList = topicConfService.findByTopicId(topicId); + if (CollectionUtils.isEmpty(topicConfList)) { + LOGGER.warn("[ZK_V4_Topic] topic conf not found, delete topic from zk, topicId={}, topic={}", topicId, topic.getTopicName()); + if (zkTopicConfig != null) { + zkService.deleteTopic(topic.getTopicName()); + updatePProxyConfigByClusterId(topic.getTopicName(), clusterIdSet); + } + return; + } + + TopicConfig topicConfig = buildTopicConfig(topic, topicConfList); + zkService.createOrUpdateTopic(topicConfig); + updatePProxyConfigByClusterId(topic.getTopicName(), clusterIdSet); + LOGGER.debug("[ZK_V4_Topic] topic update success, topicId={}, topicConfig={}", topicId, topicConfig); + LOGGER.info("[ZK_V4_Topic] topic update success, topicId={}, topicName={}, topicConf size={}", topicId, topic.getTopicName(), topicConfList.size()); + } + + @Override + public void updatePProxyConfigByClusterId(String topic, Set clusterIdSet) throws Exception { + if (CollectionUtils.isEmpty(clusterIdSet)) { + LOGGER.warn("[ZK_V4_PProxy] clusterIdSet is empty, skip update, topic={}", topic); + return; + } + for (Long clusterId : clusterIdSet) { + List nodeList = nodeService.findByClusterIdNodeType(clusterId, NodeType.PRODUCER_PROXY); + if (CollectionUtils.isNotEmpty(nodeList)) { + for (Node node : nodeList) { + updatePProxyConfig(node.getId()); + } + } + } + } + + @Override + public void updateCProxyConfigByClusterId(String group, Set clusterIdSet) throws Exception { + if (CollectionUtils.isEmpty(clusterIdSet)) { + LOGGER.warn("[ZK_V4_CProxy] clusterIdSet is empty, skip update, group={}", group); + return; + } + for (Long clusterId : clusterIdSet) { + List nodeList = nodeService.findByClusterIdNodeType(clusterId, NodeType.CONSUMER_PROXY); + if (CollectionUtils.isNotEmpty(nodeList)) { + for (Node node : nodeList) { + updateCProxyConfig(node.getId()); + } + } + } + } + + private TopicConfig buildTopicConfig(Topic topic, List topicConfList) throws ZkConfigException { + TopicConfig topicConfig = new TopicConfig(); + topicConfig.setTopic(topic.getTopicName()); + topicConfig.setAlarmGroup(topic.getTopicAlarmGroup()); + topicConfig.setDelayTopic(topic.getDelayTopic() == TopicDelayTopic.DELAY_TOPIC.getIndex()); + topicConfig.setAutoBatch(topic.getTopicConfig().isAutoBatch()); + + if (topic.getTopicConfig().getCompressionType() == TopicCompressionType.RMQ_COMPRESSION.getIndex()) { + topicConfig.setCompressType(CompressType.PRIMORDIAL); + } else if (topic.getTopicConfig().getCompressionType() == TopicCompressionType.SNAPPY_COMPRESSION.getIndex()) { + topicConfig.setCompressType(CompressType.SNAPPY); + } + + List confList = Lists.newArrayList(); + topicConfig.setTopicUnits(confList); + + Map mqServerTypeTable = getMqServerMap(); + Map clusterTable = getClusterMap(); + + for (TopicConf conf : topicConfList) { + if (!mqServerTypeTable.containsKey(conf.getMqServerId())) { + throw new ZkConfigException(String.format("[Topic] topicConfId(%s) not found mqserver(%s)", conf.getId(), conf.getMqServerId())); + } + + if (!clusterTable.containsKey(conf.getClusterId())) { + throw new ZkConfigException(String.format("[Topic] topicConfId(%s) not found cluster(%s)", conf.getId(), conf.getClusterId())); + } + + TopicConfiguration topicConfiguration = new TopicConfiguration(); + topicConfiguration.setBrokerCluster(mqServerTypeTable.get(conf.getMqServerId()).getName()); + + if (conf.getTopicConfConfig() != null) { + if (MapUtils.isNotEmpty(conf.getTopicConfConfig().getProxies())) { + topicConfiguration.setProxies(conf.getTopicConfConfig().getProxies()); + } + } + + topicConfiguration.setTotalMaxTps(conf.getProduceTps()); + + //同一个broker下如果绑定多个proxy,分摊总tps + if (MapUtils.isNotEmpty(topicConfiguration.getProxies())) { + int totalProxies = 0; + for (Set proxySet : topicConfiguration.getProxies().values()) { + totalProxies += proxySet.size(); + } + topicConfiguration.setMaxTps((int) (Math.ceil((double) topicConfiguration.getTotalMaxTps() / (double) totalProxies))); + } + confList.add(topicConfiguration); + } + + return topicConfig; + } + + @Override + public void onlyUpdateGroupConfig(Long groupId) throws Exception { + ConsumeGroup group = consumeGroupService.findById(groupId); + if (group == null) { + LOGGER.warn("[ZK_V4_Group] group not found, groupId={}", groupId); + throw new ZkConfigException(String.format("[Group] group not found, groupId=%s", groupId)); + } + + if (group.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn("[ZK_V4_Group] group is deleted, skip update zk, groupId={}, group={}", groupId, group.getGroupName()); + return; + } + + List subList = consumeSubscriptionService.findByGroupId(groupId); + if (CollectionUtils.isEmpty(subList)) { + LOGGER.warn("[ZK_V4_Group] sub is empty, skip update zk, groupId={}, group={}", groupId, group.getGroupName()); + return; + } + + GroupConfig groupConfig = buildGroupConfig(group, subList); + zkService.createOrUpdateGroup(groupConfig); + LOGGER.debug("[ZK_V4_Group] update group success, groupId={}, groupConfig={}", groupId, groupConfig); + LOGGER.info("[ZK_V4_Group] update group success, groupId={}, group={}, sub size={}", groupId, group.getGroupName(), subList.size()); + } + + @Override + public void updateSubConfig(Long groupId, Set clusterIdSet) throws Exception { + ConsumeGroup group = consumeGroupService.findById(groupId); + if (group == null) { + LOGGER.warn("[ZK_V4_Sub] group not found, groupId={}", groupId); + throw new ZkConfigException(String.format("[Group] group not found, groupId=%s", groupId)); + } + + if (group.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn("[ZK_V4_Sub] group is deleted, delete it from zk, groupId={}, group={}", groupId, group.getGroupName()); + deleteGroupConfig(clusterIdSet, group); + return; + } + + List subList = consumeSubscriptionService.findByGroupId(groupId); + if (CollectionUtils.isEmpty(subList)) { + LOGGER.warn("[ZK_V4_Sub] sub not found, delete group from zk, groupId={}, group={}", groupId, group.getGroupName()); + deleteGroupConfig(clusterIdSet, group); + return; + } + + GroupConfig groupConfig = buildGroupConfig(group, subList); + zkService.createOrUpdateGroup(groupConfig); + updateCProxyConfigByClusterId(group.getGroupName(), clusterIdSet); + + LOGGER.debug("[ZK_V4_Sub] update group success, groupId={}, groupConfig={}", groupId, groupConfig); + LOGGER.info("[ZK_V4_Sub] update group success, groupId={}, group={}, sub size={}", groupId, group.getGroupName(), subList.size()); + } + + private void deleteGroupConfig(Set clusterIdSet, ConsumeGroup group) throws Exception { + GroupConfig zkGroupConfig = zkService.getGroup(group.getGroupName()); + if (zkGroupConfig != null) { + zkService.deleteGroup(group.getGroupName()); + updateCProxyConfigByClusterId(group.getGroupName(), clusterIdSet); + } + } + + private GroupConfig buildGroupConfig(ConsumeGroup group, List subList) throws ZkConfigException { + GroupConfig groupConfig = new GroupConfig(); + groupConfig.setGroup(group.getGroupName()); + + if (group.getConsumeGroupConfig() != null) { + ConsumeGroupConfig config = group.getConsumeGroupConfig(); + groupConfig.setAsyncThreads(config.getAsyncThreads()); + groupConfig.setRedisConfig(config.getRedisConfig()); + } + + if (MapUtils.isNotEmpty(group.getGroupExtraParams())) { + if (group.getGroupExtraParams().containsKey("asyncThreads")) { + groupConfig.setAsyncThreads(Integer.parseInt(group.getGroupExtraParams().get("asyncThreads"))); + } + } + + groupConfig.setAlarmGroup(group.getGroupAlarmGroup()); + groupConfig.setEnableAlarm(IsEnable.isEnable(group.getAlarmIsEnable())); + groupConfig.setDelayTimeThreshold(group.getAlarmDelayTime()); + groupConfig.setCommittedLagThreshold(group.getAlarmMsgLag()); + + List upstreamTopics = Lists.newArrayList(); + groupConfig.setTopics(upstreamTopics); + + Map mqServerTypeTable = getMqServerMap(); + Map clusterTable = getClusterMap(); + Map> topicConfMap = findTopicConfMap(subList); + for (ConsumeSubscription sub : subList) { + if (!clusterTable.containsKey(sub.getClusterId())) { + throw new ZkConfigException(String.format("[Group] subId(%s) not found cluster(%s)", sub.getId(), sub.getClusterId())); + } + + String topicConfMapKey = getTopicConfMapKey(sub.getTopicId(), sub.getClusterId()); + if (!topicConfMap.containsKey(topicConfMapKey) || CollectionUtils.isEmpty(topicConfMap.get(topicConfMapKey))) { + throw new ZkConfigException(String.format("[Group] subId(%s) not found topicConf, topicId=%s, clusterId=%s", sub.getId(), sub.getTopicId(), sub.getClusterId())); + } + + String mqServer = getSubExtraParamsMqServer(sub); + if (StringUtils.isNotEmpty(mqServer)) { + UpstreamTopic upstreamTopic = buildUpstreamTopic(groupConfig, sub, mqServer); + upstreamTopics.add(upstreamTopic); + continue; + } + + for (TopicConf topicConf : topicConfMap.get(topicConfMapKey)) { + if (!mqServerTypeTable.containsKey(topicConf.getMqServerId())) { + throw new ZkConfigException(String.format("[Group] subId(%s) not found mqserverId, topicConfId=%s, mqServerId=%s", sub.getId(), topicConf.getId(), topicConf.getMqServerId())); + } + + UpstreamTopic upstreamTopic = buildUpstreamTopic(groupConfig, sub, topicConf.getMqServerName()); + upstreamTopics.add(upstreamTopic); + } + } + return groupConfig; + } + + private Map> findTopicConfMap(List subList) { + Set topicIdSet = Sets.newHashSet(); + Set clusterIdSet = Sets.newHashSet(); + subList.forEach(sub -> { + topicIdSet.add(sub.getTopicId()); + clusterIdSet.add(sub.getClusterId()); + }); + + List topicConfList = topicConfService.findByTopicClusterIds(Lists.newArrayList(topicIdSet), Lists.newArrayList(clusterIdSet)); + Map> topicConfMap = Maps.newHashMap(); + if (CollectionUtils.isNotEmpty(topicConfList)) { + topicConfList.forEach(conf -> topicConfMap.computeIfAbsent(getTopicConfMapKey(conf.getTopicId(), conf.getClusterId()), s -> Lists.newArrayList()).add(conf)); + } + return topicConfMap; + } + + private String getTopicConfMapKey(Long topicId, Long clusterId) { + return topicId + "_" + clusterId; + } + + private String getSubExtraParamsMqServer(ConsumeSubscription sub) throws ZkConfigException { + if (MapUtils.isNotEmpty(sub.getSubExtraParams()) && sub.getSubExtraParams().containsKey(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER)) { + String tmpCluster = sub.getSubExtraParams().get(ConsumeSubscriptionOrderBo.SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER); + String[] arr = tmpCluster.split(";"); + for (String cluster : arr) { + if (mqServerService.findByName(cluster) == null) { + LOGGER.error("[Upstream] mqServer not found, subId={}, extraParams={}, ", sub.getId(), sub.getSubExtraParams()); + throw new ZkConfigException(String.format("[Upstream] subId<%s> not found extraParam mqserver<%s>", sub.getId(), sub.getTopicId())); + } + } + return tmpCluster; + } + + return null; + } + + public UpstreamTopic buildUpstreamTopic(GroupConfig groupConfig, ConsumeSubscription subscription, String brokerCluster) throws ZkConfigException { + UpstreamTopic upstreamTopic = new UpstreamTopic(); + + upstreamTopic.setBrokerCluster(brokerCluster); + if (subscription.getConsumeSubscriptionConfig() != null && MapUtils.isNotEmpty(subscription.getConsumeSubscriptionConfig().getProxies())) { + upstreamTopic.setProxies(Maps.newHashMap(subscription.getConsumeSubscriptionConfig().getProxies())); + } + + upstreamTopic.setTopic(subscription.getTopicName()); + upstreamTopic.setEnabled(subscription.getState() == IsEnable.ENABLE.getIndex()); + + upstreamTopic.setMaxPullBatchSize(subscription.getConsumeSubscriptionConfig().getMaxPullBatchSize()); + + upstreamTopic.setFetchThreads(subscription.getConsumeSubscriptionConfig().getFetchThreads()); + upstreamTopic.setMaxConsumeLag(subscription.getConsumeSubscriptionConfig().getMaxConsumeLag()); + + if (subscription.getAlarmType() == ConsumeSubscriptionAlarmType.EXTEND_GROUP_CONFIG.getIndex()) { + upstreamTopic.setEnableAlarm(groupConfig.isEnableAlarm()); + upstreamTopic.setDelayTimeThreshold(groupConfig.getDelayTimeThreshold()); + upstreamTopic.setCommittedLagThreshold(groupConfig.getCommittedLagThreshold()); + } else { + upstreamTopic.setEnableAlarm(IsEnable.isEnable(subscription.getAlarmIsEnable())); + upstreamTopic.setDelayTimeThreshold(subscription.getAlarmDelayTime()); + upstreamTopic.setCommittedLagThreshold(subscription.getAlarmMsgLag()); + } + + if (subscription.getSubActions().contains(Actions.ASYNC_HTTP)) { + upstreamTopic.setConcurrency(subscription.getPushMaxConcurrency()); + } else { + upstreamTopic.setConcurrency(subscription.getConsumeSubscriptionConfig().getConcurrency() < DEFAULT_MIN_CONCURRENCY ? DEFAULT_MIN_CONCURRENCY : subscription.getConsumeSubscriptionConfig().getConcurrency()); + } + + upstreamTopic.setAppendContext(subscription.getConsumeSubscriptionConfig().getAppendContext()); + upstreamTopic.setPressureTraffic(subscription.getPressureTraffic() == ConsumeSubscriptionPressureTraffic.ENABLE.getIndex()); + + upstreamTopic.setActions(subscription.getSubActions()); + if (IsEnable.isEnable(subscription.getEnableGroovy())) { + upstreamTopic.setGroovyScript(subscription.getGroovy()); + } + + upstreamTopic.setTotalMaxTps(subscription.getMaxTps()); + + if (MapUtils.isNotEmpty(upstreamTopic.getProxies())) { + int totalProxies = 0; + for (Set proxySet : upstreamTopic.getProxies().values()) { + totalProxies += proxySet.size(); + } + upstreamTopic.setMaxTps((int) (Math.ceil(upstreamTopic.getTotalMaxTps() / (double) totalProxies))); + } + upstreamTopic.setHttpMaxTps(subscription.getConsumeSubscriptionConfig().getHttpMaxTps()); + + upstreamTopic.setTimeout(subscription.getConsumeTimeout()); + upstreamTopic.setMaxRetry(subscription.getErrorRetryTimes()); + if (CollectionUtils.isNotEmpty(subscription.getSubUrls())) { + upstreamTopic.setUrls(subscription.getSubUrls()); + } + if (CollectionUtils.isNotEmpty(subscription.getSubRetryIntervals())) { + upstreamTopic.setRetryIntervals(subscription.getSubRetryIntervals()); + } + + if (IsEnable.isEnable(subscription.getEnableTransit()) && MapUtils.isNotEmpty(subscription.getSubTransit())) { + upstreamTopic.setTransit(Maps.newHashMap(subscription.getSubTransit())); + } + + if (MapUtils.isNotEmpty(subscription.getSubHttpQueryParams())) { + upstreamTopic.setQueryParams(Maps.newHashMap(subscription.getSubHttpQueryParams())); + } + if (IsEnable.isEnable(subscription.getEnableOrder())) { + upstreamTopic.setOrderKey(subscription.getOrderKey()); + } + + upstreamTopic.setHttpMethod(subscription.getHttpMethod() == null ? null : ConsumeSubscriptionHttpMethod.getByIndex(subscription.getHttpMethod()) == null ? null : ConsumeSubscriptionHttpMethod.getByIndex(subscription.getHttpMethod()).getName()); + upstreamTopic.setTokenKey(subscription.getHttpToken()); + + if (subscription.getConsumeType() == ConsumeSubscriptionConsumeType.BIG_DATA.getIndex()) { + try { + if (subscription.getBigDataType() == ConsumeSubscriptionBigDataType.HDFS.getIndex()) { + upstreamTopic.setHdfsConfiguration(FastJsonUtils.toObject(subscription.getBigDataConfig(), HdfsConfiguration.class)); + } else if (subscription.getBigDataType() == ConsumeSubscriptionBigDataType.HBASE.getIndex()) { + upstreamTopic.setHbaseconfiguration(FastJsonUtils.toObject(subscription.getBigDataConfig(), HBaseConfiguration.class)); + } else if (subscription.getBigDataType() == ConsumeSubscriptionBigDataType.REDIS.getIndex()) { + } else { + throw new ZkConfigException(String.format("[Sub] subId(%s) bigDataType error", subscription.getId())); + } + } catch (JSONException e) { + throw new ZkConfigException(String.format("[Sub] subId(%s) bigDataConfig JSON error", subscription.getId())); + } + } + + if (!upstreamTopic.getActions().contains(Actions.ASYNC) && !upstreamTopic.getActions().contains(Actions.NONBLOCKASYNC)) { + if (MapUtils.isEmpty(subscription.getSubExtraParams()) || !subscription.getSubExtraParams().containsKey(ConsumeSubscriptionOrderBo.SUB_FLAG_ACTION_IGNORE_ASYNC) || !"true".equalsIgnoreCase(subscription.getSubExtraParams().get(ConsumeSubscriptionOrderBo.SUB_FLAG_ACTION_IGNORE_ASYNC))) { + upstreamTopic.getActions().add(0, Actions.ASYNC); + } + //skip + } + + if (MapUtils.isNotEmpty(subscription.getSubExtraParams())) { + if (subscription.getSubExtraParams().containsKey("maxPullBatchSize")) { + upstreamTopic.setMaxPullBatchSize(Integer.parseInt(subscription.getSubExtraParams().get("maxPullBatchSize"))); + } + if (subscription.getSubExtraParams().containsKey("concurrency")) { + upstreamTopic.setConcurrency(Integer.parseInt(subscription.getSubExtraParams().get("concurrency"))); + } + } + + return upstreamTopic; + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void updatePProxyConfig(Long nodeId) throws Exception { + Node node = nodeService.findById(nodeId); + if (node == null) { + LOGGER.warn("[ZK_V4_PProxy] node not found, nodeId={}", nodeId); + throw new ZkConfigException(String.format("[PProxy] node not found, nodeId=%s", nodeId)); + } + + if (node.getNodeType() != NodeType.PRODUCER_PROXY.getIndex()) { + LOGGER.warn("[ZK_V4_PProxy] node isn't pproxy node, nodeId={}", nodeId); + throw new ZkConfigException(String.format("[PProxy] node isn't pproxy node, nodeId=%s", nodeId)); + } + + Cluster cluster = clusterService.findById(node.getClusterId()); + if (cluster == null || cluster.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn(String.format("[ZK_V4_PProxy] not found cluster, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + throw new ZkConfigException(String.format("[PProxy] not found cluster, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + } + + List relationList = mqserverRelationService.findByClusterId(cluster.getId(), ClusterMqServerRelationType.P_PROXY); + if (CollectionUtils.isEmpty(relationList)) { + LOGGER.warn(String.format("[ZK_V4_PProxy] not found ClusterMqserverRelation, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + throw new ZkConfigException(String.format("[PProxy] not found ClusterMqserverRelation, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + } + + String host = HostUtils.getIpPortFromHost(node.getHost(), DEFAULT_PPROXY_PORT); + PProxyConfig zkPProxyConfig = zkService.getPProxy(host); + if (node.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn("[ZK_V4_PProxy] node is deleted, delete it from zk, nodeId={}, clusterId={}, host={}", nodeId, node.getClusterId(), node.getHost()); + if (zkPProxyConfig != null) { + zkService.deletePProxy(host); + } + return; + } + + PProxyConfig pProxyConfig = buildPProxyConfig(node, host, cluster, relationList); + zkService.createOrUpdatePProxy(pProxyConfig); + if (zkPProxyConfig == null) { + updateBrokerConfigByMqserverId(relationList); + } + + LOGGER.debug("[ZK_V4_PProxy] update pproxy success, nodeId={}, host={}, clusterId={}, pProxyConfig={}", nodeId, node.getClusterId(), node.getHost(), pProxyConfig); + LOGGER.info("[ZK_V4_PProxy] update pproxy success, nodeId={}, clusterId={}, host={}", nodeId, node.getClusterId(), node.getHost()); + + } + + private PProxyConfig buildPProxyConfig(Node node, String host, Cluster cluster, List relationList) throws ZkConfigException, ConfigurationValidator.ConfigException { + PProxyConfig pProxyConfig = new PProxyConfig(); + pProxyConfig.setInstance(host); + pProxyConfig.setProxyCluster(getPProxyCluster(cluster.getName())); + pProxyConfig.setBrokerClusters(relationList.stream().map(ClusterMqserverRelation::getMqServerName).collect(Collectors.toList())); + + Map mqServerTypeTable = getMqServerNameMap(); + for (ClusterMqserverRelation relation : relationList) { + if (StringUtils.isEmpty(relation.getProxyConf()) || "{}".equals(relation.getProxyConf())) { + continue; + } + + if (!mqServerTypeTable.containsKey(relation.getMqServerName())) { + throw new ZkConfigException(String.format("[PProxy] relaion mqserverId not exist, nodeId=%s, clusterId=%s, mqserverId=%s", node.getId(), node.getClusterId(), relation.getMqServerId())); + } + + CarreraConfiguration carreraConfiguration = FastJsonUtils.toObject(relation.getProxyConf(), new TypeReference() { + }); + if (carreraConfiguration == null || !carreraConfiguration.validate()) { + throw new ZkConfigException(String.format("[PProxy] CarreraConfiguration get failed, nodeId=%s, clusterId=%s, relationId=%s", node.getId(), node.getClusterId(), relation.getId())); + + } + + if (MapUtils.isNotEmpty(carreraConfiguration.getRocketmqConfigurationMap())) { + for (Map.Entry entry : carreraConfiguration.getRocketmqConfigurationMap().entrySet()) { + String brokerCluster = entry.getKey(); + RocketmqConfiguration conf = entry.getValue(); + + if (!mqServerTypeTable.containsKey(brokerCluster)) { + throw new ZkConfigException(String.format("[PProxy] CarreraConfiguration rocketmq config brokerCluster not found, nodeId=%s, clusterId=%s, relationId=%s, brokerCluster=%s", node.getId(), node.getClusterId(), relation.getId(), brokerCluster)); + } + + MqServer mqServer = mqServerTypeTable.get(brokerCluster); + conf.setNamesrvAddrs(Lists.newArrayList(mqServer.getAddr().split(";"))); + } + } + + pProxyConfig.setCarreraConfiguration(carreraConfiguration); + break; + } + + if (pProxyConfig.getCarreraConfiguration() == null) { + throw new ZkConfigException(String.format("[PProxy] CarreraConfiguration not found, nodeId=%s, clusterId=%s", node.getId(), node.getClusterId())); + } + + Set topics = Sets.newHashSet(); + pProxyConfig.setTopics(topics); + + List topicConfList = topicConfService.findByClusterId(cluster.getId()); + if (CollectionUtils.isNotEmpty(topicConfList)) { + List topicList = topicService.findByClusterId(cluster.getId()); + Map topicMap = Maps.newHashMap(); + topicList.forEach(t -> topicMap.put(t.getId(), t)); + + for (TopicConf topicConf : topicConfList) { + if (!topicMap.containsKey(topicConf.getTopicId())) { + throw new ZkConfigException(String.format("[PProxy] clusterId(%s) not found topic, topicConfId=%s, topicId=%s", cluster.getId(), topicConf.getId(), topicConf.getTopicId())); + } + + if (!mqServerTypeTable.containsKey(topicConf.getMqServerName())) { + throw new ZkConfigException(String.format("[PProxy] clusterId(%s) not found mqserverId, topicConfId=%s, mqServerId=%s", cluster.getId(), topicConf.getId(), topicConf.getMqServerId())); + } + + if (pProxyConfig.getBrokerClusters().contains(topicConf.getMqServerName())) { + topics.add(topicConf.getTopicName()); + } + } + } + return pProxyConfig; + } + + private String getPProxyCluster(String clusterName) { + return "P_" + clusterName; + } + + private String getCProxyCluster(String clusterName) { + return "C_" + clusterName; + } + + private void updateBrokerConfigByMqserverId(List relationList) throws Exception { + for (ClusterMqserverRelation relation : relationList) { + updateBrokerConfig(relation.getMqServerId()); + } + } + + @Override + @Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void updateCProxyConfig(Long nodeId) throws Exception { + Node node = nodeService.findById(nodeId); + if (node == null) { + LOGGER.warn("[ZK_V4_CProxy] node not found, nodeId={}", nodeId); + throw new ZkConfigException(String.format("[CProxy] node not found, nodeId=%s", nodeId)); + } + + if (node.getNodeType() != NodeType.CONSUMER_PROXY.getIndex()) { + LOGGER.warn("[ZK_V4_CProxy] node isn't cproxy node, nodeId={}", nodeId); + throw new ZkConfigException(String.format("[CProxy] node isn't cproxy node, nodeId=%s", nodeId)); + } + + Cluster cluster = clusterService.findById(node.getClusterId()); + if (cluster == null || cluster.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn(String.format("[ZK_V4_CProxy] not found cluster, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + throw new ZkConfigException(String.format("[CProxy] not found cluster, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + } + + List relationList = mqserverRelationService.findByClusterId(cluster.getId(), ClusterMqServerRelationType.C_PROXY); + if (CollectionUtils.isEmpty(relationList)) { + LOGGER.warn(String.format("[ZK_V4_CProxy] not found ClusterMqserverRelation, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + throw new ZkConfigException(String.format("[CProxy] not found ClusterMqserverRelation, nodeId=%s, clusterId=%s", nodeId, node.getClusterId())); + } + + String host = HostUtils.getIpPortFromHost(node.getHost(), DEFAULT_CPROXY_PORT); + CProxyConfig zkCProxyConfig = zkService.getCProxy(host); + if (node.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.info("[ZK_V4_CProxy] node is deleted, delete it from zk, nodeId={}, clusterId={}, host={}", nodeId, node.getClusterId(), node.getHost()); + if (zkCProxyConfig != null) { + updateBrokerConfigByMqserverId(relationList); + zkService.deleteCProxy(host); + } + return; + } + + CProxyConfig cProxyConfig = buildCProxyConfig(host, cluster, relationList); + zkService.createOrUpdateCProxy(cProxyConfig); + if (zkCProxyConfig == null) { + updateBrokerConfigByMqserverId(relationList); + } + LOGGER.debug("[ZK_V4_CProxy] update cproxy success, nodeId={}, clusterId={}, host={}, cProxyConfig={}", nodeId, node.getClusterId(), node.getHost(), cProxyConfig); + LOGGER.info("[ZK_V4_CProxy] update cproxy success, nodeId={}, clusterId={}, host={}", nodeId, node.getClusterId(), node.getHost()); + } + + private CProxyConfig buildCProxyConfig(String host, Cluster cluster, List relationList) throws ZkConfigException { + CProxyConfig cProxyConfig = new CProxyConfig(); + cProxyConfig.setInstance(host); + cProxyConfig.setProxyCluster(getCProxyCluster(cluster.getName())); + cProxyConfig.setBrokerClusters(relationList.stream().map(ClusterMqserverRelation::getMqServerName).collect(Collectors.toList())); + + Map> pproxies = Maps.newHashMap(); + + List pNodes = nodeService.findByClusterIdNodeType(cluster.getId(), NodeType.PRODUCER_PROXY); + if (CollectionUtils.isNotEmpty(pNodes)) { + for (Node pNode : pNodes) { + pproxies.computeIfAbsent(getPProxyCluster(cluster.getName()), s -> Sets.newHashSet()).add(pNode.getHost() + ":" + DEFAULT_PPROXY_PORT); + } + } + + Map mqServerTypeTable = getMqServerMap(); + Map kafkaConfigs = Maps.newHashMap(); + Map rocketmqConfigs = Maps.newHashMap(); + + cProxyConfig.setKafkaConfigs(kafkaConfigs); + cProxyConfig.setRocketmqConfigs(rocketmqConfigs); + for (ClusterMqserverRelation relation : relationList) { + if (!mqServerTypeTable.containsKey(relation.getMqServerId())) { + throw new ZkConfigException(String.format("[CProxy] relationId<%s> not found mqServerId<%s>", relation.getId(), relation.getMqServerId())); + } + + MqServer mqServer = mqServerTypeTable.get(relation.getMqServerId()); + + if (mqServerTypeTable.get(relation.getMqServerId()).getType() == MqServerType.ROCKETMQ.getIndex()) { + rocketmqConfigs.put(mqServer.getName(), getCproxyRocketmqConfiguration(mqServer, relation)); + } else { + kafkaConfigs.put(mqServer.getName(), getCproxyKafkaConfiguration(mqServer, relation)); + } + } + + cProxyConfig.setThriftServer(new ConsumeServerConfiguration()); + Set groups = Sets.newHashSet(); + cProxyConfig.setGroups(groups); + + List groupList = consumeGroupService.findByClusterId(cluster.getId()); + Map groupMap = Maps.newHashMap(); + groupList.forEach(group -> groupMap.put(group.getId(), group)); + + List subList = consumeSubscriptionService.findEnableByClusterId(cluster.getId()); + if (CollectionUtils.isNotEmpty(subList)) { + Map> topicConfMap = findTopicConfMap(subList); + for (ConsumeSubscription sub : subList) { + String topicConfMapKey = getTopicConfMapKey(sub.getTopicId(), sub.getClusterId()); + if (!topicConfMap.containsKey(topicConfMapKey) || CollectionUtils.isEmpty(topicConfMap.get(topicConfMapKey))) { + throw new ZkConfigException(String.format("[CProxy] subId(%s) not found topicConf, topicId=%s, clusterId=%s", sub.getId(), sub.getTopicId(), sub.getClusterId())); + } + + if (!groupMap.containsKey(sub.getGroupId())) { + throw new ZkConfigException(String.format("[CProxy] subId(%s) not found group, groupId=%s", sub.getId(), sub.getGroupId())); + } + for (TopicConf topicConf : topicConfMap.get(topicConfMapKey)) { + if (cProxyConfig.getBrokerClusters().contains(topicConf.getMqServerName())) { + groups.add(sub.getGroupName()); + } + } + } + } + return cProxyConfig; + } + + private KafkaConfiguration getCproxyKafkaConfiguration(MqServer mqServer, ClusterMqserverRelation relation) throws ZkConfigException { + KafkaConfiguration kafkaConfig = FastJsonUtils.toObject(relation.getProxyConf(), KafkaConfiguration.class); + if (kafkaConfig == null) { + LOGGER.warn("[CProxy] kafka cproxyConf convert failed, relationId={}, cproxyConf={}", relation.getId(), relation.getProxyConf()); + throw new ZkConfigException(String.format("[CProxy] relationId<%s> invalid kafka cproxyConf", relation.getId())); + } + + kafkaConfig.setClusterName(mqServer.getName()); + kafkaConfig.setZookeeperAddr(mqServer.getAddr()); + return kafkaConfig; + } + + private com.xiaojukeji.carrera.config.v4.cproxy.RocketmqConfiguration getCproxyRocketmqConfiguration(MqServer mqServer, ClusterMqserverRelation relation) throws ZkConfigException { + com.xiaojukeji.carrera.config.v4.cproxy.RocketmqConfiguration rocketmqConfig = FastJsonUtils.toObject(relation.getProxyConf(), com.xiaojukeji.carrera.config.v4.cproxy.RocketmqConfiguration.class); + if (rocketmqConfig == null) { + LOGGER.warn("[CProxy] rmq cproxyConf convert failed, relationId={}, cproxyConf={}", relation.getId(), relation.getProxyConf()); + throw new ZkConfigException(String.format("[CProxy] relationId<%s> invalid rmq cproxyConf", relation.getId())); + } + + rocketmqConfig.setClusterName(mqServer.getName()); + rocketmqConfig.setNamesrvAddrs(Lists.newArrayList(mqServer.getAddr().split(";"))); + return rocketmqConfig; + } + + + @Override + public void updateBrokerConfig(Long mqServerId) throws Exception { + MqServer mqServer = mqServerService.findById(mqServerId); + if (mqServer == null) { + LOGGER.warn("[ZK_V4_Broker] mqServer not found, mqServerId={}", mqServerId); + throw new ZkConfigException(String.format("[Broker] mqServer not found, mqServerId=%s", mqServerId)); + } + + if (mqServer.getIsDelete() == IsDelete.YES.getIndex()) { + LOGGER.warn("[ZK_V4_Broker] mqServer is deleted, delete it from zk, mqServerId={}, mqServer={}", mqServerId, mqServer.getName()); + zkService.deleteBroker(mqServer.getName()); + return; + } + + BrokerConfig brokerConfig = new BrokerConfig(); + brokerConfig.setBrokerCluster(mqServer.getName()); + brokerConfig.setBrokerClusterAddrs(mqServer.getAddr()); + Map> brokers = Maps.newHashMap(); + Map> pproxies = Maps.newHashMap(); + Map> cproxies = Maps.newHashMap(); + brokerConfig.setBrokers(brokers); + brokerConfig.setPproxies(pproxies); + brokerConfig.setCproxies(cproxies); + + List relationList = mqserverRelationService.findByMqServerId(mqServerId); + if (CollectionUtils.isEmpty(relationList)) { + zkService.createOrUpdateBroker(brokerConfig); + return; + } + + Map clusterMap = getClusterMap(); + for (ClusterMqserverRelation relation : relationList) { + Long clusterId = relation.getClusterId(); + if (!clusterMap.containsKey(clusterId)) { + LOGGER.warn("[ZK_V4_Broker] relation cluster not found, relationId={}, cluster={}", relation.getId(), relation.getClusterName()); + throw new ZkConfigException(String.format("[Broker] relation cluster not found, relationId=%s, cluster=%s", relation.getId(), relation.getClusterName())); + } + + List nodeList = nodeService.findByClusterId(clusterId); + if (CollectionUtils.isEmpty(nodeList)) { + continue; + } + + for (Node node1 : nodeList) { + if (node1.getNodeType() == NodeType.ROCKETMQ_BROKER_MASTER.getIndex()) { + String host = node1.getHost() + ":" + DEFAULT_BROKER_PORT; + if (!brokers.containsKey(host)) { + brokers.put(host, Sets.newHashSet()); + } + } + } + + for (Node node : nodeList) { + NodeType type = NodeType.getByIndex(node.getNodeType()); + if (type == null) { + throw new ZkConfigException(String.format("Unsuport Node Type, node=%s", node.toString())); + } + switch (type) { + case PRODUCER_PROXY: + pproxies.computeIfAbsent(getPProxyCluster(relation.getClusterName()), s -> Sets.newHashSet()).add(node.getHost() + ":" + DEFAULT_PPROXY_PORT); + break; + case CONSUMER_PROXY: + cproxies.computeIfAbsent(getCProxyCluster(relation.getClusterName()), s -> Sets.newHashSet()).add(node.getHost() + ":" + DEFAULT_CPROXY_PORT); + break; + case ROCKETMQ_BROKER_SLAVE: + Optional masterNode = nodeList.stream().filter(n -> node.getMasterId().equals(n.getId())).findFirst(); + if (masterNode.isPresent()) { + String key = masterNode.get().getHost() + ":" + DEFAULT_BROKER_PORT; + if (brokers.containsKey(key)) { + brokers.get(key).add(node.getHost() + ":" + DEFAULT_BROKER_PORT); + } else { + LOGGER.warn("[ZK_V4_Broker] brokers can't find master node<{}>, curNode<{}>", key, node.getId()); + throw new ZkConfigException("slave node:" + node.getId() + " can't find master node:" + key); + } + } else { + LOGGER.warn("[ZK_V4_Broker] slave node<{}> can't find master node<{}>", node.getId(), node.getMasterId()); + throw new ZkConfigException("unknown slave node:" + node.getId()); + } + break; + } + } + + zkService.createOrUpdateBroker(brokerConfig); + } + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupSearchItemVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupSearchItemVo.java new file mode 100644 index 0000000..ea79d90 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupSearchItemVo.java @@ -0,0 +1,34 @@ +package com.didi.carrera.console.service.vo; + +import java.util.List; + + +public class ConsumeGroupSearchItemVo { + + private List cluster; + private List topic; + + public List getCluster() { + return cluster; + } + + public void setCluster(List cluster) { + this.cluster = cluster; + } + + public List getTopic() { + return topic; + } + + public void setTopic(List topic) { + this.topic = topic; + } + + @Override + public String toString() { + return "ConsumeGroupSearchItemVo{" + + "cluster=" + cluster + + ", topic=" + topic + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupVo.java new file mode 100644 index 0000000..3fef984 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/ConsumeGroupVo.java @@ -0,0 +1,65 @@ +package com.didi.carrera.console.service.vo; + +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupBo; +import com.google.common.collect.Maps; +import org.apache.commons.collections4.MapUtils; +import org.springframework.beans.BeanUtils; + +import java.util.List; +import java.util.Map; + + +public class ConsumeGroupVo extends ConsumeGroupBo { + + private Integer subscriptionNum; + + private Integer subscriptionEnableNum; + + public Integer getSubscriptionNum() { + return subscriptionNum; + } + + public void setSubscriptionNum(Integer subscriptionNum) { + this.subscriptionNum = subscriptionNum; + } + + public Integer getSubscriptionEnableNum() { + return subscriptionEnableNum; + } + + public void setSubscriptionEnableNum(Integer subscriptionEnableNum) { + this.subscriptionEnableNum = subscriptionEnableNum; + } + + private static Map> getConsumeModeStringMapper(Map> mapper) { + if (MapUtils.isEmpty(mapper)) { + return null; + } + Map> stringMapper = Maps.newHashMap(); + for (Map.Entry> entry : mapper.entrySet()) { + stringMapper.put(String.valueOf(entry.getKey()), entry.getValue()); + } + return stringMapper; + } + + public static ConsumeGroupVo buildConsumeGroupVo(ConsumeGroup consumeGroup) { + ConsumeGroupVo vo = new ConsumeGroupVo(); + BeanUtils.copyProperties(consumeGroup, vo); + vo.setGroupId(consumeGroup.getId()); + vo.setAlarmGroup(consumeGroup.getGroupAlarmGroup()); + vo.setExtraParams(consumeGroup.getGroupExtraParams()); + vo.setConsumeModeMapper(getConsumeModeStringMapper(consumeGroup.getGroupConsumeModeMapper())); + vo.setSubscriptionNum(0); + vo.setSubscriptionEnableNum(0); + return vo; + } + + @Override + public String toString() { + return "ConsumeGroupVo{" + + "subscriptionNum=" + subscriptionNum + + ", subscriptionEnableNum=" + subscriptionEnableNum + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/GroupConsumeStateVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/GroupConsumeStateVo.java new file mode 100644 index 0000000..8b2a37c --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/GroupConsumeStateVo.java @@ -0,0 +1,121 @@ +package com.didi.carrera.console.service.vo; + + +public class GroupConsumeStateVo { + + private Long groupId; + + private Long topicId; + + private String topicName; + + private Long clusterId; + + private String clusterName; + + private String qid; + + private Long minOffset; + + private Long maxOffset; + + private Long consumeOffset; + + private Long lag; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getQid() { + return qid; + } + + public void setQid(String qid) { + this.qid = qid; + } + + public Long getMinOffset() { + return minOffset; + } + + public void setMinOffset(Long minOffset) { + this.minOffset = minOffset; + } + + public Long getMaxOffset() { + return maxOffset; + } + + public void setMaxOffset(Long maxOffset) { + this.maxOffset = maxOffset; + } + + public Long getConsumeOffset() { + return consumeOffset; + } + + public void setConsumeOffset(Long consumeOffset) { + this.consumeOffset = consumeOffset; + } + + public Long getLag() { + return lag; + } + + public void setLag(Long lag) { + this.lag = lag; + } + + @Override + public String toString() { + return "GroupConsumeStateVo{" + + "groupId=" + groupId + + ", topicId=" + topicId + + ", topicName='" + topicName + '\'' + + ", clusterId=" + clusterId + + ", clusterName='" + clusterName + '\'' + + ", qid='" + qid + '\'' + + ", minOffset=" + minOffset + + ", maxOffset=" + maxOffset + + ", consumeOffset=" + consumeOffset + + ", lag=" + lag + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SearchItemVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SearchItemVo.java new file mode 100644 index 0000000..02953be --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SearchItemVo.java @@ -0,0 +1,36 @@ +package com.didi.carrera.console.service.vo; + + +public class SearchItemVo { + private Long id; + private String desc; + + public SearchItemVo(Long id, String desc) { + this.id = id; + this.desc = desc; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "SearchItemVo{" + + "id=" + id + + ", desc='" + desc + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SubscriptionOrderListVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SubscriptionOrderListVo.java new file mode 100644 index 0000000..aa766c0 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/SubscriptionOrderListVo.java @@ -0,0 +1,79 @@ +package com.didi.carrera.console.service.vo; + +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.web.controller.bo.ConsumeSubscriptionOrderBo; +import com.google.common.collect.Maps; +import org.springframework.beans.BeanUtils; + + +public class SubscriptionOrderListVo extends ConsumeSubscriptionOrderBo { + + private Byte state; + + private Long idcId; + + private String idc; + + private String clusterDesc; + + public Byte getState() { + return state; + } + + public void setState(Byte state) { + this.state = state; + } + + public String getIdc() { + return idc; + } + + public void setIdc(String idc) { + this.idc = idc; + } + + public Long getIdcId() { + return idcId; + } + + public void setIdcId(Long idcId) { + this.idcId = idcId; + } + + public String getClusterDesc() { + return clusterDesc; + } + + public void setClusterDesc(String clusterDesc) { + this.clusterDesc = clusterDesc; + } + + public static SubscriptionOrderListVo buildSubscriptionListVo(ConsumeSubscription sub, Long idcId, String idc, String clusterDesc) { + SubscriptionOrderListVo vo = new SubscriptionOrderListVo(); + BeanUtils.copyProperties(sub, vo); + vo.setSubId(sub.getId()); + vo.setExtraParams(sub.getSubExtraParams()); + vo.setHttpHeaders(sub.getSubHttpHeaders()); + vo.setHttpQueryParams(sub.getSubHttpQueryParams()); + vo.setRetryIntervals(sub.getSubRetryIntervals()); + vo.setTransit(sub.getSubTransit()); + vo.setUrls(sub.getSubUrls()); + vo.setIdc(idc); + vo.setIdcId(idcId); + vo.setClusters(Maps.newHashMap()); + vo.getClusters().put(sub.getClusterName(), sub.getClusterId()); + vo.setClusterDesc(clusterDesc); + + return vo; + } + + @Override + public String toString() { + return "SubscriptionOrderListVo{" + + "state=" + state + + ", idcId=" + idcId + + ", idc='" + idc + '\'' + + ", clusterDesc='" + clusterDesc + '\'' + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicConfVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicConfVo.java new file mode 100644 index 0000000..9b090de --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicConfVo.java @@ -0,0 +1,136 @@ +package com.didi.carrera.console.service.vo; + + +import com.didi.carrera.console.dao.model.custom.CustomTopicConf; +import com.didi.carrera.console.web.controller.bo.TopicConfBo; +import org.springframework.beans.BeanUtils; + + +public class TopicConfVo extends TopicConfBo { + + private Long confId; + + private Long mqServerId; + private String mqServerName; + + + private Integer msgRealMaxSize; + private Integer msgRealAvgSize; + + private Integer weekMaxTps; + private Integer weekAvgTps; + + private Integer consumerNum; + + private String monitorUrl; + + private String clusterDesc; + + public Long getConfId() { + return confId; + } + + public void setConfId(Long confId) { + this.confId = confId; + } + + public Integer getMsgRealMaxSize() { + return msgRealMaxSize; + } + + public void setMsgRealMaxSize(Integer msgRealMaxSize) { + this.msgRealMaxSize = msgRealMaxSize; + } + + public Integer getMsgRealAvgSize() { + return msgRealAvgSize; + } + + public void setMsgRealAvgSize(Integer msgRealAvgSize) { + this.msgRealAvgSize = msgRealAvgSize; + } + + public Integer getWeekMaxTps() { + return weekMaxTps; + } + + public void setWeekMaxTps(Integer weekMaxTps) { + this.weekMaxTps = weekMaxTps; + } + + public Integer getWeekAvgTps() { + return weekAvgTps; + } + + public void setWeekAvgTps(Integer weekAvgTps) { + this.weekAvgTps = weekAvgTps; + } + + public Integer getConsumerNum() { + return consumerNum; + } + + public void setConsumerNum(Integer consumerNum) { + this.consumerNum = consumerNum; + } + + public String getMonitorUrl() { + return monitorUrl; + } + + public void setMonitorUrl(String monitorUrl) { + this.monitorUrl = monitorUrl; + } + + public Long getMqServerId() { + return mqServerId; + } + + public void setMqServerId(Long mqServerId) { + this.mqServerId = mqServerId; + } + + public String getMqServerName() { + return mqServerName; + } + + public void setMqServerName(String mqServerName) { + this.mqServerName = mqServerName; + } + + public String getClusterDesc() { + return clusterDesc; + } + + public void setClusterDesc(String clusterDesc) { + this.clusterDesc = clusterDesc; + } + + public static TopicConfVo buildTopicConfVo(CustomTopicConf conf) { + TopicConfVo confVo = new TopicConfVo(); + BeanUtils.copyProperties(conf, confVo); + confVo.setClientIdcMap(conf.getTopicConfClientIdc()); + confVo.setMsgRealAvgSize(0); + confVo.setMsgRealMaxSize(0); + confVo.setWeekAvgTps(0); + confVo.setWeekMaxTps(0); + + return confVo; + } + + @Override + public String toString() { + return "TopicConfVo{" + + "confId=" + confId + + ", mqServerId=" + mqServerId + + ", mqServerName='" + mqServerName + '\'' + + ", msgRealMaxSize=" + msgRealMaxSize + + ", msgRealAvgSize=" + msgRealAvgSize + + ", weekMaxTps=" + weekMaxTps + + ", weekAvgTps=" + weekAvgTps + + ", consumerNum=" + consumerNum + + ", monitorUrl='" + monitorUrl + '\'' + + ", clusterDesc='" + clusterDesc + '\'' + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicListGroupVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicListGroupVo.java new file mode 100644 index 0000000..f9c2402 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicListGroupVo.java @@ -0,0 +1,68 @@ +package com.didi.carrera.console.service.vo; + +import java.util.Date; + + +public class TopicListGroupVo { + + private Long groupId; + + private String groupName; + + private String contacters; + + private Date createTime; + + private Byte state; + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getContacters() { + return contacters; + } + + public void setContacters(String contacters) { + this.contacters = contacters; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Byte getState() { + return state; + } + + public void setState(Byte state) { + this.state = state; + } + + @Override + public String toString() { + return "TopicListGroupVo{" + + "groupId=" + groupId + + ", groupName='" + groupName + '\'' + + ", contacters='" + contacters + '\'' + + ", createTime=" + createTime + + ", state=" + state + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicMessageVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicMessageVo.java new file mode 100644 index 0000000..f78c785 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicMessageVo.java @@ -0,0 +1,88 @@ +package com.didi.carrera.console.service.vo; + + +public class TopicMessageVo { + + private Long topicId; + + private String topicName; + + private Long clusterId; + + private String clusterName; + + private String qid; + + private Long offset; + + private String msg; + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getQid() { + return qid; + } + + public void setQid(String qid) { + this.qid = qid; + } + + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + @Override + public String toString() { + return "TopicMessageVo{" + + "topicId=" + topicId + + ", topicName='" + topicName + '\'' + + ", clusterId=" + clusterId + + ", clusterName='" + clusterName + '\'' + + ", qid='" + qid + '\'' + + ", offset=" + offset + + ", msg='" + msg + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicOrderVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicOrderVo.java new file mode 100644 index 0000000..f966f71 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicOrderVo.java @@ -0,0 +1,30 @@ +package com.didi.carrera.console.service.vo; + +import com.didi.carrera.console.dao.model.Topic; +import com.didi.carrera.console.web.controller.bo.TopicOrderBo; +import com.google.common.collect.Lists; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.BeanUtils; + + +public class TopicOrderVo extends TopicOrderBo { + + public void addConf(TopicConfVo vo) { + if (CollectionUtils.isEmpty(getConf())) { + setConf(Lists.newArrayList()); + } + + getConf().add(vo); + } + + public static TopicOrderVo buildTopicVo(Topic topic) { + TopicOrderVo vo = new TopicOrderVo(); + BeanUtils.copyProperties(topic, vo); + vo.setTopicId(topic.getId()); + vo.setSchema(topic.getTopicSchema()); + vo.setAlarmGroup(topic.getTopicAlarmGroup()); + vo.setExtraParams(topic.getTopicExtraParams()); + + return vo; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicSimpleVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicSimpleVo.java new file mode 100644 index 0000000..0e4d2e2 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicSimpleVo.java @@ -0,0 +1,41 @@ +package com.didi.carrera.console.service.vo; + +import com.didi.carrera.console.dao.model.Topic; + + +public class TopicSimpleVo { + + private Long topicId; + private String topicName; + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + @Override + public String toString() { + return "TopicSimpleVo{" + + "topicId=" + topicId + + ", topicName='" + topicName + '\'' + + "} " + super.toString(); + } + + public static TopicSimpleVo buildVo(Topic topic) { + TopicSimpleVo vo = new TopicSimpleVo(); + vo.setTopicId(topic.getId()); + vo.setTopicName(topic.getTopicName()); + return vo; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicStateVo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicStateVo.java new file mode 100644 index 0000000..2acc6c2 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/service/vo/TopicStateVo.java @@ -0,0 +1,88 @@ +package com.didi.carrera.console.service.vo; + + +public class TopicStateVo { + + private Long topicId; + + private Long clusterId; + + private String topicName; + + private String qid; + + private Long minOffset; + + private Long maxOffset; + + private String lastUpdateTime; + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public String getQid() { + return qid; + } + + public void setQid(String qid) { + this.qid = qid; + } + + public Long getMinOffset() { + return minOffset; + } + + public void setMinOffset(Long minOffset) { + this.minOffset = minOffset; + } + + public Long getMaxOffset() { + return maxOffset; + } + + public void setMaxOffset(Long maxOffset) { + this.maxOffset = maxOffset; + } + + public String getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(String lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } + + @Override + public String toString() { + return "TopicStateVo{" + + "topicId=" + topicId + + ", clusterId=" + clusterId + + ", topicName='" + topicName + '\'' + + ", qid='" + qid + '\'' + + ", minOffset=" + minOffset + + ", maxOffset=" + maxOffset + + ", lastUpdateTime='" + lastUpdateTime + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/AbstractBaseController.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/AbstractBaseController.java new file mode 100644 index 0000000..c63e098 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/AbstractBaseController.java @@ -0,0 +1,148 @@ +package com.didi.carrera.console.web; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.didi.carrera.console.web.util.DateTimePropertyEditor; +import com.didi.carrera.console.web.util.StringPropertyEditor; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.ServletRequestDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; + + +@SuppressWarnings("rawtypes") +public abstract class AbstractBaseController { + + public Logger logger = LoggerFactory.getLogger(this.getClass()); + + public static final String DATA = "type=data"; + protected static final String MOB_REGEX = "^13[0-9]{9}$|^14[0-9]{9}$|^15[0-9]{9}$|^17[0-9]{9}$|^18[0-9]{9}$"; // 手机号校验正则 + + @InitBinder + protected void initBinder(ServletRequestDataBinder binder) { + binder.registerCustomEditor(String.class, new StringPropertyEditor()); + binder.registerCustomEditor(Date.class, new DateTimePropertyEditor()); + } + + public class MyHandlerExceptionResolver implements HandlerExceptionResolver { + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, + Exception ex) { + return new ModelAndView("exception"); + } + } + + /** + * 默认是第一页 + * + * @param request + * @return + */ + public int getPageNo(HttpServletRequest request) { + String pageNoStr = request.getParameter("pageNum"); + return StringUtils.isNotBlank(pageNoStr) ? Integer.parseInt(pageNoStr) : 1; + } + + /** + * 默认每页20条 + * + * @param request + * @return + */ + public int getPageSize(HttpServletRequest request) { + String pageSizeStr = request.getParameter("pageSize"); + return StringUtils.isNotBlank(pageSizeStr) ? Integer.parseInt(pageSizeStr) : 20; + } + + protected String getParameter(HttpServletRequest request, String para) { + String value = request.getParameter(para); + if (StringUtils.isBlank(value)) { + return ""; + } + return value.trim(); + } + + protected int getParameterInt(HttpServletRequest request, String para) { + String value = request.getParameter(para); + if (StringUtils.isBlank(value)) { + return 0; + } + if (!StringUtils.isNumeric(value)) { + return 0; + } + try { + return Integer.parseInt(value); + } catch (Exception e) { + logger.error("getParameter error"); + return 0; + } + } + + protected float getParameterFloat(HttpServletRequest request, String para) { + String value = request.getParameter(para); + if (StringUtils.isBlank(value)) { + return 0; + } + try { + return Float.valueOf(value); + } catch (Exception e) { + logger.error("getParameter error"); + return 0; + } + } + + protected long getParameterLong(HttpServletRequest request, String para) { + String value = request.getParameter(para); + if (StringUtils.isBlank(value)) { + return 0; + } + if (!StringUtils.isNumeric(value)) { + return 0; + } + try { + return Long.parseLong(value); + } catch (Exception e) { + logger.error("getParameter error" + e); + return 0; + } + } + + protected JSONObject getBodyParameter(HttpServletRequest request) { + JSONObject json = null; + byte[] bytes = new byte[1024 * 1024]; + InputStream is; + try { + is = request.getInputStream(); + + int nRead = 1; + int nTotalRead = 0; + while (nRead > 0) { + nRead = is.read(bytes, nTotalRead, bytes.length - nTotalRead); + if (nRead > 0) + nTotalRead = nTotalRead + nRead; + } + String str = new String(bytes, 0, nTotalRead, "utf-8"); + if (str.indexOf("{") == 0) { + json = JSON.parseObject(str); + } + } catch (IOException e) { + logger.error("getParameter error" + e); + } + return json; + } + + public String getBindingResultErrorInfo(BindingResult bindingResult) { + return "bind error"; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/ConsoleBaseResponse.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/ConsoleBaseResponse.java new file mode 100755 index 0000000..10feed0 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/ConsoleBaseResponse.java @@ -0,0 +1,100 @@ +package com.didi.carrera.console.web; + + +import com.alibaba.fastjson.annotation.JSONField; + + +public class ConsoleBaseResponse { + /** + * 状态 + */ + public enum Status { + + SUCCESS(0), + + INVALID_PARAM(400), + + INTERNAL_ERROR(500); + + private int code; + + Status(int code){ + this.code = code; + } + + public int getCode() { + return code; + } + } + + protected int errno; + protected String errmsg; + + private T data = null; + + public static ConsoleBaseResponse success() { + return success(null); + } + + public static ConsoleBaseResponse success(T data) { + ConsoleBaseResponse response = new ConsoleBaseResponse<>(); + response.setErrno(Status.SUCCESS.code); + response.setErrmsg("SUCCESS"); + response.setData(data); + return response; + } + + public static ConsoleBaseResponse error(Status status) { + return error(status, ""); + } + + public static ConsoleBaseResponse error(Status status, String message) { + ConsoleBaseResponse response = new ConsoleBaseResponse<>(); + response.setErrno(status.code); + response.setErrmsg(message); + return response; + } + + public ConsoleBaseResponse() { + } + + @JSONField(serialize = false) + public boolean isSuccess() { + return this.errno == Status.SUCCESS.getCode(); + } + + public void setStatus(Status status) { + if(status != null){ + this.errno = status.code; + } + } + + public void setErrno(int errno) { + this.errno = errno; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + public int getErrno() { + return errno; + } + + public String getErrmsg() { + return errmsg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "ConsoleBaseResponse [errno=" + errno + ", errmsg=" + errmsg + ", data=" + data + "]"; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/LoginInterceptor.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/LoginInterceptor.java new file mode 100644 index 0000000..80715f6 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/LoginInterceptor.java @@ -0,0 +1,58 @@ +package com.didi.carrera.console.web.controller; + +import com.didi.carrera.console.service.impl.TopicConfServiceImpl; +import com.didi.carrera.console.web.util.CookieUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Author: zanglei@didiglobal.com + * Date: 2019-10-16 + * Time: 11:59 + */ +public class LoginInterceptor implements HandlerInterceptor { + + private static final Logger LOGGER = LoggerFactory.getLogger(LoginInterceptor.class); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + LOGGER.info("uri: {}, url: {}", request.getRequestURI(), request.getRequestURL()); + if (!request.getRequestURI().startsWith("/carrera/api")) { + return true; + } + + if (request.getRequestURI().contains("login") || request.getRequestURI().contains("logout")) { + return true; + } + + Cookie[] cookies = request.getCookies(); + if (cookies == null) { + response.setStatus(401); + return false; + } else { + for (Cookie cookie : cookies) { + if (CookieUtil.cookies.contains(cookie.getValue())) { + return true; + } + } + } + response.setStatus(401); + return false; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/AcceptTopicConfBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/AcceptTopicConfBo.java new file mode 100644 index 0000000..da84e17 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/AcceptTopicConfBo.java @@ -0,0 +1,48 @@ +package com.didi.carrera.console.web.controller.bo; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import com.didi.carrera.console.dao.model.TopicConf; +import org.springframework.beans.BeanUtils; + + +public class AcceptTopicConfBo extends TopicConfBo { + + @NotNull(message = "MqServer Id不能为空") + @Min(value = 1, message = "MqServerId必须大于0") + private Long mqServerId; + + private String mqServerName; + + public Long getMqServerId() { + return mqServerId; + } + + public void setMqServerId(Long mqServerId) { + this.mqServerId = mqServerId; + } + + public String getMqServerName() { + return mqServerName; + } + + public void setMqServerName(String mqServerName) { + this.mqServerName = mqServerName; + } + + @Override + public TopicConf buildTopicConf() { + TopicConf topicConf = super.buildTopicConf(); + BeanUtils.copyProperties(this, topicConf); + return topicConf; + } + + @Override + public String toString() { + return "AcceptTopicConfBo{" + + "mqServerId=" + mqServerId + + ", mqServerName='" + mqServerName + '\'' + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseBo.java new file mode 100644 index 0000000..8918db7 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseBo.java @@ -0,0 +1,27 @@ +package com.didi.carrera.console.web.controller.bo; + +import com.alibaba.fastjson.annotation.JSONField; +import org.hibernate.validator.constraints.NotBlank; + + +public class BaseBo { + + @NotBlank(message = "当前用户不能为空") + @JSONField(serialize = false) + private String user; + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + @Override + public String toString() { + return "BaseBo{" + + "user='" + user + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseOrderBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseOrderBo.java new file mode 100644 index 0000000..06cc887 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/BaseOrderBo.java @@ -0,0 +1,59 @@ +package com.didi.carrera.console.web.controller.bo; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import com.alibaba.fastjson.annotation.JSONField; + + +public class BaseOrderBo extends BaseBo { + + public interface LocalOrderCheck { + } + + @JSONField(serialize = false) + private String orderRemark; + + @NotNull(message = "工单ID不能为空", groups = LocalOrderCheck.class) + @Min(value = 0, message = "工单ID不能小于0", groups = LocalOrderCheck.class) + @JSONField(serialize = false) + private Long orderId; + + @NotNull(message = "工单状态不能为空", groups = LocalOrderCheck.class) + @JSONField(serialize = false) + private Byte orderState; + + public String getOrderRemark() { + return orderRemark; + } + + public void setOrderRemark(String orderRemark) { + this.orderRemark = orderRemark; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Byte getOrderState() { + return orderState; + } + + public void setOrderState(Byte orderState) { + this.orderState = orderState; + } + + @Override + public String toString() { + return "BaseOrderBo{" + + "orderRemark='" + orderRemark + '\'' + + ", orderId=" + orderId + + ", orderState=" + orderState + + "} " + super.toString(); + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupBo.java new file mode 100644 index 0000000..df19a23 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupBo.java @@ -0,0 +1,269 @@ +package com.didi.carrera.console.web.controller.bo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.didi.carrera.console.dao.dict.IsEnable; +import com.didi.carrera.console.dao.model.ConsumeGroup; +import com.didi.carrera.console.dao.model.custom.ConsumeGroupConfig; +import com.didi.carrera.console.web.controller.validator.AnotherFieldEqualsSpecifiedValue; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.Range; +import org.springframework.beans.BeanUtils; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.List; +import java.util.Map; + + +@AnotherFieldEqualsSpecifiedValue.List({ + @AnotherFieldEqualsSpecifiedValue(fieldName = "consumeMode", fieldValue = "2", dependFieldName = "consumeModeMapper", message = "消费模式不能为空") +}) +public class ConsumeGroupBo extends BaseBo { + + @NotNull(message = "消费组Id不能为空") + private Long groupId; + + @Length(min = 3, max = 128, message = "消费组长度必须3-128个字符") + @Pattern(regexp = "^[cg_][a-zA-Z0-9_\\-]+$", message = "消费组必须以cg_开头,其余只能使用字母数字、下划线、减号") + private String groupName; + + @NotBlank(message = "分摊方不能为空") + private String service; + + @NotBlank(message = "部门不能为空") + private String department; + + @NotBlank(message = "负责RD不能为空") + private String contacters; + + private List alarmGroup; + + @NotNull(message = "报警级别不能为空") + @Range(min = 1, max = 3, message = "报警级别为1-3级") + private Byte alarmLevel; + + @NotNull(message = "启用报警不能为空") + @Range(min = 0, max = 1, message = "启用报警只能为0或1") + private Byte alarmIsEnable; + + @NotNull(message = "消息积压阈值不能为空") + @Min(value = 1, message = "消息积压阈值必须大于0") + private Integer alarmMsgLag; + + @NotNull(message = "消息延迟时间不能为空") + @Min(value = 1, message = "消息延迟时间必须大于0,且为整数") + private Integer alarmDelayTime; + + private Byte broadcastConsume = IsEnable.DISABLE.getIndex(); + + private Map extraParams; + + private Map operationParams; + + @NotNull(message = "消费模式不能为空") + @Range(min = 0, max = 2, message = "消费模式只能为同机房或跨机房或其他") + private Byte consumeMode; + + /** + * 自定义消费模式,map结构,key为client idc,value为cproxy idc列表 + * default = + * length = 2048 + */ + private Map> consumeModeMapper; + + public Map getOperationParams() { + return operationParams; + } + + public void setOperationParams(Map operationParams) { + this.operationParams = operationParams; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department; + } + + public String getContacters() { + return contacters; + } + + public void setContacters(String contacters) { + this.contacters = contacters; + } + + public List getAlarmGroup() { + return alarmGroup; + } + + public void setAlarmGroup(List alarmGroup) { + this.alarmGroup = alarmGroup; + } + + public Byte getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(Byte alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public Byte getAlarmIsEnable() { + return alarmIsEnable; + } + + public void setAlarmIsEnable(Byte alarmIsEnable) { + this.alarmIsEnable = alarmIsEnable; + } + + public Integer getAlarmMsgLag() { + return alarmMsgLag; + } + + public void setAlarmMsgLag(Integer alarmMsgLag) { + this.alarmMsgLag = alarmMsgLag; + } + + public Integer getAlarmDelayTime() { + return alarmDelayTime; + } + + public void setAlarmDelayTime(Integer alarmDelayTime) { + this.alarmDelayTime = alarmDelayTime; + } + + public Map getExtraParams() { + return extraParams; + } + + public void setExtraParams(Map extraParams) { + this.extraParams = extraParams; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public Byte getBroadcastConsume() { + return broadcastConsume; + } + + public void setBroadcastConsume(Byte broadcastConsume) { + this.broadcastConsume = broadcastConsume; + } + + public Byte getConsumeMode() { + return consumeMode; + } + + public void setConsumeMode(Byte consumeMode) { + this.consumeMode = consumeMode; + } + + public Map> getConsumeModeMapper() { + return consumeModeMapper; + } + + @JSONField(serialize = false) + public Map> getConsumeModeLongMapper() { + if (MapUtils.isEmpty(consumeModeMapper)) { + return null; + } + Map> mapper = Maps.newHashMap(); + for (Map.Entry> entry : consumeModeMapper.entrySet()) { + mapper.put(Long.parseLong(entry.getKey()), Lists.newArrayList(entry.getValue())); + } + return mapper; + } + + public void setConsumeModeMapper(Map> consumeModeMapper) { + this.consumeModeMapper = consumeModeMapper; + } + + @JSONField(serialize = false) + public boolean isModify() { + return groupId != null && groupId > 0; + } + + public ConsumeGroup buildConsumeGroup() { + ConsumeGroup group = new ConsumeGroup(); + BeanUtils.copyProperties(this, group); + group.setId(this.getGroupId()); + group.setGroupAlarmGroup(this.getAlarmGroup()); + group.setGroupExtraParams(this.getExtraParams()); + + String contacters = getContacters(); + if (!";".equals(contacters.substring(contacters.length() - 1))) { + setContacters(getContacters() + ";"); + group.setContacters(getContacters()); + } + return group; + } + + public static ConsumeGroupBo buildConsumeGroupBo(ConsumeGroup group) { + ConsumeGroupBo groupBo = new ConsumeGroupBo(); + BeanUtils.copyProperties(group, groupBo); + groupBo.setGroupId(group.getId()); + groupBo.setAlarmGroup(group.getGroupAlarmGroup()); + groupBo.setExtraParams(group.getGroupExtraParams()); + + if (MapUtils.isEmpty(groupBo.getOperationParams())) { + groupBo.setOperationParams(Maps.newHashMap()); + } + ConsumeGroupConfig config = group.getConsumeGroupConfig(); + groupBo.getOperationParams().put(ConsumeGroupConfig.key_asyncThreads, String.valueOf(config.getAsyncThreads())); + groupBo.getOperationParams().put(ConsumeGroupConfig.key_redisConfigStr, StringUtils.isEmpty(config.getRedisConfigStr()) ? "" : config.getRedisConfigStr()); + + return groupBo; + } + + @Override + public String toString() { + return "ConsumeGroupBo{" + + "groupId=" + groupId + + ", groupName='" + groupName + '\'' + + ", service='" + service + '\'' + + ", department='" + department + '\'' + + ", contacters='" + contacters + '\'' + + ", alarmGroup=" + alarmGroup + + ", alarmLevel=" + alarmLevel + + ", alarmIsEnable=" + alarmIsEnable + + ", alarmMsgLag=" + alarmMsgLag + + ", alarmDelayTime=" + alarmDelayTime + + ", broadcastConsume=" + broadcastConsume + + ", extraParams=" + extraParams + + ", operationParams=" + operationParams + + ", consumeMode=" + consumeMode + + ", consumeModeMapper=" + consumeModeMapper + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupResetOffsetBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupResetOffsetBo.java new file mode 100644 index 0000000..2c65595 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeGroupResetOffsetBo.java @@ -0,0 +1,110 @@ +package com.didi.carrera.console.web.controller.bo; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.Range; + + +public class ConsumeGroupResetOffsetBo { + @NotBlank(message = "当前登录用户不能为空") + private String user; + + @NotNull(message = "消费组Id不能为空") + private Long groupId; + + @NotNull(message = "topicId不能为空") + private Long topicId; + + @NotNull(message = "集群Id不能为空") + private Long clusterId; + + @NotNull(message = "重置类型不能为空") + @Range(min = 1, max = 3, message = "重置类型只能为1-3") + private Integer resetType; + + private Date resetTime; + + private String qid; + + private Long offset; + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public Integer getResetType() { + return resetType; + } + + public void setResetType(Integer resetType) { + this.resetType = resetType; + } + + public Date getResetTime() { + return resetTime; + } + + public void setResetTime(Date resetTime) { + this.resetTime = resetTime; + } + + public String getQid() { + return qid; + } + + public void setQid(String qid) { + this.qid = qid; + } + + public Long getOffset() { + return offset; + } + + public void setOffset(Long offset) { + this.offset = offset; + } + + @Override + public String toString() { + return "ConsumeGroupResetOffsetBo{" + + "user='" + user + '\'' + + ", groupId=" + groupId + + ", topicId=" + topicId + + ", clusterId=" + clusterId + + ", resetType=" + resetType + + ", resetTime=" + resetTime + + ", qid='" + qid + '\'' + + ", offset=" + offset + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionBaseBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionBaseBo.java new file mode 100644 index 0000000..66b6a0b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionBaseBo.java @@ -0,0 +1,645 @@ +package com.didi.carrera.console.web.controller.bo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.didi.carrera.console.dao.dict.ConsumeSubscriptionApiType; +import com.didi.carrera.console.dao.dict.ConsumeSubscriptionBigDataType; +import com.didi.carrera.console.dao.dict.ConsumeSubscriptionConsumeType; +import com.didi.carrera.console.dao.dict.ConsumeSubscriptionMsgPushType; +import com.didi.carrera.console.dao.dict.ConsumeSubscriptionMsgType; +import com.didi.carrera.console.dao.dict.IsEnable; +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import com.didi.carrera.console.web.controller.validator.AnotherFieldEqualsSpecifiedValue; +import com.google.common.collect.Lists; +import com.xiaojukeji.carrera.config.Actions; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.validator.constraints.Range; +import org.springframework.beans.BeanUtils; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; + + +@AnotherFieldEqualsSpecifiedValue.List({ + @AnotherFieldEqualsSpecifiedValue(fieldName = "apiType", fieldValue = "1", dependFieldName = "msgType", message = "消息类型不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "apiType", fieldValue = "1", dependFieldName = "consumeType", message = "消费类型不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "apiType", fieldValue = "1", dependFieldName = "enableOrder", message = "是否启用顺序消费不能为空"), + + @AnotherFieldEqualsSpecifiedValue(fieldName = "msgType", fieldValue = "1", dependFieldName = "enableGroovy", message = "是否启用Groovy不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "msgType", fieldValue = "1", dependFieldName = "enableTransit", message = "是否启用Transit不能为空"), + + @AnotherFieldEqualsSpecifiedValue(fieldName = "enableGroovy", fieldValue = "0", dependFieldName = "groovy", message = "groovy不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "enableTransit", fieldValue = "0", dependFieldName = "transit", message = "transit不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "enableOrder", fieldValue = "0", dependFieldName = "orderKey", message = "orderKey不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "consumeType", fieldValue = "2", dependFieldName = "urls", message = "urls不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "consumeType", fieldValue = "2", dependFieldName = "httpMethod", message = "HttpMethod不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "consumeType", fieldValue = "2", dependFieldName = "pushMaxConcurrency", message = "推送并发不能为空"), + + @AnotherFieldEqualsSpecifiedValue(fieldName = "consumeType", fieldValue = "3", dependFieldName = "bigDataType", message = "写入类型不能为空"), + @AnotherFieldEqualsSpecifiedValue(fieldName = "consumeType", fieldValue = "3", dependFieldName = "bigDataConfig", message = "写入配置不能为空") +}) +public class ConsumeSubscriptionBaseBo extends BaseOrderBo { + + @NotNull(message = "subId不能为空") + private Long subId; + + @NotNull(message = "消费组id不能为空") + private Long groupId; + private String groupName; + + @NotNull(message = "topicId不能为空") + private Long topicId; + private String topicName; + + @NotNull(message = "消费限流不能为空") + @Min(value = 1, message = "消费限流必须大于0") + private Double maxTps; + + @NotNull(message = "是否接收压测流量不能为空") + @Range(min = 0, max = 1, message = "是否接收压测流量只能是0不接收 1接收") + private Byte pressureTraffic; + + @NotNull(message = "报警类型不能为空") + @Range(min = 0, max = 1, message = "报警类型只能是继承消费组配置或单独配置") + private Byte alarmType; + + private Byte alarmIsEnable = 0; + private Integer alarmMsgLag = 10000; + private Integer alarmDelayTime = 300000; + + @NotNull(message = "是否启用lowlevel不能为空") + @Range(min = 1, max = 2, message = "是否启用lowlevel只能是1禁用 2启用") + private Byte apiType; + + private Integer consumeTimeout = 1000; + + private Integer errorRetryTimes = 3; + private List retryIntervals = Lists.newArrayList(50, 100, 150); + + @Range(min = 1, max = 3, message = "消息类型 1Json 2Text 3Bytes") + private Byte msgType = ConsumeSubscriptionMsgType.BINARY.getIndex(); + + @Range(min = 0, max = 1, message = "是否启用Groovy只能是 0启用 1禁用") + private Byte enableGroovy = IsEnable.DISABLE.getIndex(); + + @Range(min = 0, max = 1, message = "是否启用Transit只能是 0启用 1禁用") + private Byte enableTransit = IsEnable.DISABLE.getIndex(); + private String groovy; + private Map transit; + + @Range(min = 0, max = 1, message = "是否启用顺序消费只能是 0启用 1禁用") + private Byte enableOrder = IsEnable.DISABLE.getIndex(); + private String orderKey; + + @Range(min = 1, max = 3, message = "消费类型只能是 1SDK 2HTTP 3直写第三方组件") + private Byte consumeType = ConsumeSubscriptionConsumeType.SDK.getIndex(); + private List urls; + + private Byte httpMethod; + private Map httpHeaders; + private Map httpQueryParams; + + private Byte msgPushType; + private String httpToken; + private Integer pushMaxConcurrency; + + private Byte bigDataType; + private String bigDataConfig; + + private Map extraParams; + + private Map operationParams; + + private Boolean useNonBlockAsync = false; + + public Long getSubId() { + return subId; + } + + public void setSubId(Long subId) { + this.subId = subId; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public Double getMaxTps() { + return maxTps; + } + + public void setMaxTps(Double maxTps) { + this.maxTps = maxTps; + } + + public Byte getAlarmType() { + return alarmType; + } + + public void setAlarmType(Byte alarmType) { + this.alarmType = alarmType; + } + + public Byte getAlarmIsEnable() { + return alarmIsEnable; + } + + public void setAlarmIsEnable(Byte alarmIsEnable) { + this.alarmIsEnable = alarmIsEnable; + } + + public Integer getAlarmMsgLag() { + return alarmMsgLag; + } + + public void setAlarmMsgLag(Integer alarmMsgLag) { + this.alarmMsgLag = alarmMsgLag; + } + + public Integer getAlarmDelayTime() { + return alarmDelayTime; + } + + public void setAlarmDelayTime(Integer alarmDelayTime) { + this.alarmDelayTime = alarmDelayTime; + } + + public Byte getApiType() { + return apiType; + } + + public void setApiType(Byte apiType) { + this.apiType = apiType; + } + + public Integer getConsumeTimeout() { + return consumeTimeout; + } + + public void setConsumeTimeout(Integer consumeTimeout) { + this.consumeTimeout = consumeTimeout; + } + + public Integer getErrorRetryTimes() { + return errorRetryTimes; + } + + public void setErrorRetryTimes(Integer errorRetryTimes) { + this.errorRetryTimes = errorRetryTimes; + } + + public List getRetryIntervals() { + return retryIntervals; + } + + public void setRetryIntervals(List retryIntervals) { + this.retryIntervals = retryIntervals; + } + + public Byte getMsgType() { + return msgType; + } + + public void setMsgType(Byte msgType) { + this.msgType = msgType; + } + + public Byte getEnableGroovy() { + return enableGroovy; + } + + public void setEnableGroovy(Byte enableGroovy) { + this.enableGroovy = enableGroovy; + } + + public Byte getEnableTransit() { + return enableTransit; + } + + public void setEnableTransit(Byte enableTransit) { + this.enableTransit = enableTransit; + } + + public String getGroovy() { + return groovy; + } + + public void setGroovy(String groovy) { + this.groovy = groovy; + } + + public Map getTransit() { + return transit; + } + + public void setTransit(Map transit) { + this.transit = transit; + } + + public Byte getEnableOrder() { + return enableOrder; + } + + public void setEnableOrder(Byte enableOrder) { + this.enableOrder = enableOrder; + } + + public String getOrderKey() { + return orderKey; + } + + public void setOrderKey(String orderKey) { + this.orderKey = orderKey; + } + + public Byte getConsumeType() { + return consumeType; + } + + public void setConsumeType(Byte consumeType) { + this.consumeType = consumeType; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public Byte getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(Byte httpMethod) { + this.httpMethod = httpMethod; + } + + public Map getHttpHeaders() { + return httpHeaders; + } + + public void setHttpHeaders(Map httpHeaders) { + this.httpHeaders = httpHeaders; + } + + public Map getHttpQueryParams() { + return httpQueryParams; + } + + public void setHttpQueryParams(Map httpQueryParams) { + this.httpQueryParams = httpQueryParams; + } + + public Byte getMsgPushType() { + return msgPushType; + } + + public void setMsgPushType(Byte msgPushType) { + this.msgPushType = msgPushType; + } + + public String getHttpToken() { + return httpToken; + } + + public void setHttpToken(String httpToken) { + this.httpToken = httpToken; + } + + public Integer getPushMaxConcurrency() { + return pushMaxConcurrency; + } + + public void setPushMaxConcurrency(Integer pushMaxConcurrency) { + this.pushMaxConcurrency = pushMaxConcurrency; + } + + public Byte getBigDataType() { + return bigDataType; + } + + public void setBigDataType(Byte bigDataType) { + this.bigDataType = bigDataType; + } + + public String getBigDataConfig() { + return bigDataConfig; + } + + public void setBigDataConfig(String bigDataConfig) { + this.bigDataConfig = bigDataConfig; + } + + public Map getExtraParams() { + return extraParams; + } + + public void setExtraParams(Map extraParams) { + this.extraParams = extraParams; + } + + public Byte getPressureTraffic() { + return pressureTraffic; + } + + public void setPressureTraffic(Byte pressureTraffic) { + this.pressureTraffic = pressureTraffic; + } + + public Map getOperationParams() { + return operationParams; + } + + public void setOperationParams(Map operationParams) { + this.operationParams = operationParams; + } + + @JSONField(serialize = false) + public boolean isUseNonBlockAsync() { + return useNonBlockAsync; + } + + public void setUseNonBlockAsync(boolean useNonBlockAsync) { + this.useNonBlockAsync = useNonBlockAsync; + } + + @JSONField(serialize = false) + public boolean isModify() { + return subId != null && subId > 0; + } + + public ConsumeSubscription buildConsumeSubscription() { + ConsumeSubscription subscription = new ConsumeSubscription(); + BeanUtils.copyProperties(this, subscription); + subscription.setId(this.getSubId()); + subscription.setSubExtraParams(this.getExtraParams()); + subscription.setSubActions(this.buildActions()); + subscription.setSubHttpHeaders(this.getHttpHeaders()); + subscription.setSubHttpQueryParams(this.getHttpQueryParams()); + subscription.setSubRetryIntervals(this.getRetryIntervals()); + subscription.setSubTransit(this.getTransit()); + subscription.setSubUrls(this.getUrls()); + + return subscription; + } + + private void validate() { + if (msgType != null && (msgType == ConsumeSubscriptionMsgType.TEXT.getIndex() || msgType == ConsumeSubscriptionMsgType.BINARY.getIndex()) && IsEnable.isEnable(enableOrder) && StringUtils.isNotEmpty(orderKey) && !ORDER_BY_QID_KEY.equalsIgnoreCase(orderKey) && !ORDER_BY_MSGKEY_KEY.equalsIgnoreCase(orderKey)) { + throw new RuntimeException("JsonPath顺序消费只能消息格式为Json类型的使用"); + } + } + + /** + * 规则:MsgType=JSON, Transit、GroovyFilter、FormParams2、QueryParams时,Json action开头 + * MsgType != JSON, 以Async开头, + * + * @return + */ + public List buildActions() { + validate(); + + List actionList = Lists.newArrayList(); + + if (this.getApiType() == ConsumeSubscriptionApiType.LOW_LEVEL.getIndex()) { + actionList.add(Actions.LowLevel); + actionList.add(Actions.PULL_SERVER); + return actionList; + } + + if (containsHdfsAction()) { + actionList.add(Actions.ASYNC); + actionList.add(Actions.HDFS); + return actionList; + } + + if (containsHbaseAction()) { + actionList.add(Actions.ASYNC); + actionList.add(Actions.HBASE); + return actionList; + } + + //头部顺序 + if (containsJsonAction()) { + if (actionIsEnableOrderByJson()) { + actionList.add(Actions.JSON); + actionList.add(Actions.ASYNC); + } else { + actionList.add(Actions.ASYNC); + actionList.add(Actions.JSON); + } + } else { + actionList.add(Actions.ASYNC); + } + + //中部顺序 + if (containsActionOrderTransitGroovy()) { + if (containsTransitAction()) { + actionList.add(Actions.TRANSIT); + } + if (containsGroovyAction()) { + actionList.add(Actions.GROOVY); + } + } else { + if (containsGroovyAction()) { + actionList.add(Actions.GROOVY); + } + if (containsTransitAction()) { + actionList.add(Actions.TRANSIT); + } + } + + + //结尾顺序 + if (containsRedisAction()) { + actionList.add(Actions.REDIS); + } else if (containsPullServerAction()) { + actionList.add(Actions.PULL_SERVER); + } else if (containsHttpAction()) { + if (MapUtils.isNotEmpty(this.getHttpQueryParams())) { + actionList.add(Actions.QueryParams); + } + if (containsFormParamsAction()) { + actionList.add(Actions.FormParams); + } else if (containsFormParams2Action()) { + actionList.add(Actions.FormParams2); + } + + actionList.add(Actions.ASYNC_HTTP); + } + + if (containsForceSyncFlag() && containsGroovyAction() && actionList.indexOf(Actions.ASYNC) > -1) { + actionList.remove(Actions.ASYNC); + } + + int index; + if (isUseNonBlockAsync() && (index = actionList.indexOf(Actions.ASYNC)) > -1) { + actionList.set(index, Actions.NONBLOCKASYNC); + } + + return actionList; + } + + private boolean containsForceSyncFlag() { + return MapUtils.isNotEmpty(getExtraParams()) && getExtraParams().containsKey(SUB_FLAG_ACTION_IGNORE_ASYNC) && "true".equalsIgnoreCase(getExtraParams().get(SUB_FLAG_ACTION_IGNORE_ASYNC)); + } + + public static final String SUB_FLAG_ACTION_REDIS = "ACTION_REDIS"; + public static final String SUB_FLAG_ACTION_ORDER_TRANSIT_GROOVY = "ACTION_ORDER_TRANSIT_GROOVY"; + public static final String SUB_FLAG_ACTION_FORMPARAMS_HTTP_IGNORE_JSON = "FORMPARAMS_HTTP_IGNORE_JSON"; + public static final String SUB_FLAG_ACTION_FORMPARAMS2_HTTP_IGNORE_JSON = "FORMPARAMS2_HTTP_IGNORE_JSON"; + + public static final String ORDER_BY_QID_KEY = "QID"; + public static final String ORDER_BY_MSGKEY_KEY = "KEY"; + + public static final String SUB_FLAG_EXTREA_PARAMS_MQ_CLUSTER = "SUB_MQCLUSTER"; + public static final String SUB_FLAG_ACTION_IGNORE_ASYNC = "forceSync"; + + private boolean containsFormParams2Action() { + return this.getMsgPushType() != null && this.getMsgPushType() == ConsumeSubscriptionMsgPushType.FORM_PARAMS2.getIndex(); + } + + private boolean containsFormParamsAction() { + return this.getMsgPushType() != null && this.getMsgPushType() == ConsumeSubscriptionMsgPushType.FORM_PARAMS.getIndex(); + } + + private boolean containsPullServerAction() { + return this.getConsumeType() != null && this.getConsumeType() == ConsumeSubscriptionConsumeType.SDK.getIndex(); + } + + private boolean containsHttpAction() { + return this.getConsumeType() != null && this.getConsumeType() == ConsumeSubscriptionConsumeType.HTTP.getIndex(); + } + + private boolean containsHdfsAction() { + return this.getConsumeType() != null && this.getConsumeType() == ConsumeSubscriptionConsumeType.BIG_DATA.getIndex() && this.getBigDataType() != null && this.getBigDataType() == ConsumeSubscriptionBigDataType.HDFS.getIndex(); + } + + private boolean containsHbaseAction() { + return this.getConsumeType() != null && this.getConsumeType() == ConsumeSubscriptionConsumeType.BIG_DATA.getIndex() && this.getBigDataType() != null && this.getBigDataType() == ConsumeSubscriptionBigDataType.HBASE.getIndex(); + } + + private boolean containsActionOrderTransitGroovy() { + return MapUtils.isNotEmpty(this.getExtraParams()) && "true".equalsIgnoreCase(this.getExtraParams().get(SUB_FLAG_ACTION_ORDER_TRANSIT_GROOVY)); + } + + private boolean containsRedisAction() { + return MapUtils.isNotEmpty(this.getExtraParams()) && "true".equalsIgnoreCase(this.getExtraParams().get(SUB_FLAG_ACTION_REDIS)); + } + + private boolean containsFormHttpIgnoreJson() { + return MapUtils.isNotEmpty(this.getExtraParams()) && "true".equalsIgnoreCase(this.getExtraParams().get(SUB_FLAG_ACTION_FORMPARAMS_HTTP_IGNORE_JSON)); + } + + private boolean containsForm2HttpIgnoreJson() { + return MapUtils.isNotEmpty(this.getExtraParams()) && "true".equalsIgnoreCase(this.getExtraParams().get(SUB_FLAG_ACTION_FORMPARAMS2_HTTP_IGNORE_JSON)); + } + + private boolean formParamsHttpIgnoreJson() { + return containsFormParamsAction() && containsFormHttpIgnoreJson(); + } + + private boolean formParams2HttpIgnoreJson() { + return containsFormParams2Action() && containsForm2HttpIgnoreJson(); + } + + private boolean formParamsContainsJson() { + return containsHttpAction() && containsFormParamsAction() && !formParamsHttpIgnoreJson(); + } + + private boolean formParams2ContainsJson() { + return containsHttpAction() && containsFormParams2Action() && !formParams2HttpIgnoreJson(); + } + + private boolean containsJsonAction() { + return actionIsEnableOrderByJson() || containsGroovyAction() || containsTransitAction() || containsRedisAction() + || ( + (formParamsContainsJson() || formParams2ContainsJson() || (MapUtils.isNotEmpty(this.getHttpQueryParams()))) + && msgType == ConsumeSubscriptionMsgType.JSON.getIndex() + ); + } + + private boolean actionIsEnableOrderByJson() { + return IsEnable.isEnable(this.getEnableOrder()) && StringUtils.isNotEmpty(this.getOrderKey()) && !ORDER_BY_QID_KEY.equalsIgnoreCase(orderKey) && !ORDER_BY_MSGKEY_KEY.equalsIgnoreCase(this.getOrderKey()); + } + + private boolean containsTransitAction() { + return IsEnable.isEnable(this.getEnableTransit()) && MapUtils.isNotEmpty(this.getTransit()); + } + + private boolean containsGroovyAction() { + return IsEnable.isEnable(this.getEnableGroovy()) && StringUtils.isNotEmpty(this.getGroovy()); + } + + @Override + public String toString() { + return "ConsumeSubscriptionOrderBo{" + + "subId=" + subId + + ", groupId=" + groupId + + ", groupName='" + groupName + '\'' + + ", topicId=" + topicId + + ", topicName='" + topicName + '\'' + + ", maxTps=" + maxTps + + ", pressureTraffic=" + pressureTraffic + + ", alarmType=" + alarmType + + ", alarmIsEnable=" + alarmIsEnable + + ", alarmMsgLag=" + alarmMsgLag + + ", alarmDelayTime=" + alarmDelayTime + + ", apiType=" + apiType + + ", consumeTimeout=" + consumeTimeout + + ", errorRetryTimes=" + errorRetryTimes + + ", retryIntervals=" + retryIntervals + + ", msgType=" + msgType + + ", enableGroovy=" + enableGroovy + + ", enableTransit=" + enableTransit + + ", groovy='" + groovy + '\'' + + ", transit=" + transit + + ", enableOrder=" + enableOrder + + ", orderKey='" + orderKey + '\'' + + ", consumeType=" + consumeType + + ", urls=" + urls + + ", httpMethod=" + httpMethod + + ", httpHeaders=" + httpHeaders + + ", httpQueryParams=" + httpQueryParams + + ", msgPushType=" + msgPushType + + ", httpToken='" + httpToken + '\'' + + ", pushMaxConcurrency=" + pushMaxConcurrency + + ", bigDataType=" + bigDataType + + ", bigDataConfig='" + bigDataConfig + '\'' + + ", extraParams=" + extraParams + + ", operationParams=" + operationParams + + ", useNonBlockAsync=" + useNonBlockAsync + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionOrderBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionOrderBo.java new file mode 100644 index 0000000..97d6d08 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/ConsumeSubscriptionOrderBo.java @@ -0,0 +1,33 @@ +package com.didi.carrera.console.web.controller.bo; + +import com.didi.carrera.console.dao.model.ConsumeSubscription; +import org.hibernate.validator.constraints.NotEmpty; + +import java.util.Map; + + +public class ConsumeSubscriptionOrderBo extends ConsumeSubscriptionBaseBo { + + @NotEmpty(message = "集群不能为空") + private Map clusters; + + public Map getClusters() { + return clusters; + } + + public void setClusters(Map clusters) { + this.clusters = clusters; + } + + @Override + public ConsumeSubscription buildConsumeSubscription() { + return super.buildConsumeSubscription(); + } + + @Override + public String toString() { + return "ConsumeSubscriptionOrderBo{" + + "clusters=" + clusters + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/MqServerBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/MqServerBo.java new file mode 100644 index 0000000..0a0f6af --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/MqServerBo.java @@ -0,0 +1,53 @@ +package com.didi.carrera.console.web.controller.bo; + +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.Range; + + +public class MqServerBo { + + @NotBlank(message = "集群名称不能为空") + private String name; + + @NotNull(message = "集群类型不能为空") + @Range(min = 0, max = 2, message = "集群类型只能为 0:rocketmq 1:kafka 2:virtual kafka") + private Byte type; + + @NotBlank(message = "集群地址不能为空") + private String addr; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Byte getType() { + return type; + } + + public void setType(Byte type) { + this.type = type; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + @Override + public String toString() { + return "MqServerBo{" + + "name='" + name + '\'' + + ", type=" + type + + ", addr='" + addr + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/NodeBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/NodeBo.java new file mode 100644 index 0000000..14f8d49 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/NodeBo.java @@ -0,0 +1,64 @@ +package com.didi.carrera.console.web.controller.bo; + +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.Range; + + +public class NodeBo extends BaseBo { + + @NotNull(message = "集群ID不能为空") + private Long clusterid; + + @NotNull(message = "节点类型不能为空") + @Range(min = 0, max = 9, message = "节点类型只能为0-9") + private Byte nodetype; + + @NotBlank(message = "地址不能为空") + private String host; + + private Long modelid = 1L; + + public Long getClusterid() { + return clusterid; + } + + public void setClusterid(Long clusterid) { + this.clusterid = clusterid; + } + + public Byte getNodetype() { + return nodetype; + } + + public void setNodetype(Byte nodetype) { + this.nodetype = nodetype; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Long getModelid() { + return modelid; + } + + public void setModelid(Long modelid) { + this.modelid = modelid; + } + + @Override + public String toString() { + return "NodeBo{" + + "clusterid=" + clusterid + + ", nodetype=" + nodetype + + ", host='" + host + '\'' + + ", modelid=" + modelid + + "} " + super.toString(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicConfBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicConfBo.java new file mode 100644 index 0000000..cd90970 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicConfBo.java @@ -0,0 +1,130 @@ +package com.didi.carrera.console.web.controller.bo; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.util.Map; + +import com.didi.carrera.console.dao.model.TopicConf; +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.beans.BeanUtils; + + +public class TopicConfBo { + + @NotNull(message = "请选择集群配置信息") + private Long clusterId; + + @NotBlank(message = "请选择集群配置信息") + private String clusterName; + + private Long serverIdcId; + private String serverIdcName; + + private Map clientIdcMap; + + @NotNull(message = "预估最大消息体大小不能为空") + @Min(value = 1, message = "预估最大消息体大小必须大于0") + private Integer msgMaxSize; + + @NotNull(message = "预估平均消息体大小不能为空") + @Min(value = 1, message = "预估平均消息体大小必须大于0") + private Integer msgAvgSize; + + @NotNull(message = "限流不能为空") + @Min(value = 1, message = "限流必须大于0") + private Integer produceTps; + + private Map operationParams; + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public Integer getMsgMaxSize() { + return msgMaxSize; + } + + public void setMsgMaxSize(Integer msgMaxSize) { + this.msgMaxSize = msgMaxSize; + } + + public Integer getMsgAvgSize() { + return msgAvgSize; + } + + public void setMsgAvgSize(Integer msgAvgSize) { + this.msgAvgSize = msgAvgSize; + } + + public Integer getProduceTps() { + return produceTps; + } + + public void setProduceTps(Integer produceTps) { + this.produceTps = produceTps; + } + + public Map getOperationParams() { + return operationParams; + } + + public void setOperationParams(Map operationParams) { + this.operationParams = operationParams; + } + + public Long getServerIdcId() { + return serverIdcId; + } + + public void setServerIdcId(Long serverIdcId) { + this.serverIdcId = serverIdcId; + } + + public String getServerIdcName() { + return serverIdcName; + } + + public void setServerIdcName(String serverIdcName) { + this.serverIdcName = serverIdcName; + } + + public Map getClientIdcMap() { + return clientIdcMap; + } + + public void setClientIdcMap(Map clientIdcMap) { + this.clientIdcMap = clientIdcMap; + } + + public TopicConf buildTopicConf() { + TopicConf topicConf = new TopicConf(); + BeanUtils.copyProperties(this, topicConf); + topicConf.setTopicConfClientIdc(clientIdcMap); + + return topicConf; + } + + @Override + public String toString() { + return "TopicConfBo{" + + "clusterId=" + clusterId + + ", clusterName='" + clusterName + '\'' + + ", msgMaxSize=" + msgMaxSize + + ", msgAvgSize=" + msgAvgSize + + ", produceTps=" + produceTps + + ", operationParams=" + operationParams + + '}'; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicOrderBo.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicOrderBo.java new file mode 100644 index 0000000..4af66eb --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/bo/TopicOrderBo.java @@ -0,0 +1,334 @@ +package com.didi.carrera.console.web.controller.bo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.dao.dict.IsEnable; +import com.didi.carrera.console.dao.model.Topic; +import com.didi.carrera.console.dao.model.TopicConf; +import com.didi.carrera.console.dao.model.custom.TopicConfConfig; +import com.didi.carrera.console.dao.model.custom.TopicConfig; +import com.didi.carrera.console.web.controller.validator.AnotherFieldEqualsSpecifiedValue; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.apache.commons.collections.MapUtils; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; +import org.hibernate.validator.constraints.Range; +import org.springframework.beans.BeanUtils; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@AnotherFieldEqualsSpecifiedValue.List({ + @AnotherFieldEqualsSpecifiedValue(fieldName = "enableSchemaVerify", fieldValue = "0", dependFieldName = "schema", message = "schema不能为空") +}) +public class TopicOrderBo extends BaseOrderBo { + + @NotNull(message = "topicId不能为空") + private Long topicId; + + @NotBlank(message = "Topic名称不能为空") + @Length(min = 3, max = 128, message = "Topic长度必须3-128个字符") + @Pattern(regexp = "[0-9a-zA-Z_\\-]+", message = "Topic名称只能输入数字、大小写字母、下划线、减号") + private String topicName; + + @NotBlank(message = "分摊方不能为空") + private String service; + + @NotBlank(message = "部门不能为空") + private String department; + + @NotBlank(message = "负责RD不能为空") + private String contacters; + + private String schema; + + private List alarmGroup; + + @NotNull(message = "topic描述信息不能为空") + private String description; + + @Range(min = 0, max = 1, message = "启用报警只能为0或1") + private Byte alarmIsEnable = IsEnable.ENABLE.getIndex(); + + @NotNull(message = "延时Topic设置不能为空") + private Byte delayTopic; + + private Map extraParams; + + private Byte enableSchemaVerify = IsEnable.DISABLE.getIndex(); + + private Map operationParams; + + @Valid + @NotEmpty(message = "请选择集群配置信息") + private List conf; + + private Byte defaultPass = DefaultPassType.CONDITION_PASS.getIndex(); + + @NotNull(message = "生产模式不能为空") + @Range(min = 0, max = 1, message = "生产模式只能为同机房生产或其他") + private Byte produceMode; + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department; + } + + public String getContacters() { + return contacters; + } + + public void setContacters(String contacters) { + this.contacters = contacters; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public List getAlarmGroup() { + return alarmGroup; + } + + public void setAlarmGroup(List alarmGroup) { + this.alarmGroup = alarmGroup; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Map getExtraParams() { + return extraParams; + } + + public void setExtraParams(Map extraParams) { + this.extraParams = extraParams; + } + + public List getConf() { + return conf; + } + + public void setConf(List conf) { + this.conf = conf; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public Byte getDelayTopic() { + return delayTopic; + } + + public void setDelayTopic(Byte delayTopic) { + this.delayTopic = delayTopic; + } + + public Byte getAlarmIsEnable() { + return alarmIsEnable; + } + + public void setAlarmIsEnable(Byte alarmIsEnable) { + this.alarmIsEnable = alarmIsEnable; + } + + public Byte getDefaultPass() { + return defaultPass; + } + + public void setDefaultPass(Byte defaultPass) { + this.defaultPass = defaultPass; + } + + public Byte getEnableSchemaVerify() { + return enableSchemaVerify; + } + + public void setEnableSchemaVerify(Byte enableSchemaVerify) { + this.enableSchemaVerify = enableSchemaVerify; + } + + @JSONField(serialize = false) + public boolean isModify() { + return topicId != null && topicId > 0; + } + + public Map getOperationParams() { + return operationParams; + } + + public void setOperationParams(Map operationParams) { + this.operationParams = operationParams; + } + + public Byte getProduceMode() { + return produceMode; + } + + public void setProduceMode(Byte produceMode) { + this.produceMode = produceMode; + } + + public Topic buildTopic() { + Topic topic = new Topic(); + BeanUtils.copyProperties(this, topic); + topic.setId(this.getTopicId()); + topic.setTopicAlarmGroup(this.getAlarmGroup()); + topic.setTopicExtraParams(this.getExtraParams()); + topic.setTopicSchema(this.getSchema()); + + String contacters = getContacters(); + if (!";".equals(contacters.substring(contacters.length() - 1))) { + setContacters(getContacters() + ";"); + topic.setContacters(getContacters()); + } + + return topic; + } + + public static TopicOrderBo buildTopicOrderBo(Topic topic, List confs) { + TopicOrderBo topicOrderBo = new TopicOrderBo<>(); + BeanUtils.copyProperties(topic, topicOrderBo); + topicOrderBo.setTopicId(topic.getId()); + topicOrderBo.setAlarmGroup(topic.getTopicAlarmGroup()); + topicOrderBo.setExtraParams(topic.getTopicExtraParams()); + topicOrderBo.setSchema(topic.getTopicSchema()); + topicOrderBo.setDefaultPass(DefaultPassType.CONDITION_PASS.getIndex()); + // operationParams + if (MapUtils.isEmpty(topicOrderBo.getOperationParams())) { + topicOrderBo.setOperationParams(Maps.newHashMap()); + } + TopicConfig config = topic.getTopicConfig(); + topicOrderBo.getOperationParams().put(TopicConfig.key_autoBatch, String.valueOf(config.isAutoBatch())); + topicOrderBo.getOperationParams().put(TopicConfig.key_useCache, String.valueOf(config.isUseCache())); + topicOrderBo.getOperationParams().put(TopicConfig.key_compressionType, String.valueOf(config.getCompressionType())); + + List conf = Lists.newArrayListWithCapacity(confs.size()); + confs.forEach(c -> { + AcceptTopicConfBo acceptTopicConfBo = new AcceptTopicConfBo(); + BeanUtils.copyProperties(c, acceptTopicConfBo); + acceptTopicConfBo.setClientIdcMap(c.getTopicConfClientIdc()); + // operationParams + if (MapUtils.isEmpty(acceptTopicConfBo.getOperationParams())) { + acceptTopicConfBo.setOperationParams(Maps.newHashMap()); + } + TopicConfConfig conConfig = c.getTopicConfConfig(); + if (conConfig == null || MapUtils.isEmpty(conConfig.getProxies())) { + acceptTopicConfBo.getOperationParams().put(TopicConfConfig.key_proxies, ""); + } else { + acceptTopicConfBo.getOperationParams().put(TopicConfConfig.key_proxies, FastJsonUtils.toJson(conConfig.getProxies())); + } + conf.add(acceptTopicConfBo); + }); + topicOrderBo.setConf(conf); + return topicOrderBo; + } + + public List buildTopicConf() { + List list = Lists.newArrayListWithCapacity(this.getConf().size()); + this.getConf().forEach(conf -> { + TopicConf topicConf = conf.buildTopicConf(); + topicConf.setTopicId(this.getTopicId()); + topicConf.setTopicName(this.getTopicName()); + list.add(topicConf); + }); + + return list; + } + + @Override + public String toString() { + return "TopicOrderBo{" + + "topicId=" + topicId + + ", topicName='" + topicName + '\'' + + ", service='" + service + '\'' + + ", department='" + department + '\'' + + ", contacters='" + contacters + '\'' + + ", schema='" + schema + '\'' + + ", alarmGroup=" + alarmGroup + + ", description='" + description + '\'' + + ", alarmIsEnable=" + alarmIsEnable + + ", delayTopic=" + delayTopic + + ", extraParams=" + extraParams + + ", enableSchemaVerify=" + enableSchemaVerify + + ", operationParams=" + operationParams + + ", conf=" + conf + + ", defaultPass=" + defaultPass + + ", produceMode=" + produceMode + + "} " + super.toString(); + } + + public enum DefaultPassType { + + PASS((byte) 0, "直接自动审批通过"), + CONDITION_PASS((byte) 1, "符合条件自动审批通过"), + REJECT((byte) 2, "必须人工审核"); + + private byte index; + + private String name; + + DefaultPassType(byte index, String name) { + this.index = index; + this.name = name; + } + + public byte getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static DefaultPassType getByIndex(byte index) { + List all = Arrays.asList(values()); + for (DefaultPassType level : all) { + if (level.getIndex() == index) { + return level; + } + } + return null; + } + + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeGroupController.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeGroupController.java new file mode 100644 index 0000000..dab110a --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeGroupController.java @@ -0,0 +1,78 @@ +package com.didi.carrera.console.web.controller.console; + + +import com.didi.carrera.console.service.ConsumeGroupService; +import com.didi.carrera.console.web.AbstractBaseController; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupBo; +import com.didi.carrera.console.web.controller.bo.ConsumeGroupResetOffsetBo; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.validation.Valid; + + +@Controller +@RequestMapping("/api/console/group") +public class ConsumeGroupController extends AbstractBaseController { + + @Resource(name = "didiConsumeGroupServiceImpl") + private ConsumeGroupService consumeGroupService; + + @ResponseBody + @RequestMapping(value = {"/listAll"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse listAll(@RequestParam String user, String text, @RequestParam Integer curPage, @RequestParam Integer pageSize) { + return consumeGroupService.findAll(user, text, curPage, pageSize); + } + + @ResponseBody + @RequestMapping(value = {"/listAllWithoutPage"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse listAllWithoutPage(@RequestParam String user) { + return consumeGroupService.findAllWithoutPage(user); + } + + @ResponseBody + @RequestMapping(value = {"/create"}, method = {RequestMethod.POST}) + public ConsoleBaseResponse create(@Valid @RequestBody ConsumeGroupBo groupBo, BindingResult bindingResult) throws Exception { + if (bindingResult.hasErrors()) { + String msg = getBindingResultErrorInfo(bindingResult); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, msg); + } + + return consumeGroupService.create(groupBo); + } + + @ResponseBody + @RequestMapping(value = {"/changeState"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse changeState(@RequestParam String user, @RequestParam Long groupId, @RequestParam Integer state) throws Exception { + return consumeGroupService.changeState(user, groupId, state); + } + + @ResponseBody + @RequestMapping(value = {"/consumeState"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse consumeState(@RequestParam String user, @RequestParam Long groupId, @RequestParam(required = false) Long topicId, @RequestParam(required = false) Long clusterId) { + return consumeGroupService.getConsumeState(user, groupId, topicId, clusterId); + } + + @ResponseBody + @RequestMapping(value = {"/consumeState/searchItemList"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse consumeStateSearchItemList(@RequestParam String user, @RequestParam Long groupId) { + return consumeGroupService.findSearchItem(user, groupId); + } + + @ResponseBody + @RequestMapping(value = {"/resetOffset"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse resetOffset(@Valid ConsumeGroupResetOffsetBo offsetBo, BindingResult bindingResult) throws Exception { + if (bindingResult.hasErrors()) { + String msg = getBindingResultErrorInfo(bindingResult); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, msg); + } + return consumeGroupService.resetOffset(offsetBo); + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeSubscriptionController.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeSubscriptionController.java new file mode 100644 index 0000000..2756c38 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/ConsumeSubscriptionController.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.web.controller.console; + + +import com.didi.carrera.console.service.ConsumeSubscriptionService; +import com.didi.carrera.console.web.AbstractBaseController; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; + + +@Controller +@RequestMapping("/api/console/sub") +public class ConsumeSubscriptionController extends AbstractBaseController { + + @Resource(name = "didiConsumeSubscriptionServiceImpl") + private ConsumeSubscriptionService consumeSubscriptionService; + + @ResponseBody + @RequestMapping(value = {"/list"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse list(@RequestParam String user, String text, Long clusterId, Long groupId, Integer consumeType, Integer state, @RequestParam Integer curPage, @RequestParam Integer pageSize) { + return consumeSubscriptionService.findAll(user, text, clusterId, groupId, consumeType, state, curPage, pageSize); + } + + @ResponseBody + @RequestMapping(value = {"/findById"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse findByGroupTopicCluster(@RequestParam String user, @RequestParam Long groupId, @RequestParam Long topicId, @RequestParam Long clusterId) { + return consumeSubscriptionService.findByGroupClusterTopicId(groupId, clusterId, topicId); + } + + @ResponseBody + @RequestMapping(value = {"/listMsgPushType"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse listMsgPushType(@RequestParam String user) { + return consumeSubscriptionService.findMsgPushType(user); + } + + @ResponseBody + @RequestMapping(value = {"/changeState"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse changeState(@RequestParam String user, @RequestParam Long subId, @RequestParam Integer state) throws Exception { + return consumeSubscriptionService.changeState(user, subId, state); + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/TopicController.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/TopicController.java new file mode 100644 index 0000000..edd5de1 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/console/TopicController.java @@ -0,0 +1,58 @@ +package com.didi.carrera.console.web.controller.console; + + +import com.didi.carrera.console.service.TopicService; +import com.didi.carrera.console.web.AbstractBaseController; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; + + +@Controller +@RequestMapping("/api/console/topic") +public class TopicController extends AbstractBaseController { + + @Resource(name = "didiTopicServiceImpl") + private TopicService topicService; + + @ResponseBody + @RequestMapping(value = {"/listAll"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse listAll(@RequestParam(defaultValue = "0") Long clusterId, String text, @RequestParam String user, @RequestParam Integer curPage, @RequestParam Integer pageSize) { + return topicService.findAll(clusterId, text, user, curPage, pageSize); + } + + @ResponseBody + @RequestMapping(value = {"/listAllWithoutPage"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse listAllWithoutPage(@RequestParam String user) { + return topicService.findAllSimple(user); + } + + @ResponseBody + @RequestMapping(value = {"/findById"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse findById(@RequestParam Long topicId, @RequestParam String user) { + return topicService.findVoById(topicId); + } + + @ResponseBody + @RequestMapping(value = {"/getState"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse getState(@RequestParam String user, @RequestParam Long topicId, @RequestParam Long clusterId) { + return topicService.findState(user, topicId, clusterId); + } + + @ResponseBody + @RequestMapping(value = {"/getMessage"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse getMessage(@RequestParam String user, @RequestParam Long topicId, @RequestParam Long clusterId) { + return topicService.findMessage(user, topicId, clusterId); + } + + @ResponseBody + @RequestMapping(value = {"/listGroup"}, method = {RequestMethod.GET, RequestMethod.POST}) + public ConsoleBaseResponse listGroup(@RequestParam String user, @RequestParam Long topicId, @RequestParam Long clusterId) { + return topicService.findGroup(user, topicId, clusterId); + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/odin/InternalController.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/odin/InternalController.java new file mode 100644 index 0000000..1f4fc4c --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/odin/InternalController.java @@ -0,0 +1,235 @@ +package com.didi.carrera.console.web.controller.odin; + + +import com.didi.carrera.console.config.ConsoleConfig; +import com.didi.carrera.console.service.ClusterService; +import com.didi.carrera.console.service.ConsumeGroupService; +import com.didi.carrera.console.service.ConsumeSubscriptionService; +import com.didi.carrera.console.service.TopicService; +import com.didi.carrera.console.service.ZKV4ConfigService; +import com.didi.carrera.console.web.AbstractBaseController; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import com.didi.carrera.console.web.controller.bo.AcceptTopicConfBo; +import com.didi.carrera.console.web.controller.bo.ConsumeSubscriptionOrderBo; +import com.didi.carrera.console.web.controller.bo.TopicOrderBo; +import com.didi.carrera.console.web.util.CookieUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + + +@Controller("odinInternalController") +@RequestMapping("/api/odin/internal") +public class InternalController extends AbstractBaseController { + + @Resource(name = "didiTopicServiceImpl") + private TopicService topicService; + + @Resource(name = "didiConsumeGroupServiceImpl") + private ConsumeGroupService consumeGroupService; + + @Resource(name = "didiConsumeSubscriptionServiceImpl") + private ConsumeSubscriptionService consumeSubscriptionService; + + @Autowired + private ZKV4ConfigService zkv4ConfigService; + + public static boolean validate(final String ip) { + String PATTERN = "^((0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)\\.){3}(0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)$"; + return ip.matches(PATTERN); + } + + @ResponseBody + @RequestMapping(value = {"/login"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse login(@RequestParam String username, @RequestParam String password, HttpServletResponse response) { + try { + if (ConsoleConfig.instance().getCarreraAdminUser().contains(username) + && ConsoleConfig.instance().getCarreraAdminPassword().contains(password)) { + + response.addCookie(CookieUtil.newCookie()); + return ConsoleBaseResponse.success("success"); + } else { + return ConsoleBaseResponse.success("fail"); + } + } catch (Exception e) { + return ConsoleBaseResponse.success("fail"); + } + } + + @ResponseBody + @RequestMapping(value = {"/logout"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse logout(@RequestParam String username, HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + if (cookies == null) { + return ConsoleBaseResponse.success(); + } + for (Cookie cookie : cookies) { + CookieUtil.cookies.remove(cookie.getValue()); + } + + return ConsoleBaseResponse.success(); + } + + @ResponseBody + @RequestMapping(value = {"/createTopic"}, method = {RequestMethod.POST}) + public ConsoleBaseResponse createTopic(@Valid @RequestBody TopicOrderBo topicinfo, BindingResult bindingResult) throws Exception { + if (bindingResult.hasErrors()) { + String msg = getBindingResultErrorInfo(bindingResult); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, msg); + } + + return topicService.create(topicinfo); + } + + @ResponseBody + @RequestMapping(value = {"/createSub"}, method = {RequestMethod.POST}) + public ConsoleBaseResponse createSub(@Valid @RequestBody ConsumeSubscriptionOrderBo subBo, BindingResult bindingResult) throws Exception { + if (bindingResult.hasErrors()) { + String msg = getBindingResultErrorInfo(bindingResult); + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, msg); + } + + return consumeSubscriptionService.createConsumeSubscription(subBo); + } + + @ResponseBody + @RequestMapping(value = {"/deleteGroup"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse deleteGroup(@RequestParam String user, @RequestParam Long groupId) throws Exception { + return consumeGroupService.delete(user, groupId); + } + + @ResponseBody + @RequestMapping(value = {"/deleteSub"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse deleteSub(@RequestParam String user, @RequestParam Long subId) throws Exception { + return consumeSubscriptionService.delete(user, subId); + } + + @ResponseBody + @RequestMapping(value = {"/v4/initZkPath"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse initZkPath() throws Exception { + zkv4ConfigService.initZkPath(); + return ConsoleBaseResponse.success(); + } + + @ResponseBody + @RequestMapping(value = {"/v4/initAllZk"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse initAllZk() throws Exception { + zkv4ConfigService.initAllZk(); + return ConsoleBaseResponse.success(); + } + + @ResponseBody + @RequestMapping(value = {"/v4/addPProxy"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse addPProxy(@RequestParam(defaultValue = "ddmq") String cluster, @RequestParam String host) throws Exception { + if (!validate(host)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "invalid host"); + } + return topicService.addPProxy(cluster, host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/addCProxy"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse addCProxy(@RequestParam(defaultValue = "ddmq") String cluster, @RequestParam String host) throws Exception { + if (!validate(host)) { + return ConsoleBaseResponse.error(ConsoleBaseResponse.Status.INVALID_PARAM, "invalid host"); + } + return consumeSubscriptionService.addCProxy(cluster, host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushTopicConfig"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushTopicConfig(@RequestParam String topic) throws Exception { + return zkv4ConfigService.pushTopicConfig(topic); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushGroupConfig"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushGroupConfig(@RequestParam String group) throws Exception { + return zkv4ConfigService.pushGroupConfig(group); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushPProxyConfig"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushPproxyConfig(@RequestParam String host) throws Exception { + return zkv4ConfigService.pushPproxyConfig(host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushCProxyConfig"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushCproxyConfig(@RequestParam String host) throws Exception { + return zkv4ConfigService.pushCproxyConfig(host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushTopicConfigByCluster"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushTopicConfigByCluster(@RequestParam String cluster) throws Exception { + return zkv4ConfigService.pushTopicByCluster(cluster); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushGroupConfigByCluster"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushGroupConfigByCluster(@RequestParam String cluster) throws Exception { + return zkv4ConfigService.pushGroupByCluster(cluster); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushPProxyConfigByCluster"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushPProxyConfigByCluster(@RequestParam String cluster) throws Exception { + return zkv4ConfigService.pushPProxyByCluster(cluster); + } + + @ResponseBody + @RequestMapping(value = {"/v4/pushCProxyConfigByCluster"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse pushCProxyConfigByCluster(@RequestParam String cluster) throws Exception { + return zkv4ConfigService.pushCProxyByCluster(cluster); + } + + @ResponseBody + @RequestMapping(value = {"/v4/addPProxyByTopic"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse addPProxyByTopic(@RequestParam String topic, @RequestParam String cluster, @RequestParam String host) throws Exception { + return topicService.addPProxy(topic, cluster, host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/removePProxy"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse removePProxy(@RequestParam String host) throws Exception { + return topicService.removePProxy(host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/removePProxyByTopic"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse removePProxyByTopic(@RequestParam String topic, @RequestParam String host) throws Exception { + return topicService.removePProxy(topic, host); + } + + + @ResponseBody + @RequestMapping(value = {"/v4/addCProxyByGroup"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse addCProxyByGroup(@RequestParam String group, @RequestParam String cluster, @RequestParam String host) throws Exception { + return consumeSubscriptionService.addCProxy(group, cluster, host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/removeCProxyByGroup"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse removeCProxyByGroup(@RequestParam String group, @RequestParam String host) throws Exception { + return consumeSubscriptionService.removeCProxy(group, host); + } + + @ResponseBody + @RequestMapping(value = {"/v4/removeCProxy"}, method = {RequestMethod.GET}) + public ConsoleBaseResponse removeCProxy(@RequestParam String host) throws Exception { + return consumeSubscriptionService.removeCProxy(host); + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValue.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValue.java new file mode 100644 index 0000000..805ada3 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValue.java @@ -0,0 +1,41 @@ +package com.didi.carrera.console.web.controller.validator; + + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + + +@Target({TYPE, ANNOTATION_TYPE}) +@Retention(RUNTIME) +@Constraint(validatedBy = AnotherFieldEqualsSpecifiedValueValidator.class) +@Documented +public @interface AnotherFieldEqualsSpecifiedValue { + String message() default "{constraints.fieldmatch}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + String fieldName(); + String fieldValue(); + String dependFieldName(); + + /** + * Defines several @AnotherFieldEqualsSpecifiedValue annotations on the same element + * + * @see AnotherFieldEqualsSpecifiedValue + */ + @Target({TYPE, ANNOTATION_TYPE}) + @Retention(RUNTIME) + @Documented + @interface List { + AnotherFieldEqualsSpecifiedValue[] value(); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValueValidator.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValueValidator.java new file mode 100644 index 0000000..87fd39e --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/controller/validator/AnotherFieldEqualsSpecifiedValueValidator.java @@ -0,0 +1,46 @@ +package com.didi.carrera.console.web.controller.validator; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.lang.reflect.InvocationTargetException; + +import org.apache.commons.beanutils.BeanUtils; + + +public class AnotherFieldEqualsSpecifiedValueValidator implements ConstraintValidator { + private String fieldName; + private String expectedFieldValue; + private String dependFieldName; + + @Override + public void initialize(final AnotherFieldEqualsSpecifiedValue constraintAnnotation) { + fieldName = constraintAnnotation.fieldName(); + expectedFieldValue = constraintAnnotation.fieldValue(); + dependFieldName = constraintAnnotation.dependFieldName(); + } + + @Override + public boolean isValid(final Object value, final ConstraintValidatorContext context) { + if (value == null) { + return true; + } + + try { + String fieldValue = BeanUtils.getProperty(value, fieldName); + String dependFieldValue = BeanUtils.getProperty(value, dependFieldName); + + if (expectedFieldValue.equals(fieldValue) && dependFieldValue == null) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()) + .addNode(dependFieldName) + .addConstraintViolation(); + return false; + } + + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + + return true; + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/ConsoleExceptionFilter.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/ConsoleExceptionFilter.java new file mode 100644 index 0000000..67f718f --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/ConsoleExceptionFilter.java @@ -0,0 +1,102 @@ +package com.didi.carrera.console.web.filter; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import com.alibaba.fastjson.JSONException; +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.service.exception.ConvertDataException; +import com.didi.carrera.console.service.exception.MqException; +import com.didi.carrera.console.web.ConsoleBaseResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindException; +import org.springframework.web.util.NestedServletException; + + +public class ConsoleExceptionFilter implements Filter { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private Logger accessLogger = LoggerFactory.getLogger("carrera.console.framework.request"); + + /** + * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) + */ + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + /** + * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) + */ + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + ServletException { + long start = System.currentTimeMillis(); + + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + + RequestContext.start(req, resp); + + if (accessLogger.isInfoEnabled()) { + accessLogger.info("HttpStart: [{}]{}||{}", RequestContext.getUri(), RequestContext.getRequestInfo(), + RequestContext.getRemoteSource()); + } + + try { + chain.doFilter(request, response); + } catch (Exception e) { + logger.error("Filter exception: ", e); + String msg = "数据提交出错,请稍后重试"; + ConsoleBaseResponse.Status status = ConsoleBaseResponse.Status.INVALID_PARAM; + if (NestedServletException.class.isInstance(e)) { + //参数绑定错误异常 + NestedServletException ex = (NestedServletException) e; + Throwable rootCause = ex.getRootCause(); + + if (BindException.class.isInstance(rootCause)) { + msg = "参数校验失败"; + } else if (IllegalArgumentException.class.isInstance(rootCause)) { + msg = rootCause.getMessage(); + } else if (JSONException.class.isInstance(rootCause)) { + msg = "Json 格式错误"; + } else if (MqException.class.isInstance(rootCause)) { + msg = rootCause.getMessage(); + } else if (ConvertDataException.class.isInstance(rootCause)) { + msg = rootCause.getMessage(); + } else { + status = ConsoleBaseResponse.Status.INTERNAL_ERROR; + msg = rootCause.getMessage(); + } + } + String json = FastJsonUtils.toJson(ConsoleBaseResponse.error(status, msg)); + RequestContext.sendJsonResponse(json); + // 返回错误提示信息 + resp.getWriter().write(json); + } finally { + long past = System.currentTimeMillis() - start; + if (accessLogger.isInfoEnabled()) { + accessLogger.info("HttpEnd: [{}]||{}||{}||cost={}ms", RequestContext.getUri(), + RequestContext.getResponseInfo(), RequestContext.getRemoteSource(), past); + } + + RequestContext.clear(); + } + } + + /** + * @see javax.servlet.Filter#destroy() + */ + @Override + public void destroy() { + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/JsonMessageConverter.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/JsonMessageConverter.java new file mode 100644 index 0000000..7d8ee09 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/JsonMessageConverter.java @@ -0,0 +1,155 @@ +package com.didi.carrera.console.web.filter; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONPObject; +import com.alibaba.fastjson.serializer.SerializeFilter; +import com.alibaba.fastjson.support.spring.FastJsonContainer; +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4; +import com.alibaba.fastjson.support.spring.MappingFastJsonValue; +import com.alibaba.fastjson.support.spring.PropertyPreFilters; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageNotWritableException; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class JsonMessageConverter extends FastJsonHttpMessageConverter4 { + + private Logger accessLogger = LoggerFactory.getLogger("carrera.console.framework.request"); + + @Override + protected Object readInternal(Class clazz, HttpInputMessage inputMessage) + throws IOException, HttpMessageNotReadableException { + + byte[] bodyBytes = getBody(inputMessage); + if (bodyBytes == null || bodyBytes.length == 0) { + return null; + } + + return JSON.parseObject(bodyBytes, 0, bodyBytes.length, getFastJsonConfig().getCharset(), getType(clazz, null), getFastJsonConfig().getFeatures()); + } + + private byte[] getBody(HttpInputMessage inputMessage) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + InputStream in = inputMessage.getBody(); + + byte[] buf = new byte[1024]; + for (; ; ) { + int len = in.read(buf); + if (len == -1) { + break; + } + + if (len > 0) { + baos.write(buf, 0, len); + } + } + if (baos.size() == 0) { + accessLogger.info("Request Body={}", RequestContext.getBody()); + String body = RequestContext.getBody(); + if (StringUtils.isNotBlank(body)) { + return body.getBytes("UTF-8"); + } + return null; + } else { + // 记录请求的body内容 + RequestContext.setBody(baos.toString()); + accessLogger.info("Request Body={}", RequestContext.getBody()); + + return baos.toByteArray(); + } + } + + @Override + public Object read(Type type, // + Class contextClass, // + HttpInputMessage inputMessage // + ) throws IOException, HttpMessageNotReadableException { + byte[] bodyBytes = getBody(inputMessage); + if (bodyBytes == null || bodyBytes.length == 0) { + return null; + } + + return JSON.parseObject(bodyBytes, 0, bodyBytes.length, getFastJsonConfig().getCharset(), getType(type, contextClass), getFastJsonConfig().getFeatures()); + } + + @Override + protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { + try (ByteArrayOutputStream outnew = new ByteArrayOutputStream()) { + HttpHeaders headers = outputMessage.getHeaders(); + + //获取全局配置的filter + SerializeFilter[] globalFilters = getFastJsonConfig().getSerializeFilters(); + List allFilters = new ArrayList<>(Arrays.asList(globalFilters)); + + boolean isJsonp = false; + Object value = strangeCodeForJackson(object); + + if (value instanceof FastJsonContainer) { + FastJsonContainer fastJsonContainer = (FastJsonContainer) value; + PropertyPreFilters filters = fastJsonContainer.getFilters(); + allFilters.addAll(filters.getFilters()); + value = fastJsonContainer.getValue(); + } + + if (value instanceof MappingFastJsonValue) { + isJsonp = true; + value = ((MappingFastJsonValue) value).getValue(); + } else if (value instanceof JSONPObject) { + isJsonp = true; + } + + + int len = writePrefix(outnew, object); + len += JSON.writeJSONString(outnew, // + getFastJsonConfig().getCharset(), // + value, // + getFastJsonConfig().getSerializeConfig(), // + allFilters.toArray(new SerializeFilter[allFilters.size()]), + getFastJsonConfig().getDateFormat(), // + JSON.DEFAULT_GENERATE_FEATURE, // + getFastJsonConfig().getSerializerFeatures()); + len += writeSuffix(outnew, object); + + if (isJsonp) { + headers.setContentType(APPLICATION_JAVASCRIPT); + } + if (getFastJsonConfig().isWriteContentLength()) { + headers.setContentLength(len); + } + + headers.set("carrera_logid", RequestContext.getLogId()); + RequestContext.sendJsonResponse(outnew.toString()); + + outnew.writeTo(outputMessage.getBody()); + + } catch (JSONException ex) { + throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex); + } + } + + private Object strangeCodeForJackson(Object obj) { + if (obj != null) { + String className = obj.getClass().getName(); + if ("com.fasterxml.jackson.databind.node.ObjectNode".equals(className)) { + return obj.toString(); + } + } + return obj; + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/RequestContext.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/RequestContext.java new file mode 100644 index 0000000..21314f1 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/filter/RequestContext.java @@ -0,0 +1,217 @@ +package com.didi.carrera.console.web.filter; + +import com.didi.carrera.console.common.util.FastJsonUtils; +import com.didi.carrera.console.common.util.LogUtils; +import com.didi.carrera.console.web.controller.bo.BaseBo; +import com.didi.carrera.console.web.util.RemoteSource; +import com.didi.carrera.console.web.util.RequestUtil; +import com.sun.tools.internal.ws.processor.model.Request; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.MDC; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Enumeration; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +public class RequestContext { + private static final String BODY_KEY = "body"; + public static final String LOGID_KEY = "logId"; + + /** + * 客户端请求的信息 + */ + private static final InheritableThreadLocal context = new InheritableThreadLocal<>(); + + /** + * 服务器处理后的返回信息 + */ + private static final InheritableThreadLocal response = new InheritableThreadLocal<>(); + /** + * 用户请求信息 + */ + private static final InheritableThreadLocal request = new InheritableThreadLocal<>(); + + public static HttpServletRequest getRequest() { + return context.get() == null ? null : context.get().request; + } + + public static HttpServletResponse getResponse() { + return context.get() == null ? null : context.get().response; + } + + public static String getUri() { + return context.get() == null ? null : context.get().uri; + } + + public static String getFullUri() { + return context.get() == null ? null : context.get().fullUri; + } + + public static String getLogId() { + return context.get() == null ? null : context.get().logId; + } + + public static String getRequestedWith() { + return context.get() == null ? null : context.get().requestedWith; + } + + public static RemoteSource getRemoteSource() { + return context.get() == null ? null : context.get().remoteSource; + } + + public static Map getDataMap() { + return context.get() == null ? null : context.get().dataMap; + } + + public static Object getValue(String key) { + return context.get() == null ? null : context.get().dataMap.get(key); + } + + public static String getString(String key) { + Object value = getValue(key); + if (value != null) { + return String.valueOf(value); + } + return null; + } + + public static String getBody() { + return getString(BODY_KEY); + } + + protected static void setBody(String body) { + BaseBo bo = FastJsonUtils.toObject(body, BaseBo.class); + if(bo != null && StringUtils.isNotEmpty(bo.getUser())) { + context.get().dataMap.put("user", bo.getUser()); + } + context.get().dataMap.put(BODY_KEY, body); + } + + static void start(HttpServletRequest request, HttpServletResponse response) { + RequestContext.context.set(new Context(request, response)); + RequestContext.response.set(new Response()); + MDC.put(LOGID_KEY, getLogId()); + } + + static void clear() { + context.remove(); + response.remove(); + MDC.remove(LOGID_KEY); + } + + static String getRequestInfo() { + Map params = RequestContext.getDataMap(); + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry: params.entrySet()) { + sb.append("||").append(entry.getKey()).append("=").append(entry.getValue()); + } + return sb.toString(); + } + + static String getResponseInfo() { + StringBuilder sb = new StringBuilder("code=").append(response.get().code); + if (StringUtils.isNotBlank(response.get().contentType)) { + sb.append("||contentType=[").append(response.get().contentType).append("]"); + } + if (StringUtils.isNotBlank(response.get().content)) { + sb.append("||content=[").append(response.get().content).append("]"); + } + if (StringUtils.isNotBlank(response.get().path)) { + sb.append("||path=[").append(response.get().path).append("]"); + } + return sb.toString(); + } + + public static void sendResponse(int code) { + response.get().code = code; + } + + public static void sendResponse(int code, String message) { + response.get().code = code; + response.get().content = message; + } + + public static void sendResponse(String type, String content) { + response.get().contentType = type; + response.get().content = content; + } + + static void sendJsonResponse(String json) { + context.get().response.setContentType("application/json;charset=UTF-8"); + response.get().contentType = "application/json;charset=UTF-8"; + response.get().content = json; + + } + + static void sendHtmlResponse(String path) { + response.get().contentType = "text/html;charset=UTF-8"; + response.get().path = path; + } + + static void sendStaticResponse(String type, String path) { + response.get().contentType = type; + response.get().path = path; + } + + private static class Context { + public final HttpServletRequest request; + public final HttpServletResponse response; + public final Map dataMap = new ConcurrentHashMap<>(); + public final String uri; + public final String fullUri; + public final String logId; + public final String requestedWith; + public final RemoteSource remoteSource; + + public Context(HttpServletRequest request, HttpServletResponse response) { + this.request = request; + this.response = response; + String logId = LogUtils.genLogid(); + Enumeration names = request.getParameterNames(); + if (names != null) { + while (names.hasMoreElements()) { + String name = String.valueOf(names.nextElement()); + String value = request.getParameter(name); + if (StringUtils.isNotBlank(value)) { + if (LOGID_KEY.equalsIgnoreCase(name)) { + logId = value; + } + dataMap.put(name, value); + } + } + } + this.logId = logId; + String uri = request.getRequestURI(); + // 从uri上去掉context_path + uri = uri.replace(request.getContextPath(), ""); + this.uri = uri; + + String query = StringUtils.isBlank(request.getQueryString()) ? "" : "?" + request.getQueryString(); + this.fullUri = uri + query; + + String requested = request.getHeader("X-Requested-With"); + if (org.apache.commons.lang3.StringUtils.isNotBlank(requested)) { + requestedWith = requested; + } else { + requestedWith = ""; + } + + remoteSource = RequestUtil.getRemoteSource(request); + } + } + + /** + * 目前只做记录,方便日志打印 + */ + private static class Response { + public int code = HttpServletResponse.SC_OK; + public String contentType; + public String content; + public String path; + } + + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/CookieUtil.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/CookieUtil.java new file mode 100644 index 0000000..fdb6cbe --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/CookieUtil.java @@ -0,0 +1,31 @@ +package com.didi.carrera.console.web.util; + +import com.didi.carrera.console.common.util.LogUtils; +import org.springframework.web.util.CookieGenerator; + +import javax.servlet.http.Cookie; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Author: zanglei@didiglobal.com + * Date: 2019-10-16 + * Time: 12:06 + */ +public class CookieUtil { + + public static final String COOKIE_KEY="JSESSION_ID"; + + public static final Set cookies = new HashSet<>(); + + public static Cookie newCookie() { + String value = LogUtils.genLogid(); + Cookie cookie = new Cookie(COOKIE_KEY, value); + cookie.setPath("/"); + cookies.add(value); + return cookie; + } +} diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateTimePropertyEditor.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateTimePropertyEditor.java new file mode 100644 index 0000000..fad8889 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateTimePropertyEditor.java @@ -0,0 +1,41 @@ +package com.didi.carrera.console.web.util; + +import org.apache.commons.lang3.StringUtils; + +import java.beans.PropertyEditorSupport; +import java.text.ParseException; +import java.text.SimpleDateFormat; + + +public class DateTimePropertyEditor extends PropertyEditorSupport { + + /** + * Parse the Date from the given text, using the specified DateFormat. + */ + @Override + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.isBlank(text)) { + setValue(null); + return; + } + SimpleDateFormat dateFormat; + + if (text.contains(":")) { // 时分秒 + if (text.split(":").length == 2) { + dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + } else { + dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + } else { + dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + } + + try { + setValue(dateFormat.parse(text)); + } catch (ParseException ex) { + throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex); + } + + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateUtil.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateUtil.java new file mode 100755 index 0000000..e0b1e35 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/DateUtil.java @@ -0,0 +1,762 @@ +package com.didi.carrera.console.web.util; + + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class DateUtil { + + /** + * 获取SimpleDateFormat + * + * @param parttern 日期格式 + * @return SimpleDateFormat对象 + * @throws RuntimeException 异常:非法日期格式 + */ + private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException { + return new SimpleDateFormat(parttern); + } + + /** + * 获取日期中的某数值。如获取月份 + * + * @param date 日期 + * @param dateType 日期格式 + * @return 数值 + */ + private static int getInteger(Date date, int dateType) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar.get(dateType); + } + + /** + * 增加日期中某类型的某数值。如增加日期 + * + * @param date 日期字符串 + * @param dateType 类型 + * @param amount 数值 + * @return 计算后日期字符串 + */ + private static String addInteger(String date, int dateType, int amount) { + String dateString = null; + DateStyle dateStyle = getDateStyle(date); + if (dateStyle != null) { + Date myDate = StringToDate(date, dateStyle); + myDate = addInteger(myDate, dateType, amount); + dateString = DateToString(myDate, dateStyle); + } + return dateString; + } + + /** + * 增加日期中某类型的某数值。如增加日期 + * + * @param date 日期 + * @param dateType 类型 + * @param amount 数值 + * @return 计算后日期 + */ + private static Date addInteger(Date date, int dateType, int amount) { + Date myDate = null; + if (date != null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(dateType, amount); + myDate = calendar.getTime(); + } + return myDate; + } + + /** + * 获取精确的日期 + * + * @param timestamps 时间long集合 + * @return 日期 + */ + private static Date getAccurateDate(List timestamps) { + Date date = null; + long timestamp = 0; + Map map = new HashMap<>(); + List absoluteValues = new ArrayList<>(); + + if (timestamps != null && timestamps.size() > 0) { + if (timestamps.size() > 1) { + for (int i = 0; i < timestamps.size(); i++) { + for (int j = i + 1; j < timestamps.size(); j++) { + long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j)); + absoluteValues.add(absoluteValue); + long[] timestampTmp = {timestamps.get(i), timestamps.get(j)}; + map.put(absoluteValue, timestampTmp); + } + } + + // 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的 + long minAbsoluteValue = -1; + if (!absoluteValues.isEmpty()) { + // 如果timestamps的size为2,这是差值只有一个,因此要给默认值 + minAbsoluteValue = absoluteValues.get(0); + } + for (int i = 0; i < absoluteValues.size(); i++) { + for (int j = i + 1; j < absoluteValues.size(); j++) { + if (absoluteValues.get(i) > absoluteValues.get(j)) { + minAbsoluteValue = absoluteValues.get(j); + } else { + minAbsoluteValue = absoluteValues.get(i); + } + } + } + + if (minAbsoluteValue != -1) { + long[] timestampsLastTmp = map.get(minAbsoluteValue); + if (absoluteValues.size() > 1) { + timestamp = Math.max(timestampsLastTmp[0], timestampsLastTmp[1]); + } else if (absoluteValues.size() == 1) { + // 当timestamps的size为2,需要与当前时间作为参照 + long dateOne = timestampsLastTmp[0]; + long dateTwo = timestampsLastTmp[1]; + if ((Math.abs(dateOne - dateTwo)) < 100000000000L) { + timestamp = Math.max(timestampsLastTmp[0], timestampsLastTmp[1]); + } else { + long now = new Date().getTime(); + if (Math.abs(dateOne - now) <= Math.abs(dateTwo - now)) { + timestamp = dateOne; + } else { + timestamp = dateTwo; + } + } + } + } + } else { + timestamp = timestamps.get(0); + } + } + + if (timestamp != 0) { + date = new Date(timestamp); + } + return date; + } + + /** + * 判断字符串是否为日期字符串 + * + * @param date 日期字符串 + * @return true or false + */ + public static boolean isDate(String date) { + boolean isDate = false; + if (date != null) { + if (StringToDate(date) != null) { + isDate = true; + } + } + return isDate; + } + + /** + * 获取日期字符串的日期风格。失敗返回null。 + * + * @param date 日期字符串 + * @return 日期风格 + */ + public static DateStyle getDateStyle(String date) { + DateStyle dateStyle; + Map map = new HashMap<>(); + List timestamps = new ArrayList<>(); + for (DateStyle style : DateStyle.values()) { + Date dateTmp = StringToDate(date, style.getValue()); + if (dateTmp != null) { + timestamps.add(dateTmp.getTime()); + map.put(dateTmp.getTime(), style); + } + } + dateStyle = map.get(getAccurateDate(timestamps).getTime()); + return dateStyle; + } + + /** + * 将日期字符串转化为日期。失败返回null。 + * + * @param date 日期字符串 + * @return 日期 + */ + public static Date StringToDate(String date) { + DateStyle dateStyle = null; + return StringToDate(date, dateStyle); + } + + /** + * 将日期字符串转化为日期。失败返回null。 + * + * @param date 日期字符串 + * @param parttern 日期格式 + * @return 日期 + */ + public static Date StringToDate(String date, String parttern) { + Date myDate = null; + if (date != null) { + try { + myDate = getDateFormat(parttern).parse(date); + } catch (Exception e) { + } + } + return myDate; + } + + /** + * 将日期字符串转化为日期。失败返回null。 + * + * @param date 日期字符串 + * @param dateStyle 日期风格 + * @return 日期 + */ + public static Date StringToDate(String date, DateStyle dateStyle) { + Date myDate = null; + if (dateStyle == null) { + List timestamps = new ArrayList<>(); + for (DateStyle style : DateStyle.values()) { + Date dateTmp = StringToDate(date, style.getValue()); + if (dateTmp != null) { + timestamps.add(dateTmp.getTime()); + } + } + myDate = getAccurateDate(timestamps); + } else { + myDate = StringToDate(date, dateStyle.getValue()); + } + return myDate; + } + + /** + * 将日期转化为日期字符串。失败返回null。 + * + * @param date 日期 + * @param parttern 日期格式 + * @return 日期字符串 + */ + public static String DateToString(Date date, String parttern) { + String dateString = null; + if (date != null) { + try { + dateString = getDateFormat(parttern).format(date); + } catch (Exception e) { + } + } + return dateString; + } + + /** + * 将日期转化为日期字符串。失败返回null。 + * + * @param date 日期 + * @param dateStyle 日期风格 + * @return 日期字符串 + */ + public static String DateToString(Date date, DateStyle dateStyle) { + String dateString = null; + if (dateStyle != null) { + dateString = DateToString(date, dateStyle.getValue()); + } + return dateString; + } + + /** + * 将日期字符串转化为另一日期字符串。失败返回null。 + * + * @param date 旧日期字符串 + * @param parttern 新日期格式 + * @return 新日期字符串 + */ + public static String StringToString(String date, String parttern) { + return StringToString(date, null, parttern); + } + + /** + * 将日期字符串转化为另一日期字符串。失败返回null。 + * + * @param date 旧日期字符串 + * @param dateStyle 新日期风格 + * @return 新日期字符串 + */ + public static String StringToString(String date, DateStyle dateStyle) { + return StringToString(date, null, dateStyle); + } + + /** + * 将日期字符串转化为另一日期字符串。失败返回null。 + * + * @param date 旧日期字符串 + * @param olddParttern 旧日期格式 + * @param newParttern 新日期格式 + * @return 新日期字符串 + */ + public static String StringToString(String date, String olddParttern, String newParttern) { + String dateString = null; + if (olddParttern == null) { + DateStyle style = getDateStyle(date); + if (style != null) { + Date myDate = StringToDate(date, style.getValue()); + dateString = DateToString(myDate, newParttern); + } + } else { + Date myDate = StringToDate(date, olddParttern); + dateString = DateToString(myDate, newParttern); + } + return dateString; + } + + /** + * 将日期字符串转化为另一日期字符串。失败返回null。 + * + * @param date 旧日期字符串 + * @param olddDteStyle 旧日期风格 + * @param newDateStyle 新日期风格 + * @return 新日期字符串 + */ + public static String StringToString(String date, DateStyle olddDteStyle, DateStyle newDateStyle) { + String dateString = null; + if (olddDteStyle == null) { + DateStyle style = getDateStyle(date); + dateString = StringToString(date, style.getValue(), newDateStyle.getValue()); + } else { + dateString = StringToString(date, olddDteStyle.getValue(), newDateStyle.getValue()); + } + return dateString; + } + + /** + * 增加日期的年份。失败返回null。 + * + * @param date 日期 + * @param yearAmount 增加数量。可为负数 + * @return 增加年份后的日期字符串 + */ + public static String addYear(String date, int yearAmount) { + return addInteger(date, Calendar.YEAR, yearAmount); + } + + /** + * 增加日期的年份。失败返回null。 + * + * @param date 日期 + * @param yearAmount 增加数量。可为负数 + * @return 增加年份后的日期 + */ + public static Date addYear(Date date, int yearAmount) { + return addInteger(date, Calendar.YEAR, yearAmount); + } + + /** + * 增加日期的月份。失败返回null。 + * + * @param date 日期 + * @param yearAmount 增加数量。可为负数 + * @return 增加月份后的日期字符串 + */ + public static String addMonth(String date, int yearAmount) { + return addInteger(date, Calendar.MONTH, yearAmount); + } + + /** + * 增加日期的月份。失败返回null。 + * + * @param date 日期 + * @param yearAmount 增加数量。可为负数 + * @return 增加月份后的日期 + */ + public static Date addMonth(Date date, int yearAmount) { + return addInteger(date, Calendar.MONTH, yearAmount); + } + + /** + * 增加日期的天数。失败返回null。 + * + * @param date 日期字符串 + * @param dayAmount 增加数量。可为负数 + * @return 增加天数后的日期字符串 + */ + public static String addDay(String date, int dayAmount) { + return addInteger(date, Calendar.DATE, dayAmount); + } + + /** + * 增加日期的天数。失败返回null。 + * + * @param date 日期 + * @param dayAmount 增加数量。可为负数 + * @return 增加天数后的日期 + */ + public static Date addDay(Date date, int dayAmount) { + return addInteger(date, Calendar.DATE, dayAmount); + } + + /** + * 增加日期的小时。失败返回null。 + * + * @param date + * @param hourAmount + * @return 增加小时后的日期字符串 + */ + public static String addHour(String date, int hourAmount) { + return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount); + } + + /** + * 增加日期的小时。失败返回null + * + * @param date + * @param hourAmount + * @return 增加小时后的日期 + */ + public static Date addHour(Date date, int hourAmount) { + return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount); + } + + /** + * 获取日期的年份。失败返回0。 + * + * @param date 日期字符串 + * @return 年份 + */ + public static int getYear(String date) { + return getYear(StringToDate(date)); + } + + /** + * 获取日期的年份。失败返回0。 + * + * @param date 日期 + * @return 年份 + */ + public static int getYear(Date date) { + return getInteger(date, Calendar.YEAR); + } + + /** + * 获取日期的月份。失败返回0。 + * + * @param date 日期字符串 + * @return 月份 + */ + public static int getMonth(String date) { + return getMonth(StringToDate(date)); + } + + /** + * 获取日期的月份。失败返回0。 + * + * @param date 日期 + * @return 月份 + */ + public static int getMonth(Date date) { + return getInteger(date, Calendar.MONTH); + } + + /** + * 获取日期的天数。失败返回0。 + * + * @param date 日期字符串 + * @return 天 + */ + public static int getDay(String date) { + return getDay(StringToDate(date)); + } + + /** + * 获取日期的天数。失败返回0。 + * + * @param date 日期 + * @return 天 + */ + public static int getDay(Date date) { + return getInteger(date, Calendar.DATE); + } + + /** + * 获取日期的小时。失败返回0。 + * + * @param date 日期字符串 + * @return 小时 + */ + public static int getHour(String date) { + return getHour(StringToDate(date)); + } + + /** + * 获取日期的小时。失败返回0。 + * + * @param date 日期 + * @return 小时 + */ + public static int getHour(Date date) { + return getInteger(date, Calendar.HOUR_OF_DAY); + } + + /** + * 获取日期的分钟。失败返回0。 + * + * @param date 日期字符串 + * @return 分钟 + */ + public static int getMinute(String date) { + return getMinute(StringToDate(date)); + } + + /** + * 获取日期的分钟。失败返回0。 + * + * @param date 日期 + * @return 分钟 + */ + public static int getMinute(Date date) { + return getInteger(date, Calendar.MINUTE); + } + + /** + * 获取日期的秒钟。失败返回0。 + * + * @param date 日期字符串 + * @return 秒钟 + */ + public static int getSecond(String date) { + return getSecond(StringToDate(date)); + } + + /** + * 获取日期的秒钟。失败返回0。 + * + * @param date 日期 + * @return 秒钟 + */ + public static int getSecond(Date date) { + return getInteger(date, Calendar.SECOND); + } + + /** + * 获取日期 。默认yyyy-MM-dd格式。失败返回null。 + * + * @param date 日期字符串 + * @return 日期 + */ + public static String getDate(String date) { + return StringToString(date, DateStyle.YYYY_MM_DD); + } + + /** + * 获取日期。默认yyyy-MM-dd格式。失败返回null。 + * + * @param date 日期 + * @return 日期 + */ + public static String getDate(Date date) { + return DateToString(date, DateStyle.YYYY_MM_DD); + } + + /** + * 获取日期的时间。默认HH:mm:ss格式。失败返回null。 + * + * @param date 日期字符串 + * @return 时间 + */ + public static String getTime(String date) { + return StringToString(date, DateStyle.HH_MM_SS); + } + + /** + * 获取日期的时间。默认HH:mm:ss格式。失败返回null。 + * + * @param date 日期 + * @return 时间 + */ + public static String getTime(Date date) { + return DateToString(date, DateStyle.HH_MM_SS); + } + + /** + * 获取日期的星期。失败返回null。 + * + * @param date 日期字符串 + * @return 星期 + */ + public static Week getWeek(String date) { + Week week = null; + DateStyle dateStyle = getDateStyle(date); + if (dateStyle != null) { + Date myDate = StringToDate(date, dateStyle); + week = getWeek(myDate); + } + return week; + } + + /** + * 获取日期的星期。失败返回null。 + * + * @param date 日期 + * @return 星期 + */ + public static Week getWeek(Date date) { + Week week = null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1; + switch (weekNumber) { + case 0: + week = Week.SUNDAY; + break; + case 1: + week = Week.MONDAY; + break; + case 2: + week = Week.TUESDAY; + break; + case 3: + week = Week.WEDNESDAY; + break; + case 4: + week = Week.THURSDAY; + break; + case 5: + week = Week.FRIDAY; + break; + case 6: + week = Week.SATURDAY; + break; + } + return week; + } + + /** + * 获取两个日期相差的天数 + * + * @param date 日期字符串 + * @param otherDate 另一个日期字符串 + * @return 相差天数 + */ + public static int getIntervalDays(String date, String otherDate) { + return getIntervalDays(StringToDate(date), StringToDate(otherDate)); + } + + /** + * @param date 日期 + * @param otherDate 另一个日期 + * @return 相差天数 + */ + public static int getIntervalDays(Date date, Date otherDate) { + date = DateUtil.StringToDate(DateUtil.getDate(date)); + long time = Math.abs(date.getTime() - otherDate.getTime()); + return (int) time / (24 * 60 * 60 * 1000); + } + + /** + * 根据1970年以来的毫秒数获取日期字符串 + * + * @param date 1970年以来的ms数 + * @param ds + * @return 返回指定DateStyle格式的字符串 + */ + public static String longToString(Long date, DateStyle ds) { + if (date == null || date == 0L) { + return null; + } + if (ds == null) { + ds = DateStyle.YYYY_MM_DD_HH_MM_SS; + } + return getDateFormat(ds.getValue()).format(date); + } + + /** + * 根据1970年以来的毫秒数获取日期字符串,默认yyyy-MM-dd HH:mm:ss + * + * @param date 1970年以来的ms数 + * @return + */ + public static String longToString(Long date) { + return longToString(date, DateStyle.YYYY_MM_DD_HH_MM_SS); + } + + public enum DateStyle { + MM_DD("MM-dd"), + YYYY_MM("yyyy-MM"), + YYYY_MM_DD("yyyy-MM-dd"), + YYYYMMDD("yyyyMMdd"), + MM_DD_HH_MM("MM-dd HH:mm"), + MM_DD_HH_MM_SS("MM-dd HH:mm:ss"), + YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"), + YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"), + + MM_DD_EN("MM/dd"), + YYYY_MM_EN("yyyy/MM"), + YYYY_MM_DD_EN("yyyy/MM/dd"), + MM_DD_HH_MM_EN("MM/dd HH:mm"), + MM_DD_HH_MM_SS_EN("MM/dd HH:mm:ss"), + YYYY_MM_DD_HH_MM_EN("yyyy/MM/dd HH:mm"), + YYYY_MM_DD_HH_MM_SS_EN("yyyy/MM/dd HH:mm:ss"), + + MM_DD_CN("MM月dd日"), + YYYY_MM_CN("yyyy年MM月"), + YYYY_MM_DD_CN("yyyy年MM月dd日"), + MM_DD_HH_MM_CN("MM月dd日 HH:mm"), + MM_DD_HH_MM_SS_CN("MM月dd日 HH:mm:ss"), + YYYY_MM_DD_HH_MM_CN("yyyy年MM月dd日 HH:mm"), + YYYY_MM_DD_HH_MM_SS_CN("yyyy年MM月dd日 HH:mm:ss"), + + HH_MM("HH:mm"), + HH_MM_SS("HH:mm:ss"); + + private String value; + + DateStyle(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + + public enum Week { + MONDAY("星期一", "Monday", "Mon.", 1), + TUESDAY("星期二", "Tuesday", "Tues.", 2), + WEDNESDAY("星期三", "Wednesday", "Wed.", 3), + THURSDAY("星期四", "Thursday", "Thur.", 4), + FRIDAY("星期五", "Friday", "Fri.", 5), + SATURDAY("星期六", "Saturday", "Sat.", 6), + SUNDAY("星期日", "Sunday", "Sun.", 7); + + String name_cn; + String name_en; + String name_enShort; + int number; + + Week(String name_cn, String name_en, String name_enShort, int number) { + this.name_cn = name_cn; + this.name_en = name_en; + this.name_enShort = name_enShort; + this.number = number; + } + + public String getChineseName() { + return name_cn; + } + + public String getName() { + return name_en; + } + + public String getShortName() { + return name_enShort; + } + + public int getNumber() { + return number; + } + + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RemoteSource.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RemoteSource.java new file mode 100644 index 0000000..4ddc943 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RemoteSource.java @@ -0,0 +1,16 @@ +package com.didi.carrera.console.web.util; + + +public class RemoteSource { + protected RemoteSource(String ip, String source) { + this.ip = ip; + this.source = source; + } + + public String toString() { + return "ip=" + ip + "||ipSrc=" + source; + } + + public final String ip; + public final String source; +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RequestUtil.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RequestUtil.java new file mode 100644 index 0000000..27cfb02 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/RequestUtil.java @@ -0,0 +1,32 @@ +package com.didi.carrera.console.web.util; + +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.http.HttpServletRequest; + + +public class RequestUtil { + + /** + * 获取客户端真实ip + */ + public static RemoteSource getRemoteSource(HttpServletRequest request) { + + String ip = request.getHeader("X-Real-IP"); + if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) { + return new RemoteSource(ip, "X-Real-IP"); + } + + ip = request.getHeader("X-Forwarded-For"); + if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) { + //多次反向代理后会有多个ip值,第一个ip才是真实ip + int index = ip.indexOf(","); + if (index != -1) { + ip = ip.substring(0, index); + } + return new RemoteSource(ip, "X-Forwarded-For"); + } + + return new RemoteSource(request.getRemoteAddr(), "Remote-Addr"); + } +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/StringPropertyEditor.java b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/StringPropertyEditor.java new file mode 100644 index 0000000..1d05782 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/java/com/didi/carrera/console/web/util/StringPropertyEditor.java @@ -0,0 +1,23 @@ +/** + * Kuaidadi.com Inc. + * Copyright (c) 2012-2015 All Rights Reserved. + */ +package com.didi.carrera.console.web.util; + +import org.apache.commons.lang3.StringUtils; + +import java.beans.PropertyEditorSupport; + + +public class StringPropertyEditor extends PropertyEditorSupport { + + @Override + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.isBlank(text)) { + setValue(null); + } else { + setValue(text.trim()); + } + } + +} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/application.yml b/carrera-console/carrera-boot/src/main/resources/application.yml new file mode 100644 index 0000000..035c128 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/application.yml @@ -0,0 +1,29 @@ +spring: + main: + allow-bean-definition-overriding: true + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/carrera_open_source?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false + username: root + password: 123456 +mybatis: + mapperLocations: classpath:sqlmap/ddmq/*.xml + config-location: classpath:mybatis-config.xml + typeAliasesPackage: com.didi.carrera.console.dao.model + +server: + port: 8281 + servlet: + context-path: /carrera + + +#logs +logs: + level: INFO + file: + path: ./logs + + +console: + carrera: + zookeeper: localhost:9181 \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/console.yaml b/carrera-console/carrera-boot/src/main/resources/console.yaml new file mode 100644 index 0000000..b5b4424 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/console.yaml @@ -0,0 +1,4 @@ +zookeeper: localhost:9181 +env: test +carreraAdminUser: [admin] +carreraAdminPassword: [admin] \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/mybatis-config.xml b/carrera-console/carrera-boot/src/main/resources/mybatis-config.xml new file mode 100755 index 0000000..57f3f7d --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/mybatis-config.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/nonelogback.xml b/carrera-console/carrera-boot/src/main/resources/nonelogback.xml new file mode 100644 index 0000000..741662c --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/nonelogback.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + UTF-8 + ${STD_LOG_FORMAT} + + + + + ${LOG_PATH:-.}/${LOG_FILE_NAME}.log + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-%d{yyyyMMdd}.log + ${LOG_MAX_HISTORY} + true + + + UTF-8 + ${FILE_LOG_FORMAT} + + + + + + WARN + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-error.log + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-error-%d{yyyyMMdd}.log + ${LOG_MAX_HISTORY} + true + + + UTF-8 + ${FILE_LOG_FORMAT} + + + + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-sql.log + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-sql-%d{yyyyMMdd}.log + ${LOG_MAX_HISTORY} + true + + + UTF-8 + ${FILE_LOG_FORMAT} + + + + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-access.log + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-access-%d{yyyyMMdd}.log + ${LOG_MAX_HISTORY} + true + + + UTF-8 + ${FILE_LOG_FORMAT} + + + + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-zkv4.log + + ${LOG_PATH:-.}/${LOG_FILE_NAME}-zkv4-%d{yyyyMMdd}.log + 30 + true + + + UTF-8 + ${FILE_LOG_FORMAT} + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMapper.xml new file mode 100644 index 0000000..6e42567 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMapper.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, name, description, idc_id, idc, remark, is_delete, create_time, modify_time + + + + + delete from cluster + where id = #{id,jdbcType=BIGINT} + + + delete from cluster + + + + + + insert into cluster (name, description, idc_id, + idc, remark, is_delete, + create_time, modify_time) + values (#{name,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{idcId,jdbcType=BIGINT}, + #{idc,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{isDelete,jdbcType=TINYINT}, + #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP}) + + + insert into cluster + + + name, + + + description, + + + idc_id, + + + idc, + + + remark, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{name,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{idcId,jdbcType=BIGINT}, + + + #{idc,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update cluster + + + id = #{record.id,jdbcType=BIGINT}, + + + name = #{record.name,jdbcType=VARCHAR}, + + + description = #{record.description,jdbcType=VARCHAR}, + + + idc_id = #{record.idcId,jdbcType=BIGINT}, + + + idc = #{record.idc,jdbcType=VARCHAR}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update cluster + set id = #{record.id,jdbcType=BIGINT}, + name = #{record.name,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=VARCHAR}, + idc_id = #{record.idcId,jdbcType=BIGINT}, + idc = #{record.idc,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update cluster + + + name = #{name,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=VARCHAR}, + + + idc_id = #{idcId,jdbcType=BIGINT}, + + + idc = #{idc,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update cluster + set name = #{name,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + idc_id = #{idcId,jdbcType=BIGINT}, + idc = #{idc,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMqserverRelationMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMqserverRelationMapper.xml new file mode 100644 index 0000000..b5d7865 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ClusterMqserverRelationMapper.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, cluster_id, cluster_name, mq_server_id, mq_server_name, proxy_conf, type, is_delete, + create_time, modify_time + + + + + delete from cluster_mqserver_relation + where id = #{id,jdbcType=BIGINT} + + + delete from cluster_mqserver_relation + + + + + + insert into cluster_mqserver_relation (cluster_id, cluster_name, mq_server_id, + mq_server_name, proxy_conf, type, + is_delete, create_time, modify_time + ) + values (#{clusterId,jdbcType=BIGINT}, #{clusterName,jdbcType=VARCHAR}, #{mqServerId,jdbcType=BIGINT}, + #{mqServerName,jdbcType=VARCHAR}, #{proxyConf,jdbcType=VARCHAR}, #{type,jdbcType=TINYINT}, + #{isDelete,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP} + ) + + + insert into cluster_mqserver_relation + + + cluster_id, + + + cluster_name, + + + mq_server_id, + + + mq_server_name, + + + proxy_conf, + + + type, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{clusterId,jdbcType=BIGINT}, + + + #{clusterName,jdbcType=VARCHAR}, + + + #{mqServerId,jdbcType=BIGINT}, + + + #{mqServerName,jdbcType=VARCHAR}, + + + #{proxyConf,jdbcType=VARCHAR}, + + + #{type,jdbcType=TINYINT}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update cluster_mqserver_relation + + + id = #{record.id,jdbcType=BIGINT}, + + + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + + + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + + + mq_server_id = #{record.mqServerId,jdbcType=BIGINT}, + + + mq_server_name = #{record.mqServerName,jdbcType=VARCHAR}, + + + proxy_conf = #{record.proxyConf,jdbcType=VARCHAR}, + + + type = #{record.type,jdbcType=TINYINT}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update cluster_mqserver_relation + set id = #{record.id,jdbcType=BIGINT}, + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + mq_server_id = #{record.mqServerId,jdbcType=BIGINT}, + mq_server_name = #{record.mqServerName,jdbcType=VARCHAR}, + proxy_conf = #{record.proxyConf,jdbcType=VARCHAR}, + type = #{record.type,jdbcType=TINYINT}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update cluster_mqserver_relation + + + cluster_id = #{clusterId,jdbcType=BIGINT}, + + + cluster_name = #{clusterName,jdbcType=VARCHAR}, + + + mq_server_id = #{mqServerId,jdbcType=BIGINT}, + + + mq_server_name = #{mqServerName,jdbcType=VARCHAR}, + + + proxy_conf = #{proxyConf,jdbcType=VARCHAR}, + + + type = #{type,jdbcType=TINYINT}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update cluster_mqserver_relation + set cluster_id = #{clusterId,jdbcType=BIGINT}, + cluster_name = #{clusterName,jdbcType=VARCHAR}, + mq_server_id = #{mqServerId,jdbcType=BIGINT}, + mq_server_name = #{mqServerName,jdbcType=VARCHAR}, + proxy_conf = #{proxyConf,jdbcType=VARCHAR}, + type = #{type,jdbcType=TINYINT}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupCustomMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupCustomMapper.xml new file mode 100644 index 0000000..89412b6 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupCustomMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupMapper.xml new file mode 100644 index 0000000..125a0db --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeGroupMapper.xml @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, group_name, service, department, contacters, alarm_is_enable, alarm_group, alarm_level, + alarm_msg_lag, alarm_delay_time, broadcast_consume, consume_mode, consume_mode_mapper, + extra_params, config, remark, is_delete, create_time, modify_time + + + + + delete from consume_group + where id = #{id,jdbcType=BIGINT} + + + delete from consume_group + + + + + + insert into consume_group (group_name, service, department, + contacters, alarm_is_enable, alarm_group, + alarm_level, alarm_msg_lag, alarm_delay_time, + broadcast_consume, consume_mode, consume_mode_mapper, + extra_params, config, remark, + is_delete, create_time, modify_time + ) + values (#{groupName,jdbcType=VARCHAR}, #{service,jdbcType=VARCHAR}, #{department,jdbcType=VARCHAR}, + #{contacters,jdbcType=VARCHAR}, #{alarmIsEnable,jdbcType=TINYINT}, #{alarmGroup,jdbcType=VARCHAR}, + #{alarmLevel,jdbcType=TINYINT}, #{alarmMsgLag,jdbcType=INTEGER}, #{alarmDelayTime,jdbcType=INTEGER}, + #{broadcastConsume,jdbcType=TINYINT}, #{consumeMode,jdbcType=TINYINT}, #{consumeModeMapper,jdbcType=VARCHAR}, + #{extraParams,jdbcType=VARCHAR}, #{config,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, + #{isDelete,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP} + ) + + + insert into consume_group + + + group_name, + + + service, + + + department, + + + contacters, + + + alarm_is_enable, + + + alarm_group, + + + alarm_level, + + + alarm_msg_lag, + + + alarm_delay_time, + + + broadcast_consume, + + + consume_mode, + + + consume_mode_mapper, + + + extra_params, + + + config, + + + remark, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{groupName,jdbcType=VARCHAR}, + + + #{service,jdbcType=VARCHAR}, + + + #{department,jdbcType=VARCHAR}, + + + #{contacters,jdbcType=VARCHAR}, + + + #{alarmIsEnable,jdbcType=TINYINT}, + + + #{alarmGroup,jdbcType=VARCHAR}, + + + #{alarmLevel,jdbcType=TINYINT}, + + + #{alarmMsgLag,jdbcType=INTEGER}, + + + #{alarmDelayTime,jdbcType=INTEGER}, + + + #{broadcastConsume,jdbcType=TINYINT}, + + + #{consumeMode,jdbcType=TINYINT}, + + + #{consumeModeMapper,jdbcType=VARCHAR}, + + + #{extraParams,jdbcType=VARCHAR}, + + + #{config,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update consume_group + + + id = #{record.id,jdbcType=BIGINT}, + + + group_name = #{record.groupName,jdbcType=VARCHAR}, + + + service = #{record.service,jdbcType=VARCHAR}, + + + department = #{record.department,jdbcType=VARCHAR}, + + + contacters = #{record.contacters,jdbcType=VARCHAR}, + + + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + + + alarm_group = #{record.alarmGroup,jdbcType=VARCHAR}, + + + alarm_level = #{record.alarmLevel,jdbcType=TINYINT}, + + + alarm_msg_lag = #{record.alarmMsgLag,jdbcType=INTEGER}, + + + alarm_delay_time = #{record.alarmDelayTime,jdbcType=INTEGER}, + + + broadcast_consume = #{record.broadcastConsume,jdbcType=TINYINT}, + + + consume_mode = #{record.consumeMode,jdbcType=TINYINT}, + + + consume_mode_mapper = #{record.consumeModeMapper,jdbcType=VARCHAR}, + + + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + + + config = #{record.config,jdbcType=VARCHAR}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update consume_group + set id = #{record.id,jdbcType=BIGINT}, + group_name = #{record.groupName,jdbcType=VARCHAR}, + service = #{record.service,jdbcType=VARCHAR}, + department = #{record.department,jdbcType=VARCHAR}, + contacters = #{record.contacters,jdbcType=VARCHAR}, + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + alarm_group = #{record.alarmGroup,jdbcType=VARCHAR}, + alarm_level = #{record.alarmLevel,jdbcType=TINYINT}, + alarm_msg_lag = #{record.alarmMsgLag,jdbcType=INTEGER}, + alarm_delay_time = #{record.alarmDelayTime,jdbcType=INTEGER}, + broadcast_consume = #{record.broadcastConsume,jdbcType=TINYINT}, + consume_mode = #{record.consumeMode,jdbcType=TINYINT}, + consume_mode_mapper = #{record.consumeModeMapper,jdbcType=VARCHAR}, + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + config = #{record.config,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update consume_group + + + group_name = #{groupName,jdbcType=VARCHAR}, + + + service = #{service,jdbcType=VARCHAR}, + + + department = #{department,jdbcType=VARCHAR}, + + + contacters = #{contacters,jdbcType=VARCHAR}, + + + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + + + alarm_group = #{alarmGroup,jdbcType=VARCHAR}, + + + alarm_level = #{alarmLevel,jdbcType=TINYINT}, + + + alarm_msg_lag = #{alarmMsgLag,jdbcType=INTEGER}, + + + alarm_delay_time = #{alarmDelayTime,jdbcType=INTEGER}, + + + broadcast_consume = #{broadcastConsume,jdbcType=TINYINT}, + + + consume_mode = #{consumeMode,jdbcType=TINYINT}, + + + consume_mode_mapper = #{consumeModeMapper,jdbcType=VARCHAR}, + + + extra_params = #{extraParams,jdbcType=VARCHAR}, + + + config = #{config,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update consume_group + set group_name = #{groupName,jdbcType=VARCHAR}, + service = #{service,jdbcType=VARCHAR}, + department = #{department,jdbcType=VARCHAR}, + contacters = #{contacters,jdbcType=VARCHAR}, + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + alarm_group = #{alarmGroup,jdbcType=VARCHAR}, + alarm_level = #{alarmLevel,jdbcType=TINYINT}, + alarm_msg_lag = #{alarmMsgLag,jdbcType=INTEGER}, + alarm_delay_time = #{alarmDelayTime,jdbcType=INTEGER}, + broadcast_consume = #{broadcastConsume,jdbcType=TINYINT}, + consume_mode = #{consumeMode,jdbcType=TINYINT}, + consume_mode_mapper = #{consumeModeMapper,jdbcType=VARCHAR}, + extra_params = #{extraParams,jdbcType=VARCHAR}, + config = #{config,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionCustomMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionCustomMapper.xml new file mode 100644 index 0000000..f54cb9a --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionCustomMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionMapper.xml new file mode 100644 index 0000000..b2e66a7 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/ConsumeSubscriptionMapper.xml @@ -0,0 +1,926 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, group_id, group_name, topic_id, topic_name, cluster_id, cluster_name, pressure_traffic, + max_tps, alarm_type, alarm_is_enable, alarm_level, alarm_msg_lag, alarm_delay_time, + api_type, consume_timeout, error_retry_times, retry_intervals, msg_type, enable_groovy, + enable_transit, enable_order, order_key, consume_type, big_data_type, big_data_config, + urls, http_method, http_headers, http_query_params, msg_push_type, http_token, push_max_concurrency, + actions, config, state, extra_params, remark, is_delete, create_time, modify_time + + + groovy, transit + + + + + + delete from consume_subscription + where id = #{id,jdbcType=BIGINT} + + + delete from consume_subscription + + + + + + insert into consume_subscription (group_id, group_name, topic_id, + topic_name, cluster_id, cluster_name, + pressure_traffic, max_tps, alarm_type, + alarm_is_enable, alarm_level, alarm_msg_lag, + alarm_delay_time, api_type, consume_timeout, + error_retry_times, retry_intervals, msg_type, + enable_groovy, enable_transit, enable_order, + order_key, consume_type, big_data_type, + big_data_config, urls, http_method, + http_headers, http_query_params, msg_push_type, + http_token, push_max_concurrency, actions, + config, state, extra_params, + remark, is_delete, create_time, + modify_time, groovy, transit + ) + values (#{groupId,jdbcType=BIGINT}, #{groupName,jdbcType=VARCHAR}, #{topicId,jdbcType=BIGINT}, + #{topicName,jdbcType=VARCHAR}, #{clusterId,jdbcType=BIGINT}, #{clusterName,jdbcType=VARCHAR}, + #{pressureTraffic,jdbcType=TINYINT}, #{maxTps,jdbcType=DOUBLE}, #{alarmType,jdbcType=TINYINT}, + #{alarmIsEnable,jdbcType=TINYINT}, #{alarmLevel,jdbcType=TINYINT}, #{alarmMsgLag,jdbcType=INTEGER}, + #{alarmDelayTime,jdbcType=INTEGER}, #{apiType,jdbcType=TINYINT}, #{consumeTimeout,jdbcType=INTEGER}, + #{errorRetryTimes,jdbcType=INTEGER}, #{retryIntervals,jdbcType=VARCHAR}, #{msgType,jdbcType=TINYINT}, + #{enableGroovy,jdbcType=TINYINT}, #{enableTransit,jdbcType=TINYINT}, #{enableOrder,jdbcType=TINYINT}, + #{orderKey,jdbcType=VARCHAR}, #{consumeType,jdbcType=TINYINT}, #{bigDataType,jdbcType=TINYINT}, + #{bigDataConfig,jdbcType=VARCHAR}, #{urls,jdbcType=VARCHAR}, #{httpMethod,jdbcType=TINYINT}, + #{httpHeaders,jdbcType=VARCHAR}, #{httpQueryParams,jdbcType=VARCHAR}, #{msgPushType,jdbcType=TINYINT}, + #{httpToken,jdbcType=VARCHAR}, #{pushMaxConcurrency,jdbcType=INTEGER}, #{actions,jdbcType=VARCHAR}, + #{config,jdbcType=VARCHAR}, #{state,jdbcType=TINYINT}, #{extraParams,jdbcType=VARCHAR}, + #{remark,jdbcType=VARCHAR}, #{isDelete,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, + #{modifyTime,jdbcType=TIMESTAMP}, #{groovy,jdbcType=LONGVARCHAR}, #{transit,jdbcType=LONGVARCHAR} + ) + + + insert into consume_subscription + + + group_id, + + + group_name, + + + topic_id, + + + topic_name, + + + cluster_id, + + + cluster_name, + + + pressure_traffic, + + + max_tps, + + + alarm_type, + + + alarm_is_enable, + + + alarm_level, + + + alarm_msg_lag, + + + alarm_delay_time, + + + api_type, + + + consume_timeout, + + + error_retry_times, + + + retry_intervals, + + + msg_type, + + + enable_groovy, + + + enable_transit, + + + enable_order, + + + order_key, + + + consume_type, + + + big_data_type, + + + big_data_config, + + + urls, + + + http_method, + + + http_headers, + + + http_query_params, + + + msg_push_type, + + + http_token, + + + push_max_concurrency, + + + actions, + + + config, + + + state, + + + extra_params, + + + remark, + + + is_delete, + + + create_time, + + + modify_time, + + + groovy, + + + transit, + + + + + #{groupId,jdbcType=BIGINT}, + + + #{groupName,jdbcType=VARCHAR}, + + + #{topicId,jdbcType=BIGINT}, + + + #{topicName,jdbcType=VARCHAR}, + + + #{clusterId,jdbcType=BIGINT}, + + + #{clusterName,jdbcType=VARCHAR}, + + + #{pressureTraffic,jdbcType=TINYINT}, + + + #{maxTps,jdbcType=DOUBLE}, + + + #{alarmType,jdbcType=TINYINT}, + + + #{alarmIsEnable,jdbcType=TINYINT}, + + + #{alarmLevel,jdbcType=TINYINT}, + + + #{alarmMsgLag,jdbcType=INTEGER}, + + + #{alarmDelayTime,jdbcType=INTEGER}, + + + #{apiType,jdbcType=TINYINT}, + + + #{consumeTimeout,jdbcType=INTEGER}, + + + #{errorRetryTimes,jdbcType=INTEGER}, + + + #{retryIntervals,jdbcType=VARCHAR}, + + + #{msgType,jdbcType=TINYINT}, + + + #{enableGroovy,jdbcType=TINYINT}, + + + #{enableTransit,jdbcType=TINYINT}, + + + #{enableOrder,jdbcType=TINYINT}, + + + #{orderKey,jdbcType=VARCHAR}, + + + #{consumeType,jdbcType=TINYINT}, + + + #{bigDataType,jdbcType=TINYINT}, + + + #{bigDataConfig,jdbcType=VARCHAR}, + + + #{urls,jdbcType=VARCHAR}, + + + #{httpMethod,jdbcType=TINYINT}, + + + #{httpHeaders,jdbcType=VARCHAR}, + + + #{httpQueryParams,jdbcType=VARCHAR}, + + + #{msgPushType,jdbcType=TINYINT}, + + + #{httpToken,jdbcType=VARCHAR}, + + + #{pushMaxConcurrency,jdbcType=INTEGER}, + + + #{actions,jdbcType=VARCHAR}, + + + #{config,jdbcType=VARCHAR}, + + + #{state,jdbcType=TINYINT}, + + + #{extraParams,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + #{groovy,jdbcType=LONGVARCHAR}, + + + #{transit,jdbcType=LONGVARCHAR}, + + + + + + update consume_subscription + + + id = #{record.id,jdbcType=BIGINT}, + + + group_id = #{record.groupId,jdbcType=BIGINT}, + + + group_name = #{record.groupName,jdbcType=VARCHAR}, + + + topic_id = #{record.topicId,jdbcType=BIGINT}, + + + topic_name = #{record.topicName,jdbcType=VARCHAR}, + + + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + + + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + + + pressure_traffic = #{record.pressureTraffic,jdbcType=TINYINT}, + + + max_tps = #{record.maxTps,jdbcType=DOUBLE}, + + + alarm_type = #{record.alarmType,jdbcType=TINYINT}, + + + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + + + alarm_level = #{record.alarmLevel,jdbcType=TINYINT}, + + + alarm_msg_lag = #{record.alarmMsgLag,jdbcType=INTEGER}, + + + alarm_delay_time = #{record.alarmDelayTime,jdbcType=INTEGER}, + + + api_type = #{record.apiType,jdbcType=TINYINT}, + + + consume_timeout = #{record.consumeTimeout,jdbcType=INTEGER}, + + + error_retry_times = #{record.errorRetryTimes,jdbcType=INTEGER}, + + + retry_intervals = #{record.retryIntervals,jdbcType=VARCHAR}, + + + msg_type = #{record.msgType,jdbcType=TINYINT}, + + + enable_groovy = #{record.enableGroovy,jdbcType=TINYINT}, + + + enable_transit = #{record.enableTransit,jdbcType=TINYINT}, + + + enable_order = #{record.enableOrder,jdbcType=TINYINT}, + + + order_key = #{record.orderKey,jdbcType=VARCHAR}, + + + consume_type = #{record.consumeType,jdbcType=TINYINT}, + + + big_data_type = #{record.bigDataType,jdbcType=TINYINT}, + + + big_data_config = #{record.bigDataConfig,jdbcType=VARCHAR}, + + + urls = #{record.urls,jdbcType=VARCHAR}, + + + http_method = #{record.httpMethod,jdbcType=TINYINT}, + + + http_headers = #{record.httpHeaders,jdbcType=VARCHAR}, + + + http_query_params = #{record.httpQueryParams,jdbcType=VARCHAR}, + + + msg_push_type = #{record.msgPushType,jdbcType=TINYINT}, + + + http_token = #{record.httpToken,jdbcType=VARCHAR}, + + + push_max_concurrency = #{record.pushMaxConcurrency,jdbcType=INTEGER}, + + + actions = #{record.actions,jdbcType=VARCHAR}, + + + config = #{record.config,jdbcType=VARCHAR}, + + + state = #{record.state,jdbcType=TINYINT}, + + + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + groovy = #{record.groovy,jdbcType=LONGVARCHAR}, + + + transit = #{record.transit,jdbcType=LONGVARCHAR}, + + + + + + + + update consume_subscription + set id = #{record.id,jdbcType=BIGINT}, + group_id = #{record.groupId,jdbcType=BIGINT}, + group_name = #{record.groupName,jdbcType=VARCHAR}, + topic_id = #{record.topicId,jdbcType=BIGINT}, + topic_name = #{record.topicName,jdbcType=VARCHAR}, + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + pressure_traffic = #{record.pressureTraffic,jdbcType=TINYINT}, + max_tps = #{record.maxTps,jdbcType=DOUBLE}, + alarm_type = #{record.alarmType,jdbcType=TINYINT}, + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + alarm_level = #{record.alarmLevel,jdbcType=TINYINT}, + alarm_msg_lag = #{record.alarmMsgLag,jdbcType=INTEGER}, + alarm_delay_time = #{record.alarmDelayTime,jdbcType=INTEGER}, + api_type = #{record.apiType,jdbcType=TINYINT}, + consume_timeout = #{record.consumeTimeout,jdbcType=INTEGER}, + error_retry_times = #{record.errorRetryTimes,jdbcType=INTEGER}, + retry_intervals = #{record.retryIntervals,jdbcType=VARCHAR}, + msg_type = #{record.msgType,jdbcType=TINYINT}, + enable_groovy = #{record.enableGroovy,jdbcType=TINYINT}, + enable_transit = #{record.enableTransit,jdbcType=TINYINT}, + enable_order = #{record.enableOrder,jdbcType=TINYINT}, + order_key = #{record.orderKey,jdbcType=VARCHAR}, + consume_type = #{record.consumeType,jdbcType=TINYINT}, + big_data_type = #{record.bigDataType,jdbcType=TINYINT}, + big_data_config = #{record.bigDataConfig,jdbcType=VARCHAR}, + urls = #{record.urls,jdbcType=VARCHAR}, + http_method = #{record.httpMethod,jdbcType=TINYINT}, + http_headers = #{record.httpHeaders,jdbcType=VARCHAR}, + http_query_params = #{record.httpQueryParams,jdbcType=VARCHAR}, + msg_push_type = #{record.msgPushType,jdbcType=TINYINT}, + http_token = #{record.httpToken,jdbcType=VARCHAR}, + push_max_concurrency = #{record.pushMaxConcurrency,jdbcType=INTEGER}, + actions = #{record.actions,jdbcType=VARCHAR}, + config = #{record.config,jdbcType=VARCHAR}, + state = #{record.state,jdbcType=TINYINT}, + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + groovy = #{record.groovy,jdbcType=LONGVARCHAR}, + transit = #{record.transit,jdbcType=LONGVARCHAR} + + + + + + update consume_subscription + set id = #{record.id,jdbcType=BIGINT}, + group_id = #{record.groupId,jdbcType=BIGINT}, + group_name = #{record.groupName,jdbcType=VARCHAR}, + topic_id = #{record.topicId,jdbcType=BIGINT}, + topic_name = #{record.topicName,jdbcType=VARCHAR}, + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + pressure_traffic = #{record.pressureTraffic,jdbcType=TINYINT}, + max_tps = #{record.maxTps,jdbcType=DOUBLE}, + alarm_type = #{record.alarmType,jdbcType=TINYINT}, + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + alarm_level = #{record.alarmLevel,jdbcType=TINYINT}, + alarm_msg_lag = #{record.alarmMsgLag,jdbcType=INTEGER}, + alarm_delay_time = #{record.alarmDelayTime,jdbcType=INTEGER}, + api_type = #{record.apiType,jdbcType=TINYINT}, + consume_timeout = #{record.consumeTimeout,jdbcType=INTEGER}, + error_retry_times = #{record.errorRetryTimes,jdbcType=INTEGER}, + retry_intervals = #{record.retryIntervals,jdbcType=VARCHAR}, + msg_type = #{record.msgType,jdbcType=TINYINT}, + enable_groovy = #{record.enableGroovy,jdbcType=TINYINT}, + enable_transit = #{record.enableTransit,jdbcType=TINYINT}, + enable_order = #{record.enableOrder,jdbcType=TINYINT}, + order_key = #{record.orderKey,jdbcType=VARCHAR}, + consume_type = #{record.consumeType,jdbcType=TINYINT}, + big_data_type = #{record.bigDataType,jdbcType=TINYINT}, + big_data_config = #{record.bigDataConfig,jdbcType=VARCHAR}, + urls = #{record.urls,jdbcType=VARCHAR}, + http_method = #{record.httpMethod,jdbcType=TINYINT}, + http_headers = #{record.httpHeaders,jdbcType=VARCHAR}, + http_query_params = #{record.httpQueryParams,jdbcType=VARCHAR}, + msg_push_type = #{record.msgPushType,jdbcType=TINYINT}, + http_token = #{record.httpToken,jdbcType=VARCHAR}, + push_max_concurrency = #{record.pushMaxConcurrency,jdbcType=INTEGER}, + actions = #{record.actions,jdbcType=VARCHAR}, + config = #{record.config,jdbcType=VARCHAR}, + state = #{record.state,jdbcType=TINYINT}, + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update consume_subscription + + + group_id = #{groupId,jdbcType=BIGINT}, + + + group_name = #{groupName,jdbcType=VARCHAR}, + + + topic_id = #{topicId,jdbcType=BIGINT}, + + + topic_name = #{topicName,jdbcType=VARCHAR}, + + + cluster_id = #{clusterId,jdbcType=BIGINT}, + + + cluster_name = #{clusterName,jdbcType=VARCHAR}, + + + pressure_traffic = #{pressureTraffic,jdbcType=TINYINT}, + + + max_tps = #{maxTps,jdbcType=DOUBLE}, + + + alarm_type = #{alarmType,jdbcType=TINYINT}, + + + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + + + alarm_level = #{alarmLevel,jdbcType=TINYINT}, + + + alarm_msg_lag = #{alarmMsgLag,jdbcType=INTEGER}, + + + alarm_delay_time = #{alarmDelayTime,jdbcType=INTEGER}, + + + api_type = #{apiType,jdbcType=TINYINT}, + + + consume_timeout = #{consumeTimeout,jdbcType=INTEGER}, + + + error_retry_times = #{errorRetryTimes,jdbcType=INTEGER}, + + + retry_intervals = #{retryIntervals,jdbcType=VARCHAR}, + + + msg_type = #{msgType,jdbcType=TINYINT}, + + + enable_groovy = #{enableGroovy,jdbcType=TINYINT}, + + + enable_transit = #{enableTransit,jdbcType=TINYINT}, + + + enable_order = #{enableOrder,jdbcType=TINYINT}, + + + order_key = #{orderKey,jdbcType=VARCHAR}, + + + consume_type = #{consumeType,jdbcType=TINYINT}, + + + big_data_type = #{bigDataType,jdbcType=TINYINT}, + + + big_data_config = #{bigDataConfig,jdbcType=VARCHAR}, + + + urls = #{urls,jdbcType=VARCHAR}, + + + http_method = #{httpMethod,jdbcType=TINYINT}, + + + http_headers = #{httpHeaders,jdbcType=VARCHAR}, + + + http_query_params = #{httpQueryParams,jdbcType=VARCHAR}, + + + msg_push_type = #{msgPushType,jdbcType=TINYINT}, + + + http_token = #{httpToken,jdbcType=VARCHAR}, + + + push_max_concurrency = #{pushMaxConcurrency,jdbcType=INTEGER}, + + + actions = #{actions,jdbcType=VARCHAR}, + + + config = #{config,jdbcType=VARCHAR}, + + + state = #{state,jdbcType=TINYINT}, + + + extra_params = #{extraParams,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + groovy = #{groovy,jdbcType=LONGVARCHAR}, + + + transit = #{transit,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update consume_subscription + set group_id = #{groupId,jdbcType=BIGINT}, + group_name = #{groupName,jdbcType=VARCHAR}, + topic_id = #{topicId,jdbcType=BIGINT}, + topic_name = #{topicName,jdbcType=VARCHAR}, + cluster_id = #{clusterId,jdbcType=BIGINT}, + cluster_name = #{clusterName,jdbcType=VARCHAR}, + pressure_traffic = #{pressureTraffic,jdbcType=TINYINT}, + max_tps = #{maxTps,jdbcType=DOUBLE}, + alarm_type = #{alarmType,jdbcType=TINYINT}, + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + alarm_level = #{alarmLevel,jdbcType=TINYINT}, + alarm_msg_lag = #{alarmMsgLag,jdbcType=INTEGER}, + alarm_delay_time = #{alarmDelayTime,jdbcType=INTEGER}, + api_type = #{apiType,jdbcType=TINYINT}, + consume_timeout = #{consumeTimeout,jdbcType=INTEGER}, + error_retry_times = #{errorRetryTimes,jdbcType=INTEGER}, + retry_intervals = #{retryIntervals,jdbcType=VARCHAR}, + msg_type = #{msgType,jdbcType=TINYINT}, + enable_groovy = #{enableGroovy,jdbcType=TINYINT}, + enable_transit = #{enableTransit,jdbcType=TINYINT}, + enable_order = #{enableOrder,jdbcType=TINYINT}, + order_key = #{orderKey,jdbcType=VARCHAR}, + consume_type = #{consumeType,jdbcType=TINYINT}, + big_data_type = #{bigDataType,jdbcType=TINYINT}, + big_data_config = #{bigDataConfig,jdbcType=VARCHAR}, + urls = #{urls,jdbcType=VARCHAR}, + http_method = #{httpMethod,jdbcType=TINYINT}, + http_headers = #{httpHeaders,jdbcType=VARCHAR}, + http_query_params = #{httpQueryParams,jdbcType=VARCHAR}, + msg_push_type = #{msgPushType,jdbcType=TINYINT}, + http_token = #{httpToken,jdbcType=VARCHAR}, + push_max_concurrency = #{pushMaxConcurrency,jdbcType=INTEGER}, + actions = #{actions,jdbcType=VARCHAR}, + config = #{config,jdbcType=VARCHAR}, + state = #{state,jdbcType=TINYINT}, + extra_params = #{extraParams,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + groovy = #{groovy,jdbcType=LONGVARCHAR}, + transit = #{transit,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update consume_subscription + set group_id = #{groupId,jdbcType=BIGINT}, + group_name = #{groupName,jdbcType=VARCHAR}, + topic_id = #{topicId,jdbcType=BIGINT}, + topic_name = #{topicName,jdbcType=VARCHAR}, + cluster_id = #{clusterId,jdbcType=BIGINT}, + cluster_name = #{clusterName,jdbcType=VARCHAR}, + pressure_traffic = #{pressureTraffic,jdbcType=TINYINT}, + max_tps = #{maxTps,jdbcType=DOUBLE}, + alarm_type = #{alarmType,jdbcType=TINYINT}, + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + alarm_level = #{alarmLevel,jdbcType=TINYINT}, + alarm_msg_lag = #{alarmMsgLag,jdbcType=INTEGER}, + alarm_delay_time = #{alarmDelayTime,jdbcType=INTEGER}, + api_type = #{apiType,jdbcType=TINYINT}, + consume_timeout = #{consumeTimeout,jdbcType=INTEGER}, + error_retry_times = #{errorRetryTimes,jdbcType=INTEGER}, + retry_intervals = #{retryIntervals,jdbcType=VARCHAR}, + msg_type = #{msgType,jdbcType=TINYINT}, + enable_groovy = #{enableGroovy,jdbcType=TINYINT}, + enable_transit = #{enableTransit,jdbcType=TINYINT}, + enable_order = #{enableOrder,jdbcType=TINYINT}, + order_key = #{orderKey,jdbcType=VARCHAR}, + consume_type = #{consumeType,jdbcType=TINYINT}, + big_data_type = #{bigDataType,jdbcType=TINYINT}, + big_data_config = #{bigDataConfig,jdbcType=VARCHAR}, + urls = #{urls,jdbcType=VARCHAR}, + http_method = #{httpMethod,jdbcType=TINYINT}, + http_headers = #{httpHeaders,jdbcType=VARCHAR}, + http_query_params = #{httpQueryParams,jdbcType=VARCHAR}, + msg_push_type = #{msgPushType,jdbcType=TINYINT}, + http_token = #{httpToken,jdbcType=VARCHAR}, + push_max_concurrency = #{pushMaxConcurrency,jdbcType=INTEGER}, + actions = #{actions,jdbcType=VARCHAR}, + config = #{config,jdbcType=VARCHAR}, + state = #{state,jdbcType=TINYINT}, + extra_params = #{extraParams,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/IdcMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/IdcMapper.xml new file mode 100644 index 0000000..f5d3b7c --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/IdcMapper.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, name, remark, is_delete, create_time, modify_time + + + + + delete from idc + where id = #{id,jdbcType=BIGINT} + + + delete from idc + + + + + + insert into idc (name, remark, is_delete, + create_time, modify_time) + values (#{name,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{isDelete,jdbcType=TINYINT}, + #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP}) + + + insert into idc + + + name, + + + remark, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{name,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update idc + + + id = #{record.id,jdbcType=BIGINT}, + + + name = #{record.name,jdbcType=VARCHAR}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update idc + set id = #{record.id,jdbcType=BIGINT}, + name = #{record.name,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update idc + + + name = #{name,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update idc + set name = #{name,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/MqServerMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/MqServerMapper.xml new file mode 100644 index 0000000..ab40a90 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/MqServerMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, name, addr, type, is_delete, create_time, modify_time + + + + + delete from mq_server + where id = #{id,jdbcType=BIGINT} + + + delete from mq_server + + + + + + insert into mq_server (name, addr, type, + is_delete, create_time, modify_time + ) + values (#{name,jdbcType=VARCHAR}, #{addr,jdbcType=VARCHAR}, #{type,jdbcType=TINYINT}, + #{isDelete,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP} + ) + + + insert into mq_server + + + name, + + + addr, + + + type, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{name,jdbcType=VARCHAR}, + + + #{addr,jdbcType=VARCHAR}, + + + #{type,jdbcType=TINYINT}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update mq_server + + + id = #{record.id,jdbcType=BIGINT}, + + + name = #{record.name,jdbcType=VARCHAR}, + + + addr = #{record.addr,jdbcType=VARCHAR}, + + + type = #{record.type,jdbcType=TINYINT}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update mq_server + set id = #{record.id,jdbcType=BIGINT}, + name = #{record.name,jdbcType=VARCHAR}, + addr = #{record.addr,jdbcType=VARCHAR}, + type = #{record.type,jdbcType=TINYINT}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update mq_server + + + name = #{name,jdbcType=VARCHAR}, + + + addr = #{addr,jdbcType=VARCHAR}, + + + type = #{type,jdbcType=TINYINT}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update mq_server + set name = #{name,jdbcType=VARCHAR}, + addr = #{addr,jdbcType=VARCHAR}, + type = #{type,jdbcType=TINYINT}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/NodeMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/NodeMapper.xml new file mode 100644 index 0000000..23c3bc0 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/NodeMapper.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, cluster_id, model_id, master_id, host, node_type, is_delete, create_time, modify_time + + + + + delete from node + where id = #{id,jdbcType=BIGINT} + + + delete from node + + + + + + insert into node (cluster_id, model_id, master_id, + host, node_type, is_delete, + create_time, modify_time) + values (#{clusterId,jdbcType=BIGINT}, #{modelId,jdbcType=BIGINT}, #{masterId,jdbcType=BIGINT}, + #{host,jdbcType=VARCHAR}, #{nodeType,jdbcType=TINYINT}, #{isDelete,jdbcType=TINYINT}, + #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP}) + + + insert into node + + + cluster_id, + + + model_id, + + + master_id, + + + host, + + + node_type, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{clusterId,jdbcType=BIGINT}, + + + #{modelId,jdbcType=BIGINT}, + + + #{masterId,jdbcType=BIGINT}, + + + #{host,jdbcType=VARCHAR}, + + + #{nodeType,jdbcType=TINYINT}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update node + + + id = #{record.id,jdbcType=BIGINT}, + + + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + + + model_id = #{record.modelId,jdbcType=BIGINT}, + + + master_id = #{record.masterId,jdbcType=BIGINT}, + + + host = #{record.host,jdbcType=VARCHAR}, + + + node_type = #{record.nodeType,jdbcType=TINYINT}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update node + set id = #{record.id,jdbcType=BIGINT}, + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + model_id = #{record.modelId,jdbcType=BIGINT}, + master_id = #{record.masterId,jdbcType=BIGINT}, + host = #{record.host,jdbcType=VARCHAR}, + node_type = #{record.nodeType,jdbcType=TINYINT}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update node + + + cluster_id = #{clusterId,jdbcType=BIGINT}, + + + model_id = #{modelId,jdbcType=BIGINT}, + + + master_id = #{masterId,jdbcType=BIGINT}, + + + host = #{host,jdbcType=VARCHAR}, + + + node_type = #{nodeType,jdbcType=TINYINT}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update node + set cluster_id = #{clusterId,jdbcType=BIGINT}, + model_id = #{modelId,jdbcType=BIGINT}, + master_id = #{masterId,jdbcType=BIGINT}, + host = #{host,jdbcType=VARCHAR}, + node_type = #{nodeType,jdbcType=TINYINT}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfCustomMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfCustomMapper.xml new file mode 100644 index 0000000..291fb38 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfCustomMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfMapper.xml new file mode 100644 index 0000000..c56f5eb --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicConfMapper.xml @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, topic_id, topic_name, cluster_id, cluster_name, mq_server_id, mq_server_name, + server_idc_id, server_idc_name, client_idc, produce_tps, msg_avg_size, msg_max_size, + state, config, is_delete, create_time, modify_time + + + + + delete from topic_conf + where id = #{id,jdbcType=BIGINT} + + + delete from topic_conf + + + + + + insert into topic_conf (topic_id, topic_name, cluster_id, + cluster_name, mq_server_id, mq_server_name, + server_idc_id, server_idc_name, client_idc, + produce_tps, msg_avg_size, msg_max_size, + state, config, is_delete, + create_time, modify_time) + values (#{topicId,jdbcType=BIGINT}, #{topicName,jdbcType=VARCHAR}, #{clusterId,jdbcType=BIGINT}, + #{clusterName,jdbcType=VARCHAR}, #{mqServerId,jdbcType=BIGINT}, #{mqServerName,jdbcType=VARCHAR}, + #{serverIdcId,jdbcType=BIGINT}, #{serverIdcName,jdbcType=VARCHAR}, #{clientIdc,jdbcType=VARCHAR}, + #{produceTps,jdbcType=INTEGER}, #{msgAvgSize,jdbcType=INTEGER}, #{msgMaxSize,jdbcType=INTEGER}, + #{state,jdbcType=TINYINT}, #{config,jdbcType=VARCHAR}, #{isDelete,jdbcType=TINYINT}, + #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP}) + + + insert into topic_conf + + + topic_id, + + + topic_name, + + + cluster_id, + + + cluster_name, + + + mq_server_id, + + + mq_server_name, + + + server_idc_id, + + + server_idc_name, + + + client_idc, + + + produce_tps, + + + msg_avg_size, + + + msg_max_size, + + + state, + + + config, + + + is_delete, + + + create_time, + + + modify_time, + + + + + #{topicId,jdbcType=BIGINT}, + + + #{topicName,jdbcType=VARCHAR}, + + + #{clusterId,jdbcType=BIGINT}, + + + #{clusterName,jdbcType=VARCHAR}, + + + #{mqServerId,jdbcType=BIGINT}, + + + #{mqServerName,jdbcType=VARCHAR}, + + + #{serverIdcId,jdbcType=BIGINT}, + + + #{serverIdcName,jdbcType=VARCHAR}, + + + #{clientIdc,jdbcType=VARCHAR}, + + + #{produceTps,jdbcType=INTEGER}, + + + #{msgAvgSize,jdbcType=INTEGER}, + + + #{msgMaxSize,jdbcType=INTEGER}, + + + #{state,jdbcType=TINYINT}, + + + #{config,jdbcType=VARCHAR}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update topic_conf + + + id = #{record.id,jdbcType=BIGINT}, + + + topic_id = #{record.topicId,jdbcType=BIGINT}, + + + topic_name = #{record.topicName,jdbcType=VARCHAR}, + + + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + + + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + + + mq_server_id = #{record.mqServerId,jdbcType=BIGINT}, + + + mq_server_name = #{record.mqServerName,jdbcType=VARCHAR}, + + + server_idc_id = #{record.serverIdcId,jdbcType=BIGINT}, + + + server_idc_name = #{record.serverIdcName,jdbcType=VARCHAR}, + + + client_idc = #{record.clientIdc,jdbcType=VARCHAR}, + + + produce_tps = #{record.produceTps,jdbcType=INTEGER}, + + + msg_avg_size = #{record.msgAvgSize,jdbcType=INTEGER}, + + + msg_max_size = #{record.msgMaxSize,jdbcType=INTEGER}, + + + state = #{record.state,jdbcType=TINYINT}, + + + config = #{record.config,jdbcType=VARCHAR}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update topic_conf + set id = #{record.id,jdbcType=BIGINT}, + topic_id = #{record.topicId,jdbcType=BIGINT}, + topic_name = #{record.topicName,jdbcType=VARCHAR}, + cluster_id = #{record.clusterId,jdbcType=BIGINT}, + cluster_name = #{record.clusterName,jdbcType=VARCHAR}, + mq_server_id = #{record.mqServerId,jdbcType=BIGINT}, + mq_server_name = #{record.mqServerName,jdbcType=VARCHAR}, + server_idc_id = #{record.serverIdcId,jdbcType=BIGINT}, + server_idc_name = #{record.serverIdcName,jdbcType=VARCHAR}, + client_idc = #{record.clientIdc,jdbcType=VARCHAR}, + produce_tps = #{record.produceTps,jdbcType=INTEGER}, + msg_avg_size = #{record.msgAvgSize,jdbcType=INTEGER}, + msg_max_size = #{record.msgMaxSize,jdbcType=INTEGER}, + state = #{record.state,jdbcType=TINYINT}, + config = #{record.config,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update topic_conf + + + topic_id = #{topicId,jdbcType=BIGINT}, + + + topic_name = #{topicName,jdbcType=VARCHAR}, + + + cluster_id = #{clusterId,jdbcType=BIGINT}, + + + cluster_name = #{clusterName,jdbcType=VARCHAR}, + + + mq_server_id = #{mqServerId,jdbcType=BIGINT}, + + + mq_server_name = #{mqServerName,jdbcType=VARCHAR}, + + + server_idc_id = #{serverIdcId,jdbcType=BIGINT}, + + + server_idc_name = #{serverIdcName,jdbcType=VARCHAR}, + + + client_idc = #{clientIdc,jdbcType=VARCHAR}, + + + produce_tps = #{produceTps,jdbcType=INTEGER}, + + + msg_avg_size = #{msgAvgSize,jdbcType=INTEGER}, + + + msg_max_size = #{msgMaxSize,jdbcType=INTEGER}, + + + state = #{state,jdbcType=TINYINT}, + + + config = #{config,jdbcType=VARCHAR}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update topic_conf + set topic_id = #{topicId,jdbcType=BIGINT}, + topic_name = #{topicName,jdbcType=VARCHAR}, + cluster_id = #{clusterId,jdbcType=BIGINT}, + cluster_name = #{clusterName,jdbcType=VARCHAR}, + mq_server_id = #{mqServerId,jdbcType=BIGINT}, + mq_server_name = #{mqServerName,jdbcType=VARCHAR}, + server_idc_id = #{serverIdcId,jdbcType=BIGINT}, + server_idc_name = #{serverIdcName,jdbcType=VARCHAR}, + client_idc = #{clientIdc,jdbcType=VARCHAR}, + produce_tps = #{produceTps,jdbcType=INTEGER}, + msg_avg_size = #{msgAvgSize,jdbcType=INTEGER}, + msg_max_size = #{msgMaxSize,jdbcType=INTEGER}, + state = #{state,jdbcType=TINYINT}, + config = #{config,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicCustomMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicCustomMapper.xml new file mode 100644 index 0000000..128bada --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicCustomMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicMapper.xml b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicMapper.xml new file mode 100644 index 0000000..52f432e --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/sqlmap/ddmq/TopicMapper.xml @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, topic_name, service, department, contacters, alarm_group, alarm_is_enable, delay_topic, + need_audit_subinfo, enable_schema_verify, produce_mode, produce_mode_mapper, state, + config, description, extra_params, is_delete, create_time, modify_time + + + topic_schema + + + + + + delete from topic + where id = #{id,jdbcType=BIGINT} + + + delete from topic + + + + + + insert into topic (topic_name, service, department, + contacters, alarm_group, alarm_is_enable, + delay_topic, need_audit_subinfo, enable_schema_verify, + produce_mode, produce_mode_mapper, state, + config, description, extra_params, + is_delete, create_time, modify_time, + topic_schema) + values (#{topicName,jdbcType=VARCHAR}, #{service,jdbcType=VARCHAR}, #{department,jdbcType=VARCHAR}, + #{contacters,jdbcType=VARCHAR}, #{alarmGroup,jdbcType=VARCHAR}, #{alarmIsEnable,jdbcType=TINYINT}, + #{delayTopic,jdbcType=TINYINT}, #{needAuditSubinfo,jdbcType=TINYINT}, #{enableSchemaVerify,jdbcType=TINYINT}, + #{produceMode,jdbcType=TINYINT}, #{produceModeMapper,jdbcType=VARCHAR}, #{state,jdbcType=TINYINT}, + #{config,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{extraParams,jdbcType=VARCHAR}, + #{isDelete,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP}, + #{topicSchema,jdbcType=LONGVARCHAR}) + + + insert into topic + + + topic_name, + + + service, + + + department, + + + contacters, + + + alarm_group, + + + alarm_is_enable, + + + delay_topic, + + + need_audit_subinfo, + + + enable_schema_verify, + + + produce_mode, + + + produce_mode_mapper, + + + state, + + + config, + + + description, + + + extra_params, + + + is_delete, + + + create_time, + + + modify_time, + + + topic_schema, + + + + + #{topicName,jdbcType=VARCHAR}, + + + #{service,jdbcType=VARCHAR}, + + + #{department,jdbcType=VARCHAR}, + + + #{contacters,jdbcType=VARCHAR}, + + + #{alarmGroup,jdbcType=VARCHAR}, + + + #{alarmIsEnable,jdbcType=TINYINT}, + + + #{delayTopic,jdbcType=TINYINT}, + + + #{needAuditSubinfo,jdbcType=TINYINT}, + + + #{enableSchemaVerify,jdbcType=TINYINT}, + + + #{produceMode,jdbcType=TINYINT}, + + + #{produceModeMapper,jdbcType=VARCHAR}, + + + #{state,jdbcType=TINYINT}, + + + #{config,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{extraParams,jdbcType=VARCHAR}, + + + #{isDelete,jdbcType=TINYINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + #{topicSchema,jdbcType=LONGVARCHAR}, + + + + + + update topic + + + id = #{record.id,jdbcType=BIGINT}, + + + topic_name = #{record.topicName,jdbcType=VARCHAR}, + + + service = #{record.service,jdbcType=VARCHAR}, + + + department = #{record.department,jdbcType=VARCHAR}, + + + contacters = #{record.contacters,jdbcType=VARCHAR}, + + + alarm_group = #{record.alarmGroup,jdbcType=VARCHAR}, + + + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + + + delay_topic = #{record.delayTopic,jdbcType=TINYINT}, + + + need_audit_subinfo = #{record.needAuditSubinfo,jdbcType=TINYINT}, + + + enable_schema_verify = #{record.enableSchemaVerify,jdbcType=TINYINT}, + + + produce_mode = #{record.produceMode,jdbcType=TINYINT}, + + + produce_mode_mapper = #{record.produceModeMapper,jdbcType=VARCHAR}, + + + state = #{record.state,jdbcType=TINYINT}, + + + config = #{record.config,jdbcType=VARCHAR}, + + + description = #{record.description,jdbcType=VARCHAR}, + + + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + + + is_delete = #{record.isDelete,jdbcType=TINYINT}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + topic_schema = #{record.topicSchema,jdbcType=LONGVARCHAR}, + + + + + + + + update topic + set id = #{record.id,jdbcType=BIGINT}, + topic_name = #{record.topicName,jdbcType=VARCHAR}, + service = #{record.service,jdbcType=VARCHAR}, + department = #{record.department,jdbcType=VARCHAR}, + contacters = #{record.contacters,jdbcType=VARCHAR}, + alarm_group = #{record.alarmGroup,jdbcType=VARCHAR}, + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + delay_topic = #{record.delayTopic,jdbcType=TINYINT}, + need_audit_subinfo = #{record.needAuditSubinfo,jdbcType=TINYINT}, + enable_schema_verify = #{record.enableSchemaVerify,jdbcType=TINYINT}, + produce_mode = #{record.produceMode,jdbcType=TINYINT}, + produce_mode_mapper = #{record.produceModeMapper,jdbcType=VARCHAR}, + state = #{record.state,jdbcType=TINYINT}, + config = #{record.config,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=VARCHAR}, + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + topic_schema = #{record.topicSchema,jdbcType=LONGVARCHAR} + + + + + + update topic + set id = #{record.id,jdbcType=BIGINT}, + topic_name = #{record.topicName,jdbcType=VARCHAR}, + service = #{record.service,jdbcType=VARCHAR}, + department = #{record.department,jdbcType=VARCHAR}, + contacters = #{record.contacters,jdbcType=VARCHAR}, + alarm_group = #{record.alarmGroup,jdbcType=VARCHAR}, + alarm_is_enable = #{record.alarmIsEnable,jdbcType=TINYINT}, + delay_topic = #{record.delayTopic,jdbcType=TINYINT}, + need_audit_subinfo = #{record.needAuditSubinfo,jdbcType=TINYINT}, + enable_schema_verify = #{record.enableSchemaVerify,jdbcType=TINYINT}, + produce_mode = #{record.produceMode,jdbcType=TINYINT}, + produce_mode_mapper = #{record.produceModeMapper,jdbcType=VARCHAR}, + state = #{record.state,jdbcType=TINYINT}, + config = #{record.config,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=VARCHAR}, + extra_params = #{record.extraParams,jdbcType=VARCHAR}, + is_delete = #{record.isDelete,jdbcType=TINYINT}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update topic + + + topic_name = #{topicName,jdbcType=VARCHAR}, + + + service = #{service,jdbcType=VARCHAR}, + + + department = #{department,jdbcType=VARCHAR}, + + + contacters = #{contacters,jdbcType=VARCHAR}, + + + alarm_group = #{alarmGroup,jdbcType=VARCHAR}, + + + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + + + delay_topic = #{delayTopic,jdbcType=TINYINT}, + + + need_audit_subinfo = #{needAuditSubinfo,jdbcType=TINYINT}, + + + enable_schema_verify = #{enableSchemaVerify,jdbcType=TINYINT}, + + + produce_mode = #{produceMode,jdbcType=TINYINT}, + + + produce_mode_mapper = #{produceModeMapper,jdbcType=VARCHAR}, + + + state = #{state,jdbcType=TINYINT}, + + + config = #{config,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=VARCHAR}, + + + extra_params = #{extraParams,jdbcType=VARCHAR}, + + + is_delete = #{isDelete,jdbcType=TINYINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + topic_schema = #{topicSchema,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update topic + set topic_name = #{topicName,jdbcType=VARCHAR}, + service = #{service,jdbcType=VARCHAR}, + department = #{department,jdbcType=VARCHAR}, + contacters = #{contacters,jdbcType=VARCHAR}, + alarm_group = #{alarmGroup,jdbcType=VARCHAR}, + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + delay_topic = #{delayTopic,jdbcType=TINYINT}, + need_audit_subinfo = #{needAuditSubinfo,jdbcType=TINYINT}, + enable_schema_verify = #{enableSchemaVerify,jdbcType=TINYINT}, + produce_mode = #{produceMode,jdbcType=TINYINT}, + produce_mode_mapper = #{produceModeMapper,jdbcType=VARCHAR}, + state = #{state,jdbcType=TINYINT}, + config = #{config,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + extra_params = #{extraParams,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + topic_schema = #{topicSchema,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update topic + set topic_name = #{topicName,jdbcType=VARCHAR}, + service = #{service,jdbcType=VARCHAR}, + department = #{department,jdbcType=VARCHAR}, + contacters = #{contacters,jdbcType=VARCHAR}, + alarm_group = #{alarmGroup,jdbcType=VARCHAR}, + alarm_is_enable = #{alarmIsEnable,jdbcType=TINYINT}, + delay_topic = #{delayTopic,jdbcType=TINYINT}, + need_audit_subinfo = #{needAuditSubinfo,jdbcType=TINYINT}, + enable_schema_verify = #{enableSchemaVerify,jdbcType=TINYINT}, + produce_mode = #{produceMode,jdbcType=TINYINT}, + produce_mode_mapper = #{produceModeMapper,jdbcType=VARCHAR}, + state = #{state,jdbcType=TINYINT}, + config = #{config,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + extra_params = #{extraParams,jdbcType=VARCHAR}, + is_delete = #{isDelete,jdbcType=TINYINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/static/.gitkeep b/carrera-console/carrera-boot/src/main/resources/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/carrera-console/carrera-boot/src/main/resources/static/1.index.css b/carrera-console/carrera-boot/src/main/resources/static/1.index.css new file mode 100644 index 0000000..511960b --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/1.index.css @@ -0,0 +1 @@ +.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5)}.cm-animate-fat-cursor,.cm-fat-cursor-mark{-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none}.cm-s-3024-day.CodeMirror{background:#f7f7f7;color:#3a3432}.cm-s-3024-day div.CodeMirror-selected{background:#d6d5d4}.cm-s-3024-day .CodeMirror-line::selection,.cm-s-3024-day .CodeMirror-line>span::selection,.cm-s-3024-day .CodeMirror-line>span>span::selection{background:#d6d5d4}.cm-s-3024-day .CodeMirror-line::-moz-selection,.cm-s-3024-day .CodeMirror-line>span::-moz-selection,.cm-s-3024-day .CodeMirror-line>span>span::selection{background:#d9d9d9}.cm-s-3024-day .CodeMirror-gutters{background:#f7f7f7;border-right:0}.cm-s-3024-day .CodeMirror-guttermarker{color:#db2d20}.cm-s-3024-day .CodeMirror-guttermarker-subtle,.cm-s-3024-day .CodeMirror-linenumber{color:#807d7c}.cm-s-3024-day .CodeMirror-cursor{border-left:1px solid #5c5855}.cm-s-3024-day span.cm-comment{color:#cdab53}.cm-s-3024-day span.cm-atom,.cm-s-3024-day span.cm-number{color:#a16a94}.cm-s-3024-day span.cm-attribute,.cm-s-3024-day span.cm-property{color:#01a252}.cm-s-3024-day span.cm-keyword{color:#db2d20}.cm-s-3024-day span.cm-string{color:#fded02}.cm-s-3024-day span.cm-variable{color:#01a252}.cm-s-3024-day span.cm-variable-2{color:#01a0e4}.cm-s-3024-day span.cm-def{color:#e8bbd0}.cm-s-3024-day span.cm-bracket{color:#3a3432}.cm-s-3024-day span.cm-tag{color:#db2d20}.cm-s-3024-day span.cm-link{color:#a16a94}.cm-s-3024-day span.cm-error{background:#db2d20;color:#5c5855}.cm-s-3024-day .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-3024-day .CodeMirror-matchingbracket{text-decoration:underline;color:#a16a94!important}.cm-s-3024-night.CodeMirror{background:#090300;color:#d6d5d4}.cm-s-3024-night div.CodeMirror-selected{background:#3a3432}.cm-s-3024-night .CodeMirror-line::selection,.cm-s-3024-night .CodeMirror-line>span::selection,.cm-s-3024-night .CodeMirror-line>span>span::selection{background:rgba(58,52,50,.99)}.cm-s-3024-night .CodeMirror-line::-moz-selection,.cm-s-3024-night .CodeMirror-line>span::-moz-selection,.cm-s-3024-night .CodeMirror-line>span>span::-moz-selection{background:rgba(58,52,50,.99)}.cm-s-3024-night .CodeMirror-gutters{background:#090300;border-right:0}.cm-s-3024-night .CodeMirror-guttermarker{color:#db2d20}.cm-s-3024-night .CodeMirror-guttermarker-subtle,.cm-s-3024-night .CodeMirror-linenumber{color:#5c5855}.cm-s-3024-night .CodeMirror-cursor{border-left:1px solid #807d7c}.cm-s-3024-night span.cm-comment{color:#cdab53}.cm-s-3024-night span.cm-atom,.cm-s-3024-night span.cm-number{color:#a16a94}.cm-s-3024-night span.cm-attribute,.cm-s-3024-night span.cm-property{color:#01a252}.cm-s-3024-night span.cm-keyword{color:#db2d20}.cm-s-3024-night span.cm-string{color:#fded02}.cm-s-3024-night span.cm-variable{color:#01a252}.cm-s-3024-night span.cm-variable-2{color:#01a0e4}.cm-s-3024-night span.cm-def{color:#e8bbd0}.cm-s-3024-night span.cm-bracket{color:#d6d5d4}.cm-s-3024-night span.cm-tag{color:#db2d20}.cm-s-3024-night span.cm-link{color:#a16a94}.cm-s-3024-night span.cm-error{background:#db2d20;color:#807d7c}.cm-s-3024-night .CodeMirror-activeline-background{background:#2f2f2f}.cm-s-3024-night .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-abcdef.CodeMirror{background:#0f0f0f;color:#defdef}.cm-s-abcdef div.CodeMirror-selected{background:#515151}.cm-s-abcdef .CodeMirror-line::selection,.cm-s-abcdef .CodeMirror-line>span::selection,.cm-s-abcdef .CodeMirror-line>span>span::selection{background:rgba(56,56,56,.99)}.cm-s-abcdef .CodeMirror-line::-moz-selection,.cm-s-abcdef .CodeMirror-line>span::-moz-selection,.cm-s-abcdef .CodeMirror-line>span>span::-moz-selection{background:rgba(56,56,56,.99)}.cm-s-abcdef .CodeMirror-gutters{background:#555;border-right:2px solid #314151}.cm-s-abcdef .CodeMirror-guttermarker{color:#222}.cm-s-abcdef .CodeMirror-guttermarker-subtle{color:azure}.cm-s-abcdef .CodeMirror-linenumber{color:#fff}.cm-s-abcdef .CodeMirror-cursor{border-left:1px solid #0f0}.cm-s-abcdef span.cm-keyword{color:#b8860b;font-weight:700}.cm-s-abcdef span.cm-atom{color:#77f}.cm-s-abcdef span.cm-number{color:violet}.cm-s-abcdef span.cm-def{color:#fffabc}.cm-s-abcdef span.cm-variable{color:#abcdef}.cm-s-abcdef span.cm-variable-2{color:#cacbcc}.cm-s-abcdef span.cm-type,.cm-s-abcdef span.cm-variable-3{color:#def}.cm-s-abcdef span.cm-property{color:#fedcba}.cm-s-abcdef span.cm-operator{color:#ff0}.cm-s-abcdef span.cm-comment{color:#7a7b7c;font-style:italic}.cm-s-abcdef span.cm-string{color:#2b4}.cm-s-abcdef span.cm-meta{color:#c9f}.cm-s-abcdef span.cm-qualifier{color:#fff700}.cm-s-abcdef span.cm-builtin{color:#30aabc}.cm-s-abcdef span.cm-bracket{color:#8a8a8a}.cm-s-abcdef span.cm-tag{color:#fd4}.cm-s-abcdef span.cm-attribute{color:#df0}.cm-s-abcdef span.cm-error{color:red}.cm-s-abcdef span.cm-header{color:#7fffd4;font-weight:700}.cm-s-abcdef span.cm-link{color:#8a2be2}.cm-s-abcdef .CodeMirror-activeline-background{background:#314151}.cm-s-ambiance.CodeMirror{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.cm-s-ambiance .cm-header{color:#00f}.cm-s-ambiance .cm-quote{color:#24c2c7}.cm-s-ambiance .cm-keyword{color:#cda869}.cm-s-ambiance .cm-atom{color:#cf7ea9}.cm-s-ambiance .cm-number{color:#78cf8a}.cm-s-ambiance .cm-def{color:#aac6e3}.cm-s-ambiance .cm-variable{color:#ffb795}.cm-s-ambiance .cm-variable-2{color:#eed1b3}.cm-s-ambiance .cm-type,.cm-s-ambiance .cm-variable-3{color:#faded3}.cm-s-ambiance .cm-property{color:#eed1b3}.cm-s-ambiance .cm-operator{color:#fa8d6a}.cm-s-ambiance .cm-comment{color:#555;font-style:italic}.cm-s-ambiance .cm-string{color:#8f9d6a}.cm-s-ambiance .cm-string-2{color:#9d937c}.cm-s-ambiance .cm-meta{color:#d2a8a1}.cm-s-ambiance .cm-qualifier{color:#ff0}.cm-s-ambiance .cm-builtin{color:#99c}.cm-s-ambiance .cm-bracket{color:#24c2c7}.cm-s-ambiance .cm-tag{color:#fee4ff}.cm-s-ambiance .cm-attribute{color:#9b859d}.cm-s-ambiance .cm-hr{color:pink}.cm-s-ambiance .cm-link{color:#f4c20b}.cm-s-ambiance .cm-special{color:#ff9d00}.cm-s-ambiance .cm-error{color:#af2018}.cm-s-ambiance .CodeMirror-matchingbracket{color:#0f0}.cm-s-ambiance .CodeMirror-nonmatchingbracket{color:#f22}.cm-s-ambiance div.CodeMirror-selected{background:hsla(0,0%,100%,.15)}.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-ambiance .CodeMirror-line::selection,.cm-s-ambiance .CodeMirror-line>span::selection,.cm-s-ambiance .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-ambiance .CodeMirror-line::-moz-selection,.cm-s-ambiance .CodeMirror-line>span::-moz-selection,.cm-s-ambiance .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-ambiance.CodeMirror{line-height:1.4em;color:#e6e1dc;background-color:#202020;-webkit-box-shadow:inset 0 0 10px #000;-moz-box-shadow:inset 0 0 10px #000;box-shadow:inset 0 0 10px #000}.cm-s-ambiance .CodeMirror-gutters{background:#3d3d3d;border-right:1px solid #4d4d4d;box-shadow:0 10px 20px #000}.cm-s-ambiance .CodeMirror-linenumber{text-shadow:0 1px 1px #4d4d4d;color:#111;padding:0 5px}.cm-s-ambiance .CodeMirror-guttermarker{color:#aaa}.cm-s-ambiance .CodeMirror-guttermarker-subtle{color:#111}.cm-s-ambiance .CodeMirror-cursor{border-left:1px solid #7991e8}.cm-s-ambiance .CodeMirror-activeline-background{background:none repeat scroll 0 0 hsla(0,0%,100%,.031)}.cm-s-ambiance.CodeMirror,.cm-s-ambiance .CodeMirror-gutters{background-image:url("data:image/png;base64,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")}.cm-s-base16-dark.CodeMirror{background:#151515;color:#e0e0e0}.cm-s-base16-dark div.CodeMirror-selected{background:#303030}.cm-s-base16-dark .CodeMirror-line::selection,.cm-s-base16-dark .CodeMirror-line>span::selection,.cm-s-base16-dark .CodeMirror-line>span>span::selection{background:rgba(48,48,48,.99)}.cm-s-base16-dark .CodeMirror-line::-moz-selection,.cm-s-base16-dark .CodeMirror-line>span::-moz-selection,.cm-s-base16-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(48,48,48,.99)}.cm-s-base16-dark .CodeMirror-gutters{background:#151515;border-right:0}.cm-s-base16-dark .CodeMirror-guttermarker{color:#ac4142}.cm-s-base16-dark .CodeMirror-guttermarker-subtle,.cm-s-base16-dark .CodeMirror-linenumber{color:#505050}.cm-s-base16-dark .CodeMirror-cursor{border-left:1px solid #b0b0b0}.cm-s-base16-dark span.cm-comment{color:#8f5536}.cm-s-base16-dark span.cm-atom,.cm-s-base16-dark span.cm-number{color:#aa759f}.cm-s-base16-dark span.cm-attribute,.cm-s-base16-dark span.cm-property{color:#90a959}.cm-s-base16-dark span.cm-keyword{color:#ac4142}.cm-s-base16-dark span.cm-string{color:#f4bf75}.cm-s-base16-dark span.cm-variable{color:#90a959}.cm-s-base16-dark span.cm-variable-2{color:#6a9fb5}.cm-s-base16-dark span.cm-def{color:#d28445}.cm-s-base16-dark span.cm-bracket{color:#e0e0e0}.cm-s-base16-dark span.cm-tag{color:#ac4142}.cm-s-base16-dark span.cm-link{color:#aa759f}.cm-s-base16-dark span.cm-error{background:#ac4142;color:#b0b0b0}.cm-s-base16-dark .CodeMirror-activeline-background{background:#202020}.cm-s-base16-dark .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-base16-light.CodeMirror{background:#f5f5f5;color:#202020}.cm-s-base16-light div.CodeMirror-selected{background:#e0e0e0}.cm-s-base16-light .CodeMirror-line::selection,.cm-s-base16-light .CodeMirror-line>span::selection,.cm-s-base16-light .CodeMirror-line>span>span::selection{background:#e0e0e0}.cm-s-base16-light .CodeMirror-line::-moz-selection,.cm-s-base16-light .CodeMirror-line>span::-moz-selection,.cm-s-base16-light .CodeMirror-line>span>span::-moz-selection{background:#e0e0e0}.cm-s-base16-light .CodeMirror-gutters{background:#f5f5f5;border-right:0}.cm-s-base16-light .CodeMirror-guttermarker{color:#ac4142}.cm-s-base16-light .CodeMirror-guttermarker-subtle,.cm-s-base16-light .CodeMirror-linenumber{color:#b0b0b0}.cm-s-base16-light .CodeMirror-cursor{border-left:1px solid #505050}.cm-s-base16-light span.cm-comment{color:#8f5536}.cm-s-base16-light span.cm-atom,.cm-s-base16-light span.cm-number{color:#aa759f}.cm-s-base16-light span.cm-attribute,.cm-s-base16-light span.cm-property{color:#90a959}.cm-s-base16-light span.cm-keyword{color:#ac4142}.cm-s-base16-light span.cm-string{color:#f4bf75}.cm-s-base16-light span.cm-variable{color:#90a959}.cm-s-base16-light span.cm-variable-2{color:#6a9fb5}.cm-s-base16-light span.cm-def{color:#d28445}.cm-s-base16-light span.cm-bracket{color:#202020}.cm-s-base16-light span.cm-tag{color:#ac4142}.cm-s-base16-light span.cm-link{color:#aa759f}.cm-s-base16-light span.cm-error{background:#ac4142;color:#505050}.cm-s-base16-light .CodeMirror-activeline-background{background:#dddcdc}.cm-s-base16-light .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-bespin.CodeMirror{background:#28211c;color:#9d9b97}.cm-s-bespin div.CodeMirror-selected{background:#36312e!important}.cm-s-bespin .CodeMirror-gutters{background:#28211c;border-right:0}.cm-s-bespin .CodeMirror-linenumber{color:#666}.cm-s-bespin .CodeMirror-cursor{border-left:1px solid #797977!important}.cm-s-bespin span.cm-comment{color:#937121}.cm-s-bespin span.cm-atom,.cm-s-bespin span.cm-number{color:#9b859d}.cm-s-bespin span.cm-attribute,.cm-s-bespin span.cm-property{color:#54be0d}.cm-s-bespin span.cm-keyword{color:#cf6a4c}.cm-s-bespin span.cm-string{color:#f9ee98}.cm-s-bespin span.cm-variable{color:#54be0d}.cm-s-bespin span.cm-variable-2{color:#5ea6ea}.cm-s-bespin span.cm-def{color:#cf7d34}.cm-s-bespin span.cm-error{background:#cf6a4c;color:#797977}.cm-s-bespin span.cm-bracket{color:#9d9b97}.cm-s-bespin span.cm-tag{color:#cf6a4c}.cm-s-bespin span.cm-link{color:#9b859d}.cm-s-bespin .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-bespin .CodeMirror-activeline-background{background:#404040}.cm-s-blackboard.CodeMirror{background:#0c1021;color:#f8f8f8}.cm-s-blackboard div.CodeMirror-selected{background:#253b76}.cm-s-blackboard .CodeMirror-line::selection,.cm-s-blackboard .CodeMirror-line>span::selection,.cm-s-blackboard .CodeMirror-line>span>span::selection{background:rgba(37,59,118,.99)}.cm-s-blackboard .CodeMirror-line::-moz-selection,.cm-s-blackboard .CodeMirror-line>span::-moz-selection,.cm-s-blackboard .CodeMirror-line>span>span::-moz-selection{background:rgba(37,59,118,.99)}.cm-s-blackboard .CodeMirror-gutters{background:#0c1021;border-right:0}.cm-s-blackboard .CodeMirror-guttermarker{color:#fbde2d}.cm-s-blackboard .CodeMirror-guttermarker-subtle,.cm-s-blackboard .CodeMirror-linenumber{color:#888}.cm-s-blackboard .CodeMirror-cursor{border-left:1px solid #a7a7a7}.cm-s-blackboard .cm-keyword{color:#fbde2d}.cm-s-blackboard .cm-atom,.cm-s-blackboard .cm-number{color:#d8fa3c}.cm-s-blackboard .cm-def{color:#8da6ce}.cm-s-blackboard .cm-variable{color:#ff6400}.cm-s-blackboard .cm-operator{color:#fbde2d}.cm-s-blackboard .cm-comment{color:#aeaeae}.cm-s-blackboard .cm-string,.cm-s-blackboard .cm-string-2{color:#61ce3c}.cm-s-blackboard .cm-meta{color:#d8fa3c}.cm-s-blackboard .cm-attribute,.cm-s-blackboard .cm-builtin,.cm-s-blackboard .cm-tag{color:#8da6ce}.cm-s-blackboard .cm-header{color:#ff6400}.cm-s-blackboard .cm-hr{color:#aeaeae}.cm-s-blackboard .cm-link{color:#8da6ce}.cm-s-blackboard .cm-error{background:#9d1e15;color:#f8f8f8}.cm-s-blackboard .CodeMirror-activeline-background{background:#3c3636}.cm-s-blackboard .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-cobalt.CodeMirror{background:#002240;color:#fff}.cm-s-cobalt div.CodeMirror-selected{background:#b36539}.cm-s-cobalt .CodeMirror-line::selection,.cm-s-cobalt .CodeMirror-line>span::selection,.cm-s-cobalt .CodeMirror-line>span>span::selection{background:rgba(179,101,57,.99)}.cm-s-cobalt .CodeMirror-line::-moz-selection,.cm-s-cobalt .CodeMirror-line>span::-moz-selection,.cm-s-cobalt .CodeMirror-line>span>span::-moz-selection{background:rgba(179,101,57,.99)}.cm-s-cobalt .CodeMirror-gutters{background:#002240;border-right:1px solid #aaa}.cm-s-cobalt .CodeMirror-guttermarker{color:#ffee80}.cm-s-cobalt .CodeMirror-guttermarker-subtle,.cm-s-cobalt .CodeMirror-linenumber{color:#d0d0d0}.cm-s-cobalt .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-cobalt span.cm-comment{color:#08f}.cm-s-cobalt span.cm-atom{color:#845dc4}.cm-s-cobalt span.cm-attribute,.cm-s-cobalt span.cm-number{color:#ff80e1}.cm-s-cobalt span.cm-keyword{color:#ffee80}.cm-s-cobalt span.cm-string{color:#3ad900}.cm-s-cobalt span.cm-meta{color:#ff9d00}.cm-s-cobalt span.cm-tag,.cm-s-cobalt span.cm-variable-2{color:#9effff}.cm-s-cobalt .cm-type,.cm-s-cobalt span.cm-def,.cm-s-cobalt span.cm-variable-3{color:#fff}.cm-s-cobalt span.cm-bracket{color:#d8d8d8}.cm-s-cobalt span.cm-builtin,.cm-s-cobalt span.cm-special{color:#ff9e59}.cm-s-cobalt span.cm-link{color:#845dc4}.cm-s-cobalt span.cm-error{color:#9d1e15}.cm-s-cobalt .CodeMirror-activeline-background{background:#002d57}.cm-s-cobalt .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-colorforth.CodeMirror{background:#000;color:#f8f8f8}.cm-s-colorforth .CodeMirror-gutters{background:#0a001f;border-right:1px solid #aaa}.cm-s-colorforth .CodeMirror-guttermarker{color:#ffbd40}.cm-s-colorforth .CodeMirror-guttermarker-subtle{color:#78846f}.cm-s-colorforth .CodeMirror-linenumber{color:#bababa}.cm-s-colorforth .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-colorforth span.cm-comment{color:#ededed}.cm-s-colorforth span.cm-def{color:#ff1c1c;font-weight:700}.cm-s-colorforth span.cm-keyword{color:#ffd900}.cm-s-colorforth span.cm-builtin{color:#00d95a}.cm-s-colorforth span.cm-variable{color:#73ff00}.cm-s-colorforth span.cm-string{color:#007bff}.cm-s-colorforth span.cm-number{color:#00c4ff}.cm-s-colorforth span.cm-atom{color:#606060}.cm-s-colorforth span.cm-variable-2{color:#eee}.cm-s-colorforth span.cm-type,.cm-s-colorforth span.cm-variable-3{color:#ddd}.cm-s-colorforth span.cm-meta{color:#ff0}.cm-s-colorforth span.cm-qualifier{color:#fff700}.cm-s-colorforth span.cm-bracket{color:#cc7}.cm-s-colorforth span.cm-tag{color:#ffbd40}.cm-s-colorforth span.cm-attribute{color:#fff700}.cm-s-colorforth span.cm-error{color:red}.cm-s-colorforth div.CodeMirror-selected{background:#333d53}.cm-s-colorforth span.cm-compilation{background:hsla(0,0%,100%,.12)}.cm-s-colorforth .CodeMirror-activeline-background{background:#253540}.cm-s-darcula{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif}.cm-s-darcula.CodeMirror{background:#2b2b2b;color:#a9b7c6}.cm-s-darcula span.cm-meta{color:#bbb529}.cm-s-darcula span.cm-number{color:#6897bb}.cm-s-darcula span.cm-keyword{color:#cc7832;line-height:1em;font-weight:700}.cm-s-darcula span.cm-def{color:#a9b7c6;font-style:italic}.cm-s-darcula span.cm-variable,.cm-s-darcula span.cm-variable-2{color:#a9b7c6}.cm-s-darcula span.cm-variable-3{color:#9876aa}.cm-s-darcula span.cm-type{color:#abc;font-weight:700}.cm-s-darcula span.cm-property{color:#ffc66d}.cm-s-darcula span.cm-operator{color:#a9b7c6}.cm-s-darcula span.cm-string,.cm-s-darcula span.cm-string-2{color:#6a8759}.cm-s-darcula span.cm-comment{color:#61a151;font-style:italic}.cm-s-darcula span.cm-atom,.cm-s-darcula span.cm-link{color:#cc7832}.cm-s-darcula span.cm-error{color:#bc3f3c}.cm-s-darcula span.cm-tag{color:#629755;font-weight:700;font-style:italic;text-decoration:underline}.cm-s-darcula span.cm-attribute{color:#6897bb}.cm-s-darcula span.cm-qualifier{color:#6a8759}.cm-s-darcula span.cm-bracket{color:#a9b7c6}.cm-s-darcula span.cm-builtin,.cm-s-darcula span.cm-special{color:#ff9e59}.cm-s-darcula .CodeMirror-cursor{border-left:1px solid #a9b7c6}.cm-s-darcula .CodeMirror-activeline-background{background:#323232}.cm-s-darcula .CodeMirror-gutters{background:#313335;border-right:1px solid #313335}.cm-s-darcula .CodeMirror-guttermarker{color:#ffee80}.cm-s-darcula .CodeMirror-guttermarker-subtle{color:#d0d0d0}.cm-s-darcula .CodeMirrir-linenumber{color:#606366}.cm-s-darcula .CodeMirror-matchingbracket{background-color:#3b514d;color:#ffef28!important;font-weight:700}.cm-s-darcula div.CodeMirror-selected{background:#214283}.CodeMirror-hints.darcula{font-family:Menlo,Monaco,Consolas,Courier New,monospace;color:#9c9e9e;background-color:#3b3e3f!important}.CodeMirror-hints.darcula .CodeMirror-hint-active{background-color:#494d4e!important;color:#9c9e9e!important}.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36!important;color:#f8f8f2!important;border:none}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-type,.cm-s-dracula span.cm-variable-3{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:hsla(0,0%,100%,.1)}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-duotone-dark.CodeMirror{background:#2a2734;color:#6c6783}.cm-s-duotone-dark div.CodeMirror-selected{background:#545167!important}.cm-s-duotone-dark .CodeMirror-gutters{background:#2a2734;border-right:0}.cm-s-duotone-dark .CodeMirror-linenumber{color:#545167}.cm-s-duotone-dark .CodeMirror-cursor{border-left:1px solid #ffad5c;border-right:.5em solid #ffad5c;opacity:.5}.cm-s-duotone-dark .CodeMirror-activeline-background{background:#363342;opacity:.5}.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor{background:#ffad5c;opacity:.5}.cm-s-duotone-dark span.cm-atom,.cm-s-duotone-dark span.cm-attribute,.cm-s-duotone-dark span.cm-hr,.cm-s-duotone-dark span.cm-keyword,.cm-s-duotone-dark span.cm-link,.cm-s-duotone-dark span.cm-number,.cm-s-duotone-dark span.cm-quote,.cm-s-duotone-dark span.cm-variable{color:#fc9}.cm-s-duotone-dark span.cm-property{color:#9a86fd}.cm-s-duotone-dark span.cm-negative,.cm-s-duotone-dark span.cm-punctuation,.cm-s-duotone-dark span.cm-unit{color:#e09142}.cm-s-duotone-dark span.cm-string{color:#ffb870}.cm-s-duotone-dark span.cm-operator{color:#ffad5c}.cm-s-duotone-dark span.cm-positive{color:#6a51e6}.cm-s-duotone-dark span.cm-string-2,.cm-s-duotone-dark span.cm-type,.cm-s-duotone-dark span.cm-url,.cm-s-duotone-dark span.cm-variable-2,.cm-s-duotone-dark span.cm-variable-3{color:#7a63ee}.cm-s-duotone-dark span.cm-builtin,.cm-s-duotone-dark span.cm-def,.cm-s-duotone-dark span.cm-em,.cm-s-duotone-dark span.cm-header,.cm-s-duotone-dark span.cm-qualifier,.cm-s-duotone-dark span.cm-tag{color:#eeebff}.cm-s-duotone-dark span.cm-bracket,.cm-s-duotone-dark span.cm-comment{color:#6c6783}.cm-s-duotone-dark span.cm-error,.cm-s-duotone-dark span.cm-invalidchar{color:red}.cm-s-duotone-dark span.cm-header{font-weight:400}.cm-s-duotone-dark .CodeMirror-matchingbracket{text-decoration:underline;color:#eeebff!important}.cm-s-duotone-light.CodeMirror{background:#faf8f5;color:#b29762}.cm-s-duotone-light div.CodeMirror-selected{background:#e3dcce!important}.cm-s-duotone-light .CodeMirror-gutters{background:#faf8f5;border-right:0}.cm-s-duotone-light .CodeMirror-linenumber{color:#cdc4b1}.cm-s-duotone-light .CodeMirror-cursor{border-left:1px solid #93abdc;border-right:.5em solid #93abdc;opacity:.5}.cm-s-duotone-light .CodeMirror-activeline-background{background:#e3dcce;opacity:.5}.cm-s-duotone-light .cm-fat-cursor .CodeMirror-cursor{background:#93abdc;opacity:.5}.cm-s-duotone-light-light span.cm-hr,.cm-s-duotone-light-light span.cm-link,.cm-s-duotone-light span.cm-atom,.cm-s-duotone-light span.cm-attribute,.cm-s-duotone-light span.cm-keyword,.cm-s-duotone-light span.cm-number,.cm-s-duotone-light span.cm-quote,.cm-s-duotone-light span.cm-variable{color:#063289}.cm-s-duotone-light span.cm-property{color:#b29762}.cm-s-duotone-light span.cm-negative,.cm-s-duotone-light span.cm-punctuation,.cm-s-duotone-light span.cm-unit{color:#063289}.cm-s-duotone-light span.cm-operator,.cm-s-duotone-light span.cm-string{color:#1659df}.cm-s-duotone-light span.cm-positive,.cm-s-duotone-light span.cm-string-2,.cm-s-duotone-light span.cm-type,.cm-s-duotone-light span.cm-url,.cm-s-duotone-light span.cm-variable-2,.cm-s-duotone-light span.cm-variable-3{color:#896724}.cm-s-duotone-light span.cm-builtin,.cm-s-duotone-light span.cm-def,.cm-s-duotone-light span.cm-em,.cm-s-duotone-light span.cm-header,.cm-s-duotone-light span.cm-qualifier,.cm-s-duotone-light span.cm-tag{color:#2d2006}.cm-s-duotone-light span.cm-bracket,.cm-s-duotone-light span.cm-comment{color:#b6ad9a}.cm-s-duotone-light span.cm-error,.cm-s-duotone-light span.cm-invalidchar{color:red}.cm-s-duotone-light span.cm-header{font-weight:400}.cm-s-duotone-light .CodeMirror-matchingbracket{text-decoration:underline;color:#faf8f5!important}.cm-s-eclipse span.cm-meta{color:#ff1717}.cm-s-eclipse span.cm-keyword{line-height:1em;font-weight:700;color:#7f0055}.cm-s-eclipse span.cm-atom{color:#219}.cm-s-eclipse span.cm-number{color:#164}.cm-s-eclipse span.cm-def{color:#00f}.cm-s-eclipse span.cm-variable{color:#000}.cm-s-eclipse span.cm-type,.cm-s-eclipse span.cm-variable-2,.cm-s-eclipse span.cm-variable-3{color:#0000c0}.cm-s-eclipse span.cm-operator,.cm-s-eclipse span.cm-property{color:#000}.cm-s-eclipse span.cm-comment{color:#3f7f5f}.cm-s-eclipse span.cm-string{color:#2a00ff}.cm-s-eclipse span.cm-string-2{color:#f50}.cm-s-eclipse span.cm-qualifier{color:#555}.cm-s-eclipse span.cm-builtin{color:#30a}.cm-s-eclipse span.cm-bracket{color:#cc7}.cm-s-eclipse span.cm-tag{color:#170}.cm-s-eclipse span.cm-attribute{color:#00c}.cm-s-eclipse span.cm-link{color:#219}.cm-s-eclipse span.cm-error{color:red}.cm-s-eclipse .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-eclipse .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important}.cm-s-elegant span.cm-atom,.cm-s-elegant span.cm-number,.cm-s-elegant span.cm-string{color:#762}.cm-s-elegant span.cm-comment{color:#262;font-style:italic;line-height:1em}.cm-s-elegant span.cm-meta{color:#555;font-style:italic;line-height:1em}.cm-s-elegant span.cm-variable{color:#000}.cm-s-elegant span.cm-variable-2{color:#b11}.cm-s-elegant span.cm-qualifier{color:#555}.cm-s-elegant span.cm-keyword{color:#730}.cm-s-elegant span.cm-builtin{color:#30a}.cm-s-elegant span.cm-link{color:#762}.cm-s-elegant span.cm-error{background-color:#fdd}.cm-s-elegant .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-elegant .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important}.cm-s-erlang-dark.CodeMirror{background:#002240;color:#fff}.cm-s-erlang-dark div.CodeMirror-selected{background:#b36539}.cm-s-erlang-dark .CodeMirror-line::selection,.cm-s-erlang-dark .CodeMirror-line>span::selection,.cm-s-erlang-dark .CodeMirror-line>span>span::selection{background:rgba(179,101,57,.99)}.cm-s-erlang-dark .CodeMirror-line::-moz-selection,.cm-s-erlang-dark .CodeMirror-line>span::-moz-selection,.cm-s-erlang-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(179,101,57,.99)}.cm-s-erlang-dark .CodeMirror-gutters{background:#002240;border-right:1px solid #aaa}.cm-s-erlang-dark .CodeMirror-guttermarker{color:#fff}.cm-s-erlang-dark .CodeMirror-guttermarker-subtle,.cm-s-erlang-dark .CodeMirror-linenumber{color:#d0d0d0}.cm-s-erlang-dark .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-erlang-dark span.cm-quote{color:#ccc}.cm-s-erlang-dark span.cm-atom{color:#f133f1}.cm-s-erlang-dark span.cm-attribute{color:#ff80e1}.cm-s-erlang-dark span.cm-bracket{color:#ff9d00}.cm-s-erlang-dark span.cm-builtin{color:#eaa}.cm-s-erlang-dark span.cm-comment{color:#77f}.cm-s-erlang-dark span.cm-def{color:#e7a}.cm-s-erlang-dark span.cm-keyword{color:#ffee80}.cm-s-erlang-dark span.cm-meta{color:#50fefe}.cm-s-erlang-dark span.cm-number{color:#ffd0d0}.cm-s-erlang-dark span.cm-operator{color:#d55}.cm-s-erlang-dark span.cm-property,.cm-s-erlang-dark span.cm-qualifier{color:#ccc}.cm-s-erlang-dark span.cm-special{color:#fbb}.cm-s-erlang-dark span.cm-string{color:#3ad900}.cm-s-erlang-dark span.cm-string-2{color:#ccc}.cm-s-erlang-dark span.cm-tag{color:#9effff}.cm-s-erlang-dark span.cm-variable{color:#50fe50}.cm-s-erlang-dark span.cm-variable-2{color:#e0e}.cm-s-erlang-dark span.cm-type,.cm-s-erlang-dark span.cm-variable-3{color:#ccc}.cm-s-erlang-dark span.cm-error{color:#9d1e15}.cm-s-erlang-dark .CodeMirror-activeline-background{background:#013461}.cm-s-erlang-dark .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-gruvbox-dark.CodeMirror,.cm-s-gruvbox-dark .CodeMirror-gutters{background-color:#282828;color:#bdae93}.cm-s-gruvbox-dark .CodeMirror-gutters{background:#282828;border-right:0}.cm-s-gruvbox-dark .CodeMirror-linenumber{color:#7c6f64}.cm-s-gruvbox-dark .CodeMirror-cursor{border-left:1px solid #ebdbb2}.cm-s-gruvbox-dark div.CodeMirror-selected{background:#928374}.cm-s-gruvbox-dark span.cm-meta{color:#83a598}.cm-s-gruvbox-dark span.cm-comment{color:#928374}.cm-s-gruvbox-dark span.cm-number,span.cm-atom{color:#d3869b}.cm-s-gruvbox-dark span.cm-keyword{color:#f84934}.cm-s-gruvbox-dark span.cm-variable,.cm-s-gruvbox-dark span.cm-variable-2{color:#ebdbb2}.cm-s-gruvbox-dark span.cm-type,.cm-s-gruvbox-dark span.cm-variable-3{color:#fabd2f}.cm-s-gruvbox-dark span.cm-callee,.cm-s-gruvbox-dark span.cm-def,.cm-s-gruvbox-dark span.cm-operator,.cm-s-gruvbox-dark span.cm-property{color:#ebdbb2}.cm-s-gruvbox-dark span.cm-string{color:#b8bb26}.cm-s-gruvbox-dark span.cm-attribute,.cm-s-gruvbox-dark span.cm-qualifier,.cm-s-gruvbox-dark span.cm-string-2{color:#8ec07c}.cm-s-gruvbox-dark .CodeMirror-activeline-background{background:#3c3836}.cm-s-gruvbox-dark .CodeMirror-matchingbracket{background:#928374;color:#282828!important}.cm-s-gruvbox-dark span.cm-builtin,.cm-s-gruvbox-dark span.cm-tag{color:#fe8019}.cm-s-hopscotch.CodeMirror{background:#322931;color:#d5d3d5}.cm-s-hopscotch div.CodeMirror-selected{background:#433b42!important}.cm-s-hopscotch .CodeMirror-gutters{background:#322931;border-right:0}.cm-s-hopscotch .CodeMirror-linenumber{color:#797379}.cm-s-hopscotch .CodeMirror-cursor{border-left:1px solid #989498!important}.cm-s-hopscotch span.cm-comment{color:#b33508}.cm-s-hopscotch span.cm-atom,.cm-s-hopscotch span.cm-number{color:#c85e7c}.cm-s-hopscotch span.cm-attribute,.cm-s-hopscotch span.cm-property{color:#8fc13e}.cm-s-hopscotch span.cm-keyword{color:#dd464c}.cm-s-hopscotch span.cm-string{color:#fdcc59}.cm-s-hopscotch span.cm-variable{color:#8fc13e}.cm-s-hopscotch span.cm-variable-2{color:#1290bf}.cm-s-hopscotch span.cm-def{color:#fd8b19}.cm-s-hopscotch span.cm-error{background:#dd464c;color:#989498}.cm-s-hopscotch span.cm-bracket{color:#d5d3d5}.cm-s-hopscotch span.cm-tag{color:#dd464c}.cm-s-hopscotch span.cm-link{color:#c85e7c}.cm-s-hopscotch .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-hopscotch .CodeMirror-activeline-background{background:#302020}.cm-s-icecoder{color:#666;background:#1d1d1b}.cm-s-icecoder span.cm-keyword{color:#eee;font-weight:700}.cm-s-icecoder span.cm-atom{color:#e1c76e}.cm-s-icecoder span.cm-number{color:#6cb5d9}.cm-s-icecoder span.cm-def{color:#b9ca4a}.cm-s-icecoder span.cm-variable{color:#6cb5d9}.cm-s-icecoder span.cm-variable-2{color:#cc1e5c}.cm-s-icecoder span.cm-type,.cm-s-icecoder span.cm-variable-3{color:#f9602c}.cm-s-icecoder span.cm-property{color:#eee}.cm-s-icecoder span.cm-operator{color:#9179bb}.cm-s-icecoder span.cm-comment{color:#97a3aa}.cm-s-icecoder span.cm-string{color:#b9ca4a}.cm-s-icecoder span.cm-string-2{color:#6cb5d9}.cm-s-icecoder span.cm-meta,.cm-s-icecoder span.cm-qualifier{color:#555}.cm-s-icecoder span.cm-builtin{color:#214e7b}.cm-s-icecoder span.cm-bracket{color:#cc7}.cm-s-icecoder span.cm-tag{color:#e8e8e8}.cm-s-icecoder span.cm-attribute{color:#099}.cm-s-icecoder span.cm-header{color:#6a0d6a}.cm-s-icecoder span.cm-quote{color:#186718}.cm-s-icecoder span.cm-hr{color:#888}.cm-s-icecoder span.cm-link{color:#e1c76e}.cm-s-icecoder span.cm-error{color:#d00}.cm-s-icecoder .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-icecoder div.CodeMirror-selected{color:#fff;background:#037}.cm-s-icecoder .CodeMirror-gutters{background:#1d1d1b;min-width:41px;border-right:0}.cm-s-icecoder .CodeMirror-linenumber{color:#555;cursor:default}.cm-s-icecoder .CodeMirror-matchingbracket{color:#fff!important;background:#555!important}.cm-s-icecoder .CodeMirror-activeline-background{background:#000}.cm-s-idea span.cm-meta{color:olive}.cm-s-idea span.cm-number{color:#00f}.cm-s-idea span.cm-keyword{line-height:1em;font-weight:700;color:navy}.cm-s-idea span.cm-atom{font-weight:700;color:navy}.cm-s-idea span.cm-def,.cm-s-idea span.cm-operator,.cm-s-idea span.cm-property,.cm-s-idea span.cm-type,.cm-s-idea span.cm-variable,.cm-s-idea span.cm-variable-2,.cm-s-idea span.cm-variable-3{color:#000}.cm-s-idea span.cm-comment{color:grey}.cm-s-idea span.cm-string,.cm-s-idea span.cm-string-2{color:green}.cm-s-idea span.cm-qualifier{color:#555}.cm-s-idea span.cm-error{color:red}.cm-s-idea span.cm-attribute{color:#00f}.cm-s-idea span.cm-tag{color:navy}.cm-s-idea span.cm-link{color:#00f}.cm-s-idea .CodeMirror-activeline-background{background:#fffae3}.cm-s-idea span.cm-builtin{color:#30a}.cm-s-idea span.cm-bracket{color:#cc7}.cm-s-idea{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif}.cm-s-idea .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important}.CodeMirror-hints.idea{font-family:Menlo,Monaco,Consolas,Courier New,monospace;color:#616569;background-color:#ebf3fd!important}.CodeMirror-hints.idea .CodeMirror-hint-active{background-color:#a2b8c9!important;color:#5c6065!important}.cm-s-isotope.CodeMirror{background:#000;color:#e0e0e0}.cm-s-isotope div.CodeMirror-selected{background:#404040!important}.cm-s-isotope .CodeMirror-gutters{background:#000;border-right:0}.cm-s-isotope .CodeMirror-linenumber{color:grey}.cm-s-isotope .CodeMirror-cursor{border-left:1px solid silver!important}.cm-s-isotope span.cm-comment{color:#30f}.cm-s-isotope span.cm-atom,.cm-s-isotope span.cm-number{color:#c0f}.cm-s-isotope span.cm-attribute,.cm-s-isotope span.cm-property{color:#3f0}.cm-s-isotope span.cm-keyword{color:red}.cm-s-isotope span.cm-string{color:#f09}.cm-s-isotope span.cm-variable{color:#3f0}.cm-s-isotope span.cm-variable-2{color:#06f}.cm-s-isotope span.cm-def{color:#f90}.cm-s-isotope span.cm-error{background:red;color:silver}.cm-s-isotope span.cm-bracket{color:#e0e0e0}.cm-s-isotope span.cm-tag{color:red}.cm-s-isotope span.cm-link{color:#c0f}.cm-s-isotope .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-isotope .CodeMirror-activeline-background{background:#202020}.cm-s-lesser-dark{line-height:1.3em}.cm-s-lesser-dark.CodeMirror{background:#262626;color:#ebefe7;text-shadow:0 -1px 1px #262626}.cm-s-lesser-dark div.CodeMirror-selected{background:#45443b}.cm-s-lesser-dark .CodeMirror-line::selection,.cm-s-lesser-dark .CodeMirror-line>span::selection,.cm-s-lesser-dark .CodeMirror-line>span>span::selection{background:rgba(69,68,59,.99)}.cm-s-lesser-dark .CodeMirror-line::-moz-selection,.cm-s-lesser-dark .CodeMirror-line>span::-moz-selection,.cm-s-lesser-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(69,68,59,.99)}.cm-s-lesser-dark .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-lesser-dark pre{padding:0 8px}.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket{color:#7efc7e}.cm-s-lesser-dark .CodeMirror-gutters{background:#262626;border-right:1px solid #aaa}.cm-s-lesser-dark .CodeMirror-guttermarker{color:#599eff}.cm-s-lesser-dark .CodeMirror-guttermarker-subtle,.cm-s-lesser-dark .CodeMirror-linenumber{color:#777}.cm-s-lesser-dark span.cm-header{color:#a0a}.cm-s-lesser-dark span.cm-quote{color:#090}.cm-s-lesser-dark span.cm-keyword{color:#599eff}.cm-s-lesser-dark span.cm-atom{color:#c2b470}.cm-s-lesser-dark span.cm-number{color:#b35e4d}.cm-s-lesser-dark span.cm-def{color:#fff}.cm-s-lesser-dark span.cm-variable{color:#d9bf8c}.cm-s-lesser-dark span.cm-variable-2{color:#669199}.cm-s-lesser-dark span.cm-type,.cm-s-lesser-dark span.cm-variable-3{color:#fff}.cm-s-lesser-dark span.cm-operator,.cm-s-lesser-dark span.cm-property{color:#92a75c}.cm-s-lesser-dark span.cm-comment{color:#666}.cm-s-lesser-dark span.cm-string{color:#bcd279}.cm-s-lesser-dark span.cm-string-2{color:#f50}.cm-s-lesser-dark span.cm-meta{color:#738c73}.cm-s-lesser-dark span.cm-qualifier{color:#555}.cm-s-lesser-dark span.cm-builtin{color:#ff9e59}.cm-s-lesser-dark span.cm-bracket{color:#ebefe7}.cm-s-lesser-dark span.cm-tag{color:#669199}.cm-s-lesser-dark span.cm-attribute{color:#81a4d5}.cm-s-lesser-dark span.cm-hr{color:#999}.cm-s-lesser-dark span.cm-link{color:#00c}.cm-s-lesser-dark span.cm-error{color:#9d1e15}.cm-s-lesser-dark .CodeMirror-activeline-background{background:#3c3a3a}.cm-s-lesser-dark .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-liquibyte.CodeMirror{background-color:#000;color:#fff;line-height:1.2em;font-size:1em}.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight{text-decoration:underline;text-decoration-color:#0f0;text-decoration-style:wavy}.cm-s-liquibyte .cm-trailingspace{text-decoration:line-through;text-decoration-color:red;text-decoration-style:dotted}.cm-s-liquibyte .cm-tab{text-decoration:line-through;text-decoration-color:#404040;text-decoration-style:dotted}.cm-s-liquibyte .CodeMirror-gutters{background-color:#262626;border-right:1px solid #505050;padding-right:.8em}.cm-s-liquibyte .CodeMirror-gutter-elt div{font-size:1.2em}.cm-s-liquibyte .CodeMirror-linenumber{color:#606060;padding-left:0}.cm-s-liquibyte .CodeMirror-cursor{border-left:1px solid #eee}.cm-s-liquibyte span.cm-comment{color:green}.cm-s-liquibyte span.cm-def{color:#ffaf40;font-weight:700}.cm-s-liquibyte span.cm-keyword{color:#c080ff;font-weight:700}.cm-s-liquibyte span.cm-builtin{color:#ffaf40;font-weight:700}.cm-s-liquibyte span.cm-variable{color:#5967ff;font-weight:700}.cm-s-liquibyte span.cm-string{color:#ff8000}.cm-s-liquibyte span.cm-number{color:#0f0;font-weight:700}.cm-s-liquibyte span.cm-atom{color:#bf3030;font-weight:700}.cm-s-liquibyte span.cm-variable-2{color:#007f7f;font-weight:700}.cm-s-liquibyte span.cm-type,.cm-s-liquibyte span.cm-variable-3{color:#c080ff;font-weight:700}.cm-s-liquibyte span.cm-property{color:#999;font-weight:700}.cm-s-liquibyte span.cm-operator{color:#fff}.cm-s-liquibyte span.cm-meta{color:#0f0}.cm-s-liquibyte span.cm-qualifier{color:#fff700;font-weight:700}.cm-s-liquibyte span.cm-bracket{color:#cc7}.cm-s-liquibyte span.cm-tag{color:#ff0;font-weight:700}.cm-s-liquibyte span.cm-attribute{color:#c080ff;font-weight:700}.cm-s-liquibyte span.cm-error{color:red}.cm-s-liquibyte div.CodeMirror-selected{background-color:rgba(255,0,0,.25)}.cm-s-liquibyte span.cm-compilation{background-color:hsla(0,0%,100%,.12)}.cm-s-liquibyte .CodeMirror-activeline-background{background-color:rgba(0,255,0,.15)}.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket{color:#0f0;font-weight:700}.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket{color:red;font-weight:700}.CodeMirror-matchingtag{background-color:rgba(150,255,0,.3)}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover,.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover{background-color:rgba(80,80,80,.7)}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div,.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div{background-color:rgba(80,80,80,.3);border:1px solid #404040;border-radius:5px}.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div{border-top:1px solid #404040;border-bottom:1px solid #404040}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div{border-left:1px solid #404040;border-right:1px solid #404040}.cm-s-liquibyte div.CodeMirror-simplescroll-vertical{background-color:#262626}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal{background-color:#262626;border-top:1px solid #404040}.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div,div.CodeMirror-overlayscroll-vertical div{background-color:#404040;border-radius:5px}.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div,.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div{border:1px solid #404040}.cm-s-lucario.CodeMirror,.cm-s-lucario .CodeMirror-gutters{background-color:#2b3e50!important;color:#f8f8f2!important;border:none}.cm-s-lucario .CodeMirror-gutters{color:#2b3e50}.cm-s-lucario .CodeMirror-cursor{border-left:thin solid #e6c845}.cm-s-lucario .CodeMirror-linenumber{color:#f8f8f2}.cm-s-lucario .CodeMirror-selected{background:#243443}.cm-s-lucario .CodeMirror-line::selection,.cm-s-lucario .CodeMirror-line>span::selection,.cm-s-lucario .CodeMirror-line>span>span::selection{background:#243443}.cm-s-lucario .CodeMirror-line::-moz-selection,.cm-s-lucario .CodeMirror-line>span::-moz-selection,.cm-s-lucario .CodeMirror-line>span>span::-moz-selection{background:#243443}.cm-s-lucario span.cm-comment{color:#5c98cd}.cm-s-lucario span.cm-string,.cm-s-lucario span.cm-string-2{color:#e6db74}.cm-s-lucario span.cm-number{color:#ca94ff}.cm-s-lucario span.cm-variable,.cm-s-lucario span.cm-variable-2{color:#f8f8f2}.cm-s-lucario span.cm-def{color:#72c05d}.cm-s-lucario span.cm-operator{color:#66d9ef}.cm-s-lucario span.cm-keyword{color:#ff6541}.cm-s-lucario span.cm-atom{color:#bd93f9}.cm-s-lucario span.cm-meta{color:#f8f8f2}.cm-s-lucario span.cm-tag{color:#ff6541}.cm-s-lucario span.cm-attribute{color:#66d9ef}.cm-s-lucario span.cm-qualifier{color:#72c05d}.cm-s-lucario span.cm-property{color:#f8f8f2}.cm-s-lucario span.cm-builtin{color:#72c05d}.cm-s-lucario span.cm-type,.cm-s-lucario span.cm-variable-3{color:#ffb86c}.cm-s-lucario .CodeMirror-activeline-background{background:#243443}.cm-s-lucario .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-material.CodeMirror{background-color:#263238;color:#e9eded}.cm-s-material .CodeMirror-gutters{background:#263238;color:#537f7e;border:none}.cm-s-material .CodeMirror-guttermarker,.cm-s-material .CodeMirror-guttermarker-subtle,.cm-s-material .CodeMirror-linenumber{color:#537f7e}.cm-s-material .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-material div.CodeMirror-selected{background:hsla(0,0%,100%,.15)}.cm-s-material.CodeMirror-focused div.CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-material .CodeMirror-line::selection,.cm-s-material .CodeMirror-line>span::selection,.cm-s-material .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-material .CodeMirror-line::-moz-selection,.cm-s-material .CodeMirror-line>span::-moz-selection,.cm-s-material .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-material .CodeMirror-activeline-background{background:transparent}.cm-s-material .cm-keyword{color:#c792ea}.cm-s-material .cm-operator{color:#e9eded}.cm-s-material .cm-variable-2{color:#80cbc4}.cm-s-material .cm-type,.cm-s-material .cm-variable-3{color:#82b1ff}.cm-s-material .cm-builtin{color:#decb6b}.cm-s-material .cm-atom,.cm-s-material .cm-number{color:#f77669}.cm-s-material .cm-def{color:#e9eded}.cm-s-material .cm-string{color:#c3e88d}.cm-s-material .cm-string-2{color:#80cbc4}.cm-s-material .cm-comment{color:#546e7a}.cm-s-material .cm-variable{color:#82b1ff}.cm-s-material .cm-meta,.cm-s-material .cm-tag{color:#80cbc4}.cm-s-material .cm-attribute{color:#ffcb6b}.cm-s-material .cm-property{color:#80cbae}.cm-s-material .cm-qualifier,.cm-s-material .cm-type,.cm-s-material .cm-variable-3{color:#decb6b}.cm-s-material .cm-tag{color:#ff5370}.cm-s-material .cm-error{color:#fff;background-color:#ec5f67}.cm-s-material .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-mbo.CodeMirror{background:#2c2c2c;color:#ffffec}.cm-s-mbo div.CodeMirror-selected{background:#716c62}.cm-s-mbo .CodeMirror-line::selection,.cm-s-mbo .CodeMirror-line>span::selection,.cm-s-mbo .CodeMirror-line>span>span::selection{background:rgba(113,108,98,.99)}.cm-s-mbo .CodeMirror-line::-moz-selection,.cm-s-mbo .CodeMirror-line>span::-moz-selection,.cm-s-mbo .CodeMirror-line>span>span::-moz-selection{background:rgba(113,108,98,.99)}.cm-s-mbo .CodeMirror-gutters{background:#4e4e4e;border-right:0}.cm-s-mbo .CodeMirror-guttermarker{color:#fff}.cm-s-mbo .CodeMirror-guttermarker-subtle{color:grey}.cm-s-mbo .CodeMirror-linenumber{color:#dadada}.cm-s-mbo .CodeMirror-cursor{border-left:1px solid #ffffec}.cm-s-mbo span.cm-comment{color:#95958a}.cm-s-mbo span.cm-atom,.cm-s-mbo span.cm-number{color:#00a8c6}.cm-s-mbo span.cm-attribute,.cm-s-mbo span.cm-property{color:#9ddfe9}.cm-s-mbo span.cm-keyword{color:#ffb928}.cm-s-mbo span.cm-string{color:#ffcf6c}.cm-s-mbo span.cm-string.cm-property,.cm-s-mbo span.cm-variable{color:#ffffec}.cm-s-mbo span.cm-variable-2{color:#00a8c6}.cm-s-mbo span.cm-def{color:#ffffec}.cm-s-mbo span.cm-bracket{color:#fffffc;font-weight:700}.cm-s-mbo span.cm-tag{color:#9ddfe9}.cm-s-mbo span.cm-link{color:#f54b07}.cm-s-mbo span.cm-error{border-bottom:#636363;color:#ffffec}.cm-s-mbo span.cm-qualifier{color:#ffffec}.cm-s-mbo .CodeMirror-activeline-background{background:#494b41}.cm-s-mbo .CodeMirror-matchingbracket{color:#ffb928!important}.cm-s-mbo .CodeMirror-matchingtag{background:hsla(0,0%,100%,.37)}.cm-s-mdn-like.CodeMirror{color:#999;background-color:#fff}.cm-s-mdn-like div.CodeMirror-selected{background:#cfc}.cm-s-mdn-like .CodeMirror-line::selection,.cm-s-mdn-like .CodeMirror-line>span::selection,.cm-s-mdn-like .CodeMirror-line>span>span::selection{background:#cfc}.cm-s-mdn-like .CodeMirror-line::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span>span::-moz-selection{background:#cfc}.cm-s-mdn-like .CodeMirror-gutters{background:#f8f8f8;border-left:6px solid rgba(0,83,159,.65);color:#333}.cm-s-mdn-like .CodeMirror-linenumber{color:#aaa;padding-left:8px}.cm-s-mdn-like .CodeMirror-cursor{border-left:2px solid #222}.cm-s-mdn-like .cm-keyword{color:#6262ff}.cm-s-mdn-like .cm-atom{color:#f90}.cm-s-mdn-like .cm-number{color:#ca7841}.cm-s-mdn-like .cm-def{color:#8da6ce}.cm-s-mdn-like span.cm-tag,.cm-s-mdn-like span.cm-variable-2{color:#690}.cm-s-mdn-like .cm-variable,.cm-s-mdn-like span.cm-def,.cm-s-mdn-like span.cm-type,.cm-s-mdn-like span.cm-variable-3{color:#07a}.cm-s-mdn-like .cm-property{color:#905}.cm-s-mdn-like .cm-qualifier{color:#690}.cm-s-mdn-like .cm-operator{color:#cda869}.cm-s-mdn-like .cm-comment{color:#777;font-weight:400}.cm-s-mdn-like .cm-string{color:#07a;font-style:italic}.cm-s-mdn-like .cm-string-2{color:#bd6b18}.cm-s-mdn-like .cm-meta{color:#000}.cm-s-mdn-like .cm-builtin{color:#9b7536}.cm-s-mdn-like .cm-tag{color:#997643}.cm-s-mdn-like .cm-attribute{color:#d6bb6d}.cm-s-mdn-like .cm-header{color:#ff6400}.cm-s-mdn-like .cm-hr{color:#aeaeae}.cm-s-mdn-like .cm-link{color:#ad9361;font-style:italic;text-decoration:none}.cm-s-mdn-like .cm-error{border-bottom:1px solid red}div.cm-s-mdn-like .CodeMirror-activeline-background{background:#efefff}div.cm-s-mdn-like span.CodeMirror-matchingbracket{outline:1px solid grey;color:inherit}.cm-s-mdn-like.CodeMirror{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=)}.cm-s-midnight span.CodeMirror-matchhighlight{background:#494949}.cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight{background:#314d67!important}.cm-s-midnight .CodeMirror-activeline-background{background:#253540}.cm-s-midnight.CodeMirror{background:#0f192a;color:#d1edff}.cm-s-midnight div.CodeMirror-selected{background:#314d67}.cm-s-midnight .CodeMirror-line::selection,.cm-s-midnight .CodeMirror-line>span::selection,.cm-s-midnight .CodeMirror-line>span>span::selection{background:rgba(49,77,103,.99)}.cm-s-midnight .CodeMirror-line::-moz-selection,.cm-s-midnight .CodeMirror-line>span::-moz-selection,.cm-s-midnight .CodeMirror-line>span>span::-moz-selection{background:rgba(49,77,103,.99)}.cm-s-midnight .CodeMirror-gutters{background:#0f192a;border-right:1px solid}.cm-s-midnight .CodeMirror-guttermarker{color:#fff}.cm-s-midnight .CodeMirror-guttermarker-subtle,.cm-s-midnight .CodeMirror-linenumber{color:#d0d0d0}.cm-s-midnight .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-midnight span.cm-comment{color:#428bdd}.cm-s-midnight span.cm-atom{color:#ae81ff}.cm-s-midnight span.cm-number{color:#d1edff}.cm-s-midnight span.cm-attribute,.cm-s-midnight span.cm-property{color:#a6e22e}.cm-s-midnight span.cm-keyword{color:#e83737}.cm-s-midnight span.cm-string{color:#1dc116}.cm-s-midnight span.cm-variable,.cm-s-midnight span.cm-variable-2{color:#ffaa3e}.cm-s-midnight span.cm-def{color:#4dd}.cm-s-midnight span.cm-bracket{color:#d1edff}.cm-s-midnight span.cm-tag{color:#449}.cm-s-midnight span.cm-link{color:#ae81ff}.cm-s-midnight span.cm-error{background:#f92672;color:#f8f8f0}.cm-s-midnight .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-monokai.CodeMirror{background:#272822;color:#f8f8f2}.cm-s-monokai div.CodeMirror-selected{background:#49483e}.cm-s-monokai .CodeMirror-line::selection,.cm-s-monokai .CodeMirror-line>span::selection,.cm-s-monokai .CodeMirror-line>span>span::selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-line::-moz-selection,.cm-s-monokai .CodeMirror-line>span::-moz-selection,.cm-s-monokai .CodeMirror-line>span>span::-moz-selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-gutters{background:#272822;border-right:0}.cm-s-monokai .CodeMirror-guttermarker{color:#fff}.cm-s-monokai .CodeMirror-guttermarker-subtle,.cm-s-monokai .CodeMirror-linenumber{color:#d0d0d0}.cm-s-monokai .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-monokai span.cm-comment{color:#75715e}.cm-s-monokai span.cm-atom,.cm-s-monokai span.cm-number{color:#ae81ff}.cm-s-monokai span.cm-comment.cm-attribute{color:#97b757}.cm-s-monokai span.cm-comment.cm-def{color:#bc9262}.cm-s-monokai span.cm-comment.cm-tag{color:#bc6283}.cm-s-monokai span.cm-comment.cm-type{color:#5998a6}.cm-s-monokai span.cm-attribute,.cm-s-monokai span.cm-property{color:#a6e22e}.cm-s-monokai span.cm-keyword{color:#f92672}.cm-s-monokai span.cm-builtin{color:#66d9ef}.cm-s-monokai span.cm-string{color:#e6db74}.cm-s-monokai span.cm-variable{color:#f8f8f2}.cm-s-monokai span.cm-variable-2{color:#9effff}.cm-s-monokai span.cm-type,.cm-s-monokai span.cm-variable-3{color:#66d9ef}.cm-s-monokai span.cm-def{color:#fd971f}.cm-s-monokai span.cm-bracket{color:#f8f8f2}.cm-s-monokai span.cm-tag{color:#f92672}.cm-s-monokai span.cm-header,.cm-s-monokai span.cm-link{color:#ae81ff}.cm-s-monokai span.cm-error{background:#f92672;color:#f8f8f0}.cm-s-monokai .CodeMirror-activeline-background{background:#373831}.cm-s-monokai .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-neat span.cm-comment{color:#a86}.cm-s-neat span.cm-keyword{line-height:1em;font-weight:700;color:#00f}.cm-s-neat span.cm-string{color:#a22}.cm-s-neat span.cm-builtin{line-height:1em;font-weight:700;color:#077}.cm-s-neat span.cm-special{line-height:1em;font-weight:700;color:#0aa}.cm-s-neat span.cm-variable{color:#000}.cm-s-neat span.cm-atom,.cm-s-neat span.cm-number{color:#3a3}.cm-s-neat span.cm-meta{color:#555}.cm-s-neat span.cm-link{color:#3a3}.cm-s-neat .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-neat .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important}.cm-s-neo.CodeMirror{background-color:#fff;color:#2e383c;line-height:1.4375}.cm-s-neo .cm-comment{color:#75787b}.cm-s-neo .cm-keyword,.cm-s-neo .cm-property{color:#1d75b3}.cm-s-neo .cm-atom,.cm-s-neo .cm-number{color:#75438a}.cm-s-neo .cm-node,.cm-s-neo .cm-tag{color:#9c3328}.cm-s-neo .cm-string{color:#b35e14}.cm-s-neo .cm-qualifier,.cm-s-neo .cm-variable{color:#047d65}.cm-s-neo pre{padding:0}.cm-s-neo .CodeMirror-gutters{border:none;border-right:10px solid transparent;background-color:transparent}.cm-s-neo .CodeMirror-linenumber{padding:0;color:#e0e2e5}.cm-s-neo .CodeMirror-guttermarker{color:#1d75b3}.cm-s-neo .CodeMirror-guttermarker-subtle{color:#e0e2e5}.cm-s-neo .CodeMirror-cursor{width:auto;border:0;background:rgba(155,157,162,.37);z-index:1}.cm-s-night.CodeMirror{background:#0a001f;color:#f8f8f8}.cm-s-night div.CodeMirror-selected{background:#447}.cm-s-night .CodeMirror-line::selection,.cm-s-night .CodeMirror-line>span::selection,.cm-s-night .CodeMirror-line>span>span::selection{background:rgba(68,68,119,.99)}.cm-s-night .CodeMirror-line::-moz-selection,.cm-s-night .CodeMirror-line>span::-moz-selection,.cm-s-night .CodeMirror-line>span>span::-moz-selection{background:rgba(68,68,119,.99)}.cm-s-night .CodeMirror-gutters{background:#0a001f;border-right:1px solid #aaa}.cm-s-night .CodeMirror-guttermarker{color:#fff}.cm-s-night .CodeMirror-guttermarker-subtle{color:#bbb}.cm-s-night .CodeMirror-linenumber{color:#f8f8f8}.cm-s-night .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-night span.cm-comment{color:#8900d1}.cm-s-night span.cm-atom{color:#845dc4}.cm-s-night span.cm-attribute,.cm-s-night span.cm-number{color:#ffd500}.cm-s-night span.cm-keyword{color:#599eff}.cm-s-night span.cm-string{color:#37f14a}.cm-s-night span.cm-meta{color:#7678e2}.cm-s-night span.cm-tag,.cm-s-night span.cm-variable-2{color:#99b2ff}.cm-s-night span.cm-def,.cm-s-night span.cm-type,.cm-s-night span.cm-variable-3{color:#fff}.cm-s-night span.cm-bracket{color:#8da6ce}.cm-s-night span.cm-builtin,.cm-s-night span.cm-special{color:#ff9e59}.cm-s-night span.cm-link{color:#845dc4}.cm-s-night span.cm-error{color:#9d1e15}.cm-s-night .CodeMirror-activeline-background{background:#1c005a}.cm-s-night .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-oceanic-next.CodeMirror{background:#304148;color:#f8f8f2}.cm-s-oceanic-next div.CodeMirror-selected{background:rgba(101,115,126,.33)}.cm-s-oceanic-next .CodeMirror-line::selection,.cm-s-oceanic-next .CodeMirror-line>span::selection,.cm-s-oceanic-next .CodeMirror-line>span>span::selection{background:rgba(101,115,126,.33)}.cm-s-oceanic-next .CodeMirror-line::-moz-selection,.cm-s-oceanic-next .CodeMirror-line>span::-moz-selection,.cm-s-oceanic-next .CodeMirror-line>span>span::-moz-selection{background:rgba(101,115,126,.33)}.cm-s-oceanic-next .CodeMirror-gutters{background:#304148;border-right:10px}.cm-s-oceanic-next .CodeMirror-guttermarker{color:#fff}.cm-s-oceanic-next .CodeMirror-guttermarker-subtle,.cm-s-oceanic-next .CodeMirror-linenumber{color:#d0d0d0}.cm-s-oceanic-next .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-oceanic-next span.cm-comment{color:#65737e}.cm-s-oceanic-next span.cm-atom{color:#c594c5}.cm-s-oceanic-next span.cm-number{color:#f99157}.cm-s-oceanic-next span.cm-property{color:#99c794}.cm-s-oceanic-next span.cm-attribute,.cm-s-oceanic-next span.cm-keyword{color:#c594c5}.cm-s-oceanic-next span.cm-builtin{color:#66d9ef}.cm-s-oceanic-next span.cm-string{color:#99c794}.cm-s-oceanic-next span.cm-variable,.cm-s-oceanic-next span.cm-variable-2,.cm-s-oceanic-next span.cm-variable-3{color:#f8f8f2}.cm-s-oceanic-next span.cm-def{color:#69c}.cm-s-oceanic-next span.cm-bracket{color:#5fb3b3}.cm-s-oceanic-next span.cm-header,.cm-s-oceanic-next span.cm-link,.cm-s-oceanic-next span.cm-tag{color:#c594c5}.cm-s-oceanic-next span.cm-error{background:#c594c5;color:#f8f8f0}.cm-s-oceanic-next .CodeMirror-activeline-background{background:rgba(101,115,126,.33)}.cm-s-oceanic-next .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-panda-syntax{background:#292a2b;color:#e6e6e6;line-height:1.5;font-family:Operator Mono,Source Sans Pro,Menlo,Monaco,Consolas,Courier New,monospace}.cm-s-panda-syntax .CodeMirror-cursor{border-color:#ff2c6d}.cm-s-panda-syntax .CodeMirror-activeline-background{background:rgba(99,123,156,.1)}.cm-s-panda-syntax .CodeMirror-selected{background:#fff}.cm-s-panda-syntax .cm-comment{font-style:italic;color:#676b79}.cm-s-panda-syntax .cm-operator{color:#f3f3f3}.cm-s-panda-syntax .cm-string{color:#19f9d8}.cm-s-panda-syntax .cm-string-2{color:#ffb86c}.cm-s-panda-syntax .cm-tag{color:#ff2c6d}.cm-s-panda-syntax .cm-meta{color:#b084eb}.cm-s-panda-syntax .cm-number{color:#ffb86c}.cm-s-panda-syntax .cm-atom{color:#ff2c6d}.cm-s-panda-syntax .cm-keyword{color:#ff75b5}.cm-s-panda-syntax .cm-variable{color:#ffb86c}.cm-s-panda-syntax .cm-type,.cm-s-panda-syntax .cm-variable-2,.cm-s-panda-syntax .cm-variable-3{color:#ff9ac1}.cm-s-panda-syntax .cm-def{color:#e6e6e6}.cm-s-panda-syntax .cm-property{color:#f3f3f3}.cm-s-panda-syntax .cm-attribute,.cm-s-panda-syntax .cm-unit{color:#ffb86c}.cm-s-panda-syntax .CodeMirror-matchingbracket{border-bottom:1px dotted #19f9d8;padding-bottom:2px;color:#e6e6e6}.cm-s-panda-syntax .CodeMirror-gutters{background:#292a2b;border-right-color:hsla(0,0%,100%,.1)}.cm-s-panda-syntax .CodeMirror-linenumber{color:#e6e6e6;opacity:.6}.cm-s-paraiso-dark.CodeMirror{background:#2f1e2e;color:#b9b6b0}.cm-s-paraiso-dark div.CodeMirror-selected{background:#41323f}.cm-s-paraiso-dark .CodeMirror-line::selection,.cm-s-paraiso-dark .CodeMirror-line>span::selection,.cm-s-paraiso-dark .CodeMirror-line>span>span::selection{background:rgba(65,50,63,.99)}.cm-s-paraiso-dark .CodeMirror-line::-moz-selection,.cm-s-paraiso-dark .CodeMirror-line>span::-moz-selection,.cm-s-paraiso-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(65,50,63,.99)}.cm-s-paraiso-dark .CodeMirror-gutters{background:#2f1e2e;border-right:0}.cm-s-paraiso-dark .CodeMirror-guttermarker{color:#ef6155}.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle,.cm-s-paraiso-dark .CodeMirror-linenumber{color:#776e71}.cm-s-paraiso-dark .CodeMirror-cursor{border-left:1px solid #8d8687}.cm-s-paraiso-dark span.cm-comment{color:#e96ba8}.cm-s-paraiso-dark span.cm-atom,.cm-s-paraiso-dark span.cm-number{color:#815ba4}.cm-s-paraiso-dark span.cm-attribute,.cm-s-paraiso-dark span.cm-property{color:#48b685}.cm-s-paraiso-dark span.cm-keyword{color:#ef6155}.cm-s-paraiso-dark span.cm-string{color:#fec418}.cm-s-paraiso-dark span.cm-variable{color:#48b685}.cm-s-paraiso-dark span.cm-variable-2{color:#06b6ef}.cm-s-paraiso-dark span.cm-def{color:#f99b15}.cm-s-paraiso-dark span.cm-bracket{color:#b9b6b0}.cm-s-paraiso-dark span.cm-tag{color:#ef6155}.cm-s-paraiso-dark span.cm-link{color:#815ba4}.cm-s-paraiso-dark span.cm-error{background:#ef6155;color:#8d8687}.cm-s-paraiso-dark .CodeMirror-activeline-background{background:#4d344a}.cm-s-paraiso-dark .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-paraiso-light.CodeMirror{background:#e7e9db;color:#41323f}.cm-s-paraiso-light div.CodeMirror-selected{background:#b9b6b0}.cm-s-paraiso-light .CodeMirror-line::selection,.cm-s-paraiso-light .CodeMirror-line>span::selection,.cm-s-paraiso-light .CodeMirror-line>span>span::selection{background:#b9b6b0}.cm-s-paraiso-light .CodeMirror-line::-moz-selection,.cm-s-paraiso-light .CodeMirror-line>span::-moz-selection,.cm-s-paraiso-light .CodeMirror-line>span>span::-moz-selection{background:#b9b6b0}.cm-s-paraiso-light .CodeMirror-gutters{background:#e7e9db;border-right:0}.cm-s-paraiso-light .CodeMirror-guttermarker{color:#000}.cm-s-paraiso-light .CodeMirror-guttermarker-subtle,.cm-s-paraiso-light .CodeMirror-linenumber{color:#8d8687}.cm-s-paraiso-light .CodeMirror-cursor{border-left:1px solid #776e71}.cm-s-paraiso-light span.cm-comment{color:#e96ba8}.cm-s-paraiso-light span.cm-atom,.cm-s-paraiso-light span.cm-number{color:#815ba4}.cm-s-paraiso-light span.cm-attribute,.cm-s-paraiso-light span.cm-property{color:#48b685}.cm-s-paraiso-light span.cm-keyword{color:#ef6155}.cm-s-paraiso-light span.cm-string{color:#fec418}.cm-s-paraiso-light span.cm-variable{color:#48b685}.cm-s-paraiso-light span.cm-variable-2{color:#06b6ef}.cm-s-paraiso-light span.cm-def{color:#f99b15}.cm-s-paraiso-light span.cm-bracket{color:#41323f}.cm-s-paraiso-light span.cm-tag{color:#ef6155}.cm-s-paraiso-light span.cm-link{color:#815ba4}.cm-s-paraiso-light span.cm-error{background:#ef6155;color:#776e71}.cm-s-paraiso-light .CodeMirror-activeline-background{background:#cfd1c4}.cm-s-paraiso-light .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-pastel-on-dark.CodeMirror{background:#2c2827;color:#8f938f;line-height:1.5}.cm-s-pastel-on-dark div.CodeMirror-selected{background:rgba(221,240,255,.2)}.cm-s-pastel-on-dark .CodeMirror-line::selection,.cm-s-pastel-on-dark .CodeMirror-line>span::selection,.cm-s-pastel-on-dark .CodeMirror-line>span>span::selection{background:rgba(221,240,255,.2)}.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection,.cm-s-pastel-on-dark .CodeMirror-line>span::-moz-selection,.cm-s-pastel-on-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(221,240,255,.2)}.cm-s-pastel-on-dark .CodeMirror-gutters{background:#34302f;border-right:0;padding:0 3px}.cm-s-pastel-on-dark .CodeMirror-guttermarker{color:#fff}.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle,.cm-s-pastel-on-dark .CodeMirror-linenumber{color:#8f938f}.cm-s-pastel-on-dark .CodeMirror-cursor{border-left:1px solid #a7a7a7}.cm-s-pastel-on-dark span.cm-comment{color:#a6c6ff}.cm-s-pastel-on-dark span.cm-atom{color:#de8e30}.cm-s-pastel-on-dark span.cm-number{color:#ccc}.cm-s-pastel-on-dark span.cm-property{color:#8f938f}.cm-s-pastel-on-dark span.cm-attribute{color:#a6e22e}.cm-s-pastel-on-dark span.cm-keyword{color:#aeb2f8}.cm-s-pastel-on-dark span.cm-string{color:#66a968}.cm-s-pastel-on-dark span.cm-variable{color:#aeb2f8}.cm-s-pastel-on-dark span.cm-variable-2{color:#bebf55}.cm-s-pastel-on-dark span.cm-type,.cm-s-pastel-on-dark span.cm-variable-3{color:#de8e30}.cm-s-pastel-on-dark span.cm-def{color:#757ad8}.cm-s-pastel-on-dark span.cm-bracket{color:#f8f8f2}.cm-s-pastel-on-dark span.cm-tag{color:#c1c144}.cm-s-pastel-on-dark span.cm-link{color:#ae81ff}.cm-s-pastel-on-dark span.cm-builtin,.cm-s-pastel-on-dark span.cm-qualifier{color:#c1c144}.cm-s-pastel-on-dark span.cm-error{background:#757ad8;color:#f8f8f0}.cm-s-pastel-on-dark .CodeMirror-activeline-background{background:hsla(0,0%,100%,.031)}.cm-s-pastel-on-dark .CodeMirror-matchingbracket{border:1px solid hsla(0,0%,100%,.25);color:#8f938f!important;margin:-1px -1px 0}.cm-s-railscasts.CodeMirror{background:#2b2b2b;color:#f4f1ed}.cm-s-railscasts div.CodeMirror-selected{background:#272935!important}.cm-s-railscasts .CodeMirror-gutters{background:#2b2b2b;border-right:0}.cm-s-railscasts .CodeMirror-linenumber{color:#5a647e}.cm-s-railscasts .CodeMirror-cursor{border-left:1px solid #d4cfc9!important}.cm-s-railscasts span.cm-comment{color:#bc9458}.cm-s-railscasts span.cm-atom,.cm-s-railscasts span.cm-number{color:#b6b3eb}.cm-s-railscasts span.cm-attribute,.cm-s-railscasts span.cm-property{color:#a5c261}.cm-s-railscasts span.cm-keyword{color:#da4939}.cm-s-railscasts span.cm-string{color:#ffc66d}.cm-s-railscasts span.cm-variable{color:#a5c261}.cm-s-railscasts span.cm-variable-2{color:#6d9cbe}.cm-s-railscasts span.cm-def{color:#cc7833}.cm-s-railscasts span.cm-error{background:#da4939;color:#d4cfc9}.cm-s-railscasts span.cm-bracket{color:#f4f1ed}.cm-s-railscasts span.cm-tag{color:#da4939}.cm-s-railscasts span.cm-link{color:#b6b3eb}.cm-s-railscasts .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-railscasts .CodeMirror-activeline-background{background:#303040}.cm-s-rubyblue.CodeMirror{background:#112435;color:#fff}.cm-s-rubyblue div.CodeMirror-selected{background:#38566f}.cm-s-rubyblue .CodeMirror-line::selection,.cm-s-rubyblue .CodeMirror-line>span::selection,.cm-s-rubyblue .CodeMirror-line>span>span::selection{background:rgba(56,86,111,.99)}.cm-s-rubyblue .CodeMirror-line::-moz-selection,.cm-s-rubyblue .CodeMirror-line>span::-moz-selection,.cm-s-rubyblue .CodeMirror-line>span>span::-moz-selection{background:rgba(56,86,111,.99)}.cm-s-rubyblue .CodeMirror-gutters{background:#1f4661;border-right:7px solid #3e7087}.cm-s-rubyblue .CodeMirror-guttermarker{color:#fff}.cm-s-rubyblue .CodeMirror-guttermarker-subtle{color:#3e7087}.cm-s-rubyblue .CodeMirror-linenumber{color:#fff}.cm-s-rubyblue .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-rubyblue span.cm-comment{color:#999;font-style:italic;line-height:1em}.cm-s-rubyblue span.cm-atom{color:#f4c20b}.cm-s-rubyblue span.cm-attribute,.cm-s-rubyblue span.cm-number{color:#82c6e0}.cm-s-rubyblue span.cm-keyword{color:#f0f}.cm-s-rubyblue span.cm-string{color:#f08047}.cm-s-rubyblue span.cm-meta{color:#f0f}.cm-s-rubyblue span.cm-tag,.cm-s-rubyblue span.cm-variable-2{color:#7bd827}.cm-s-rubyblue span.cm-def,.cm-s-rubyblue span.cm-type,.cm-s-rubyblue span.cm-variable-3{color:#fff}.cm-s-rubyblue span.cm-bracket{color:#f0f}.cm-s-rubyblue span.cm-link{color:#f4c20b}.cm-s-rubyblue span.CodeMirror-matchingbracket{color:#f0f!important}.cm-s-rubyblue span.cm-builtin,.cm-s-rubyblue span.cm-special{color:#ff9d00}.cm-s-rubyblue span.cm-error{color:#af2018}.cm-s-rubyblue .CodeMirror-activeline-background{background:#173047}.cm-s-seti.CodeMirror{background-color:#151718!important;color:#cfd2d1!important;border:none}.cm-s-seti .CodeMirror-gutters{color:#404b53;background-color:#0e1112;border:none}.cm-s-seti .CodeMirror-cursor{border-left:thin solid #f8f8f0}.cm-s-seti .CodeMirror-linenumber{color:#6d8a88}.cm-s-seti.CodeMirror-focused div.CodeMirror-selected{background:hsla(0,0%,100%,.1)}.cm-s-seti .CodeMirror-line::selection,.cm-s-seti .CodeMirror-line>span::selection,.cm-s-seti .CodeMirror-line>span>span::selection{background:hsla(0,0%,100%,.1)}.cm-s-seti .CodeMirror-line::-moz-selection,.cm-s-seti .CodeMirror-line>span::-moz-selection,.cm-s-seti .CodeMirror-line>span>span::-moz-selection{background:hsla(0,0%,100%,.1)}.cm-s-seti span.cm-comment{color:#41535b}.cm-s-seti span.cm-string,.cm-s-seti span.cm-string-2{color:#55b5db}.cm-s-seti span.cm-number{color:#cd3f45}.cm-s-seti span.cm-variable{color:#55b5db}.cm-s-seti span.cm-variable-2{color:#a074c4}.cm-s-seti span.cm-def{color:#55b5db}.cm-s-seti span.cm-keyword{color:#ff79c6}.cm-s-seti span.cm-operator{color:#9fca56}.cm-s-seti span.cm-keyword{color:#e6cd69}.cm-s-seti span.cm-atom{color:#cd3f45}.cm-s-seti span.cm-meta,.cm-s-seti span.cm-tag{color:#55b5db}.cm-s-seti span.cm-attribute,.cm-s-seti span.cm-qualifier{color:#9fca56}.cm-s-seti span.cm-property{color:#a074c4}.cm-s-seti span.cm-builtin,.cm-s-seti span.cm-type,.cm-s-seti span.cm-variable-3{color:#9fca56}.cm-s-seti .CodeMirror-activeline-background{background:#101213}.cm-s-seti .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-shadowfox.CodeMirror{background:#2a2a2e;color:#b1b1b3}.cm-s-shadowfox div.CodeMirror-selected{background:#353b48}.cm-s-shadowfox .CodeMirror-line::selection,.cm-s-shadowfox .CodeMirror-line>span::selection,.cm-s-shadowfox .CodeMirror-line>span>span::selection{background:#353b48}.cm-s-shadowfox .CodeMirror-line::-moz-selection,.cm-s-shadowfox .CodeMirror-line>span::-moz-selection,.cm-s-shadowfox .CodeMirror-line>span>span::-moz-selection{background:#353b48}.cm-s-shadowfox .CodeMirror-gutters{background:#0c0c0d;border-right:1px solid #0c0c0d}.cm-s-shadowfox .CodeMirror-guttermarker{color:#555}.cm-s-shadowfox .CodeMirror-linenumber{color:#939393}.cm-s-shadowfox .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-shadowfox span.cm-comment{color:#939393}.cm-s-shadowfox span.cm-atom,.cm-s-shadowfox span.cm-attribute,.cm-s-shadowfox span.cm-builtin,.cm-s-shadowfox span.cm-error,.cm-s-shadowfox span.cm-keyword,.cm-s-shadowfox span.cm-quote{color:#ff7de9}.cm-s-shadowfox span.cm-number,.cm-s-shadowfox span.cm-string,.cm-s-shadowfox span.cm-string-2{color:#6b89ff}.cm-s-shadowfox span.cm-hr,.cm-s-shadowfox span.cm-meta{color:#939393}.cm-s-shadowfox span.cm-header,.cm-s-shadowfox span.cm-qualifier,.cm-s-shadowfox span.cm-variable-2{color:#75bfff}.cm-s-shadowfox span.cm-property{color:#86de74}.cm-s-shadowfox span.cm-bracket,.cm-s-shadowfox span.cm-def,.cm-s-shadowfox span.cm-link:visited,.cm-s-shadowfox span.cm-tag{color:#75bfff}.cm-s-shadowfox span.cm-variable{color:#b98eff}.cm-s-shadowfox span.cm-variable-3{color:#d7d7db}.cm-s-shadowfox span.cm-link{color:#737373}.cm-s-shadowfox span.cm-operator{color:#b1b1b3}.cm-s-shadowfox span.cm-special{color:#d7d7db}.cm-s-shadowfox .CodeMirror-activeline-background{background:rgba(185,215,253,.15)}.cm-s-shadowfox .CodeMirror-matchingbracket{outline:1px solid hsla(0,0%,100%,.25);color:#fff!important}.solarized.base03{color:#002b36}.solarized.base02{color:#073642}.solarized.base01{color:#586e75}.solarized.base00{color:#657b83}.solarized.base0{color:#839496}.solarized.base1{color:#93a1a1}.solarized.base2{color:#eee8d5}.solarized.base3{color:#fdf6e3}.solarized.solar-yellow{color:#b58900}.solarized.solar-orange{color:#cb4b16}.solarized.solar-red{color:#dc322f}.solarized.solar-magenta{color:#d33682}.solarized.solar-violet{color:#6c71c4}.solarized.solar-blue{color:#268bd2}.solarized.solar-cyan{color:#2aa198}.solarized.solar-green{color:#859900}.cm-s-solarized{line-height:1.45em;color-profile:sRGB;rendering-intent:auto}.cm-s-solarized.cm-s-dark{color:#839496;background-color:#002b36;text-shadow:#002b36 0 1px}.cm-s-solarized.cm-s-light{background-color:#fdf6e3;color:#657b83;text-shadow:#eee8d5 0 1px}.cm-s-solarized .CodeMirror-widget{text-shadow:none}.cm-s-solarized .cm-header{color:#586e75}.cm-s-solarized .cm-quote{color:#93a1a1}.cm-s-solarized .cm-keyword{color:#cb4b16}.cm-s-solarized .cm-atom,.cm-s-solarized .cm-number{color:#d33682}.cm-s-solarized .cm-def{color:#2aa198}.cm-s-solarized .cm-variable{color:#839496}.cm-s-solarized .cm-variable-2{color:#b58900}.cm-s-solarized .cm-type,.cm-s-solarized .cm-variable-3{color:#6c71c4}.cm-s-solarized .cm-property{color:#2aa198}.cm-s-solarized .cm-operator{color:#6c71c4}.cm-s-solarized .cm-comment{color:#586e75;font-style:italic}.cm-s-solarized .cm-string{color:#859900}.cm-s-solarized .cm-string-2{color:#b58900}.cm-s-solarized .cm-meta{color:#859900}.cm-s-solarized .cm-qualifier{color:#b58900}.cm-s-solarized .cm-builtin{color:#d33682}.cm-s-solarized .cm-bracket{color:#cb4b16}.cm-s-solarized .CodeMirror-matchingbracket{color:#859900}.cm-s-solarized .CodeMirror-nonmatchingbracket{color:#dc322f}.cm-s-solarized .cm-tag{color:#93a1a1}.cm-s-solarized .cm-attribute{color:#2aa198}.cm-s-solarized .cm-hr{color:transparent;border-top:1px solid #586e75;display:block}.cm-s-solarized .cm-link{color:#93a1a1;cursor:pointer}.cm-s-solarized .cm-special{color:#6c71c4}.cm-s-solarized .cm-em{color:#999;text-decoration:underline;text-decoration-style:dotted}.cm-s-solarized .cm-error,.cm-s-solarized .cm-invalidchar{color:#586e75;border-bottom:1px dotted #dc322f}.cm-s-solarized.cm-s-dark div.CodeMirror-selected{background:#073642}.cm-s-solarized.cm-s-dark.CodeMirror ::selection{background:rgba(7,54,66,.99)}.cm-s-dark .CodeMirror-line>span::-moz-selection,.cm-s-dark .CodeMirror-line>span>span::-moz-selection,.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection{background:rgba(7,54,66,.99)}.cm-s-solarized.cm-s-light div.CodeMirror-selected{background:#eee8d5}.cm-s-light .CodeMirror-line>span::selection,.cm-s-light .CodeMirror-line>span>span::selection,.cm-s-solarized.cm-s-light .CodeMirror-line::selection{background:#eee8d5}.cm-s-ligh .CodeMirror-line>span::-moz-selection,.cm-s-ligh .CodeMirror-line>span>span::-moz-selection,.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection{background:#eee8d5}.cm-s-solarized.CodeMirror{-moz-box-shadow:inset 7px 0 12px -6px #000;-webkit-box-shadow:inset 7px 0 12px -6px #000;box-shadow:inset 7px 0 12px -6px #000}.cm-s-solarized .CodeMirror-gutters{border-right:0}.cm-s-solarized.cm-s-dark .CodeMirror-gutters{background-color:#073642}.cm-s-solarized.cm-s-dark .CodeMirror-linenumber{color:#586e75;text-shadow:#021014 0 -1px}.cm-s-solarized.cm-s-light .CodeMirror-gutters{background-color:#eee8d5}.cm-s-solarized.cm-s-light .CodeMirror-linenumber{color:#839496}.cm-s-solarized .CodeMirror-linenumber{padding:0 5px}.cm-s-solarized .CodeMirror-guttermarker-subtle{color:#586e75}.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker{color:#ddd}.cm-s-solarized.cm-s-light .CodeMirror-guttermarker{color:#cb4b16}.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text{color:#586e75}.cm-s-solarized .CodeMirror-cursor{border-left:1px solid #819090}.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor{background:#7e7}.cm-s-solarized.cm-s-light .cm-animate-fat-cursor{background-color:#7e7}.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor{background:#586e75}.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor{background-color:#586e75}.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background{background:hsla(0,0%,100%,.06)}.cm-s-solarized.cm-s-light .CodeMirror-activeline-background{background:rgba(0,0,0,.06)}.cm-s-ssms span.cm-keyword{color:#00f}.cm-s-ssms span.cm-comment{color:#006400}.cm-s-ssms span.cm-string{color:red}.cm-s-ssms span.cm-def,.cm-s-ssms span.cm-variable,.cm-s-ssms span.cm-variable-2{color:#000}.cm-s-ssms span.cm-atom{color:#a9a9a9}.cm-s-ssms .CodeMirror-linenumber{color:teal}.cm-s-ssms .CodeMirror-activeline-background{background:#fff}.cm-s-ssms span.cm-string-2{color:#f0f}.cm-s-ssms span.cm-bracket,.cm-s-ssms span.cm-operator,.cm-s-ssms span.cm-punctuation{color:#a9a9a9}.cm-s-ssms .CodeMirror-gutters{border-right:3px solid #ffee62;background-color:#fff}.cm-s-ssms div.CodeMirror-selected{background:#add6ff}.cm-s-the-matrix.CodeMirror{background:#000;color:#0f0}.cm-s-the-matrix div.CodeMirror-selected{background:#2d2d2d}.cm-s-the-matrix .CodeMirror-line::selection,.cm-s-the-matrix .CodeMirror-line>span::selection,.cm-s-the-matrix .CodeMirror-line>span>span::selection{background:rgba(45,45,45,.99)}.cm-s-the-matrix .CodeMirror-line::-moz-selection,.cm-s-the-matrix .CodeMirror-line>span::-moz-selection,.cm-s-the-matrix .CodeMirror-line>span>span::-moz-selection{background:rgba(45,45,45,.99)}.cm-s-the-matrix .CodeMirror-gutters{background:#060;border-right:2px solid #0f0}.cm-s-the-matrix .CodeMirror-guttermarker{color:#0f0}.cm-s-the-matrix .CodeMirror-guttermarker-subtle,.cm-s-the-matrix .CodeMirror-linenumber{color:#fff}.cm-s-the-matrix .CodeMirror-cursor{border-left:1px solid #0f0}.cm-s-the-matrix span.cm-keyword{color:#008803;font-weight:700}.cm-s-the-matrix span.cm-atom{color:#3ff}.cm-s-the-matrix span.cm-number{color:#ffb94f}.cm-s-the-matrix span.cm-def{color:#99c}.cm-s-the-matrix span.cm-variable{color:#f6c}.cm-s-the-matrix span.cm-variable-2{color:#c6f}.cm-s-the-matrix span.cm-type,.cm-s-the-matrix span.cm-variable-3{color:#96f}.cm-s-the-matrix span.cm-property{color:#62ffa0}.cm-s-the-matrix span.cm-operator{color:#999}.cm-s-the-matrix span.cm-comment{color:#ccc}.cm-s-the-matrix span.cm-string{color:#39c}.cm-s-the-matrix span.cm-meta{color:#c9f}.cm-s-the-matrix span.cm-qualifier{color:#fff700}.cm-s-the-matrix span.cm-builtin{color:#30a}.cm-s-the-matrix span.cm-bracket{color:#cc7}.cm-s-the-matrix span.cm-tag{color:#ffbd40}.cm-s-the-matrix span.cm-attribute{color:#fff700}.cm-s-the-matrix span.cm-error{color:red}.cm-s-the-matrix .CodeMirror-activeline-background{background:#040}.cm-s-tomorrow-night-bright.CodeMirror{background:#000;color:#eaeaea}.cm-s-tomorrow-night-bright div.CodeMirror-selected{background:#424242}.cm-s-tomorrow-night-bright .CodeMirror-gutters{background:#000;border-right:0}.cm-s-tomorrow-night-bright .CodeMirror-guttermarker{color:#e78c45}.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle{color:#777}.cm-s-tomorrow-night-bright .CodeMirror-linenumber{color:#424242}.cm-s-tomorrow-night-bright .CodeMirror-cursor{border-left:1px solid #6a6a6a}.cm-s-tomorrow-night-bright span.cm-comment{color:#d27b53}.cm-s-tomorrow-night-bright span.cm-atom,.cm-s-tomorrow-night-bright span.cm-number{color:#a16a94}.cm-s-tomorrow-night-bright span.cm-attribute,.cm-s-tomorrow-night-bright span.cm-property{color:#9c9}.cm-s-tomorrow-night-bright span.cm-keyword{color:#d54e53}.cm-s-tomorrow-night-bright span.cm-string{color:#e7c547}.cm-s-tomorrow-night-bright span.cm-variable{color:#b9ca4a}.cm-s-tomorrow-night-bright span.cm-variable-2{color:#7aa6da}.cm-s-tomorrow-night-bright span.cm-def{color:#e78c45}.cm-s-tomorrow-night-bright span.cm-bracket{color:#eaeaea}.cm-s-tomorrow-night-bright span.cm-tag{color:#d54e53}.cm-s-tomorrow-night-bright span.cm-link{color:#a16a94}.cm-s-tomorrow-night-bright span.cm-error{background:#d54e53;color:#6a6a6a}.cm-s-tomorrow-night-bright .CodeMirror-activeline-background{background:#2a2a2a}.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-tomorrow-night-eighties.CodeMirror{background:#000;color:#ccc}.cm-s-tomorrow-night-eighties div.CodeMirror-selected{background:#2d2d2d}.cm-s-tomorrow-night-eighties .CodeMirror-line::selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span::selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span>span::selection{background:rgba(45,45,45,.99)}.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span::-moz-selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span>span::-moz-selection{background:rgba(45,45,45,.99)}.cm-s-tomorrow-night-eighties .CodeMirror-gutters{background:#000;border-right:0}.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker{color:#f2777a}.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle{color:#777}.cm-s-tomorrow-night-eighties .CodeMirror-linenumber{color:#515151}.cm-s-tomorrow-night-eighties .CodeMirror-cursor{border-left:1px solid #6a6a6a}.cm-s-tomorrow-night-eighties span.cm-comment{color:#d27b53}.cm-s-tomorrow-night-eighties span.cm-atom,.cm-s-tomorrow-night-eighties span.cm-number{color:#a16a94}.cm-s-tomorrow-night-eighties span.cm-attribute,.cm-s-tomorrow-night-eighties span.cm-property{color:#9c9}.cm-s-tomorrow-night-eighties span.cm-keyword{color:#f2777a}.cm-s-tomorrow-night-eighties span.cm-string{color:#fc6}.cm-s-tomorrow-night-eighties span.cm-variable{color:#9c9}.cm-s-tomorrow-night-eighties span.cm-variable-2{color:#69c}.cm-s-tomorrow-night-eighties span.cm-def{color:#f99157}.cm-s-tomorrow-night-eighties span.cm-bracket{color:#ccc}.cm-s-tomorrow-night-eighties span.cm-tag{color:#f2777a}.cm-s-tomorrow-night-eighties span.cm-link{color:#a16a94}.cm-s-tomorrow-night-eighties span.cm-error{background:#f2777a;color:#6a6a6a}.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background{background:#343600}.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-ttcn .cm-quote{color:#090}.cm-s-ttcn .cm-header,.cm-strong{font-weight:700}.cm-s-ttcn .cm-header{color:#00f;font-weight:700}.cm-s-ttcn .cm-atom{color:#219}.cm-s-ttcn .cm-attribute{color:#00c}.cm-s-ttcn .cm-bracket{color:#997}.cm-s-ttcn .cm-comment{color:#333}.cm-s-ttcn .cm-def{color:#00f}.cm-s-ttcn .cm-em{font-style:italic}.cm-s-ttcn .cm-error{color:red}.cm-s-ttcn .cm-hr{color:#999}.cm-s-ttcn .cm-keyword{font-weight:700}.cm-s-ttcn .cm-link{color:#00c;text-decoration:underline}.cm-s-ttcn .cm-meta{color:#555}.cm-s-ttcn .cm-negative{color:#d44}.cm-s-ttcn .cm-positive{color:#292}.cm-s-ttcn .cm-qualifier{color:#555}.cm-s-ttcn .cm-strikethrough{text-decoration:line-through}.cm-s-ttcn .cm-string{color:#006400}.cm-s-ttcn .cm-string-2{color:#f50}.cm-s-ttcn .cm-strong{font-weight:700}.cm-s-ttcn .cm-tag{color:#170}.cm-s-ttcn .cm-variable{color:#8b2252}.cm-s-ttcn .cm-variable-2{color:#05a}.cm-s-ttcn .cm-type,.cm-s-ttcn .cm-variable-3{color:#085}.cm-s-ttcn .cm-invalidchar{color:red}.cm-s-ttcn .cm-accessTypes,.cm-s-ttcn .cm-compareTypes{color:#27408b}.cm-s-ttcn .cm-cmipVerbs{color:#8b2252}.cm-s-ttcn .cm-modifier{color:#d2691e}.cm-s-ttcn .cm-status{color:#8b4545}.cm-s-ttcn .cm-storage{color:#a020f0}.cm-s-ttcn .cm-tags{color:#006400}.cm-s-ttcn .cm-externalCommands{color:#8b4545;font-weight:700}.cm-s-ttcn .cm-fileNCtrlMaskOptions,.cm-s-ttcn .cm-sectionTitle{color:#2e8b57;font-weight:700}.cm-s-ttcn .cm-booleanConsts,.cm-s-ttcn .cm-otherConsts,.cm-s-ttcn .cm-verdictConsts{color:#006400}.cm-s-ttcn .cm-configOps,.cm-s-ttcn .cm-functionOps,.cm-s-ttcn .cm-portOps,.cm-s-ttcn .cm-sutOps,.cm-s-ttcn .cm-timerOps,.cm-s-ttcn .cm-verdictOps{color:#00f}.cm-s-ttcn .cm-preprocessor,.cm-s-ttcn .cm-templateMatch,.cm-s-ttcn .cm-ttcn3Macros{color:#27408b}.cm-s-ttcn .cm-types{color:brown;font-weight:700}.cm-s-ttcn .cm-visibilityModifiers{font-weight:700}.cm-s-twilight.CodeMirror{background:#141414;color:#f7f7f7}.cm-s-twilight div.CodeMirror-selected{background:#323232}.cm-s-twilight .CodeMirror-line::selection,.cm-s-twilight .CodeMirror-line>span::selection,.cm-s-twilight .CodeMirror-line>span>span::selection{background:rgba(50,50,50,.99)}.cm-s-twilight .CodeMirror-line::-moz-selection,.cm-s-twilight .CodeMirror-line>span::-moz-selection,.cm-s-twilight .CodeMirror-line>span>span::-moz-selection{background:rgba(50,50,50,.99)}.cm-s-twilight .CodeMirror-gutters{background:#222;border-right:1px solid #aaa}.cm-s-twilight .CodeMirror-guttermarker{color:#fff}.cm-s-twilight .CodeMirror-guttermarker-subtle,.cm-s-twilight .CodeMirror-linenumber{color:#aaa}.cm-s-twilight .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-twilight .cm-keyword{color:#f9ee98}.cm-s-twilight .cm-atom{color:#fc0}.cm-s-twilight .cm-number{color:#ca7841}.cm-s-twilight .cm-def{color:#8da6ce}.cm-s-twilight span.cm-def,.cm-s-twilight span.cm-tag,.cm-s-twilight span.cm-type,.cm-s-twilight span.cm-variable-2,.cm-s-twilight span.cm-variable-3{color:#607392}.cm-s-twilight .cm-operator{color:#cda869}.cm-s-twilight .cm-comment{color:#777;font-style:italic;font-weight:400}.cm-s-twilight .cm-string{color:#8f9d6a;font-style:italic}.cm-s-twilight .cm-string-2{color:#bd6b18}.cm-s-twilight .cm-meta{background-color:#141414;color:#f7f7f7}.cm-s-twilight .cm-builtin{color:#cda869}.cm-s-twilight .cm-tag{color:#997643}.cm-s-twilight .cm-attribute{color:#d6bb6d}.cm-s-twilight .cm-header{color:#ff6400}.cm-s-twilight .cm-hr{color:#aeaeae}.cm-s-twilight .cm-link{color:#ad9361;font-style:italic;text-decoration:none}.cm-s-twilight .cm-error{border-bottom:1px solid red}.cm-s-twilight .CodeMirror-activeline-background{background:#27282e}.cm-s-twilight .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-vibrant-ink.CodeMirror{background:#000;color:#fff}.cm-s-vibrant-ink div.CodeMirror-selected{background:#35493c}.cm-s-vibrant-ink .CodeMirror-line::selection,.cm-s-vibrant-ink .CodeMirror-line>span::selection,.cm-s-vibrant-ink .CodeMirror-line>span>span::selection{background:rgba(53,73,60,.99)}.cm-s-vibrant-ink .CodeMirror-line::-moz-selection,.cm-s-vibrant-ink .CodeMirror-line>span::-moz-selection,.cm-s-vibrant-ink .CodeMirror-line>span>span::-moz-selection{background:rgba(53,73,60,.99)}.cm-s-vibrant-ink .CodeMirror-gutters{background:#002240;border-right:1px solid #aaa}.cm-s-vibrant-ink .CodeMirror-guttermarker{color:#fff}.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle,.cm-s-vibrant-ink .CodeMirror-linenumber{color:#d0d0d0}.cm-s-vibrant-ink .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-vibrant-ink .cm-keyword{color:#cc7832}.cm-s-vibrant-ink .cm-atom{color:#fc0}.cm-s-vibrant-ink .cm-number{color:#ffee98}.cm-s-vibrant-ink .cm-def{color:#8da6ce}.cm-s-vibrant-ink span.cm-variable-2,.cm-s-vibrant-ink span.cm-variable-3,.cm-s-vibrant span.cm-def,.cm-s-vibrant span.cm-tag,.cm-s-vibrant span.cm-type{color:#ffc66d}.cm-s-vibrant-ink .cm-operator{color:#888}.cm-s-vibrant-ink .cm-comment{color:grey;font-weight:700}.cm-s-vibrant-ink .cm-string{color:#a5c25c}.cm-s-vibrant-ink .cm-string-2{color:red}.cm-s-vibrant-ink .cm-meta{color:#d8fa3c}.cm-s-vibrant-ink .cm-attribute,.cm-s-vibrant-ink .cm-builtin,.cm-s-vibrant-ink .cm-tag{color:#8da6ce}.cm-s-vibrant-ink .cm-header{color:#ff6400}.cm-s-vibrant-ink .cm-hr{color:#aeaeae}.cm-s-vibrant-ink .cm-link{color:#00f}.cm-s-vibrant-ink .cm-error{border-bottom:1px solid red}.cm-s-vibrant-ink .CodeMirror-activeline-background{background:#27282e}.cm-s-vibrant-ink .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.cm-s-xq-dark.CodeMirror{background:#0a001f;color:#f8f8f8}.cm-s-xq-dark div.CodeMirror-selected{background:#27007a}.cm-s-xq-dark .CodeMirror-line::selection,.cm-s-xq-dark .CodeMirror-line>span::selection,.cm-s-xq-dark .CodeMirror-line>span>span::selection{background:rgba(39,0,122,.99)}.cm-s-xq-dark .CodeMirror-line::-moz-selection,.cm-s-xq-dark .CodeMirror-line>span::-moz-selection,.cm-s-xq-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(39,0,122,.99)}.cm-s-xq-dark .CodeMirror-gutters{background:#0a001f;border-right:1px solid #aaa}.cm-s-xq-dark .CodeMirror-guttermarker{color:#ffbd40}.cm-s-xq-dark .CodeMirror-guttermarker-subtle,.cm-s-xq-dark .CodeMirror-linenumber{color:#f8f8f8}.cm-s-xq-dark .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-xq-dark span.cm-keyword{color:#ffbd40}.cm-s-xq-dark span.cm-atom{color:#6c8cd5}.cm-s-xq-dark span.cm-number{color:#164}.cm-s-xq-dark span.cm-def{color:#fff;text-decoration:underline}.cm-s-xq-dark span.cm-variable{color:#fff}.cm-s-xq-dark span.cm-variable-2{color:#eee}.cm-s-xq-dark span.cm-type,.cm-s-xq-dark span.cm-variable-3{color:#ddd}.cm-s-xq-dark span.cm-comment{color:grey}.cm-s-xq-dark span.cm-string{color:#9fee00}.cm-s-xq-dark span.cm-meta{color:#ff0}.cm-s-xq-dark span.cm-qualifier{color:#fff700}.cm-s-xq-dark span.cm-builtin{color:#30a}.cm-s-xq-dark span.cm-bracket{color:#cc7}.cm-s-xq-dark span.cm-tag{color:#ffbd40}.cm-s-xq-dark span.cm-attribute{color:#fff700}.cm-s-xq-dark span.cm-error{color:red}.cm-s-xq-dark .CodeMirror-activeline-background{background:#27282e}.cm-s-xq-dark .CodeMirror-matchingbracket{outline:1px solid grey;color:#fff!important}.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}.cm-s-yeti.CodeMirror{background-color:#eceae8!important;color:#d1c9c0!important;border:none}.cm-s-yeti .CodeMirror-gutters{color:#adaba6;background-color:#e5e1db;border:none}.cm-s-yeti .CodeMirror-cursor{border-left:thin solid #d1c9c0}.cm-s-yeti .CodeMirror-linenumber{color:#adaba6}.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected{background:#dcd8d2}.cm-s-yeti .CodeMirror-line::selection,.cm-s-yeti .CodeMirror-line>span::selection,.cm-s-yeti .CodeMirror-line>span>span::selection{background:#dcd8d2}.cm-s-yeti .CodeMirror-line::-moz-selection,.cm-s-yeti .CodeMirror-line>span::-moz-selection,.cm-s-yeti .CodeMirror-line>span>span::-moz-selection{background:#dcd8d2}.cm-s-yeti span.cm-comment{color:#d4c8be}.cm-s-yeti span.cm-string,.cm-s-yeti span.cm-string-2{color:#96c0d8}.cm-s-yeti span.cm-number{color:#a074c4}.cm-s-yeti span.cm-variable{color:#55b5db}.cm-s-yeti span.cm-variable-2{color:#a074c4}.cm-s-yeti span.cm-def{color:#55b5db}.cm-s-yeti span.cm-keyword,.cm-s-yeti span.cm-operator{color:#9fb96e}.cm-s-yeti span.cm-atom{color:#a074c4}.cm-s-yeti span.cm-meta,.cm-s-yeti span.cm-tag{color:#96c0d8}.cm-s-yeti span.cm-attribute{color:#9fb96e}.cm-s-yeti span.cm-qualifier{color:#96c0d8}.cm-s-yeti span.cm-builtin,.cm-s-yeti span.cm-property{color:#a074c4}.cm-s-yeti span.cm-type,.cm-s-yeti span.cm-variable-3{color:#96c0d8}.cm-s-yeti .CodeMirror-activeline-background{background:#e7e4e0}.cm-s-yeti .CodeMirror-matchingbracket{text-decoration:underline}.cm-s-zenburn .CodeMirror-gutters{background:#3f3f3f!important}.cm-s-zenburn .CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{color:#999}.cm-s-zenburn .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-zenburn{background-color:#3f3f3f;color:#dcdccc}.cm-s-zenburn span.cm-builtin{color:#dcdccc;font-weight:700}.cm-s-zenburn span.cm-comment{color:#7f9f7f}.cm-s-zenburn span.cm-keyword{color:#f0dfaf;font-weight:700}.cm-s-zenburn span.cm-atom{color:#bfebbf}.cm-s-zenburn span.cm-def{color:#dcdccc}.cm-s-zenburn span.cm-variable{color:#dfaf8f}.cm-s-zenburn span.cm-variable-2{color:#dcdccc}.cm-s-zenburn span.cm-string,.cm-s-zenburn span.cm-string-2{color:#cc9393}.cm-s-zenburn span.cm-number{color:#dcdccc}.cm-s-zenburn span.cm-tag{color:#93e0e3}.cm-s-zenburn span.cm-attribute,.cm-s-zenburn span.cm-property{color:#dfaf8f}.cm-s-zenburn span.cm-qualifier{color:#7cb8bb}.cm-s-zenburn span.cm-meta{color:#f0dfaf}.cm-s-zenburn span.cm-header,.cm-s-zenburn span.cm-operator{color:#f0efd0}.cm-s-zenburn span.CodeMirror-matchingbracket{box-sizing:border-box;background:transparent;border-bottom:1px solid}.cm-s-zenburn span.CodeMirror-nonmatchingbracket{border-bottom:1px solid;background:none}.cm-s-zenburn .CodeMirror-activeline,.cm-s-zenburn .CodeMirror-activeline-background{background:#000}.cm-s-zenburn div.CodeMirror-selected{background:#545454}.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected{background:#4f4f4f}.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08)}.flatpickr-calendar.inline,.flatpickr-calendar.open{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasTime .dayContainer,.flatpickr-calendar .hasWeeks .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.showTimeInput.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:after,.flatpickr-calendar:before{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:after,.flatpickr-calendar.rightMost:before{left:auto;right:22px}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:after,.flatpickr-calendar.arrowTop:before{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:after,.flatpickr-calendar.arrowBottom:before{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,.9);fill:rgba(0,0,0,.9);height:28px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-next-month,.flatpickr-months .flatpickr-prev-month{text-decoration:none;cursor:pointer;position:absolute;top:0;line-height:16px;height:28px;padding:10px;z-index:3;color:rgba(0,0,0,.9);fill:rgba(0,0,0,.9)}.flatpickr-months .flatpickr-next-month.disabled,.flatpickr-months .flatpickr-prev-month.disabled{display:none}.flatpickr-months .flatpickr-next-month i,.flatpickr-months .flatpickr-prev-month i{position:relative}.flatpickr-months .flatpickr-next-month.flatpickr-prev-month,.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-next-month.flatpickr-next-month,.flatpickr-months .flatpickr-prev-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-next-month:hover,.flatpickr-months .flatpickr-prev-month:hover{color:#959ea9}.flatpickr-months .flatpickr-next-month:hover svg,.flatpickr-months .flatpickr-prev-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-next-month svg,.flatpickr-months .flatpickr-prev-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-next-month svg path,.flatpickr-months .flatpickr-prev-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,.5)}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:6.16px 0 0;line-height:1;height:28px;display:inline-block;text-align:center;-webkit-transform:translateZ(0);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,.5);background:transparent;pointer-events:none}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays,.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-weekdays .flatpickr-weekdaycontainer,span.flatpickr-weekday{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,.54);line-height:1;margin:0;text-align:center;display:block;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day.nextMonthDay:focus,.flatpickr-day.nextMonthDay:hover,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.today.inRange,.flatpickr-day:focus,.flatpickr-day:hover{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:focus,.flatpickr-day.today:hover{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.endRange,.flatpickr-day.endRange.inRange,.flatpickr-day.endRange.nextMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.endRange:focus,.flatpickr-day.endRange:hover,.flatpickr-day.selected,.flatpickr-day.selected.inRange,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.selected:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange,.flatpickr-day.startRange.inRange,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.startRange:focus,.flatpickr-day.startRange:hover{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.endRange.startRange,.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.endRange.endRange,.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.endRange.startRange.endRange,.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.disabled,.flatpickr-day.disabled:hover,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.nextMonthDay,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.prevMonthDay{color:rgba(57,57,57,.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.disabled,.flatpickr-day.disabled:hover{cursor:not-allowed;color:rgba(57,57,57,.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{display:inline-block;float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden}.flatpickr-innerContainer,.flatpickr-rContainer{-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-rContainer{display:inline-block;padding:0}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-am-pm,.flatpickr-time .flatpickr-time-separator{height:inherit;display:inline-block;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time .flatpickr-am-pm:focus,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time input:hover{background:#f3f3f3}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/static/ddmq-logo.svg b/carrera-console/carrera-boot/src/main/resources/static/ddmq-logo.svg new file mode 100644 index 0000000..6dcc061 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/ddmq-logo.svg @@ -0,0 +1 @@ +ddmq-logo \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/static/favicon.ico b/carrera-console/carrera-boot/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d64fc0b4772e47b1a36831f592a59671b29ee9a7 GIT binary patch literal 3757 zcmds)-)<8}6vhWdYVLrmsuEIh@0_&_8`nvVy-ut?K_9`7V6~=lLPQ4A0xf@%ltKu! zBn^VJrPNMBYC&4DQePmKy~B4=_v}jh0I1XN>}Kq>aU#>S7tL5lSx?THZ)fJ0Zze(< z!RN$#0xc%)92MeiJjD?w5Fa9rpr6|x+|ku?WydU3$hIcP&YdUw%tf-Zm&qQzO7_S+ z*_qp9r|%+`NSZ57$$03PT|@N!)v8c&?5w8>lb*^?dnz~MsWVqR^}%&djeg~+kp)k^ zf6rCvWmgS9bk*q}Ty^RR`H6L>ZfrWGSncKUe#Nroo!D4~q%}zr^OCs>Brz|EdCAdv zl9^j1(~Ah6*8`HLRuNA~Cf7(BnSfQ^V2GncB9&%fin9ILo~VZu`f(Hhzc$Lpnq{V%Z= zx5CFx>7ZK1ubA75otWk@;OHhZ)cH5TdbzWXX-%~`g)WQ~e(uo&M0 zk1zW7Xx98cHSHV0`Ngd9`30ZKvQN!{&0C@GXs^;2mEjJg@Q z(=UbhH)ixS?n!|sK7~g$oTjlA`qX}Fa}cdW4gWu^ckchcp_N{An#1>lJFPSy{rORB z>CMkR%^~|?ud~;jee*H*nwvbSgfGU$Ut&O^i6F$W!KSdql&}U{eR%lY7UCUKh=F55 rOozGX<@%%IEg@`MWW~uy|EobcAe%z??+P)_nXU1~coUkh!rs3DZ>hWa literal 0 HcmV?d00001 diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo.css b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo.css new file mode 100644 index 0000000..3d9cbe7 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo.css @@ -0,0 +1,370 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯, 正淳 + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main { + padding: 30px 100px; +width: 960px; +margin: 0 auto; +} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists{ + width: 100% !important; + +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; + list-style: none !important; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} + + + +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p, +.markdown pre { + margin: 1em 0; +} + +.markdown > p, +.markdown > blockquote, +.markdown > .highlight, +.markdown > ol, +.markdown > ul { + width: 80%; +} + +.markdown ul > li { + list-style: circle; +} + +.markdown > ul li, +.markdown blockquote ul > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown > ul li p, +.markdown > ol li p { + margin: 0.6em 0; +} + +.markdown ol > li { + list-style: decimal; +} + +.markdown > ol li, +.markdown blockquote ol > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown pre { + border-radius: 6px; + background: #f7f7f7; + padding: 20px; +} + +.markdown pre code { + border: none; + background: #f7f7f7; + margin: 0; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown > table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown > table th { + white-space: nowrap; + color: #333; + font-weight: 600; + +} + +.markdown > table th, +.markdown > table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown > table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; + font-style: italic; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown > br, +.markdown > p > br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +pre{ + background: #fff; +} + + + + + diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_fontclass.html b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_fontclass.html new file mode 100644 index 0000000..df4df64 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_fontclass.html @@ -0,0 +1,388 @@ + + + + + + IconFont + + + + +
+

IconFont 图标

+
    + +
  • + +
    失败
    +
    .bcui-icon-information-fail
    +
  • + +
  • + +
    提示
    +
    .bcui-icon-icon
    +
  • + +
  • + +
    topic
    +
    .bcui-icon-topic1
    +
  • + +
  • + +
    refresh
    +
    .bcui-icon-refresh-single
    +
  • + +
  • + +
    点点
    +
    .bcui-icon-setting-more
    +
  • + +
  • + +
    收藏
    +
    .bcui-icon-shoucang
    +
  • + +
  • + +
    日志
    +
    .bcui-icon-topic
    +
  • + +
  • + +
    +
    .bcui-icon-jia
    +
  • + +
  • + +
    减号
    +
    .bcui-icon-jian
    +
  • + +
  • + +
    calendar
    +
    .bcui-icon-calendar
    +
  • + +
  • + +
    check
    +
    .bcui-icon-check
    +
  • + +
  • + +
    alert
    +
    .bcui-icon-alert
    +
  • + +
  • + +
    blocks
    +
    .bcui-icon-blocks
    +
  • + +
  • + +
    activated
    +
    .bcui-icon-activated
    +
  • + +
  • + +
    chevron-right
    +
    .bcui-icon-chevron-right
    +
  • + +
  • + +
    chevron-left
    +
    .bcui-icon-chevron-left
    +
  • + +
  • + +
    calculator
    +
    .bcui-icon-calculator
    +
  • + +
  • + +
    cloud
    +
    .bcui-icon-cloud
    +
  • + +
  • + +
    chevron-top
    +
    .bcui-icon-chevron-top
    +
  • + +
  • + +
    collapse
    +
    .bcui-icon-collapse
    +
  • + +
  • + +
    chevron-bottom
    +
    .bcui-icon-chevron-bottom
    +
  • + +
  • + +
    computer-filled
    +
    .bcui-icon-computer-filled
    +
  • + +
  • + +
    computer
    +
    .bcui-icon-computer
    +
  • + +
  • + +
    confirm
    +
    .bcui-icon-confirm
    +
  • + +
  • + +
    disk
    +
    .bcui-icon-disk
    +
  • + +
  • + +
    copy
    +
    .bcui-icon-copy
    +
  • + +
  • + +
    hardware-filled
    +
    .bcui-icon-hardware-filled
    +
  • + +
  • + +
    expand
    +
    .bcui-icon-expand
    +
  • + +
  • + +
    error
    +
    .bcui-icon-error
    +
  • + +
  • + +
    full
    +
    .bcui-icon-full
    +
  • + +
  • + +
    hardware
    +
    .bcui-icon-hardware
    +
  • + +
  • + +
    info
    +
    .bcui-icon-info
    +
  • + +
  • + +
    loading
    +
    .bcui-icon-loading
    +
  • + +
  • + +
    minus
    +
    .bcui-icon-minus
    +
  • + +
  • + +
    mirror
    +
    .bcui-icon-mirror
    +
  • + +
  • + +
    nodes
    +
    .bcui-icon-nodes
    +
  • + +
  • + +
    network-filled
    +
    .bcui-icon-network-filled
    +
  • + +
  • + +
    overview-filled
    +
    .bcui-icon-overview-filled
    +
  • + +
  • + +
    overview
    +
    .bcui-icon-overview
    +
  • + +
  • + +
    network
    +
    .bcui-icon-network
    +
  • + +
  • + +
    pencil
    +
    .bcui-icon-pencil
    +
  • + +
  • + +
    refresh
    +
    .bcui-icon-refresh
    +
  • + +
  • + +
    power-off
    +
    .bcui-icon-power-off
    +
  • + +
  • + +
    plus
    +
    .bcui-icon-plus
    +
  • + +
  • + +
    search
    +
    .bcui-icon-search
    +
  • + +
  • + +
    security-filled
    +
    .bcui-icon-security-filled
    +
  • + +
  • + +
    stop
    +
    .bcui-icon-stop
    +
  • + +
  • + +
    security
    +
    .bcui-icon-security
    +
  • + +
  • + +
    start
    +
    .bcui-icon-start
    +
  • + +
  • + +
    setting-filled
    +
    .bcui-icon-setting-filled
    +
  • + +
  • + +
    setting
    +
    .bcui-icon-setting
    +
  • + +
  • + +
    storage-filled
    +
    .bcui-icon-storage-filled
    +
  • + +
  • + +
    terminal
    +
    .bcui-icon-terminal
    +
  • + +
  • + +
    storage
    +
    .bcui-icon-storage
    +
  • + +
  • + +
    times
    +
    .bcui-icon-times
    +
  • + +
  • + +
    triangle-bottom
    +
    .bcui-icon-triangle-bottom
    +
  • + +
  • + +
    trash
    +
    .bcui-icon-trash
    +
  • + +
  • + +
    triangle-top
    +
    .bcui-icon-triangle-top
    +
  • + +
+ +

font-class引用

+
+ +

font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。

+

与unicode使用方式相比,具有如下特点:

+
    +
  • 兼容性良好,支持ie8+,及所有现代浏览器。
  • +
  • 相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。
  • +
  • 因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。
  • +
  • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的fontclass代码:

+ + +
<link rel="stylesheet" type="text/css" href="./iconfont.css">
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<i class="iconfont bcui-icon-xxx"></i>
+
+

"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。

+
+
+ + diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_symbol.html b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_symbol.html new file mode 100644 index 0000000..5a90204 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_symbol.html @@ -0,0 +1,527 @@ + + + + + + IconFont + + + + + + +
+

IconFont 图标

+
    + +
  • + +
    失败
    +
    #bcui-icon-information-fail
    +
  • + +
  • + +
    提示
    +
    #bcui-icon-icon
    +
  • + +
  • + +
    topic
    +
    #bcui-icon-topic1
    +
  • + +
  • + +
    refresh
    +
    #bcui-icon-refresh-single
    +
  • + +
  • + +
    点点
    +
    #bcui-icon-setting-more
    +
  • + +
  • + +
    收藏
    +
    #bcui-icon-shoucang
    +
  • + +
  • + +
    日志
    +
    #bcui-icon-topic
    +
  • + +
  • + +
    +
    #bcui-icon-jia
    +
  • + +
  • + +
    减号
    +
    #bcui-icon-jian
    +
  • + +
  • + +
    calendar
    +
    #bcui-icon-calendar
    +
  • + +
  • + +
    check
    +
    #bcui-icon-check
    +
  • + +
  • + +
    alert
    +
    #bcui-icon-alert
    +
  • + +
  • + +
    blocks
    +
    #bcui-icon-blocks
    +
  • + +
  • + +
    activated
    +
    #bcui-icon-activated
    +
  • + +
  • + +
    chevron-right
    +
    #bcui-icon-chevron-right
    +
  • + +
  • + +
    chevron-left
    +
    #bcui-icon-chevron-left
    +
  • + +
  • + +
    calculator
    +
    #bcui-icon-calculator
    +
  • + +
  • + +
    cloud
    +
    #bcui-icon-cloud
    +
  • + +
  • + +
    chevron-top
    +
    #bcui-icon-chevron-top
    +
  • + +
  • + +
    collapse
    +
    #bcui-icon-collapse
    +
  • + +
  • + +
    chevron-bottom
    +
    #bcui-icon-chevron-bottom
    +
  • + +
  • + +
    computer-filled
    +
    #bcui-icon-computer-filled
    +
  • + +
  • + +
    computer
    +
    #bcui-icon-computer
    +
  • + +
  • + +
    confirm
    +
    #bcui-icon-confirm
    +
  • + +
  • + +
    disk
    +
    #bcui-icon-disk
    +
  • + +
  • + +
    copy
    +
    #bcui-icon-copy
    +
  • + +
  • + +
    hardware-filled
    +
    #bcui-icon-hardware-filled
    +
  • + +
  • + +
    expand
    +
    #bcui-icon-expand
    +
  • + +
  • + +
    error
    +
    #bcui-icon-error
    +
  • + +
  • + +
    full
    +
    #bcui-icon-full
    +
  • + +
  • + +
    hardware
    +
    #bcui-icon-hardware
    +
  • + +
  • + +
    info
    +
    #bcui-icon-info
    +
  • + +
  • + +
    loading
    +
    #bcui-icon-loading
    +
  • + +
  • + +
    minus
    +
    #bcui-icon-minus
    +
  • + +
  • + +
    mirror
    +
    #bcui-icon-mirror
    +
  • + +
  • + +
    nodes
    +
    #bcui-icon-nodes
    +
  • + +
  • + +
    network-filled
    +
    #bcui-icon-network-filled
    +
  • + +
  • + +
    overview-filled
    +
    #bcui-icon-overview-filled
    +
  • + +
  • + +
    overview
    +
    #bcui-icon-overview
    +
  • + +
  • + +
    network
    +
    #bcui-icon-network
    +
  • + +
  • + +
    pencil
    +
    #bcui-icon-pencil
    +
  • + +
  • + +
    refresh
    +
    #bcui-icon-refresh
    +
  • + +
  • + +
    power-off
    +
    #bcui-icon-power-off
    +
  • + +
  • + +
    plus
    +
    #bcui-icon-plus
    +
  • + +
  • + +
    search
    +
    #bcui-icon-search
    +
  • + +
  • + +
    security-filled
    +
    #bcui-icon-security-filled
    +
  • + +
  • + +
    stop
    +
    #bcui-icon-stop
    +
  • + +
  • + +
    security
    +
    #bcui-icon-security
    +
  • + +
  • + +
    start
    +
    #bcui-icon-start
    +
  • + +
  • + +
    setting-filled
    +
    #bcui-icon-setting-filled
    +
  • + +
  • + +
    setting
    +
    #bcui-icon-setting
    +
  • + +
  • + +
    storage-filled
    +
    #bcui-icon-storage-filled
    +
  • + +
  • + +
    terminal
    +
    #bcui-icon-terminal
    +
  • + +
  • + +
    storage
    +
    #bcui-icon-storage
    +
  • + +
  • + +
    times
    +
    #bcui-icon-times
    +
  • + +
  • + +
    triangle-bottom
    +
    #bcui-icon-triangle-bottom
    +
  • + +
  • + +
    trash
    +
    #bcui-icon-trash
    +
  • + +
  • + +
    triangle-top
    +
    #bcui-icon-triangle-top
    +
  • + +
+ + +

symbol引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过font-size,color来调整样式。
  • +
  • 兼容性较差,支持 ie9+,及现代浏览器。
  • +
  • 浏览器渲染svg的性能一般,还不如png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的symbol代码:

+
<script src="./iconfont.js"></script>
+

第二步:加入通用css代码(引入一次就行):

+
<style type="text/css">
+.icon {
+   width: 1em; height: 1em;
+   vertical-align: -0.15em;
+   fill: currentColor;
+   overflow: hidden;
+}
+</style>
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#bcui-icon-xxx"></use>
+</svg>
+        
+
+ + diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_unicode.html b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_unicode.html new file mode 100644 index 0000000..7ed59ba --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/iconfont/demo_unicode.html @@ -0,0 +1,426 @@ + + + + + + IconFont + + + + + +
+

IconFont 图标

+
    + +
  • + +
    失败
    +
    &#xe615;
    +
  • + +
  • + +
    提示
    +
    &#xe723;
    +
  • + +
  • + +
    topic
    +
    &#xe80a;
    +
  • + +
  • + +
    refresh
    +
    &#xe639;
    +
  • + +
  • + +
    点点
    +
    &#xe665;
    +
  • + +
  • + +
    收藏
    +
    &#xe60e;
    +
  • + +
  • + +
    日志
    +
    &#xe71d;
    +
  • + +
  • + +
    +
    &#xe62c;
    +
  • + +
  • + +
    减号
    +
    &#xe62d;
    +
  • + +
  • + +
    calendar
    +
    &#xe6ec;
    +
  • + +
  • + +
    check
    +
    &#xe6ed;
    +
  • + +
  • + +
    alert
    +
    &#xe6ee;
    +
  • + +
  • + +
    blocks
    +
    &#xe6ef;
    +
  • + +
  • + +
    activated
    +
    &#xe6f0;
    +
  • + +
  • + +
    chevron-right
    +
    &#xe6f1;
    +
  • + +
  • + +
    chevron-left
    +
    &#xe6f2;
    +
  • + +
  • + +
    calculator
    +
    &#xe6f3;
    +
  • + +
  • + +
    cloud
    +
    &#xe6f4;
    +
  • + +
  • + +
    chevron-top
    +
    &#xe6f5;
    +
  • + +
  • + +
    collapse
    +
    &#xe6f6;
    +
  • + +
  • + +
    chevron-bottom
    +
    &#xe6f7;
    +
  • + +
  • + +
    computer-filled
    +
    &#xe6f8;
    +
  • + +
  • + +
    computer
    +
    &#xe6f9;
    +
  • + +
  • + +
    confirm
    +
    &#xe6fa;
    +
  • + +
  • + +
    disk
    +
    &#xe6fb;
    +
  • + +
  • + +
    copy
    +
    &#xe6fc;
    +
  • + +
  • + +
    hardware-filled
    +
    &#xe6fd;
    +
  • + +
  • + +
    expand
    +
    &#xe6fe;
    +
  • + +
  • + +
    error
    +
    &#xe6ff;
    +
  • + +
  • + +
    full
    +
    &#xe700;
    +
  • + +
  • + +
    hardware
    +
    &#xe701;
    +
  • + +
  • + +
    info
    +
    &#xe702;
    +
  • + +
  • + +
    loading
    +
    &#xe703;
    +
  • + +
  • + +
    minus
    +
    &#xe704;
    +
  • + +
  • + +
    mirror
    +
    &#xe705;
    +
  • + +
  • + +
    nodes
    +
    &#xe706;
    +
  • + +
  • + +
    network-filled
    +
    &#xe707;
    +
  • + +
  • + +
    overview-filled
    +
    &#xe708;
    +
  • + +
  • + +
    overview
    +
    &#xe709;
    +
  • + +
  • + +
    network
    +
    &#xe70a;
    +
  • + +
  • + +
    pencil
    +
    &#xe70b;
    +
  • + +
  • + +
    refresh
    +
    &#xe70c;
    +
  • + +
  • + +
    power-off
    +
    &#xe70d;
    +
  • + +
  • + +
    plus
    +
    &#xe70e;
    +
  • + +
  • + +
    search
    +
    &#xe70f;
    +
  • + +
  • + +
    security-filled
    +
    &#xe710;
    +
  • + +
  • + +
    stop
    +
    &#xe711;
    +
  • + +
  • + +
    security
    +
    &#xe712;
    +
  • + +
  • + +
    start
    +
    &#xe713;
    +
  • + +
  • + +
    setting-filled
    +
    &#xe714;
    +
  • + +
  • + +
    setting
    +
    &#xe715;
    +
  • + +
  • + +
    storage-filled
    +
    &#xe716;
    +
  • + +
  • + +
    terminal
    +
    &#xe717;
    +
  • + +
  • + +
    storage
    +
    &#xe718;
    +
  • + +
  • + +
    times
    +
    &#xe719;
    +
  • + +
  • + +
    triangle-bottom
    +
    &#xe71a;
    +
  • + +
  • + +
    trash
    +
    &#xe71b;
    +
  • + +
  • + +
    triangle-top
    +
    &#xe71c;
    +
  • + +
+

unicode引用

+
+ +

unicode是字体在网页端最原始的应用方式,特点是:

+
    +
  • 兼容性最好,支持ie6+,及所有现代浏览器。
  • +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
  • +
+
+

注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式

+
+

unicode使用步骤如下:

+

第一步:拷贝项目下面生成的font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+  url('iconfont.woff') format('woff'),
+  url('iconfont.ttf') format('truetype'),
+  url('iconfont.svg#iconfont') format('svg');
+}
+
+

第二步:定义使用iconfont的样式

+
.iconfont{
+  font-family:"iconfont" !important;
+  font-size:16px;font-style:normal;
+  -webkit-font-smoothing: antialiased;
+  -webkit-text-stroke-width: 0.2px;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
<i class="iconfont">&#x33;</i>
+ +
+

"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。

+
+
+ + + + diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.css b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.css new file mode 100644 index 0000000..038b4ee --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.css @@ -0,0 +1,133 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1541038457371'); /* IE9*/ + src: url('iconfont.eot?t=1541038457371#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('iconfont.ttf?t=1541038457371') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1541038457371#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bcui-icon-information-fail:before { content: "\e615"; } + +.bcui-icon-icon:before { content: "\e723"; } + +.bcui-icon-topic1:before { content: "\e80a"; } + +.bcui-icon-refresh-single:before { content: "\e639"; } + +.bcui-icon-setting-more:before { content: "\e665"; } + +.bcui-icon-shoucang:before { content: "\e60e"; } + +.bcui-icon-topic:before { content: "\e71d"; } + +.bcui-icon-jia:before { content: "\e62c"; } + +.bcui-icon-jian:before { content: "\e62d"; } + +.bcui-icon-calendar:before { content: "\e6ec"; } + +.bcui-icon-check:before { content: "\e6ed"; } + +.bcui-icon-alert:before { content: "\e6ee"; } + +.bcui-icon-blocks:before { content: "\e6ef"; } + +.bcui-icon-activated:before { content: "\e6f0"; } + +.bcui-icon-chevron-right:before { content: "\e6f1"; } + +.bcui-icon-chevron-left:before { content: "\e6f2"; } + +.bcui-icon-calculator:before { content: "\e6f3"; } + +.bcui-icon-cloud:before { content: "\e6f4"; } + +.bcui-icon-chevron-top:before { content: "\e6f5"; } + +.bcui-icon-collapse:before { content: "\e6f6"; } + +.bcui-icon-chevron-bottom:before { content: "\e6f7"; } + +.bcui-icon-computer-filled:before { content: "\e6f8"; } + +.bcui-icon-computer:before { content: "\e6f9"; } + +.bcui-icon-confirm:before { content: "\e6fa"; } + +.bcui-icon-disk:before { content: "\e6fb"; } + +.bcui-icon-copy:before { content: "\e6fc"; } + +.bcui-icon-hardware-filled:before { content: "\e6fd"; } + +.bcui-icon-expand:before { content: "\e6fe"; } + +.bcui-icon-error:before { content: "\e6ff"; } + +.bcui-icon-full:before { content: "\e700"; } + +.bcui-icon-hardware:before { content: "\e701"; } + +.bcui-icon-info:before { content: "\e702"; } + +.bcui-icon-loading:before { content: "\e703"; } + +.bcui-icon-minus:before { content: "\e704"; } + +.bcui-icon-mirror:before { content: "\e705"; } + +.bcui-icon-nodes:before { content: "\e706"; } + +.bcui-icon-network-filled:before { content: "\e707"; } + +.bcui-icon-overview-filled:before { content: "\e708"; } + +.bcui-icon-overview:before { content: "\e709"; } + +.bcui-icon-network:before { content: "\e70a"; } + +.bcui-icon-pencil:before { content: "\e70b"; } + +.bcui-icon-refresh:before { content: "\e70c"; } + +.bcui-icon-power-off:before { content: "\e70d"; } + +.bcui-icon-plus:before { content: "\e70e"; } + +.bcui-icon-search:before { content: "\e70f"; } + +.bcui-icon-security-filled:before { content: "\e710"; } + +.bcui-icon-stop:before { content: "\e711"; } + +.bcui-icon-security:before { content: "\e712"; } + +.bcui-icon-start:before { content: "\e713"; } + +.bcui-icon-setting-filled:before { content: "\e714"; } + +.bcui-icon-setting:before { content: "\e715"; } + +.bcui-icon-storage-filled:before { content: "\e716"; } + +.bcui-icon-terminal:before { content: "\e717"; } + +.bcui-icon-storage:before { content: "\e718"; } + +.bcui-icon-times:before { content: "\e719"; } + +.bcui-icon-triangle-bottom:before { content: "\e71a"; } + +.bcui-icon-trash:before { content: "\e71b"; } + +.bcui-icon-triangle-top:before { content: "\e71c"; } + diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.eot b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..58a60692a340c31c8debfb1020e621808a608c29 GIT binary patch literal 12764 zcmd^ld3+qjop1fBFU_HuY0ar)q&YM*mMzJWW;A2VvLqiE%YbZbFtOpq7P>4)7bDrm z@3FB$Ai=-_F)Y~_hY(m`V<2G(ERaozA&@xX*n}J$A&}h{q+A4(16c61_FLT}+Ym^0 z-)H}OJ@c!stE+$YtKU_>>X(`s%K(URCN9nt$;_bUIuf}vH(2G9sacI;_(1GOCu`?( z9yZMS*f<+wgJwE~1{d4N2G|hW#YR{!%cCa1HlrrbCed5;jj(3c$ePgdLC>RFywt&_ znZ%k--*oQEdyTKYhRP+VUAcbK;+FQy*I@#53Cf%MMtdiI{Z_~KF`FZd$=@Ct**o|W zizOK=L36EV$3Snt_ujRyqwsS;b_Xg-#^o)@e;rV}V|41`*V1$EU_3Fu-;Rv;^%`H$ zzRZ|*1Too<21_uByg9e z=cd^O@-1_Pxq^JXIU78B;#y|bpx=*T2g2Lj?SEnp*=&5CUAk9f#2wG>ldqRPfnrH< zxqt#n%h>m8LeJ(<~exM8rW)~k>R0UlPqE!LYrtM)DTn6 zoEU~=g|1@?E8+Y3Qz&0+-RU>1g+S7iJR>@vdTkgyt)F$xxPEE3<`3Kj_TpW*#H;>C z;g-KL-hsc;{y&Wm!&;kT&J}P|07ACv%_>Glkq&R8R#2oKcdQ)hWhSUx22qe0pK;Cj zXBuXf&J4_kXXC%L&tYZFx_VJJ^V|74JaOtpcwYQ`=5IIKjYbvkDPcB@ui#A%@JuO0 z(~bA&=;=jIKLj(#Ladxsuu4|N!r+`57GY5qV{ul?5-iD5Yyqod3)v!I+yJ3n46$uy zEiBD4td(V1jxAwJSsT;97?>{!KKlRtGNqFrEs~*4te^!#%4Yl)2rifbcL)$NIn!VP zR*cOowLl2W%zy=gqh@|6SvK=K3xr;nfu<9H)n+rtEWo<6nKvu|2e6sn zTL4~QGk>rET)}4kXaV?x&HTv%a0;7w(*p1en|aFua1Wb#+XCF7}#;^c9$Yun`3w;)5Y!){G;7c|OdI;}&1N+Vz};*XbQb_VXS1NY0B}5;1$_m8_t`Ay zD*#f!W9 zkSaC{`U-%2v02bp03?mgg1!PEb8Hs$6#(gDv!Jg4$RV2reFZ=w*(~TQ0J6zuL0uV@khriSj#DR@>DZ)JL=uZG-mZl32+(B{$m|ZG*OJY=`Vs_QxD8j;)USoHska z=X|rYz4V;YD@$K;mAP(q9d)ntOnAQTd0XG0=k){nOj(I|_uP}x15ySYE%Xl~7irZL z?4VpDrMv;38e2@78cSw6DV5A*TWTnmZ3+0?6y)sTHx=d0hpqG;TUoj7(o1b2uSmTi zk(QSsl`_hkU$gpr?Mw;GN!tpiIKsjJ%SI`lEVUC)`?#K-t0l3K0(tUaj!L zt8|~#v)nj~cuxm?^>E>LysV+Hla?Fbng{+v`MROPuSniMz#~+6rTt8a=*yj(iGI{r zc%63^4tIXD>qw_y49Mc#e(8(SZo#e82t0z-q`4^7NVyIvh+H7ug5?n{HI#Ho)jSwT z1J7(yYE*R>sY@GOHGjPMrh9^=>-S#WeYwUO!T#CB)S3+@(3q*AKv2mB z{nB?!6t%3>c>9y8Kj>F3H{K~N(-hl7F)2`5YP0|056+;^!DH2>QjEW8^V$9&#d+!1 zh)DC%Jnk2Y~nA;KQW~mESq!t=+30sXBrjqd}$gP9=QSgACNlHF7 z9*rei^-MOc_)(v3jmMJ9Dd^YG(-%lbTe6v?7LBRCfOrN^Tye9%%5W^q5@i?ii|caa zX!AG=S2#T$Cw-gR>W7Bh-Yf4h{?YA&CisZk>vf-!=LZh@Xh~gRb=?xeoiBG)77jXf z-O0c1)aifMx6x@{_u!}LVe*E3zOeTh0Ev8&k8YD*mNr4#r{RIK1o%9vCR2I`=93Ks z1AaZwlGC$T!V~kv3^3DVjLat7quC4|@=0G(*47j*4!3gN80ME(t=1K(K_bPLsVP(} z26DAEb|-&xL5A~sqXSJ+gYh)|50y9yu26`-917Od(vrqP zMYP!=Q#Mu3_Z1#PLr2K?id-+tuuCS-ot(peZwCJlm=~7*H&LcF7N$Zrre*A*VCm!F zoOr7c3k^EWy2nptqehaVdQ_U8rrK;R%`x*fo$V&-&PvR>7oY|t)>Tyc!z? ze84H%$TK-ea!Ww-roECs-OA6PD@w|0yvKj%wRVtI2T?kuj)2Ii{gzWE`~GJ|9l>OH<9b>Gp;NdYyy>REcOaG&4tysN zCaPW}DnzbW5$4+t-FMV4D*Q+N)zym*9SWRMH14C7cXxN+Wqf08cQZYoIRSZ;(>l;b=yZ!ebofl|phV2Y z{U;O)6sgh@@cT4X{K89Yq(Hr^*5ipZ1jRNTJ+9P zRdq_&m)0#j*Bf8Z+Oa6Pdg9W;m+HFeDB$n(30KbKu|ra&)F*h%Mw*R+Ql$~zN>>;c zZ>4?of43TYkSq3!SpB?$7qx#EjTh4ur*;$jhPi)`#-t12)kopc*1_v+hMj}2Cu9ah z5n40{2PK|}f-iKRi^roNkesN96PH;@yDeSlmH+&4Pd-GSu;T zs_iz`k+Zk=Tl0UZ%naT)nF3O zw$<|{DF1-h&ASVe){P*?Xh&bM{9ou^0YOE&G~w03#Ph25d9?!8pmw2b(B_>IDo!(t1aLXR6;+v!faqur?HTa2yC z=}u$Ia{71CRoKpdK-6a%>sf=HLMJ-|{EexF$)~~;!aPD!i)ArcQ<|}|f2o~xpPEX5 z+Y{M9Lhcre^zMW1fS=yL68rrggPH4gGH*1__d+u*@@U4(s!B1KukpCEZ7Pi0}g<^|G{ZM<>T4%D$ptpqb149cI2_I0t)6 zN@+n#Nr>7YFoW0*LO_pCuRThab{~7v_`RZ#>&YjnR8@^XP}Ov|s4tvpRk{?#`2CaU zWbxp0(t}c+NrSj)d!S=KNSmCbiUjMSw5Fj>(*6gF`s09gFO2a6rrKCs7&Gq`Qmyf~ zZxw#@7JtR>DO_bT-!6|(8jA~8H3|jO$agL7D9m(se+GI3y1|r-ebNhvC|Wx(a~G5V zGYFXw$_#7(bx>TYIO$Pc!47EtCoQA;SmDYDq`e`!9(ley+92|UEBS6CMazsQ=An9h ztezU9{E29T$cg8cMH?h6&=zVVJbHr{TgZ@)-Uy#AFJUo>8UxI}4sz6I_4j#FA*L{EzkW~I+b z4)B4~^af)h9+XQ#r@@?xWlqBbG2OIyB8N?uKi(>omLJXFUNrqU%|DwdY<%_IK)9P< z_ltMna;+@~`Q_aE5>R)pz~X z-NrfQgJOL(tnU%*%U6Ii6YvI>!@6!_{|nstKFyVgwp7D$I^hyzItvq4hVjlZ$G+QMy2%{!95FaH;{0xr`D$5p8UB^=c;QK1WOZbJ zj~fcet)vBYM0E?ucnum8dK2_H=|2j-KxB+g;RbIDMA7s$d;tkj9M0ay5ik0pKKyIy z>J}b2AWgrIBaF}bVyPHxOkHQ4v6jZfdRRWdpP;)SesC&OfcJ}llP z^wRgGd!;m@zhP*l4EEj|u<|YvHVeT5m@F-o!-f^{m&GtwrXz?o7csOzqFQuA1VTl( zU=ElG53&<@3J+4N<{*x_3HwobG+KUpH2TfkThHSBtk&D>+c|H4oECP})pabSpMFTQ z7qsyadhnYa5vS4Wh}t`yVSatssdjjqbA{1dQ&~sZsw6#`Ty-lb+*wz*;jee}#(ch* zH)5_W;e+gWvJqfkXh1F3Q}VZcBD0@n5!{X#KLPL}E!Y$!jvVXIhe- zN&MS;IPYn%N+y>i62=27##gQ!Uoo^_lJ*ZZ_B7(Z7QW~9(@*UiP9&Bl5+&G9m0%cS zF0rzEWi4WP?aS7$B{BSx1YPi9El+mkr}JHW|IpC>(;GHyS>Hh0*RI`GI7YP?B>@cE zdrl{T%aSDB^gHm94YZt*J`WqG;rzgl*nAw+Y(ea}3v^V2@nmZz7flCLEuIyeB**}& zrd=dl`FIC`oq|w-W&?^|kwuG?%%uYwtyk^O`%Cz$f3s_z=WNE$Hh(&G)K>FbUybc( z>eI%vp_ul3^ag70zajd(7Q1^xRlWU>jzv|W1&&$gg3zsY^|)%Mr-ueRR$?DF)G}yX z8=Ba#a%{nZv6UMpxY4wKW8c+PRaf_I+}~MyeP7@8$B)(QIs5EAHB>P;G&Cq=Mc9X@ zu*VKz7lrsc0b97(dREgBe$s$!2l17kd!|Hk8rRb%`WyMVTW@_%mY7k zjmylMTfg`m#uL8djnc2Boshk1&xu_7V}M7#GM zAnCEsT=ig?akU&0xO`#R2o9RsZt|#a7*c#JMtv# z2ZW|2SdB<t@QCWWUz-L5C zuCfN3e%yGbYf*WdYq7s{LAj%XLgaKu^b*&FSJl-hVSPzju1&fe(JIC6NhPG_j7ukn z^ZX%Avgtvec6Og`clq4jx`{P*r^6Sp=X$)7RHB9pdlaWP=v7*S$!^NtS5;YWm#dm1I|LSSRz^uV$8STn4EnbLV~ccbT(e_4|H)MhVVCci4aH*6vj!3I40qv|7tY5{6~CMa)aWAB65TshwSzqeniwO4RV$5h~LHedb|A) zntH%5uw!%6(h>NLVqQlcXt|AHic`^Fo;EpHb`9|cAJ$sL5x6ZpaM zZ(N32v{|Pj_x!Qq@*_tC9}0Y@rJrNma&Znv!Y{If2E(=@r!wKGS^5NK%X0W>bmu3y z{K9Rwy&&_w1J`^-Qj9mAddhf1k^Y%-zDlCX1tO8Uh8rKffo~e!Y2T_O07~ zVEh`cUEl|IzB5UcK4ZJDveHMl_{0&JHAge{2ungZOM!XCQ4WG6cO9m?jB^hg=hBbo zGj|;}aX&2mMB0qq7tYcWurBbSEph;JpDNC1P&B6`*`DrwI=!dsu2*IG)w}L~RZbZP zcHJaNH|?4d>GNosrP*e)$!em(!MUo` zee&tEvis)DwSJWO5m}awS+)PE7$=Wg-)}3Ex(~J`x zwqq|{Y-kc4EkEu?=`i$dJv$pw(GQ?VO2kJ@ia^zL&`FX&7R1k+#hD6FX@oBX&84Z? zFbtb;&H}-fW-s>AxuA5IE2o`xg|B>x?)A9-ap!qK(9IUA_O7}1tdbHvRaRne`&g@^ zGzTmGnLydaT}wD8$rlW}I`*zmwavF}(quvCvNa#QQTlS5@xt|OTlh7`Lpwh@+--M; zO4QELj||t>kB#+s!<9}_a#>ZjlU>&8TAUJ4YA9^9+q<@$c?PYOaJ-^OrAr$WxxGul zfkDsMXe@E|+HFgDrrr3(HSL=P4-0uZDqSlzBL|PuMmpRa`1CroZXgJLKqN_u6pmGR z7bOFM>2c_k74W544$8X| zgZbgjiW9xoY%UlOL00JPYzmYXuB96)9NwbX@`9=wOaXWm45^BvL1Aq{a8puNU7(gb z`WG~nl|EFeQ`3TeM@YLsRUQ2$CH)Rny+8|zR?^X2CR)o;rCF^SJ>Ii}^Bq0wMf$5R zI5f2_;+@1W=sxL=D`vEvi=sRHU51vq@L9>jh#I>MMtmeVAxwXUGT2nZqhA9)L)IuwWKtLLPHOfK} zcTx;701>7Z_D)klRTRu{zTYSIjQ9zn1p^={3TBuu-GU9I;9g-VVLyf0L^A>otr?u3 z2}K}QB9+8ID2Od+Ml$`>oJsRki@C$G99SBs#j%eAMQ2sTit;U?P*|x0qSP3#Q^KLp zmhu%9RnB4;NBG0KgdH2nQ(9HwtgtVpt<(&~;Ihg7($#cYsb99aRN2;q`X)PiRF!)6 z6+4@iAJ)0qW_9k$U68|n^F@+$(dI}tf`7{@qE(V`ElIO#3?hk)lr9`>sk_|SSxcGP zPUq!yE%i$|Us_){Xx-^$1U186@23#|#AznksDkc{EnXZmwp6U9wnbL2MQwD26$rIb zljo;R`zO9ms}SGacttGD3Y<_BSiu6HP~Qk`ZI`+VuV1wKqKj5PV2n!BmDu3dRvx$R zR7ulPyjzX~uf6T3Dhew(0O) z<`*i8I0gw2%V$O-g&h{>2_kfT2bP3)Rn=}iaVYBDzMa_i?M8#du$;%I@$HX;BEn5F zevXtgBVsKx{oE)Xv7&C8rj2Rdh0!8tezfR+EvS6&JZ(_?W|UEE9H0b0Xr6q+_{97~ zX`lFf3RfAvz%?T&$cv*iD=)rq^cVARBjAHs^%Cl9i+LG&d=D!I0nHqUiCB3R^_|7M z9X{3R#k>Q%!93yzBx47R9q;AEJkG_~SBiO#9q~7dc@b%Nx|o-d|5-7wz)yaym{*yH z#38g8)6O=Nx0rXZBn{hF((# z;qkFZb7Rwd)#(Fc1Nr%JCU+0DOic|&2J_>iku?}_U}R)GGLawOInX!NxMON+qHXbF z@gh;**f%~3v{qr-1NdTl3TZ!!unXB zGyZ;jCh>9W5W)~s_zeQTL0~=3Mv+@n`~rOd-<^*jA7K+_+fIzrhu)2Bhxyb5)XQT0 z=D%2<@84*C$v!Ih1U{5`iSOV(=)&0_Nzf+>sfg*8K)u=_BTgy>bGykyI+c-^dT5CIn-|@RpFSf8s9=i5Lk{;9CDSQBy`3Cs-uN)lu*!y~d-eRXPlVz{r_l^+<)4@~Z8m>eD(8X0g-4opoU z*DyMsA1ImJF}|y>cWg*8`${{9du6~_Nnh{Cz*v88Ug_I0(DyL~rTmn7AwGit*rctu zZ)$kA;HXkG?#|t3AI^`;{lk+Vll#Ue_PTfU=KJ^b<_C&h z)q#sAddK>efqZ^EFAwe-87Z0XAq(PYBjdgOn6)xGJhp369UT_^l(F&tfl1fcz|@}c z{KtwTxyN@8.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.svg b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.svg new file mode 100644 index 0000000..e7e75a7 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.svg @@ -0,0 +1,200 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.ttf b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..73c851a250596b6b0a1045da108b35b0a05c63a2 GIT binary patch literal 12596 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 P-pL)#6Sa7q$)W!NSmcXq literal 0 HcmV?d00001 diff --git a/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.woff b/carrera-console/carrera-boot/src/main/resources/static/iconfont/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..b4d60c39d1df5b8d8c50416a3c72767cef99ceba GIT binary patch literal 7900 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.bcui-icon{line-height:1}.bcui-button,.bcui-button:active,.bcui-button:focus{outline:0}.bcui-button:not([disabled]):hover{text-decoration:none}.bcui-button:not([disabled]):active{outline:0;transition:none}.bcui-button.disabled,.bcui-button[disabled]{cursor:not-allowed}.bcui-button.disabled>*,.bcui-button[disabled]>*{pointer-events:none}.bcui-button.bcui-button--icon-only{padding:0 10px}.bcui-button--large{padding:0 16px;font-size:14px;border-radius:4px;height:40px}.bcui-button--larger{padding:6px 16px;font-size:14px;border-radius:4px;height:48px}.bcui-button--small{padding:0 9px;font-size:12px;border-radius:4px;height:24px}.bcui-button--extra{padding:0;font-size:9px;border-radius:4px;height:20px}.bcui-button>a:only-child{color:currentColor}.bcui-button>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button:hover{background-color:#fff;border-color:#e4e5e7}.bcui-button.active,.bcui-button:active{background-color:#f2f2f2;border-color:#f2f2f2}.bcui-button.disabled,.bcui-button.disabled.active,.bcui-button.disabled:active,.bcui-button.disabled:focus,.bcui-button.disabled:hover,.bcui-button[disabled],.bcui-button[disabled].active,.bcui-button[disabled]:active,.bcui-button[disabled]:focus,.bcui-button[disabled]:hover,fieldset[disabled] .bcui-button,fieldset[disabled] .bcui-button.active,fieldset[disabled] .bcui-button:active,fieldset[disabled] .bcui-button:focus,fieldset[disabled] .bcui-button:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button.disabled.active>a:only-child,.bcui-button.disabled:active>a:only-child,.bcui-button.disabled:focus>a:only-child,.bcui-button.disabled:hover>a:only-child,.bcui-button.disabled>a:only-child,.bcui-button[disabled].active>a:only-child,.bcui-button[disabled]:active>a:only-child,.bcui-button[disabled]:focus>a:only-child,.bcui-button[disabled]:hover>a:only-child,.bcui-button[disabled]>a:only-child,fieldset[disabled] .bcui-button.active>a:only-child,fieldset[disabled] .bcui-button:active>a:only-child,fieldset[disabled] .bcui-button:focus>a:only-child,fieldset[disabled] .bcui-button:hover>a:only-child,fieldset[disabled] .bcui-button>a:only-child{color:currentColor}.bcui-button.disabled.active>a:only-child:after,.bcui-button.disabled:active>a:only-child:after,.bcui-button.disabled:focus>a:only-child:after,.bcui-button.disabled:hover>a:only-child:after,.bcui-button.disabled>a:only-child:after,.bcui-button[disabled].active>a:only-child:after,.bcui-button[disabled]:active>a:only-child:after,.bcui-button[disabled]:focus>a:only-child:after,.bcui-button[disabled]:hover>a:only-child:after,.bcui-button[disabled]>a:only-child:after,fieldset[disabled] .bcui-button.active>a:only-child:after,fieldset[disabled] .bcui-button:active>a:only-child:after,fieldset[disabled] .bcui-button:focus>a:only-child:after,fieldset[disabled] .bcui-button:hover>a:only-child:after,fieldset[disabled] .bcui-button>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button:hover{color:#6d7380;background-color:#fcfcfc;border-color:#2d77ee}.bcui-button:hover>a:only-child{color:currentColor}.bcui-button:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button.active,.bcui-button:active{color:#454c5b;background-color:#f5f3f3;border-color:#d2d3d6}.bcui-button.active>a:only-child,.bcui-button:active>a:only-child{color:currentColor}.bcui-button.active>a:only-child:after,.bcui-button:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--long{width:100%}.bcui-button>.bcui-icon+span,.bcui-button>span+.bcui-icon{margin-left:4px}.bcui-button--primary{color:#fff;background-color:#2d77ee;border-color:#2d77ee}.bcui-button--primary:hover{border-color:#e4e5e7}.bcui-button--primary>a:only-child{color:currentColor}.bcui-button--primary>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--primary:hover{color:#fff;background-color:#5792f1;border-color:#5792f1}.bcui-button--primary:hover>a:only-child{color:currentColor}.bcui-button--primary:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--primary.active,.bcui-button--primary:active{color:#f2f2f2;background-color:#2b71e2;border-color:#2b71e2}.bcui-button--primary.active>a:only-child,.bcui-button--primary:active>a:only-child{color:currentColor}.bcui-button--primary.active>a:only-child:after,.bcui-button--primary:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--primary.disabled,.bcui-button--primary.disabled.active,.bcui-button--primary.disabled:active,.bcui-button--primary.disabled:focus,.bcui-button--primary.disabled:hover,.bcui-button--primary[disabled],.bcui-button--primary[disabled].active,.bcui-button--primary[disabled]:active,.bcui-button--primary[disabled]:focus,.bcui-button--primary[disabled]:hover,fieldset[disabled] .bcui-button--primary,fieldset[disabled] .bcui-button--primary.active,fieldset[disabled] .bcui-button--primary:active,fieldset[disabled] .bcui-button--primary:focus,fieldset[disabled] .bcui-button--primary:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--primary.disabled.active>a:only-child,.bcui-button--primary.disabled:active>a:only-child,.bcui-button--primary.disabled:focus>a:only-child,.bcui-button--primary.disabled:hover>a:only-child,.bcui-button--primary.disabled>a:only-child,.bcui-button--primary[disabled].active>a:only-child,.bcui-button--primary[disabled]:active>a:only-child,.bcui-button--primary[disabled]:focus>a:only-child,.bcui-button--primary[disabled]:hover>a:only-child,.bcui-button--primary[disabled]>a:only-child,fieldset[disabled] .bcui-button--primary.active>a:only-child,fieldset[disabled] .bcui-button--primary:active>a:only-child,fieldset[disabled] .bcui-button--primary:focus>a:only-child,fieldset[disabled] .bcui-button--primary:hover>a:only-child,fieldset[disabled] .bcui-button--primary>a:only-child{color:currentColor}.bcui-button--primary.disabled.active>a:only-child:after,.bcui-button--primary.disabled:active>a:only-child:after,.bcui-button--primary.disabled:focus>a:only-child:after,.bcui-button--primary.disabled:hover>a:only-child:after,.bcui-button--primary.disabled>a:only-child:after,.bcui-button--primary[disabled].active>a:only-child:after,.bcui-button--primary[disabled]:active>a:only-child:after,.bcui-button--primary[disabled]:focus>a:only-child:after,.bcui-button--primary[disabled]:hover>a:only-child:after,.bcui-button--primary[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--primary.active>a:only-child:after,fieldset[disabled] .bcui-button--primary:active>a:only-child:after,fieldset[disabled] .bcui-button--primary:focus>a:only-child:after,fieldset[disabled] .bcui-button--primary:hover>a:only-child:after,fieldset[disabled] .bcui-button--primary>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--primary.active,.bcui-button--primary:active,.bcui-button--primary:hover{color:#fff}.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary:not(:first-child):not(:last-child){border-right-color:#2b71e2;border-left-color:#2b71e2}.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary:first-child:not(:last-child){border-right-color:#2b71e2}.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary:first-child:not(:last-child)[disabled]{border-right-color:#dddee1}.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary+.bcui-button,.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary:last-child:not(:first-child){border-left-color:#2b71e2}.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary+.bcui-button[disabled],.bcui-button-group:not(.bcui-button-group-vertical) .bcui-button--primary:last-child:not(:first-child)[disabled]{border-left-color:#dddee1}.bcui-button-group-vertical .bcui-button--primary:not(:first-child):not(:last-child){border-top-color:#2b71e2;border-bottom-color:#2b71e2}.bcui-button-group-vertical .bcui-button--primary:first-child:not(:last-child){border-bottom-color:#2b71e2}.bcui-button-group-vertical .bcui-button--primary:first-child:not(:last-child)[disabled]{border-top-color:#dddee1}.bcui-button-group-vertical .bcui-button--primary+.bcui-button,.bcui-button-group-vertical .bcui-button--primary:last-child:not(:first-child){border-top-color:#2b71e2}.bcui-button-group-vertical .bcui-button--primary+.bcui-button[disabled],.bcui-button-group-vertical .bcui-button--primary:last-child:not(:first-child)[disabled]{border-bottom-color:#dddee1}.bcui-button--gray{color:#666;background-color:#f2f3f5;border-color:#dddee1}.bcui-button--gray>a:only-child{color:currentColor}.bcui-button--gray>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--gray:hover{color:#858585;background-color:#f5f5f7;border-color:#e4e5e7}.bcui-button--gray:hover>a:only-child{color:currentColor}.bcui-button--gray:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--gray.active,.bcui-button--gray:active{color:#616161;background-color:#e6e7e9;border-color:#e6e7e9}.bcui-button--gray.active>a:only-child,.bcui-button--gray:active>a:only-child{color:currentColor}.bcui-button--gray.active>a:only-child:after,.bcui-button--gray:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--gray.disabled,.bcui-button--gray.disabled.active,.bcui-button--gray.disabled:active,.bcui-button--gray.disabled:focus,.bcui-button--gray.disabled:hover,.bcui-button--gray[disabled],.bcui-button--gray[disabled].active,.bcui-button--gray[disabled]:active,.bcui-button--gray[disabled]:focus,.bcui-button--gray[disabled]:hover,fieldset[disabled] .bcui-button--gray,fieldset[disabled] .bcui-button--gray.active,fieldset[disabled] .bcui-button--gray:active,fieldset[disabled] .bcui-button--gray:focus,fieldset[disabled] .bcui-button--gray:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--gray.disabled.active>a:only-child,.bcui-button--gray.disabled:active>a:only-child,.bcui-button--gray.disabled:focus>a:only-child,.bcui-button--gray.disabled:hover>a:only-child,.bcui-button--gray.disabled>a:only-child,.bcui-button--gray[disabled].active>a:only-child,.bcui-button--gray[disabled]:active>a:only-child,.bcui-button--gray[disabled]:focus>a:only-child,.bcui-button--gray[disabled]:hover>a:only-child,.bcui-button--gray[disabled]>a:only-child,fieldset[disabled] .bcui-button--gray.active>a:only-child,fieldset[disabled] .bcui-button--gray:active>a:only-child,fieldset[disabled] .bcui-button--gray:focus>a:only-child,fieldset[disabled] .bcui-button--gray:hover>a:only-child,fieldset[disabled] .bcui-button--gray>a:only-child{color:currentColor}.bcui-button--gray.disabled.active>a:only-child:after,.bcui-button--gray.disabled:active>a:only-child:after,.bcui-button--gray.disabled:focus>a:only-child:after,.bcui-button--gray.disabled:hover>a:only-child:after,.bcui-button--gray.disabled>a:only-child:after,.bcui-button--gray[disabled].active>a:only-child:after,.bcui-button--gray[disabled]:active>a:only-child:after,.bcui-button--gray[disabled]:focus>a:only-child:after,.bcui-button--gray[disabled]:hover>a:only-child:after,.bcui-button--gray[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--gray.active>a:only-child:after,fieldset[disabled] .bcui-button--gray:active>a:only-child:after,fieldset[disabled] .bcui-button--gray:focus>a:only-child:after,fieldset[disabled] .bcui-button--gray:hover>a:only-child:after,fieldset[disabled] .bcui-button--gray>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--gray.active,.bcui-button--gray:active,.bcui-button--gray:hover{color:#666;background:#e4e5ea}.bcui-button--ghost{color:#b3b3b3;background-color:transparent;border-color:#f5f5f5}.bcui-button--ghost>a:only-child{color:currentColor}.bcui-button--ghost>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--ghost:hover{color:#c2c2c2;background-color:hsla(0,0%,100%,.2);border-color:#f7f7f7}.bcui-button--ghost.active,.bcui-button--ghost:active{color:#aaa;background-color:rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.bcui-button--ghost.disabled,.bcui-button--ghost.disabled.active,.bcui-button--ghost.disabled:active,.bcui-button--ghost.disabled:focus,.bcui-button--ghost.disabled:hover,.bcui-button--ghost[disabled],.bcui-button--ghost[disabled].active,.bcui-button--ghost[disabled]:active,.bcui-button--ghost[disabled]:focus,.bcui-button--ghost[disabled]:hover,fieldset[disabled] .bcui-button--ghost,fieldset[disabled] .bcui-button--ghost.active,fieldset[disabled] .bcui-button--ghost:active,fieldset[disabled] .bcui-button--ghost:focus,fieldset[disabled] .bcui-button--ghost:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--ghost.disabled.active>a:only-child,.bcui-button--ghost.disabled:active>a:only-child,.bcui-button--ghost.disabled:focus>a:only-child,.bcui-button--ghost.disabled:hover>a:only-child,.bcui-button--ghost.disabled>a:only-child,.bcui-button--ghost[disabled].active>a:only-child,.bcui-button--ghost[disabled]:active>a:only-child,.bcui-button--ghost[disabled]:focus>a:only-child,.bcui-button--ghost[disabled]:hover>a:only-child,.bcui-button--ghost[disabled]>a:only-child,fieldset[disabled] .bcui-button--ghost.active>a:only-child,fieldset[disabled] .bcui-button--ghost:active>a:only-child,fieldset[disabled] .bcui-button--ghost:focus>a:only-child,fieldset[disabled] .bcui-button--ghost:hover>a:only-child,fieldset[disabled] .bcui-button--ghost>a:only-child{color:currentColor}.bcui-button--ghost.disabled.active>a:only-child:after,.bcui-button--ghost.disabled:active>a:only-child:after,.bcui-button--ghost.disabled:focus>a:only-child:after,.bcui-button--ghost.disabled:hover>a:only-child:after,.bcui-button--ghost.disabled>a:only-child:after,.bcui-button--ghost[disabled].active>a:only-child:after,.bcui-button--ghost[disabled]:active>a:only-child:after,.bcui-button--ghost[disabled]:focus>a:only-child:after,.bcui-button--ghost[disabled]:hover>a:only-child:after,.bcui-button--ghost[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--ghost.active>a:only-child:after,fieldset[disabled] .bcui-button--ghost:active>a:only-child:after,fieldset[disabled] .bcui-button--ghost:focus>a:only-child:after,fieldset[disabled] .bcui-button--ghost:hover>a:only-child:after,fieldset[disabled] .bcui-button--ghost>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--ghost:hover{color:#5792f1;background-color:transparent;border-color:#e4e5e7}.bcui-button--ghost:hover>a:only-child{color:currentColor}.bcui-button--ghost:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--ghost.active,.bcui-button--ghost:active{color:#2b71e2;background-color:transparent;border-color:#d2d3d6}.bcui-button--ghost.active>a:only-child,.bcui-button--ghost:active>a:only-child{color:currentColor}.bcui-button--ghost.active>a:only-child:after,.bcui-button--ghost:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--dashed{color:#b3b3b3;background-color:transparent;border-color:#f5f5f5;border-style:dashed}.bcui-button--dashed>a:only-child{color:currentColor}.bcui-button--dashed>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--dashed:hover{color:#c2c2c2;background-color:hsla(0,0%,100%,.2);border-color:#f7f7f7}.bcui-button--dashed.active,.bcui-button--dashed:active{color:#aaa;background-color:rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.bcui-button--dashed.disabled,.bcui-button--dashed.disabled.active,.bcui-button--dashed.disabled:active,.bcui-button--dashed.disabled:focus,.bcui-button--dashed.disabled:hover,.bcui-button--dashed[disabled],.bcui-button--dashed[disabled].active,.bcui-button--dashed[disabled]:active,.bcui-button--dashed[disabled]:focus,.bcui-button--dashed[disabled]:hover,fieldset[disabled] .bcui-button--dashed,fieldset[disabled] .bcui-button--dashed.active,fieldset[disabled] .bcui-button--dashed:active,fieldset[disabled] .bcui-button--dashed:focus,fieldset[disabled] .bcui-button--dashed:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--dashed.disabled.active>a:only-child,.bcui-button--dashed.disabled:active>a:only-child,.bcui-button--dashed.disabled:focus>a:only-child,.bcui-button--dashed.disabled:hover>a:only-child,.bcui-button--dashed.disabled>a:only-child,.bcui-button--dashed[disabled].active>a:only-child,.bcui-button--dashed[disabled]:active>a:only-child,.bcui-button--dashed[disabled]:focus>a:only-child,.bcui-button--dashed[disabled]:hover>a:only-child,.bcui-button--dashed[disabled]>a:only-child,fieldset[disabled] .bcui-button--dashed.active>a:only-child,fieldset[disabled] .bcui-button--dashed:active>a:only-child,fieldset[disabled] .bcui-button--dashed:focus>a:only-child,fieldset[disabled] .bcui-button--dashed:hover>a:only-child,fieldset[disabled] .bcui-button--dashed>a:only-child{color:currentColor}.bcui-button--dashed.disabled.active>a:only-child:after,.bcui-button--dashed.disabled:active>a:only-child:after,.bcui-button--dashed.disabled:focus>a:only-child:after,.bcui-button--dashed.disabled:hover>a:only-child:after,.bcui-button--dashed.disabled>a:only-child:after,.bcui-button--dashed[disabled].active>a:only-child:after,.bcui-button--dashed[disabled]:active>a:only-child:after,.bcui-button--dashed[disabled]:focus>a:only-child:after,.bcui-button--dashed[disabled]:hover>a:only-child:after,.bcui-button--dashed[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--dashed.active>a:only-child:after,fieldset[disabled] .bcui-button--dashed:active>a:only-child:after,fieldset[disabled] .bcui-button--dashed:focus>a:only-child:after,fieldset[disabled] .bcui-button--dashed:hover>a:only-child:after,fieldset[disabled] .bcui-button--dashed>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--dashed:hover{color:#5792f1;background-color:transparent;border-color:#5792f1}.bcui-button--dashed:hover>a:only-child{color:currentColor}.bcui-button--dashed:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--dashed.active,.bcui-button--dashed:active{color:#2b71e2;background-color:transparent;border-color:#2b71e2}.bcui-button--dashed.active>a:only-child,.bcui-button--dashed:active>a:only-child{color:currentColor}.bcui-button--dashed.active>a:only-child:after,.bcui-button--dashed:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--text{color:#b3b3b3;background-color:transparent;border-color:transparent;padding-left:0;padding-right:0;color:#2d77ee}.bcui-button--text>a:only-child{color:currentColor}.bcui-button--text>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--text:hover{color:#c2c2c2;background-color:hsla(0,0%,100%,.2);border-color:hsla(0,0%,100%,.2)}.bcui-button--text.active,.bcui-button--text:active{color:#aaa;background-color:rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.bcui-button--text.disabled,.bcui-button--text.disabled.active,.bcui-button--text.disabled:active,.bcui-button--text.disabled:focus,.bcui-button--text.disabled:hover,.bcui-button--text[disabled],.bcui-button--text[disabled].active,.bcui-button--text[disabled]:active,.bcui-button--text[disabled]:focus,.bcui-button--text[disabled]:hover,fieldset[disabled] .bcui-button--text,fieldset[disabled] .bcui-button--text.active,fieldset[disabled] .bcui-button--text:active,fieldset[disabled] .bcui-button--text:focus,fieldset[disabled] .bcui-button--text:hover{background-color:#f7f7f7;border-color:#d7dde4;color:#c3cbd6;background-color:transparent;border-color:transparent}.bcui-button--text.disabled.active>a:only-child,.bcui-button--text.disabled:active>a:only-child,.bcui-button--text.disabled:focus>a:only-child,.bcui-button--text.disabled:hover>a:only-child,.bcui-button--text.disabled>a:only-child,.bcui-button--text[disabled].active>a:only-child,.bcui-button--text[disabled]:active>a:only-child,.bcui-button--text[disabled]:focus>a:only-child,.bcui-button--text[disabled]:hover>a:only-child,.bcui-button--text[disabled]>a:only-child,fieldset[disabled] .bcui-button--text.active>a:only-child,fieldset[disabled] .bcui-button--text:active>a:only-child,fieldset[disabled] .bcui-button--text:focus>a:only-child,fieldset[disabled] .bcui-button--text:hover>a:only-child,fieldset[disabled] .bcui-button--text>a:only-child{color:currentColor}.bcui-button--text.disabled.active>a:only-child:after,.bcui-button--text.disabled:active>a:only-child:after,.bcui-button--text.disabled:focus>a:only-child:after,.bcui-button--text.disabled:hover>a:only-child:after,.bcui-button--text.disabled>a:only-child:after,.bcui-button--text[disabled].active>a:only-child:after,.bcui-button--text[disabled]:active>a:only-child:after,.bcui-button--text[disabled]:focus>a:only-child:after,.bcui-button--text[disabled]:hover>a:only-child:after,.bcui-button--text[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--text.active>a:only-child:after,fieldset[disabled] .bcui-button--text:active>a:only-child:after,fieldset[disabled] .bcui-button--text:focus>a:only-child:after,fieldset[disabled] .bcui-button--text:hover>a:only-child:after,fieldset[disabled] .bcui-button--text>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--text:hover{color:#5792f1;background-color:transparent;border-color:transparent}.bcui-button--text:hover>a:only-child{color:currentColor}.bcui-button--text:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--text.active,.bcui-button--text:active{color:#2b71e2;background-color:transparent;border-color:transparent}.bcui-button--text.active>a:only-child,.bcui-button--text:active>a:only-child{color:currentColor}.bcui-button--text.active>a:only-child:after,.bcui-button--text:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--success{color:#fff;background-color:#09d274;border-color:#09d274}.bcui-button--success>a:only-child{color:currentColor}.bcui-button--success>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--success:hover{color:#fff;background-color:#3adb90;border-color:#3adb90}.bcui-button--success:hover>a:only-child{color:currentColor}.bcui-button--success:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--success.active,.bcui-button--success:active{color:#f2f2f2;background-color:#09c86e;border-color:#09c86e}.bcui-button--success.active>a:only-child,.bcui-button--success:active>a:only-child{color:currentColor}.bcui-button--success.active>a:only-child:after,.bcui-button--success:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--success.disabled,.bcui-button--success.disabled.active,.bcui-button--success.disabled:active,.bcui-button--success.disabled:focus,.bcui-button--success.disabled:hover,.bcui-button--success[disabled],.bcui-button--success[disabled].active,.bcui-button--success[disabled]:active,.bcui-button--success[disabled]:focus,.bcui-button--success[disabled]:hover,fieldset[disabled] .bcui-button--success,fieldset[disabled] .bcui-button--success.active,fieldset[disabled] .bcui-button--success:active,fieldset[disabled] .bcui-button--success:focus,fieldset[disabled] .bcui-button--success:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--success.disabled.active>a:only-child,.bcui-button--success.disabled:active>a:only-child,.bcui-button--success.disabled:focus>a:only-child,.bcui-button--success.disabled:hover>a:only-child,.bcui-button--success.disabled>a:only-child,.bcui-button--success[disabled].active>a:only-child,.bcui-button--success[disabled]:active>a:only-child,.bcui-button--success[disabled]:focus>a:only-child,.bcui-button--success[disabled]:hover>a:only-child,.bcui-button--success[disabled]>a:only-child,fieldset[disabled] .bcui-button--success.active>a:only-child,fieldset[disabled] .bcui-button--success:active>a:only-child,fieldset[disabled] .bcui-button--success:focus>a:only-child,fieldset[disabled] .bcui-button--success:hover>a:only-child,fieldset[disabled] .bcui-button--success>a:only-child{color:currentColor}.bcui-button--success.disabled.active>a:only-child:after,.bcui-button--success.disabled:active>a:only-child:after,.bcui-button--success.disabled:focus>a:only-child:after,.bcui-button--success.disabled:hover>a:only-child:after,.bcui-button--success.disabled>a:only-child:after,.bcui-button--success[disabled].active>a:only-child:after,.bcui-button--success[disabled]:active>a:only-child:after,.bcui-button--success[disabled]:focus>a:only-child:after,.bcui-button--success[disabled]:hover>a:only-child:after,.bcui-button--success[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--success.active>a:only-child:after,fieldset[disabled] .bcui-button--success:active>a:only-child:after,fieldset[disabled] .bcui-button--success:focus>a:only-child:after,fieldset[disabled] .bcui-button--success:hover>a:only-child:after,fieldset[disabled] .bcui-button--success>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--success.active,.bcui-button--success:active,.bcui-button--success:hover{color:#fff}.bcui-button--warning{color:#fff;background-color:#ffb437;border-color:#ffb437}.bcui-button--warning>a:only-child{color:currentColor}.bcui-button--warning>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--warning:hover{color:#fff;background-color:#ffc35f;border-color:#ffc35f}.bcui-button--warning:hover>a:only-child{color:currentColor}.bcui-button--warning:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--warning.active,.bcui-button--warning:active{color:#f2f2f2;background-color:#f2ab34;border-color:#f2ab34}.bcui-button--warning.active>a:only-child,.bcui-button--warning:active>a:only-child{color:currentColor}.bcui-button--warning.active>a:only-child:after,.bcui-button--warning:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--warning.disabled,.bcui-button--warning.disabled.active,.bcui-button--warning.disabled:active,.bcui-button--warning.disabled:focus,.bcui-button--warning.disabled:hover,.bcui-button--warning[disabled],.bcui-button--warning[disabled].active,.bcui-button--warning[disabled]:active,.bcui-button--warning[disabled]:focus,.bcui-button--warning[disabled]:hover,fieldset[disabled] .bcui-button--warning,fieldset[disabled] .bcui-button--warning.active,fieldset[disabled] .bcui-button--warning:active,fieldset[disabled] .bcui-button--warning:focus,fieldset[disabled] .bcui-button--warning:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--warning.disabled.active>a:only-child,.bcui-button--warning.disabled:active>a:only-child,.bcui-button--warning.disabled:focus>a:only-child,.bcui-button--warning.disabled:hover>a:only-child,.bcui-button--warning.disabled>a:only-child,.bcui-button--warning[disabled].active>a:only-child,.bcui-button--warning[disabled]:active>a:only-child,.bcui-button--warning[disabled]:focus>a:only-child,.bcui-button--warning[disabled]:hover>a:only-child,.bcui-button--warning[disabled]>a:only-child,fieldset[disabled] .bcui-button--warning.active>a:only-child,fieldset[disabled] .bcui-button--warning:active>a:only-child,fieldset[disabled] .bcui-button--warning:focus>a:only-child,fieldset[disabled] .bcui-button--warning:hover>a:only-child,fieldset[disabled] .bcui-button--warning>a:only-child{color:currentColor}.bcui-button--warning.disabled.active>a:only-child:after,.bcui-button--warning.disabled:active>a:only-child:after,.bcui-button--warning.disabled:focus>a:only-child:after,.bcui-button--warning.disabled:hover>a:only-child:after,.bcui-button--warning.disabled>a:only-child:after,.bcui-button--warning[disabled].active>a:only-child:after,.bcui-button--warning[disabled]:active>a:only-child:after,.bcui-button--warning[disabled]:focus>a:only-child:after,.bcui-button--warning[disabled]:hover>a:only-child:after,.bcui-button--warning[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--warning.active>a:only-child:after,fieldset[disabled] .bcui-button--warning:active>a:only-child:after,fieldset[disabled] .bcui-button--warning:focus>a:only-child:after,fieldset[disabled] .bcui-button--warning:hover>a:only-child:after,fieldset[disabled] .bcui-button--warning>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--warning.active,.bcui-button--warning:active,.bcui-button--warning:hover{color:#fff}.bcui-button--error{color:#fff;background-color:#fe4f27;border-color:#fe4f27}.bcui-button--error>a:only-child{color:currentColor}.bcui-button--error>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--error:hover{color:#fff;background-color:#fe7252;border-color:#fe7252}.bcui-button--error:hover>a:only-child{color:currentColor}.bcui-button--error:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--error.active,.bcui-button--error:active{color:#f2f2f2;background-color:#f14b25;border-color:#f14b25}.bcui-button--error.active>a:only-child,.bcui-button--error:active>a:only-child{color:currentColor}.bcui-button--error.active>a:only-child:after,.bcui-button--error:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--error.disabled,.bcui-button--error.disabled.active,.bcui-button--error.disabled:active,.bcui-button--error.disabled:focus,.bcui-button--error.disabled:hover,.bcui-button--error[disabled],.bcui-button--error[disabled].active,.bcui-button--error[disabled]:active,.bcui-button--error[disabled]:focus,.bcui-button--error[disabled]:hover,fieldset[disabled] .bcui-button--error,fieldset[disabled] .bcui-button--error.active,fieldset[disabled] .bcui-button--error:active,fieldset[disabled] .bcui-button--error:focus,fieldset[disabled] .bcui-button--error:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--error.disabled.active>a:only-child,.bcui-button--error.disabled:active>a:only-child,.bcui-button--error.disabled:focus>a:only-child,.bcui-button--error.disabled:hover>a:only-child,.bcui-button--error.disabled>a:only-child,.bcui-button--error[disabled].active>a:only-child,.bcui-button--error[disabled]:active>a:only-child,.bcui-button--error[disabled]:focus>a:only-child,.bcui-button--error[disabled]:hover>a:only-child,.bcui-button--error[disabled]>a:only-child,fieldset[disabled] .bcui-button--error.active>a:only-child,fieldset[disabled] .bcui-button--error:active>a:only-child,fieldset[disabled] .bcui-button--error:focus>a:only-child,fieldset[disabled] .bcui-button--error:hover>a:only-child,fieldset[disabled] .bcui-button--error>a:only-child{color:currentColor}.bcui-button--error.disabled.active>a:only-child:after,.bcui-button--error.disabled:active>a:only-child:after,.bcui-button--error.disabled:focus>a:only-child:after,.bcui-button--error.disabled:hover>a:only-child:after,.bcui-button--error.disabled>a:only-child:after,.bcui-button--error[disabled].active>a:only-child:after,.bcui-button--error[disabled]:active>a:only-child:after,.bcui-button--error[disabled]:focus>a:only-child:after,.bcui-button--error[disabled]:hover>a:only-child:after,.bcui-button--error[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--error.active>a:only-child:after,fieldset[disabled] .bcui-button--error:active>a:only-child:after,fieldset[disabled] .bcui-button--error:focus>a:only-child:after,fieldset[disabled] .bcui-button--error:hover>a:only-child:after,fieldset[disabled] .bcui-button--error>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--error.active,.bcui-button--error:active,.bcui-button--error:hover{color:#fff}.bcui-button--info{color:#fff;background-color:#2db7f5;border-color:#2db7f5}.bcui-button--info>a:only-child{color:currentColor}.bcui-button--info>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--info:hover{color:#fff;background-color:#57c5f7;border-color:#57c5f7}.bcui-button--info:hover>a:only-child{color:currentColor}.bcui-button--info:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--info.active,.bcui-button--info:active{color:#f2f2f2;background-color:#2baee9;border-color:#2baee9}.bcui-button--info.active>a:only-child,.bcui-button--info:active>a:only-child{color:currentColor}.bcui-button--info.active>a:only-child:after,.bcui-button--info:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--info.disabled,.bcui-button--info.disabled.active,.bcui-button--info.disabled:active,.bcui-button--info.disabled:focus,.bcui-button--info.disabled:hover,.bcui-button--info[disabled],.bcui-button--info[disabled].active,.bcui-button--info[disabled]:active,.bcui-button--info[disabled]:focus,.bcui-button--info[disabled]:hover,fieldset[disabled] .bcui-button--info,fieldset[disabled] .bcui-button--info.active,fieldset[disabled] .bcui-button--info:active,fieldset[disabled] .bcui-button--info:focus,fieldset[disabled] .bcui-button--info:hover{color:#c3cbd6;background-color:#f7f7f7;border-color:#d7dde4}.bcui-button--info.disabled.active>a:only-child,.bcui-button--info.disabled:active>a:only-child,.bcui-button--info.disabled:focus>a:only-child,.bcui-button--info.disabled:hover>a:only-child,.bcui-button--info.disabled>a:only-child,.bcui-button--info[disabled].active>a:only-child,.bcui-button--info[disabled]:active>a:only-child,.bcui-button--info[disabled]:focus>a:only-child,.bcui-button--info[disabled]:hover>a:only-child,.bcui-button--info[disabled]>a:only-child,fieldset[disabled] .bcui-button--info.active>a:only-child,fieldset[disabled] .bcui-button--info:active>a:only-child,fieldset[disabled] .bcui-button--info:focus>a:only-child,fieldset[disabled] .bcui-button--info:hover>a:only-child,fieldset[disabled] .bcui-button--info>a:only-child{color:currentColor}.bcui-button--info.disabled.active>a:only-child:after,.bcui-button--info.disabled:active>a:only-child:after,.bcui-button--info.disabled:focus>a:only-child:after,.bcui-button--info.disabled:hover>a:only-child:after,.bcui-button--info.disabled>a:only-child:after,.bcui-button--info[disabled].active>a:only-child:after,.bcui-button--info[disabled]:active>a:only-child:after,.bcui-button--info[disabled]:focus>a:only-child:after,.bcui-button--info[disabled]:hover>a:only-child:after,.bcui-button--info[disabled]>a:only-child:after,fieldset[disabled] .bcui-button--info.active>a:only-child:after,fieldset[disabled] .bcui-button--info:active>a:only-child:after,fieldset[disabled] .bcui-button--info:focus>a:only-child:after,fieldset[disabled] .bcui-button--info:hover>a:only-child:after,fieldset[disabled] .bcui-button--info>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.bcui-button--info.active,.bcui-button--info:active,.bcui-button--info:hover{color:#fff}.bcui-button--circle,.bcui-button--circle-outline{border-radius:36px}.bcui-button--circle-outline.bcui-button--large,.bcui-button--circle.bcui-button--large{border-radius:40px}.bcui-button--circle-outline.bcui-button-size,.bcui-button--circle.bcui-button-size{border-radius:24px}.bcui-button--circle-outline.bcui-button-icon-only,.bcui-button--circle.bcui-button-icon-only{width:36px;padding:0;font-size:16px;border-radius:50%;height:36px}.bcui-button--circle-outline.bcui-button-icon-only.bcui-button--larger,.bcui-button--circle.bcui-button-icon-only.bcui-button--larger{width:48px;padding:0;font-size:16px;border-radius:50;height:48px}.bcui-button--circle-outline.bcui-button-icon-only.bcui-button--large,.bcui-button--circle.bcui-button-icon-only.bcui-button--large{width:40px;padding:0;font-size:16px;border-radius:50;height:40px}.bcui-button--circle-outline.bcui-button-icon-only.bcui-button-small,.bcui-button--circle.bcui-button-icon-only.bcui-button-small{width:24px;padding:0;font-size:14px;border-radius:50%;height:24px}.bcui-button--circle-outline.bcui-button-icon-only.bcui-button-extra,.bcui-button--circle.bcui-button-icon-only.bcui-button-extra{width:20px;padding:0;font-size:14px;border-radius:50%;height:20px}.bcui-button:before{position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;background:#fff;opacity:.35;content:"";border-radius:inherit;z-index:1;transition:opacity .2s;pointer-events:none;display:none}.bcui-button.bcui-button--loading{pointer-events:none;position:relative}.bcui-button.bcui-button--loading:before{display:block}.bcui-button-group{position:relative;display:inline-block;vertical-align:middle}.bcui-button-group>.bcui-button{position:relative;float:left}.bcui-button-group>.bcui-button.active,.bcui-button-group>.bcui-button:active,.bcui-button-group>.bcui-button:hover{z-index:2}.bcui-button-group .bcui-button-icon-only .bcui-icon{font-size:14px;position:relative;top:1px}.bcui-button-group--large .bcui-button-icon-only .bcui-icon{font-size:16px;top:2px}.bcui-button-group--small .bcui-button-icon-only .bcui-icon{font-size:12px;top:0}.bcui-button-group-circle .bcui-button{border-radius:36px}.bcui-button-group--large.bcui-button-group--circle .bcui-button{border-radius:40px}.bcui-button-group--large>.bcui-button{padding:0 16px;font-size:14px;border-radius:4px;height:40px}.bcui-button-group--larger>.bcui-button{padding:6px 16px;font-size:14px;border-radius:4px;height:48px}.bcui-button-group--small.bcui-button-group--circle .bcui-button{border-radius:24px}.bcui-button-group--small>.bcui-button{padding:0 9px;font-size:12px;border-radius:3px;height:24px}.bcui-button-group--small>.bcui-button>.bcui-icon{font-size:14px}.bcui-button+.bcui-button-group,.bcui-button-group+.bcui-button,.bcui-button-group+.bcui-button-group,.bcui-button-group .bcui-button+.bcui-button{margin-left:-1px}.bcui-button-group .bcui-button:not(:first-child):not(:last-child){border-radius:0}.bcui-button-group:not(.bcui-button-group-vertical)>.bcui-button:first-child{margin-left:0}.bcui-button-group:not(.bcui-button-group-vertical)>.bcui-button:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.bcui-button-group:not(.bcui-button-group-vertical)>.bcui-button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bcui-button-group>.bcui-button-group{float:left}.bcui-button-group>.bcui-button-group:not(:first-child):not(:last-child)>.bcui-button{border-radius:0}.bcui-button-group:not(.bcui-button-group-vertical)>.bcui-button-group:first-child:not(:last-child)>.bcui-button:last-child{border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.bcui-button-group:not(.bcui-button-group-vertical)>.bcui-button-group:last-child:not(:first-child)>.bcui-button:first-child{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.bcui-button-group-vertical{display:inline-block;vertical-align:middle}.bcui-button-group-vertical>.bcui-button{display:block;width:100%;max-width:100%;float:none}.bcui-button+.bcui-button-group-vertical,.bcui-button-group-vertical+.bcui-button,.bcui-button-group-vertical+.bcui-button-group-vertical,.bcui-button-group-vertical .bcui-button+.bcui-button{margin-top:-1px;margin-left:0}.bcui-button-group-vertical>.bcui-button:first-child{margin-top:0}.bcui-button-group-vertical>.bcui-button:first-child:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.bcui-button-group-vertical>.bcui-button:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.bcui-button-group-vertical>.bcui-button-group-vertical:first-child:not(:last-child)>.bcui-button:last-child{border-bottom-left-radius:0;border-bottom-right-radius:0;padding-bottom:8px}.bcui-button-group-vertical>.bcui-button-group-vertical:last-child:not(:first-child)>.bcui-button:first-child{border-bottom-right-radius:0;border-bottom-left-radius:0;padding-top:8px}.bcui-load-loop{animation:ani-load-loop 1s linear infinite}@keyframes ani-load-loop{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(1turn)}}.bcui-card{width:100%;background:#fff;border-radius:4px;font-size:12px;transition:all .3s;position:relative}.bcui-card--hoverable:hover{cursor:pointer;box-shadow:0 1px 6px rgba(0,0,0,.2);border-color:transparent}.bcui-card--bordered{border:1px solid #e9e9e9}.bcui-card__head{height:48px;line-height:48px;background:#fff;border-bottom:1px solid #e9e9e9;padding:0 16px}.bcui-card__head-title{font-size:14px;display:inline-block;text-overflow:ellipsis;width:100%;overflow:hidden;white-space:nowrap;color:rgba(0,0,0,.85);font-weight:500}.bcui-card__extra{position:absolute;right:24px;top:14px}.bcui-card__body{padding:16px}.bcui-checkbox{font-size:12px;margin-right:16px}.bcui-checkbox,.bcui-checkbox__input{display:inline-block;white-space:nowrap;cursor:pointer}.bcui-checkbox__input{outline:none;line-height:1;position:relative;vertical-align:middle}.bcui-checkbox__input.bcui-checkbox__input--checked .bcui-checkbox__inner{background:#2d77ee;border-color:#2d77ee}.bcui-checkbox__input.bcui-checkbox__input--checked .bcui-checkbox__inner:after{content:"";display:table;width:4px;height:8px;position:absolute;top:1px;left:4px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1);transition:all .2s ease-in-out}.bcui-checkbox__input.bcui-checkbox__input--checked.bcui-checkbox__input.bcui-checkbox__input--disabled .bcui-checkbox__inner:after{animation-name:none;border-color:#ccc}.bcui-checkbox__input.bcui-checkbox__input--disabled{cursor:not-allowed}.bcui-checkbox__input.bcui-checkbox__input--disabled .bcui-checkbox__inner{border-color:#dddee1;background-color:#f3f3f3}.bcui-checkbox__input.bcui-checkbox__input--disabled .bcui-checkbox__inner:after{animation-name:none;border-color:#f3f3f3}.bcui-checkbox__input.bcui-checkbox__input--disabled .bcui-checkbox__label{color:#ccc;cursor:not-allowed}.bcui-checkbox__inner{display:inline-block;width:16px;height:16px;border:1px solid #c3c3c3;border-radius:2px;background-color:#fff;position:relative;cursor:pointer;white-space:nowrap;outline:none}.bcui-checkbox__original-input{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;opacity:0;cursor:pointer}.bcui-checkbox__original-input[disabled]{cursor:not-allowed}.bcui-checkbox__label{font-size:12px;line-height:1;display:inline-block;vertical-align:middle}.bcui-base-dropdown{width:inherit;max-height:200px;overflow:auto;margin:5px 0;padding:5px 0;background-color:#fff;box-sizing:border-box;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);position:absolute;z-index:900}.bcui-dropdown{display:inline-block;position:relative}.bcui-dropdown-menu{margin:0;padding:0;list-style-type:none}.bcui-dropdown-item{line-height:normal;padding:7px 16px;margin:0;clear:both;color:#495060;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;transition:background .2s ease-in-out}.bcui-dropdown-item:hover{background:#f3f3f3}.bcui-dropdown-item--disabled{color:#bbbec4;cursor:not-allowed}.bcui-dropdown-item--divided{margin-top:5px;border-top:1px solid #e9eaec}[class*=" bcui-icon"],[class^=bcui-icon]{speak:none;font-family:iconfont;font-style:normal;font-weight:400;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;font-variant:normal normal}.extend-input{width:100%;line-height:1.5;padding:4px 12px;font-size:14px;border:1px solid #d7dde4;border-radius:4px;color:#333;background-color:#fff;background-image:none;position:relative;cursor:text;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out}.extend-input:hover{border-color:#5792f1}.extend-input:focus{border-color:#2d77ee;outline:0}.extend-input--disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.extend-input--disabled:hover{border-color:#dfe4e9}.bcui-inputfield{position:relative;display:inline-block;vertical-align:middle;width:100%;line-height:1}.bcui-inputfield--extra{display:inline-table}.bcui-inputfield__append,.bcui-inputfield__prepend{display:table-cell;padding:4px 6px;color:#657180;text-align:center;background-color:#eee;border:1px solid #d7dde4;border-radius:4px}.bcui-inputfield__append .bcui-select,.bcui-inputfield__prepend .bcui-select{margin:-4px -6px}.bcui-inputfield__append .bcui-select__inner,.bcui-inputfield__prepend .bcui-select__inner{height:30px;border-color:#eee;background:#eee}.bcui-inputfield__append .bcui-select__inner:hover,.bcui-inputfield__prepend .bcui-select__inner:hover{border-color:#eee}.bcui-inputfield__select{display:table-cell;height:34px;vertical-align:middle;width:1px}.bcui-inputfield__select .bcui-select__inner{border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.bcui-inputfield__prepend{border-bottom-right-radius:0;border-top-right-radius:0;border-right:0}.bcui-inputfield__append{border-bottom-left-radius:0;border-top-left-radius:0;border-left:0}.bcui-inputfield__icon{position:absolute;right:0;top:0;font-size:14px;z-index:1;width:32px;height:36px;text-align:center;line-height:37px!important}.bcui-inputfield--extra .bcui-inputfield__input:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.bcui-inputfield--extra .bcui-inputfield__input:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.bcui-inputfield__input{width:100%;line-height:1.5;padding:4px 12px;font-size:14px;border:1px solid #d7dde4;border-radius:4px;color:#333;background-color:#fff;background-image:none;position:relative;cursor:text;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;height:36px}.bcui-inputfield__input:hover{border-color:#5792f1}.bcui-inputfield__input:focus{border-color:#2d77ee;outline:0}.bcui-inputfield__input--disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.bcui-inputfield__input--disabled:hover{border-color:#dfe4e9}.bcui-inputfield__input--small{padding:7px 1px;height:24px;border-radius:3px}.bcui-inputfield__input--large{font-size:14px;padding:7px 16px;height:40px}.bcui-inputfield__input--larger{font-size:14px;padding:7px 18px;height:48px}.bcui-inputfield__input--iconed{padding-right:32px}.bcui-inputfield__textarea{display:block;width:100%;line-height:1.5;padding:4px 12px;font-size:14px;border:1px solid #d7dde4;border-radius:4px;color:#333;background-color:#fff;background-image:none;position:relative;cursor:text;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out}.bcui-inputfield__textarea:hover{border-color:#5792f1}.bcui-inputfield__textarea:focus{border-color:#2d77ee;outline:0}.bcui-inputfield__textarea--disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.bcui-inputfield__textarea--disabled:hover{border-color:#dfe4e9}.bcui-inputfield__input::placeholder,.bcui-inputfield__textarea::placeholder{color:#bbbec4}.bcui-loading-box{display:initial;opacity:1;position:absolute;left:0;right:0;top:0;bottom:0;transition:opacity .3s}.bcui-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.bcui-loading-spinner .bcui-loading-text{color:rgba(45,119,238,.8);margin:3px 0;font-size:14px}.bcui-loading-spinner .circular{width:42px;height:42px;size:40px;animation:loading-rotate 2s linear infinite}.bcui-loading-spinner .path{animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:rgba(45,119,238,.8);stroke-linecap:round}.bcui-loading-fade-enter,.bcui-loading-fade-leave-active{opacity:0}@keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.bcui-select{display:inline-block;width:100%;vertical-align:middle;color:#657180;font-size:14px;line-height:normal}.bcui-select,.bcui-select__inner{box-sizing:border-box;position:relative}.bcui-select__inner{display:block;outline:0;user-select:none;cursor:pointer;background-color:#fff;border-radius:4px;border:1px solid #d7dde4;transition:all .2s ease-in-out}.bcui-select__inner:hover{border-color:#2d77ee}.bcui-select__inner:hover .bcui-select__arrow:first-of-type{display:inline-block}.bcui-select__inner .bcui-select__arrow:first-of-type{display:none;cursor:pointer}.bcui-select--show-clear .bcui-select__inner:hover .bcui-select__arrow:nth-of-type(2){display:none}.bcui-select__arrow{position:absolute;top:50%;right:8px;line-height:1;margin-top:-4px;font-size:8px;color:#9ea7b4;transition:all .2s ease-in-out}.bcui-select--visible .bcui-select__inner{border-color:#2d77ee;outline:0}.bcui-select--disabled .bcui-select__inner{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.bcui-select--disabled .bcui-select__input{cursor:not-allowed;color:#ccc}.bcui-select--disabled .bcui-select__inner:hover{border-color:#dfe4e9}.bcui-select--disabled .bcui-select__inner .bcui-select__arrow:first-of-type{display:none}.bcui-select--disabled .bcui-select__inner:hover{border-color:#d7dde4;box-shadow:none}.bcui-select--disabled .bcui-select__inner:hover .bcui-select__arrow:nth-of-type(2){display:inline-block}.bcui-select--single .bcui-select__inner{height:36px;position:relative}.bcui-select--single .bcui-select__placeholder{color:#c3cbd6}.bcui-select--single .bcui-select__placeholder,.bcui-select--single .bcui-select__selected-value{display:block;height:36px;line-height:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:8px;padding-right:24px}.bcui-select--large.bcui-select--single .bcui-select__inner{height:36px}.bcui-select--large.bcui-select--single .bcui-select__inner .bcui-select__placeholder,.bcui-select--large.bcui-select--single .bcui-select__inner .bcui-select__selected-value{height:36px;line-height:36px;font-size:14px;padding:8px 26px 8px 14px}.bcui-select--small.bcui-select--single .bcui-select__inner{height:24px;border-radius:3px}.bcui-select--small.bcui-select--single .bcui-select__inner .bcui-select__placeholder,.bcui-select--small.bcui-select--single .bcui-select__inner .bcui-select__selected-value{height:22px;line-height:22px}.bcui-select--multiple .bcui-select__inner{padding:0 24px 0 4px;min-height:36px}.bcui-select--multiple .bcui-select__placeholder{display:block;height:36px;line-height:36px;color:#c3cbd6;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:4px;padding-right:22px}.bcui-select__input{display:inline-block;height:36px;line-height:36px;padding:0 24px 0 8px;font-size:14px;outline:0;border:none;box-sizing:border-box;color:#657180;background-color:transparent;position:relative;cursor:pointer}.bcui-select__input::-moz-placeholder{color:#c3cbd6;opacity:1}.bcui-select__input:-ms-input-placeholder{color:#c3cbd6}.bcui-select__input::-webkit-input-placeholder{color:#c3cbd6}.bcui-select--single .bcui-select__input{width:100%;height:36px}.bcui-select--large .bcui-select__input{font-size:14px;height:36px}.bcui-select--small .bcui-select__input{height:24px}.bcui-select--multiple .bcui-select__input{height:29px;line-height:36px;padding:0 0 0 4px;margin-left:0!important}.bcui-select__empty,.bcui-select__loading{padding:8px;text-align:center;color:#c3cbd6}.bcui-select--multiple .bcui-tag{margin:3px 0 2px 4px}.bcui-select-item{margin:0;padding:7px 16px;clear:both;color:#657180;font-size:14px!important;white-space:nowrap;list-style:none;cursor:pointer;transition:background .2s ease-in-out}.bcui-select-item--focus,.bcui-select-item:hover{background:#f3f3f3}.bcui-select-item--disabled,.bcui-select-item--disabled:hover{color:#c3cbd6;cursor:not-allowed}.bcui-select-item--disabled:hover{background-color:#fff}.bcui-select-item--selected,.bcui-select-item--selected:hover{color:#fff;background:#2d77ee}.bcui-select-item--selected.bcui-select-item--focus{background:rgba(45,119,238,.9)}.bcui-select-item-divided{margin-top:5px;border-top:1px solid #e3e8ee}.bcui-select-item-divided:before{content:"";height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.bcui-select--large .bcui-select-item{padding:7px 16px 8px;font-size:14px!important}.bcui-select--multiple .bcui-select-item--selected{color:#2d77ee;background:#f3f3f3}.bcui-select--multiple .bcui-select-item--focus,.bcui-select--multiple .bcui-select-item--selected:hover{background:#f3f3f3}.bcui-select--multiple .bcui-select-item--selected.bcui-select--multiple .bcui-select-item--focus{color:rgba(45,119,238,.9);background:#fff}.bcui-select--multiple .bcui-select-item--selected:after{display:inline-block;font-family:bcfont;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;float:right;font-size:14px;content:"\E690";color:#2d77ee}.bcui-select-group{list-style:none;margin:0;padding:0}.bcui-select-group-title{padding-left:8px;font-size:14px;color:#999;height:30px;line-height:30px}.bcui-select__dropdown{width:inherit;max-height:200px;overflow:auto;margin:5px 0;padding:5px 0;background-color:#fff;box-sizing:border-box;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);position:absolute;z-index:900}.bcui-select__dropdown-list{padding:0;margin:0}.bcui-select--visible .bcui-select__arrow:nth-of-type(2){transform:rotate(180deg);margin-top:-5px}.bcui-select--multiple .bcui-select__placeholder,.bcui-select--single .bcui-select__placeholder{font-size:14px;height:34px;line-height:34px}.bcui-select--single .bcui-select__placeholder,.bcui-select--single .bcui-select__selected-value{font-size:14px;padding:8px 26px 8px 12px;line-height:normal}.bcui-select--multiple .bcui-select__input{height:34px}.bcui-select--multiple .bcui-select-item--selected:after{font-family:iconfont;content:"\E6ED"}.bcui-steps{font-size:0}.bcui-steps-item:last-child .bcui-steps-tail{display:none}.bcui-steps-item{display:inline-block;position:relative}.bcui-steps-title{font-size:14px;line-height:26px;color:rgba(0,0,0,.65);font-weight:700;background-color:#fff;display:inline-block;padding-right:10px}.bcui-steps-description{font-size:12px;color:rgba(0,0,0,.43)}.bcui-steps-body,.bcui-steps-head{position:relative;display:inline-block;vertical-align:top;font-size:14px}.bcui-steps-head{background:#fff}.bcui-steps-head__inner{display:block;border:1px solid rgba(0,0,0,.25);width:26px;height:26px;color:rgba(0,0,0,.25);line-height:23px;text-align:center;border-radius:26px;font-size:14px;margin-right:8px;transition:background-color .3s ease,border-color .3s ease}.bcui-steps-tail{position:absolute;left:0;width:100%;top:13px;padding:0 10px}.bcui-steps-tail__line{display:inline-block;vertical-align:top;background:#e9e9e9;height:1px;border-radius:4px;width:100%;position:relative}.bcui-steps-tail__line:after{position:absolute;content:"";top:0;width:0;background:#e9e9e9;height:100%;opacity:0}.bcui-steps-status--process .bcui-steps-head__inner{border-color:#2d77ee;background-color:#2d77ee}.bcui-steps-status--process .bcui-steps-icon{color:#fff}.bcui-steps-status--finish .bcui-steps-head__inner{border-color:#2d77ee;background-color:#fff}.bcui-steps-status--finish .bcui-steps-tail__line:after{width:100%;background:#2d77ee;-webkit-transition:all .6s;transition:all .6s;opacity:1;box-shadow:0 0 0 0 #2d77ee;animation:tailEffect .4s}.bcui-steps-status--finish .bcui-steps-icon{color:#2d77ee}.bcui-steps-status--finish .bcui-steps-title{color:rgba(0,0,0,.43)}.bcui-steps-status--next-error .bcui-steps-tail__line,.bcui-steps-status--next-error .bcui-steps-tail__line:after{background-color:#f04134}.bcui-steps-status--error .bcui-steps-head__inner{border-color:#f04134;background-color:#fff;color:#f04134}.bcui-steps-status--error .bcui-steps-description,.bcui-steps-status--error .bcui-steps-title{color:#f04134}.bcui-switch{display:inline-block;width:48px;height:24px;line-height:22px;border-radius:24px;vertical-align:middle;border:1px solid #ccc;background-color:#ccc;position:relative;cursor:pointer;user-select:none;transition:all .2s ease-in-out}.bcui-switch__inner{color:#fff;font-size:12px;position:absolute;left:25px}.bcui-switch__inner i{width:12px;height:12px;text-align:center}.bcui-switch:after{content:"";width:20px;height:20px;border-radius:20px;background-color:#fff;position:absolute;left:1px;top:1px;cursor:pointer;transition:left .2s ease-in-out,width .2s ease-in-out}.bcui-switch:active:after{width:26px}.bcui-switch:focus{box-shadow:0 0 0 2px rgba(45,119,238,.2);outline:0}.bcui-switch:focus:hover{box-shadow:none}.bcui-switch--small{width:24px;height:12px;line-height:10px}.bcui-switch--small:after{width:10px;height:10px;top:0;left:0}.bcui-switch--small:active:after{width:14px}.bcui-switch--small.bcui-switch--checked:after{left:12px}.bcui-switch--small:active.bcui-switch--checked:after{left:8px}.bcui-switch--large{width:60px}.bcui-switch--large:active:after{width:26px;width:32px}.bcui-switch--large.bcui-switch--checked:after{left:37px}.bcui-switch--large:active.bcui-switch--checked:after{left:25px}.bcui-switch--checked{border-color:#2d77ee;background-color:#2d77ee}.bcui-switch--checked .bcui-switch__inner{left:8px}.bcui-switch--checked:after{left:25px}.bcui-switch--checked:active:after{left:19px}.bcui-switch--disabled{cursor:not-allowed;background:#f3f3f3;border-color:#f3f3f3}.bcui-switch--disabled:after{background:#ccc;cursor:not-allowed}.bcui-switch--disabled .bcui-switch__inner{color:#ccc}.bcui-form--inline .bcui-form-item{display:inline-block;vertical-align:top}.bcui-form-item{margin-bottom:18px}.bcui-form-item:after{content:"";display:block;visibility:visible;width:0;height:0;font-size:0;clear:both}.bcui-form-item--required .bcui-form-item__label:before{content:"*";display:inline-block;margin-right:4px;line-height:1;font-family:SimSun;font-size:12px;color:#f30}.bcui-form-item--error .bcui-inputfield__input,.bcui-form-item--error .bcui-inputfield__textarea,.bcui-form-item--error .bcui-select__inner{border:1px solid #f30}.bcui-form-item--error .bcui-inputfield__input:focus,.bcui-form-item--error .bcui-inputfield__textarea:focus,.bcui-form-item--error .bcui-select__inner:focus{border-color:#f30;outline:0}.bcui-form-item--error .bcui-select__arrow{color:#f30}.bcui-form-item__error-tip{position:absolute;top:100%;left:0;line-height:1;padding-top:4px;font-size:12px;color:#f30}.bcui-form-item__label{vertical-align:middle;float:left;font-size:12px;color:#657180;padding:10px 12px 10px 0;height:34px;line-height:1.3}.bcui-form-item__label--right{text-align:right}.bcui-form-item__label--top{float:none}.bcui-form-item__tooltip i{color:#333;font-size:14px;vertical-align:-1px;height:14px;margin-top:-2px}.bcui-form-label--top .bcui-form-item__label{float:none}.bcui-form-item__content{min-height:34px;line-height:34px;position:relative}.bcui-form-item__content:after{content:"";display:block;visibility:visible;width:0;height:0;font-size:0;clear:both}.bcui-form-item-error .bcui-select__inner{border:1px solid #f30}.bcui-form-item-error .bcui-select__arrow{color:#f30}.bcui-form-item-error .bcui-select--visible .bcui-select__inner{border-color:#f30;outline:0}.bcui-form{width:500px}.bcui-row{position:relative;margin-left:0;margin-right:0;height:auto;zoom:1;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.bcui-row:after,.bcui-row:before{content:" ";display:table}.bcui-row:after{clear:both;visibility:hidden;font-size:0;height:0}.bcui-row-flex{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.bcui-row-flex,.bcui-row-flex:after,.bcui-row-flex:before{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.bcui-row-flex-start{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.bcui-row-flex-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.bcui-row-flex-end{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.bcui-row-flex-space-between{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.bcui-row-flex-space-around{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.bcui-row-flex-top{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.bcui-row-flex-middle{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.bcui-row-flex-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}.bcui-col{position:relative;display:block}.bcui-col-1,.bcui-col-2,.bcui-col-3,.bcui-col-4,.bcui-col-5,.bcui-col-6,.bcui-col-7,.bcui-col-8,.bcui-col-9,.bcui-col-10,.bcui-col-11,.bcui-col-12,.bcui-col-13,.bcui-col-14,.bcui-col-15,.bcui-col-16,.bcui-col-17,.bcui-col-18,.bcui-col-19,.bcui-col-20,.bcui-col-21,.bcui-col-22,.bcui-col-23,.bcui-col-24,.bcui-col-lg-1,.bcui-col-lg-2,.bcui-col-lg-3,.bcui-col-lg-4,.bcui-col-lg-5,.bcui-col-lg-6,.bcui-col-lg-7,.bcui-col-lg-8,.bcui-col-lg-9,.bcui-col-lg-10,.bcui-col-lg-11,.bcui-col-lg-12,.bcui-col-lg-13,.bcui-col-lg-14,.bcui-col-lg-15,.bcui-col-lg-16,.bcui-col-lg-17,.bcui-col-lg-18,.bcui-col-lg-19,.bcui-col-lg-20,.bcui-col-lg-21,.bcui-col-lg-22,.bcui-col-lg-23,.bcui-col-lg-24,.bcui-col-md-1,.bcui-col-md-2,.bcui-col-md-3,.bcui-col-md-4,.bcui-col-md-5,.bcui-col-md-6,.bcui-col-md-7,.bcui-col-md-8,.bcui-col-md-9,.bcui-col-md-10,.bcui-col-md-11,.bcui-col-md-12,.bcui-col-md-13,.bcui-col-md-14,.bcui-col-md-15,.bcui-col-md-16,.bcui-col-md-17,.bcui-col-md-18,.bcui-col-md-19,.bcui-col-md-20,.bcui-col-md-21,.bcui-col-md-22,.bcui-col-md-23,.bcui-col-md-24,.bcui-col-sm-1,.bcui-col-sm-2,.bcui-col-sm-3,.bcui-col-sm-4,.bcui-col-sm-5,.bcui-col-sm-6,.bcui-col-sm-7,.bcui-col-sm-8,.bcui-col-sm-9,.bcui-col-sm-10,.bcui-col-sm-11,.bcui-col-sm-12,.bcui-col-sm-13,.bcui-col-sm-14,.bcui-col-sm-15,.bcui-col-sm-16,.bcui-col-sm-17,.bcui-col-sm-18,.bcui-col-sm-19,.bcui-col-sm-20,.bcui-col-sm-21,.bcui-col-sm-22,.bcui-col-sm-23,.bcui-col-sm-24,.bcui-col-xs-1,.bcui-col-xs-2,.bcui-col-xs-3,.bcui-col-xs-4,.bcui-col-xs-5,.bcui-col-xs-6,.bcui-col-xs-7,.bcui-col-xs-8,.bcui-col-xs-9,.bcui-col-xs-10,.bcui-col-xs-11,.bcui-col-xs-12,.bcui-col-xs-13,.bcui-col-xs-14,.bcui-col-xs-15,.bcui-col-xs-16,.bcui-col-xs-17,.bcui-col-xs-18,.bcui-col-xs-19,.bcui-col-xs-20,.bcui-col-xs-21,.bcui-col-xs-22,.bcui-col-xs-23,.bcui-col-xs-24{position:relative;min-height:1px;padding-left:0;padding-right:0}.bcui-col-1,.bcui-col-2,.bcui-col-3,.bcui-col-4,.bcui-col-5,.bcui-col-6,.bcui-col-7,.bcui-col-8,.bcui-col-9,.bcui-col-10,.bcui-col-11,.bcui-col-12,.bcui-col-13,.bcui-col-14,.bcui-col-15,.bcui-col-16,.bcui-col-17,.bcui-col-18,.bcui-col-19,.bcui-col-20,.bcui-col-21,.bcui-col-22,.bcui-col-23,.bcui-col-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-push-24{left:100%}.bcui-col-pull-24{right:100%}.bcui-col-offset-24{margin-left:100%}.bcui-col-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-push-23{left:95.83333333%}.bcui-col-pull-23{right:95.83333333%}.bcui-col-offset-23{margin-left:95.83333333%}.bcui-col-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-push-22{left:91.66666667%}.bcui-col-pull-22{right:91.66666667%}.bcui-col-offset-22{margin-left:91.66666667%}.bcui-col-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-push-21{left:87.5%}.bcui-col-pull-21{right:87.5%}.bcui-col-offset-21{margin-left:87.5%}.bcui-col-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-push-20{left:83.33333333%}.bcui-col-pull-20{right:83.33333333%}.bcui-col-offset-20{margin-left:83.33333333%}.bcui-col-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-push-19{left:79.16666667%}.bcui-col-pull-19{right:79.16666667%}.bcui-col-offset-19{margin-left:79.16666667%}.bcui-col-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-push-18{left:75%}.bcui-col-pull-18{right:75%}.bcui-col-offset-18{margin-left:75%}.bcui-col-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-push-17{left:70.83333333%}.bcui-col-pull-17{right:70.83333333%}.bcui-col-offset-17{margin-left:70.83333333%}.bcui-col-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-push-16{left:66.66666667%}.bcui-col-pull-16{right:66.66666667%}.bcui-col-offset-16{margin-left:66.66666667%}.bcui-col-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-push-15{left:62.5%}.bcui-col-pull-15{right:62.5%}.bcui-col-offset-15{margin-left:62.5%}.bcui-col-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-push-14{left:58.33333333%}.bcui-col-pull-14{right:58.33333333%}.bcui-col-offset-14{margin-left:58.33333333%}.bcui-col-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-push-13{left:54.16666667%}.bcui-col-pull-13{right:54.16666667%}.bcui-col-offset-13{margin-left:54.16666667%}.bcui-col-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-push-12{left:50%}.bcui-col-pull-12{right:50%}.bcui-col-offset-12{margin-left:50%}.bcui-col-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-push-11{left:45.83333333%}.bcui-col-pull-11{right:45.83333333%}.bcui-col-offset-11{margin-left:45.83333333%}.bcui-col-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-push-10{left:41.66666667%}.bcui-col-pull-10{right:41.66666667%}.bcui-col-offset-10{margin-left:41.66666667%}.bcui-col-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-push-9{left:37.5%}.bcui-col-pull-9{right:37.5%}.bcui-col-offset-9{margin-left:37.5%}.bcui-col-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-push-8{left:33.33333333%}.bcui-col-pull-8{right:33.33333333%}.bcui-col-offset-8{margin-left:33.33333333%}.bcui-col-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-push-7{left:29.16666667%}.bcui-col-pull-7{right:29.16666667%}.bcui-col-offset-7{margin-left:29.16666667%}.bcui-col-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-push-6{left:25%}.bcui-col-pull-6{right:25%}.bcui-col-offset-6{margin-left:25%}.bcui-col-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-push-5{left:20.83333333%}.bcui-col-pull-5{right:20.83333333%}.bcui-col-offset-5{margin-left:20.83333333%}.bcui-col-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-push-4{left:16.66666667%}.bcui-col-pull-4{right:16.66666667%}.bcui-col-offset-4{margin-left:16.66666667%}.bcui-col-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-push-3{left:12.5%}.bcui-col-pull-3{right:12.5%}.bcui-col-offset-3{margin-left:12.5%}.bcui-col-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-push-2{left:8.33333333%}.bcui-col-pull-2{right:8.33333333%}.bcui-col-offset-2{margin-left:8.33333333%}.bcui-col-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-push-1{left:4.16666667%}.bcui-col-pull-1{right:4.16666667%}.bcui-col-offset-1{margin-left:4.16666667%}.bcui-col-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-0{display:none}.bcui-col-offset-0{margin-left:0}.bcui-col-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.bcui-col-xs-1,.bcui-col-xs-2,.bcui-col-xs-3,.bcui-col-xs-4,.bcui-col-xs-5,.bcui-col-xs-6,.bcui-col-xs-7,.bcui-col-xs-8,.bcui-col-xs-9,.bcui-col-xs-10,.bcui-col-xs-11,.bcui-col-xs-12,.bcui-col-xs-13,.bcui-col-xs-14,.bcui-col-xs-15,.bcui-col-xs-16,.bcui-col-xs-17,.bcui-col-xs-18,.bcui-col-xs-19,.bcui-col-xs-20,.bcui-col-xs-21,.bcui-col-xs-22,.bcui-col-xs-23,.bcui-col-xs-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-xs-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-xs-push-24{left:100%}.bcui-col-xs-pull-24{right:100%}.bcui-col-xs-offset-24{margin-left:100%}.bcui-col-xs-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-xs-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-xs-push-23{left:95.83333333%}.bcui-col-xs-pull-23{right:95.83333333%}.bcui-col-xs-offset-23{margin-left:95.83333333%}.bcui-col-xs-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-xs-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-xs-push-22{left:91.66666667%}.bcui-col-xs-pull-22{right:91.66666667%}.bcui-col-xs-offset-22{margin-left:91.66666667%}.bcui-col-xs-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-xs-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-xs-push-21{left:87.5%}.bcui-col-xs-pull-21{right:87.5%}.bcui-col-xs-offset-21{margin-left:87.5%}.bcui-col-xs-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-xs-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-xs-push-20{left:83.33333333%}.bcui-col-xs-pull-20{right:83.33333333%}.bcui-col-xs-offset-20{margin-left:83.33333333%}.bcui-col-xs-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-xs-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-xs-push-19{left:79.16666667%}.bcui-col-xs-pull-19{right:79.16666667%}.bcui-col-xs-offset-19{margin-left:79.16666667%}.bcui-col-xs-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-xs-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-xs-push-18{left:75%}.bcui-col-xs-pull-18{right:75%}.bcui-col-xs-offset-18{margin-left:75%}.bcui-col-xs-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-xs-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-xs-push-17{left:70.83333333%}.bcui-col-xs-pull-17{right:70.83333333%}.bcui-col-xs-offset-17{margin-left:70.83333333%}.bcui-col-xs-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-xs-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-xs-push-16{left:66.66666667%}.bcui-col-xs-pull-16{right:66.66666667%}.bcui-col-xs-offset-16{margin-left:66.66666667%}.bcui-col-xs-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-xs-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-xs-push-15{left:62.5%}.bcui-col-xs-pull-15{right:62.5%}.bcui-col-xs-offset-15{margin-left:62.5%}.bcui-col-xs-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-xs-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-xs-push-14{left:58.33333333%}.bcui-col-xs-pull-14{right:58.33333333%}.bcui-col-xs-offset-14{margin-left:58.33333333%}.bcui-col-xs-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-xs-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-xs-push-13{left:54.16666667%}.bcui-col-xs-pull-13{right:54.16666667%}.bcui-col-xs-offset-13{margin-left:54.16666667%}.bcui-col-xs-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-xs-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-xs-push-12{left:50%}.bcui-col-xs-pull-12{right:50%}.bcui-col-xs-offset-12{margin-left:50%}.bcui-col-xs-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-xs-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-xs-push-11{left:45.83333333%}.bcui-col-xs-pull-11{right:45.83333333%}.bcui-col-xs-offset-11{margin-left:45.83333333%}.bcui-col-xs-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-xs-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-xs-push-10{left:41.66666667%}.bcui-col-xs-pull-10{right:41.66666667%}.bcui-col-xs-offset-10{margin-left:41.66666667%}.bcui-col-xs-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-xs-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-xs-push-9{left:37.5%}.bcui-col-xs-pull-9{right:37.5%}.bcui-col-xs-offset-9{margin-left:37.5%}.bcui-col-xs-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-xs-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-xs-push-8{left:33.33333333%}.bcui-col-xs-pull-8{right:33.33333333%}.bcui-col-xs-offset-8{margin-left:33.33333333%}.bcui-col-xs-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-xs-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-xs-push-7{left:29.16666667%}.bcui-col-xs-pull-7{right:29.16666667%}.bcui-col-xs-offset-7{margin-left:29.16666667%}.bcui-col-xs-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-xs-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-xs-push-6{left:25%}.bcui-col-xs-pull-6{right:25%}.bcui-col-xs-offset-6{margin-left:25%}.bcui-col-xs-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-xs-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-xs-push-5{left:20.83333333%}.bcui-col-xs-pull-5{right:20.83333333%}.bcui-col-xs-offset-5{margin-left:20.83333333%}.bcui-col-xs-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-xs-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-xs-push-4{left:16.66666667%}.bcui-col-xs-pull-4{right:16.66666667%}.bcui-col-xs-offset-4{margin-left:16.66666667%}.bcui-col-xs-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-xs-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-xs-push-3{left:12.5%}.bcui-col-xs-pull-3{right:12.5%}.bcui-col-xs-offset-3{margin-left:12.5%}.bcui-col-xs-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-xs-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-xs-push-2{left:8.33333333%}.bcui-col-xs-pull-2{right:8.33333333%}.bcui-col-xs-offset-2{margin-left:8.33333333%}.bcui-col-xs-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-xs-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-xs-push-1{left:4.16666667%}.bcui-col-xs-pull-1{right:4.16666667%}.bcui-col-xs-offset-1{margin-left:4.16666667%}.bcui-col-xs-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-xs-0{display:none}.bcui-col-push-0{left:auto}.bcui-col-pull-0{right:auto}.bcui-col-xs-push-0{left:auto}.bcui-col-xs-pull-0{right:auto}.bcui-col-xs-offset-0{margin-left:0}.bcui-col-xs-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}@media (min-width:576px){.bcui-col-sm-1,.bcui-col-sm-2,.bcui-col-sm-3,.bcui-col-sm-4,.bcui-col-sm-5,.bcui-col-sm-6,.bcui-col-sm-7,.bcui-col-sm-8,.bcui-col-sm-9,.bcui-col-sm-10,.bcui-col-sm-11,.bcui-col-sm-12,.bcui-col-sm-13,.bcui-col-sm-14,.bcui-col-sm-15,.bcui-col-sm-16,.bcui-col-sm-17,.bcui-col-sm-18,.bcui-col-sm-19,.bcui-col-sm-20,.bcui-col-sm-21,.bcui-col-sm-22,.bcui-col-sm-23,.bcui-col-sm-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-sm-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-sm-push-24{left:100%}.bcui-col-sm-pull-24{right:100%}.bcui-col-sm-offset-24{margin-left:100%}.bcui-col-sm-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-sm-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-sm-push-23{left:95.83333333%}.bcui-col-sm-pull-23{right:95.83333333%}.bcui-col-sm-offset-23{margin-left:95.83333333%}.bcui-col-sm-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-sm-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-sm-push-22{left:91.66666667%}.bcui-col-sm-pull-22{right:91.66666667%}.bcui-col-sm-offset-22{margin-left:91.66666667%}.bcui-col-sm-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-sm-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-sm-push-21{left:87.5%}.bcui-col-sm-pull-21{right:87.5%}.bcui-col-sm-offset-21{margin-left:87.5%}.bcui-col-sm-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-sm-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-sm-push-20{left:83.33333333%}.bcui-col-sm-pull-20{right:83.33333333%}.bcui-col-sm-offset-20{margin-left:83.33333333%}.bcui-col-sm-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-sm-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-sm-push-19{left:79.16666667%}.bcui-col-sm-pull-19{right:79.16666667%}.bcui-col-sm-offset-19{margin-left:79.16666667%}.bcui-col-sm-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-sm-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-sm-push-18{left:75%}.bcui-col-sm-pull-18{right:75%}.bcui-col-sm-offset-18{margin-left:75%}.bcui-col-sm-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-sm-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-sm-push-17{left:70.83333333%}.bcui-col-sm-pull-17{right:70.83333333%}.bcui-col-sm-offset-17{margin-left:70.83333333%}.bcui-col-sm-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-sm-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-sm-push-16{left:66.66666667%}.bcui-col-sm-pull-16{right:66.66666667%}.bcui-col-sm-offset-16{margin-left:66.66666667%}.bcui-col-sm-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-sm-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-sm-push-15{left:62.5%}.bcui-col-sm-pull-15{right:62.5%}.bcui-col-sm-offset-15{margin-left:62.5%}.bcui-col-sm-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-sm-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-sm-push-14{left:58.33333333%}.bcui-col-sm-pull-14{right:58.33333333%}.bcui-col-sm-offset-14{margin-left:58.33333333%}.bcui-col-sm-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-sm-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-sm-push-13{left:54.16666667%}.bcui-col-sm-pull-13{right:54.16666667%}.bcui-col-sm-offset-13{margin-left:54.16666667%}.bcui-col-sm-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-sm-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-sm-push-12{left:50%}.bcui-col-sm-pull-12{right:50%}.bcui-col-sm-offset-12{margin-left:50%}.bcui-col-sm-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-sm-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-sm-push-11{left:45.83333333%}.bcui-col-sm-pull-11{right:45.83333333%}.bcui-col-sm-offset-11{margin-left:45.83333333%}.bcui-col-sm-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-sm-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-sm-push-10{left:41.66666667%}.bcui-col-sm-pull-10{right:41.66666667%}.bcui-col-sm-offset-10{margin-left:41.66666667%}.bcui-col-sm-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-sm-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-sm-push-9{left:37.5%}.bcui-col-sm-pull-9{right:37.5%}.bcui-col-sm-offset-9{margin-left:37.5%}.bcui-col-sm-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-sm-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-sm-push-8{left:33.33333333%}.bcui-col-sm-pull-8{right:33.33333333%}.bcui-col-sm-offset-8{margin-left:33.33333333%}.bcui-col-sm-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-sm-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-sm-push-7{left:29.16666667%}.bcui-col-sm-pull-7{right:29.16666667%}.bcui-col-sm-offset-7{margin-left:29.16666667%}.bcui-col-sm-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-sm-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-sm-push-6{left:25%}.bcui-col-sm-pull-6{right:25%}.bcui-col-sm-offset-6{margin-left:25%}.bcui-col-sm-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-sm-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-sm-push-5{left:20.83333333%}.bcui-col-sm-pull-5{right:20.83333333%}.bcui-col-sm-offset-5{margin-left:20.83333333%}.bcui-col-sm-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-sm-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-sm-push-4{left:16.66666667%}.bcui-col-sm-pull-4{right:16.66666667%}.bcui-col-sm-offset-4{margin-left:16.66666667%}.bcui-col-sm-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-sm-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-sm-push-3{left:12.5%}.bcui-col-sm-pull-3{right:12.5%}.bcui-col-sm-offset-3{margin-left:12.5%}.bcui-col-sm-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-sm-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-sm-push-2{left:8.33333333%}.bcui-col-sm-pull-2{right:8.33333333%}.bcui-col-sm-offset-2{margin-left:8.33333333%}.bcui-col-sm-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-sm-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-sm-push-1{left:4.16666667%}.bcui-col-sm-pull-1{right:4.16666667%}.bcui-col-sm-offset-1{margin-left:4.16666667%}.bcui-col-sm-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-sm-0{display:none}.bcui-col-push-0{left:auto}.bcui-col-pull-0{right:auto}.bcui-col-sm-push-0{left:auto}.bcui-col-sm-pull-0{right:auto}.bcui-col-sm-offset-0{margin-left:0}.bcui-col-sm-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:768px){.bcui-col-md-1,.bcui-col-md-2,.bcui-col-md-3,.bcui-col-md-4,.bcui-col-md-5,.bcui-col-md-6,.bcui-col-md-7,.bcui-col-md-8,.bcui-col-md-9,.bcui-col-md-10,.bcui-col-md-11,.bcui-col-md-12,.bcui-col-md-13,.bcui-col-md-14,.bcui-col-md-15,.bcui-col-md-16,.bcui-col-md-17,.bcui-col-md-18,.bcui-col-md-19,.bcui-col-md-20,.bcui-col-md-21,.bcui-col-md-22,.bcui-col-md-23,.bcui-col-md-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-md-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-md-push-24{left:100%}.bcui-col-md-pull-24{right:100%}.bcui-col-md-offset-24{margin-left:100%}.bcui-col-md-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-md-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-md-push-23{left:95.83333333%}.bcui-col-md-pull-23{right:95.83333333%}.bcui-col-md-offset-23{margin-left:95.83333333%}.bcui-col-md-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-md-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-md-push-22{left:91.66666667%}.bcui-col-md-pull-22{right:91.66666667%}.bcui-col-md-offset-22{margin-left:91.66666667%}.bcui-col-md-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-md-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-md-push-21{left:87.5%}.bcui-col-md-pull-21{right:87.5%}.bcui-col-md-offset-21{margin-left:87.5%}.bcui-col-md-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-md-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-md-push-20{left:83.33333333%}.bcui-col-md-pull-20{right:83.33333333%}.bcui-col-md-offset-20{margin-left:83.33333333%}.bcui-col-md-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-md-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-md-push-19{left:79.16666667%}.bcui-col-md-pull-19{right:79.16666667%}.bcui-col-md-offset-19{margin-left:79.16666667%}.bcui-col-md-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-md-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-md-push-18{left:75%}.bcui-col-md-pull-18{right:75%}.bcui-col-md-offset-18{margin-left:75%}.bcui-col-md-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-md-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-md-push-17{left:70.83333333%}.bcui-col-md-pull-17{right:70.83333333%}.bcui-col-md-offset-17{margin-left:70.83333333%}.bcui-col-md-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-md-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-md-push-16{left:66.66666667%}.bcui-col-md-pull-16{right:66.66666667%}.bcui-col-md-offset-16{margin-left:66.66666667%}.bcui-col-md-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-md-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-md-push-15{left:62.5%}.bcui-col-md-pull-15{right:62.5%}.bcui-col-md-offset-15{margin-left:62.5%}.bcui-col-md-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-md-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-md-push-14{left:58.33333333%}.bcui-col-md-pull-14{right:58.33333333%}.bcui-col-md-offset-14{margin-left:58.33333333%}.bcui-col-md-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-md-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-md-push-13{left:54.16666667%}.bcui-col-md-pull-13{right:54.16666667%}.bcui-col-md-offset-13{margin-left:54.16666667%}.bcui-col-md-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-md-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-md-push-12{left:50%}.bcui-col-md-pull-12{right:50%}.bcui-col-md-offset-12{margin-left:50%}.bcui-col-md-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-md-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-md-push-11{left:45.83333333%}.bcui-col-md-pull-11{right:45.83333333%}.bcui-col-md-offset-11{margin-left:45.83333333%}.bcui-col-md-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-md-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-md-push-10{left:41.66666667%}.bcui-col-md-pull-10{right:41.66666667%}.bcui-col-md-offset-10{margin-left:41.66666667%}.bcui-col-md-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-md-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-md-push-9{left:37.5%}.bcui-col-md-pull-9{right:37.5%}.bcui-col-md-offset-9{margin-left:37.5%}.bcui-col-md-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-md-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-md-push-8{left:33.33333333%}.bcui-col-md-pull-8{right:33.33333333%}.bcui-col-md-offset-8{margin-left:33.33333333%}.bcui-col-md-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-md-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-md-push-7{left:29.16666667%}.bcui-col-md-pull-7{right:29.16666667%}.bcui-col-md-offset-7{margin-left:29.16666667%}.bcui-col-md-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-md-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-md-push-6{left:25%}.bcui-col-md-pull-6{right:25%}.bcui-col-md-offset-6{margin-left:25%}.bcui-col-md-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-md-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-md-push-5{left:20.83333333%}.bcui-col-md-pull-5{right:20.83333333%}.bcui-col-md-offset-5{margin-left:20.83333333%}.bcui-col-md-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-md-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-md-push-4{left:16.66666667%}.bcui-col-md-pull-4{right:16.66666667%}.bcui-col-md-offset-4{margin-left:16.66666667%}.bcui-col-md-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-md-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-md-push-3{left:12.5%}.bcui-col-md-pull-3{right:12.5%}.bcui-col-md-offset-3{margin-left:12.5%}.bcui-col-md-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-md-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-md-push-2{left:8.33333333%}.bcui-col-md-pull-2{right:8.33333333%}.bcui-col-md-offset-2{margin-left:8.33333333%}.bcui-col-md-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-md-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-md-push-1{left:4.16666667%}.bcui-col-md-pull-1{right:4.16666667%}.bcui-col-md-offset-1{margin-left:4.16666667%}.bcui-col-md-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-md-0{display:none}.bcui-col-push-0{left:auto}.bcui-col-pull-0{right:auto}.bcui-col-md-push-0{left:auto}.bcui-col-md-pull-0{right:auto}.bcui-col-md-offset-0{margin-left:0}.bcui-col-md-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:992px){.bcui-col-lg-1,.bcui-col-lg-2,.bcui-col-lg-3,.bcui-col-lg-4,.bcui-col-lg-5,.bcui-col-lg-6,.bcui-col-lg-7,.bcui-col-lg-8,.bcui-col-lg-9,.bcui-col-lg-10,.bcui-col-lg-11,.bcui-col-lg-12,.bcui-col-lg-13,.bcui-col-lg-14,.bcui-col-lg-15,.bcui-col-lg-16,.bcui-col-lg-17,.bcui-col-lg-18,.bcui-col-lg-19,.bcui-col-lg-20,.bcui-col-lg-21,.bcui-col-lg-22,.bcui-col-lg-23,.bcui-col-lg-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-lg-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-lg-push-24{left:100%}.bcui-col-lg-pull-24{right:100%}.bcui-col-lg-offset-24{margin-left:100%}.bcui-col-lg-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-lg-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-lg-push-23{left:95.83333333%}.bcui-col-lg-pull-23{right:95.83333333%}.bcui-col-lg-offset-23{margin-left:95.83333333%}.bcui-col-lg-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-lg-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-lg-push-22{left:91.66666667%}.bcui-col-lg-pull-22{right:91.66666667%}.bcui-col-lg-offset-22{margin-left:91.66666667%}.bcui-col-lg-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-lg-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-lg-push-21{left:87.5%}.bcui-col-lg-pull-21{right:87.5%}.bcui-col-lg-offset-21{margin-left:87.5%}.bcui-col-lg-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-lg-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-lg-push-20{left:83.33333333%}.bcui-col-lg-pull-20{right:83.33333333%}.bcui-col-lg-offset-20{margin-left:83.33333333%}.bcui-col-lg-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-lg-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-lg-push-19{left:79.16666667%}.bcui-col-lg-pull-19{right:79.16666667%}.bcui-col-lg-offset-19{margin-left:79.16666667%}.bcui-col-lg-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-lg-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-lg-push-18{left:75%}.bcui-col-lg-pull-18{right:75%}.bcui-col-lg-offset-18{margin-left:75%}.bcui-col-lg-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-lg-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-lg-push-17{left:70.83333333%}.bcui-col-lg-pull-17{right:70.83333333%}.bcui-col-lg-offset-17{margin-left:70.83333333%}.bcui-col-lg-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-lg-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-lg-push-16{left:66.66666667%}.bcui-col-lg-pull-16{right:66.66666667%}.bcui-col-lg-offset-16{margin-left:66.66666667%}.bcui-col-lg-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-lg-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-lg-push-15{left:62.5%}.bcui-col-lg-pull-15{right:62.5%}.bcui-col-lg-offset-15{margin-left:62.5%}.bcui-col-lg-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-lg-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-lg-push-14{left:58.33333333%}.bcui-col-lg-pull-14{right:58.33333333%}.bcui-col-lg-offset-14{margin-left:58.33333333%}.bcui-col-lg-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-lg-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-lg-push-13{left:54.16666667%}.bcui-col-lg-pull-13{right:54.16666667%}.bcui-col-lg-offset-13{margin-left:54.16666667%}.bcui-col-lg-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-lg-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-lg-push-12{left:50%}.bcui-col-lg-pull-12{right:50%}.bcui-col-lg-offset-12{margin-left:50%}.bcui-col-lg-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-lg-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-lg-push-11{left:45.83333333%}.bcui-col-lg-pull-11{right:45.83333333%}.bcui-col-lg-offset-11{margin-left:45.83333333%}.bcui-col-lg-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-lg-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-lg-push-10{left:41.66666667%}.bcui-col-lg-pull-10{right:41.66666667%}.bcui-col-lg-offset-10{margin-left:41.66666667%}.bcui-col-lg-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-lg-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-lg-push-9{left:37.5%}.bcui-col-lg-pull-9{right:37.5%}.bcui-col-lg-offset-9{margin-left:37.5%}.bcui-col-lg-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-lg-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-lg-push-8{left:33.33333333%}.bcui-col-lg-pull-8{right:33.33333333%}.bcui-col-lg-offset-8{margin-left:33.33333333%}.bcui-col-lg-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-lg-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-lg-push-7{left:29.16666667%}.bcui-col-lg-pull-7{right:29.16666667%}.bcui-col-lg-offset-7{margin-left:29.16666667%}.bcui-col-lg-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-lg-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-lg-push-6{left:25%}.bcui-col-lg-pull-6{right:25%}.bcui-col-lg-offset-6{margin-left:25%}.bcui-col-lg-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-lg-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-lg-push-5{left:20.83333333%}.bcui-col-lg-pull-5{right:20.83333333%}.bcui-col-lg-offset-5{margin-left:20.83333333%}.bcui-col-lg-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-lg-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-lg-push-4{left:16.66666667%}.bcui-col-lg-pull-4{right:16.66666667%}.bcui-col-lg-offset-4{margin-left:16.66666667%}.bcui-col-lg-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-lg-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-lg-push-3{left:12.5%}.bcui-col-lg-pull-3{right:12.5%}.bcui-col-lg-offset-3{margin-left:12.5%}.bcui-col-lg-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-lg-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-lg-push-2{left:8.33333333%}.bcui-col-lg-pull-2{right:8.33333333%}.bcui-col-lg-offset-2{margin-left:8.33333333%}.bcui-col-lg-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-lg-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-lg-push-1{left:4.16666667%}.bcui-col-lg-pull-1{right:4.16666667%}.bcui-col-lg-offset-1{margin-left:4.16666667%}.bcui-col-lg-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-lg-0{display:none}.bcui-col-push-0{left:auto}.bcui-col-pull-0{right:auto}.bcui-col-lg-push-0{left:auto}.bcui-col-lg-pull-0{right:auto}.bcui-col-lg-offset-0{margin-left:0}.bcui-col-lg-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:1200px){.bcui-col-xl-1,.bcui-col-xl-2,.bcui-col-xl-3,.bcui-col-xl-4,.bcui-col-xl-5,.bcui-col-xl-6,.bcui-col-xl-7,.bcui-col-xl-8,.bcui-col-xl-9,.bcui-col-xl-10,.bcui-col-xl-11,.bcui-col-xl-12,.bcui-col-xl-13,.bcui-col-xl-14,.bcui-col-xl-15,.bcui-col-xl-16,.bcui-col-xl-17,.bcui-col-xl-18,.bcui-col-xl-19,.bcui-col-xl-20,.bcui-col-xl-21,.bcui-col-xl-22,.bcui-col-xl-23,.bcui-col-xl-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-xl-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-xl-push-24{left:100%}.bcui-col-xl-pull-24{right:100%}.bcui-col-xl-offset-24{margin-left:100%}.bcui-col-xl-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-xl-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-xl-push-23{left:95.83333333%}.bcui-col-xl-pull-23{right:95.83333333%}.bcui-col-xl-offset-23{margin-left:95.83333333%}.bcui-col-xl-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-xl-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-xl-push-22{left:91.66666667%}.bcui-col-xl-pull-22{right:91.66666667%}.bcui-col-xl-offset-22{margin-left:91.66666667%}.bcui-col-xl-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-xl-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-xl-push-21{left:87.5%}.bcui-col-xl-pull-21{right:87.5%}.bcui-col-xl-offset-21{margin-left:87.5%}.bcui-col-xl-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-xl-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-xl-push-20{left:83.33333333%}.bcui-col-xl-pull-20{right:83.33333333%}.bcui-col-xl-offset-20{margin-left:83.33333333%}.bcui-col-xl-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-xl-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-xl-push-19{left:79.16666667%}.bcui-col-xl-pull-19{right:79.16666667%}.bcui-col-xl-offset-19{margin-left:79.16666667%}.bcui-col-xl-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-xl-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-xl-push-18{left:75%}.bcui-col-xl-pull-18{right:75%}.bcui-col-xl-offset-18{margin-left:75%}.bcui-col-xl-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-xl-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-xl-push-17{left:70.83333333%}.bcui-col-xl-pull-17{right:70.83333333%}.bcui-col-xl-offset-17{margin-left:70.83333333%}.bcui-col-xl-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-xl-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-xl-push-16{left:66.66666667%}.bcui-col-xl-pull-16{right:66.66666667%}.bcui-col-xl-offset-16{margin-left:66.66666667%}.bcui-col-xl-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-xl-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-xl-push-15{left:62.5%}.bcui-col-xl-pull-15{right:62.5%}.bcui-col-xl-offset-15{margin-left:62.5%}.bcui-col-xl-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-xl-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-xl-push-14{left:58.33333333%}.bcui-col-xl-pull-14{right:58.33333333%}.bcui-col-xl-offset-14{margin-left:58.33333333%}.bcui-col-xl-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-xl-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-xl-push-13{left:54.16666667%}.bcui-col-xl-pull-13{right:54.16666667%}.bcui-col-xl-offset-13{margin-left:54.16666667%}.bcui-col-xl-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-xl-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-xl-push-12{left:50%}.bcui-col-xl-pull-12{right:50%}.bcui-col-xl-offset-12{margin-left:50%}.bcui-col-xl-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-xl-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-xl-push-11{left:45.83333333%}.bcui-col-xl-pull-11{right:45.83333333%}.bcui-col-xl-offset-11{margin-left:45.83333333%}.bcui-col-xl-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-xl-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-xl-push-10{left:41.66666667%}.bcui-col-xl-pull-10{right:41.66666667%}.bcui-col-xl-offset-10{margin-left:41.66666667%}.bcui-col-xl-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-xl-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-xl-push-9{left:37.5%}.bcui-col-xl-pull-9{right:37.5%}.bcui-col-xl-offset-9{margin-left:37.5%}.bcui-col-xl-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-xl-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-xl-push-8{left:33.33333333%}.bcui-col-xl-pull-8{right:33.33333333%}.bcui-col-xl-offset-8{margin-left:33.33333333%}.bcui-col-xl-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-xl-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-xl-push-7{left:29.16666667%}.bcui-col-xl-pull-7{right:29.16666667%}.bcui-col-xl-offset-7{margin-left:29.16666667%}.bcui-col-xl-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-xl-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-xl-push-6{left:25%}.bcui-col-xl-pull-6{right:25%}.bcui-col-xl-offset-6{margin-left:25%}.bcui-col-xl-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-xl-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-xl-push-5{left:20.83333333%}.bcui-col-xl-pull-5{right:20.83333333%}.bcui-col-xl-offset-5{margin-left:20.83333333%}.bcui-col-xl-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-xl-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-xl-push-4{left:16.66666667%}.bcui-col-xl-pull-4{right:16.66666667%}.bcui-col-xl-offset-4{margin-left:16.66666667%}.bcui-col-xl-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-xl-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-xl-push-3{left:12.5%}.bcui-col-xl-pull-3{right:12.5%}.bcui-col-xl-offset-3{margin-left:12.5%}.bcui-col-xl-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-xl-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-xl-push-2{left:8.33333333%}.bcui-col-xl-pull-2{right:8.33333333%}.bcui-col-xl-offset-2{margin-left:8.33333333%}.bcui-col-xl-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-xl-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-xl-push-1{left:4.16666667%}.bcui-col-xl-pull-1{right:4.16666667%}.bcui-col-xl-offset-1{margin-left:4.16666667%}.bcui-col-xl-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-xl-0{display:none}.bcui-col-push-0{left:auto}.bcui-col-pull-0{right:auto}.bcui-col-xl-push-0{left:auto}.bcui-col-xl-pull-0{right:auto}.bcui-col-xl-offset-0{margin-left:0}.bcui-col-xl-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:1600px){.bcui-col-xxl-1,.bcui-col-xxl-2,.bcui-col-xxl-3,.bcui-col-xxl-4,.bcui-col-xxl-5,.bcui-col-xxl-6,.bcui-col-xxl-7,.bcui-col-xxl-8,.bcui-col-xxl-9,.bcui-col-xxl-10,.bcui-col-xxl-11,.bcui-col-xxl-12,.bcui-col-xxl-13,.bcui-col-xxl-14,.bcui-col-xxl-15,.bcui-col-xxl-16,.bcui-col-xxl-17,.bcui-col-xxl-18,.bcui-col-xxl-19,.bcui-col-xxl-20,.bcui-col-xxl-21,.bcui-col-xxl-22,.bcui-col-xxl-23,.bcui-col-xxl-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.bcui-col-xxl-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.bcui-col-xxl-push-24{left:100%}.bcui-col-xxl-pull-24{right:100%}.bcui-col-xxl-offset-24{margin-left:100%}.bcui-col-xxl-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.bcui-col-xxl-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.bcui-col-xxl-push-23{left:95.83333333%}.bcui-col-xxl-pull-23{right:95.83333333%}.bcui-col-xxl-offset-23{margin-left:95.83333333%}.bcui-col-xxl-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.bcui-col-xxl-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.bcui-col-xxl-push-22{left:91.66666667%}.bcui-col-xxl-pull-22{right:91.66666667%}.bcui-col-xxl-offset-22{margin-left:91.66666667%}.bcui-col-xxl-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.bcui-col-xxl-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.bcui-col-xxl-push-21{left:87.5%}.bcui-col-xxl-pull-21{right:87.5%}.bcui-col-xxl-offset-21{margin-left:87.5%}.bcui-col-xxl-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.bcui-col-xxl-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.bcui-col-xxl-push-20{left:83.33333333%}.bcui-col-xxl-pull-20{right:83.33333333%}.bcui-col-xxl-offset-20{margin-left:83.33333333%}.bcui-col-xxl-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.bcui-col-xxl-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.bcui-col-xxl-push-19{left:79.16666667%}.bcui-col-xxl-pull-19{right:79.16666667%}.bcui-col-xxl-offset-19{margin-left:79.16666667%}.bcui-col-xxl-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.bcui-col-xxl-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.bcui-col-xxl-push-18{left:75%}.bcui-col-xxl-pull-18{right:75%}.bcui-col-xxl-offset-18{margin-left:75%}.bcui-col-xxl-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.bcui-col-xxl-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.bcui-col-xxl-push-17{left:70.83333333%}.bcui-col-xxl-pull-17{right:70.83333333%}.bcui-col-xxl-offset-17{margin-left:70.83333333%}.bcui-col-xxl-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.bcui-col-xxl-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.bcui-col-xxl-push-16{left:66.66666667%}.bcui-col-xxl-pull-16{right:66.66666667%}.bcui-col-xxl-offset-16{margin-left:66.66666667%}.bcui-col-xxl-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.bcui-col-xxl-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.bcui-col-xxl-push-15{left:62.5%}.bcui-col-xxl-pull-15{right:62.5%}.bcui-col-xxl-offset-15{margin-left:62.5%}.bcui-col-xxl-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.bcui-col-xxl-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.bcui-col-xxl-push-14{left:58.33333333%}.bcui-col-xxl-pull-14{right:58.33333333%}.bcui-col-xxl-offset-14{margin-left:58.33333333%}.bcui-col-xxl-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.bcui-col-xxl-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.bcui-col-xxl-push-13{left:54.16666667%}.bcui-col-xxl-pull-13{right:54.16666667%}.bcui-col-xxl-offset-13{margin-left:54.16666667%}.bcui-col-xxl-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.bcui-col-xxl-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.bcui-col-xxl-push-12{left:50%}.bcui-col-xxl-pull-12{right:50%}.bcui-col-xxl-offset-12{margin-left:50%}.bcui-col-xxl-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.bcui-col-xxl-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.bcui-col-xxl-push-11{left:45.83333333%}.bcui-col-xxl-pull-11{right:45.83333333%}.bcui-col-xxl-offset-11{margin-left:45.83333333%}.bcui-col-xxl-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.bcui-col-xxl-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.bcui-col-xxl-push-10{left:41.66666667%}.bcui-col-xxl-pull-10{right:41.66666667%}.bcui-col-xxl-offset-10{margin-left:41.66666667%}.bcui-col-xxl-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.bcui-col-xxl-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.bcui-col-xxl-push-9{left:37.5%}.bcui-col-xxl-pull-9{right:37.5%}.bcui-col-xxl-offset-9{margin-left:37.5%}.bcui-col-xxl-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.bcui-col-xxl-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.bcui-col-xxl-push-8{left:33.33333333%}.bcui-col-xxl-pull-8{right:33.33333333%}.bcui-col-xxl-offset-8{margin-left:33.33333333%}.bcui-col-xxl-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.bcui-col-xxl-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.bcui-col-xxl-push-7{left:29.16666667%}.bcui-col-xxl-pull-7{right:29.16666667%}.bcui-col-xxl-offset-7{margin-left:29.16666667%}.bcui-col-xxl-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.bcui-col-xxl-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.bcui-col-xxl-push-6{left:25%}.bcui-col-xxl-pull-6{right:25%}.bcui-col-xxl-offset-6{margin-left:25%}.bcui-col-xxl-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.bcui-col-xxl-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.bcui-col-xxl-push-5{left:20.83333333%}.bcui-col-xxl-pull-5{right:20.83333333%}.bcui-col-xxl-offset-5{margin-left:20.83333333%}.bcui-col-xxl-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.bcui-col-xxl-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.bcui-col-xxl-push-4{left:16.66666667%}.bcui-col-xxl-pull-4{right:16.66666667%}.bcui-col-xxl-offset-4{margin-left:16.66666667%}.bcui-col-xxl-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.bcui-col-xxl-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.bcui-col-xxl-push-3{left:12.5%}.bcui-col-xxl-pull-3{right:12.5%}.bcui-col-xxl-offset-3{margin-left:12.5%}.bcui-col-xxl-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.bcui-col-xxl-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.bcui-col-xxl-push-2{left:8.33333333%}.bcui-col-xxl-pull-2{right:8.33333333%}.bcui-col-xxl-offset-2{margin-left:8.33333333%}.bcui-col-xxl-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.bcui-col-xxl-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.bcui-col-xxl-push-1{left:4.16666667%}.bcui-col-xxl-pull-1{right:4.16666667%}.bcui-col-xxl-offset-1{margin-left:4.16666667%}.bcui-col-xxl-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.bcui-col-xxl-0{display:none}.bcui-col-push-0{left:auto}.bcui-col-pull-0{right:auto}.bcui-col-xxl-push-0{left:auto}.bcui-col-xxl-pull-0{right:auto}.bcui-col-xxl-offset-0{margin-left:0}.bcui-col-xxl-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}.bcui-alert{width:100%;padding:20px;border:1px solid #fff;border-radius:4px}.bcui-alert--info{border-color:#2db7f5;background-color:#c0e9fc}.bcui-alert--info .bcui-alert__icon{color:#2db7f5}.bcui-alert--success{border-color:#09d274;background-color:#b5f2d5}.bcui-alert--success .bcui-alert__icon{color:#09d274}.bcui-alert--warning{border-color:#ffb437;background-color:#ffe9c3}.bcui-alert--warning .bcui-alert__icon{color:#ffb437}.bcui-alert--error{border-color:#fe4f27;background-color:#ffcabe}.bcui-alert--error .bcui-alert__icon{color:#fe4f27}.bcui-alert--with-icon{padding:8px 48px 8px 38px;position:relative}.bcui-alert--with-description{position:relative;border-radius:6px;margin-bottom:10px;color:#495060;line-height:1.5}.bcui-alert--with-description.bcui-alert--with-icon{padding:16px 16px 16px 69px}.bcui-alert--with-description .bcui-alert__message{font-size:14px;color:#1c2438;display:block}.bcui-alert--with-description .bcui-alert__description{display:block}.bcui-alert--with-description .bcui-alert__icon{top:50%;left:24px;margin-top:-21px;font-size:28px}.bcui-alert__icon{font-size:14px;top:8px;left:16px;position:absolute}.bcui-alert__description{font-size:12px;color:#495060;line-height:21px;display:none;text-align:justify}.bcui-modal{width:auto;margin:0 auto;position:relative;outline:0;top:100px}.bcui-modal-hidden{display:none!important}.bcui-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.bcui-modal-wrap *{box-sizing:border-box;-webkit-tap-highlight-color:transparent}.bcui-modal-mask{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,55,55,.6);height:100%;z-index:1000}.bcui-modal-mask-hidden{display:none}.bcui-modal-content{position:relative;background-color:#fff;border:0;border-radius:3px;background-clip:padding-box}.bcui-modal-header{border-bottom:1px solid #e3e8ee;padding:14px 16px;line-height:1}.bcui-modal-header-inner,.bcui-modal-header p{display:inline-block;width:100%;height:20px;line-height:20px;font-size:14px;color:#464c5b;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcui-modal-close{font-size:12px;position:absolute;right:16px;top:16px;overflow:hidden;cursor:pointer}.bcui-modal-close .bcui-icon-ios-close-empty{font-size:31px;color:#999;transition:color .2s ease;position:relative;top:1px}.bcui-modal-close .bcui-icon-ios-close-empty:hover{color:#444}.bcui-modal-body{padding:16px;font-size:12px;line-height:1.5}.bcui-modal-footer{border-top:1px solid #e3e8ee;padding:12px 18px;text-align:right}.bcui-modal-footer button+button{margin-left:8px;margin-bottom:0}@media (max-width:768px){.bcui-modal{width:auto!important;margin:10px}.vertical-center-modal .bcui-modal{-ms-flex:1;flex:1}}.bcui-modal-confirm{padding:0 4px}.bcui-modal-confirm-head-title{display:inline-block;font-size:14px;color:#464c5b;font-weight:700}.bcui-modal-confirm-body{margin-top:6px;padding-left:48px;padding-top:18px;font-size:12px;color:#657180;position:relative}.bcui-modal-confirm-body-icon{font-size:36px;position:absolute;top:0;left:0}.bcui-modal-confirm-body-icon-info{color:#39f}.bcui-modal-confirm-body-icon-success{color:#0c6}.bcui-modal-confirm-body-icon-warning{color:#f90}.bcui-modal-confirm-body-icon-error{color:#f30}.bcui-modal-confirm-body-icon-confirm{color:#f90}.bcui-modal-confirm-footer{margin-top:40px;text-align:right}.bcui-modal-confirm-footer button+button{margin-left:8px;margin-bottom:0}.bcui-tab-header{border-bottom:1px solid #d4d4d4;padding:0;position:relative}.bcui-tab-navbar{overflow:hidden;margin-bottom:-1px;position:relative}.bcui-tab-navbar.scrolled{padding:0 20px}.bcui-tab-navbar__inner{white-space:nowrap;position:relative;font-size:0;float:left;transition:transform .3s;-webkit-text-just-none:true}.bcui-tab-navbar__item{display:inline-block;height:38px;padding:0 0 10px;margin-right:32px;font-size:14px;line-height:38px;cursor:pointer;transition:all .3s ease-in-out 0s}.bcui-tab-navbar__item--active{color:#2d77ee}.bcui-tab-navbar__item--disabled{cursor:not-allowed;color:#ccc}.bcui-tab-header{border-bottom:2px solid #f5f5f5}.bcui-tab-navbar{margin-bottom:-2px}.bcui-tab-navbar--card .bcui-tab-navbar__item{border:1px solid #d7dde4;margin-right:6px;border-radius:4px 4px 0 0;background:#f9f9f9;padding:0 16px}.bcui-tab-navbar--card .bcui-tab-navbar__item--active{border-bottom:1px solid #fff;background:#fff;color:#2d77ee}.bcui-tab-navbar--card .bcui-tab-navbar__item--disabled{cursor:not-allowed;color:#ccc}.bcui-tab-activebar{display:none;height:3px;background:#2d77ee;position:absolute;left:0;bottom:0}.bcui-tab-activebar--animated{transition:transform .3s ease-in-out 0s}.bcui-tab--small .bcui-tab-navbar__item{margin:0}.bcui-tab-navbar-scroll{overflow:hidden}.bcui-tab-navbar-next,.bcui-tab-navbar-prev{position:absolute;cursor:pointer;line-height:38px;font-size:12px;color:#8391a5}.bcui-tab-navbar-prev{left:0}.bcui-tab-navbar-next{right:0}.bcui-tag{display:inline-block;height:22px;line-height:22px;margin:2px 4px 2px 0;padding:0 8px;border:1px solid #e3e8ee;border-radius:3px;font-size:12px;vertical-align:middle;opacity:1;overflow:hidden;cursor:pointer}.bcui-tag:hover{opacity:.85}.bcui-tag--primary{background:#2d77ee;border-color:#2d77ee;color:#fff}.bcui-tag i{font-size:10px}.bcui-tag-dot{height:32px;line-height:32px;border:1px solid #e3e8ee;color:#657180;background:#fff;padding:0 12px}.bcui-tag-dot__inner{display:inline-block;width:12px;height:12px;margin-right:8px;border-radius:50%;background:#e3e8ee;position:relative;top:1px}.bcui-tag-border{height:24px;line-height:24px;border:1px solid #e3e8ee;color:#657180;background:#fff;position:relative}.bcui-treenode{margin:0;padding:0;cursor:pointer;font-size:1.3rem}.bcui-treenode li{list-style-type:none}.bcui-treenode .bold{font-weight:600}.bcui-treenode-arrow{display:inline-block;transition:all .2s ease-in-out}.bcui-treenode-arrow--open{transform:rotate(90deg)}.bcui-treenode-name:hover{text-decoration:underline}.bcui-treenode>.bcui-treenode{margin:0;padding-left:16px}.bcui-tooltip,.bcui-tooltip-rel{display:inline-block}.bcui-tooltip-rel{position:relative}.bcui-tooltip-popper{display:block;visibility:visible;font-size:12px;line-height:1.5;position:absolute;z-index:1060}.bcui-tooltip-popper[x-placement^=top]{padding:5px 0 8px}.bcui-tooltip-popper[x-placement^=right]{padding:0 5px 0 8px}.bcui-tooltip-popper[x-placement^=bottom]{padding:8px 0 5px}.bcui-tooltip-popper[x-placement^=left]{padding:0 8px 0 5px}.bcui-tooltip-popper[x-placement^=top] .bcui-tooltip-arrow{bottom:3px;border-width:5px 5px 0;border-top-color:rgba(24,33,48,.85)}.bcui-tooltip-popper[x-placement=top] .bcui-tooltip-arrow{left:50%;margin-left:-5px}.bcui-tooltip-popper[x-placement=top-start] .bcui-tooltip-arrow{left:16px}.bcui-tooltip-popper[x-placement=top-end] .bcui-tooltip-arrow{right:16px}.bcui-tooltip-popper[x-placement^=right] .bcui-tooltip-arrow{left:3px;border-width:5px 5px 5px 0;border-right-color:rgba(24,33,48,.85)}.bcui-tooltip-popper[x-placement=right] .bcui-tooltip-arrow{top:50%;margin-top:-5px}.bcui-tooltip-popper[x-placement=right-start] .bcui-tooltip-arrow{top:8px}.bcui-tooltip-popper[x-placement=right-end] .bcui-tooltip-arrow{bottom:8px}.bcui-tooltip-popper[x-placement^=left] .bcui-tooltip-arrow{right:3px;border-width:5px 0 5px 5px;border-left-color:rgba(24,33,48,.85)}.bcui-tooltip-popper[x-placement=left] .bcui-tooltip-arrow{top:50%;margin-top:-5px}.bcui-tooltip-popper[x-placement=left-start] .bcui-tooltip-arrow{top:8px}.bcui-tooltip-popper[x-placement=left-end] .bcui-tooltip-arrow{bottom:8px}.bcui-tooltip-popper[x-placement^=bottom] .bcui-tooltip-arrow{top:3px;border-width:0 5px 5px;border-bottom-color:rgba(24,33,48,.85)}.bcui-tooltip-popper[x-placement=bottom] .bcui-tooltip-arrow{left:50%;margin-left:-5px}.bcui-tooltip-popper[x-placement=bottom-start] .bcui-tooltip-arrow{left:16px}.bcui-tooltip-popper[x-placement=bottom-end] .bcui-tooltip-arrow{right:16px}.bcui-tooltip-inner{width:max-content;max-width:250px;min-height:34px;padding:8px 12px;color:#fff;text-align:left;text-decoration:none;background-color:rgba(24,33,48,.85);border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);white-space:pre-wrap}.bcui-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.menu-item{display:block;outline:0;height:48px;line-height:48px;padding:0 32px;cursor:pointer;list-style-type:none;transition:background .2s ease-in-out}.menu-item:hover{color:#fff;background:#265bb0}.menu-item--horizontal{float:left;font-size:18px;color:#fff}.menu-item--horizontal,.menu-item--vertical{position:relative;cursor:pointer;z-index:3;transition:background .2s ease-in-out}.menu-item--vertical{font-size:14px;padding:14px 24px}.menu-active{background:#182130}.bcui-menu{display:block;margin:0;padding:0;outline:0;list-style:none;color:#dbdee3;font-size:14px;position:relative}.bcui-menu--horizontal{height:60px;line-height:60px}.bcui-menu-item{display:block;outline:0;height:48px;line-height:48px;padding:0 32px;cursor:pointer;list-style-type:none;transition:background .2s ease-in-out}.bcui-menu-item:hover{color:#fff;background:#265bb0}.bcui-menu-submenu .bcui-menu-item{padding-left:56px}.bcui-menu-submenu__title{height:48px;line-height:48px;padding:0 32px;cursor:pointer}.bcui-menu-submenu--opened{background:#182130}.bcui-menu-submenu__expand-icon{font-size:14px}.bcui-menu-item--active{color:#fff;background:rgba(45,119,238,.5)}.bcui-page{margin:14px 0;padding:0}.bcui-page:after{content:"";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.bcui-page-item{float:left;min-width:34px;height:34px;line-height:34px;text-align:center;list-style:none;background-color:#fff;user-select:none;cursor:pointer;font-family:Arial;border:1px solid #d7dde4;border-right:0}.bcui-page-item:last-child{border-right:1px solid #d7dde4}.bcui-page-item a{margin:0 6px;text-decoration:none;color:#657180}.bcui-page-item:hover a{color:#2d77ee}.bcui-page-item-active{background-color:#2d77ee;border-color:#2d77ee}.bcui-page-item-active+.bcui-page-item,.bcui-page-item-active+.bcui-page-next{border-left:0}.bcui-page-item-active:hover a,.bcui-page-item-active a{color:#fff}.bcui-page-item-jump-next:after,.bcui-page-item-jump-prev:after{content:"\2022\2022\2022";display:block;letter-spacing:1px;color:#ccc;text-align:center}.bcui-page-item-jump-next:hover:after,.bcui-page-item-jump-next i,.bcui-page-item-jump-prev:hover:after,.bcui-page-item-jump-prev i{display:none}.bcui-page-item-jump-next:hover i,.bcui-page-item-jump-prev:hover i{display:inline}.bcui-page-item-jump-next,.bcui-page-item-jump-prev,.bcui-page-next,.bcui-page-prev{float:left;min-width:34px;height:34px;line-height:34px;list-style:none;text-align:center;margin-right:-1px;cursor:pointer;color:#666;font-family:Arial;border:1px solid #d7dde4}.bcui-page-next,.bcui-page-prev{background-color:#fff}.bcui-page-next a,.bcui-page-prev a{color:#666;font-size:14px}.bcui-page-next a i:after,.bcui-page-prev a i:after{font-size:10px}.bcui-page-next:hover a,.bcui-page-prev:hover a{color:#2d77ee}.bcui-page-disabled{cursor:not-allowed}.bcui-page-disabled a{color:#ccc}.bcui-page-disabled:hover a{color:#ccc;cursor:not-allowed}.bcui-page-options{float:left;margin-left:15px}.bcui-page-options-sizer{float:left}.bcui-page-total{float:left;height:34px;line-height:34px;margin-right:10px}.bcui-page-simple .bcui-page-next,.bcui-page-simple .bcui-page-prev{margin:0;border:0;height:24px;line-height:24px;font-size:18px}.bcui-page-simple .bcui-page-simple-pager{float:left;margin-right:8px}.bcui-page-simple .bcui-page-simple-pager input{width:30px;height:24px;margin:0 8px;padding:5px 8px;text-align:center;box-sizing:border-box;background-color:#fff;outline:none;border:1px solid #d7dde4;border-radius:4px}.bcui-page-simple .bcui-page-simple-pager input:hover{border-color:#2d77ee}.bcui-page-simple .bcui-page-simple-pager span{padding:0 8px 0 2px}.bcui-page.mini .bcui-page-total{height:24px;line-height:24px}.bcui-page.mini .bcui-page-item{border:0;margin:0;min-width:24px;height:24px;line-height:24px;border-radius:3px}.bcui-page.mini .bcui-page-next,.bcui-page.mini .bcui-page-prev{margin:0;min-width:24px;height:24px;line-height:24px;border:0}.bcui-page.mini .bcui-page-next a i:after,.bcui-page.mini .bcui-page-prev a i:after{height:24px;line-height:24px}.bcui-page.mini .bcui-page-item-jump-next,.bcui-page.mini .bcui-page-item-jump-prev{height:24px;line-height:24px;border:none;margin-right:0}.bcui-page.mini .bcui-page-options{margin-left:8px}.bcui-page.mini .bcui-page-options-elevator{height:24px;line-height:24px}.bcui-page.mini .bcui-page-options-elevator input{padding:1px 7px;height:24px;border-radius:3px;width:44px}.bcui-page-options-elevator{float:left}.bcui-page-options-elevator input{border:1px solid #d1dbe5;border-radius:2px;line-height:18px;padding:4px 2px;width:30px;text-align:center;margin:0 6px;box-sizing:border-box}.bcui-page-options-elevator input:focus{outline:none;border-color:#2d77ee}.bcui-page-item-options{float:left;list-style:none}.bcui-page-options-sizer .bcui-select,.bcui-page-options-sizer .bcui-select__inner,.bcui-page-options-sizer .bcui-select__selected-value{height:34px}.bcui-page-options-sizer .bcui-select__inner{border-radius:0}.bcui-page-options-sizer .bcui-select__selected-value{padding:6px 32px 6px 12px}.bcui-popover{display:inline-block}.bcui-popover__inner{min-width:150px;max-height:none;padding:0;margin:0;overflow:initial;border-radius:0;box-shadow:none;background-color:transparent;box-sizing:border-box;position:absolute;z-index:900}.bcui-popover__inner-content{background-color:#fff;box-sizing:border-box;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2)}.bcui-popover__title{padding:8px 12px 6px;border-bottom:1px solid #eaeaea;font-size:14px}.bcui-popover__content{padding:8px 12px 10px}.bcui-popover__arrow{width:8px;height:8px;border-color:transparent;border-style:solid;background:#fff;transform:rotate(45deg);position:absolute}.bcui-popover__inner[x-placement^=top]{padding-bottom:10px}.bcui-popover__inner[x-placement^=top] .bcui-popover__arrow{bottom:6px;box-shadow:3px 3px 7px rgba(0,0,0,.09)}.bcui-popover__inner[x-placement=top] .bcui-popover__arrow{left:50%;margin-left:-5px}.bcui-popover__inner[x-placement=top-start] .bcui-popover__arrow{left:16px}.bcui-popover__inner[x-placement=top-end] .bcui-popover__arrow{right:16px}.bcui-popover__inner[x-placement^=right]{padding-left:10px}.bcui-popover__inner[x-placement^=right] .bcui-popover__arrow{left:6px;box-shadow:-3px 3px 7px rgba(0,0,0,.09)}.bcui-popover__inner[x-placement=right] .bcui-popover__arrow{top:50%;margin-top:-5px}.bcui-popover__inner[x-placement=right-start] .bcui-popover__arrow{top:10px}.bcui-popover__inner[x-placement=right-end] .bcui-popover__arrow{bottom:10px}.bcui-popover__inner[x-placement^=bottom]{padding-top:10px}.bcui-popover__inner[x-placement^=bottom] .bcui-popover__arrow{top:6px;box-shadow:-1px -1px 4px rgba(0,0,0,.09)}.bcui-popover__inner[x-placement=bottom] .bcui-popover__arrow{left:50%;margin-left:-5px}.bcui-popover__inner[x-placement=bottom-start] .bcui-popover__arrow{left:10px}.bcui-popover__inner[x-placement=bottom-end] .bcui-popover__arrow{right:10px}.bcui-popover__inner[x-placement^=left]{padding-right:10px}.bcui-popover__inner[x-placement^=left] .bcui-popover__arrow{right:6px;box-shadow:3px -3px 7px rgba(0,0,0,.07)}.bcui-popover__inner[x-placement=left] .bcui-popover__arrow{top:50%;margin-top:-5px}.bcui-popover__inner[x-placement=left-start] .bcui-popover__arrow{top:10px}.bcui-popover__inner[x-placement=left-end] .bcui-popover__arrow{bottom:10px}.bcui-progress-bar{width:100%;height:4px;border-radius:4px}.bcui-progress-bar__inner{height:100%;border-radius:4px;background:#f0f0f0}.bcui-progress-bar__bar{height:100%;border-radius:4px;background:#2d77ee}.bcui-progress-circle{position:relative}.bcui-progress-circle__inner{width:100%;height:100%;text-align:center;margin:0;position:absolute;top:50%;left:0;transform:translateY(-50%);display:flex;flex-direction:column;align-items:center;justify-content:center}.bcui-radio-group{display:inline-block;font-size:0;line-height:1;vertical-align:middle}.bcui-radio-group--vertical .bcui-radio{display:block;height:30px;line-height:30px}.bcui-radio{font-size:12px;display:inline-block;white-space:nowrap;cursor:pointer}.bcui-radio+.bcui-radio{margin-left:16px}.bcui-radio--disabled{cursor:not-allowed}.bcui-radio__input{line-height:1;vertical-align:middle}.bcui-radio__inner,.bcui-radio__input{white-space:nowrap;cursor:pointer;outline:none;display:inline-block;position:relative}.bcui-radio__inner{width:16px;height:16px;border:1px solid #c3c3c3;border-radius:100%;background-color:#fff}.bcui-radio__inner:hover .bcui-radio__inner{border-color:#bcbcbc}.bcui-radio__inner:after{position:absolute;width:6px;height:6px;left:50%;top:50%;border-radius:6px;display:table;border-top:0;border-left:0;content:" ";background-color:#fff;opacity:0;transition:all .2s ease-in-out;transform:scale(0)}.bcui-radio__original-input{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;opacity:0;cursor:pointer}.bcui-radio__label{font-size:14px;line-height:1;display:inline-block;vertical-align:middle}.bcui-radio--checked .bcui-radio__inner,.bcui-radio.is-checked .bcui-radio__inner{border-color:#2d77ee;background-color:#2d77ee}.bcui-radio--checked .bcui-radio__inner:after,.bcui-radio.is-checked .bcui-radio__inner:after{opacity:1;transform:translate(-50%,-50%) scale(1);transition:all .2s ease-in-out}.bcui-radio--checked:hover .bcui-radio__inner,.bcui-radio.is-checked:hover .bcui-radio__inner{border-color:#2d77ee}.bcui-radio--disabled,.bcui-radio--disabled .bcui-radio__input,.bcui-radio--disabled .bcui-radio__original-input,.bcui-radio.is-disabled,.bcui-radio.is-disabled .bcui-radio__input,.bcui-radio.is-disabled .bcui-radio__original-input{cursor:not-allowed}.bcui-radio--disabled:hover .bcui-radio__inner,.bcui-radio.is-disabled:hover .bcui-radio__inner{border-color:#d7dde4}.bcui-radio--disabled .bcui-radio__inner,.bcui-radio.is-disabled .bcui-radio__inner{border-color:#d7dde4;background-color:#f3f3f3;cursor:not-allowed}.bcui-radio--disabled .bcui-radio__inner:after,.bcui-radio.is-disabled .bcui-radio__inner:after{background-color:#ccc}.bcui-radio--disabled .bcui-radio--disabled+span,.bcui-radio.is-disabled .bcui-radio--disabled+span{color:#ccc}.bcui-radio-group-button{font-size:0;-webkit-text-size-adjust:none}.bcui-radio-group-button .bcui-radio{display:inline-block;height:36px;line-height:34px;margin:0;padding:0 16px;color:#495060;transition:all .2s ease-in-out;cursor:pointer;border:1px solid #d7dde4;border-left:0;background:#fff;position:relative;font-size:0}.bcui-radio-group-button .bcui-radio>span{margin-left:0}.bcui-radio-group-button .bcui-radio:before{content:"";position:absolute;width:1px;height:100%;left:-1px;background:#d7dde4;visibility:hidden;transition:all .2s ease-in-out}.bcui-radio-group-button .bcui-radio:first-child{border-radius:4px 0 0 4px;border-left:1px solid #d7dde4}.bcui-radio-group-button .bcui-radio:first-child:before{display:none}.bcui-radio-group-button .bcui-radio:last-child{border-radius:0 4px 4px 0}.bcui-radio-group-button .bcui-radio:first-child:last-child{border-radius:4px}.bcui-radio-group-button .bcui-radio:hover{position:relative;color:#2d77ee}.bcui-radio-group-button .bcui-radio .bcui-radio__inner,.bcui-radio-group-button .bcui-radio input{opacity:0;width:0;height:0}.bcui-radio-group-button .bcui-radio--checked,.bcui-radio-group-button .bcui-radio.is-checked{background:#fff;border-color:#2d77ee;color:#2d77ee;box-shadow:-1px 0 0 0 #2d77ee}.bcui-radio-group-button .bcui-radio--checked:first-child,.bcui-radio-group-button .bcui-radio.is-checked:first-child{border-color:#2d77ee;box-shadow:none!important}.bcui-radio-group-button .bcui-radio--checked:hover,.bcui-radio-group-button .bcui-radio.is-checked:hover{border-color:#5792f1;box-shadow:-1px 0 0 0 #5792f1;color:#5792f1}.bcui-radio-group-button .bcui-radio--checked:active,.bcui-radio-group-button .bcui-radio.is-checked:active{border-color:#2b71e2;box-shadow:-1px 0 0 0 #2b71e2;color:#2b71e2}.bcui-radio-group-button .bcui-radio--disabled,.bcui-radio-group-button .bcui-radio.is-disabled{border-color:#d7dde4;background-color:#f7f7f7;cursor:not-allowed;color:#ccc}.bcui-radio-group-button .bcui-radio--disabled:first-child,.bcui-radio-group-button .bcui-radio--disabled:hover,.bcui-radio-group-button .bcui-radio.is-disabled:first-child,.bcui-radio-group-button .bcui-radio.is-disabled:hover{border-color:#d7dde4;background-color:#f7f7f7;color:#ccc}.bcui-radio-group-button .bcui-radio--disabled:first-child,.bcui-radio-group-button .bcui-radio.is-disabled:first-child{border-left-color:#d7dde4}.bcui-radio-group-button .bcui-radio--disabled.bcui-radio--checked{color:#fff;background-color:#e6e6e6;border-color:#d7dde4;box-shadow:none!important}.bcui-radio-group-button .bcui-radio__inner{border:none}.bcui-radio-group-button .bcui-radio__inner:after{display:none}.bcui-radio-group-button.bcui-radio-group--large .bcui-radio{height:40px;line-height:38px;font-size:14px}.bcui-radio-group-button.bcui-radio-group--small .bcui-radio{height:24px;line-height:22px;padding:0 12px;font-size:12px}.bcui-radio-group-button.bcui-radio-group--small .bcui-radio:first-child{border-radius:3px 0 0 3px}.bcui-radio-group-button.bcui-radio-group--small .bcui-radio:last-child{border-radius:0 3px 3px 0}.bcui-message-container{font-size:12px;position:fixed;z-index:1010;width:100%;top:16px;left:0}.bcui-message{padding:8px;text-align:center;transition:height .3s ease-in-out,padding .3s ease-in-out}.bcui-message__content{display:inline-block;pointer-events:all;padding:8px 16px;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);background:#fff;position:relative}.bcui-message-close{position:absolute;right:4px;top:10px;color:#999;outline:0}.bcui-message-close i.bcui-icon{font-size:10px}.bcui-message-close i.bcui-icon:hover{cursor:pointer}.bcui-message__success .bcui-icon{color:#0c6}.bcui-message__error .bcui-icon{color:#f30}.bcui-message__warning .bcui-icon{color:#f90}.bcui-message__info .bcui-icon,.bcui-message__loading .bcui-icon{color:#39f}.bcui-message .bcui-icon{margin-right:8px;font-size:14px;top:1px;position:relative}.bcui-message--closable .bcui-message__content{padding-right:40px}.bcui-notice-container{width:335px;margin-right:24px;position:fixed;z-index:1010}.bcui-notice{margin-bottom:10px;padding:16px;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);background:#fff;line-height:1;position:relative;overflow:hidden}.bcui-notice-close{position:absolute;right:16px;top:15px;color:#999;outline:0;cursor:pointer}.bcui-notice-close i{font-size:14px;color:#999;transition:color .2s ease;position:relative;top:-3px}.bcui-notice-close i:hover{color:#444}.bcui-notice--with-desc .bcui-notice-close{top:11px}.bcui-notice-title{font-size:14px;color:#464c5b;padding-right:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcui-notice--with-desc .bcui-notice__title{margin-bottom:8px}.bcui-notice--with-desc.bcui-notice--with-icon .bcui-notice__title{margin-left:51px}.bcui-notice__desc{font-size:12px;color:#999;word-break:break-all;line-height:1.5}.bcui-notice--with-desc.bcui-notice--with-icon .bcui-notice__desc{margin-left:51px}.bcui-notice--with-icon .bcui-notice__title{margin-left:26px}.bcui-notice__icon{position:absolute;left:20px;margin-top:-1px;font-size:16px}.bcui-notice__icon-success{color:#0c6}.bcui-notice__icon-info{color:#39f}.bcui-notice__icon-warning{color:#f90}.bcui-notice__icon-error{color:#f30}.bcui-notice--with-desc .bcui-notice__icon{font-size:36px}.bcui-notice__custom-content:after{content:"";display:block;width:4px;position:absolute;top:0;bottom:0;left:0}.bcui-notice--with-info:after,.bcui-notice--with-normal:after{background:#39f}.bcui-notice--with-success:after{background:#0c6}.bcui-notice--with-warning:after{background:#f90}.bcui-notice--with-error:after{background:#f30}body{height:100%}.bc-form-search .bcui-form-item__content{display:inline-block}.pull-right{float:right}.breadcrumb-container{padding:15px 0}.block{padding:28px 0}.block-header{padding:0 0 16px}.block-header__title{font-size:2.4rem;line-height:32px;font-weight:600}.block-header__title.overview{font-size:2rem;color:#333;line-height:28px;margin-top:-4px}.clearfix:after{content:"";display:block;visibility:visible;width:0;height:0;font-size:0;clear:both}a:hover{text-decoration:underline}a{text-decoration:none}.bcui-table thead{font-size:12px}.bcui-table tbody{font-size:14px;color:#666}.bcui-table.bcui-table--dark thead th{background:#f2f3f5}.bcui-table.bcui-table--circular table{border-top:none!important}.bcui-table.bcui-table--circular thead{border-radius:4px 0 0 4px}.bcui-table.bcui-table--circular thead>tr>th{border-top:1px solid #dbdee3;border-bottom:1px solid #dbdee3}.bcui-table.bcui-table--circular thead>tr>th:last-child{border-top-right-radius:4px;border-right:1px solid #dbdee3}.bcui-table.bcui-table--circular thead>tr>th:first-child{border-top-left-radius:4px;border-left:1px solid #dbdee3}.bcui-table.bcui-table--circular tbody{border:1px solid #dbdee3}.bcui-table.bcui-table--circular tbody>tr>td:last-child{border-right:1px solid #dbdee3}.bcui-table.bcui-table--circular tbody>tr>td:first-child{border-left:1px solid #dbdee3}.bcui-table.bcui-table--circular tbody>tr:last-child>td:first-child{border-bottom-left-radius:4px}.bcui-table.bcui-table--circular tbody>tr:last-child>td:last-child{border-bottom-right-radius:4px}.bcui-table-column-sorter{font-size:10px;margin-left:2px;cursor:pointer;color:#999}.bcui-table-column-sorter.sort-asc,.bcui-table-column-sorter.sort-desc{color:#333}.alert-message{line-height:20px;text-align:left;color:#a5a3a3;margin-bottom:20px}.actions-menu-trigger{display:inline-block;vertical-align:top;position:relative}.actions-menu-trigger .actions-menu{width:110px;border:1px solid #e8e8e8;background:#fff;box-shadow:0 0 6px -3px rgba(0,0,0,.4);position:absolute;right:-4px;top:26px;z-index:1}.actions-menu-trigger .actions-menu-item{display:block;padding:0 16px;height:30px;line-height:30px;border-bottom:1px solid #f3f3f3;cursor:pointer;opacity:.8}.actions-menu-trigger .actions-menu-item:hover{background:#f5f5f5;opacity:1}.state--enable{color:#0cb86e}.state--disable{color:#fe4f27}.bcui-table-toolbar .bcui-button{margin-right:8px}.bcui-table-toolbar .bcui-button-group .bcui-button{margin-right:0}.bcui-table-toolbar .bcui-button-group .bcui-button:last-child{margin-right:8px}.bc-codemirror{font-size:12px;line-height:20px}.bcui-base-dropdown{width:100%}.bcui-page-item,.bcui-page-options-elevator,.bcui-page-total{font-size:14px}.disable-text-link{color:#c3cbd6;cursor:not-allowed;pointer-events:none}.detail-block-header{height:62px}.detail-block-nav{padding:12px 0 16px;font-size:14px;color:#999}.detail-block-nav__back{float:left;display:flex;align-items:center;cursor:pointer}.detail-block-nav__back .icon{margin-right:6px;margin-left:-3px}.detail-block-nav__back span{vertical-align:middle;display:inline-block;height:20px;line-height:22px}.detail-block-nav__back:hover{color:#333}.detail-block-body .bcui-tab-content{padding:0}.detail-info{float:left}.detail-title{font-size:0;display:flex;align-items:baseline}.detail-title__value{float:left;font-size:24px;font-weight:700;color:#333;margin-right:6px;line-height:33px;height:33px}.detail-title .bcui-popover-rel .trigger-ref{display:inline-block;margin-top:-11px}.detail-title .detail-popper-editor{display:none}.detail-title:hover .detail-popper-editor{display:block!important}.detail-meta{font-size:0;margin-top:9px;display:flex}.detail-meta .status,.detail-meta .type{display:inline-block;vertical-align:top;margin-right:16px;height:20px;line-height:20px;font-size:14px}.detail-meta .type{font-weight:bolder;color:#666}.detail-meta .desc{display:flex;line-height:20px;height:20px;font-size:14px;color:#999}.detail-meta .desc .detail-popper-editor{display:none;margin-top:3px;margin-left:4px}.detail-meta .desc:hover .detail-popper-editor{display:block!important}.detail-functions{float:right}.detail-info-prop{margin-top:24px}.detail-info-prop .title{margin:0 0 16px;font-size:14px;font-weight:800;color:#333}.detail-info-prop .title__text{height:20px;line-height:20px;vertical-align:middle}.detail-info-prop .title__icon{vertical-align:middle;color:#d4d4d4}.detail-info-prop .title__icon:hover{color:#333}.detail-info-prop .prop-item{margin-bottom:12px;display:flex}.detail-info-prop .prop-item .prop-key,.detail-info-prop .prop-item .prop-value{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;color:#333}.detail-info-prop .prop-item .prop-value .icon-copy{display:none;cursor:pointer;margin-left:6px;margin-top:-3px}.detail-info-prop .prop-item .prop-value:hover .icon-copy{display:inline-block;color:#2d77ee}.detail-info-prop .prop-item .prop-key{width:120px;flex:0 0 auto}.modal-text{font-size:14px;color:#333}.modal-text.subtitle{margin-bottom:8px;font-weight:500;line-height:20px}.modal-text.description{margin-bottom:16px;font-size:12px;color:#666}.modal-rect{display:flex;flex-wrap:wrap;width:100%;padding:12px 16px;margin-bottom:20px;background:#fbfbfc;border:1px solid #f2f3f5;border-radius:4px}.modal-rect__item{flex:0 0 auto;padding:0 8px;margin:8px 0;height:20px;line-height:20px;color:#444;font-size:14px;font-weight:300}.modal-rect__item .icon-cloud{vertical-align:middle;margin-right:8px}.modal-rect__item .bcui-tooltip{max-width:100%}.modal-rect__item .bcui-tooltip-rel{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:default}.bcui-modal-header{padding:32px 32px 24px;border:none}.bcui-modal-header-inner{color:#333;font-size:24px;font-weight:600}.bcui-modal-header-inner,.bcui-modal-header p{line-height:32px;height:32px}.bcui-modal-body{padding:0 32px}.bcui-modal-footer{padding:12px 32px 32px;border:none}.bcui-modal-close{color:#d6d9df;font-size:14px;font-weight:600;right:40px;top:40px;transition:all .3s}.bcui-modal-close:hover{color:#333}.bcui-form-item{margin-bottom:20px}.bcui-form-item__label{display:inline-block;padding:0 0 4px;font-size:14px;color:#333;position:relative}.bcui-form-item--required .bcui-form-item__label:before{content:"";display:none}.bcui-form-item--required .bcui-form-item__label:after{content:"*";display:inline-block;margin-right:4px;line-height:1;font-size:14px;font-weight:300;color:#2d77ee;position:absolute;top:0;right:-12px}.bcui-form-item-tooltip{position:absolute;top:0;right:-26px;color:#999}.bcui-form-item-tooltip:hover{color:#333}.bc-drawer-header{padding:32px 32px 24px;border:none}.bc-drawer-header__inner{color:#333;font-size:24px;font-weight:600;border:none}.bc-drawer-header__inner,.bc-drawer-header p{line-height:32px;height:32px}.bc-drawer-body{padding:0 60px}.bc-drawer-footer{padding:12px 32px 32px;border:none}.bc-drawer-close{color:#d6d9df;font-size:14px;font-weight:600;right:40px;top:40px;transition:all .3s}.bc-drawer-close:hover{color:#333} \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/static/index.html b/carrera-console/carrera-boot/src/main/resources/static/index.html new file mode 100644 index 0000000..7397db4 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/index.html @@ -0,0 +1,24 @@ + + + + + + DDMQ Console + + + + + + + +
+ + diff --git a/carrera-console/carrera-boot/src/main/resources/static/index.js b/carrera-console/carrera-boot/src/main/resources/static/index.js new file mode 100644 index 0000000..1579a83 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/index.js @@ -0,0 +1 @@ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var s in i)("object"==typeof exports?exports:e)[s]=i[s]}}(window,function(){return function(e){function t(t){for(var s,o,r=t[0],c=t[1],l=t[2],d=0,p=[];d1e7?i(new Error("Rate limit can not exceed 1000*10000")):t&&t<1?i(new Error("Rate limit must be greater than 0")):void i()}}],description:[{required:!0,message:"topic desc can not be empty."},{message:"Length must be less than 128 bits",max:128},{validator:function(e,t,i){if(/^\s*$/.test(t))return i(new Error("Cannot enter a null character"));i()}}]}},118:function(e,t){t.createSub={topicId:{required:!0,message:"Please select topic"},groupId:{required:!0,message:"Please select consumer group"},maxTps:[{required:!0,message:"Please input Consume maxTps"},{pattern:/^\d+(\.\d+)?$/,message:"Please input integer or float type"},{validator:function(e,t,i){return t>1e7?i(new Error("MaxTps can not exceed 1000w")):0==t?i(new Error("MaxTps must be greater than 0")):void i()}}],consumeTimeout:[{pattern:/^\d*$/,message:"Please input integer"},{validator:function(e,t,i){return t>72e5?i(new Error("Can not exceed 5 day")):t&&t<1?i(new Error("Must be greater than 1ms")):void i()}}],errorRetryTimes:[{pattern:/-1|^\d+$/,message:"Must be integer and greater than -1"},{validator:function(e,t,i){if(t>1e4)return i(new Error("Can not exceed 10000"));i()}}],retryIntervals:[{max:1024,message:"Can not exceed 1024 bytes"},{pattern:/^((-1|[0-9])+[;]?)*$/,message:"Must be integer and split by ;"}],apiType:{required:!0,message:"Please select Api Level"},msgType:{required:!0,message:"Please select Message type"},enableOrder:{required:!0,message:"Please select Enable sequential consume"},consumeType:{required:!0,message:"Please select Consume type"},orderKey:{required:!0,message:"Please select Basis ordering rules"},enableGroovy:{required:!0,message:"Please select Enable groovyScript"},groovy:{required:!0,message:"Please input GroovyScript"},enableTransit:{required:!0,message:"Please select Enable transit"},httpMethod:{required:!0,message:"Please select HttpMethod"},msgPushType:{required:!0,message:"Please select Message push type"},pushMaxConcurrency:[{required:!0,message:"Please input Push max concurrency"},{pattern:/^\d*$/,message:"Must be integer"},{validator:function(e,t,i){return t>1e5?i(new Error("Can not exceed 100000")):t<1?i(new Error("Must be greater than 1")):void i()}}],queryParams:{required:!0,message:"Please input QueryParams"},bigDataType:{required:!0,message:"Please select Write type"},bigDataConfig:{required:!0,message:"Please input Write config"}}},119:function(e,t){t.createGroup={groupName:[{required:!0,message:"Please input consumer group"},{pattern:/^[A-Za-z0-9_-]*$/,message:"Contain only letters, numbers, underscore(_) and dashes(-)"}]}},144:function(e,t,i){"use strict";var s=i(35);i.n(s).a},148:function(e,t,i){"use strict";var s=i(36);i.n(s).a},149:function(e,t,i){"use strict";var s=i(37);i.n(s).a},150:function(e,t,i){"use strict";var s=i(38);i.n(s).a},151:function(e,t,i){"use strict";var s=i(39);i.n(s).a},152:function(e,t,i){"use strict";var s=i(40);i.n(s).a},153:function(e,t,i){"use strict";var s=i(41);i.n(s).a},154:function(e,t,i){"use strict";var s=i(42);i.n(s).a},155:function(e,t,i){"use strict";var s=i(43);i.n(s).a},156:function(e,t,i){"use strict";var s=i(44);i.n(s).a},157:function(e,t,i){"use strict";var s=i(45);i.n(s).a},158:function(e,t,i){"use strict";var s=i(46);i.n(s).a},159:function(e,t,i){"use strict";var s=i(47);i.n(s).a},160:function(e,t,i){"use strict";var s=i(48);i.n(s).a},161:function(e,t,i){"use strict";var s=i(49);i.n(s).a},162:function(e,t,i){"use strict";var s=i(50);i.n(s).a},163:function(e,t,i){"use strict";var s=i(51);i.n(s).a},164:function(e,t,i){"use strict";var s=i(52);i.n(s).a},165:function(e,t,i){"use strict";var s=i(53);i.n(s).a},167:function(e,t,i){"use strict";var s=i(54);i.n(s).a},168:function(e,t,i){"use strict";var s=i(55);i.n(s).a},201:function(e,t,i){"use strict";var s=i(56);i.n(s).a},202:function(e,t,i){"use strict";var s=i(57);i.n(s).a},203:function(e,t,i){"use strict";var s=i(58);i.n(s).a},204:function(e,t,i){"use strict";var s=i(59);i.n(s).a},205:function(e,t,i){"use strict";var s=i(60);i.n(s).a},206:function(e,t,i){},207:function(e,t,i){"use strict";var s=i(61);i.n(s).a},208:function(e,t,i){"use strict";var s=i(62);i.n(s).a},209:function(e,t,i){"use strict";var s=i(63);i.n(s).a},210:function(e,t,i){"use strict";var s=i(64);i.n(s).a},211:function(e,t,i){"use strict";var s=i(65);i.n(s).a},212:function(e,t,i){},213:function(e,t,i){"use strict";var s=i(66);i.n(s).a},214:function(e,t,i){"use strict";var s=i(67);i.n(s).a},215:function(e,t,i){"use strict";var s=i(68);i.n(s).a},217:function(e,t,i){var s={"./apl/apl.js":218,"./asciiarmor/asciiarmor.js":219,"./asn.1/asn.1.js":220,"./asterisk/asterisk.js":221,"./brainfuck/brainfuck.js":222,"./clike/clike.js":84,"./clojure/clojure.js":223,"./cmake/cmake.js":224,"./cobol/cobol.js":225,"./coffeescript/coffeescript.js":105,"./commonlisp/commonlisp.js":226,"./crystal/crystal.js":227,"./css/css.js":22,"./cypher/cypher.js":228,"./d/d.js":229,"./dart/dart.js":230,"./diff/diff.js":231,"./django/django.js":232,"./dockerfile/dockerfile.js":233,"./dtd/dtd.js":234,"./dylan/dylan.js":235,"./ebnf/ebnf.js":236,"./ecl/ecl.js":237,"./eiffel/eiffel.js":238,"./elm/elm.js":239,"./erlang/erlang.js":240,"./factor/factor.js":241,"./fcl/fcl.js":242,"./forth/forth.js":243,"./fortran/fortran.js":244,"./gas/gas.js":245,"./gfm/gfm.js":246,"./gherkin/gherkin.js":247,"./go/go.js":248,"./groovy/groovy.js":249,"./haml/haml.js":250,"./handlebars/handlebars.js":107,"./haskell-literate/haskell-literate.js":251,"./haskell/haskell.js":108,"./haxe/haxe.js":252,"./htmlembedded/htmlembedded.js":253,"./htmlmixed/htmlmixed.js":7,"./http/http.js":254,"./idl/idl.js":255,"./javascript/javascript.js":16,"./jinja2/jinja2.js":256,"./jsx/jsx.js":257,"./julia/julia.js":258,"./livescript/livescript.js":259,"./lua/lua.js":260,"./markdown/markdown.js":106,"./mathematica/mathematica.js":261,"./mbox/mbox.js":262,"./meta.js":83,"./mirc/mirc.js":263,"./mllike/mllike.js":264,"./modelica/modelica.js":265,"./mscgen/mscgen.js":266,"./mumps/mumps.js":267,"./nginx/nginx.js":268,"./nsis/nsis.js":269,"./ntriples/ntriples.js":270,"./octave/octave.js":271,"./oz/oz.js":272,"./pascal/pascal.js":273,"./pegjs/pegjs.js":274,"./perl/perl.js":275,"./php/php.js":276,"./pig/pig.js":277,"./powershell/powershell.js":278,"./properties/properties.js":279,"./protobuf/protobuf.js":280,"./pug/pug.js":109,"./puppet/puppet.js":281,"./python/python.js":110,"./q/q.js":282,"./r/r.js":283,"./rpm/rpm.js":284,"./rst/rst.js":285,"./ruby/ruby.js":85,"./rust/rust.js":286,"./sas/sas.js":287,"./sass/sass.js":112,"./scheme/scheme.js":288,"./shell/shell.js":289,"./sieve/sieve.js":290,"./slim/slim.js":291,"./smalltalk/smalltalk.js":292,"./smarty/smarty.js":293,"./solr/solr.js":294,"./soy/soy.js":295,"./sparql/sparql.js":296,"./spreadsheet/spreadsheet.js":297,"./sql/sql.js":298,"./stex/stex.js":111,"./stylus/stylus.js":113,"./swift/swift.js":299,"./tcl/tcl.js":300,"./textile/textile.js":301,"./tiddlywiki/tiddlywiki.js":302,"./tiki/tiki.js":303,"./toml/toml.js":304,"./tornado/tornado.js":305,"./troff/troff.js":306,"./ttcn-cfg/ttcn-cfg.js":307,"./ttcn/ttcn.js":308,"./turtle/turtle.js":309,"./twig/twig.js":310,"./vb/vb.js":311,"./vbscript/vbscript.js":312,"./velocity/velocity.js":313,"./verilog/verilog.js":314,"./vhdl/vhdl.js":315,"./vue/vue.js":316,"./webidl/webidl.js":317,"./xml/xml.js":23,"./xquery/xquery.js":318,"./yacas/yacas.js":319,"./yaml-frontmatter/yaml-frontmatter.js":320,"./yaml/yaml.js":114,"./z80/z80.js":321};function a(e){var t=n(e);return i(t)}function n(e){var t=s[e];if(!(t+1)){var i=new Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}return t}a.keys=function(){return Object.keys(s)},a.resolve=n,e.exports=a,a.id=217},3:function(e,t){t.SUBSCRIBE_ENABLE=0,t.SUBSCRIBE_DISABLE=1,t.TOPIC_DELAY_ENABLE=0,t.TOPIC_DELAY_DISABLE=1,t.GROUP_ALARM_ENABLE=0,t.GROUP_ALARM_DISABLE=1,t.SUBSCRIBE_CONSUMETYPE_SDK=1,t.SUBSCRIBE_CONSUMETYPE_HTTP=2,t.SUBSCRIBE_CONSUMETYPE_OTHER=3,t.SUBSCRIBE_MSGTYPE_JSON=1,t.SUBSCRIBE_MSGTYPE_TEXT=2,t.SUBSCRIBE_MSGTYPE_BYTES=3,t.SUBSCRIBE_GROOVY_ENABLE=0,t.SUBSCRIBE_GROOVY_DISABLE=1,t.SUBSCRIBE_TRANSIT_ENABLE=0,t.SUBSCRIBE_TRANSIT_DISABLE=1,t.SUBSCRIBE_ORDER_ENABLE=0,t.SUBSCRIBE_ORDER_DISABLE=1,t.SUBSCRIBE_ORDERKEY_QID="QID",t.SUBSCRIBE_ORDERKEY_KEY="KEY",t.SUBSCRIBE_ORDERKEY_JSONPATH="JsonPath",t.SUBSCRIBE_WRITETYPE_HDFS=0,t.SUBSCRIBE_WRITETYPE_HBASE=1,t.SUBSCRIBE_WRITETYPE_REDIS=2,t.SUBSCRIBE_HTTPMETHOD_POST=0,t.SUBSCRIBE_HTTPMETHOD_GET=1,t.SUBSCRIBE_PRESSURE_ENABLE=1,t.SUBSCRIBE_PRESSURE_DISABLE=0,t.SUBSCRIBE_API_HIGHT_LEVEL=1,t.SUBSCRIBE_API_LOW_LEVEL=2},322:function(e,t,i){var s={"./3024-day.css":323,"./3024-night.css":324,"./abcdef.css":325,"./ambiance-mobile.css":326,"./ambiance.css":327,"./base16-dark.css":328,"./base16-light.css":329,"./bespin.css":330,"./blackboard.css":331,"./cobalt.css":332,"./colorforth.css":333,"./darcula.css":334,"./dracula.css":335,"./duotone-dark.css":336,"./duotone-light.css":337,"./eclipse.css":338,"./elegant.css":339,"./erlang-dark.css":340,"./gruvbox-dark.css":341,"./hopscotch.css":342,"./icecoder.css":343,"./idea.css":344,"./isotope.css":345,"./lesser-dark.css":346,"./liquibyte.css":347,"./lucario.css":348,"./material.css":349,"./mbo.css":350,"./mdn-like.css":351,"./midnight.css":352,"./monokai.css":353,"./neat.css":354,"./neo.css":355,"./night.css":356,"./oceanic-next.css":357,"./panda-syntax.css":358,"./paraiso-dark.css":359,"./paraiso-light.css":360,"./pastel-on-dark.css":361,"./railscasts.css":362,"./rubyblue.css":363,"./seti.css":364,"./shadowfox.css":365,"./solarized.css":366,"./ssms.css":367,"./the-matrix.css":368,"./tomorrow-night-bright.css":369,"./tomorrow-night-eighties.css":370,"./ttcn.css":371,"./twilight.css":372,"./vibrant-ink.css":373,"./xq-dark.css":374,"./xq-light.css":375,"./yeti.css":376,"./zenburn.css":377};function a(e){var t=n(e);return i(t)}function n(e){var t=s[e];if(!(t+1)){var i=new Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}return t}a.keys=function(){return Object.keys(s)},a.resolve=n,e.exports=a,a.id=322},33:function(e,t,i){"use strict";var s=i(34),a=i.n(s);t.default=a.a},34:function(e,t){},35:function(e,t,i){},36:function(e,t,i){},37:function(e,t,i){},379:function(e,t,i){},38:function(e,t,i){},380:function(e,t,i){},381:function(e,t,i){"use strict";i.r(t);var s={};i.r(s),i.d(s,"setToken",function(){return _}),i.d(s,"getToken",function(){return y}),i.d(s,"removeToken",function(){return S});var a=i(4),n=i.n(a),o=i(69),r=i.n(o),c=new n.a,l=i(115),u=i(116),d=i.n(u),p=i(18),h=i.n(p),f=i(87);function m(){for(var e={},t=0;t2&&void 0!==arguments[2]?arguments[2]:[],s=e.$children;return s.length&&s.forEach(function(e){var s=e.$options.name,a=e.$children;if(s===t&&i.push(e),a.length){var n=V(e,t,i);n&&i.concat(n)}}),i}var U;j.newInstance=function(e){var t=e||{},i="";Object.keys(t).forEach(function(e){i+=" :"+z(e)+"="+e});var s=document.createElement("div");s.innerHTML=""),document.body.appendChild(s);var a=new n.a({el:s,data:t,components:{Notification:j}}).$children[0];return{notice:function(e){a.add(e)},remove:function(e){a.close(e)},component:a,destroy:function(){document.body.removeChild(s)}}};var F,W,H=j,K="bcui-message",Q="bcui-icon",Y="bcui_message_key_",J=1500,X=1,Z={info:"info",success:"confirm",warning:"alert",error:"error",loading:"loading"};function ee(){return W=W||H.newInstance({classPrefix:K,styles:{top:"".concat(F,"px")}})}function te(e){var t,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s="string"==typeof i?i:i.content,a=0===i.duration?0:J,n=i.onClose||function(){},o=i.render||function(){},r=i.closable||!1,c=Z[e],l="loading"===e?" bcui-load-loop":"",u=ee();return u.notice({name:"".concat(Y).concat(X),duration:a,styles:{},transitionName:"move-up",content:'\n
\n \n ').concat(s,"\n
\n "),render:o,closable:r,onClose:n}),t=X++,function(){u.remove("".concat(Y).concat(t))}}var ie={info:function(e){return te("info",e)},success:function(e){return te("success",e)},warning:function(e){return te("warning",e)},warn:function(e){return te("warning",e)},error:function(e){return te("error",e)},loading:function(e){return te("loading",e)},config:function(e){e.top&&(F=e.top),e.duration&&(J=e.duration)},destroy:function(){var e=ee();W=null,e.destroy()}},se=!1,ae=r.a.create({headers:{"X-Requested-With":"XMLHttpRequest"},withCredentials:!0});function ne(e,t,i){var s=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{enable:!0};this.$notice.config({duration:4e3}),e=e.toLowerCase(),["post","put","delete"].includes(e)&&(i.contentType="json");var n="",o={enable:!0,successTitle:"Operation success",successMessage:"",failTitle:"Operation failed",failMessage:""};["post","put","delete"].includes(e)&&(o.successTitle="Operation success",o.failTitle="Operation failed",n="$notice"),"get"===e&&(o.successTitle="Request success",o.failTitle="Request failed",n="$notice"),a=Object.assign({},o,a);return ae[e](t,i).then(function(t){if(a.enable&&function(t){var i=a.failMessage||t.errmsg||"Unknow error";if(t.errno)throw s[n].error({title:a.failTitle,duration:0,desc:"Error code: ".concat(t.errno," \n ErrorMessage: ").concat(i)}),new Error(t.errmsg);var o=0===t.errno;"get"!==e||o||s[n].error({title:a.failTitle,desc:"ErrorMessage: ".concat(i),duration:0}),["post","put","delete"].includes(e)&&(o?s[n].success({title:a.successTitle,desc:a.successMessage}):s[n].error({title:a.successTitle,desc:a.successMessage,duration:0}))}(t.data),0===t.data.errno)return t.data}).catch(function(){})}ae.interceptors.response.use(function(e){return se=!1,e},function(e){return 401===e.response.status&&(se||ie.info("Not logging"),Ut.push({name:"login"}),se=!0),Promise.reject(e)});var oe={methods:{request:ne,fetchAllTopicList:function(e){return this.request("get","/carrera/api/console/topic/listAll",e)},fetchTopicStatistics:function(e){return this.request("get","/carrera/api/console/topic/getState",e)},fetchGroupsByTopic:function(e){return this.request("get","/carrera/api/console/topic/listGroup",e)},fectchMessages:function(e){return this.request("get","/carrera/api/console/topic/getMessage",e)},sendMessage:function(e){return this.request("post","/carrera/api/console/topic/sendMsg",e)},fetchTopicDetail:function(e){return this.request("get","/carrera/api/console/topic/findById",e)},createTopic:function(e){return this.request("post","/carrera/api/odin/internal/createTopic",e)},send:function(e,t){var i=this;this.$modal.confirm({title:"你确定要发送消息吗?",content:"Topic名为:".concat(e.topicName),buttonType:"warning",onOk:function(){var s=this,a={topicId:e.topicId,msg:e.msg};i.sendMessage(a).then(function(e){"ok"===e.message?s.$message.success("操作成功,已发送信息,key为"+e.data.key):t()})}})}}},re=i(3),ce=i.n(re),le={topic:{consumeTypes:[{label:"SDK Pull",value:ce.a.SUBSCRIBE_CONSUMETYPE_SDK},{label:"HTTP Push",value:ce.a.SUBSCRIBE_CONSUMETYPE_HTTP},{label:"Write to Third party components",value:ce.a.SUBSCRIBE_CONSUMETYPE_OTHER}],delayStates:[{label:"Enable",value:ce.a.TOPIC_DELAY_ENABLE},{label:"Disable",value:ce.a.TOPIC_DELAY_DISABLE}],states:[{label:"Enable",value:ce.a.SUBSCRIBE_ENABLE,className:"state--enable"},{label:"Disable",value:ce.a.SUBSCRIBE_DISABLE,className:"state--disable"}],alarmStates:[{label:"Enable",value:ce.a.GROUP_ALARM_ENABLE,className:"state--enable"},{label:"Disable",value:ce.a.SUBSCRIBE_GROOVY_DISABLE,className:"state--disable"}],msgTypes:[{label:"Json",value:ce.a.SUBSCRIBE_CONSUMETYPE_SDK},{label:"Text",value:ce.a.SUBSCRIBE_CONSUMETYPE_HTTP},{label:"Bytes",value:ce.a.SUBSCRIBE_CONSUMETYPE_OTHER}],groovyStates:[{label:"Enable",value:ce.a.SUBSCRIBE_GROOVY_ENABLE,className:"state--enable"},{label:"Disable",value:ce.a.SUBSCRIBE_GROOVY_DISABLE,className:"state--disable"}],transitStates:[{label:"Enable",value:ce.a.SUBSCRIBE_TRANSIT_ENABLE,className:"state--enable"},{label:"Disable",value:ce.a.SUBSCRIBE_TRANSIT_DISABLE,className:"state--disable"}],pressureTrafficStates:[{label:"Enable",value:ce.a.SUBSCRIBE_PRESSURE_ENABLE,className:"state--enable"},{label:"Disable",value:ce.a.SUBSCRIBE_PRESSURE_DISABLE,className:"state--disable"}],orderStates:[{label:"Enable",value:ce.a.SUBSCRIBE_ORDER_ENABLE,className:"state--enable"},{label:"Disable",value:ce.a.SUBSCRIBE_ORDER_DISABLE,className:"state--disable"}],orderKeyTypes:[{label:"QID",value:ce.a.SUBSCRIBE_ORDERKEY_QID},{label:"KEY",value:ce.a.SUBSCRIBE_ORDERKEY_KEY},{label:"JsonPath",value:ce.a.SUBSCRIBE_ORDERKEY_JSONPATH}],writeTypes:[{label:"HDFS",value:ce.a.SUBSCRIBE_WRITETYPE_HDFS},{label:"HBASE",value:ce.a.SUBSCRIBE_WRITETYPE_HBASE},{label:"REDIS",value:ce.a.SUBSCRIBE_WRITETYPE_REDIS}],httpMethodTypes:[{label:"POST",value:ce.a.SUBSCRIBE_HTTPMETHOD_POST},{label:"GET",value:ce.a.SUBSCRIBE_HTTPMETHOD_GET}],apiTypes:[{label:"Low level",value:ce.a.SUBSCRIBE_API_LOW_LEVEL},{label:"High level",value:ce.a.SUBSCRIBE_API_HIGHT_LEVEL}]}},ue={data:function(){return{dict:le}},methods:{validateForm:function(e){var t=!1;return this.$refs[e].validate(function(e){t=e}),t},dictTranslate:function(e,t,i){var s=le[e][t],a="";return s.map(function(e){i===e.value&&(a=e.label||e.value)}),a||i},coloringText:function(e,t,i,s){var a="";return le[e][t].map(function(e){i===e.value&&(a=e[s]||e.className)}),a},formatMap:function(e){var t=this;if(1===e.length&&""===e[0].key)return{};var i={};return e.map(function(e){t.$set(i,e.key,e.value)}),i},formatObject:function(e){if(e&&Object.keys(e).length){var t=[];return Object.keys(e).filter(function(e){return e}).forEach(function(i){t.push({key:i,value:e[i]})}),t}return[{key:"",value:""}]},getNameById:function(e,t){var i="";return t.forEach(function(t){e&&t.value===e&&(i=t.label)}),i},formatUrlObject:function(e,t){if(e.length)return t=[],Object.keys(e).forEach(function(i){t.push({key:e[i]})}),t}}},de=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{staticClass:"create-topic-modal",attrs:{title:e.title,offsetTop:40,width:610},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"topic-create"},[i("bc-form",{ref:"form",staticClass:"clearfix",attrs:{width:540,model:e.form,rules:e.topicFormRule,labelAlign:"top"}},[i("bc-form-item",{attrs:{label:"Topic",prop:"topicName"}},[i("bc-input",{attrs:{disabled:e.isEditing,placeholder:"Please input Topic name"},model:{value:e.form.topicName,callback:function(t){e.$set(e.form,"topicName",t)},expression:"form.topicName"}})],1),e._v(" "),i("div",{staticClass:"alert-message"},[i("div",[e._v("1. The topic name can contain only letters, numbers, underscore(_)and dashes(-)")]),e._v(" "),i("div",[e._v("2. Once created can't modify the Topic name")])]),e._v(" "),i("bc-form-item",{attrs:{label:"Delay Topic ",prop:"delayTopic"}},[i("bc-select",{attrs:{placehold:"Please select"},model:{value:e.form.delayTopic,callback:function(t){e.$set(e.form,"delayTopic",e._n(t))},expression:"form.delayTopic"}},e._l(e.dict.topic.delayStates,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),i("bc-form-item",{attrs:{label:"Topic Description",prop:"description"}},[i("bc-input",{attrs:{type:"textarea",rows:4,placeholder:"topic description information."},model:{value:e.form.description,callback:function(t){e.$set(e.form,"description",t)},expression:"form.description"}})],1),e._v(" "),i("bc-form-item",{attrs:{label:"Rate Limit",prop:"produceTps"}},[i("bc-input",{attrs:{type:"text"},model:{value:e.form.produceTps,callback:function(t){e.$set(e.form,"produceTps",t)},expression:"form.produceTps"}},[i("span",{attrs:{slot:"append"},slot:"append"},[e._v("msg/s")])])],1),e._v(" "),i("bc-form-item",{attrs:{label:"Additional Parameters"}},[e._l(e.others,function(t,s){return i("div",{key:s,staticClass:"conf-margin"},[i("bc-input",{staticStyle:{width:"240px","margin-right":"10px"},attrs:{placeholder:"key"},model:{value:t.key,callback:function(i){e.$set(t,"key",i)},expression:"item.key"}}),e._v(" "),i("bc-input",{staticStyle:{width:"240px"},attrs:{placeholder:"value"},model:{value:t.value,callback:function(i){e.$set(t,"value",i)},expression:"item.value"}}),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(i){e.removeOther(t)}}},[e.others.length>1?i("bc-icon",{attrs:{type:"trash"}}):e._e()],1)],1)}),e._v(" "),i("div",[i("span",{staticClass:"text-link",on:{click:function(t){e.addOther()}}},[e._v("Add additional parameters")])])],2)],1)],1),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.handleCreateTopic}},[e._v("Submit")])],1)],2):e._e()};de._withStripped=!0;var pe=i(117),he={name:"create-topic-modal",mixins:[oe,ue],components:{},props:{value:{type:Boolean,default:!1},topic:{type:Object,default:function(){return{}}}},data:function(){return{title:"Create Topic",isSubmitting:!1,isEditing:!1,others:[{key:"",value:""}],form:{topicId:"",topicName:"",remark:"",produceMode:0,conf:[],delayTopic:ce.a.TOPIC_DELAY_DISABLE,enableSchemaVerify:!1,produceTps:1024},topicFormRule:pe.createTopic,topicDesc:{},showConfOperationParams:!1}},computed:{show:{get:function(){var e=this;return this.value&&Object.keys(this.topic).length&&(this.isEditing=!0,this.title="Edit topic",this.$nextTick(function(){e.form=JSON.parse(JSON.stringify(e.topic)),e.form.produceTps=e.topic.conf[0].produceTps,e.form.delayTopic=e.topic.delayTopic}),this.others=this.formatObject(this.topic.extraParams)),this.value},set:function(){}}},methods:{cancel:function(){this.isSubmitting=!1,this.isEditing=!1,this.title="Create Topic",this.others=[{key:"",value:""}],this.$refs.form.resetFields(),this.$emit("input",!1)},addOther:function(){this.others.push({key:"",value:""})},removeOther:function(e){var t=this.others.indexOf(e);-1!==t&&this.others.splice(t,1)},handleCreateTopic:function(){var e=this,t=this.form;if(!this.validateForm("form"))return this.isSaveLoading=!1,void this.$notice.error({title:"Please checkout form",duration:0});this.isSubmitting=!0;var i={user:"administration",topicId:this.isEditing?t.topicId:0,topicName:t.topicName,service:"Engineering",department:"Software",contacters:"administration;",schema:null,alarmGroup:null,description:t.description,extraParams:{},delayTopic:t.delayTopic,needAuditSubinfo:1,produceMode:0,conf:[],enableSchemaVerify:1,operationParams:null};i.extraParams=this.formatMap(this.others),i.conf=[{clusterId:1,clusterName:"ddmq",clientIdcMap:null,clusterDesc:null,serverIdcId:1,serverIdcName:"default",operationParams:null,msgMaxSize:1024,msgAvgSize:1024,produceTps:t.produceTps,mqServerId:1,mqServerName:"R_default"}],this.createTopic(i).then(function(t){0===t.errno&&(e.$root.bus.$emit("updateTopicList"),e.cancel())}).finally(function(){e.isSaveLoading=!1,e.isSubmitting=!1})},init:function(){},getEditInitData:function(e){this.form=e}},watch:{},mounted:function(){this.init()}},fe=(i(148),Object(P.a)(he,de,[],!1,null,null,null));fe.options.__file="src/pages/topic/modals/create.vue";var me=fe.exports,ve=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content samplingPage"},[i("div",{staticClass:"detail-block"},[i("div",{staticClass:"detail-block-header"},[i("div",{staticClass:"detail-title"},[e._v("Sampling")]),e._v(" "),i("div",{staticClass:"detail-button"},[i("bc-button",{attrs:{type:"primary",loading:e.loading},on:{click:function(t){e.handleResampling()}}},[e._v("Resampling")]),e._v(" "),i("bc-button",{attrs:{type:"primary"},on:{click:function(t){e.handleCopyMessage()}}},[e._v("Copy MessageBody")])],1)]),e._v(" "),i("div",{staticClass:"detail-block-body"},[i("bc-row",{attrs:{gutter:48}},[i("bc-col",{attrs:{span:"24"}},[i("div",{staticClass:"detail-info-prop"},[i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Topic")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.topicName))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Qid")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.qid||"-"))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Offset")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.offset))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("MessageBody")]),e._v(" "),i("codemirror",{attrs:{options:e.editorOptions,disabled:""},model:{value:e.basicInfo.msg,callback:function(t){e.$set(e.basicInfo,"msg",t)},expression:"basicInfo.msg"}})],1)])])],1)],1)])])};ve._withStripped=!0;var be=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{staticClass:"send-message-modal",attrs:{title:e.title,offsetTop:40,width:610},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"send-message"},[i("bc-form",{ref:"form",staticClass:"clearfix",attrs:{width:540,model:e.form,rules:e.formRule,labelAlign:"top"}},[i("bc-form-item",{attrs:{label:"Message:",prop:"message"}},[i("bc-input",{attrs:{placeholder:"Please input message",type:"textarea",rows:5},model:{value:e.form.message,callback:function(t){e.$set(e.form,"message",t)},expression:"form.message"}})],1)],1)],1),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.handleSendMessage}},[e._v("Submit")])],1)],2):e._e()};be._withStripped=!0;var ge={name:"create-group-modal",mixins:[oe,ue],components:{},props:{value:{type:Boolean,default:!1},topic:{type:Object,default:function(){return{}}}},data:function(){return{title:"Send message",isSubmitting:!1,form:{message:""},formRule:{message:{required:!0,message:"Please input message"}}}},computed:{show:{get:function(){return this.value},set:function(){}}},methods:{cancel:function(){this.isSubmitting=!1,this.$refs.form.resetFields(),this.$emit("input",!1)},handleSendMessage:function(){var e=this,t=this.form;if(this.validateForm("form")){this.isSubmitting=!0;var i={user:"administration",topicId:this.topic.topicId,topicName:this.topic.topicName,msg:t.message};this.sendMessage(i).then(function(t){e.cancel()}).finally(function(){e.isSubmitting=!1})}else this.$notice.error({title:"Please checkout form",duration:0})}},watch:{}},_e=(i(149),Object(P.a)(ge,be,[],!1,null,null,null));_e.options.__file="src/pages/topic/modals/send-message.vue";var ye={name:"topic-sampling",mixins:[oe,ue],components:{SendMessageModal:_e.exports},props:{topicId:{type:Number,default:0}},data:function(){return{basicInfo:{},editorOptions:{tabSize:4,mode:"text/javascript",theme:"base16-light",lineNumbers:!0,line:!0,readOnly:!0,lineWrapping:!0},loading:!1,sendmessageModalStatus:!1,isSubscribe:!1}},methods:{handleSendMessage:function(){this.sendmessageModalStatus=!0},handleResampling:function(){this.loading=!0,this.getSampling("reSampling")},handleCopyMessage:function(){this.$clipboard(this.basicInfo.msg),this.$notice.success({title:"复制成功"})},getSampling:function(e){var t=this,i={topicId:this.topicId,clusterId:1,user:"administration"};this.fectchMessages({params:i}).then(function(i){t.basicInfo=i.data,e&&0===i.errno&&t.$notice.success({title:"Resampling success"})}).finally(function(){t.loading=!1})},init:function(){this.getSampling(),Object.keys(this.$route.query)&&(this.isSubscribe=!0)},goBack:function(){this.isSubscribe?this.$router.push({name:"subscribes"}):this.$router.push({name:"topics"})}},mounted:function(){this.init()}},Se=(i(150),Object(P.a)(ye,ve,[],!1,null,null,null));Se.options.__file="src/pages/topic/modals/message.vue";var Ce=Se.exports,ke={name:"topics",mixins:[oe,ue],components:{CreateTopicModal:me,messageDetail:Ce},data:function(){return{topicList:[],loading:!0,pagination:{totalNum:0,curPage:1,pageSize:10},topicData:{},filter:{text:""},createTopicModalStatus:!1,messageStatus:!1,topicId:""}},methods:{handleGetMessage:function(e){this.messageStatus=!0,this.title="Sampling( Topic:"+e.topicName+")",this.topicId=e.topicId},cancel:function(){this.messageStatus=!1},handleEditTopic:function(e){this.createTopicModalStatus=!0,this.topicData=e},getMessages:function(e,t){this.$router.push("/message/".concat(e,"/").concat(t))},handelSearch:function(){var e=this,t=this.filter;""!==t.text?(clearTimeout(this.timer),this.timer=setTimeout(function(){var i={text:t.text};localStorage.setItem("topics_search_keyword",JSON.stringify(i)),e.getUserTopicList()},500)):(this.getUserTopicList(),localStorage.setItem("topics_search_keyword",""))},getUserTopicList:function(e){var t=this,i=this.pagination,s=this.filter;e=Object.assign({},{curPage:i.curPage,pageSize:i.pageSize,text:s.text,clusterId:1,user:"administration"},e),this.loading=!0,this.fetchAllTopicList({params:e}).then(function(e){t.topicList=e.data.list,t.pagination.totalNum=e.data.totalSize}).finally(function(){t.loading=!1})},refreshWhenPageChange:function(e){this.pagination.curPage=e,this.getUserTopicList()},refreshWhenPageSizeChange:function(e){this.pagination.pageSize=e,this.getUserTopicList()},initUserTopicList:function(){var e=this,t=localStorage.getItem("topics_search_keyword");t?(t=JSON.parse(t),Object.keys(this.filter).forEach(function(i){var s=t[i];s&&(e.filter[i]=s)}),this.getUserTopicList()):this.getUserTopicList()},init:function(){this.initUserTopicList(),this.$root.bus.$on("updateTopicList",this.getUserTopicList)},goTopicEdit:function(e){this.$router.push("/topics/create/".concat(e))},handleCreateTopic:function(){this.topicData={},this.createTopicModalStatus=!0}},watch:{},mounted:function(){this.init()}},we=(i(151),Object(P.a)(ke,C,[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"block-header"},[t("div",{staticClass:"block-header__title"},[this._v("Topic List")])])}],!1,null,null,null));we.options.__file="src/pages/topic/index.vue";var xe=we.exports,Te=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content"},[i("div",{staticClass:"detail-block"},[i("div",{staticClass:"detail-block-nav clearfix"},[i("div",{staticClass:"detail-block-nav__back",on:{click:e.goBack}},[i("bc-icon",{attrs:{type:"chevron-left"}}),i("span",[e._v("Back to list")])],1)]),e._v(" "),i("div",{staticClass:"detail-block-header"},[i("div",{staticClass:"detail-info"},[i("div",{staticClass:"detail-title"},[i("div",{staticClass:"detail-title__value"},[e._v(e._s(e.basicInfo.topicName))])])]),e._v(" "),i("div",{staticClass:"detail-functions"},[i("bc-button",{attrs:{type:"primary"},on:{click:function(t){e.handleGetMessage(e.basicInfo)}}},[e._v("Sampling")])],1)]),e._v(" "),i("div",{staticClass:"detail-block-body"},[i("bc-tab",{on:{"on-tab-click":e.clickTabs},model:{value:e.currentTab,callback:function(t){e.currentTab=t},expression:"currentTab"}},[i("bc-tab-pane",{attrs:{name:"info",label:"Detail"}},[Object.keys(e.basicInfo).length?i("bc-row",{attrs:{gutter:48}},[i("bc-col",{attrs:{span:"6"}},[i("div",{staticClass:"detail-info-prop"},[i("div",{staticClass:"title"},[e._v("Basic Information")]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Topic")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.topicName))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("DelayTopic")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.delayTopic?"false":"true"))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Cluster")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.conf[0].clusterName))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Rate Limit TPS")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.conf[0].produceTps))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("msgMaxSize")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.conf[0].msgMaxSize))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("msgAvgSize")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.conf[0].msgAvgSize))])]),e._v(" "),i("div",{staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v("Description")]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(e.basicInfo.description))])])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"detail-info-prop"},[i("div",{staticClass:"title"},[e._v("Additional Parameters")]),e._v(" "),e._l(e.basicInfo.extraParams,function(t,s){return i("div",{key:s,staticClass:"prop-item"},[i("div",{staticClass:"prop-key"},[e._v(e._s(s))]),e._v(" "),i("div",{staticClass:"prop-value"},[e._v(e._s(t))])])})],2)])],1):e._e()],1),e._v(" "),i("bc-tab-pane",{attrs:{name:"group",label:"Consumer Group"}}),e._v(" "),i("bc-tab-pane",{attrs:{name:"statistic",label:"Statistics"}})],1),e._v(" "),i("router-view")],1)]),e._v(" "),e.messageStatus?i("bc-drawer",{on:{"on-cancel":e.cancel},model:{value:e.messageStatus,callback:function(t){e.messageStatus=t},expression:"messageStatus"}},[i("messageDetail",{attrs:{topicId:e.topicId}})],1):e._e()],1)};Te._withStripped=!0;var $e={name:"topic-detail",mixins:[oe,ue],components:{messageDetail:Ce},data:function(){return{basicInfo:{},currentTab:"info",messageStatus:!1,topicId:""}},methods:{handleGetMessage:function(e){this.messageStatus=!0,this.title="Sampling( Topic:"+e.topicName+")",this.topicId=e.topicId},cancel:function(){this.messageStatus=!1},clickTabs:function(e){var t=this.$route.params.id;"info"!==e?this.$router.push({path:"/topics/".concat(t,"/").concat(e)}):this.$router.push({path:"/topics/".concat(t)})},getTopicDetail:function(e){var t=this,i={topicId:e,user:"administration"};this.fetchTopicDetail({params:i}).then(function(e){t.basicInfo=e.data})},init:function(){var e=this.$route.params.id;this.getTopicDetail(e)},goBack:function(){this.$router.push({name:"topics"})}},mounted:function(){this.init()}},Pe=Object(P.a)($e,Te,[],!1,null,null,null);Pe.options.__file="src/pages/topic/detail.vue";var Ee=Pe.exports,Ie=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"block"},[i("div",{staticClass:"block-body"},[i("bc-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],ref:"table",class:["bcui-table--circular","bcui-table--dark"],attrs:{tableData:e.groupList,border:!1,pagination:!1,"empty-text":"No data"}},[i("bc-table-column",{attrs:{field:"groupName",index:"groupName",label:"Consumer Group",width:"400px"}}),e._v(" "),i("bc-table-column",{attrs:{field:"createTime",index:"createTime",label:"Create Time"}}),e._v(" "),i("bc-table-column",{attrs:{field:"state",index:"state",label:"Status"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("span",{class:e.coloringText("topic","states",parseInt(t.record.state,10))},[e._v(e._s(e.dictTranslate("topic","states",parseInt(t.record.state,10))))])]}}])})],1)],1)])};Ie._withStripped=!0;var Ne={name:"topic-group",mixins:[oe,ue],data:function(){return{groupList:[],loading:!1}},methods:{getGroupList:function(){var e=this,t={topicId:this.$route.params.id,clusterId:1,user:"administration"};this.loading=!0,this.fetchGroupsByTopic({params:t}).then(function(t){e.groupList=t.data||[]}).finally(function(){e.loading=!1})}},mounted:function(){this.getGroupList()}},Oe=Object(P.a)(Ne,Ie,[],!1,null,null,null);Oe.options.__file="src/pages/topic/modals/group.vue";var Be=Oe.exports,De=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"block"},[t("div",{staticClass:"block-body"},[t("bc-table",{directives:[{name:"loading",rawName:"v-loading",value:this.loading,expression:"loading"}],ref:"table",class:["bcui-table--circular","bcui-table--dark"],attrs:{tableData:this.topicStatisticList,border:!1,pagination:!1,"empty-text":"No data"}},[t("bc-table-column",{attrs:{field:"qid",index:"qid",label:"Qid"}}),this._v(" "),t("bc-table-column",{attrs:{field:"minOffset",index:"minOffset",label:"MinOffset",width:"100px"}}),this._v(" "),t("bc-table-column",{attrs:{field:"maxOffset",index:"maxOffset",label:"MaxOffset",width:"100px"}}),this._v(" "),t("bc-table-column",{attrs:{field:"lastUpdateTime",index:"lastUpdateTime",label:"LastUpdateTime"}})],1)],1)])};De._withStripped=!0;var je={name:"topic-statistic",mixins:[oe,ue],data:function(){return{topicStatisticList:[],loading:!1}},methods:{getTopicStatisticList:function(){var e=this,t={topicId:this.$route.params.id,clusterId:1,user:"administration"};this.loading=!0,this.fetchTopicStatistics({params:t}).then(function(t){e.topicStatisticList=t.data||[]}).finally(function(){e.loading=!1})}},mounted:function(){this.getTopicStatisticList()}},Me=Object(P.a)(je,De,[],!1,null,null,null);Me.options.__file="src/pages/topic/modals/statistics.vue";var Le=[{path:"/",name:"topics",component:xe},{path:"/topics",name:"topics",component:xe},{path:"/topics/:id",name:"topicDetail",component:Ee,children:[{path:"group",name:"topic-group-detail",component:Be},{path:"statistic",name:"topic-statistic-detail",component:Me.exports}]}],Ae=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"container"},[i("div",{staticClass:"block"},[e._m(0),e._v(" "),i("div",{staticClass:"block-body"},[i("div",{staticClass:"bcui-table-toolbar"},[i("div",{staticClass:"bcui-table-toolbar__item pull-left"},[i("bc-button",{attrs:{icon:"refresh",type:"gray"},on:{click:e.getSubscribeList}}),e._v(" "),i("bc-button",{attrs:{icon:"plus",type:"primary"},on:{click:e.handleCreateSubscribe}},[e._v("Subscription\n ")]),e._v(" "),i("bc-button-group",[i("bc-button",{attrs:{type:"gray",disabled:e.hasNoChecked},on:{click:function(t){e.handleManageSubscribe("enable")}}},[e._v("Enable\n ")]),e._v(" "),i("bc-button",{attrs:{type:"gray",disabled:e.hasNoChecked},on:{click:function(t){e.handleManageSubscribe("disable")}}},[e._v("Disable\n ")])],1),e._v(" "),i("bc-button",{attrs:{type:"gray",disabled:e.hasNoChecked},on:{click:function(t){e.handleManageSubscribe("delete")}}},[e._v("Delete\n ")])],1),e._v(" "),i("div",{staticClass:"bcui-table-toolbar__item pull-right"},[i("span",{staticClass:"bcui-table-toolbar__item-label"},[e._v("Consumer group:")]),e._v(" "),i("bc-select",{attrs:{width:200,placeholder:"Select consumer group"},on:{"on-change":e.handelSearch},model:{value:e.filter.groupId,callback:function(t){e.$set(e.filter,"groupId",t)},expression:"filter.groupId"}},[i("bc-option",{attrs:{value:""}},[e._v("全部")]),e._v(" "),e._l(e.groups,function(t){return i("bc-option",{key:t.id,attrs:{value:t.value}},[e._v(e._s(t.label))])})],2),e._v(" "),i("bc-input",{attrs:{icon:"search",width:200,placeholder:"search"},on:{"on-change":function(t){e.handelSearch()}},model:{value:e.filter.text,callback:function(t){e.$set(e.filter,"text",t)},expression:"filter.text"}})],1)]),e._v(" "),i("bc-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],ref:"table",class:["bcui-table--circular","bcui-table--dark"],attrs:{tableData:e.subscribeList,border:!1,pagination:!1,check:!0,checkAll:!0,"empty-text":"No data"},on:{"on-check":e.handleCheckTableRow,"on-check-all":e.handleCheckTableAll}},[i("bc-table-column",{attrs:{field:"topicName",index:"topicName",label:"Topic"}}),e._v(" "),i("bc-table-column",{attrs:{field:"groupName",index:"groupName",label:"Consumer Group"}}),e._v(" "),i("bc-table-column",{attrs:{field:"consumeType",index:"consumeType",label:"Consume Type"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("div",[e._v(e._s(e.dictTranslate("topic","consumeTypes",parseInt(t.record.consumeType,10)))+"\n ")])]}}])}),e._v(" "),i("bc-table-column",{attrs:{field:"state",index:"state",label:"Status"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("span",{class:e.coloringText("topic","states",parseInt(t.record.state,10))},[e._v(e._s(e.dictTranslate("topic","states",parseInt(t.record.state,10))))])]}}])}),e._v(" "),i("bc-table-column",{attrs:{field:"operate",index:"operate",label:"Operation",width:"350px"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("a",{staticClass:"text-link",on:{click:function(i){e.handleDetail(t.record)}}},[e._v("Detail")]),e._v(" "),i("a",{staticClass:"text-link",on:{click:function(i){e.handleEditSubscribe(t.record)}}},[e._v("Edit")]),e._v(" "),i("a",{staticClass:"text-link",on:{click:function(i){e.handleGetMessage(t.record)}}},[e._v("Sampling")]),e._v(" "),i("router-link",{class:["text-link"],attrs:{to:{name:"consume",params:{id:t.record.groupId,name:t.record.groupName},query:{topicId:t.record.topicId,topicName:t.record.topicName}}}},[e._v("Consume Progress\n ")])]}}])})],1)],1),e._v(" "),i("div",{staticClass:"bcui-table-toolbar clearfix"},[i("div",{staticClass:"bcui-table-toolbar__item pull-right"},[0!==e.subscribeList.length?i("bc-pagination",{attrs:{"show-sizer":"","show-total":"","page-size":this.pagination.pageSize,total:this.pagination.totalNum},on:{"on-change":e.refreshWhenPageChange,"on-page-size-change":e.refreshWhenPageSizeChange}}):e._e()],1)])]),e._v(" "),i("bc-drawer",{attrs:{title:"Subscription Detail"},on:{"on-cancel":e.cancel},model:{value:e.detailStatus,callback:function(t){e.detailStatus=t},expression:"detailStatus"}},[i("detail",{attrs:{basicInfo:e.subscribeData}})],1),e._v(" "),i("create-modal",{attrs:{subscribe:e.subscribeEditData},model:{value:e.createSubscribeModalStatus,callback:function(t){e.createSubscribeModalStatus=t},expression:"createSubscribeModalStatus"}}),e._v(" "),i("ManageSubModal",{attrs:{type:e.manageType,resources:e.checkedTableItems},model:{value:e.manageSubModalStatus,callback:function(t){e.manageSubModalStatus=t},expression:"manageSubModalStatus"}}),e._v(" "),e.messageStatus?i("bc-drawer",{on:{"on-cancel":e.cancel},model:{value:e.messageStatus,callback:function(t){e.messageStatus=t},expression:"messageStatus"}},[i("messageDetail",{attrs:{topicId:e.topicId}})],1):e._e()],1)};Ae._withStripped=!0;var Re={methods:{request:ne,fetchSubscribeList:function(e){return this.request("get","/carrera/api/console/sub/list",e)},deleteSubscribe:function(e){return this.request("get","/carrera/api/odin/internal/deleteSub",e)},searchSubscribes:function(e){return this.request("get","searchSub",e)},changeSubscribeState:function(e){return this.request("get","/carrera/api/console/sub/changeState",e)},createSub:function(e){return this.request("post","/carrera/api/odin/internal/createSub",e)},fetchSubDesc:function(e){return this.request("get","/carrera/api/console/common/sub/fieldDesc",e)},fetchGroupsWithOutPage:function(e){return this.request("get","/carrera/api/console/group/listAllWithoutPage",e)},fetchTopicsWithOutPage:function(e){return this.request("get","/carrera/api/console/topic/listAllWithoutPage",e)},fetchMsgPushType:function(e){return this.request("get","/carrera/api/console/sub/listMsgPushType",e)},fetchDetailById:function(e){return this.request("get","/carrera/api/console/sub/findById",e)}}},ze={data:function(){return{checkedTableItems:[]}},methods:{handleCheckTableAll:function(e,t){this[arguments.length>2&&void 0!==arguments[2]?arguments[2]:"checkedTableItems"]=e?[].concat(t):[]},handleCheckTableRow:function(e,t,i){var s=this[arguments.length>3&&void 0!==arguments[3]?arguments[3]:"checkedTableItems"];if(s.includes(t)&&!e){var a=s.indexOf(t);s=s.splice(a,1)}!s.includes(t)&&e&&s.push(t)},handleCheckSingleTableRow:function(e,t,i){var s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"checkedTableItems",a=this.$refs.table.getShowData;e?(a.forEach(function(e,t){e.$$check=t===i}),this[s]=[t]):this[s]=[]},clearCheckTableRows:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"checkedTableItems";this[e].forEach(function(e){e.$$check=!1}),this[e]=[]}}},qe=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"drawer-detail"},[i("bc-row",{attrs:{gutter:48}},[i("bc-col",{attrs:{span:"24"}},[i("div",{staticClass:"detail-info-detail-item"},[i("div",{staticClass:"detail-info-title"},[e._v("Basic information")]),e._v(" "),i("div",{staticClass:"detail-info-block"},[i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Consumer Group")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.groupName))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Topic")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.topicName))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Consume maxTps")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.maxTps))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Receive Pressure Traffic")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","pressureTrafficStates",e.basicInfo.pressureTraffic)))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("API Level")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","apiTypes",e.basicInfo.apiType)))])])]),e._v(" "),i("div",{staticClass:"detail-info-title"},[e._v("Advanced config")]),e._v(" "),e.basicInfo.apiType===e.CONSATNT.SUBSCRIBE_API_HIGHT_LEVEL?[i("div",{staticClass:"detail-info-block"},[i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Consume Timeout")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.consumeTimeout))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Error Retry Times")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.errorRetryTimes))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Retry Intervals")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.retryIntervals))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Message Type")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","msgTypes",e.basicInfo.msgType)))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Enable GroovyScript")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","groovyStates",e.basicInfo.enableGroovy)))])]),e._v(" "),e.basicInfo.enableGroovy===e.CONSATNT.SUBSCRIBE_GROOVY_ENABLE?i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("GroovyScript")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.groovy))])]):e._e(),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Enable Transit")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","transitStates",e.basicInfo.enableTransit)))])]),e._v(" "),e.basicInfo.enableTransit===e.CONSATNT.SUBSCRIBE_TRANSIT_ENABLE?i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Transits")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.transit))])]):e._e(),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Consume Type")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","consumeTypes",e.basicInfo.consumeType)))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Basic Ordering Rule")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","orderKeyTypes",e.basicInfo.orderKey)))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("HttpMethod")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(this.dictTranslate("topic","httpMethodTypes",e.basicInfo.httpMethod)))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Message Push Type")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.msgPushTypeDesc))])]),e._v(" "),i("div",{staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v("Urls")]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(e.basicInfo.urls&&e.basicInfo.urls.join(";")))])])])]:[i("div",{staticClass:"detail-item-key"},[e._v("Have no advanced config")])]],2)])],1)],1)};qe._withStripped=!0;var Ge={name:"subscribe-detail",mixins:[ue],props:{basicInfo:{type:Object,default:function(){return{}}}},data:function(){return{CONSATNT:ce.a}}},Ve=(i(152),Object(P.a)(Ge,qe,[],!1,null,null,null));Ve.options.__file="src/pages/subscribe/modals/detail.vue";var Ue=Ve.exports,Fe=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{staticClass:"create-group-modal",attrs:{title:e.title,offsetTop:40,width:1e3},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"subscribe-create config-form-item"},[i("div",{staticClass:"config-form"},[e.show?i("bc-form",{ref:"form",staticClass:"clearfix",attrs:{width:540,model:e.form,rules:e.formRule,labelAlign:"top"}},[i("div",{staticClass:"title-default"},[e._v("Basic Config")]),e._v(" "),i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Consumer Group:",prop:"groupId"}},[e.isEditing?i("bc-input",{attrs:{disabled:"",width:265},model:{value:e.form.groupName,callback:function(t){e.$set(e.form,"groupName",t)},expression:"form.groupName"}}):e._e(),e._v(" "),e.isEditing?e._e():i("bc-select",{attrs:{remote:"",filterable:"",width:265,"remote-method":e.filterGroups,label:e.form.groupName,loading:e.groupQueryLoading,placeholder:"Please input keywords to select"},model:{value:e.form.groupId,callback:function(t){e.$set(e.form,"groupId",t)},expression:"form.groupId"}},[e.groupQueryLoading?e._e():e._l(e.filterableGroups,function(t){return i("bc-option",{key:t.value,attrs:{value:t.value}},[e._v(e._s(t.label))])})],2)],1),e._v(" "),i("bc-form-item",{attrs:{label:"Topic:",prop:"topicId"}},[e.isEditing?i("bc-input",{attrs:{disabled:"",width:265},model:{value:e.form.topicName,callback:function(t){e.$set(e.form,"topicName",t)},expression:"form.topicName"}}):e._e(),e._v(" "),e.isEditing?e._e():i("bc-select",{attrs:{remote:"",filterable:"",width:265,"remote-method":e.filterTopics,label:e.form.topicName,loading:e.loading,placeholder:"Please input keywords to select"},model:{value:e.form.topicId,callback:function(t){e.$set(e.form,"topicId",t)},expression:"form.topicId"}},[e.loading?e._e():e._l(e.filterableTopics,function(t){return i("bc-option",{key:t.value,attrs:{value:t.value}},[e._v(e._s(t.label))])})],2)],1)],1),e._v(" "),i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Consume maxTps",prop:"maxTps"}},[i("bc-input",{attrs:{type:"number",width:265},model:{value:e.form.maxTps,callback:function(t){e.$set(e.form,"maxTps",t)},expression:"form.maxTps"}})],1),e._v(" "),i("bc-form-item",{attrs:{label:"Receive Pressure Traffic",prop:"pressureTraffic"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.pressureTraffic,callback:function(t){e.$set(e.form,"pressureTraffic",e._n(t))},expression:"form.pressureTraffic"}},e._l(e.dict.topic.pressureTrafficStates,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1)],1),e._v(" "),i("div",{staticClass:"title-default",staticStyle:{"margin-bottom":"15px"}},[e._v("Advanced Config\n "),i("span",{staticClass:"icon-for-advanced-config",on:{click:e.toggleAdvancedConfig}},[i("bc-icon",{attrs:{type:e.iconForAdvancedConfig}})],1)]),e._v(" "),i("div",{directives:[{name:"show",rawName:"v-show",value:e.isShowAdvancedConfig,expression:"isShowAdvancedConfig"}]},[i("bc-form-item",{attrs:{label:"API Level",prop:"apiType"}},[i("bc-select",{attrs:{placehold:"Please select"},model:{value:e.form.apiType,callback:function(t){e.$set(e.form,"apiType",e._n(t))},expression:"form.apiType"}},e._l(e.dict.topic.apiTypes,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),1===parseInt(e.form.apiType,10)?[i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Consume Timeout",prop:"consumeTimeout"}},[i("bc-input",{attrs:{width:265,type:"number",placeholder:"default 1000ms"},model:{value:e.form.consumeTimeout,callback:function(t){e.$set(e.form,"consumeTimeout",t)},expression:"form.consumeTimeout"}},[i("span",{attrs:{slot:"append"},slot:"append"},[e._v("ms")])])],1),e._v(" "),i("bc-form-item",{attrs:{label:"Error Retry Times",prop:"errorRetryTimes"}},[i("bc-input",{attrs:{width:265,type:"number",placeholder:"default 3"},model:{value:e.form.errorRetryTimes,callback:function(t){e.$set(e.form,"errorRetryTimes",t)},expression:"form.errorRetryTimes"}})],1)],1),e._v(" "),i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Retry Intervals",prop:"retryIntervals"}},[i("bc-input",{attrs:{width:265,placeholder:"integer,separate by ;"},model:{value:e.form.retryIntervals,callback:function(t){e.$set(e.form,"retryIntervals",t)},expression:"form.retryIntervals"}},[i("span",{attrs:{slot:"append"},slot:"append"},[e._v("ms")])])],1),e._v(" "),i("bc-form-item",{attrs:{label:"Message Type",prop:"msgType"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.msgType,callback:function(t){e.$set(e.form,"msgType",e._n(t))},expression:"form.msgType"}},e._l(e.dict.topic.msgTypes,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1)],1),e._v(" "),1===parseInt(e.form.msgType,10)?[i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Enable groovyScript",prop:"enableGroovy"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.enableGroovy,callback:function(t){e.$set(e.form,"enableGroovy",e._n(t))},expression:"form.enableGroovy"}},e._l(e.dict.topic.groovyStates,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),i("bc-form-item",{attrs:{label:"Enable Transit",prop:"enableTransit"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.enableTransit,callback:function(t){e.$set(e.form,"enableTransit",e._n(t))},expression:"form.enableTransit"}},e._l(e.dict.topic.transitStates,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1)],1),e._v(" "),0===e.form.enableGroovy?[i("bc-form-item",{attrs:{label:"GroovyScript"}},[i("bc-input",{attrs:{type:"textarea",rows:4,placeholder:""},model:{value:e.form.groovy,callback:function(t){e.$set(e.form,"groovy",t)},expression:"form.groovy"}})],1)]:e._e(),e._v(" "),0===e.form.enableTransit?[i("bc-form-item",{attrs:{label:"Transit"}},e._l(e.transits,function(t,s){return i("div",{key:s,staticClass:"conf-margin"},[i("bc-input",{staticStyle:{width:"227px","margin-right":"10px"},attrs:{placeholder:"key"},model:{value:t.key,callback:function(i){e.$set(t,"key",i)},expression:"item.key"}}),e._v(" "),i("bc-input",{attrs:{placeholder:"value",width:227},model:{value:t.value,callback:function(i){e.$set(t,"value",i)},expression:"item.value"}}),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(t){e.addConf(e.transits)}}},[i("bc-icon",{attrs:{type:"jia"}})],1),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(i){e.removeConf(t,e.transits)}}},[e.transits.length>1?i("bc-icon",{attrs:{type:"jian"}}):e._e()],1)],1)}))]:e._e()]:e._e(),e._v(" "),i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Enable Sequential Consume",prop:"enableOrder"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.enableOrder,callback:function(t){e.$set(e.form,"enableOrder",e._n(t))},expression:"form.enableOrder"}},e._l(e.dict.topic.orderStates,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),i("bc-form-item",{attrs:{label:"Consume type",prop:"consumeType"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.consumeType,callback:function(t){e.$set(e.form,"consumeType",e._n(t))},expression:"form.consumeType"}},e._l(e.dict.topic.consumeTypes,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1)],1),e._v(" "),0===e.form.enableOrder?[i("bc-form-item",{attrs:{label:"Basis ordering rules",prop:"orderKey"}},[i("bc-select",{attrs:{placehold:"Please select"},model:{value:e.form.orderKey,callback:function(t){e.$set(e.form,"orderKey",t)},expression:"form.orderKey"}},e._l(e.dict.topic.orderKeyTypes,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),"JsonPath"==e.form.orderKey?[i("bc-form-item",{attrs:{label:"JsonPath",prop:"jsonPath"}},[i("bc-input",{attrs:{placeholder:"Please input JsonPath"},model:{value:e.form.jsonPath,callback:function(t){e.$set(e.form,"jsonPath",t)},expression:"form.jsonPath"}})],1)]:e._e()]:e._e(),e._v(" "),2===parseInt(e.form.consumeType,10)?[i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"HttpMethod",prop:"httpMethod"}},[i("bc-select",{attrs:{placehold:"Please select",width:265},model:{value:e.form.httpMethod,callback:function(t){e.$set(e.form,"httpMethod",e._n(t))},expression:"form.httpMethod"}},e._l(e.dict.topic.httpMethodTypes,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),i("bc-form-item",{attrs:{label:"Message push type",prop:"msgPushType"}},[i("bc-select",{attrs:{placeholder:"Please select",width:265},model:{value:e.form.msgPushType,callback:function(t){e.$set(e.form,"msgPushType",t)},expression:"form.msgPushType"}},e._l(e.msgPushTypes,function(e,t){return i("bc-option",{key:t,attrs:{value:e.value,label:e.label}})}))],1)],1),e._v(" "),i("div",{staticClass:"config-form-item"},[i("bc-form-item",{attrs:{label:"Http token",prop:"httpToken"}},[i("bc-input",{attrs:{width:265},model:{value:e.form.httpToken,callback:function(t){e.$set(e.form,"httpToken",t)},expression:"form.httpToken"}})],1),e._v(" "),i("bc-form-item",{attrs:{label:"Push max concurrency",prop:"pushMaxConcurrency"}},[i("bc-input",{attrs:{width:265},model:{value:e.form.pushMaxConcurrency,callback:function(t){e.$set(e.form,"pushMaxConcurrency",t)},expression:"form.pushMaxConcurrency"}})],1)],1),e._v(" "),i("bc-form-item",{attrs:{label:"Urls:",prop:"urls"}},e._l(e.urls,function(t,s){return i("div",{key:s,staticClass:"conf-margin"},[i("bc-form-item",[i("bc-input",{attrs:{width:"87%",placeholder:"Please input url"},model:{value:t.key,callback:function(i){e.$set(t,"key",i)},expression:"item.key"}}),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(t){e.addUrl(e.urls)}}},[i("bc-icon",{attrs:{type:"jia"}})],1),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(i){e.removeUrl(t,e.urls)}}},[e.urls.length>1?i("bc-icon",{attrs:{type:"jian"}}):e._e()],1)],1)],1)})),e._v(" "),i("bc-form-item",{attrs:{label:"QueryParams"}},e._l(e.queryParams,function(t,s){return i("div",{key:s,staticClass:"conf-margin"},[i("bc-input",{staticStyle:{width:"227px","margin-right":"10px"},attrs:{placeholder:"key"},model:{value:t.key,callback:function(i){e.$set(t,"key",i)},expression:"item.key"}}),e._v(" "),i("bc-input",{attrs:{placeholder:"value",width:227},model:{value:t.value,callback:function(i){e.$set(t,"value",i)},expression:"item.value"}}),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(t){e.addConf(e.queryParams)}}},[i("bc-icon",{attrs:{type:"jia"}})],1),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(i){e.removeConf(t,e.queryParams)}}},[e.queryParams.length>1?i("bc-icon",{attrs:{type:"jian"}}):e._e()],1)],1)}))]:e._e(),e._v(" "),3===parseInt(e.form.consumeType,10)?[i("bc-form-item",{attrs:{label:"Write type",prop:"bigDataType"}},[i("bc-select",{attrs:{placehold:"Please select"},model:{value:e.form.bigDataType,callback:function(t){e.$set(e.form,"bigDataType",e._n(t))},expression:"form.bigDataType"}},e._l(e.dict.topic.writeTypes,function(e){return i("bc-option",{key:e.label,attrs:{value:e.value,label:e.label}})}))],1),e._v(" "),i("bc-form-item",{attrs:{label:"Write config",prop:"bigDataConfig"}},[i("div",{staticClass:"bc-codemirror"},[i("codemirror",{attrs:{options:e.editorOptions},model:{value:e.form.bigDataConfig,callback:function(t){e.$set(e.form,"bigDataConfig",t)},expression:"form.bigDataConfig"}}),e._v(" "),e.bigDataConfigError?i("bc-tooltip",{attrs:{content:e.bigDataConfigError,placement:"top"}},[i("span",{staticClass:"bcui-icon-icon config-warnning"})]):e._e()],1)])]:e._e()]:e._e()],2),e._v(" "),i("bc-form-item",{attrs:{label:"Additional Parameters"}},[e._l(e.others,function(t,s){return i("div",{key:s,staticClass:"conf-margin"},[i("bc-input",{staticStyle:{width:"240px","margin-right":"10px"},attrs:{placeholder:"key"},model:{value:t.key,callback:function(i){e.$set(t,"key",i)},expression:"item.key"}}),e._v(" "),i("bc-input",{staticStyle:{width:"240px"},attrs:{placeholder:"value"},model:{value:t.value,callback:function(i){e.$set(t,"value",i)},expression:"item.value"}}),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(i){e.removeOther(t)}}},[e.others.length>1?i("bc-icon",{attrs:{type:"trash"}}):e._e()],1)],1)}),e._v(" "),i("div",[i("span",{staticClass:"text-link",on:{click:function(t){e.addOther()}}},[e._v("Add additional parameters")])])],2)],1):e._e()],1),e._v(" "),i("div",{staticClass:"config-result"},[i("div",{staticClass:"config-details"},[i("div",{staticClass:"title-default"},[e._v("Config Detail")]),e._v(" "),e._l(e.configResultArr,function(t,s){return i("div",{key:t.key+s,staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v(e._s(t.key))]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(t.value))])])}),e._v(" "),e._l(e.advanceConfig,function(t,s){return 1===e.form.apiType?i("div",{key:t.key+s,staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v(e._s(t.key))]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(t.value))])]):e._e()}),e._v(" "),e._l(e.writeConfig,function(t,s){return 3===e.form.consumeType?i("div",{key:t.key+s,staticClass:"detail-item"},[i("div",{staticClass:"detail-item-key"},[e._v(e._s(t.key))]),e._v(" "),i("div",{staticClass:"detail-item-value"},[e._v(e._s(t.value))])]):e._e()})],2)])]),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.handleCreateTopic}},[e._v("Submit")])],1)],2):e._e()};Fe._withStripped=!0;var We=i(118),He={name:"subscrib-create",mixins:[Re,ue],props:{value:{type:Boolean,default:!1},subscribe:{type:Object,default:function(){return{}}}},data:function(){return{editorOptions:{tabSize:4,mode:"text/javascript",theme:"base16-light",lineNumbers:!0,line:!0,lineWrapping:!0},title:"Create Subscription",formRule:We.createSub,form:{id:"",groupId:"",groupName:"",topicId:"",topicName:"",clusterId:"",clusterIds:[],maxTps:128,alarmType:0,alarmIsEnable:"",alarmMsgLag:"",alarmDelayTime:"",apiType:1,consumeTimeout:1e3,errorRetryTimes:3,retryIntervals:"50;100;150",msgType:1,enableGroovy:1,enableTransit:1,groovy:"",transit:"",enableOrder:1,orderKey:"",consumeType:1,urls:[],httpMethod:0,httpQueryParams:"",msgPushType:1,httpToken:"",pushMaxConcurrency:128,orderRemark:"",jsonPath:"",pressureTraffic:0,bigDataType:0,bigDataConfig:""},isSubmitting:!1,filterableGroups:[],filterableTopics:[],others:[{key:"",value:""}],transits:[{key:"",value:""}],queryParams:[{key:"",value:""}],loading:!1,subDesc:{},groupQueryLoading:!1,isShowAdvancedConfig:!1,urls:[{key:""}],iconForAdvancedConfig:"",isEditing:!1,bigDataConfigError:""}},computed:{show:{get:function(){var e=this;return this.value&&Object.keys(this.subscribe).length?(this.isEditing=!0,this.title="Edit Subscription",this.$nextTick(function(){e.formatData(e.subscribe)}),this.others=this.formatObject(this.subscribe.extraParams)):(this.isEditing=!1,this.title="Create Subscription"),this.value},set:function(){}},configResultArr:{get:function(){return[{key:"Consumer group",value:this.form.groupId?this.getGroupNameById(this.form.groupId,this.groupList):""},{key:"Topic",value:this.form.topicId?this.getTopicNameById(this.form.topicId,this.topicList):""},{key:"Consume maxTps",value:this.form.maxTps},{key:"Receive Pressure Traffic",value:1===this.form.pressureTraffic?"Enable":"Disable"},{key:"Api Level",value:1===this.form.apiType?"High level":"Low level"}]},set:function(){}},advanceConfig:{get:function(){return[{key:"Consume Timeout",value:this.form.consumeTimeout},{key:"Error Retry Times",value:this.form.errorRetryTimes},{key:"Retry Intervals",value:this.form.retryIntervals},{key:"Message Type",value:this.dictTranslate("topic","msgTypes",this.form.msgType)},{key:"Enable GroovyScript",value:this.dictTranslate("topic","groovyStates",this.form.enableGroovy)},{key:"Enable Transit",value:this.dictTranslate("topic","transitStates",this.form.enableTransit)},{key:"Enable Sequential Consume",value:this.dictTranslate("topic","orderStates",this.form.enableOrder)},{key:"Consume Type",value:this.dictTranslate("topic","consumeTypes",this.form.consumeType)},{key:"Basis Ordering rule",value:this.dictTranslate("topic","orderKeyTypes",this.form.orderKey)},{key:"HttpMethod",value:this.dictTranslate("topic","httpMethodTypes",this.form.httpMethod)},{key:"Http Token",value:this.form.httpToken},{key:"Push Concurrency",value:this.form.pushMaxConcurrency}]},set:function(){}},writeConfig:{get:function(){return[{key:"Write type",value:this.dictTranslate("topic","writeTypes",this.form.bigDataType)}]}}},methods:{addOther:function(){this.others.push({key:"",value:""})},removeOther:function(e){var t=this.others.indexOf(e);-1!==t&&this.others.splice(t,1)},toggleAdvancedConfig:function(){this.isShowAdvancedConfig?(this.isShowAdvancedConfig=!1,this.iconForAdvancedConfig="chevron-bottom"):(this.isShowAdvancedConfig=!0,this.iconForAdvancedConfig="chevron-top")},initData:function(){"daily"!==window.ENV&&"development"!==window.ENV||(this.form.maxTps=128,this.form.pushMaxConcurrency=16)},addConf:function(e){e.push({key:"",value:""})},removeConf:function(e,t){var i=t.indexOf(e);-1!==i&&t.splice(i,1)},addUrl:function(e){e.push({key:""})},removeUrl:function(e,t){var i=t.indexOf(e);-1!==i&&t.splice(i,1)},cancelCreateSub:function(){this.$router.push("/subscribes")},formatUrl:function(){return this.urls.map(function(e){return e.key})},handleCreateTopic:function(){var e=this,t=this.form;if(this.validateForm("form"))if(3===parseInt(t.consumeType,10)&&t.bigDataConfig&&this.bigDataConfigError)this.$notice.error({title:"写入配置选项,请填写正确的json格式",duration:0});else{this.isSave?this.isSaveButtonLoading=!0:this.isButtonLoading=!0;var i={user:"administration",subId:this.isEditing?t.subId:0,groupId:t.groupId,groupName:t.groupName||this.getGroupNameById(t.groupId),topicId:t.topicId,topicName:t.topicName||this.getTopicNameById(t.topicId),clusters:{ddmq:1},maxTps:Number(t.maxTps),alarmType:0,alarmIsEnable:1,alarmMsgLag:1e4,alarmDelayTime:3e5,apiType:t.apiType,extraParams:this.formatMap(this.others),queryParams:{},transit:{},httpQueryParams:{},urls:[],orderRemark:t.orderRemark,pressureTraffic:t.pressureTraffic};1===i.apiType&&(t.consumeTimeout&&(i.consumeTimeout=Number(t.consumeTimeout)),t.errorRetryTimes&&(i.errorRetryTimes=Number(t.errorRetryTimes)),t.retryIntervals&&(i.retryIntervals=t.retryIntervals.split(";").filter(function(e){return e})),i.msgType=t.msgType,1===i.msgType&&(i.enableGroovy=t.enableGroovy,0===t.enableGroovy&&t.groovy&&(i.groovy=t.groovy),i.enableTransit=t.enableTransit,0===t.enableTransit&&(i.transit=this.formatMap(this.transits)||null)),i.enableOrder=t.enableOrder,0===i.enableOrder&&("JsonPath"==t.orderKey?i.orderKey=t.jsonPath:i.orderKey=t.orderKey),i.consumeType=parseInt(t.consumeType,10),2===i.consumeType?(i.urls=this.formatUrl(),i.httpMethod=parseInt(t.httpMethod,10),i.httpQueryParams=this.formatMap(this.queryParams),i.msgPushType=parseInt(t.msgPushType,10),i.httpToken=t.httpToken,i.pushMaxConcurrency=parseInt(t.pushMaxConcurrency,10)):3===i.consumeType&&(i.bigDataType=t.bigDataType,i.bigDataConfig=t.bigDataConfig.trim(""))),this.createSub(i).then(function(t){e.isSaveButtonLoading=!1,e.isButtonLoading=!1,0===t.errno&&(e.cancel(),e.$root.bus.$emit("updateSubscribeList"))}).catch(function(){e.isSaveButtonLoading=!1,e.isButtonLoading=!1})}else this.$notice.error({title:"Please checkout form",duration:0})},filterTopics:function(e){var t=this,i=this.topicList;""!==e?(this.loading=!0,setTimeout(function(){t.loading=!1;var s=i.map(function(e){return{value:e.topicId,label:e.topicName}});t.filterableTopics=s.filter(function(t){return t.label.toLowerCase().indexOf(e.toLowerCase())>-1}).slice(0,99)},100)):this.filterableTopics=i.slice(0,99)},filterGroups:function(e){var t=this,i=this.groups;""!==e?(this.groupQueryLoading=!0,setTimeout(function(){t.groupQueryLoading=!1,t.filterableGroups=i.filter(function(t){return t.label.toLowerCase().indexOf(e.toLowerCase())>-1}).slice(0,99)},100)):this.filterableGroups=[]},getGroups:function(){var e=this;this.fetchGroupsWithOutPage({params:{user:"administration"}}).then(function(t){var i=t.data;e.groups=i.map(function(e){return{label:e.groupName,value:e.groupId}})})},getTopics:function(){var e=this;this.fetchTopicsWithOutPage({params:{user:"administration"}}).then(function(t){e.topicList=t.data})},getSubDesc:function(){var e=this;this.fetchSubDesc({params:{user:"administration"}}).then(function(t){e.subDesc=t.data})},getMsgPushTypes:function(){var e=this;this.fetchMsgPushType({params:{user:"administration"}}).then(function(t){var i=t.data;e.msgPushTypes=i.map(function(e){return{label:e.desc,value:e.id}})})},cancel:function(){this.isSubmitting=!1,this.others=[{key:"",value:""}],this.transits=[{key:"",value:""}],this.queryParams=[{key:"",value:""}],this.urls=[{key:""}],this.$refs.form.resetFields(),this.$emit("input",!1)},init:function(){this.getMsgPushTypes(),this.getGroups(),this.getTopics(),this.initData(),this.toggleAdvancedConfig()},getGroupNameById:function(e){var t="";return this.groups.forEach(function(i){i.value===e&&(t=i.label)}),t},getTopicNameById:function(e){var t="";return this.topicList.forEach(function(i){i.topicId===e&&(t=i.topicName)}),t},formatData:function(e){this.form=JSON.parse(JSON.stringify(e)),e.retryIntervals&&e.retryIntervals.length&&e.retryIntervals instanceof Array&&(this.form.retryIntervals=e.retryIntervals.join(";")),e.urls&&e.urls.length&&(this.urls=this.formatUrlObject(e.urls,this.urls)),e.httpQueryParams&&Object.keys(e.httpQueryParams).length&&(this.queryParams=this.formatObject(e.httpQueryParams,this.queryParams)),e.transit&&Object.keys(e.transit).length&&(this.transits=this.formatObject(e.transit,this.transits)),e.extraParams&&Object.keys(e.extraParams).length&&(this.others=this.formatObject(e.extraParams,this.others)),"QID"!=e.orderKey&&"KEY"!=e.orderKey&&(this.form.jsonPath=e.orderKey,this.form.orderKey="JsonPath")}},watch:{"form.bigDataConfig":function(e){if(e)try{JSON.parse(e),this.bigDataConfigError=""}catch(e){this.bigDataConfigError=e.message}else this.bigDataConfigError=""}},created:function(){this.init()},beforeMount:function(){},mounted:function(){}},Ke=(i(153),Object(P.a)(He,Fe,[],!1,null,null,null));Ke.options.__file="src/pages/subscribe/modals/create.vue";var Qe=Ke.exports,Ye=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{attrs:{width:552,title:e.title},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"modal-container"},[i("div",{staticClass:"modal-text subtitle"},[e._v(e._s(e.subTitle))]),e._v(" "),e.description?i("div",{staticClass:"modal-text description"},[e._v(e._s(e.description))]):e._e()]),e._v(" "),i("div",{staticClass:"modal-rect"},e._l(e.resources,function(t){return i("div",{key:t.id,staticClass:"modal-rect__item"},[e._v("\n "+e._s("Topic:"+t.topicName+", Consumer Group:"+t.groupName)+"\n ")])})),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.submit}},[e._v("Submit")])],1)],2):e._e()};Ye._withStripped=!0;var Je={name:"modal-enable-subscribe",mixins:[Re,ue],components:{},props:{value:{type:Boolean,default:!1},resources:{type:Array,required:!0},type:{type:String,required:!0,default:"enable"}},data:function(){return{isSubmitting:!1}},watch:{},computed:{title:function(){return this.typeDict[this.type].title},subTitle:function(){return this.typeDict[this.type].subTitle},description:function(){return this.typeDict[this.type].description},show:{get:function(){return this.value},set:function(){}},typeDict:function(){return{enable:{title:"Enable subscription",subTitle:"Are you sure to enable the following ".concat(this.resources.length," subscriptions?")},disable:{title:"Disable subscription",subTitle:"Are you sure to disable the following ".concat(this.resources.length," subscriptions?")},delete:{title:"Delete subscription",subTitle:"Are you sure to delete the following ".concat(this.resources.length," subscriptions?")}}}},methods:{cancel:function(){this.isSubmitting=!1,this.$emit("input",!1)},getEnablePromises:function(e){var t=this;return e.map(function(e){var i={subId:e.subId,user:"administration",state:0};return t.changeSubscribeState({params:i})})},getDisablePromises:function(e){var t=this;return e.map(function(e){var i={subId:e.subId,user:"administration",state:1};return t.changeSubscribeState({params:i})})},getDeletePromises:function(e){var t=this;return e.map(function(e){var i={subId:e.subId,user:"administration"};return t.deleteSubscribe({params:i})})},submit:function(){var e=this,t=this.resources;this.isSubmitting=!0;var i=[];switch(this.type){case"enable":i=this.getEnablePromises(t);break;case"disable":i=this.getDisablePromises(t);break;case"delete":i=this.getDeletePromises(t)}Promise.all(i).then(function(t){e.cancel(),e.$root.bus.$emit("updateSubscribeList"),t.every(function(e){return 0===e.errno})&&e.$notice.success({title:"Success"})}).finally(function(){e.isSubmitting=!1})}},mounted:function(){},beforeDestroy:function(){}},Xe=(i(154),Object(P.a)(Je,Ye,[],!1,null,null,null));Xe.options.__file="src/pages/subscribe/modals/manage.vue";var Ze={name:"groups",mixins:[Re,ue,ze],components:{detail:Ue,CreateModal:Qe,ManageSubModal:Xe.exports,messageDetail:Ce},data:function(){return{subscribeList:[],loading:!0,topicId:"",groups:[],pagination:{totalNum:0,curPage:1,pageSize:10},filter:{isSearchShow:!0,text:"",groupId:"",consumeType:"",state:"",groupName:"",clusterName:""},groupQueryLoading:!1,clusterQueryLoading:!1,filterableGroups:[],title:"",subscribeData:{},subscribeEditData:{},subscribeEnableData:{},detailStatus:!1,createSubscribeModalStatus:!1,manageSubModalStatus:!1,manageType:"",msgPushTypes:[],messageStatus:!1}},computed:{hasNoChecked:function(){return this.checkedTableItems.length<=0}},methods:{handleGetMessage:function(e){this.messageStatus=!0,this.title="Sampling( Topic:"+e.topicName+")",this.topicId=e.topicId},handleManageSubscribe:function(e){this.manageType=e,this.manageSubModalStatus=!0},handleDetail:function(e){this.detailStatus=!0,this.title="Subscription Detail",e.msgPushTypeDesc=this.getNameById(e.msgPushType,this.msgPushTypes),this.subscribeData=e},handleEditSubscribe:function(e){this.subscribeEditData=e,this.createSubscribeModalStatus=!0},handleCreateSubscribe:function(){this.subscribeEditData={},this.createSubscribeModalStatus=!0},cancel:function(){this.detailStatus=!1},handelSearch:function(){var e=this,t=this.filter;""!==t.text?(clearTimeout(this.timer),this.timer=setTimeout(function(){var i={text:t.text,clusterId:t.clusterId,clusterName:"ddmq",groupId:t.groupId,groupName:e.getNameById(t.groupId,e.groups),consumeType:t.consumeType,state:t.state,isSearchShow:t.isSearchShow};localStorage.setItem("subscribes_search_keyword",JSON.stringify(i)),e.getSubscribeList()},500)):(this.getSubscribeList(),localStorage.setItem("subscribes_search_keyword",""))},filterGroups:function(e){var t=this,i=this.groups;""!==e?(this.groupQueryLoading=!0,setTimeout(function(){t.groupQueryLoading=!1,t.filterableGroups=i.filter(function(t){return t.label.toLowerCase().indexOf(e.toLowerCase())>-1}).slice(0,99)},100)):this.filterableGroups=[]},showSearch:function(){this.filter.isSearchShow=!this.filter.isSearchShow},getConsumeState:function(e){var t=e.groupId,i=e.groupName;this.$router.push("/group/consume/".concat(t,"/").concat(i))},getMessages:function(e,t){this.$router.push("/message/".concat(e,"/").concat(t))},getSubscribeList:function(e){var t=this,i=this.pagination,s=this.filter;e=Object.assign({},{curPage:i.curPage,pageSize:i.pageSize,text:s.text,clusterId:1,groupId:s.groupId,consumeType:s.consumeType,state:s.state,user:"administration"},e),this.loading=!0,this.fetchSubscribeList({params:e}).then(function(e){t.subscribeList=e.data.list,t.subscribeList.forEach(function(e){var i=Object.keys(e.clusters);t.$set(e,"clusterId",e.clusters[i[0]]),t.$set(e,"clusterName",i[0])}),t.pagination.totalNum=e.data.totalSize,t.loading=!1}).catch(function(){t.loading=!1})},refreshWhenPageChange:function(e){this.pagination.curPage=e,this.getSubscribeList()},refreshWhenPageSizeChange:function(e){this.pagination.pageSize=e,this.getSubscribeList()},getGroups:function(){var e=this;this.fetchGroupsWithOutPage({params:{user:"administration"}}).then(function(t){e.groupList=t.data,e.groups=e.groupList.map(function(e){return{label:e.groupName,value:e.groupId}}),e.filter.groupId&&(e.filter.groupName=e.getNameById(e.filter.groupId,e.groups))})},initSearchParams:function(){var e=this,t=localStorage.getItem("subscribes_search_keyword");t?(t=JSON.parse(t),Object.keys(this.filter).forEach(function(i){var s=t[i];void 0!==s&&(e.filter[i]=s)}),this.getSubscribeList()):this.getSubscribeList()},getMsgPushTypes:function(){var e=this;this.fetchMsgPushType({params:{user:"administration"}}).then(function(t){var i=t.data;e.msgPushTypes=i.map(function(e){return{label:e.desc,value:e.id}})})},updateSubscribeList:function(){this.getSubscribeList(),this.clearCheckTableRows()},init:function(){this.initSearchParams(),this.getMsgPushTypes(),this.getGroups(),this.$root.bus.$on("updateSubscribeList",this.updateSubscribeList)},goTopicEdit:function(e){this.$router.push("/topics/create/".concat(e))},goToCreateSub:function(){this.$router.push("/subscribe/create")}},watch:{},mounted:function(){if(Object.keys(this.$route.query).length){var e=this.$route.query.groupId;localStorage.setItem("subscribes_search_keyword",""),this.filter.groupId=e}this.init()}},et=(i(155),Object(P.a)(Ze,Ae,[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"block-header"},[t("div",{staticClass:"block-header__title"},[this._v("Subscription List")])])}],!1,null,null,null));et.options.__file="src/pages/subscribe/index.vue";var tt=[{path:"/subscribes",name:"subscribes",component:et.exports}],it=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"container group-index"},[i("div",{staticClass:"block"},[e._m(0),e._v(" "),i("div",{staticClass:"block-body"},[i("div",{staticClass:"bcui-table-toolbar"},[i("div",{staticClass:"bcui-table-toolbar__item pull-left"},[i("bc-button",{attrs:{icon:"refresh",type:"gray"},on:{click:e.getGroupList}}),e._v(" "),i("bc-button",{attrs:{icon:"plus",type:"primary"},on:{click:e.handleCreateGroup}},[e._v("Consumer Group\n ")]),e._v(" "),i("bc-button-group",[i("bc-button",{attrs:{type:"gray",disabled:e.hasNoChecked},on:{click:function(t){e.handleManageGroup("enable")}}},[e._v("Enable\n ")]),e._v(" "),i("bc-button",{attrs:{type:"gray",disabled:e.hasNoChecked},on:{click:function(t){e.handleManageGroup("disable")}}},[e._v("Disable\n ")])],1),e._v(" "),i("bc-button",{attrs:{type:"gray",disabled:e.hasNoChecked},on:{click:function(t){e.handleManageGroup("delete")}}},[e._v("Delete\n ")])],1),e._v(" "),i("div",{staticClass:"bcui-table-toolbar__item pull-right"},[i("bc-input",{attrs:{icon:"search",width:200,placeholder:"search"},on:{"on-change":function(t){e.handelSearch()}},model:{value:e.filter.text,callback:function(t){e.$set(e.filter,"text",t)},expression:"filter.text"}})],1)]),e._v(" "),i("bc-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],ref:"table",class:["bcui-table--circular","bcui-table--dark"],attrs:{tableData:e.groupList,border:!1,pagination:!1,check:!0,checkAll:!0,"empty-text":"No data"},on:{"on-check":e.handleCheckTableRow,"on-check-all":e.handleCheckTableAll}},[i("bc-table-column",{attrs:{field:"groupName",index:"groupName",label:"Consumer Group"}}),e._v(" "),i("bc-table-column",{attrs:{field:"subscriptionNum",index:"subscriptionNum",label:"Subscription Number"}}),e._v(" "),i("bc-table-column",{attrs:{field:"subscriptionEnableNum",index:"subscriptionEnableNum",label:"Enabled Subscription Number"}}),e._v(" "),i("bc-table-column",{attrs:{field:"operate",index:"operate",label:"Operation",width:"430px"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("router-link",{staticClass:"text-link",attrs:{to:{name:"subscribes",query:{groupId:t.record.groupId}}}},[e._v("Subscriptions")]),e._v(" "),i("a",{class:["text-link",t.record.subscriptionNum?"":"disable-text-link"],attrs:{href:""},on:{click:function(i){i.preventDefault(),e.handleConsume(t.record)}}},[e._v("Consume Progress")]),e._v(" "),i("a",{class:["text-link"],on:{click:function(i){e.handleEditGroup(t.record)}}},[e._v("Edit Consumer Group")])]}}])})],1)],1),e._v(" "),i("div",{staticClass:"bcui-table-toolbar clearfix"},[i("div",{staticClass:"bcui-table-toolbar__item pull-right"},[0!==e.groupList.length?i("bc-pagination",{attrs:{"show-sizer":"","show-total":"","page-size":this.pagination.pageSize,total:this.pagination.totalNum},on:{"on-change":e.refreshWhenPageChange,"on-page-size-change":e.refreshWhenPageSizeChange}}):e._e()],1)])]),e._v(" "),i("CreateGroupModal",{attrs:{group:e.groupEditData},model:{value:e.createGroupModalStatus,callback:function(t){e.createGroupModalStatus=t},expression:"createGroupModalStatus"}}),e._v(" "),i("ManageGroupModal",{attrs:{type:e.manageType,resources:e.checkedTableItems},model:{value:e.manageSubModalStatus,callback:function(t){e.manageSubModalStatus=t},expression:"manageSubModalStatus"}})],1)};it._withStripped=!0;var st={methods:{request:ne,fectchGroupList:function(e){return this.request("get","/carrera/api/console/group/listAll",e)},createGroup:function(e){return this.request("post","/carrera/api/console/group/create",e)},deleteGroup:function(e){return this.request("get","/carrera/api/odin/internal/deleteGroup",e)},changeAllSubscribeState:function(e){return this.request("get","/carrera/api/console/group/changeState",e)},changeAlarmState:function(e){return this.request("get","/carrera/api/console/group/changeAlarmState",e)},getTopicConsumeState:function(e){return this.request("get","/carrera/api/console/group/consumeState",e)},getTopicsByGroupId:function(e){return this.request("get","/carrera/api/console/group/consumeState/searchItemList",e)},resetOffset:function(e){return this.request("get","/carrera/api/console/group/resetOffset",e)},getGroupDesc:function(e){return this.request("get","/carrera/api/console/common/group/fieldDesc",e)}}},at=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{staticClass:"create-group-modal",attrs:{title:e.title,offsetTop:40,width:610},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"group-create"},[i("bc-form",{ref:"form",staticClass:"clearfix",attrs:{width:540,model:e.form,rules:e.formRule,labelAlign:"top"}},[i("bc-form-item",{attrs:{label:"Consumer Group:",prop:"groupName"}},[i("bc-input",{attrs:{disabled:e.isEditing,placeholder:"Please input Consumer Group"},model:{value:e.form.groupName,callback:function(t){e.$set(e.form,"groupName",t)},expression:"form.groupName"}},[i("span",{attrs:{slot:"prepend"},slot:"prepend"},[e._v("cg_")])])],1),e._v(" "),i("div",{staticClass:"alert-message"},[i("div",[e._v("1. The Consumer Group name can contain only letters, numbers, underscore(_)and dashes(-)")]),e._v(" "),i("div",[e._v("2. Once created can't modify the Consumer Group name")])]),e._v(" "),i("bc-form-item",{attrs:{label:"Additional Parameters"}},[e._l(e.others,function(t,s){return i("div",{key:s,staticClass:"conf-margin"},[i("bc-input",{staticStyle:{width:"240px","margin-right":"10px"},attrs:{placeholder:"key"},model:{value:t.key,callback:function(i){e.$set(t,"key",i)},expression:"item.key"}}),e._v(" "),i("bc-input",{staticStyle:{width:"240px"},attrs:{placeholder:"value"},model:{value:t.value,callback:function(i){e.$set(t,"value",i)},expression:"item.value"}}),e._v(" "),i("span",{staticClass:"form-icon-operate",on:{click:function(i){e.removeOther(t)}}},[e.others.length>1?i("bc-icon",{attrs:{type:"trash"}}):e._e()],1)],1)}),e._v(" "),i("div",[i("span",{staticClass:"text-link",on:{click:function(t){e.addOther()}}},[e._v("Add additional parameters")])])],2)],1)],1),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.handleCreateGroup}},[e._v("Submit")])],1)],2):e._e()};at._withStripped=!0;var nt=i(119),ot={name:"create-group-modal",mixins:[st,ue],components:{},props:{value:{type:Boolean,default:!1},group:{type:Object,default:function(){return{}}}},data:function(){return{title:"Create Consumer Group",isSubmitting:!1,isEditing:!1,others:[{key:"",value:""}],form:{groupId:"",groupName:""},formRule:nt.createGroup,topicDesc:{},showConfOperationParams:!1}},computed:{show:{get:function(){var e=this;return this.value&&Object.keys(this.group).length&&(this.isEditing=!0,this.title="Edit Consumer Group",this.$nextTick(function(){e.form=JSON.parse(JSON.stringify(e.group)),e.form.groupName=e.form.groupName.replace("cg_","")}),this.others=this.formatObject(this.group.extraParams)),this.value},set:function(){}}},methods:{cancel:function(){this.isSubmitting=!1,this.isEditing=!1,this.title="Create Consumer Group",this.others=[{key:"",value:""}],this.$refs.form.resetFields(),this.$emit("input",!1)},addOther:function(){this.others.push({key:"",value:""})},removeOther:function(e){var t=this.others.indexOf(e);-1!==t&&this.others.splice(t,1)},handleCreateGroup:function(){var e=this,t=this.form;if(!this.validateForm("form"))return this.isSaveLoading=!1,void this.$notice.error({title:"Please checkout form",duration:0});this.isSubmitting=!0;var i={user:"administration",groupId:this.isEditing?t.groupId:0,groupName:"cg_"+t.groupName,service:"Engineering",department:"Software",contacters:"administration;",alarmGroup:null,alarmLevel:1,alarmIsEnable:1,alarmMsgLag:1e4,alarmDelayTime:3e5,extraParams:{},broadcastConsume:1,consumeMode:1,consumeModeMapper:null,operationParams:null};i.extraParams=this.formatMap(this.others),this.createGroup(i).then(function(t){0===t.errno&&(e.$root.bus.$emit("updateGroupList"),e.cancel())}).finally(function(){e.isSaveLoading=!1,e.isSubmitting=!1})}},mounted:function(){}},rt=(i(156),Object(P.a)(ot,at,[],!1,null,null,null));rt.options.__file="src/pages/group/modals/create.vue";var ct=rt.exports,lt=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{attrs:{width:552,title:e.title},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"modal-container"},[i("div",{staticClass:"modal-text subtitle"},[e._v(e._s(e.subTitle))]),e._v(" "),e.description?i("div",{staticClass:"modal-text description"},[e._v(e._s(e.description))]):e._e()]),e._v(" "),i("div",{staticClass:"modal-rect"},e._l(e.resources,function(t){return i("div",{key:t.id,staticClass:"modal-rect__item"},[e._v("\n "+e._s("Consumer Group:"+t.groupName)+"\n ")])})),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.submit}},[e._v("Submit")])],1)],2):e._e()};lt._withStripped=!0;var ut={name:"modal-enable-group",mixins:[st,ue],components:{},props:{value:{type:Boolean,default:!1},resources:{type:Array,required:!0},type:{type:String,required:!0,default:"enable"}},data:function(){return{isSubmitting:!1}},watch:{},computed:{title:function(){return this.typeDict[this.type].title},subTitle:function(){return this.typeDict[this.type].subTitle},description:function(){return this.typeDict[this.type].description},show:{get:function(){return this.value},set:function(){}},typeDict:function(){return{enable:{title:"Enable All subscription",subTitle:"Are you sure to enable all subscription under the following ".concat(this.resources.length," consumer groups?")},disable:{title:"Disable All subscription",subTitle:"Are you sure to disable all subscription under the following ".concat(this.resources.length," consumer groups?")},disableAlarm:{title:"Disable alarm",subTitle:"Are you sure to disable alarm the following ".concat(this.resources.length," consumer groups?")},enableAlarm:{title:"Enable alarm",subTitle:"Are you sure to enable alarm the following ".concat(this.resources.length," consumer groups?")},delete:{title:"Delete group",subTitle:"Are you sure to delete the following ".concat(this.resources.length," consumer groups?")}}}},methods:{cancel:function(){this.isSubmitting=!1,this.$emit("input",!1)},getEnablePromises:function(e){var t=this;return e.map(function(e){var i={groupId:e.groupId,user:"administration",state:0};return t.changeAllSubscribeState({params:i})})},getDisablePromises:function(e){var t=this;return e.map(function(e){var i={groupId:e.groupId,user:"administration",state:1};return t.changeAllSubscribeState({params:i})})},getDeletePromises:function(e){var t=this;return e.map(function(e){var i={groupId:e.groupId,user:"administration"};return t.deleteGroup({params:i})})},getDisableAlarmPromises:function(e){var t=this;return e.map(function(e){var i={groupId:e.groupId,user:"administration",state:1};return t.changeAlarmState({params:i})})},getEnableAlarmPromises:function(e){var t=this;return e.map(function(e){var i={groupId:e.groupId,user:"administration",state:0};return t.changeAlarmState({params:i})})},submit:function(){var e=this,t=this.resources;this.isSubmitting=!0;var i=[];switch(this.type){case"enable":i=this.getEnablePromises(t);break;case"disable":i=this.getDisablePromises(t);break;case"delete":i=this.getDeletePromises(t);break;case"disableAlarm":i=this.getDisableAlarmPromises(t);break;case"enableAlarm":i=this.getEnableAlarmPromises(t)}Promise.all(i).then(function(t){e.cancel(),e.$root.bus.$emit("updateGroupList"),t.every(function(e){return 0===e.errno})&&e.$notice.success({title:"Success"})}).finally(function(){e.isSubmitting=!1})}},mounted:function(){},beforeDestroy:function(){}},dt=(i(157),Object(P.a)(ut,lt,[],!1,null,null,null));dt.options.__file="src/pages/group/modals/manage.vue";var pt={name:"groups",mixins:[st,ue,ze],components:{CreateGroupModal:ct,ManageGroupModal:dt.exports},data:function(){return{groupList:[],groupIds:[],loading:!0,pagination:{totalNum:0,curPage:1,pageSize:10},filter:{text:""},createGroupModalStatus:!1,detailStatus:!1,groupId:0,groupName:"",title:"",groupData:{},groupEditData:{},manageType:"",manageSubModalStatus:!1}},computed:{hasNoChecked:function(){return this.checkedTableItems.length<=0}},methods:{handleManageGroup:function(e){this.manageType=e,this.manageSubModalStatus=!0},handelDetail:function(e){this.detailStatus=!0,this.title=e.groupName,this.groupData=e},handleEditGroup:function(e){this.createGroupModalStatus=!0,this.groupEditData=e},handleCreateGroup:function(){this.createGroupModalStatus=!0,this.groupEditData={}},cancel:function(){this.detailStatus=!1},handelSearch:function(){var e=this,t=this.filter;""!==t.text?(clearTimeout(this.timer),this.timer=setTimeout(function(){var i={text:t.text};localStorage.setItem("group_search_keyword",JSON.stringify(i)),e.getGroupList()},500)):(this.getGroupList(),localStorage.setItem("group_search_keyword",""))},addSubscribe:function(e){var t={groupId:e.groupId,groupName:e.groupName};this.$router.push({name:"group-sub-create",query:{groupdata:JSON.stringify(t)}})},handleConsume:function(e){var t=e.groupId,i=e.groupName;this.$router.push("/group/".concat(t,"/").concat(i))},getGroupList:function(e){var t=this,i=this.pagination;e=Object.assign({},{curPage:i.curPage,pageSize:i.pageSize,text:this.filter.text,user:"administration"},e),this.loading=!0,this.fectchGroupList({params:e}).then(function(e){t.groupList=e.data.list,t.pagination.totalNum=e.data.totalSize,t.loading=!1}).catch(function(){t.loading=!1})},refreshWhenPageChange:function(e){this.pagination.curPage=e,this.getGroupList()},refreshWhenPageSizeChange:function(e){this.pagination.pageSize=e,this.getGroupList()},initSearchParam:function(){var e=localStorage.getItem("group_search_keyword");e?(this.keyword=e,this.getGroupList()):this.getGroupList()},updateGroupList:function(){this.getGroupList(),this.clearCheckTableRows()},init:function(){this.initSearchParam(),this.$root.bus.$on("updateGroupList",this.updateGroupList)}},watch:{},mounted:function(){this.init()}},ht=(i(158),Object(P.a)(pt,it,[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"block-header"},[t("div",{staticClass:"block-header__title"},[this._v("Consumer Group List")])])}],!1,null,null,null));ht.options.__file="src/pages/group/index.vue";var ft=ht.exports,mt=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content"},[i("div",{staticClass:"detail-block"},[i("div",{staticClass:"detail-block-nav clearfix"},[i("div",{staticClass:"detail-block-nav__back",on:{click:e.goBack}},[i("bc-icon",{attrs:{type:"chevron-left"}}),i("span",[e._v("Back to list")])],1)]),e._v(" "),i("div",{staticClass:"detail-block-header"},[i("div",{staticClass:"detail-info"},[i("div",{staticClass:"detail-title"},[i("div",{staticClass:"detail-title__value"},[e._v("consume progress ("+e._s("Consume group:"+e.groupName)+")")])])])])]),e._v(" "),i("div",{staticClass:"detail-block-body"},[i("div",{staticClass:"bcui-table-toolbar"},[i("div",{staticClass:"bcui-table-toolbar__item pull-left"},[i("bc-button",{attrs:{icon:"refresh",type:"gray"},on:{click:e.handelSearch}}),e._v(" "),i("bc-button",{attrs:{type:"primary"},on:{click:function(t){e.resetToNew()}}},[e._v("\n Reset to Latest\n ")]),e._v(" "),i("bc-button",{attrs:{type:"primary"},on:{click:function(t){e.resetToDate()}}},[e._v("\n Reset By Time\n ")]),e._v(" "),i("div",{staticClass:"custom-date-picker reset-time"},[i("input",{staticClass:"bcui-inputfield__input",attrs:{width:300,type:"text","data-input":"",readonly:"",placeholder:"Reset time"}}),e._v(" "),i("span",{staticClass:"input-button",attrs:{title:"toggle","data-clear":""},on:{click:function(t){e.clearTime("resetTime")}}},[e.filter.resetTime?i("i",{staticClass:"clear bcui-icon-information-fail"}):e._e()]),e._v(" "),i("span",{staticClass:"input-button",attrs:{title:"clear","data-toggle":""}},[e.filter.resetTime?e._e():i("i",{staticClass:"trigger-icon bcui-icon-calendar"})])])],1),e._v(" "),i("div",{staticClass:"bcui-table-toolbar__item pull-right"},[i("span",{staticClass:"bcui-table-toolbar__item-label"},[e._v("Topic")]),e._v(" "),i("bc-select",{attrs:{width:200,placeholder:"Please input topic"},model:{value:e.filter.topicId,callback:function(t){e.$set(e.filter,"topicId",t)},expression:"filter.topicId"}},e._l(e.topics,function(t){return i("bc-option",{key:t.id,attrs:{value:t.value}},[e._v(e._s(t.label))])})),e._v(" "),i("bc-input",{attrs:{icon:"search",width:150,placeholder:"search"},on:{"on-change":function(t){e.handelSearch()}},model:{value:e.filter.text,callback:function(t){e.$set(e.filter,"text",t)},expression:"filter.text"}})],1)]),e._v(" "),i("bc-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],class:["bcui-table--circular","bcui-table--dark"],attrs:{tableData:e.renderData,border:!1,rowEdit:!0,"empty-text":"No data",pagination:!1}},[i("bc-table-column",{attrs:{field:"topicName",index:"topicName",label:"Topic"}}),e._v(" "),i("bc-table-column",{attrs:{field:"qid",index:"qid",label:"Qid"}}),e._v(" "),i("bc-table-column",{attrs:{field:"minOffset",index:"minOffset",label:"MinOffset"}}),e._v(" "),i("bc-table-column",{attrs:{field:"maxOffset",index:"maxOffset",label:"MaxOffset"}}),e._v(" "),i("bc-table-column",{attrs:{field:"consumeOffset",index:"consumeOffset",label:"ConsumerOffset"}}),e._v(" "),i("bc-table-column",{attrs:{field:"lag",index:"lag",label:"Lag"}}),e._v(" "),i("bc-table-column",{attrs:{field:"reset",index:"reset",label:"Reset offset",width:"200px"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("div",{staticClass:"table-icon"},[t.record.show?e._e():i("a",{staticClass:"bcui-icon-pencil text-link table-icon-edit",on:{click:function(i){e.showInput(t.record)}}}),e._v(" "),t.record.show?i("bc-input",{staticClass:"table-input",attrs:{type:"number"},model:{value:t.record.offset,callback:function(i){e.$set(t.record,"offset",i)},expression:"scope.record.offset"}}):e._e()],1)]}}])}),e._v(" "),i("bc-table-column",{attrs:{field:"submit",index:"submit",label:"",width:"150px"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("div",{staticClass:"table-icon"},[t.record.show?i("a",{class:["text-link"],on:{click:function(i){e.submit(t.record)}}},[e._v("Submit")]):e._e(),e._v(" "),t.record.show?i("a",{class:["text-link"],on:{click:function(i){e.cancel(t.record)}}},[e._v("Cancel")]):e._e()])]}}])})],1)],1),e._v(" "),i("consume-modal",{attrs:{type:e.manageType,params:e.manangeParams,resource:e.resource},model:{value:e.manageConsumeStatus,callback:function(t){e.manageConsumeStatus=t},expression:"manageConsumeStatus"}})],1)};mt._withStripped=!0;var vt=i(120),bt=i.n(vt),gt=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.show?i("bc-modal",{attrs:{width:552,title:e.title},on:{"on-cancel":e.cancel},model:{value:e.show,callback:function(t){e.show=t},expression:"show"}},[i("div",{staticClass:"modal-container"},[i("div",{staticClass:"modal-text subtitle"},[e._v(e._s(e.subTitle))]),e._v(" "),e.description?i("div",{staticClass:"modal-text description"},[e._v(e._s(e.description))]):e._e()]),e._v(" "),i("template",{slot:"footer"},[i("bc-button",{on:{click:e.cancel}},[e._v("Cancel")]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.isSubmitting},on:{click:e.submit}},[e._v("Submit")])],1)],2):e._e()};gt._withStripped=!0;var _t={name:"modal-manage-consume",mixins:[st,ue],components:{},props:{value:{type:Boolean,default:!1},resource:{type:Object,required:!0},params:{type:Object,required:!0},type:{type:String,required:!0,default:"enable"}},data:function(){return{isSubmitting:!1}},watch:{},computed:{title:function(){return this.typeDict[this.type].title},subTitle:function(){return this.typeDict[this.type].subTitle},description:function(){return this.typeDict[this.type].description},show:{get:function(){return this.value},set:function(){}},typeDict:function(){return{resetValue:{title:"Reset offset",subTitle:"Are you sure to reset offset to specified value ?",description:"Topic: ".concat(this.resource.topicName,", reset offset value to ").concat(this.resource.offset)},resetToNew:{title:"Reset offset",subTitle:"Are you sure to reset offset to newest ?",description:"Topic: ".concat(this.resource.topicName)},resetToTime:{title:"Reset offset",subTitle:"Are you sure to reset offset to specified time ?",description:"Topic: ".concat(this.resource.topicName,", reset offset to ").concat(this.params.resetTime,"?")}}}},methods:{cancel:function(){this.isSubmitting=!1,this.$emit("input",!1)},submit:function(){var e=this,t=this.params;t.user="administration",this.isSubmitting=!0,this.resetOffset({params:t}).then(function(t){0===t.errno&&(e.$notice.success({title:"success"}),e.$root.bus.$emit("updateConsumeList"),e.cancel())}).finally(function(){e.isSubmitting=!1})}},mounted:function(){},beforeDestroy:function(){}},yt=(i(159),Object(P.a)(_t,gt,[],!1,null,null,null));yt.options.__file="src/pages/group/modals/consume-manage.vue";var St={name:"group-consume",mixins:[st,ue],components:{consumeModal:yt.exports},data:function(){return{manageConsumeStatus:!1,manageType:"",resource:{},manangeParams:{},isTopicConsume:!1,renderData:[],loading:!0,topics:[],clusters:[],groupName:"",groupId:"",filter:{clusterId:"",topicId:"",resetTime:""},clusterName:"",topicName:""}},methods:{goBack:function(){this.isTopicConsume?this.$router.push({name:"subscribes"}):this.$router.push({name:"groups"})},showInput:function(e){e.show=!0},cancel:function(e){e.show=!1},getConsumeList:function(e){var t=this,i=this.filter;e=Object.assign({},{clusterId:1,topicId:i.topicId,groupId:this.groupId,user:"administration"},e),this.topicName=this.getNameById(i.topicId,this.topics),this.loading=!0,this.getTopicConsumeState({params:e}).then(function(e){t.renderData=e.data,t.renderData.forEach(function(e){t.filter.clusterId=t.filter.clusterId||e.clusterId,t.filter.topicId=t.filter.topicId||e.topicId,e.show=!1}),t.loading=!1}).catch(function(){t.loading=!1})},handelSearch:function(){this.getConsumeList()},init:function(){this.getConsumeList(),this.$root.bus.$on("updateConsumeList",this.getConsumeList)},submit:function(e){if(this.filter.topicId)if(e.offset)if(isNaN(e.offset)||e.offset<0)this.$notice.error({title:"Reset value must be Number"});else{var t=this.filter;this.manangeParams={resetType:3,qid:e.qid,offset:e.offset,clusterId:1,topicId:t.topicId,groupId:this.groupId},this.resource=e,this.manageConsumeStatus=!0,this.manageType="resetValue"}else this.$notice.error({title:"Please input reset value"});else this.$notice.error({title:"Please select topic"})},resetToNew:function(e){if(this.filter.topicId){var t=this.filter;this.manangeParams={resetType:1,clusterId:1,topicId:t.topicId,groupId:this.groupId},this.topicName=this.getNameById(t.topicId,this.topics),this.$set(this.resource,"topicName",this.topicName),this.manageConsumeStatus=!0,this.manageType="resetToNew"}else this.$notice.error({title:"Please select topic"})},resetToDate:function(e){if(this.filter.topicId)if(this.filter.resetTime){var t=this.filter;this.manangeParams={resetType:2,resetTime:t.resetTime,clusterId:1,topicId:t.topicId,groupId:this.groupId},this.topicName=this.getNameById(t.topicId,this.topics),this.$set(this.resource,"topicName",this.topicName),this.manageConsumeStatus=!0,this.manageType="resetToTime"}else this.$notice.error({title:"Please select reset date"});else this.$notice.error({title:"Please select topic"})},clearTime:function(e){this.filter[e]=""},fetchTopicsAndClusters:function(e){var t=this,i={groupId:e,user:"administration"};this.getTopicsByGroupId({params:i}).then(function(e){var i=e.data;t.clusters=i.cluster.map(function(e){return{label:e.desc,value:e.id}}),t.topics=i.topic.map(function(e){return{label:e.desc,value:e.id}});var s=!0,a=!1,n=void 0;try{for(var o,r=t.topics[Symbol.iterator]();!(s=(o=r.next()).done);s=!0){var c=o.value;c.value===t.filter.topicId&&(t.topicName=c.label)}}catch(e){a=!0,n=e}finally{try{s||null==r.return||r.return()}finally{if(a)throw n}}})}},mounted:function(){var e=this,t=this.$route.params,i=t.id,s=t.name;if(this.groupName=s,this.groupId=i,Object.keys(this.$route.query).length){var a=this.$route.query.topicId;this.isTopicConsume=!0,this.filter.topicId=a,this.filter.clusterId=1}this.fetchTopicsAndClusters(this.groupId),bt()(".reset-time",{static:!0,time_24hr:!0,wrap:!0,enableTime:!0,enableSeconds:!0,dateFormat:"Y-m-d H:i:S",onClose:function(t,i,s){e.filter.resetTime=i}}),this.init()}},Ct=(i(160),Object(P.a)(St,mt,[],!1,null,null,null));Ct.options.__file="src/pages/group/consume.vue";var kt=[{path:"/groups",name:"groups",component:ft},{path:"/group/:id/:name",name:"consume",component:Ct.exports}],wt=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"layout layout-has-sidebar",attrs:{id:"app"}},[t("sidebar"),this._v(" "),t("div",{staticClass:"layout"},[t("div",{staticClass:"layout-content"},[t("router-view")],1)])],1)};wt._withStripped=!0;var xt=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.classes},[i("div",{staticClass:"sidebar-inner"},[i("div",{staticClass:"sidebar-menu"},[i("bc-menu",{attrs:{accordion:!0,router:!0,mode:"vertical",shrink:e.shrinkStatus}},[i("bc-menu-item",{attrs:{name:"/",routeName:["index"]}},[i("embed",{staticClass:"sidebar-logo",attrs:{src:"ddmq-logo.svg",width:"20",height:"20"}}),e._v(" "),i("span",[e._v("DDMQ Console")])]),e._v(" "),i("bc-menu-item",{attrs:{name:"/topics",routeName:["topics","topicDetail","topic-group-detail","topic-statistic-detail"]}},[i("i",{staticClass:"icon bcui-icon-topic1 prefix-icon"}),e._v(" "),i("span",[e._v("Topic")])]),e._v(" "),i("bc-menu-item",{attrs:{name:"/groups",routeName:["groups","consume"]}},[i("i",{staticClass:"bcui-icon-topic prefix-icon"}),e._v(" "),i("span",[e._v("Consumer Group")])]),e._v(" "),i("bc-menu-item",{attrs:{name:"/subscribes",routeName:["subscribes"]}},[i("i",{staticClass:"icon bcui-icon-shoucang prefix-icon"}),e._v(" "),i("span",[e._v("Subscription")])])],1)],1),e._v(" "),i("div",{staticClass:"bcui-menu-item logout-button",on:{click:e.confirmLogout}},[i("i",{staticClass:"icon bcui-icon-power-off prefix-icon"}),e._v(" "),i("span",[e._v("Logout")])])])])};xt._withStripped=!0;var Tt={methods:{request:ne,requestPostLogin:function(e){return this.request("get","/carrera/api/odin/internal/login",e)},requestPostLogout:function(e){return this.request("get","/carrera/api/odin/internal/logout",e)}}},$t=s.getToken,Pt=s.removeToken,Et={name:"sidebar",mixins:[Tt],components:{},props:{},data:function(){return{shrinkStatus:!1}},computed:{classes:function(){return["sidebar",{"sidebar--shrink":this.shrinkStatus}]}},methods:{gotoIndex:function(){this.$router.push({name:"topics"})},confirmLogout:function(){this.$modal.confirm({title:"Logout",content:"

Are you sure to logout?

",showCancel:!0,okText:"Confirm",cancelText:"Cancel",onOk:this.gotoLogin,onCancel:function(){}})},gotoLogin:function(){var e=this;this.requestPostLogout({params:{username:$t()}}).then(function(){Pt(),e.$router.push({name:"login"})})}},created:function(){},mounted:function(){}},It=(i(161),Object(P.a)(Et,xt,[],!1,null,null,null));It.options.__file="src/components/sidebar/index.vue";var Nt=It.exports,Ot={name:"app",data:function(){return{}},components:{Sidebar:Nt},methods:{}},Bt=(i(162),Object(P.a)(Ot,wt,[],!1,null,"5e2104ef",null));Bt.options.__file="src/components/main/main.vue";var Dt=Bt.exports,jt=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"introduce"},[e._m(0),e._v(" "),i("div",{staticClass:"introduce-body"},[i("div",{staticClass:"introduce-body-title"},[e._v("\n Features\n ")]),e._v(" "),i("bc-row",[i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v(" Messaging model: support both P2P and Pub/Sub messaging model")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v(" Massive message storage, support RocketMQ and Kafka as storage engine")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v("Low latency & High throughput")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v("Delay message, use RocksDB as storage engine")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v("Transactional message: provide transaction similar to X/Open XA")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v("Multiple language client SDK: provide client SDK in PHP, Java, Go, C/C++, Python")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v("Message transition and filter with user-defined Groovy script")])])]),e._v(" "),i("bc-col",{attrs:{span:"12"}},[i("div",{staticClass:"introduce-body-text"},[i("li",[e._v("An easy-to-use Web Console")])])])],1)],1)])};jt._withStripped=!0;i(163);var Mt=Object(P.a)({},jt,[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"introduce-header"},[t("img",{attrs:{src:"logo-with-text.png",width:"128",height:"38"}}),this._v(" "),t("div",{staticClass:"introduce-header-text"},[this._v("\n DDMQ is a distributed messaging product built by DiDi Infrastructure Team based on "),t("a",{attrs:{href:"https://rocketmq.apache.org/",target:"_blank"}},[this._v("Apache RocketMQ")]),this._v(". As a distributed messaging middleware, DDMQ provides low latency, high throughput and high availability messaging service to many important systems inside "),t("a",{attrs:{href:"https://www.didiglobal.com/",target:"_blank"}},[this._v("DiDi")]),this._v(". DDMQ provides realtime messaging, delay-time messaging and transactional messaging to satisfy different scenarios. Through an easy-to-use Web Console and simple SDK Client, developers can experience producing and consuming messages in the most simple and stable way.\n ")])])}],!1,null,null,null);Mt.options.__file="src/pages/introduce.vue";var Lt=Mt.exports,At=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"login"},[i("div",{staticClass:"container"},[e._m(0),e._v(" "),i("bc-form",{ref:"loginForm",attrs:{rules:e.rules,model:e.form}},[i("bc-form-item",{attrs:{"label-width":0,prop:"username"}},[i("bc-input",{attrs:{placeholder:"Username"},model:{value:e.form.username,callback:function(t){e.$set(e.form,"username",t)},expression:"form.username"}}),e._v(" "),i("check-mark",{attrs:{valid:e.valid.username}})],1),e._v(" "),i("bc-form-item",{attrs:{"label-width":0,prop:"password"}},[i("bc-input",{attrs:{type:"password",placeholder:"Password"},nativeOn:{keyup:function(t){return"button"in t||!e._k(t.keyCode,"enter",13,t.key,"Enter")?e.handleSubmit(t):null}},model:{value:e.form.password,callback:function(t){e.$set(e.form,"password",t)},expression:"form.password"}}),e._v(" "),i("check-mark",{attrs:{valid:e.valid.password}})],1),e._v(" "),i("bc-form-item",{staticClass:"login-submit",attrs:{"label-width":0}},[i("bc-button",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],attrs:{type:"primary",long:"",size:"large",disabled:e.disableSubmit},on:{click:e.handleSubmit}},[e._v("Login")])],1)],1)],1),e._v(" "),i("div",{staticClass:"copyright"},[e._v("\n Powered by DiDi\n ")])])};At._withStripped=!0;var Rt=s.setToken,zt={name:"login",mixins:[Tt],components:{checkMark:{name:"checkMark",functional:!0,props:{valid:Boolean},render:function(e,t){return e("bc-icon",{class:["check-mark"],props:{type:t.props.valid?"check":"times"}},[""])}}},props:{},data:function(){return{prefix:"login",form:{username:"",password:""},valid:{username:!0,password:!0},loading:!1}},computed:{allValid:function(){return Object.values(this.valid).every(Boolean)},rules:function(){var e=this;return{username:[{validator:function(t,i,s){return""===i?(e.valid.username=!1,s(new Error("Empty username"))):(e.valid.username=!0,s())},trigger:"blur"}],password:[{validator:function(t,i,s){return""===i?(e.valid.password=!1,s(new Error("Empty password"))):(e.valid.password=!0,s())},trigger:"blur"}]}},disableSubmit:function(){return""===this.form.username||""===this.form.password}},methods:{handleSubmit:function(){var e=this;this.$refs.loginForm.validate(function(t){if(t){var i=e.form,s=i.username,a=i.password;e.loading=!0,e.requestPostLogin({params:{username:s,password:a}}).then(function(t){"success"===t.data?(Rt(s),e.$router.push({name:"intro"})):(e.$message.error("Username or Password incorrect"),e.$refs.loginForm.resetFields())}).finally(function(){e.loading=!1})}})}}},qt=(i(164),Object(P.a)(zt,At,[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"header"},[t("h1",[t("span",[this._v("DDMQ")]),t("span",[this._v("Login")])])])}],!1,null,null,null));qt.options.__file="src/pages/login/index.vue";var Gt=qt.exports,Vt=s.getToken;n.a.use(f.a);var Ut=new f.a({routes:[{path:"/login",name:"login",component:Gt},{path:"/",name:"index",component:Dt,children:[{path:"/",redirect:{name:"intro"}},{path:"/intro",name:"intro",component:Lt}].concat(h()(Le),h()(tt),h()(kt)).map(function(e){return d()({},e,{beforeRouteEnter:function(e,t,i){return Vt()||""?i():i({name:"login"})}})})}]}),Ft=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleClose,expression:"handleClose"}],staticClass:"autocomplete",class:{open:e.openSuggestion}},[i("bc-input",{staticClass:"bc-autocomplete-input",attrs:{type:"text"},on:{keydown:e.inputKeydown,"on-focus":e.focus,input:e.change},model:{value:e.selection,callback:function(t){e.selection=t},expression:"selection"}}),e._v(" "),i("div",{directives:[{name:"show",rawName:"v-show",value:e.open,expression:"open"}],staticClass:"autocomplete transition autocomplete__list"},[i("bc-base-drop",{staticClass:"bc-autocomplete-dropdown-menu"},[i("ul",e._l(e.matches,function(t,s){return i("li",{key:t,class:{active:e.isActive(s)},on:{click:function(t){e.suggestionClick(s)}}},[i("span",[e._v(e._s(t))])])}))])],1)],1)};Ft._withStripped=!0;var Wt={methods:{dispatch:function(e,t,i){for(var s=this.$parent||this.$root,a=s.$options.name;s&&(!a||a!==e);)(s=s.$parent)&&(a=s.$options.name);s&&s.$emit.apply(s,[t].concat(i))},broadcast:function(e,t,i){(function e(t,i,s){this.$children.forEach(function(a){a.$options.name===t?a.$emit.apply(a,[i].concat(s)):e.apply(a,[t,i].concat([s]))})}).call(this,e,t,i)}}},Ht={name:"bc-autocomplete",mixins:[Wt],props:{value:{type:String|Number},initValue:{type:String},suggestions:{type:Array,required:!0},filterKeyName:{type:String}},data:function(){return{open:!1,current:0,selection:""}},computed:{matches:function(){var e=this,t=this.suggestions.filter(function(t){return("string"==typeof t?t:t[e.filterKeyName]).indexOf(e.selection)>=0});return t.length||(this.open=!1,this.$emit("value",this.selection),this.$emit("on-search",this.suggestions,this.selection)),t},openSuggestion:function(){return""!==this.selection&&""===this.matches&&!0===this.open}},methods:{inputKeydown:function(e){var t=e.keyCode;if(this.matches)switch(t){case 40:this.current++;break;case 38:this.current--;break;case 13:this.selection=this.matches(this.current),this.$emit("value",this.selection),this.open=!1;break;case 27:this.open=!1}},isActive:function(e){return{"focus-list":e==this.current}},change:function(){0==this.open&&(this.open=!0,this.current=0)},focus:function(){this.$emit("focus",this.selection),this.open=!0},blur:function(){var e=this;this.$emit("blur",this.selection),G(this,["DatePicker","TimePicker","Cascader","Search"])||this.dispatch("bc-form-item","on-form-blur",this.selection),setTimeout(function(){return e.open=!1},200)},handleClose:function(){this.open=!1},suggestionClick:function(e){var t=this.matches[e];this.selection=t,this.open=!1,this.$emit("value",t),this.$emit("on-select",t),G(this,["DatePicker","TimePicker","Cascader","Search"])||this.dispatch("bc-form-item","on-form-blur",this.currentValue)}},mounted:function(){this.selection=this.initValue||""}},Kt=(i(165),Object(P.a)(Ht,Ft,[],!1,null,null,null));Kt.options.__file="src/ui-core/components/autocomplete/index.vue";var Qt=Kt.exports,Yt=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("transition",{attrs:{name:"fade"}},[e.closed?e._e():i("div",{class:e.wrapClasses},[e.showIcon?i("span",{class:e.iconClasses},[e._t("icon",[i("Icon",{attrs:{type:e.iconType||e.defaultIconType}})])],2):e._e(),e._v(" "),i("span",{class:e.messageClasses},[e._t("default")],2),e._v(" "),i("span",{class:e.descClasses},[e._t("description")],2),e._v(" "),e.closable?i("a",{class:e.closeClasses,on:{click:e.close}},[e._t("close",[i("Icon",{attrs:{type:"ios-close-empty"}})])],2):e._e()])])};Yt._withStripped=!0;var Jt=function(){var e=this.$createElement;return(this._self._c||e)("i",{class:this.iconClasses})};Jt._withStripped=!0;var Xt={name:"bc-icon",props:{type:{type:String}},computed:{iconClasses:function(){return["".concat("bcui-icon"),"".concat("bcui-icon","-").concat(this.type)]}}},Zt=Object(P.a)(Xt,Jt,[],!1,null,null,null);Zt.options.__file="src/ui-core/components/icon/icon.vue";var ei=Zt.exports,ti=ei,ii={name:"bc-alert",components:{Icon:ti},props:{type:{validator:function(e){return R(e,["success","info","warning","error"])},default:"info"},closable:{type:Boolean,default:!1},showIcon:{type:Boolean,default:!1},banner:{type:Boolean,default:!1},iconType:{type:String}},data:function(){return{closed:!1,desc:!1,description:!1}},computed:{wrapClasses:function(){var e;return["".concat("bcui-alert"),"".concat("bcui-alert","--").concat(this.type),(e={},x()(e,"".concat("bcui-alert","--with-icon"),this.showIcon),x()(e,"".concat("bcui-alert","--with-description"),!!this.description),x()(e,"".concat("bcui-alert","--with-banner"),this.banner),e)]},messageClasses:function(){return"".concat("bcui-alert","__message")},descClasses:function(){return"".concat("bcui-alert","__description")},closeClasses:function(){return"".concat("bcui-alert","__close")},iconClasses:function(){return"".concat("bcui-alert","__icon")},defaultIconType:function(){var e="";switch(this.type){case"success":e="information-success";break;case"info":e="information-circle";break;case"warning":e="information-warning";break;case"error":e="information-fail"}return e}},methods:{close:function(e){this.closed=!0,this.$emit("on-close",e)}},mounted:function(){this.description=void 0!==this.$slots.description}},si=Object(P.a)(ii,Yt,[],!1,null,null,null);si.options.__file="src/ui-core/components/alert/alert.vue";var ai=si.exports,ni=function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"bcui-base-dropdown",style:this.styles},[this._t("default")],2)};ni._withStripped=!0;var oi=n.a.prototype.$isServer,ri=oi?function(){}:i(166),ci={props:{placement:{type:String,default:"bottom"},boundariesPadding:{type:Number,default:5},reference:Object,popper:Object,offset:{default:0},value:{type:Boolean,default:!1},transition:String,options:{type:Object,default:function(){return{modifiers:{computeStyle:{gpuAcceleration:!1}}}}}},data:function(){return{visible:this.value}},watch:{value:{immediate:!0,handler:function(e){this.visible=e,this.$emit("input",e)}},visible:function(e){e?(this.updatePopper(),this.$emit("on-popper-show")):this.$emit("on-popper-hide"),this.$emit("input",e)}},methods:{createPopper:function(){var e=this;if(!oi&&/^(top|bottom|left|right)(-start|-end)?$/g.test(this.placement)){var t=this.options,i=this.popper||this.$refs.popper,s=this.reference||this.$refs.reference;i&&s&&(this.popperJS&&this.popperJS.hasOwnProperty("destroy")&&this.popperJS.destroy(),t.placement=this.placement,t.modifiers&&(t.modifiers={}),t.modifiers.offset&&(t.modifiers.offset={}),t.modifiers.offset=this.offset,t.onCreate=function(){e.$nextTick(e.updatePopper),e.$emit("created",e)},this.popperJS=new ri(s,i,t))}},updatePopper:function(){oi||(this.popperJS?this.popperJS.update():this.createPopper())},doDestroy:function(){oi||this.visible||(this.popperJS.destroy(),this.popperJS=null)}},beforeDestroy:function(){oi||this.popperJS&&this.popperJS.destroy()}},li={name:"bc-base-drop",props:{placement:{type:String,default:"bottom-start"}},components:{},data:function(){return{popper:null,width:""}},computed:{styles:function(){var e={};return this.width&&(e.width="".concat(this.width,"px")),e}},methods:{update:function(){var e=this;this.popper?this.$nextTick(function(){e.popper.update()}):this.$nextTick(function(){e.popper=new ci(e.$parent.$refs.reference,e.$el,{gpuAcceleration:!1,placement:e.placement,boundariesPadding:0,forceAbsolute:!0,boundariesElement:"body"},{onCreate:function(t){e.resetTransformOrigin(t)}})}),"bc-select"===this.$parent.$options.name&&(this.width=parseInt(q(this.$parent.$el,"width")))},destroy:function(){var e=this;this.popper&&(this.resetTransformOrigin(this.popper),setTimeout(function(){e.popper.destroy(),e.popper=null},300))},resetTransformOrigin:function(e){var t={top:"bottom",bottom:"top"}[e.popper.getAttribute("x-placement").split("-")[0]];e.popper.style.transformOrigin="center ".concat(t)}},created:function(){this.$on("on-update-popper",this.update),this.$on("on-destroy-popper",this.destroy)},mounted:function(){},beforeDestroy:function(){this.popper&&this.popper.destroy()}},ui=Object(P.a)(li,ni,[],!1,null,null,null);ui.options.__file="src/ui-core/components/base-drop/base-drop.vue";var di=ui.exports,pi=di,hi=function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"bcui-breadcrumb"},[this._t("default")],2)};hi._withStripped=!0;var fi={name:"bc-breadcrumb",data:function(){return{}},created:function(){},components:{}},mi=Object(P.a)(fi,hi,[],!1,null,null,null);mi.options.__file="src/ui-core/components/breadcrumb/breadcrumb.vue";var vi=mi.exports,bi=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"bcui-breadcrumb__item"},[e.href?i("a",{staticClass:"bcui-breadcrumb__item-link",attrs:{href:e.href}},[e._t("default",[e._v("🍞默认值")])],2):e.route?i("router-link",{staticClass:"bcui-breadcrumb__item-link",attrs:{to:e.route}},[e._t("default",[e._v("🍞默认值")])],2):i("span",{staticClass:"bcui-breadcrumb__item-text"},[e._t("default",[e._v("🍞默认值")])],2),e._v(" "),i("span",{staticClass:"bcui-breadcrumb__separator"},[e._v("/")])],1)};bi._withStripped=!0;var gi={name:"bc-breadcrumb-item",props:{href:{type:String},route:{type:Object}},data:function(){return{}},created:function(){},components:{},methods:{}},_i=Object(P.a)(gi,bi,[],!1,null,null,null);_i.options.__file="src/ui-core/components/breadcrumb/breadcrumb-item.vue";var yi=_i.exports,Si=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleClose,expression:"handleClose"}],class:[e.classPrefix],on:{mouseenter:e.handleMouseEnter,mouseleave:e.handleMouseLeave}},[i("div",{ref:"reference",class:[e.classPrefix+"-rel"],on:{click:e.handleClick}},[e._t("default")],2),e._v(" "),i("transition",{attrs:{name:e.transition}},[i("div",{directives:[{name:"show",rawName:"v-show",value:e.show,expression:"show"}],ref:"drop",staticClass:"bcui-base-dropdown",nativeOn:{mouseenter:function(t){return e.handleMouseEnter(t)},mouseleave:function(t){return e.handleMouseLeave(t)}}},[e._t("list")],2)])],1)};Si._withStripped=!0;var Ci=function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"bcui-base-dropdown",style:this.styles},[this._t("default")],2)};Ci._withStripped=!0;var ki={name:"bc-base-drop",props:{placement:{type:String,default:"top-start"}},components:{},data:function(){return{popper:null,width:""}},computed:{styles:function(){var e={};return this.width&&(e.width="".concat(this.width,"px")),e}},methods:{update:function(){var e=this;this.popper?this.$nextTick(function(){e.popper.update()}):this.$nextTick(function(){e.popper=new ci(e.$parent.$refs.reference,e.$el,{gpuAcceleration:!1,placement:e.placement,modifiers:{preventOverflow:{boundariesElement:"scrollParent",escapeWithReference:!0},flip:{boundariesElement:"scrollParent",flipVariations:!0}}},{onCreate:function(t){e.resetTransformOrigin(t)}})})},destroy:function(){var e=this;this.popper&&(this.resetTransformOrigin(this.popper),setTimeout(function(){e.popper.destroy(),e.popper=null},300))},resetTransformOrigin:function(e){var t={top:"bottom",bottom:"top"}[e.popper.getAttribute("x-placement").split("-")[0]];e.popper.style.transformOrigin="center ".concat(t)}},created:function(){this.$on("on-update-popper",this.update),this.$on("on-destroy-popper",this.destroy)},mounted:function(){},beforeDestroy:function(){this.popper&&this.popper.destroy()}},wi=Object(P.a)(ki,Ci,[],!1,null,null,null);wi.options.__file="src/ui-core/components/dropdown/drop.vue";var xi=wi.exports,Ti={bind:function(e,t,i){function s(i){if(e.contains(i.target))return!1;t.expression&&t.value(i)}e.__vueClickOutside__=s,document.addEventListener("click",s)},update:function(){},unbind:function(e,t){document.removeEventListener("click",e.__vueClickOutside__),delete e.__vueClickOutside__}},$i={name:"bc-dropdown",directives:{clickoutside:Ti},props:{placement:{validator:function(e){return R(e,["top","bottom"])},default:"bottom"},visible:{type:Boolean,default:!1},trigger:{validator:function(e){return R(e,["click","hover","custom"])},default:"hover"}},components:{Drop:xi},data:function(){return{classPrefix:"bcui-dropdown",show:this.visible,timer:null}},watch:{visible:function(e){this.show=e},show:function(e){this.$emit("on-visible-change",e)}},computed:{transition:function(){return["bottom-start","bottom","bottom-end"].indexOf(this.placement)>-1?"slide-up":"fade"}},methods:{handleClick:function(){var e=this.trigger;if("custom"===e||"click"!==e)return!1;this.show=!this.show},handleMouseEnter:function(){var e=this,t=this.trigger;if("custom"===t||"hover"!==t)return!1;this.timer&&clearTimeout(this.timer),this.timer=setTimeout(function(){e.show=!0},150)},handleMouseLeave:function(){var e=this,t=this.trigger;if("custom"===t||"hover"!==t)return!1;this.timer&&(clearTimeout(this.timer),this.timer=setTimeout(function(){e.show=!1},150))},handleClose:function(){return"custom"!==this.trigger&&("click"===this.trigger&&void(this.show=!1))},hasParent:function(){var e=G(this,"bc-dropdown");return e||!1}},created:function(){this.$on("on-update-popper",this.update),this.$on("on-destroy-popper",this.destroy)},mounted:function(){var e=this;this.$on("on-click",function(t){var i=e.hasParent();i&&i.$emit("on-click",t)}),this.$on("on-hover-click",function(){var t=e.hasParent();t?(e.$nextTick(function(){if("custom"===e.trigger)return!1;e.show=!1}),t.$emit("on-hover-click")):e.$nextTick(function(){if("custom"===e.trigger)return!1;e.show=!1})}),this.$on("on-child-click",function(){e.$nextTick(function(){if("custom"===e.trigger)return!1;e.show=!0});var t=e.hasParent();t&&t.$emit("on-child-click")})}},Pi=Object(P.a)($i,Si,[],!1,null,null,null);Pi.options.__file="src/ui-core/components/dropdown/dropdown.vue";var Ei=Pi.exports,Ii=function(){var e=this.$createElement;return(this._self._c||e)("ul",{staticClass:"bcui-dropdown-menu"},[this._t("default")],2)};Ii._withStripped=!0;var Ni={name:"bc-dropdown-menu"},Oi=Object(P.a)(Ni,Ii,[],!1,null,null,null);Oi.options.__file="src/ui-core/components/dropdown/dropdown-menu.vue";var Bi=Oi.exports,Di=function(){var e=this.$createElement;return(this._self._c||e)("li",{class:this.itemClasses,on:{click:this.handleClick}},[this._t("default")],2)};Di._withStripped=!0;var ji={name:"bc-dropdown-item",components:{},props:{name:{type:[String,Number]},disabled:{type:Boolean,default:!1},selected:{type:Boolean,default:!1},divided:{type:Boolean,default:!1}},data:function(){return{}},watch:{},computed:{itemClasses:function(){var e;return["".concat("bcui-dropdown-item"),(e={},x()(e,"".concat("bcui-dropdown-item","--disabled"),this.disabled),x()(e,"".concat("bcui-dropdown-item","--selected"),this.selected),x()(e,"".concat("bcui-dropdown-item","--divided"),this.divided),e)]}},methods:{handleClick:function(){var e=G(this,"bc-dropdown"),t=this.$parent&&"bc-dropdown"===this.$parent.$options.name;this.disabled?this.$nextTick(function(){e.currentVisible=!0}):t?this.$parent.$emit("on-child-click"):e&&"bc-dropdown"===e.$options.name&&e.$emit("on-hover-click"),e.$emit("on-click",this.name),this.$emit("on-click",this.name)}},mounted:function(){}},Mi=(i(167),Object(P.a)(ji,Di,[],!1,null,null,null));Mi.options.__file="src/ui-core/components/dropdown/dropdown-item.vue";var Li=Mi.exports,Ai=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("button",{class:e.buttonClass,attrs:{type:e.htmlType,disabled:e.disabled},on:{click:e.handleClick}},[e.loading?i("bc-icon",{staticClass:"bcui-load-loop",attrs:{type:"loading"}}):e._e(),e._v(" "),e.icon&&!e.loading?i("bc-icon",{attrs:{type:e.icon}}):e._e(),e._v(" "),e.showSlot?i("span",{ref:"slot"},[e._t("default")],2):e._e()],1)};Ai._withStripped=!0;var Ri={name:"bc-button",components:{bcIcon:ei},props:{type:{type:String},shape:{type:String},size:{type:String},ghost:{type:Boolean,default:!1},loading:Boolean,disabled:Boolean,htmlType:{type:String,default:"button"},icon:String,long:{type:Boolean,default:!1}},data:function(){return{showSlot:!0}},created:function(){},computed:{buttonClass:function(){var e;return["".concat("bcui-button"),(e={},x()(e,"".concat("bcui-button","--").concat(this.type),!!this.type),x()(e,"".concat("bcui-button","--long"),this.long),x()(e,"".concat("bcui-button","--").concat(this.shape),!!this.shape),x()(e,"".concat("bcui-button","--").concat(this.size),!!this.size),x()(e,"".concat("bcui-button","--ghost"),!!this.ghost),x()(e,"".concat("bcui-button","--loading"),null!=this.loading&&this.loading),x()(e,"".concat("bcui-button","--icon-only"),!this.showSlot&&(!!this.icon||this.loading)),e)]}},methods:{handleClick:function(e){this.$emit("click",e)}},mounted:function(){this.showSlot=void 0!==this.$slots.default}},zi=Object(P.a)(Ri,Ai,[],!1,null,null,null);zi.options.__file="src/ui-core/components/button/button.vue";var qi=zi.exports,Gi=function(){var e=this.$createElement;return(this._self._c||e)("div",{class:this.classes},[this._t("default")],2)};Gi._withStripped=!0;var Vi={name:"bc-button-group",props:{size:{validator:function(e){return R(e,["small","large"])}},shape:{validator:function(e){return R(e,["circle","circle-outline"])}},vertical:{type:Boolean,default:!1}},components:{},data:function(){return{classPrefix:"bcui-button-group"}},computed:{classes:function(){var e;return["".concat("bcui-button-group"),(e={},x()(e,"".concat("bcui-button-group","--").concat(this.size),!!this.size),x()(e,"".concat("bcui-button-group","--").concat(this.shape),!!this.shape),x()(e,"".concat("bcui-button-group","--vertical"),this.vertical),e)]}},created:function(){},methods:{},mounted:function(){}},Ui=Object(P.a)(Vi,Gi,[],!1,null,null,null);Ui.options.__file="src/ui-core/components/button/button-group.vue";var Fi=Ui.exports;qi.install=function(e){e.component(qi.name,qi)};var Wi=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.cardClasses,style:e.cardStyles},[e.title||this.$slots.title?i("div",{class:e.classPrefix+"__head"},[i("div",{class:e.classPrefix+"__head-title"},[this.$slots.title?[e._t("title")]:e.title?[e._v(e._s(e.title))]:e._e()],2)]):e._e(),e._v(" "),this.$slots.extra?i("div",{class:e.classPrefix+"__extra"},[e._t("extra")],2):e._e(),e._v(" "),i("div",{class:e.classPrefix+"__body"},[e._t("default")],2)])};Wi._withStripped=!0;var Hi={name:"bc-card",props:{title:{type:String},extra:{type:String},bordered:{type:Boolean,default:!0},hoverable:{type:Boolean,default:!1},width:{type:Number|String}},components:{},data:function(){return{classPrefix:"bcui-card"}},computed:{cardClasses:function(){var e;return["".concat("bcui-card"),(e={},x()(e,"".concat("bcui-card","--bordered"),!!this.bordered),x()(e,"".concat("bcui-card","--hoverable"),!!this.hoverable),e)]},cardStyles:function(){if(this.width){var e=this.width;return"number"==typeof e&&(e+="px"),{width:e}}}},methods:{},mounted:function(){}},Ki=Object(P.a)(Hi,Wi,[],!1,null,null,null);Ki.options.__file="src/ui-core/components/card/card.vue";var Qi=Ki.exports;Qi.install=function(e){e.component(Qi.name,Qi)};var Yi=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("label",{class:e.wrapClasses},[i("span",{class:e.checkboxClasses},[i("span",{class:e.innerClasses}),e._v(" "),e.group?i("input",{directives:[{name:"model",rawName:"v-model",value:e.model,expression:"model"}],class:e.inputClasses,attrs:{type:"checkbox",disabled:e.disabled,name:e.name},domProps:{value:e.label,checked:Array.isArray(e.model)?e._i(e.model,e.label)>-1:e.model},on:{change:[function(t){var i=e.model,s=t.target,a=!!s.checked;if(Array.isArray(i)){var n=e.label,o=e._i(i,n);s.checked?o<0&&(e.model=i.concat([n])):o>-1&&(e.model=i.slice(0,o).concat(i.slice(o+1)))}else e.model=a},e.change]}}):e._e(),e._v(" "),e.group?e._e():i("input",{class:e.inputClasses,attrs:{type:"checkbox",disabled:e.disabled,name:e.name},domProps:{checked:e.currentValue},on:{change:e.change}})]),e._v(" "),i("span",{staticClass:"bcui-checkbox__label"},[e._t("default",[e.showSlot?i("span",[e._v(e._s(e.label))]):e._e()])],2)])};Yi._withStripped=!0;var Ji={name:"bc-checkbox",mixins:[Wt],props:{disabled:{type:Boolean,default:!1},value:{type:[String,Number,Boolean],default:!1},trueValue:{type:[String,Number,Boolean],default:!0},falseValue:{type:[String,Number,Boolean],default:!1},label:{type:[String,Number,Boolean]},indeterminate:{type:Boolean,default:!1},size:{validator:function(e){return R(e,["small","large","default"])}},name:{type:String}},data:function(){return{model:[],currentValue:this.value,group:!1,showSlot:!0,parent:G(this,"bc-checkbox-group")}},computed:{wrapClasses:function(){var e;return["".concat("bcui-checkbox"),(e={},x()(e,"".concat("bcui-checkbox","-group-item"),this.group),x()(e,"".concat("bcui-checkbox","--checked"),this.currentValue),x()(e,"".concat("bcui-checkbox","--disabled"),this.disabled),x()(e,"".concat("bcui-checkbox","--").concat(this.size),!!this.size),e)]},checkboxClasses:function(){var e;return["".concat("bcui-checkbox","__input"),(e={},x()(e,"".concat("bcui-checkbox","__input--checked"),this.currentValue),x()(e,"".concat("bcui-checkbox","__input--disabled"),this.disabled),x()(e,"".concat("bcui-checkbox","__input--indeterminate"),this.indeterminate),e)]},innerClasses:function(){return"".concat("bcui-checkbox","__inner")},inputClasses:function(){return"".concat("bcui-checkbox","__original-input")}},watch:{value:function(e){if(e!==this.trueValue&&e!==this.falseValue)throw"Value should be trueValue or falseValue.";this.updateModel()}},methods:{change:function(e){if(this.disabled)return!1;var t=e.target.checked;this.currentValue=t;var i=t?this.trueValue:this.falseValue;this.$emit("input",i),this.group?this.parent.change(this.model):(this.$emit("on-change",i),this.dispatch("bc-form-item","on-form-change",i))},updateModel:function(){this.currentValue=this.value===this.trueValue}},mounted:function(){this.parent=G(this,"bc-checkbox-group"),this.parent&&(this.group=!0),this.group?this.parent.updateModel(!0):(this.updateModel(),this.showSlot=void 0!==this.$slots.default)}},Xi=Object(P.a)(Ji,Yi,[],!1,null,null,null);Xi.options.__file="src/ui-core/components/checkbox/checkbox.vue";var Zi=Xi.exports,es=function(){var e=this.$createElement;return(this._self._c||e)("div",{class:this.classes},[this._t("default")],2)};es._withStripped=!0;var ts={name:"bc-checkbox-group",mixins:[Wt],props:{value:{type:Array,default:function(){return[]}},size:{validator:function(e){return R(e,["small","large","default"])}}},data:function(){return{currentValue:this.value,childrens:[]}},computed:{classes:function(){return["".concat("bcui-checkbox-group"),x()({},"".concat("bcui-checkbox-group","--").concat(this.size),!!this.size)]}},mounted:function(){this.updateModel(!0)},methods:{updateModel:function(e){var t=this.value;this.childrens=V(this,"bc-checkbox"),this.childrens&&this.childrens.forEach(function(i){i.model=t,e&&(i.currentValue=t.indexOf(i.label)>=0,i.group=!0)})},change:function(e){this.currentValue=e,this.$emit("input",e),this.$emit("on-change",e),this.dispatch("bc-form-item","on-form-change",e)}},watch:{value:function(){this.updateModel(!0)}}},is=Object(P.a)(ts,es,[],!1,null,null,null);is.options.__file="src/ui-core/components/checkbox/checkbox-group.vue";var ss=is.exports,as=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.mainClassPrefix},[i("transition",{attrs:{name:"drawer-layer"}},[i("div",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],class:e.layerClassPrefix,on:{click:e.handleLayerClick}})]),e._v(" "),i("transition",{attrs:{name:"drawer-slide"}},[i("div",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],class:e.innerClassPrefix,style:e.innerStyles,on:{click:e.handleInnerClick}},[i("div",{staticClass:"bc-drawer-content"},[e.closable?i("a",{class:[e.classPrefix+"-close"],on:{click:e.close}},[e._t("close",[i("bc-icon",{attrs:{type:"close"}})])],2):e._e(),e._v(" "),e.showHead?i("div",{class:[e.classPrefix+"-header"]},[e._t("header",[i("div",{class:[e.classPrefix+"-header__inner"]},[e._v(e._s(e.title))])])],2):e._e(),e._v(" "),i("div",{class:[e.classPrefix+"-body"]},[e._t("default")],2)])])])],1)};as._withStripped=!0;var ns={name:"bc-drawer",components:{},props:{value:{type:Boolean,default:!1},title:{type:String,default:""},closable:{type:Boolean,default:!0},maskClosable:{type:Boolean,default:!0},loading:{type:Boolean,default:!1},width:{type:Number,default:0},offsetTop:{type:Number,default:0}},data:function(){return{classPrefix:"bc-drawer",showHead:!0,visible:this.value}},watch:{value:function(e){this.visible=e},visible:function(e){}},computed:{mainClassPrefix:function(){return["bc-drawer",x()({},"".concat(this.customClass),!!this.customClass)]},layerClassPrefix:function(){return"".concat("bc-drawer","-layer")},innerClassPrefix:function(){return"".concat("bc-drawer","__inner")},innerStyles:function(){var e={};return this.width&&(e.width="".concat(this.width,"px")),this.offsetTop&&(e.top="".concat(this.offsetTop,"px")),e}},methods:{close:function(){this.visible=!1,this.$emit("input",!1),this.$emit("on-hide")},escClose:function(e){this.visible&&this.closable&&27===e.keyCode&&this.close()},handleLayerClick:function(){this.maskClosable&&this.close()},handleInnerClick:function(){}},mounted:function(){var e=!0;void 0!==this.$slots.header||this.title||(e=!1),this.showHead=e,document.addEventListener("keydown",this.escClose)},beforeDestroy:function(){document.removeEventListener("keydown",this.escClose)}},os=(i(168),Object(P.a)(ns,as,[],!1,null,null,null));os.options.__file="src/ui-core/components/drawer/drawer.vue";var rs=os.exports,cs=function(){var e=this.$createElement;return(this._self._c||e)("ul",{class:this.menuClasses,style:this.styles},[this._t("default")],2)};cs._withStripped=!0;var ls={name:"bc-menu",mixins:[Wt],props:{mode:{validator:function(e){return R(e,["horizontal","vertical"])}},accordion:{type:Boolean,default:!1},width:{type:String},activeName:{type:String},openedNames:{type:Array,default:function(){return[]}},router:Boolean},components:{},data:function(){return{items:{},submenus:{},currentName:this.activeName,openedMenus:this.openedNames?this.openedNames.slice(0):[]}},watch:{activeName:function(e){var t=this.items[e];t?(this.currentName=t.name,this.init()):this.currentName=""},openedNames:function(e){this.openedMenus=e},$route:function(e){e&&this.updateActiveName()}},computed:{menuClasses:function(){var e=this.mode;return["".concat("bcui-menu"),x()({},"".concat("bcui-menu","--").concat(e),e)]},styles:function(){var e={};return"vertical"===this.mode&&(e.width=this.width),e}},methods:{updateCurrentName:function(){this.currentName||(this.currentName=-1),this.broadcast("bc-submenu","on-update-active-name",{name:this.currentName,ative:!1}),this.broadcast("bc-menu-item","on-update-active-name",this.currentName)},updateOpenKeys:function(e,t){var i=this.openedMenus,s=i.indexOf(e);s>-1?i.splice(s,1):this.openedMenus.push(e)},updateOpened:function(){var e=this,t=V(this,"bc-submenu");t.length&&t.forEach(function(t){e.openedNames.indexOf(t.name)>-1&&(t.opened=!0)})},addItem:function(e){this.$set(this.items,e.name,e)},removeItem:function(e){delete this.items[e.name]},addSubmenu:function(e){this.$set(this.submenus,e.name,e)},removeSubmenu:function(e){delete this.submenus[e.name]},init:function(){var e=this,t=this.currentName,i=this.items[t];if(i&&"horizontal"!==this.mode){var s=i.path;s&&s.forEach(function(t){var i=e.submenus[t];i&&e.openMenu(t,i.path)})}},openMenu:function(e,t){var i=this.openedMenus;-1===i.indexOf(e)&&(this.accordion&&(this.openedMenus=i.filter(function(e){return-1!==t.indexOf(e)})),this.openedMenus.push(e))},closeMenu:function(e,t){this.openedMenus.splice(this.openedMenus.indexOf(e),1)},handleSubmenuClick:function(e){var t=e.name,i=e.path;-1!==this.openedMenus.indexOf(t)?(this.closeMenu(t,i),this.$emit("close",t,i)):(this.openMenu(t,i),this.$emit("open",t,i))},handleItemClick:function(e){e.name,e.path;this.currentName=e.name,"horizontal"===this.mode&&(this.openedMenus=[]),this.router&&this.routeToItem(e)},updateActiveName:function(){var e=this;this.$router&&V(this,"bc-menu-item").forEach(function(t){if(t.routeName.includes(e.$route.name)){var i=G(t,"bc-submenu");e.currentName=t.name,i&&e.openMenu(i.name,i.path)}})},routeToItem:function(e){var t=e.route||e.name;try{this.$router.push(t)}catch(e){console.error(e)}}},created:function(){this.updateActiveName()},mounted:function(){this.init(),this.updateActiveName(),this.$on("on-item-click",this.handleItemClick),this.$on("on-submenu-click",this.handleSubmenuClick)},beforeDestroy:function(){}},us=Object(P.a)(ls,cs,[],!1,null,null,null);us.options.__file="src/ui-core/components/menu/menu.vue";var ds=us.exports,ps=function(){var e=this,t=e.$createElement;return(e._self._c||t)("li",{class:e.menuItemClasses,on:{click:function(t){return t.stopPropagation(),e.handleMenuItemClick(t)}}},[e._t("default")],2)};ps._withStripped=!0;var hs={name:"bc-menu-item",mixins:[Wt],props:{name:{type:[String,Number]},disabled:{type:Boolean,default:!1},route:{type:Object},routeName:{type:Array,default:function(){return[]}}},components:{},data:function(){return{rootMenu:G(this,"bc-menu"),parentMenu:G(this,["bc-menu","bc-submenu"])}},computed:{menuItemClasses:function(){var e="".concat("bcui-menu","-item");return[e,x()({},"".concat(e,"--active"),this.active)]},menuItemLinkClasses:function(){return["".concat("bcui-menu","-item__link")]},active:function(){return this.name===this.rootMenu.currentName},path:function(){for(var e=[this.name],t=this.$parent;"bc-menu"!==t.$options.name;)t.name&&e.unshift(t.name),t=t.$parent;return e}},methods:{handleMenuItemClick:function(){this.dispatch("bc-menu","on-item-click",this),this.$emit("click",this)}},created:function(){this.parentMenu.addItem(this),this.rootMenu.addItem(this)},mounted:function(){},beforeDestroy:function(){this.parentMenu.removeItem(this),this.rootMenu.removeItem(this)}},fs=Object(P.a)(hs,ps,[],!1,null,null,null);fs.options.__file="src/ui-core/components/menu/menu-item.vue";var ms=fs.exports,vs=function(){var e=this.$createElement;return(this._self._c||e)("div",{})};vs._withStripped=!0;var bs={name:"bc-menu-group",props:{},components:{},data:function(){return{}},computed:{},methods:{},created:function(){},mounted:function(){},beforeDestory:function(){}},gs=Object(P.a)(bs,vs,[],!1,null,null,null);gs.options.__file="src/ui-core/components/menu/menu-group.vue";var _s=gs.exports,ys=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",{class:e.submenuClasses,on:{mouseenter:e.handleMouseenter,mouseleave:e.handleMouseleave}},[i("div",{ref:"reference",staticClass:"bcui-menu-submenu__title",on:{click:e.handleClick}},[e._t("title"),e._v(" "),i("bc-icon",{class:["bcui-menu-submenu__expand-icon"],attrs:{type:"triangle-bottom"}})],2),e._v(" "),i("transition",{attrs:{name:"slide"}},[i("ul",{directives:[{name:"show",rawName:"v-show",value:e.opened,expression:"opened"}],class:[e.classPrefix]},[e._t("default")],2)])],1)};ys._withStripped=!0;var Ss={name:"bc-submenu",mixins:[Wt],props:{name:{type:String,required:!0},trigger:{type:String,default:"click"}},components:{baseDropdown:Ei},data:function(){return{classPrefix:"bcui-menu",items:{},submenus:{},rootMenu:G(this,"bc-menu"),parentMenu:G(this,["bc-menu","bc-submenu"]),dropWidth:parseFloat(q(this.$el,"width"))}},computed:{submenuClasses:function(){var e,t="".concat("bcui-menu","-submenu");return[t,(e={},x()(e,"".concat(t,"--active"),this.active),x()(e,"".concat(t,"--opened"),this.opened),x()(e,"".concat(t,"--disabled"),this.disabled),e)]},submenuDropClasses:function(){return["".concat("bcui-menu","-submenu-dropdown")]},dropStyle:function(){var e={};return this.dropWidth&&(e.minWidth="".concat(this.dropWidth,"px")),e},path:function(){for(var e=[this.name],t=this.$parent;"bc-menu"!==t.$options.name;)t.name&&e.unshift(t.name),t=t.$parent;return e},mode:function(){return this.rootMenu.mode},opened:function(){return this.rootMenu.openedMenus.indexOf(this.name)>-1},active:{cache:!1,get:function(){var e=!1,t=this.submenus,i=this.items;return Object.keys(i).forEach(function(t){i[t].active&&(e=!0)}),Object.keys(t).forEach(function(i){t[i].active&&(e=!0)}),e}}},methods:{addItem:function(e){this.$set(this.items,e.name,e)},removeItem:function(e){delete this.items[e.name]},addSubmenu:function(e){this.$set(this.submenus,e.name,e)},removeSubmenu:function(e){delete this.submenus[e.name]},handleClick:function(){this.disabled||"click"!==this.trigger||this.dispatch("bc-menu","on-submenu-click",this)},handleMouseenter:function(){var e=this;this.disabled||"click"===this.trigger||(clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.rootMenu.openMenu(e.name,e.path)},300))},handleMouseleave:function(){var e=this;this.disabled||"click"===this.trigger||(clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.rootMenu.closeMenu(e.name,e.path)},300))}},created:function(){this.parentMenu.addSubmenu(this),this.rootMenu.addSubmenu(this)},mounted:function(){},beforeDestroy:function(){this.parentMenu.removeSubmenu(this),this.rootMenu.removeSubmenu(this)}},Cs=Object(P.a)(Ss,ys,[],!1,null,null,null);Cs.options.__file="src/ui-core/components/menu/submenu.vue";var ks=Cs.exports,ws=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("span",[i("transition",{attrs:{name:"fade"}},[i("div",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],class:e.maskClasses,on:{click:e.mask}})]),e._v(" "),i("div",{class:e.wrapClasses,on:{click:e.handleWrapClick}},[i("transition",{attrs:{name:"ease"}},[i("div",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],class:e.classes,style:e.mainStyles},[i("div",{class:[e.classPrefix+"-content"]},[e.closable?i("a",{class:[e.classPrefix+"-close"],on:{click:e.close}},[e._t("close",[i("bc-icon",{attrs:{type:"times"}})])],2):e._e(),e._v(" "),e.showHead?i("div",{class:[e.classPrefix+"-header"]},[e._t("header",[i("div",{class:[e.classPrefix+"-header-inner"]},[e._v(e._s(e.title))])])],2):e._e(),e._v(" "),i("div",{class:[e.classPrefix+"-body"]},[e._t("default")],2),e._v(" "),e.footerHide?e._e():i("div",{class:[e.classPrefix+"-footer"]},[e._t("footer",[i("bc-button",{nativeOn:{click:function(t){return e.cancel(t)}}},[e._v(e._s(e.cancelText))]),e._v(" "),i("bc-button",{attrs:{type:"primary",loading:e.buttonLoading},nativeOn:{click:function(t){return e.ok(t)}}},[e._v(e._s(e.okText))])])],2)])])])],1)],1)};ws._withStripped=!0;var xs={name:"bc-modal",components:{bcIcon:ti,bcButton:qi},props:{value:{type:Boolean,default:!1},closable:{type:Boolean,default:!0},maskClosable:{type:Boolean,default:!0},title:{type:String},width:{type:[Number,String],default:520},okText:{type:String,default:function(){return"Submit"}},cancelText:{type:String,default:function(){return"Cancel"}},loading:{type:Boolean,default:!1},styles:{type:Object},className:{type:String},footerHide:{type:Boolean,default:!1},scrollable:{type:Boolean,default:!1}},data:function(){return{classPrefix:"bcui-modal",wrapShow:!1,showHead:!0,buttonLoading:!1,visible:this.value}},computed:{wrapClasses:function(){var e;return["".concat("bcui-modal","-wrap"),(e={},x()(e,"".concat("bcui-modal","-hidden"),!this.wrapShow),x()(e,"".concat(this.className),!!this.className),e)]},maskClasses:function(){return"".concat("bcui-modal","-mask")},classes:function(){return"".concat("bcui-modal")},mainStyles:function(){var e={},t={width:"".concat(this.width,"px")},i=this.styles?this.styles:{};return Object.assign(e,t,i),e}},methods:{close:function(){this.visible=!1,this.$emit("input",!1),this.$emit("on-cancel")},mask:function(){this.maskClosable&&this.close()},handleWrapClick:function(e){var t=e.target.getAttribute("class");t&&t.indexOf("".concat("bcui-modal","-wrap"))>-1&&this.mask()},cancel:function(){this.close()},ok:function(){this.loading?this.buttonLoading=!0:(this.visible=!1,this.$emit("input",!1)),this.$emit("on-ok")},EscClose:function(e){this.visible&&this.closable&&27===e.keyCode&&this.close()},checkScrollBar:function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {{ cancelText }}\n {{ okText }}\n
\n
\n \n '),document.body.appendChild(s);var a=new n.a({el:s,components:{"bc-modal":$s,"bc-button":qi,"bc-icon":ei},data:Object.assign(t,{visible:!1,width:416,title:"",body:"",iconType:"",iconName:"",okText:"Submit",cancelText:"Cancel",showCancel:!1,loading:!1,buttonLoading:!1,scrollable:!1,buttonType:t.buttonType||"primary"}),computed:{iconTypeCls:function(){return["".concat("bcui-modal-confirm","-body-icon"),"".concat("bcui-modal-confirm","-body-icon-").concat(this.iconType)]},iconNameCls:function(){return["bcui-icon","bcui-icon-".concat(this.iconName)]}},methods:{cancel:function(){this.$children[0].visible=!1,this.buttonLoading=!1,this.onCancel(),this.remove()},ok:function(){this.loading?this.buttonLoading=!0:(this.$children[0].visible=!1,this.remove()),this.onOk()},remove:function(){var e=this;setTimeout(function(){e.destroy()},300)},destroy:function(){this.$destroy(),document.body.removeChild(this.$el),this.onRemove()},onOk:function(){},onCancel:function(){},onRemove:function(){}}});return{show:function(e){switch(a.$parent.showCancel=e.showCancel,a.$parent.iconType=e.icon,e.icon){case"info":a.$parent.iconName="info";break;case"success":a.$parent.iconName="confirm";break;case"warning":a.$parent.iconName="alert";break;case"error":a.$parent.iconName="error";break;case"confirm":a.$parent.iconName="info"}"width"in e&&(a.$parent.width=e.width),"title"in e&&(a.$parent.title=e.title),"content"in e&&(a.$parent.body=e.content),"okText"in e&&(a.$parent.okText=e.okText),"cancelText"in e&&(a.$parent.cancelText=e.cancelText),"onCancel"in e&&(a.$parent.onCancel=e.onCancel),"onOk"in e&&(a.$parent.onOk=e.onOk),"loading"in e&&(a.$parent.loading=e.loading),"scrollable"in e&&(a.$parent.scrollable=e.scrollable),a.$parent.buttonType=e.buttonType||"primary",a.$parent.onRemove=e.onRemove,a.visible=!0},remove:function(){a.visible=!1,a.$parent.buttonLoading=!1,a.$parent.remove()},component:a=a.$children[0]}};var Ps,Es=$s;function Is(){return Ps=Ps||Es.newInstance({closable:!1,maskClosable:!1,footerHide:!0})}function Ns(e){var t=Is();e.onRemove=function(){Ps=null},t.show(e)}Es.info=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.icon="info",e.showCancel=!1,Ns(e)},Es.success=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.icon="success",e.showCancel=!1,Ns(e)},Es.warning=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.icon="warning",e.showCancel=!1,Ns(e)},Es.error=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.icon="error",e.showCancel=!1,Ns(e)},Es.confirm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.icon="confirm",e.showCancel=!0,Ns(e)},Es.remove=function(){if(!Ps)return!1;Is().remove()};var Os=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.inputfieldClasses,style:e.inputStyles},["textarea"!==e.type?[e.prepend?i("div",{directives:[{name:"show",rawName:"v-show",value:e.slotReady,expression:"slotReady"}],ref:"prepend",class:[e.classPrefix+"__prepend"]},[e._t("prepend")],2):e._e(),e._v(" "),e.slotSelect?i("div",{class:[e.classPrefix+"__select"]},[e._t("select")],2):e._e(),e._v(" "),e.icon&&!e.loading&&"start"===e.iconPosition?i("icon",{staticClass:"bcui-inputfield__icon",attrs:{type:e.icon},nativeOn:{click:function(t){return e.handleIconClick(t)}}}):e._e(),e._v(" "),e.loading?i("icon",{staticClass:"bcui-inputfield__icon",attrs:{type:"loading"}}):e._e(),e._v(" "),e.icon&&!e.loading&&"end"===e.iconPosition?i("icon",{staticClass:"bcui-inputfield__icon",attrs:{type:e.icon},nativeOn:{click:function(t){return e.handleIconClick(t)}}}):e._e(),e._v(" "),i("input",{directives:[{name:"auto-focus",rawName:"v-auto-focus",value:e.autoFocus,expression:"autoFocus"}],class:e.inputClasses,attrs:{type:e.type,placeholder:e.placeholder,disabled:e.disabled,maxlength:e.maxlength,readonly:e.readonly,name:e.name,number:e.number},domProps:{value:e.currentValue},on:{keyup:function(t){return"button"in t||!e._k(t.keyCode,"enter",13,t.key,"Enter")?e.handleEnter(t):null},focus:e.handleFocus,blur:e.handleBlur,input:e.handleInput,change:e.handleChange}}),e._v(" "),e.append?i("div",{directives:[{name:"show",rawName:"v-show",value:e.slotReady,expression:"slotReady"}],ref:"append",class:[e.classPrefix+"__append"]},[e._t("append")],2):e._e()]:i("textarea",{directives:[{name:"auto-focus",rawName:"v-auto-focus",value:e.autoFocus,expression:"autoFocus"}],ref:"textarea",class:e.textareaClasses,style:e.textareaStyles,attrs:{placeholder:e.placeholder,disabled:e.disabled,rows:e.rows,maxlength:e.maxlength,readonly:e.readonly,name:e.name},domProps:{value:e.value},on:{keyup:function(t){return"button"in t||!e._k(t.keyCode,"enter",13,t.key,"Enter")?e.handleEnter(t):null},focus:e.handleFocus,blur:e.handleBlur,input:e.handleInput}})],2)};Os._withStripped=!0;var Bs={name:"bc-input",mixins:[Wt],components:{Icon:ei},props:{type:{type:String,default:"text"},value:{type:[String,Number],default:""},size:{validator:function(e){return-1!=["small","large"].indexOf(e)}},placeholder:{type:String,default:""},maxlength:{type:Number},disabled:{type:Boolean,default:!1},icon:String,iconPosition:{type:String,default:"end"},loading:Boolean,autosize:{type:[Boolean,Object],default:!1},autoFocus:{type:Boolean,default:!1},rows:{type:Number,default:8},readonly:{type:Boolean,default:!1},name:{type:String},number:{type:Boolean,default:!1},width:{type:[Number,String],default:""}},data:function(){return{currentValue:this.value,classPrefix:"bcui-inputfield",prepend:!0,append:!0,slotSelect:!1,slotReady:!1,textareaStyles:{}}},computed:{inputfieldClasses:function(){var e;return["".concat("bcui-inputfield"),(e={},x()(e,"".concat("bcui-inputfield","--").concat(this.size),!!this.size),x()(e,"".concat("bcui-inputfield","--extra"),this.prepend||this.append||this.slotSelect),e)]},inputClasses:function(){var e;return["".concat("bcui-inputfield__input"),(e={},x()(e,"".concat("bcui-inputfield__input","--").concat(this.size),!!this.size),x()(e,"".concat("bcui-inputfield__input","--iconed"),!!this.icon),x()(e,"".concat("bcui-inputfield__input","--extra"),this.prepend||this.append||this.slotSelect),x()(e,"".concat("bcui-inputfield__input","--disabled"),this.disabled),e)]},textareaClasses:function(){return["".concat("bcui-inputfield__textarea"),x()({},"".concat("bcui-inputfield__textarea","-disabled"),this.disabled)]},inputStyles:function(){var e={},t={width:this.width.toString().indexOf("%")>0?this.width:this.width+"px"},i=this.styles?this.styles:{};return Object.assign(e,t,i),e}},methods:{handleEnter:function(e){this.$emit("on-enter",e)},handleIconClick:function(e){this.$emit("on-icon-click",e)},handleFocus:function(e){this.$emit("on-focus",e)},handleBlur:function(e){this.$emit("on-blur",e),G(this,["DatePicker","TimePicker","Cascader","Search"])||this.dispatch("bc-form-item","on-form-blur",this.currentValue)},handleInput:function(e){var t=e.target.value;this.number&&(t=Number.isNaN(Number(t))?t:Number(t)),this.$emit("input",t),this.setCurrentValue(t),this.$emit("on-change",e)},handleChange:function(e){this.$emit("on-input-change",e)},setCurrentValue:function(e){e!==this.currentValue&&(this.$nextTick(function(){}),this.currentValue=e,G(this,["DatePicker","TimePicker","Cascader","Search"])||this.dispatch("bc-form-item","on-form-change",e))}},watch:{value:function(e){this.setCurrentValue(e)}},mounted:function(){"textarea"!==this.type?(this.prepend=void 0!==this.$slots.prepend,this.append=void 0!==this.$slots.append,this.slotSelect=void 0!==this.$slots.select):(this.prepend=!1,this.append=!1),this.slotReady=!0}},Ds=Object(P.a)(Bs,Os,[],!1,null,null,null);Ds.options.__file="src/ui-core/components/input/input.vue";var js=Ds.exports,Ms=function(){var e=this.$createElement;return(this._self._c||e)("div",{class:this.formClasses,style:this.formStyles},[this._t("default")],2)};Ms._withStripped=!0;var Ls={name:"bc-form",props:{model:{type:Object},rules:{type:Object},width:{type:[Number,String]},offset:{type:[Number,String],default:0},labelWidth:{type:Number},labelAlign:{type:String,validator:function(e){return R(e,["top","left","right"])},default:"right"},inline:{type:Boolean,default:!1},showMessage:{type:Boolean,default:!0}},components:{},data:function(){return{classPrefix:"bcui-form",fields:[]}},computed:{formClasses:function(){return["".concat("bcui-form"),"".concat("bcui-form","-label--").concat(this.labelAlign),x()({},"".concat("bcui-form","--inline"),this.inline)]},formStyles:function(){var e={},t={};if(this.width){var i=this.width.toString().indexOf("%")>0?this.width:this.width+"px";t.width=i}if(this.offset>0){var s=this.offset.toString().indexOf("%")>0?this.offset:this.offset+"px";t["margin-left"]=s}var a=this.styles?this.styles:{};return Object.assign(e,t,a),e}},watch:{rules:function(){this.validate()}},created:function(){var e=this;this.$on("on-form-item-add",function(t){return t&&e.fields.push(t),!1}),this.$on("on-form-item-remove",function(t){return t.prop&&e.fields.splice(e.fields.indexOf(t),1),!1})},methods:{resetFields:function(){this.fields.forEach(function(e){e.resetField()})},validate:function(e){var t=this,i=!0,s=0;this.fields.forEach(function(a){a.validate("",function(a){a&&(i=!1),"function"==typeof e&&++s===t.fields.length&&e(i,a)})})},validateField:function(e,t){var i=this.fields.filter(function(t){return t.prop===e})[0];if(!i)throw new Error("[Warn]: must call validateField with valid prop string!");i.validate("",t)}},mounted:function(){}},As=Object(P.a)(Ls,Ms,[],!1,null,null,null);As.options.__file="src/ui-core/components/form/form.vue";var Rs=As.exports,zs=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.formItemClasses},[e.label?i("label",{class:e.labelClasses,style:e.labelStyles},[e._t("label",[e._v(e._s(e.label)+" ")]),e.tooltip?[i("Tooltip",{class:[e.classPrefix+"__tooltip"],attrs:{content:e.tooltip,placement:e.tooltipPos}},[i("Icon",{attrs:{type:"-bangzhu"}})],1)]:e._e()],2):e._e(),e._v(" "),i("div",{class:[e.classPrefix+"__content"],style:e.contentStyles},[e._t("default"),e._v(" "),i("transition",{attrs:{name:"fade"}},["error"===e.validateState&&e.showMessage&&e.form.showMessage?i("div",{class:[e.classPrefix+"__error-tip"]},[e._v(e._s(e.validateMessage))]):e._e()])],2)])};zs._withStripped=!0;var qs=i(123),Gs=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:[e.classPrefix],on:{mouseenter:e.handleShowPopper,mouseleave:e.handleClosePopper}},[i("div",{ref:"reference",class:[e.classPrefix+"-rel"]},[e._t("default")],2),e._v(" "),i("transition",{attrs:{name:"fade"}},[i("div",{directives:[{name:"show",rawName:"v-show",value:!e.disabled&&(e.visible||e.always),expression:"!disabled && (visible || always)"},{name:"transfer-dom",rawName:"v-transfer-dom"}],ref:"popper",class:[e.classPrefix+"-popper"],attrs:{"data-transfer":e.transfer},on:{mouseenter:e.handleShowPopper,mouseleave:e.handleClosePopper}},[i("div",{class:[e.classPrefix+"-content"]},[i("div",{class:[e.classPrefix+"-arrow"]}),e._v(" "),i("div",{class:[e.classPrefix+"-inner"]},[e._t("content",[e._v(e._s(e.content))])],2)])])])],1)};function Vs(e){return void 0===e&&(e=document.body),!0===e?document.body:e instanceof window.Node?e:document.querySelector(e)}Gs._withStripped=!0;var Us={name:"bc-tooltip",directives:{TransferDom:{inserted:function(e,t,i){var s=t.value;if("true"!==e.dataset.transfer)return!1;e.className=e.className?e.className+" v-transfer-dom":"v-transfer-dom";var a=e.parentNode;if(a){var n=document.createComment(""),o=!1;!1!==s&&(a.replaceChild(n,e),Vs(s).appendChild(e),o=!0),e.__transferDomData||(e.__transferDomData={parentNode:a,home:n,target:Vs(s),hasMovedOut:o})}},componentUpdated:function(e,t){var i=t.value;if("true"!==e.dataset.transfer)return!1;var s=e.__transferDomData;if(s){var a=s.parentNode,n=s.home,o=s.hasMovedOut;!o&&i?(a.replaceChild(n,e),Vs(i).appendChild(e),e.__transferDomData=Object.assign({},e.__transferDomData,{hasMovedOut:!0,target:Vs(i)})):o&&!1===i?(a.replaceChild(e,n),e.__transferDomData=Object.assign({},e.__transferDomData,{hasMovedOut:!1,target:Vs(i)})):i&&Vs(i).appendChild(e)}},unbind:function(e){if("true"!==e.dataset.transfer)return!1;e.className=e.className.replace("v-transfer-dom",""),e.__transferDomData&&(!0===e.__transferDomData.hasMovedOut&&e.__transferDomData.parentNode&&e.__transferDomData.parentNode.appendChild(e),e.__transferDomData=null)}}},mixins:[ci],props:{placement:{validator:function(e){return R(e,["top","top-start","top-end","bottom","bottom-start","bottom-end","left","left-start","left-end","right","right-start","right-end"])},default:"top"},content:{type:[String,Number],default:""},delay:{type:Number,default:100},disabled:{type:Boolean,default:!1},controlled:{type:Boolean,default:!1},always:{type:Boolean,default:!1},transfer:{type:Boolean,default:!1}},data:function(){return{classPrefix:"bcui-tooltip"}},watch:{content:function(){this.updatePopper()}},methods:{handleShowPopper:function(){var e=this;this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.visible=!0},this.delay)},handleClosePopper:function(){var e=this;this.timeout&&(clearTimeout(this.timeout),this.controlled||(this.timeout=setTimeout(function(){e.visible=!1},100)))}},mounted:function(){this.always&&this.updatePopper()}},Fs=Object(P.a)(Us,Gs,[],!1,null,null,null);Fs.options.__file="src/ui-core/components/tooltip/tooltip.vue";var Ws=Fs.exports;function Hs(e,t){for(var i=e,s=(t=(t=t.replace(/\[(\w+)\]/g,".$1")).replace(/^\./,"")).split("."),a=0,n=s.length-1;a1&&void 0!==arguments[1]?arguments[1]:function(){},s=this.getFilteredRule(e);if(!s||0===s.length)return i(),!0;this.validateState="validating";var a={};a[this.prop]=s;var n=new qs.a(a),o={};o[this.prop]=this.fieldValue,n.validate(o,{firstFields:!0},function(e){t.validateState=e?"error":"success",t.validateMessage=e?e[0].message:"",i(t.validateMessage)})},resetField:function(){this.validateState="",this.validateMessage="";var e=this.form.model,t=this.fieldValue,i=this.prop;-1!==i.indexOf(":")&&(i=i.replace(/:/,"."));var s=Hs(e,i);Array.isArray(t)&&t.length>0?(this.validateDisabled=!0,s.o[s.k]=[]):t!==this.initialValue&&(this.validateDisabled=!0,s.o[s.k]=this.initialValue)},onFieldBlur:function(){this.validate("blur")},onFieldChange:function(){this.validateDisabled?this.validateDisabled=!1:this.validate("change")}},mounted:function(){var e=this;if(this.prop){this.dispatch("bc-form","on-form-item-add",this),Object.defineProperty(this,"initialValue",{value:this.fieldValue});var t=this.getRules();t.length&&(t.every(function(t){if(t.required)return e.isRequired=!0,!1}),this.$on("on-form-blur",this.onFieldBlur),this.$on("on-form-change",this.onFieldChange))}},beforeDestroy:function(){this.dispatch("bc-form","on-form-item-remove",this)}},Qs=Object(P.a)(Ks,zs,[],!1,null,null,null);Qs.options.__file="src/ui-core/components/form/form-item.vue";var Ys=Qs.exports,Js=function(){var e=this.$createElement;return(this._self._c||e)("div",{class:this.rowClasses,style:this.rowStyles},[this._t("default")],2)};Js._withStripped=!0;var Xs={name:"BcRow",components:{},props:{align:{},gutter:{type:Number,default:0},justify:{},type:{}},data:function(){return{}},watch:{gutter:function(e){this.updateGutter(e)}},computed:{rowClasses:function(){var e;return["".concat("bcui-row"),(e={},x()(e,"".concat("bcui-row","-").concat(this.type),!!this.type),x()(e,"".concat("bcui-row","-").concat(this.type,"-").concat(this.align),!!this.align),x()(e,"".concat("bcui-row","-").concat(this.type,"-").concat(this.justify),!!this.justify),x()(e,"".concat(this.className),!!this.className),e)]},rowStyles:function(){var e={};return 0!==this.gutter&&(e={marginLeft:this.gutter/-2+"px",marginRight:this.gutter/-2+"px"}),e}},methods:{updateGutter:function(e){var t=V(this,"BcCol");t.length&&t.forEach(function(t){0!==e&&(t.gutter=e)})}},mounted:function(){}},Zs=(i(201),Object(P.a)(Xs,Js,[],!1,null,null,null));Zs.options.__file="src/ui-core/components/grid/row.vue";var ea=Zs.exports,ta=function(){var e=this.$createElement;return(this._self._c||e)("div",{class:this.colClasses,style:this.colStyles},[this._t("default")],2)};ta._withStripped=!0;var ia=i(17),sa=i.n(ia),aa={name:"BcCol",components:{},props:{offset:{},order:{},pull:{},push:{},span:{type:Number|String},xs:{type:Number|Object},sm:{type:Number|Object},md:{type:Number|Object},lg:{type:Number|Object},xl:{type:Number|Object},xxl:{type:Number|Object}},data:function(){return{gutter:0}},watch:{},computed:{colClasses:function(){var e,t=this,i=["xs","sm","md","lg","xl","xxl"].map(function(e){var i=t[e],s={};return isNaN(i)?"object"===sa()(i)&&Object.keys(i).map(function(t){t&&(s["".concat("bcui-col","-").concat(e,"-").concat(t,"-").concat(i[t])]=!!i[t])}):s["".concat("bcui-col","-").concat(e,"-").concat(i)]=!0,s});return["".concat("bcui-col"),(e={},x()(e,"".concat("bcui-col","-").concat(this.span),!!this.span),x()(e,"".concat("bcui-col","-push-").concat(this.push),!!this.push),x()(e,"".concat("bcui-col","-pull-").concat(this.pull),!!this.pull),x()(e,"".concat("bcui-col","-offset-").concat(this.offset),!!this.offset),e)].concat(h()(i))},colStyles:function(){var e={};return 0!==this.gutter&&(e={paddingLeft:this.gutter/2+"px",paddingRight:this.gutter/2+"px"}),e}},methods:{updateGutter:function(){var e=G(this,"BcRow");e&&e.updateGutter(e.gutter)}},mounted:function(){this.updateGutter()},beforeDestroy:function(){this.updateGutter()}},na=(i(202),Object(P.a)(aa,ta,[],!1,null,null,null));na.options.__file="src/ui-core/components/grid/col.vue";var oa=na.exports,ra=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleClose,expression:"handleClose"}],class:e.classes,style:e.wrapperStyles},[i("div",{ref:"reference",class:[e.prefixCls+"__inner"],on:{click:e.toggleMenu}},[e._l(e.selectedMultiple,function(t,s){return i("div",{key:s,staticClass:"bcui-tag"},[i("span",{staticClass:"bcui-tag-text"},[e._v(e._s(t.label))]),e._v(" "),i("Icon",{attrs:{type:"times"},nativeOn:{click:function(t){t.stopPropagation(),e.removeTag(s)}}})],1)}),e._v(" "),i("span",{directives:[{name:"show",rawName:"v-show",value:e.showPlaceholder&&!e.filterable,expression:"showPlaceholder && !filterable"}],class:[e.prefixCls+"__placeholder"]},[e._v(e._s(e.localePlaceholder))]),e._v(" "),i("span",{directives:[{name:"show",rawName:"v-show",value:!e.showPlaceholder&&!e.multiple&&!e.filterable,expression:"!showPlaceholder && !multiple && !filterable"}],class:[e.prefixCls+"__selected-value"]},[e._v(e._s(e.selectedSingle))]),e._v(" "),e.filterable?i("input",{directives:[{name:"model",rawName:"v-model",value:e.query,expression:"query"}],ref:"input",class:[e.prefixCls+"__input"],style:e.inputStyle,attrs:{type:"text",placeholder:e.showPlaceholder?e.localePlaceholder:"",disabled:e.disabled},domProps:{value:e.query},on:{blur:e.handleBlur,keydown:[e.resetInputState,function(t){return"button"in t||!e._k(t.keyCode,"delete",[8,46],t.key,["Backspace","Delete"])?e.handleInputDelete(t):null}],input:function(t){t.target.composing||(e.query=t.target.value)}}}):e._e(),e._v(" "),i("Icon",{directives:[{name:"show",rawName:"v-show",value:e.showCloseIcon,expression:"showCloseIcon"}],class:[e.prefixCls+"__arrow"],attrs:{type:"times"},nativeOn:{click:function(t){return t.stopPropagation(),e.clearSingleSelect(t)}}}),e._v(" "),e.remote?e._e():i("Icon",{class:[e.prefixCls+"__arrow"],attrs:{type:"triangle-bottom"}})],2),e._v(" "),i("transition",{attrs:{name:e.transitionName}},[i("Drop",{directives:[{name:"show",rawName:"v-show",value:e.dropVisible,expression:"dropVisible"}],ref:"dropdown",staticClass:"bcui-select__dropdown",attrs:{placement:e.placement}},[i("ul",{directives:[{name:"show",rawName:"v-show",value:e.notFountShow,expression:"notFountShow"}],class:[e.prefixCls+"__empty"]},[i("li",[e._v(e._s(e.localeNotFoundText))])]),e._v(" "),i("ul",{directives:[{name:"show",rawName:"v-show",value:!e.notFound&&!e.remote||e.remote&&!e.loading&&!e.notFound,expression:"(!notFound && !remote) || (remote && !loading && !notFound)"}],class:[e.prefixCls+"__dropdown-list"]},[e._t("default")],2),e._v(" "),i("ul",{directives:[{name:"show",rawName:"v-show",value:e.loading,expression:"loading"}],class:[e.prefixCls+"__loading"]},[e._v(e._s(e.localeLoadingText))])])],1)],1)};ra._withStripped=!0;var ca="bcui-select",la={name:"bc-select",mixins:[Wt],components:{Icon:ti,Drop:pi},directives:{clickoutside:Ti},props:{value:{type:[String,Number,Array],default:""},label:{type:[String,Number,Array],default:""},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},placeholder:{type:String},filterable:{type:Boolean,default:!1},filterMethod:{type:Function},remote:{type:Boolean,default:!1},remoteMethod:{type:Function},loading:{type:Boolean,default:!1},loadingText:{type:String},size:{validator:function(e){return R(e,["small","large","default"])}},labelInValue:{type:Boolean,default:!1},notFoundText:{type:String},placement:{validator:function(e){return R(e,["top","bottom"])},default:"bottom"},width:{type:Number}},data:function(){return{prefixCls:ca,visible:!1,options:[],optionInstances:[],selectedSingle:"",selectedMultiple:[],focusIndex:0,query:"",lastQuery:"",selectToChangeQuery:!1,inputLength:20,notFound:!1,slotChangeDuration:!1,model:this.value,currentLabel:this.label}},computed:{classes:function(){var e;return["".concat(ca),(e={},x()(e,"".concat(ca,"--visible"),this.visible),x()(e,"".concat(ca,"--disabled"),this.disabled),x()(e,"".concat(ca,"--multiple"),this.multiple),x()(e,"".concat(ca,"--single"),!this.multiple),x()(e,"".concat(ca,"--show-clear"),this.showCloseIcon),x()(e,"".concat(ca,"--").concat(this.size),!!this.size),e)]},showPlaceholder:function(){var e=!1;return"string"==typeof this.model?""===this.model&&(e=!0):Array.isArray(this.model)?this.model.length||(e=!0):null===this.model&&(e=!0),e},showCloseIcon:function(){return!this.multiple&&this.clearable&&!this.showPlaceholder},wrapperStyles:function(){var e={};return this.width&&(e.width="".concat(this.width,"px")),e},inputStyle:function(){var e={};return this.multiple&&(this.showPlaceholder?e.width="100%":e.width="".concat(this.inputLength,"px")),e},localePlaceholder:function(){return void 0===this.placeholder?"请选择":this.placeholder},localeNotFoundText:function(){return void 0===this.notFoundText?"没有匹配数据":this.notFoundText},localeLoadingText:function(){return void 0===this.loadingText?"加载中...":this.loadingText},transitionName:function(){return"bottom"===this.placement?"slide-up":"slide-down"},dropVisible:function(){var e=!0,t=this.$slots.default||[];return this.loading||!this.remote||""!==this.query||t.length||(e=!1),this.visible&&e},notFountShow:function(){var e=this.$slots.default||[];return this.notFound&&!this.remote||this.remote&&!this.loading&&!e.length}},methods:{toggleMenu:function(){if(this.disabled)return!1;this.visible=!this.visible},hideMenu:function(){this.visible=!1,this.focusIndex=0,this.broadcast("bc-option","on-select-close")},findChild:function(e){var t=function t(i){i.$options.componentName?e(i):i.$children.length&&i.$children.forEach(function(e){t(e)})};this.optionInstances.length?this.optionInstances.forEach(function(e){t(e)}):this.$children.forEach(function(e){t(e)})},updateOptions:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=[],a=1;this.findChild(function(i){s.push({value:i.value,label:void 0===i.label?i.$el.innerHTML:i.label}),i.index=a++,e&&t.optionInstances.push(i)}),this.options=s,e&&(this.remote||(this.updateSingleSelected(!0,i),this.updateMultipleSelected(!0,i)))},updateSingleSelected:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=sa()(this.model);if("string"===i||"number"===i){for(var s=!1,a=0;a0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.multiple&&Array.isArray(this.model)){for(var i=this.remote?this.selectedMultiple:[],s=0;s1&&void 0!==arguments[1]&&arguments[1];if(!this.multiple){var i="";this.findChild(function(t){t.value===e?(t.selected=!0,i=void 0===t.label?t.$el.innerHTML:t.label):t.selected=!1}),this.hideMenu(),t||(this.labelInValue?(this.$emit("on-change",{value:e,label:i}),this.dispatch("bc-form-item","on-form-change",{value:e,label:i})):(this.$emit("on-change",e),this.dispatch("bc-form-item","on-form-change",e)))}},toggleMultipleSelected:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.multiple){for(var i=[],s=0;s=0?(t.selected=!0,i[s].label=void 0===t.label?t.$el.innerHTML:t.label):t.selected=!1}),t||(this.labelInValue?(this.$emit("on-change",i),this.dispatch("bc-form-item","on-form-change",i)):(this.$emit("on-change",e),this.dispatch("bc-form-item","on-form-change",e)))}},handleClose:function(){this.hideMenu()},handleKeydown:function(e){if(this.visible){var t=e.keyCode;27===t&&(e.preventDefault(),this.hideMenu()),40===t&&(e.preventDefault(),this.navigateOptions("next")),38===t&&(e.preventDefault(),this.navigateOptions("prev")),13===t&&(e.preventDefault(),this.findChild(function(e){e.isFocus&&e.select()}))}},navigateOptions:function(e){var t=this;if("next"===e){var i=this.focusIndex+1;this.focusIndex=this.focusIndex===this.options.length?1:i}else if("prev"===e){var s=this.focusIndex-1;this.focusIndex=this.focusIndex<=1?this.options.length:s}var a={disabled:!1,hidden:!1},n=!1;this.findChild(function(e){e.index===t.focusIndex?(a.disabled=e.disabled,a.hidden=e.hidden,e.disabled||e.hidden||(e.isFocus=!0)):e.isFocus=!1,e.hidden||e.disabled||(n=!0)}),this.resetScrollTop(),(a.disabled||a.hidden)&&n&&this.navigateOptions(e)},resetScrollTop:function(){var e=this.focusIndex-1,t=this.optionInstances[e].$el.getBoundingClientRect().bottom-this.$refs.dropdown.$el.getBoundingClientRect().bottom,i=this.optionInstances[e].$el.getBoundingClientRect().top-this.$refs.dropdown.$el.getBoundingClientRect().top;t>0&&(this.$refs.dropdown.$el.scrollTop+=t),i<0&&(this.$refs.dropdown.$el.scrollTop+=i)},handleBlur:function(){var e=this;setTimeout(function(){var t=e.model;e.multiple?e.query="":""!==t?(e.findChild(function(i){i.value===t&&(e.query=void 0===i.label?i.searchLabel:i.label)}),e.remote&&e.query!==e.lastQuery&&e.$nextTick(function(){e.query=e.lastQuery})):e.query=""},300)},resetInputState:function(){this.inputLength=12*this.$refs.input.value.length+20},handleInputDelete:function(){this.multiple&&this.model.length&&""===this.query&&this.removeTag(this.model.length-1)},slotChange:function(){this.options=[],this.optionInstances=[]},setQuery:function(e){this.filterable&&(this.query=e)},modelToQuery:function(){var e=this;!this.multiple&&this.filterable&&void 0!==this.model&&this.findChild(function(t){e.model===t.value&&(t.label?e.query=t.label:t.searchLabel?e.query=t.searchLabel:e.query=t.value)})},broadcastQuery:function(e){!function e(t,i){var s=t.$children,a=null;if(s.length){s.forEach(function(e){e.$options.name===i&&(a=e)});for(var n=0;n-1:e.model===t.value}):(e.modelToQuery(),e.$nextTick(function(){e.broadcastQuery("")})),e.slotChange(),e.updateOptions(!0,!0)}),this.$on("remove",function(){e.remote?e.findChild(function(t){t.selected=e.multiple?e.model.indexOf(t.value)>-1:e.model===t.value}):(e.modelToQuery(),e.$nextTick(function(){e.broadcastQuery("")})),e.slotChange(),e.updateOptions(!0,!0)}),this.$on("on-select-selected",function(t){if(e.model===t)e.hideMenu();else if(e.multiple){var i=e.model.indexOf(t);i>=0?e.removeTag(i):(e.model.push(t),e.broadcast("Drop","on-update-popper")),e.filterable&&(""!==e.query&&(e.selectToChangeQuery=!0),e.query="",e.$refs.input.focus())}else e.model=t,e.filterable&&e.findChild(function(i){i.value===t&&(""!==e.query&&(e.selectToChangeQuery=!0),e.lastQuery=e.query=void 0===i.label?i.searchLabel:i.label)})})},beforeDestroy:function(){document.removeEventListener("keydown",this.handleKeydown)},watch:{value:function(e){this.model=e,""===e&&(this.query="")},label:function(e){this.currentLabel=e,this.updateLabel()},model:function(){var e=this;this.$emit("input",this.model),this.modelToQuery(),this.multiple?this.slotChangeDuration?this.slotChangeDuration=!1:this.updateMultipleSelected():this.updateSingleSelected(),!this.visible&&this.filterable&&this.$nextTick(function(){e.broadcastQuery("")})},visible:function(e){var t=this;if(e){if(this.filterable&&(this.multiple?this.$refs.input.focus():this.$refs.input.select(),this.remote)){this.findChild(function(e){e.selected=t.multiple?t.model.indexOf(e.value)>-1:t.model===e.value});var i=this.$slots.default||[];""===this.query||i.length||this.remoteMethod(this.query)}this.broadcast("Drop","on-update-popper")}else this.filterable&&(this.$refs.input.blur(),setTimeout(function(){t.broadcastQuery("")},300)),this.broadcast("Drop","on-destroy-popper")},query:function(e){var t=this;if(this.remote&&this.remoteMethod)this.selectToChangeQuery||(this.$emit("on-query-change",e),this.remoteMethod(e)),this.focusIndex=0,this.findChild(function(e){e.isFocus=!1});else{this.selectToChangeQuery||this.$emit("on-query-change",e),this.broadcastQuery(e);var i=!0;this.$nextTick(function(){t.findChild(function(e){e.hidden||(i=!1)}),t.notFound=i})}this.selectToChangeQuery=!1,this.broadcast("Drop","on-update-popper")}}},ua=Object(P.a)(la,ra,[],!1,null,null,null);ua.options.__file="src/ui-core/components/select/select.vue";var da=ua.exports,pa=function(){var e=this,t=e.$createElement;return(e._self._c||t)("li",{directives:[{name:"show",rawName:"v-show",value:!e.hidden,expression:"!hidden"}],class:e.classes,on:{click:function(t){return t.stopPropagation(),e.select(t)},mouseout:function(t){return t.stopPropagation(),e.blur(t)}}},[e._t("default",[e._v(e._s(e.showLabel))])],2)};pa._withStripped=!0;var ha={name:"bc-option",mixins:[Wt],componentName:"select-item",props:{value:{type:[String,Number],required:!0},label:{type:[String,Number]},disabled:{type:Boolean,default:!1}},data:function(){return{selected:!1,index:0,isFocus:!1,hidden:!1,searchLabel:""}},computed:{classes:function(){var e;return["".concat("bcui-select-item"),(e={},x()(e,"".concat("bcui-select-item","--disabled"),this.disabled),x()(e,"".concat("bcui-select-item","--selected"),this.selected),x()(e,"".concat("bcui-select-item","--focus"),this.isFocus),e)]},showLabel:function(){return this.label?this.label:this.value}},methods:{select:function(){if(this.disabled)return!1;this.dispatch("bc-select","on-select-selected",this.value)},blur:function(){this.isFocus=!1},queryChange:function(e){var t=e.replace(/(\^|\(|\)|\[|\]|\$|\*|\+|\.|\?|\\|\{|\}|\|)/g,"\\$1");this.hidden=!new RegExp(t,"i").test(this.searchLabel)}},compiled:function(){this.searchLabel=this.$el.innerHTML},mounted:function(){var e=this;this.searchLabel=this.$el.innerHTML,this.dispatch("bc-select","append"),this.$on("on-select-close",function(){e.isFocus=!1}),this.$on("on-query-change",function(t){e.queryChange(t)})},beforeDestroy:function(){this.dispatch("bc-select","remove")}},fa=Object(P.a)(ha,pa,[],!1,null,null,null);fa.options.__file="src/ui-core/components/select/option.vue";var ma=fa.exports,va=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",{directives:[{name:"show",rawName:"v-show",value:!e.hidden,expression:"!hidden"}],class:[e.prefixCls+"-wrap"]},[i("div",{class:[e.prefixCls+"-title"]},[e._v(e._s(e.label))]),e._v(" "),i("ul",[i("li",{ref:"options",class:[e.prefixCls]},[e._t("default")],2)])])};va._withStripped=!0;var ba={name:"bc-option-group",props:{label:{type:String,default:""}},data:function(){return{prefixCls:"bcui-select-group",hidden:!1}},methods:{queryChange:function(){var e=this;this.$nextTick(function(){for(var t=e.$refs.options.querySelectorAll(".bcui-select-item"),i=!1,s=0;s=this.$children.length||(e&&this.$children[this.current].currentStatus||(this.$children[this.current].currentStatus=this.status))}},mounted:function(){this.updateStepItem(!0),this.setNextError(),this.updateCurrent(!0)}},ka=(i(203),Object(P.a)(Ca,ya,[],!1,null,null,null));ka.options.__file="src/ui-core/components/steps/steps.vue";var wa=ka.exports,xa=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.stepItemClasses,style:e.stepItemStyles},[i("div",{class:[e.classPrefix+"-tail"]},[i("span",{class:[e.classPrefix+"-tail__line"]})]),e._v(" "),i("div",{class:[e.classPrefix+"-head"]},[i("div",{class:[e.classPrefix+"-head__inner"]},[e.showIcon?i("span",{class:e.iconClasses}):i("span",{staticClass:"bcui-steps-icon"},[e._v(e._s(e.stepNumber))])])]),e._v(" "),i("div",{class:[e.classPrefix+"-body"]},[e.title?i("div",{class:[e.classPrefix+"-title"]},[e._v(e._s(e.title))]):e._e(),e._v(" "),e.description?i("div",{class:[e.classPrefix+"-description"]},[e._v(e._s(e.description))]):e._e()])])};xa._withStripped=!0;var Ta={name:"bc-steps-item",components:{},props:{icon:{type:String,default:""},title:{type:String,default:""},description:{type:String,default:""},status:{validator:function(e){return R(e,["wait","process","finish","error"])}}},data:function(){return{classPrefix:"bcui-steps",stepNumber:"",stepLength:1,nextError:!1,currentStatus:""}},watch:{status:function(e){this.currentStatus=e,"error"===this.currentStatus&&this.$parent.setNextError()}},computed:{showIcon:function(){return this.icon||"finish"===this.currentStatus||"error"===this.currentStatus},stepItemClasses:function(){var e;return["".concat("bcui-steps","-item"),"".concat("bcui-steps","-status--").concat(this.currentStatus),(e={},x()(e,"".concat("bcui-steps","-custom"),!!this.icon),x()(e,"".concat("bcui-steps","-next-error"),this.nextError),e)]},iconClasses:function(){var e="";return this.icon?e=this.icon:"finish"===this.currentStatus?e="dui":"error"===this.currentStatus&&(e="close"),["".concat("bcui-steps","-icon"),"".concat("bcui-icon"),x()({},"".concat("bcui-icon","-").concat(e),""!==e)]},stepItemStyles:function(){return this.stepLength===this.stepNumber?{}:{marginRight:"-".concat(this.$parent.offset,"px"),width:"".concat(100/(this.stepLength-1),"%")}}},methods:{},created:function(){this.currentStatus=this.status},mounted:function(){}},$a=(i(204),Object(P.a)(Ta,xa,[],!1,null,null,null));$a.options.__file="src/ui-core/components/steps/steps-item.vue";var Pa=$a.exports,Ea=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("span",{class:e.siwtchClasses,style:e.customColor,on:{click:e.toggle}},[i("span",{class:e.innerClasses},[e.checked?e._t("open"):e._e(),e._v(" "),e.checked?e._e():e._t("close")],2)])};Ea._withStripped=!0;var Ia={name:"bc-switch",mixins:[Wt],props:{value:{type:[String,Boolean,Number],default:!1},checkedValue:{type:[String,Boolean,Number],default:!0},uncheckedValue:{type:[String,Boolean,Number],default:!1},checkedColor:{type:String},uncheckedColor:{type:String},disabled:{type:Boolean,default:!1},size:{validator:function(e){return R(e,["large","small"])}}},data:function(){return{currentValue:this.value}},computed:{siwtchClasses:function(){var e;return["".concat("bcui-switch"),(e={},x()(e,"".concat("bcui-switch","--checked"),this.currentValue===this.checkedValue),x()(e,"".concat("bcui-switch","--disabled"),this.disabled),x()(e,"".concat("bcui-switch","--").concat(this.size),!!this.size),e)]},innerClasses:function(){return"".concat("bcui-switch","__inner")},customColor:function(){var e=null;return this.checkedColor&&this.currentValue===this.checkedValue&&((e={}).backgroundColor=this.checkedColor,e.borderColor=this.checkedColor),this.uncheckedColor&&this.currentValue===this.uncheckedValue&&((e={}).backgroundColor=this.uncheckedColor,e.borderColor=this.uncheckedColor),e},checked:function(){return this.currentValue===this.checkedValue}},methods:{toggle:function(){if(this.disabled)return!1;var e=this.currentValue===this.checkedValue?this.uncheckedValue:this.checkedValue;this.currentValue=e,this.$emit("input",e),this.$emit("on-change",e),this.dispatch("bc-form-item","on-form-change",e)}},watch:{value:function(e){this.currentValue=e}}},Na=Object(P.a)(Ia,Ea,[],!1,null,null,null);Na.options.__file="src/ui-core/components/switch/switch.vue";var Oa=Na.exports,Ba=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.tabClasses},[i("div",{class:[e.classPrefix+"-header"]},[i("div",{class:e.navbarClasses},[e.scrollable?[i("div",{class:["bcui-tab-navbar-prev",e.scrollable.prev?"":"disabled"],on:{click:e.scrollPrev}},[i("i",{staticClass:"bcui-icon-arrow-left"})]),e._v(" "),i("div",{class:["bcui-tab-navbar-next",e.scrollable.next?"":"disabled"],on:{click:e.scrollNext}},[i("i",{staticClass:"bcui-icon-arrow-right"})])]:e._e(),e._v(" "),i("div",{ref:"navScroll",class:e.scrollClasses},[i("div",{ref:"navbar",class:[e.classPrefix+"-navbar__inner"],style:e.navStyle},[i("div",{class:e.activeBarClasses,style:e.activeBarStyle}),e._v(" "),e._l(e.navList,function(t,s){return i("div",{key:s,class:e.createTabItemClass(t),on:{click:function(t){e.handleChange(s)}}},[""!==t.icon?i("bc-icon",{attrs:{type:t.icon}}):e._e(),e._v(e._s(t.label)+"\n "),e.showClose(t)?i("bc-icon",{attrs:{type:"close"},nativeOn:{click:function(t){t.stopPropagation(),e.handleRemove(s)}}}):e._e()],1)})],2)])],2)]),e._v(" "),i("div",{class:[e.classPrefix+"-content"]},[e._t("default")],2)])};Ba._withStripped=!0;var Da={name:"bc-tab",components:{},props:{value:{type:[String,Number]},type:{validator:function(e){return R(e,["card"])},type:String},animated:{type:Boolean,default:!0},size:{type:String,default:""}},data:function(){return{classPrefix:"bcui-tab",navList:[],activeBarWidth:0,activeBarOffset:0,activeTab:this.value,navStyle:{transform:""},scrollable:!1}},computed:{tabClasses:function(){var e;return["".concat("bcui-tab"),(e={},x()(e,"".concat("bcui-tab","--card"),"card"===this.type),x()(e,"".concat("bcui-tab","--").concat(this.size),!!this.size),x()(e,"".concat("bcui-tab","--no-animation"),!this.animated),e)]},navbarClasses:function(){var e;return["".concat("bcui-tab-navbar"),(e={},x()(e,"".concat("bcui-tab-navbar","--card"),this.type),x()(e,"scrolled",!!this.scrollable),e)]},scrollClasses:function(){return["".concat("bcui-tab-navbar-scroll"),{}]},activeBarClasses:function(){var e="".concat("bcui-tab","-activebar");return[e,x()({},"".concat(e,"--animated"),this.animated)]},activeBarStyle:function(){var e=this.type,t=this.activeBarWidth,i=this.activeBarOffset,s=this.animated,a={display:"none",width:"".concat(t,"px")};return e||(a.display="block"),s&&(a.transform="translate3d(".concat(i,"px, 0px, 0px)")),a}},methods:{getTabList:function(){return this.$children.filter(function(e){return"bc-tab-pane"===e.$options.name})},initNavList:function(){var e=this;this.navList=[],this.paneList=this.getTabList(),this.paneList.forEach(function(t,i){e.navList.push({label:t.label,icon:t.icon||"",name:t.name||i,disabled:t.disabled,closable:t.closable}),0===i&&(e.activeTab||(e.activeTab=t.name||i))}),this.update(),this.updatePaneStatus(),this.updateActiveBarStatus()},createTabItemClass:function(e){var t,i="".concat("bcui-tab","-navbar__item");return[i,(t={},x()(t,"".concat(i,"--disabled"),e.disabled),x()(t,"".concat(i,"--active"),e.name===this.activeTab),t)]},handleChange:function(e){var t=this.navList[e];if(t.disabled)return!1;this.activeTab=t.name,this.$emit("input",t.name),this.$emit("on-tab-click",t.name)},handleRemove:function(e){var t=this.getTabList(),i=t[e];if(i.$destroy(),i.name===this.activeTab){var s=this.getTabList(),a=-1;if(s.length){var n=t.filter(function(t,i){return!t.disabled&&ie});a=o.length?o[0].currentName:n.length?n[n.length-1].currentName:s[0].currentName}this.activeTab=a,this.$emit("input",a)}this.$emit("on-tab-remove",i.currentName),this.initNavList()},showClose:function(e){return"card"===this.type&&(null!==e.closable?e.closable:this.closable)},updatePaneStatus:function(){var e=this;this.getTabList().forEach(function(t){t.show=t.name===e.activeTab})},updateActiveBarStatus:function(){var e=this;this.$nextTick(function(){var t=e.navList.findIndex(function(t){return t.name===e.activeTab});if(e.$refs.navbar){var i=e.$refs.navbar.querySelectorAll(".".concat("bcui-tab","-navbar__item")),s=i[t];if(e.activeBarWidth=parseFloat(q(s,"width")),t>0){for(var a=0,n="small"===e.size?0:parseFloat(q(s,"marginRight")),o=0;o2*t?i+t:e-t;this.setOffset(s)}},scrollPrev:function(){var e=this.$refs.navScroll.offsetWidth,t=this.getCurrentScrollOffset();if(t){var i=t>e?t-e:0;this.setOffset(i)}},update:function(){if(this.$refs.navbar&&this.$refs.navScroll){var e=this.$refs.navbar.offsetWidth,t=this.$refs.navScroll.offsetWidth,i=this.getCurrentScrollOffset();if(t0&&this.setOffset(0)}}},watch:{value:function(e){this.activeTab=e},activeTab:function(e,t){this.updatePaneStatus(),this.updateActiveBarStatus()}},updated:function(){this.update()},mounted:function(){this.initNavList()}},ja=Object(P.a)(Da,Ba,[],!1,null,null,null);ja.options.__file="src/ui-core/components/tab/tab.vue";var Ma=ja.exports,La=function(){var e=this.$createElement;return(this._self._c||e)("div",{directives:[{name:"show",rawName:"v-show",value:this.show,expression:"show"}],class:this.classPrefix},[this._t("default")],2)};La._withStripped=!0;var Aa={name:"bc-tab-pane",props:{name:{type:String},label:{type:String,default:""},icon:{type:String},disabled:{type:Boolean,default:!1},closable:{type:Boolean,default:null}},data:function(){return{classPrefix:"bcui-tab-pane",show:!1,currentName:this.name}},watch:{name:function(e){this.currentName=e,this.updateNav()},label:function(){this.updateNav()},icon:function(){this.updateNav()},disabled:function(){this.updateNav()}},components:{},created:function(){},mounted:function(){},methods:{updateNav:function(){this.$parent.initNavList()}},destroyed:function(){this.updateNav()}},Ra=Object(P.a)(Aa,La,[],!1,null,null,null);Ra.options.__file="src/ui-core/components/tab/tab-pane.vue";var za=Ra.exports,qa=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("transition",{attrs:{name:"fade"}},[i("div",{class:e.tagClasses,style:e.style.container&&e.style.container},[e.showDot?i("span",{class:e.dotClasses,style:e.style.dot&&e.style.dot}):e._e(),e._v(" "),i("span",{class:e.textClasses},[e._t("default")],2),e._v(" "),e.closable?i("bc-icon",{attrs:{type:"times"},nativeOn:{click:function(t){return t.stopPropagation(),e.close(t)}}}):e._e()],1)])};qa._withStripped=!0;var Ga={name:"bc-tag",props:{closable:{type:Boolean,default:!1},color:{type:String},type:{validator:function(e){return R(e,["border","dot"])}},name:{type:[String,Number]}},components:{"bc-icon":ti},data:function(){return{classPrefix:"bcui-tag"}},computed:{style:function(){var e=this.color;return!!e&&(0!=e.indexOf("#")&&R(this.color,["primary","warning","success"])?{}:"dot"==this.type?{dot:{backgroundColor:e},container:{}}:"border"==this.type?{dot:{},container:{borderColor:e,color:e}}:{dot:{},container:{borderColor:e,backgroundColor:e,color:"#fff"}})},tagClasses:function(){var e;return["".concat("bcui-tag"),(e={},x()(e,"".concat("bcui-tag","--").concat(this.color),!!this.color&&R(this.color,["primary","warning","success"])),x()(e,"".concat("bcui-tag","-").concat(this.type),!!this.type),x()(e,"".concat("bcui-tag","--closable"),this.closable),e)]},textClasses:function(){return"".concat("bcui-tag","-text")},dotClasses:function(){return"".concat("bcui-tag","-dot__inner")},showDot:function(){return!!this.type&&"dot"===this.type}},created:function(){},methods:{close:function(e){void 0===this.name?this.$emit("on-close",e):this.$emit("on-close",e,this.name)}},mounted:function(){}},Va=Object(P.a)(Ga,qa,[],!1,null,null,null);Va.options.__file="src/ui-core/components/tag/tag.vue";var Ua=Va.exports,Fa=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{class:this.classPrefix},this._l(this.model,function(e){return t("tree-node",{key:e,attrs:{model:e}})}))};Fa._withStripped=!0;var Wa=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",{class:e.classPrefix},[i("li",[i("div",{class:{bold:e.isParent}},[e.model.isParent||0==e.model.depth?i("span",{class:e.expandArrowClasses,on:{click:e.toggle}},[i("icon",{attrs:{type:"arrow-right"}})],1):e._e(),e._v(" "),0==e.model.depth?i("span",[i("icon",{attrs:{type:"leftroot"}})],1):e._e(),e._v(" "),e.model.depth>0&&!e.model.isParent?i("span",[i("icon",{attrs:{type:"node"}})],1):e._e(),e._v(" "),i("span",{class:e.nodeNameClasses,on:{click:function(t){e.handleNodeClick(e.model)}}},[e._v(e._s(e.model.name))])]),e._v(" "),i("transition",{attrs:{name:"move"}},[e.isParent?i("ul",{directives:[{name:"show",rawName:"v-show",value:e.open,expression:"open"}],class:e.classPrefix},e._l(e.model.children,function(e){return i("bc-tree-node",{key:e,attrs:{model:e}})})):e._e()])],1)])};Wa._withStripped=!0;var Ha={name:"bc-tree-node",props:{model:Object},mixins:[Wt],components:{Icon:ti},data:function(){return{open:this.model.open,classPrefix:"bcui-treenode"}},computed:{isParent:function(){return this.model.children&&this.model.children.length},expandArrowClasses:function(){var e="".concat("bcui-treenode","-arrow");return[e,x()({},"".concat(e,"--open"),!!this.open)]},nodeNameClasses:function(){return["".concat("bcui-treenode","-name"),{}]}},methods:{toggle:function(){this.isParent&&(this.open=!this.open)},changeType:function(){this.isParent||(this.$set(this.model,"children",[]),this.addChild(),this.open=!0)},addChild:function(){this.model.children.push({name:"new stuff"})},handleNodeClick:function(e){this.dispatch("bc-tree","on-node-click",this.model)}}},Ka=Object(P.a)(Ha,Wa,[],!1,null,null,null);Ka.options.__file="src/ui-core/components/tree/tree-node.vue";var Qa=Ka.exports,Ya={name:"tree",props:{model:{type:Array}},components:{TreeNode:Qa},data:function(){return{classPrefix:"bcui-tree"}},computed:{},methods:{},mounted:function(){var e=this;this.$on("on-node-click",function(t){e.$emit("on-click",t)})}},Ja=Object(P.a)(Ya,Fa,[],!1,null,null,null);Ja.options.__file="src/ui-core/components/tree/tree.vue";var Xa=Ja.exports;Xa.install=function(e){e.component(Xa.name,Xa)};var Za=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.simple?i("ul",{class:e.simpleWrapClasses,style:e.styles},[i("li",{class:e.prevClasses,attrs:{title:e.Previous},on:{click:e.prev}},[i("a",[i("bc-icon",{attrs:{type:"chevron-left"}})],1)]),e._v(" "),i("div",{class:e.simplePagerClasses,attrs:{title:e.currentPage+"/"+e.allPages}},[i("input",{attrs:{type:"text"},domProps:{value:e.currentPage},on:{keydown:e.keyDown,keyup:e.keyUp,change:e.keyUp}}),e._v(" "),i("span",[e._v("/")]),e._v(" "+e._s(e.allPages)+"\n ")]),e._v(" "),i("li",{class:e.nextClasses,attrs:{title:e.Next},on:{click:e.next}},[i("a",[i("bc-icon",{attrs:{type:"chevron-right"}})],1)])]):i("ul",{class:e.wrapClasses,style:e.styles},[e.showTotal?i("span",{class:[e.prefixCls+"-total"]},[e._t("default",[e._v("Total "+e._s(e.total)+" "),(e.total,[e._v("items")])])],2):e._e(),e._v(" "),i("li",{class:e.prevClasses,attrs:{title:"Previous"},on:{click:e.prev}},[i("a",[i("bc-icon",{attrs:{type:"chevron-left"}})],1)]),e._v(" "),i("li",{class:e.firstPageClasses,attrs:{title:"1"},on:{click:function(t){e.changePage(1)}}},[i("a",[e._v("1")])]),e._v(" "),e.currentPage-3>1?i("li",{class:[e.prefixCls+"-item-jump-prev"],attrs:{title:"向前 5 页"},on:{click:e.fastPrev}},[i("a",[i("bc-icon",{attrs:{type:"chevron-left-double"}})],1)]):e._e(),e._v(" "),e.currentPage-2>1?i("li",{class:[e.prefixCls+"-item"],attrs:{title:e.currentPage-2},on:{click:function(t){e.changePage(e.currentPage-2)}}},[i("a",[e._v(e._s(e.currentPage-2))])]):e._e(),e._v(" "),e.currentPage-1>1?i("li",{class:[e.prefixCls+"-item"],attrs:{title:e.currentPage-1},on:{click:function(t){e.changePage(e.currentPage-1)}}},[i("a",[e._v(e._s(e.currentPage-1))])]):e._e(),e._v(" "),1!=e.currentPage&&e.currentPage!=e.allPages?i("li",{class:[e.prefixCls+"-item",e.prefixCls+"-item-active"],attrs:{title:e.currentPage}},[i("a",[e._v(e._s(e.currentPage))])]):e._e(),e._v(" "),e.currentPage+11?i("li",{class:e.lastPageClasses,attrs:{title:e.allPages},on:{click:function(t){e.changePage(e.allPages)}}},[i("a",[e._v(e._s(e.allPages))])]):e._e(),e._v(" "),i("li",{class:e.nextClasses,attrs:{title:"Next"},on:{click:e.next}},[i("a",[i("bc-icon",{attrs:{type:"chevron-right"}})],1)]),e._v(" "),i("li",{staticClass:"bcui-page-item-options"},[i("bc-page-item",{attrs:{"show-sizer":e.showSizer,"page-size":e.currentPageSize,"page-size-opts":e.pageSizeOpts,"show-elevator":e.showElevator,_current:e.currentPage,current:e.currentPage,"all-pages":e.allPages,"is-small":e.isSmall},on:{"on-size":e.onSize,"on-page":e.onPage}})],1)])};Za._withStripped=!0;var en=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.showSizer||e.showElevator?i("div",{class:e.optsClasses},[e.showSizer?i("div",{class:e.sizerClasses},[i("bc-select",{attrs:{size:e.size},on:{"on-change":e.changeSize},model:{value:e.currentPageSize,callback:function(t){e.currentPageSize=t},expression:"currentPageSize"}},e._l(e.pageSizeOpts,function(t){return i("bc-option",{key:t,staticStyle:{"text-align":"center"},attrs:{value:t}},[e._v(e._s(t)+" "+e._s("/page"))])}))],1):e._e(),e._v(" "),e.showElevator?i("div",{class:e.ElevatorClasses},[e._v("\n "+e._s("Goto")+"\n "),i("input",{attrs:{type:"text"},domProps:{value:e._current},on:{keyup:function(t){return"button"in t||!e._k(t.keyCode,"enter",13,t.key,"Enter")?e.changePage(t):null}}}),e._v(" "+e._s("page")+"\n ")]):e._e()]):e._e()};en._withStripped=!0;var tn={name:"bc-pagination-option",components:{"bc-select":da,"bc-option":ma},props:{pageSizeOpts:Array,showSizer:Boolean,showElevator:Boolean,current:Number,_current:Number,pageSize:Number,allPages:Number,isSmall:Boolean},data:function(){return{currentPageSize:this.pageSize}},watch:{pageSize:function(e){this.currentPageSize=e}},computed:{size:function(){return this.isSmall?"small":"default"},optsClasses:function(){return["".concat("bcui-page","-options")]},sizerClasses:function(){return["".concat("bcui-page","-options-sizer")]},ElevatorClasses:function(){return["".concat("bcui-page","-options-elevator")]}},methods:{changeSize:function(){this.$emit("on-size",this.currentPageSize)},changePage:function(e){var t=e.target.value.trim(),i=0;if(/^[1-9][0-9]*$/.test(t+"")){if((t=Number(t))!=this.current){var s=this.allPages;i=t>s?s:t}}else i=1;i&&(this.$emit("on-page",i),e.target.value=i)}}},sn=Object(P.a)(tn,en,[],!1,null,null,null);sn.options.__file="src/ui-core/components/pagination/options.vue";var an=sn.exports,nn={name:"bc-pagination",components:{"bc-page-item":an,"bc-icon":ti},props:{current:{type:Number,default:1},total:{type:Number,default:0},pageSize:{type:Number,default:10},pageSizeOpts:{type:Array,default:function(){return[10,20,30,40]}},size:{validator:function(e){return R(e,["small"])}},simple:{type:Boolean,default:!1},showTotal:{type:Boolean,default:!1},showElevator:{type:Boolean,default:!1},showSizer:{type:Boolean,default:!1},className:{type:String},styles:{type:Object}},data:function(){return{prefixCls:"bcui-page",currentPage:this.current,currentPageSize:this.pageSize}},watch:{current:function(e){this.currentPage=e},pageSize:function(e){this.currentPageSize=e}},computed:{isSmall:function(){return!!this.size},allPages:function(){var e=Math.ceil(this.total/this.currentPageSize);return 0===e?1:e},simpleWrapClasses:function(){return["".concat("bcui-page"),"".concat("bcui-page","-simple"),x()({},"".concat(this.className),!!this.className)]},simplePagerClasses:function(){return"".concat("bcui-page","-simple-pager")},wrapClasses:function(){var e;return["".concat("bcui-page"),(e={},x()(e,"".concat(this.className),!!this.className),x()(e,"mini",!!this.size),e)]},prevClasses:function(){return["".concat("bcui-page","-prev"),x()({},"".concat("bcui-page","-disabled"),1===this.currentPage)]},nextClasses:function(){return["".concat("bcui-page","-next"),x()({},"".concat("bcui-page","-disabled"),this.currentPage===this.allPages)]},firstPageClasses:function(){return["".concat("bcui-page","-item"),x()({},"".concat("bcui-page","-item-active"),1===this.currentPage)]},lastPageClasses:function(){return["".concat("bcui-page","-item"),x()({},"".concat("bcui-page","-item-active"),this.currentPage===this.allPages)]}},methods:{changePage:function(e){this.currentPage!=e&&(this.currentPage=e,this.$emit("on-change",e))},prev:function(){var e=this.currentPage;if(e<=1)return!1;this.changePage(e-1)},next:function(){var e=this.currentPage;if(e>=this.allPages)return!1;this.changePage(e+1)},fastPrev:function(){var e=this.currentPage-5;e>0?this.changePage(e):this.changePage(1)},fastNext:function(){var e=this.currentPage+5;e>this.allPages?this.changePage(this.allPages):this.changePage(e)},onSize:function(e){this.currentPageSize=e,this.changePage(1),this.$emit("on-page-size-change",e)},onPage:function(e){this.changePage(e)},keyDown:function(e){var t=e.keyCode;t>=48&&t<=57||8==t||37==t||39==t||e.preventDefault()},keyUp:function(e){var t=e.keyCode,i=parseInt(e.target.value);if(38===t)this.prev();else if(40===t)this.next();else if(13==t){var s=1;s=i>this.allPages?this.allPages:i<=0?1:i,e.target.value=s,this.changePage(s)}}}},on=Object(P.a)(nn,Za,[],!1,null,null,null);on.options.__file="src/ui-core/components/pagination/pagination.vue";var rn=on.exports,cn=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleClose,expression:"handleClose"}],class:[e.wrapperClasses],on:{mouseenter:e.handleMouseEnter,mouseleave:e.handleMouseLeave}},[i("div",{ref:"reference",class:[e.classPrefix+"-rel"],on:{click:e.handleClick}},[e._t("default")],2),e._v(" "),i("transition",{attrs:{name:e.transition}},[i("Drop",{directives:[{name:"show",rawName:"v-show",value:e.show,expression:"show"}],ref:"drop",class:["bcui-popover__inner"],attrs:{placement:e.placement},nativeOn:{mouseenter:function(t){return e.handleMouseEnter(t)},mouseleave:function(t){return e.handleMouseLeave(t)}}},[i("div",{class:[e.classPrefix+"__body"]},[i("div",{class:[e.classPrefix+"__arrow"]}),e._v(" "),i("div",{class:[e.classPrefix+"__inner-content"]},[i("div",{class:[e.classPrefix+"__title"]},[e._t("title",[e._v(e._s(e.title))])],2),e._v(" "),i("div",{class:[e.classPrefix+"__content"]},[e._t("content",[e._v(e._s(e.content))])],2)])])])],1)],1)};cn._withStripped=!0;var ln=function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"bcui-base-dropdown",style:this.styles},[this._t("default")],2)};ln._withStripped=!0;var un={name:"bc-base-drop",props:{placement:{type:String,default:"top-start"}},components:{},data:function(){return{popper:null,width:""}},computed:{styles:function(){var e={};return this.width&&(e.width="".concat(this.width,"px")),e}},methods:{update:function(){var e=this;this.popper?this.$nextTick(function(){e.popper.update()}):this.$nextTick(function(){e.popper=new ci(e.$parent.$refs.reference,e.$el,{gpuAcceleration:!1,placement:e.placement,modifiers:{preventOverflow:{boundariesElement:"scrollParent",escapeWithReference:!0},flip:{boundariesElement:"scrollParent",flipVariations:!0}}},{onCreate:function(t){e.resetTransformOrigin(t)}})})},destroy:function(){var e=this;this.popper&&(this.resetTransformOrigin(this.popper),setTimeout(function(){e.popper.destroy(),e.popper=null},300))},resetTransformOrigin:function(e){var t={top:"bottom",bottom:"top"}[e.popper.getAttribute("x-placement").split("-")[0]];e.popper.style.transformOrigin="center ".concat(t)}},created:function(){this.$on("on-update-popper",this.update),this.$on("on-destroy-popper",this.destroy)},mounted:function(){},beforeDestroy:function(){this.popper&&this.popper.destroy()}},dn=Object(P.a)(un,ln,[],!1,null,null,null);dn.options.__file="src/ui-core/components/popover/popover-drop.vue";var pn=dn.exports,hn={name:"bc-popover",directives:{clickoutside:Ti},props:{placement:{validator:function(e){return R(e,["top","top-start","top-end","bottom","bottom-start","bottom-end","left","left-start","left-end","right","right-start","right-end"])},default:"top"},value:{type:Boolean,default:!1},title:{type:String},content:{type:String},trigger:{validator:function(e){return R(e,["click","hover","focus","custom"])},default:"click"}},components:{Drop:pn},data:function(){return{classPrefix:"bcui-popover",show:this.value,timer:null}},watch:{value:function(e){this.show=e},show:function(e){e?this.$refs.drop.update():this.$refs.drop.destroy(),this.$emit("on-visible-change",e),this.$emit("input",e)}},computed:{transition:function(){return["bottom-start","bottom","bottom-end"].indexOf(this.placement)>-1?"slide-up":"fade"},wrapperClasses:function(){return["".concat("bcui-popover"),"".concat("bcui-popover","-placement-").concat(this.placement)]}},methods:{handleClick:function(){var e=this.trigger;if("custom"===e||"click"!==e)return!1;this.show=!this.show},handleMouseEnter:function(){var e=this,t=this.trigger;if("custom"===t||"hover"!==t)return!1;this.timer&&clearTimeout(this.timer),this.timer=setTimeout(function(){e.show=!0},150)},handleMouseLeave:function(){var e=this,t=this.trigger;if("custom"===t||"hover"!==t)return!1;this.timer&&(clearTimeout(this.timer),this.timer=setTimeout(function(){e.show=!1},150))},handleFocus:function(){},handleBlur:function(){},handleClose:function(){return"custom"!==this.trigger&&("click"===this.trigger&&void(this.show=!1))},hasParent:function(){var e=G(this,"bc-dropdown");return e||!1}},created:function(){this.$on("on-update-popper",this.update),this.$on("on-destroy-popper",this.destroy)},mounted:function(){var e=this;this.$on("on-click",function(t){var i=e.hasParent();i&&i.$emit("on-click",t)}),this.$on("on-hover-click",function(){var t=e.hasParent();t?(e.$nextTick(function(){if("custom"===e.trigger)return!1;e.show=!1}),t.$emit("on-hover-click")):e.$nextTick(function(){if("custom"===e.trigger)return!1;e.show=!1})}),this.$on("on-child-click",function(){e.$nextTick(function(){if("custom"===e.trigger)return!1;e.show=!0});var t=e.hasParent();t&&t.$emit("on-child-click")})}},fn=Object(P.a)(hn,cn,[],!1,null,null,null);fn.options.__file="src/ui-core/components/popover/index.vue";var mn=fn.exports,vn=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.progressClasses},["circle"===e.type?[i("div",{class:e.circleClassPrefix,style:e.circleSizeStyle},[i("svg",{attrs:{viewBox:"0 0 100 100"}},[i("path",{staticClass:"bcui-progress-circle__track",attrs:{d:e.trackPath,stroke:e.pathColor,"stroke-width":e.relativeStrokeWidth,fill:"none"}}),e._v(" "),i("path",{staticClass:"bcui-progress-circle__path",style:e.circlePathStyle,attrs:{d:e.trackPath,"stroke-linecap":"butt",stroke:e.strokeColor,"stroke-width":e.relativeStrokeWidth,fill:"none"}})]),e._v(" "),e.showInfo||this.$slots.default?i("div",{class:[e.circleClassPrefix+"__inner"]},[e.showInfo?[e._v(e._s(e.percent)+"%")]:e._e(),e._v(" "),this.$slots.default?[e._t("default")]:e._e()],2):e._e()])]:[i("div",{class:e.barClassPrefix},[i("div",{class:[e.barClassPrefix+"__inner"],style:e.pathStyles},[i("div",{class:[e.barClassPrefix+"__bar"],style:e.barStyles})])])]],2)};vn._withStripped=!0;var bn={name:"bc-progress",components:{},props:{percent:{type:Number|String,default:0},type:{type:String,default:"bar"},showInfo:{type:Boolean,default:!1},width:{type:Number,default:126},strokeWidth:{type:Number,default:4},strokeColor:{type:String,default:"#2d77ee"},pathColor:{type:String,default:"#f0f0f0"},colorGradation:{type:Array}},data:function(){return{classPrefix:"bcui-progress"}},watch:{},computed:{progressClasses:function(){return["bcui-progress",{}]},barClassPrefix:function(){return"".concat("bcui-progress","-bar")},circleClassPrefix:function(){return"".concat("bcui-progress","-circle")},pathStyles:function(){var e={};return this.pathColor&&(e.backgroundColor=this.pathColor),this.strokeWidth&&(e.height=this.strokeWidth),e},barStyles:function(){var e={},t=this.percent,i=this.strokeColor,s=this.colorGradation;return e.width="".concat(this.percent,"%"),i&&(e.backgroundColor=this.strokeColor),s&&s.forEach(function(i){var s=i.min,a=i.max;t>s&&t<=a&&(e.backgroundColor=i.color)}),e},relativeStrokeWidth:function(){return(this.strokeWidth/this.width*100).toFixed(1)},trackPath:function(){var e=parseInt(50-parseFloat(this.relativeStrokeWidth)/2,10);return"M 50 50 m 0 -".concat(e," a ").concat(e," ").concat(e," 0 1 1 0 ").concat(2*e," a ").concat(e," ").concat(e," 0 1 1 0 -").concat(2*e)},perimeter:function(){var e=50-parseFloat(this.relativeStrokeWidth)/2;return 2*Math.PI*e},circleSizeStyle:function(){return{width:this.width,height:this.width}},circlePathStyle:function(){var e=this.perimeter;return{strokeDasharray:"".concat(e,"px,").concat(e,"px"),strokeDashoffset:(1-this.percent/100)*e+"px",transition:"stroke-dashoffset 0.6s ease 0s, stroke 0.6s ease"}}},methods:{},mounted:function(){}},gn=Object(P.a)(bn,vn,[],!1,null,null,null);gn.options.__file="src/ui-core/components/progress/index.vue";var _n=gn.exports,yn=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("label",{class:e.wrapClasses},[i("span",{class:e.radioClasses},[i("span",{class:e.innerClasses}),e._v(" "),i("input",{class:e.inputClasses,attrs:{type:"radio",disabled:e.disabled},domProps:{checked:e.currentValue},on:{change:e.change}})]),e._v(" "),i("span",{staticClass:"bcui-radio__label"},[e._t("default"),e._v(" "),e.$slots.default?e._e():[e._v(e._s(e.label))]],2)])};yn._withStripped=!0;var Sn={name:"bc-radio",mixins:[Wt],props:{value:{type:Boolean,default:!1},label:{type:[String,Number]},disabled:{type:Boolean,default:!1},checkedValue:{type:[String,Boolean,Number],default:!0},uncheckedValue:{type:[String,Boolean,Number],default:!1}},data:function(){return{currentValue:this.value,group:!1,parent:G(this,"bc-radio-group")}},computed:{wrapClasses:function(){var e;return["".concat("bcui-radio"),(e={},x()(e,"".concat("bcui-radio","-group-item"),this.group),x()(e,"".concat("bcui-radio","--checked"),this.currentValue),x()(e,"".concat("bcui-radio","--disabled"),this.disabled),e)]},radioClasses:function(){var e;return["".concat("bcui-radio","__input"),(e={},x()(e,"".concat("bcui-radio","__input--checked"),this.currentValue),x()(e,"".concat("bcui-radio","__input--disabled"),this.disabled),e)]},innerClasses:function(){return"".concat("bcui-radio","__inner")},inputClasses:function(){return"".concat("bcui-radio","__original-input")}},watch:{value:function(){this.updateValue()}},methods:{change:function(e){if(this.disabled)return!1;var t=e.target.checked?this.uncheckedValue:this.checkedValue;this.currentValue=t,this.$emit("input",t),this.group&&void 0!==this.label&&this.parent.change({value:this.label,checked:this.value}),this.group||(this.$emit("on-change",t),this.dispatch("bc-form-item","on-form-change",t))},updateValue:function(){this.currentValue=this.value}},mounted:function(){this.parent&&(this.group=!0),this.group?this.parent.updateValue():this.updateValue()}},Cn=Object(P.a)(Sn,yn,[],!1,null,null,null);Cn.options.__file="src/ui-core/components/radio/radio.vue";var kn=Cn.exports,wn=function(){var e=this.$createElement;return(this._self._c||e)("div",{class:this.classes},[this._t("default")],2)};wn._withStripped=!0;var xn={name:"bc-radio-group",mixins:[Wt],props:{value:{type:[String,Number],default:""},size:{validator:function(e){return R(e,["small","large"])}},type:{validator:function(e){return R(e,["button"])}},vertical:{type:Boolean,default:!1}},data:function(){return{currentValue:this.value,childrens:[]}},computed:{classes:function(){var e;return["".concat("bcui-radio-group"),(e={},x()(e,"".concat("bcui-radio-group","--").concat(this.size),!!this.size),x()(e,"".concat("bcui-radio-group","--vertical"),this.vertical),x()(e,"".concat("bcui-radio-group","-").concat(this.type),!!this.type),e)]}},watch:{value:function(){this.updateValue()}},methods:{updateValue:function(){var e=this.value;this.childrens=V(this,"bc-radio"),this.childrens&&this.childrens.forEach(function(t){t.currentValue=e==t.label,t.group=!0})},change:function(e){this.currentValue=e.value,this.updateValue(),this.$emit("input",e.value),this.$emit("on-change",e.value),this.dispatch("bc-form-item","on-form-change",e.value)}},mounted:function(){this.updateValue()}},Tn=Object(P.a)(xn,wn,[],!1,null,null,null);Tn.options.__file="src/ui-core/components/radio/radio-group.vue";var $n,Pn=Tn.exports,En="bcui-notice",In="bcui-icon",Nn="bcui_notice_key_",On=24,Bn=4500,Dn=1,jn={info:"info",success:"confirm",warning:"alert",error:"error"};function Mn(){return $n=$n||H.newInstance({classPrefix:En,styles:{top:"".concat(On,"px"),right:0}})}function Ln(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.title||"",s=t.desc||"",a=t.name||"".concat(Nn).concat(Dn),n=t.onClose||function(){},o=0===t.duration?0:t.duration||Bn,r=t.render||function(){};Dn++;var c,l=Mn(),u=""===s?"":" ".concat(En,"--with-desc");if("normal"==e)c='\n
\n
').concat(i,'
\n
').concat(s,"
\n
\n ");else{var d=jn[e];c='\n
\n \n \n \n
').concat(i,'
\n
').concat(s,"
\n
\n ")}l.notice({name:a.toString(),duration:o,styles:{},transitionName:"move-notice",content:c,onClose:n,render:r,closable:!0})}var An={open:function(e){return Ln("normal",e)},info:function(e){return Ln("info",e)},success:function(e){return Ln("success",e)},warning:function(e){return Ln("warning",e)},warn:function(e){return Ln("warning",e)},error:function(e){return Ln("error",e)},config:function(e){e.top&&(On=e.top),(e.duration||0===e.duration)&&(Bn=e.duration)},close:function(e){if(!e)return!1;e=e.toString(),$n&&$n.remove(e)},destroy:function(){var e=Mn();$n=null,e.destroy()}},Rn={inserted:function(e,t){t.value&&setTimeout(function(){return e.focus()})}},zn={bind:function(e,t,i){var s=e.getAttribute("loading-text")||"",a=Object.assign({},{bg:"rgba(251, 252, 253, 0.8)",textColor:"#fff"},{text:s}),n=window.getComputedStyle(e).position;"static"!==n&&""!==n||(e.style.position="relative");document.createElement("div");var o=document.createElement("div");if(o.className="bcui-loading-spinner",o.innerHTML='\n \n \n ',a.text){var r=document.createElement("p");r.textContent=a.text,o.appendChild(r)}var c=document.createElement("div");c.style.backgroundColor=a.bg,c.style.display="none",c.className="bcui-loading-box",c.appendChild(o),e.appendChild(c)},inserted:function(e,t,i){var s=e.getElementsByClassName("bcui-loading-box"),a=s[s.length-1];t.oldValue!=t.value&&(t.value?t.def.showLoadingBox(a):t.def.hideLoadingBox(a))},update:function(e,t,i){var s=e.getElementsByClassName("bcui-loading-box"),a=s[s.length-1];t.oldValue!=t.value&&(t.value?t.def.showLoadingBox(a):t.def.hideLoadingBox(a))},showLoadingBox:function(e){e.style.display="initial",window.requestAnimationFrame(function(){e.style.opacity=1})},hideLoadingBox:function(e){e.style.display="none",window.requestAnimationFrame(function(){e.style.opacity=0})},version:"__VERSION__"},qn=zn,Gn={AutoComplete:Qt,Alert:ai,BaseDrop:di,Breadcrumb:vi,BreadcrumbItem:yi,Dropdown:Ei,DropdownMenu:Bi,DropdownItem:Li,Button:qi,ButtonGroup:Fi,Card:Qi,Checkbox:Zi,CheckboxGroup:ss,Drawer:rs,Icon:ei,Menu:ds,MenuItem:ms,Submenu:ks,MenuGroup:_s,Modal:Es,Input:js,Form:Rs,FormItem:Ys,Row:ea,Col:oa,Select:da,Steps:wa,StepsItem:Pa,Option:ma,OptionGroup:_a,Switch:Oa,Tab:Ma,TabPane:za,Tag:Ua,Tree:Xa,Tooltip:Ws,Pagination:rn,Popover:mn,Progress:_n,Radio:kn,RadioGroup:Pn},Vn=function e(t){arguments.length>1&&void 0!==arguments[1]&&arguments[1];e.installed||(Object.keys(Gn).forEach(function(e){var i=Gn[e];t.component(i.name,i)}),t.component("bc-message",ie),t.component("bc-notice",An),t.prototype.$notice=An,t.prototype.$message=ie,t.prototype.$modal=Es,t.directive("clickoutside",Ti),t.directive("auto-focus",Rn),t.directive("loading",qn))};"undefined"!=typeof widnow&&window.Vue&&Vn(window.Vue);var Un=Object.assign(Gn,{install:Vn}),Fn=Object(P.a)({},void 0,void 0,!1,null,null,null);Fn.options.__file="src/components/header/index.vue";var Wn=Fn.exports,Hn=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"filter-inputer-searcher",style:e.wrapperStyles},[i("bc-input",{on:{"on-enter":e.handleInputEnter,"on-change":e.handleInputChange},model:{value:e.inputValue,callback:function(t){e.inputValue=t},expression:"inputValue"}},[i("bc-select",{style:e.filterStyles,attrs:{slot:"select"},on:{"on-change":e.handleFilterChange},slot:"select",model:{value:e.filter,callback:function(t){e.filter=t},expression:"filter"}},e._l(e.searchKeywords,function(t){return i("bc-option",{key:t.key,attrs:{value:t.key}},[e._v(e._s(t.label))])}))],1)],1)};Hn._withStripped=!0;var Kn={name:"filter-input-searcher",components:{},props:{searchKeywords:{type:Array},width:{type:Number|String},filterWidth:{type:Number}},data:function(){return{classPrefix:"filter-inputer-searcher",filter:"",inputValue:"",timer:null}},watch:{inputValue:function(e,t){!e&&t&&(this.$emit("on-input-change",{}),this.$emit("input",{}))}},computed:{wrapperStyles:function(){var e={};return this.width&&(e.width="".concat(this.width,"px")),e},filterStyles:function(){var e={};return this.filterWidth&&(e.width="".concat(this.filterWidth,"px")),e}},methods:{handleInputEnter:function(e){var t=this,i=this.inputValue,s=this.timer,a=this.filter;i&&a&&(s&&clearTimeout(s),this.timer=setTimeout(function(){var e=t.createFitlerParams();t.$emit("on-input-enter",e),t.$emit("input",e)},300))},handleInputFocus:function(e){this.$emit("on-input-focus",e)},handleInputChange:function(e){var t=this,i=this.inputValue,s=this.timer,a=this.filter;i&&a&&(s&&clearTimeout(s),this.timer=setTimeout(function(){var e=t.createFitlerParams();t.$emit("on-input-change",e),t.$emit("input",e)},300))},handleFilterChange:function(e){var t=this.inputValue,i=this.filter;if(t&&i){var s=this.createFitlerParams();this.$emit("on-filter-change",s),this.$emit("input",s)}},createFitlerParams:function(){var e=this.inputValue,t=this.filter,i="";return this.searchKeywords.forEach(function(e){e.key===t&&(i=e.qo)}),e&&t?{key:t,value:e,qo:i||"="}:{}}},mounted:function(){}},Qn=(i(205),Object(P.a)(Kn,Hn,[],!1,null,null,null));Qn.options.__file="src/components/filter-input-searcher/index.vue";var Yn={Sidebar:Nt,Header:Wn,FilterInputSearcher:Qn.exports},Jn=function e(t){e.installed||Object.keys(Yn).forEach(function(e){var i=Yn[e];t.component(e,i)})};"undefined"!=typeof widnow&&window.Vue&&Jn(window.Vue);var Xn=Object.assign(Yn,{install:Jn}),Zn=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.getClass},[i("div",{ref:"fieldbox",staticStyle:{display:"none"}},[e._t("default")],2),e._v(" "),i("div",[e._m(0),e._v(" "),i("div",{staticClass:"bcui-table__body-wrapper"},[i("table",{ref:"test",staticClass:"bcui-table__body"},[i("colgroup",[e.check?i("col",{staticClass:"bcui-check-col"}):e._e(),e._v(" "),e.expandProps.expand?i("col",{staticClass:"bcui-expand-col"}):e._e(),e._v(" "),e._l(e.getHeaderProps,function(t){return t.show?i("col",{attrs:{width:t.width}}):e._e()})],2),e._v(" "),i("thead",[i("tr",[e.check?i("th",{staticClass:"bcui-table-selection-column"},[i("div",{staticClass:"bcui-th-cell"},[e.checkAll?i("bc-checkbox",{ref:"check-all",on:{input:function(e){}},model:{value:e.checkAllStatus,callback:function(t){e.checkAllStatus=t},expression:"checkAllStatus"}}):e._e()],1)]):e._e(),e._v(" "),e.expandProps.expand&&e.expandProps.icon?i("th",{staticClass:"bcui-th-expand"}):e._e(),e._v(" "),e._l(e.getHeaderProps,function(t){return t.show?i("th",{class:t.classify?"overflow-v":"",style:e._thStyleObject(t)},[i("div",{staticClass:"bcui-th-cell",class:t.classify?"overflow-v":"",on:{click:function(i){e._clickTh(t)}}},[t.label_DOM?i("div",[i("bc-th-label",{attrs:{dom:t.label_DOM}})],1):i("span",[e._v(e._s(t.label)+"\n "),t.icon?i("i",{class:"bcui-th-icon bcfont bcui-icon-"+t.icon}):e._e(),e._v(" "),t.sort?i("span",{class:["bcui-table-column-sorter","sort-"+t.$$sortType],on:{click:function(i){e._changeSort(t)}}},["desc"===t.$$sortType?i("i",{class:["bcui-th-icon","icon","icon-triangle-bottom"]}):"asc"===t.$$sortType?i("i",{class:["bcui-th-icon","icon","icon-triangle-top"]}):i("i",{class:["bcui-th-icon","icon","icon-triangle-bottom"]})]):e._e(),e._v(" "),t.classify?i("span",{on:{click:function(){}}},[i("i",{staticClass:"bcui-th-icon bcfont bcui-icon-caidan"}),e._v(" "),e.filterKey[t.field].length?i("div",{staticClass:"bcui-classify "},[i("div",e._l(e.filterKey[t.field],function(s){return i("div",{staticClass:"bcui-classify-label",on:{click:function(i){e.filterTable(s,e.filterKey[t.field],t.field)}}},[i("i",{class:s.check?"bcfont text-link bcui-icon-dui":"bcfont bcui-icon-xuxianxuankuang"}),i("span",[e._v(" "+e._s(s.label))])])}))]):e._e()]):e._e()])])]):e._e()})],2)]),e._v(" "),e.tableData.length?i("tbody",[e._l(e.getShowData,function(t,s){return[i("tr",{key:s,staticClass:"bcui-tr-data",class:e.customTrClass(s,t,e.getShowData)},[e.check?i("td",{staticClass:"bcui-td-check bcui-table-selection-column"},[i("div",{staticClass:"cell"},[i("bc-checkbox",{attrs:{disabled:t["$$check-disabled"]},on:{input:function(i){e._checkRow(t,s,i,e.getShowData)}},model:{value:t.$$check,callback:function(i){e.$set(t,"$$check",i)},expression:"rowData['$$check']"}})],1)]):e._e(),e._v(" "),e.expandProps.expand&&e.expandProps.icon?i("td",{on:{click:function(i){e._expandRow(t,s)}}},[i("div",{staticClass:"bcui-td-expand"},[i("span",{class:{rotate90:t.$$expand}},[i("i",{class:"bcfont bcui-icon-arrow-right-double"})])])]):e._e(),e._v(" "),e._l(e.getHeaderProps,function(a,n){return a.show?i("td",{style:"max-width:"+a.maxWidth},[a.custom_DOM?i("div",{staticClass:"cell"},[i("bc-table-cell",{attrs:{custom:a.custom_DOM,options:a,item:t,rowkey:a.field,index:s,table:e.tableData}})],1):i("div",{staticClass:"cell"},[i("span",[e._v(e._s(t[a.field]))])])]):e._e()})],2),e._v(" "),e.expandProps.custom_DOM?[i("tr",{directives:[{name:"show",rawName:"v-show",value:t.$$expand,expression:"rowData['$$expand']"}],staticClass:"bcui-tr-expand"},[i("td",{attrs:{colspan:e.getTrCount}},[[i("div",{staticClass:"expand-box "},[i("bc-expand-row",{attrs:{custom:e.expandProps.custom_DOM,item:t,index:s,table:e.tableData}})],1)]],2)])]:e.expandProps.td_DOM?[i("bc-expand-row",{directives:[{name:"show",rawName:"v-show",value:t.$$expand,expression:"rowData['$$expand']"}],staticClass:"bcui-tr-expand",attrs:{custom:e.expandProps.td_DOM,item:t,index:s,type:"tr",table:e.tableData}})]:e._e()]})],2):e._e()]),e._v(" "),e.getShowData.length?e._e():i("div",{staticClass:"empty-text"},[i("i",{staticClass:"bcfont bcui-icon-information-warning",staticStyle:{"font-size":"24px"}}),e._v(" "),i("span",[e._v(e._s(e.emptyText))])])])]),e._v(" "),i("div",{staticClass:"pagi-footer"},[!0===e.pagination?i("bc-pagination",{ref:"pagi",attrs:{theme:this.colorType,currentPage:e.currentPage,dataSize:e.dataSize,pageSize:e.pageSize},on:{"update:currentPage":function(t){e.currentPage=t},"update:pageSize":function(t){e.pageSize=t}}}):e._e()],1)])};Zn._withStripped=!0;var eo=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{class:e.getClass},[i("div",{staticClass:"bcui-page-size-button"},[i("span",{},[e._v("每页")]),e._v(" "),i("span",{staticClass:"text-link",on:{click:function(t){e.pageSizeBox()}}},[e._v(e._s(e.pageSize))]),e._v(" "),i("ul",{directives:[{name:"show",rawName:"v-show",value:e.pageSizeBoxVisible,expression:"pageSizeBoxVisible"}],staticClass:"bcui-pager page-size-box"},[null===e.customSize?[e._l(e.pageSizes,function(t,s){return i("li",{on:{click:function(i){e.pageSizeChange(t)}}},[e._v(" "+e._s(t)+" ")])}),e._v(" "),i("li",{on:{click:e.goCustomSize}},[e._v(" 自定义 ")])]:[i("li",{staticClass:"custom-size-dom",staticStyle:{width:"80px"},attrs:{contenteditable:"true"},on:{keyup:function(t){return"button"in t||!e._k(t.keyCode,"enter",13,t.key,"Enter")?e.updateCustomSize(t):null}}},[e._v(" "+e._s(e.customSize)+" ")]),e._v(" "),i("li",{staticStyle:{padding:"3px 8px"},on:{click:e.updateCustomSize}},[e._v(" ↵ ")])]],2),e._v(" "),i("span",{},[e._v("条")])]),e._v(" "),i("button",{staticClass:"btn-prev",on:{click:function(t){e.privatePageChange(e.current-1)}}},[e._v("<")]),e._v(" "),i("ul",{staticClass:"bcui-pager"},e._l(e.getShowPage(),function(t){return i("li",{staticClass:"number",class:{active:t===e.current},on:{click:function(i){e.privatePageChange(t)}}},[e._v(e._s(t))])})),e._v(" "),i("button",{staticClass:"btn-next",on:{click:function(t){e.privatePageChange(e.current+1)}}},[e._v(">")]),e._v(" "),i("span",{staticClass:"bcui-pagination__jump"},[e._v("前往\n "),i("input",{directives:[{name:"model",rawName:"v-model",value:e.searchPage,expression:"searchPage"}],staticClass:"bcui-pagination__editor",attrs:{type:"number",min:"1"},domProps:{value:e.searchPage},on:{keyup:function(t){return"button"in t||13===t.keyCode?e.onEnter(t):null},input:function(t){t.target.composing||(e.searchPage=t.target.value)}}}),e._v("页\n ")]),e._v(" "),i("span",{staticClass:"bcui-pagination__total"},[e._v("共 "+e._s(e.dataSize)+" 条 ")])])};eo._withStripped=!0;i(206);var to={name:"bc-pagination",props:{dataSize:{type:Number,default:0},pageSize:{type:Number,default:10},pageSizes:{type:Array,default:function(){return[10,20,50]}},pageChange:{type:Function},theme:{type:String},currentPage:{type:Number}},data:function(){return{customSize:null,searchPage:1,pageSizeBoxVisible:!1,current:1}},methods:{getallPage:function(){return Math.ceil(this.dataSize/this.pageSize)||1},goCustomSize:function(){this.customSize=0},updateCustomSize:function(){var e=this.$el.querySelector(".custom-size-dom").innerText;e&&parseInt(e,10)?this.pageSizeChange(parseInt(e,10)):this.pageSizeChange(this.pageSize)},onEnter:function(){var e=this.getallPage();this.searchPage?this.searchPage>e?this.current=e:this.current=parseInt(this.searchPage):this.current=1,this.searchPage=this.current,this.privatePageChange(this.current)},pageSizeBox:function(){this.pageSizeBoxVisible=!0},pageSizeChange:function(e){this.pageSizeBoxVisible=!1,this.customSize=null,this.$emit("update:pageSize",parseInt(e,10))},getShowPage:function(){var e,t,i=this.getallPage(),s=[];this.current<4?(e=1,t=i>5?5:i):this.current>i-3?(e=i-4>0?i-4:1,t=i):(e=this.current-2,t=this.current+2);for(var a=e;at&&(e=t),this.$emit("on-page-change",e),this.$emit("update:currentPage",e),this.$props.pageChange&&this.$props.pageChange(e),this.current=e)}},beforeCreate:function(){},beforeUpdate:function(){},computed:{getClass:function(){return["".concat("bcui-pagination"),x()({},"".concat("bcui-pagination","--dark"),"console"===this.theme)]}},mounted:function(){this.current=this.currentPage||1,this.$on("current",this.privatePageChange),this.$watch("currentPage",function(e){this.current=this.currentPage||1})}},io=(i(207),Object(P.a)(to,eo,[],!1,null,"3630889e",null));io.options.__file="src/ui-core/components/table/src/components/pagination.vue";var so=io.exports,ao=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("span",[i("label",{staticClass:"bcui-checkbox ",class:{"bcui-checkbox--checked":e.t_value}},[i("span",{staticClass:"bcui-checkbox__input",class:{"bcui-checkbox__input--checked":e.t_value,"is-disabled":e.disabled}},[i("span",{staticClass:"bcui-checkbox__inner"}),e._v(" "),i("input",{directives:[{name:"model",rawName:"v-model",value:e.t_value,expression:"t_value"}],staticClass:"bcui-checkbox__original-input",attrs:{type:"checkbox",disabled:e.disabled},domProps:{checked:Array.isArray(e.t_value)?e._i(e.t_value,null)>-1:e.t_value},on:{change:function(t){var i=e.t_value,s=t.target,a=!!s.checked;if(Array.isArray(i)){var n=e._i(i,null);s.checked?n<0&&(e.t_value=i.concat([null])):n>-1&&(e.t_value=i.slice(0,n).concat(i.slice(n+1)))}else e.t_value=a}}})])])])};ao._withStripped=!0;var no={name:"bc-checkbox",props:["value","disabled"],data:function(){return{t_value:!1}},methods:{check_row:function(){this.disabled||this.$emit("row-click",!this.t_value)}},computed:{},mounted:function(){this.t_value=void 0!==this.value&&this.value,this.$watch("t_value",function(e,t){this.$emit("input",e)}),this.$watch("value",function(e,t){this.t_value=e})}},oo=(i(208),Object(P.a)(no,ao,[],!1,null,null,null));oo.options.__file="src/ui-core/components/table/src/components/checkbox.vue";var ro=oo.exports,co={name:"",props:["dom"],components:{},data:function(){return{}},created:function(){},methods:{},mounted:function(){},render:function(){return(0,this.$createElement)("div",{attrs:{class:"bc-table-custom-label"}},this.dom)}},lo=(i(209),Object(P.a)(co,void 0,void 0,!1,null,null,null));lo.options.__file="src/ui-core/components/table/src/components/custom-render/table-th-label.vue";var uo=lo.exports,po={name:"bc-expand-row",data:function(){return{}},render:function(e){return e(this.type||"div",[this.custom({record:this.item,rowkey:this.rowkey,text:this.item[this.rowkey],index:this.index,table:this.table})])},methods:{},beforeUpdate:function(){},props:["custom","item","type","rowkey","index","options","table"]},ho=(i(210),Object(P.a)(po,void 0,void 0,!1,null,null,null));ho.options.__file="src/ui-core/components/table/src/components/custom-render/table-expand-row.vue";var fo=ho.exports,mo={name:"bc-table-cell",data:function(){return{}},render:function(e){return e("div",[this.custom({record:this.item,rowkey:this.rowkey,text:this.item[this.rowkey],index:this.index,table:this.table})])},methods:{deepCopy:function(e){return this.options.deepCopy?JSON.parse(JSON.stringify(e)):e}},beforeUpdate:function(){},props:["custom","item","deepItem","rowkey","index","options","table"]},vo=(i(211),Object(P.a)(mo,void 0,void 0,!1,null,null,null));vo.options.__file="src/ui-core/components/table/src/components/custom-render/table-cell.vue";var bo,go=vo.exports,_o=(i(212),{name:"bc-table",mixins:[{methods:{filter:function(e,t,i){var s=e,a=i;if(""===a||void 0===a||0===a.length)return s;function n(e){return e=(e+="").toLowerCase(),Array.isArray(a)?a.includes(e):e===a}function o(e){return r(Object.values(e))}function r(e){return!!e.filter(function(e){return"string"==typeof e?n(e):"[object Object]"===Object.prototype.toString.call(e)&&o(e)}).length}return"string"==typeof a?a=a.toLowerCase():Array.isArray(a)&&a.forEach(function(e,t){e+="",a[t]=e.toLowerCase()}),s.filter(function(e){var i=e[t];return void 0!==i&&""!==i&&("number"==typeof i?n(i):"string"==typeof i?n(i):Array.isArray(i)?r(i):"[object Object]"===Object.prototype.toString.call(i)&&o(i))})},sort:function(e,t,i){var s=e,a=null;return a="desc"===i?-1:"asc"===i?1:0,s.sort(function(e,i){if(null==e[t]||null==i[t])return 0;var s=e[t],n=i[t];return("string"==typeof s&&!isNaN(s)||"string"==typeof n&&!isNaN(n))&&(s=parseFloat(s),n=parseFloat(n)),s>n?a:si&&this.pagination?a.slice(s*i-i,s*i):a).length&&this.$nextTick(function(){t.currentPage=1}),e},getTrCount:function(){var e=0;return this.check&&(e+=1),this.expandProps.expand&&(e+=1),e+=Object.keys(this.headerProps).length},getHeaderProps:function(){var e=this.headerProps;for(var t in e)n.a.set(e[t],"$$sortType",e[t].sortType);return e},getClass:function(){var e;return["".concat("bcui-table"),(e={},x()(e,"".concat("bcui-table","--noborder"),!this.border),x()(e,"".concat("bcui-table","--light"),"light"===this.theme),e)]}},beforeUpdate:function(){},mounted:function(){this._upTableData(this.tableData),this.$watch("tableData",function(e,t){this._upTableData(e)})}}),yo=(i(213),Object(P.a)(_o,Zn,[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"bcui-table__header-wrapper"},[t("table",{staticClass:"bcui-table__header"})])}],!1,null,null,null));yo.options.__file="src/ui-core/components/table/src/components/table.vue";var So=yo.exports,Co=function(){var e=this.$createElement;return(this._self._c||e)("div",[this._v("HiddenColunm")])};Co._withStripped=!0;var ko={name:"bc-table-column",props:{field:String,width:String,index:String,type:String,deepCopy:Boolean,show:{type:Boolean,default:!0},maxWidth:{type:String,default:""},icon:{type:String},params:[Object],label:[String,Function],classify:[String,Array],sort:[Boolean],sortType:{type:String,default:"none"}},data:function(){return{}},methods:{updateProps:function(){n.a.set(this.$parent.headerProps,this.$props.field,this.$props)},delProps:function(){n.a.delete(this.$parent.headerProps,this.$props.field)}},beforeCreate:function(){},mounted:function(){this.$scopedSlots.default&&(this.$props.custom_DOM=this.$scopedSlots.default),this.$slots.label&&(this.$props.label_DOM=this.$slots.label),this.$props._vnode=this,this.updateProps()},destroyed:function(){this.delProps()}},wo=(i(214),Object(P.a)(ko,Co,[],!1,null,null,null));wo.options.__file="src/ui-core/components/table/src/components/table-colunm.vue";var xo=wo.exports,To=function(){var e=this.$createElement;return(this._self._c||e)("div",[this._v("\n HiddenRow\n")])};To._withStripped=!0;var $o={name:"bc-expand-row",props:{expand:Boolean,accordion:{type:Boolean,default:!0},icon:{type:Boolean,default:!0}},data:function(){return{}},methods:{updateProps:function(){this.$parent.expandProps=this.$props},delProps:function(){}},beforeCreate:function(){},mounted:function(){this.$scopedSlots.default?this.$props.custom_DOM=this.$scopedSlots.default:this.$scopedSlots.td&&(this.$props.td_DOM=this.$scopedSlots.td),this.$props._vnode=this,this.updateProps()},destroyed:function(){this.delProps()}},Po=(i(215),Object(P.a)($o,To,[],!1,null,null,null));Po.options.__file="src/ui-core/components/table/src/components/expand-row.vue";var Eo=Po.exports,Io=function e(t){e.installed||(t.component(So.name,So),t.component(xo.name,xo),t.component(Eo.name,Eo))};"undefined"!=typeof window&&window.Vue&&Io(window.Vue);var No=Object.assign(So,{install:Io}),Oo=i(121),Bo=i.n(Oo),Do=i(122),jo=i.n(Do);i(378),i(379),i(380);n.a.config.productionTip=!1,n.a.use(Un),n.a.use(Xn),n.a.use(No),n.a.use(Bo.a),n.a.use(jo.a),n.a.prototype.$http=r.a.create({headers:{"X-Requested-With":"XMLHttpRequest"}}),localStorage.setItem("topics_search_keyword",""),localStorage.setItem("subscribes_search_keyword",""),localStorage.setItem("group_search_keyword",""),new n.a({router:Ut,data:function(){return{bus:c}},render:function(e){return e(l.default)}}).$mount("#app")},39:function(e,t,i){},40:function(e,t,i){},41:function(e,t,i){},42:function(e,t,i){},43:function(e,t,i){},44:function(e,t,i){},45:function(e,t,i){},46:function(e,t,i){},47:function(e,t,i){},48:function(e,t,i){},49:function(e,t,i){},50:function(e,t,i){},51:function(e,t,i){},52:function(e,t,i){},53:function(e,t,i){},54:function(e,t,i){},55:function(e,t,i){},56:function(e,t,i){},57:function(e,t,i){},58:function(e,t,i){},59:function(e,t,i){},60:function(e,t,i){},61:function(e,t,i){},62:function(e,t,i){},63:function(e,t,i){},64:function(e,t,i){},65:function(e,t,i){},66:function(e,t,i){},67:function(e,t,i){},68:function(e,t,i){},88:function(e,t,i){"use strict";var s=function(){var e=this.$createElement;return(this._self._c||e)("router-view")},a=[];s._withStripped=!0,i.d(t,"a",function(){return s}),i.d(t,"b",function(){return a})}})}); \ No newline at end of file diff --git a/carrera-console/carrera-boot/src/main/resources/static/logo-with-text.png b/carrera-console/carrera-boot/src/main/resources/static/logo-with-text.png new file mode 100644 index 0000000000000000000000000000000000000000..e590d214c9508a136189eb22510928183c3bd78d GIT binary patch literal 11677 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 literal 0 HcmV?d00001 diff --git a/carrera-console/carrera-boot/src/main/resources/static/vendors.js b/carrera-console/carrera-boot/src/main/resources/static/vendors.js new file mode 100644 index 0000000..aefb766 --- /dev/null +++ b/carrera-console/carrera-boot/src/main/resources/static/vendors.js @@ -0,0 +1,44 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(e,t,n){"use strict";function r(e,t,n,r,i,o,a,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),r&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),a?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},c._ssrRegister=l):i&&(l=s?function(){i.call(this,this.$root.$options.shadowRoot)}:i),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var d=c.beforeCreate;c.beforeCreate=d?[].concat(d,l):[l]}return{exports:e,options:c}}n.d(t,"a",function(){return r})},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){e.exports=function(){"use strict";var e=navigator.userAgent,t=navigator.platform,n=/gecko\/\d/i.test(e),r=/MSIE \d/.test(e),i=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),o=/Edge\/(\d+)/.exec(e),a=r||i||o,s=a&&(r?document.documentMode||6:+(o||i)[1]),l=!o&&/WebKit\//.test(e),c=l&&/Qt\/\d+\.\d+/.test(e),u=!o&&/Chrome\//.test(e),d=/Opera\//.test(e),f=/Apple Computer/.test(navigator.vendor),p=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),m=/PhantomJS/.test(e),h=!o&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),g=/Android/.test(e),v=h||g||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=h||/Mac/.test(t),b=/\bCrOS\b/.test(e),x=/win/i.test(t),k=d&&e.match(/Version\/(\d*\.\d*)/);k&&(k=Number(k[1])),k&&k>=15&&(d=!1,l=!0);var w=y&&(c||d&&(null==k||k<12.11)),_=n||a&&s>=9;function S(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var E,T=function(e,t){var n=e.className,r=S(t).exec(n);if(r){var i=n.slice(r.index+r[0].length);e.className=n.slice(0,r.index)+(i?r[1]+i:"")}};function C(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function A(e,t){return C(e).appendChild(t)}function M(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o=t)return a+(t-o);a+=s-o,a+=n-a%n,o=s+1}}h?z=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:a&&(z=function(e){try{e.select()}catch(e){}});var F=function(){this.id=null};function j(e,t){for(var n=0;n=t)return r+Math.min(a,t-i);if(i+=o-r,r=o+1,(i+=n-i%n)>=t)return r}}var V=[""];function K(e){for(;V.length<=e;)V.push(Y(V)+" ");return V[e]}function Y(e){return e[e.length-1]}function Z(e,t){for(var n=[],r=0;r"€"&&(e.toUpperCase()!=e.toLowerCase()||Q.test(e))}function te(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ee(e))||t.test(e):ee(e)}function ne(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var re=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&re.test(e)}function oe(e,t,n){for(;(n<0?t>0:tn?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}function se(e,t,r){var i=this;this.input=r,i.scrollbarFiller=M("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=M("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=I("div",null,"CodeMirror-code"),i.selectionDiv=M("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=M("div",null,"CodeMirror-cursors"),i.measure=M("div",null,"CodeMirror-measure"),i.lineMeasure=M("div",null,"CodeMirror-measure"),i.lineSpace=I("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=I("div",[i.lineSpace],"CodeMirror-lines");i.mover=M("div",[o],null,"position: relative"),i.sizer=M("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=M("div",null,null,"position: absolute; height: "+q+"px; width: 1px;"),i.gutters=M("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=M("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=M("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),a&&s<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),l||n&&v||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,r.init(i)}function le(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t=e.first&&tn?ge(n,le(e,n).text.length):function(e,t){var n=e.ch;return null==n||n>t?ge(e.line,t):n<0?ge(e.line,0):e}(t,le(e,t.line).text.length)}function Se(e,t){for(var n=[],r=0;r=t:o.to>t);(r||(r=[])).push(new Ce(a,o.from,l?null:o.to))}}return r}(n,i,a),l=function(e,t,n){var r;if(e)for(var i=0;i=t:o.to>t);if(s||o.from==t&&"bookmark"==a.type&&(!n||o.marker.insertLeft)){var l=null==o.from||(a.inclusiveLeft?o.from<=t:o.from0&&s)for(var x=0;xt)&&(!n||Re(n,o.marker)<0)&&(n=o.marker)}return n}function qe(e,t,n,r,i){var o=le(e,t),a=Te&&o.markedSpans;if(a)for(var s=0;s=0&&d<=0||u<=0&&d>=0)&&(u<=0&&(l.marker.inclusiveRight&&i.inclusiveLeft?ve(c.to,n)>=0:ve(c.to,n)>0)||u>=0&&(l.marker.inclusiveRight&&i.inclusiveLeft?ve(c.from,r)<=0:ve(c.from,r)<0)))return!0}}}function Ue(e){for(var t;t=Pe(e);)e=t.find(-1,!0).line;return e}function We(e,t){var n=le(e,t),r=Ue(n);return n==r?t:fe(r)}function Be(e,t){if(t>e.lastLine())return t;var n,r=le(e,t);if(!He(e,r))return t;for(;n=Fe(r);)r=n.find(1,!0).line;return fe(r)+1}function He(e,t){var n=Te&&t.markedSpans;if(n)for(var r=void 0,i=0;it.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)})}var Ze=null;function Xe(e,t,n){var r;Ze=null;for(var i=0;it)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:Ze=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:Ze=i)}return null!=r?r:Ze}var Je=function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";var n=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,r=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,a=/[1n]/;function s(e,t,n){this.level=e,this.from=t,this.to=n}return function(l,c){var u,d="ltr"==c?"L":"R";if(0==l.length||"ltr"==c&&!n.test(l))return!1;for(var f=l.length,p=[],m=0;m-1&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function it(e,t){var n=nt(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i0}function lt(e){e.prototype.on=function(e,t){tt(this,e,t)},e.prototype.off=function(e,t){rt(this,e,t)}}function ct(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function ut(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function dt(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function ft(e){ct(e),ut(e)}function pt(e){return e.target||e.srcElement}function mt(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var ht,gt,vt=function(){if(a&&s<9)return!1;var e=M("div");return"draggable"in e||"dragDrop"in e}();function yt(e){if(null==ht){var t=M("span","​");A(e,M("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(ht=t.offsetWidth<=1&&t.offsetHeight>2&&!(a&&s<8))}var n=ht?M("span","​"):M("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}function bt(e){if(null!=gt)return gt;var t=A(e,document.createTextNode("AخA")),n=E(t,0,1).getBoundingClientRect(),r=E(t,1,2).getBoundingClientRect();return C(e),!(!n||n.left==n.right)&&(gt=r.right-n.right<3)}var xt,kt=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),a=o.indexOf("\r");-1!=a?(n.push(o.slice(0,a)),t+=a+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},wt=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},_t="oncopy"in(xt=M("div"))||(xt.setAttribute("oncopy","return;"),"function"==typeof xt.oncopy),St=null,Et={},Tt={};function Ct(e){if("string"==typeof e&&Tt.hasOwnProperty(e))e=Tt[e];else if(e&&"string"==typeof e.name&&Tt.hasOwnProperty(e.name)){var t=Tt[e.name];"string"==typeof t&&(t={name:t}),(e=J(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ct("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ct("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function At(e,t){t=Ct(t);var n=Et[t.name];if(!n)return At(e,"text/plain");var r=n(e,t);if(Mt.hasOwnProperty(t.name)){var i=Mt[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var a in t.modeProps)r[a]=t.modeProps[a];return r}var Mt={};function It(e,t){var n=Mt.hasOwnProperty(e)?Mt[e]:Mt[e]={};$(t,n)}function Ot(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function Lt(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Dt(e,t,n){return!e.startState||e.startState(t,n)}var Nt=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};Nt.prototype.eol=function(){return this.pos>=this.string.length},Nt.prototype.sol=function(){return this.pos==this.lineStart},Nt.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Nt.prototype.next=function(){if(this.post},Nt.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Nt.prototype.skipToEnd=function(){this.pos=this.string.length},Nt.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Nt.prototype.backUp=function(e){this.pos-=e},Nt.prototype.column=function(){return this.lastColumnPos0?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}var i=function(e){return n?e.toLowerCase():e},o=this.string.substr(this.pos,e.length);if(i(o)==i(e))return!1!==t&&(this.pos+=e.length),!0},Nt.prototype.current=function(){return this.string.slice(this.start,this.pos)},Nt.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Nt.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Nt.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var zt=function(e,t){this.state=e,this.lookAhead=t},Rt=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function $t(e,t,n,r){var i=[e.state.modeGen],o={};Gt(e,t.text,e.doc.mode,n,function(e,t){return i.push(e,t)},o,r);for(var a=n.state,s=function(r){n.baseTokens=i;var s=e.state.overlays[r],l=1,c=0;n.state=!0,Gt(e,t.text,s.mode,n,function(e,t){for(var n=l;ce&&i.splice(l,1,e,i[l+1],r),l+=2,c=Math.min(e,r)}if(t)if(s.opaque)i.splice(n,l-n,e,"overlay "+t),l=n+2;else for(;ne.options.maxHighlightLength&&Ot(e.doc.mode,r.state),o=$t(e,t,r);i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function Ft(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return new Rt(r,!0,t);var o=function(e,t,n){for(var r,i,o=e.doc,a=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>a;--s){if(s<=o.first)return o.first;var l=le(o,s-1),c=l.stateAfter;if(c&&(!n||s+(c instanceof zt?c.lookAhead:0)<=o.modeFrontier))return s;var u=P(l.text,null,e.options.tabSize);(null==i||r>u)&&(i=s-1,r=u)}return i}(e,t,n),a=o>r.first&&le(r,o-1).stateAfter,s=a?Rt.fromSaved(r,a,o):new Rt(r,Dt(r.mode),o);return r.iter(o,t,function(n){jt(e,n.text,s);var r=s.line;n.stateAfter=r==t-1||r%5==0||r>=i.viewFrom&&rt.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}Rt.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},Rt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},Rt.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Rt.fromSaved=function(e,t,n){return t instanceof zt?new Rt(e,Ot(e.mode,t.state),n,t.lookAhead):new Rt(e,Ot(e.mode,t),n)},Rt.prototype.save=function(e){var t=!1!==e?Ot(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new zt(t,this.maxLookAhead):t};var Wt=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function Bt(e,t,n,r){var i,o=e.doc,a=o.mode;t=_e(o,t);var s,l=le(o,t.line),c=Ft(e,t.line,n),u=new Nt(l.text,e.options.tabSize,c);for(r&&(s=[]);(r||u.pose.options.maxHighlightLength?(s=!1,a&&jt(e,t,r,d.pos),d.pos=t.length,l=null):l=Ht(Ut(n,d,r.state,f),o),f){var p=f[0].name;p&&(l="m-"+(l?p+" "+l:p))}if(!s||u!=l){for(;c1&&!/ /.test(e))return e;for(var n=t,r="",i=0;ic&&d.from<=c);f++);if(d.to>=u)return e(n,r,i,o,a,s,l);e(n,r.slice(0,d.to-c),i,o,null,s,l),o=null,r=r.slice(d.to-c),c=d.to}}}function nn(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rn(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(r)for(var a,s,l,c,u,d,f,p=i.length,m=0,h=1,g="",v=0;;){if(v==m){l=c=u=s="",f=null,d=null,v=1/0;for(var y=[],b=void 0,x=0;xm||w.collapsed&&k.to==m&&k.from==m)){if(null!=k.to&&k.to!=m&&v>k.to&&(v=k.to,c=""),w.className&&(l+=" "+w.className),w.css&&(s=(s?s+";":"")+w.css),w.startStyle&&k.from==m&&(u+=" "+w.startStyle),w.endStyle&&k.to==v&&(b||(b=[])).push(w.endStyle,k.to),w.title&&((f||(f={})).title=w.title),w.attributes)for(var _ in w.attributes)(f||(f={}))[_]=w.attributes[_];w.collapsed&&(!d||Re(d.marker,w)<0)&&(d=k)}else k.from>m&&v>k.from&&(v=k.from)}if(b)for(var S=0;S=p)break;for(var T=Math.min(p,v);;){if(g){var C=m+g.length;if(!d){var A=C>T?g.slice(0,T-m):g;t.addToken(t,A,a?a+l:l,u,m+A.length==v?c:"",s,f)}if(C>=T){g=g.slice(T-m),m=T;break}m=C,u=""}g=i.slice(o,o=n[h++]),a=Xt(n[h++],t.cm.options)}}else for(var M=1;Mn)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function On(e,t,n,r){return Nn(e,Dn(e,t),n,r)}function Ln(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&t2&&o.push((l.bottom+c.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o=$n(t.map,n,r),l=o.node,c=o.start,u=o.end,d=o.collapse;if(3==l.nodeType){for(var f=0;f<4;f++){for(;c&&ie(t.line.text.charAt(o.coverStart+c));)--c;for(;o.coverStart+u1}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,r=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*r,bottom:t.bottom*r}}(e.display.measure,i))}else{var p;c>0&&(d=r="right"),i=e.options.lineWrapping&&(p=l.getClientRects()).length>1?p["right"==r?p.length-1:0]:l.getBoundingClientRect()}if(a&&s<9&&!c&&(!i||!i.left&&!i.right)){var m=l.parentNode.getClientRects()[0];i=m?{left:m.left,right:m.left+rr(e.display),top:m.top,bottom:m.bottom}:Rn}for(var h=i.top-t.rect.top,g=i.bottom-t.rect.top,v=(h+g)/2,y=t.view.measure.heights,b=0;bt)&&(i=(o=l-s)-1,t>=l&&(a="right")),null!=i){if(r=e[c+2],s==l&&n==(r.insertLeft?"left":"right")&&(a=n),"left"==n&&0==i)for(;c&&e[c-2]==e[c-3]&&e[c-1].insertLeft;)r=e[2+(c-=3)],a="left";if("right"==n&&i==l-s)for(;c=0&&(n=e[i]).left==n.right;i--);return n}function Fn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t=r.text.length?(l=r.text.length,c="before"):l<=0&&(l=0,c="after"),!s)return a("before"==c?l-1:l,"before"==c);function u(e,t,n){var r=s[t],i=1==r.level;return a(n?e-1:e,i!=n)}var d=Xe(s,l,c),f=Ze,p=u(l,d,"before"==c);return null!=f&&(p.other=u(l,f,"before"!=c)),p}function Yn(e,t){var n=0;t=_e(e.doc,t),e.options.lineWrapping||(n=rr(e.display)*t.ch);var r=le(e.doc,t.line),i=Ve(r)+Sn(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function Zn(e,t,n,r,i){var o=ge(e,t,n);return o.xRel=i,r&&(o.outside=!0),o}function Xn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return Zn(r.first,0,null,!0,-1);var i=pe(r,n),o=r.first+r.size-1;if(i>o)return Zn(r.first+r.size-1,le(r,o).text.length,null,!0,1);t<0&&(t=0);for(var a=le(r,i);;){var s=tr(e,a,i,t,n),l=je(a,s.ch+(s.xRel>0?1:0));if(!l)return s;var c=l.find(1);if(c.line==i)return c;a=le(r,i=c.line)}}function Jn(e,t,n,r){r-=Bn(t);var i=t.text.length,o=ae(function(t){return Nn(e,n,t-1).bottom<=r},i,0);return i=ae(function(t){return Nn(e,n,t).top>r},o,i),{begin:o,end:i}}function Qn(e,t,n,r){n||(n=Dn(e,t));var i=Hn(e,t,Nn(e,n,r),"line").top;return Jn(e,t,n,i)}function er(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function tr(e,t,n,r,i){i-=Ve(t);var o=Dn(e,t),a=Bn(t),s=0,l=t.text.length,c=!0,u=Qe(t,e.doc.direction);if(u){var d=(e.options.lineWrapping?function(e,t,n,r,i,o,a){var s=Jn(e,t,r,a),l=s.begin,c=s.end;/\s/.test(t.text.charAt(c-1))&&c--;for(var u=null,d=null,f=0;f=c||p.to<=l)){var m=1!=p.level,h=Nn(e,r,m?Math.min(c,p.to)-1:Math.max(l,p.from)).right,g=hg)&&(u=p,d=g)}}return u||(u=i[i.length-1]),u.fromc&&(u={from:u.from,to:c,level:u.level}),u}:function(e,t,n,r,i,o,a){var s=ae(function(s){var l=i[s],c=1!=l.level;return er(Kn(e,ge(n,c?l.to:l.from,c?"before":"after"),"line",t,r),o,a,!0)},0,i.length-1),l=i[s];if(s>0){var c=1!=l.level,u=Kn(e,ge(n,c?l.from:l.to,c?"after":"before"),"line",t,r);er(u,o,a,!0)&&u.top>a&&(l=i[s-1])}return l})(e,t,n,o,u,r,i);c=1!=d.level,s=c?d.from:d.to-1,l=c?d.to:d.from-1}var f,p,m=null,h=null,g=ae(function(t){var n=Nn(e,o,t);return n.top+=a,n.bottom+=a,!!er(n,r,i,!1)&&(n.top<=i&&n.left<=r&&(m=t,h=n),!0)},s,l),v=!1;if(h){var y=r-h.left=x.bottom}return g=oe(t.text,g,1),Zn(n,g,p,v,r-f)}function nr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==zn){zn=M("pre");for(var t=0;t<49;++t)zn.appendChild(document.createTextNode("x")),zn.appendChild(M("br"));zn.appendChild(document.createTextNode("x"))}A(e.measure,zn);var n=zn.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),C(e.measure),n||1}function rr(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=M("span","xxxxxxxxxx"),n=M("pre",[t]);A(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function ir(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,a=0;o;o=o.nextSibling,++a)n[e.options.gutters[a]]=o.offsetLeft+o.clientLeft+i,r[e.options.gutters[a]]=o.clientWidth;return{fixedPos:or(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function or(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function ar(e){var t=nr(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/rr(e.display)-3);return function(i){if(He(e.doc,i))return 0;var o=0;if(i.widgets)for(var a=0;a=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r=e.display.viewTo||s.to().linet||t==n&&a.to==t)&&(r(Math.max(a.from,t),Math.min(a.to,n),1==a.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(h,n||0,null==r?f:r,function(e,t,i,d){var g="ltr"==i,v=p(e,g?"left":"right"),y=p(t-1,g?"right":"left"),b=null==n&&0==e,x=null==r&&t==f,k=0==d,w=!h||d==h.length-1;if(y.top-v.top<=3){var _=(c?b:x)&&k,S=(c?x:b)&&w,E=_?s:(g?v:y).left,T=S?l:(g?y:v).right;u(E,v.top,T-E,v.bottom)}else{var C,A,M,I;g?(C=c&&b&&k?s:v.left,A=c?l:m(e,i,"before"),M=c?s:m(t,i,"after"),I=c&&x&&w?l:y.right):(C=c?m(e,i,"before"):s,A=!c&&b&&k?l:v.right,M=!c&&x&&w?s:y.left,I=c?m(t,i,"after"):l),u(C,v.top,A-C,v.bottom),v.bottom0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function gr(e){e.state.focused||(e.display.input.focus(),yr(e))}function vr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,br(e))},100)}function yr(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(it(e,"focus",e,t),e.state.focused=!0,D(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),l&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),hr(e))}function br(e,t){e.state.delayingBlurEvent||(e.state.focused&&(it(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function xr(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r.005||f<-.005)&&(de(i.line,l),kr(i.line),i.rest))for(var p=0;pe.display.sizerWidth){var m=Math.ceil(c/rr(e.display));m>e.display.maxLineLength&&(e.display.maxLineLength=m,e.display.maxLine=i.line,e.display.maxLineChanged=!0)}}}}function kr(e){if(e.widgets)for(var t=0;t=a&&(o=pe(t,Ve(le(t,l))-e.wrapper.clientHeight),a=l)}return{from:o,to:Math.max(a,o+1)}}function _r(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=or(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",a=0;ao&&(t.bottom=t.top+o);var s=e.doc.height+En(n),l=t.tops-r;if(t.topi+o){var u=Math.min(t.top,(c?s:t.bottom)-o);u!=i&&(a.scrollTop=u)}var d=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft,f=An(e)-(e.options.fixedGutter?n.gutters.offsetWidth:0),p=t.right-t.left>f;return p&&(t.right=t.left+f),t.left<10?a.scrollLeft=0:t.leftf+d-3&&(a.scrollLeft=t.right+(p?0:10)-f),a}function Tr(e,t){null!=t&&(Mr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Cr(e){Mr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Ar(e,t,n){null==t&&null==n||Mr(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function Mr(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=Yn(e,t.from),r=Yn(e,t.to);Ir(e,n,r,t.margin)}}function Ir(e,t,n,r){var i=Er(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Ar(e,i.scrollLeft,i.scrollTop)}function Or(e,t){Math.abs(e.doc.scrollTop-t)<2||(n||li(e,{top:t}),Lr(e,t,!0),n&&li(e),ri(e,100))}function Lr(e,t,n){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Dr(e,t,n,r){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,_r(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Nr(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+En(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+Cn(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}var zr=function(e,t,n){this.cm=n;var r=this.vert=M("div",[M("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=M("div",[M("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),tt(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),tt(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,a&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};zr.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==r&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},zr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},zr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},zr.prototype.zeroWidthHack=function(){var e=y&&!p?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new F,this.disableVert=new F},zr.prototype.enableZeroWidthBar=function(e,t,n){e.style.pointerEvents="auto",t.set(1e3,function r(){var i=e.getBoundingClientRect(),o="vert"==n?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1);o!=e?e.style.pointerEvents="none":t.set(1e3,r)})},zr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Rr=function(){};function $r(e,t){t||(t=Nr(e));var n=e.display.barWidth,r=e.display.barHeight;Pr(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&xr(e),Pr(e,Nr(e)),n=e.display.barWidth,r=e.display.barHeight}function Pr(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}Rr.prototype.update=function(){return{bottom:0,right:0}},Rr.prototype.setScrollLeft=function(){},Rr.prototype.setScrollTop=function(){},Rr.prototype.clear=function(){};var Fr={native:zr,null:Rr};function jr(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Fr[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),tt(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,n){"horizontal"==n?Dr(e,t):Or(e,t)},e),e.display.scrollbars.addClass&&D(e.display.wrapper,e.display.scrollbars.addClass)}var qr=0;function Ur(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++qr},t=e.curOp,sn?sn.ops.push(t):t.ownsGroup=sn={ops:[t],delayedCallbacks:[]}}function Wr(e){var t=e.curOp;t&&function(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new oi(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Hr(e){var t=e.cm,n=t.display;e.updatedDisplay&&xr(t),e.barMeasure=Nr(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=On(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+Cn(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-An(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function Gr(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft1&&(a=!0)),null!=c.scrollLeft&&(Dr(e,c.scrollLeft),Math.abs(e.doc.scrollLeft-d)>1&&(a=!0)),!a)break}return i}(t,_e(r,e.scrollToPos.from),_e(r,e.scrollToPos.to),e.scrollToPos.margin);!function(e,t){if(!ot(e,"scrollCursorIntoView")){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null;if(t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!m){var o=M("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-Sn(e.display))+"px;\n height: "+(t.bottom-t.top+Cn(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,i)}var o=e.maybeHiddenMarkers,a=e.maybeUnhiddenMarkers;if(o)for(var s=0;st)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Te&&We(e.doc,t)i.viewFrom?ei(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)ei(e);else if(t<=i.viewFrom){var o=ti(e,n,n+r,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=r):ei(e)}else if(n>=i.viewTo){var a=ti(e,t,t,-1);a?(i.view=i.view.slice(0,a.index),i.viewTo=a.lineN):ei(e)}else{var s=ti(e,t,t,-1),l=ti(e,n,n+r,1);s&&l?(i.view=i.view.slice(0,s.index).concat(an(e,s.lineN,l.lineN)).concat(i.view.slice(l.index)),i.viewTo+=r):ei(e)}var c=i.externalMeasured;c&&(n=i.lineN&&t=r.viewTo)){var o=r.view[cr(e,t)];if(null!=o.node){var a=o.changes||(o.changes=[]);-1==j(a,n)&&a.push(n)}}}function ei(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function ti(e,t,n,r){var i,o=cr(e,t),a=e.display.view;if(!Te||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,l=0;l0){if(o==a.length-1)return null;i=s+a[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;We(e.doc,n)!=n;){if(o==(r<0?0:a.length-1))return null;n+=r*a[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function ni(e){for(var t=e.display.view,n=0,r=0;r=e.display.viewTo)){var n=+new Date+e.options.workTime,r=Ft(e,t.highlightFrontier),i=[];t.iter(r.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(r.line>=e.display.viewFrom){var a=o.styles,s=o.text.length>e.options.maxHighlightLength?Ot(t.mode,r.state):null,l=$t(e,o,r,!0);s&&(r.state=s),o.styles=l.styles;var c=o.styleClasses,u=l.classes;u?o.styleClasses=u:c&&(o.styleClasses=null);for(var d=!a||a.length!=o.styles.length||c!=u&&(!c||!u||c.bgClass!=u.bgClass||c.textClass!=u.textClass),f=0;!d&&fn)return ri(e,e.options.workDelay),!0}),t.highlightFrontier=r.line,t.modeFrontier=Math.max(t.modeFrontier,r.line),i.length&&Kr(e,function(){for(var t=0;t=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==ni(e))return!1;Sr(e)&&(ei(e),t.dims=ir(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),a=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFroma&&n.viewTo-a<20&&(a=Math.min(i,n.viewTo)),Te&&(o=We(e.doc,o),a=Be(e.doc,a));var s=o!=n.viewFrom||a!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;!function(e,t,n){var r=e.display;0==r.view.length||t>=r.viewTo||n<=r.viewFrom?(r.view=an(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=an(e,t,r.viewFrom).concat(r.view):r.viewFromn&&(r.view=r.view.slice(0,cr(e,n)))),r.viewTo=n}(e,o,a),n.viewOffset=Ve(le(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var c=ni(e);if(!s&&0==c&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var u=function(e){if(e.hasFocus())return null;var t=L();if(!t||!O(e.display.lineDiv,t))return null;var n={activeElt:t};if(window.getSelection){var r=window.getSelection();r.anchorNode&&r.extend&&O(e.display.lineDiv,r.anchorNode)&&(n.anchorNode=r.anchorNode,n.anchorOffset=r.anchorOffset,n.focusNode=r.focusNode,n.focusOffset=r.focusOffset)}return n}(e);return c>4&&(n.lineDiv.style.display="none"),function(e,t,n){var r=e.display,i=e.options.lineNumbers,o=r.lineDiv,a=o.firstChild;function s(t){var n=t.nextSibling;return l&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),n}for(var c=r.view,u=r.viewFrom,d=0;d-1&&(p=!1),dn(e,f,u,n)),p&&(C(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(he(e.options,u)))),a=f.node.nextSibling}else{var m=yn(e,f,u,n);o.insertBefore(m,a)}u+=f.size}for(;a;)a=s(a)}(e,n.updateLineNumbers,t.dims),c>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,function(e){if(e&&e.activeElt&&e.activeElt!=L()&&(e.activeElt.focus(),e.anchorNode&&O(document.body,e.anchorNode)&&O(document.body,e.focusNode))){var t=window.getSelection(),n=document.createRange();n.setEnd(e.anchorNode,e.anchorOffset),n.collapse(!1),t.removeAllRanges(),t.addRange(n),t.extend(e.focusNode,e.focusOffset)}}(u),C(n.cursorDiv),C(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,s&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,ri(e,400)),n.updateLineNumbers=null,!0}function si(e,t){for(var n=t.viewport,r=!0;(r&&e.options.lineWrapping&&t.oldDisplayWidth!=An(e)||(n&&null!=n.top&&(n={top:Math.min(e.doc.height+En(e.display)-Mn(e),n.top)}),t.visible=wr(e.display,e.doc,n),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ai(e,t);r=!1){xr(e);var i=Nr(e);ur(e),$r(e,i),ui(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function li(e,t){var n=new oi(e,t);if(ai(e,n)){xr(e),si(e,n);var r=Nr(e);ur(e),$r(e,r),ui(e,r),n.finish()}}function ci(e){var t=e.display.gutters.offsetWidth;e.display.sizer.style.marginLeft=t+"px"}function ui(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Cn(e)+"px"}function di(e){var t=e.display.gutters,n=e.options.gutters;C(t);for(var r=0;r-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}oi.prototype.signal=function(e,t){st(e,t)&&this.events.push(arguments)},oi.prototype.finish=function(){for(var e=0;es.clientWidth,u=s.scrollHeight>s.clientHeight;if(i&&c||o&&u){if(o&&y&&l)e:for(var f=t.target,p=a.view;f!=s;f=f.parentNode)for(var m=0;m=0&&ve(e,r.to())<=0)return n}return-1};var bi=function(e,t){this.anchor=e,this.head=t};function xi(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(e,t){return ve(e.from(),t.from())}),n=j(t,i);for(var o=1;o0:l>=0){var c=ke(s.from(),a.from()),u=xe(s.to(),a.to()),d=s.empty()?a.from()==a.head:s.from()==s.head;o<=n&&--n,t.splice(--o,2,new bi(d?u:c,d?c:u))}}return new yi(t,n)}function ki(e,t){return new yi([new bi(e,t||e)],0)}function wi(e){return e.text?ge(e.from.line+e.text.length-1,Y(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function _i(e,t){if(ve(e,t.from)<0)return e;if(ve(e,t.to)<=0)return wi(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=wi(t).ch-t.to.ch),ge(n,r)}function Si(e,t){for(var n=[],r=0;r1&&e.remove(s.line+1,m-1),e.insert(s.line+1,v)}cn(e,"change",e,t)}function Ii(e,t,n){!function e(r,i,o){if(r.linked)for(var a=0;as-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=function(e,t){return t?(zi(e.done),Y(e.done)):e.done.length&&!Y(e.done).ranges?Y(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),Y(e.done)):void 0}(i,i.lastOp==r)))a=Y(o.changes),0==ve(t.from,t.to)&&0==ve(t.from,a.to)?a.to=wi(t):o.changes.push(Ni(e,t));else{var l=Y(i.done);for(l&&l.ranges||Pi(e.sel,i.done),o={changes:[Ni(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,a||it(e,"historyAdded")}function $i(e,t,n,r){var i=e.history,o=r&&r.origin;n==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||function(e,t,n,r){var i=t.charAt(0);return"*"==i||"+"==i&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,Y(i.done),t))?i.done[i.done.length-1]=t:Pi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=n,r&&!1!==r.clearRedo&&zi(i.undone)}function Pi(e,t){var n=Y(t);n&&n.ranges&&n.equals(e)||t.push(e)}function Fi(e,t,n,r){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(n){n.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=n.markedSpans),++o})}function ji(e){if(!e)return null;for(var t,n=0;n-1&&(Y(s)[d]=c[d],delete c[d])}}}return r}function Wi(e,t,n,r){if(r){var i=e.anchor;if(n){var o=ve(t,i)<0;o!=ve(n,i)<0?(i=t,t=n):o!=ve(t,n)<0&&(t=n)}return new bi(i,t)}return new bi(n||t,t)}function Bi(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Yi(e,new yi([Wi(e.sel.primary(),t,n,i)],0),r)}function Hi(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o=t.ch:s.to>t.ch))){if(i&&(it(l,"beforeCursorEnter"),l.explicitlyCleared)){if(o.markedSpans){--a;continue}break}if(!l.atomic)continue;if(n){var c=l.find(r<0?1:-1),u=void 0;if((r<0?l.inclusiveRight:l.inclusiveLeft)&&(c=no(e,c,-r,c&&c.line==t.line?o:null)),c&&c.line==t.line&&(u=ve(c,n))&&(r<0?u<0:u>0))return eo(e,c,t,r,i)}var d=l.find(r<0?-1:1);return(r<0?l.inclusiveLeft:l.inclusiveRight)&&(d=no(e,d,r,d.line==t.line?o:null)),d?eo(e,d,t,r,i):null}}return t}function to(e,t,n,r,i){var o=r||1,a=eo(e,t,n,o,i)||!i&&eo(e,t,n,o,!0)||eo(e,t,n,-o,i)||!i&&eo(e,t,n,-o,!0);return a||(e.cantEdit=!0,ge(e.first,0))}function no(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?_e(e,ge(t.line-1)):null:n>0&&t.ch==(r||le(e,t.line)).text.length?t.line0)){var u=[l,1],d=ve(c.from,s.from),f=ve(c.to,s.to);(d<0||!a.inclusiveLeft&&!d)&&u.push({from:c.from,to:s.from}),(f>0||!a.inclusiveRight&&!f)&&u.push({from:s.to,to:c.to}),i.splice.apply(i,u),l+=u.length-3}}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;i>=0;--i)ao(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else ao(e,t)}}function ao(e,t){if(1!=t.text.length||""!=t.text[0]||0!=ve(t.from,t.to)){var n=Si(e,t);Ri(e,t,n,e.cm?e.cm.curOp.id:NaN),co(e,t,n,Ie(e,t));var r=[];Ii(e,function(e,n){n||-1!=j(r,e.history)||(mo(e.history,t),r.push(e.history)),co(e,t,null,Ie(e,t))})}}function so(e,t,n){var r=e.cm&&e.cm.state.suppressEdits;if(!r||n){for(var i,o=e.history,a=e.sel,s="undo"==t?o.done:o.undone,l="undo"==t?o.undone:o.done,c=0;c=0;--p){var m=f(p);if(m)return m.v}}}}function lo(e,t){if(0!=t&&(e.first+=t,e.sel=new yi(Z(e.sel.ranges,function(e){return new bi(ge(e.anchor.line+t,e.anchor.ch),ge(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){Jr(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;re.lastLine())){if(t.from.lineo&&(t={from:t.from,to:ge(o,le(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ce(e,t.from,t.to),n||(n=Si(e,t)),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,a=t.to,s=!1,l=o.line;e.options.lineWrapping||(l=fe(Ue(le(r,o.line))),r.iter(l,a.line+1,function(e){if(e==i.maxLine)return s=!0,!0})),r.sel.contains(t.from,t.to)>-1&&at(e),Mi(r,t,n,ar(e)),e.options.lineWrapping||(r.iter(l,o.line+t.text.length,function(e){var t=Ke(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0)),function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontiern;r--){var i=le(e,r).stateAfter;if(i&&(!(i instanceof zt)||r+i.lookAhead1||!(this.children[0]instanceof go))){var s=[];this.collapse(s),this.children=[new go(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var a=i.lines.length%25+25,s=a;s10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r0||0==a&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=I("span",[o.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(qe(e,t.line,t,n,o)||t.line!=n.line&&qe(e,n.line,t,n,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Te=!0}o.addToHistory&&Ri(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var s,l=t.line,c=e.cm;if(e.iter(l,n.line+1,function(e){c&&o.collapsed&&!c.options.lineWrapping&&Ue(e)==c.display.maxLine&&(s=!0),o.collapsed&&l!=t.line&&de(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new Ce(o,l==t.line?t.ch:null,l==n.line?n.ch:null)),++l}),o.collapsed&&e.iter(t.line,n.line+1,function(t){He(e,t)&&de(t,0)}),o.clearOnEnter&&tt(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Ee=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++xo,o.atomic=!0),c){if(s&&(c.curOp.updateMaxLine=!0),o.collapsed)Jr(c,t.line,n.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var u=t.line;u<=n.line;u++)Qr(c,u,"text");o.atomic&&Ji(c.doc),cn(c,"markerAdded",c,o)}return o}ko.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Ur(e),st(this,"clear")){var n=this.find();n&&cn(this,"clear",n.from,n.to)}for(var r=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=c,e.display.maxLineLength=u,e.display.maxLineChanged=!0)}null!=r&&e&&this.collapsed&&Jr(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Ji(e.doc)),e&&cn(e,"markerCleared",e,this,r,i),t&&Wr(e),this.parent&&this.parent.clear()}},ko.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i=0;l--)oo(this,r[l]);s?Ki(this,s):this.cm&&Cr(this.cm)}),undo:Xr(function(){so(this,"undo")}),redo:Xr(function(){so(this,"redo")}),undoSelection:Xr(function(){so(this,"undo",!0)}),redoSelection:Xr(function(){so(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=_e(this,e),t=_e(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var a=o.markedSpans;if(a)for(var s=0;s=l.to||null==l.from&&i!=e.line||null!=l.from&&i==t.line&&l.from>=t.ch||n&&!n(l.marker)||r.push(l.marker.parent||l.marker)}++i}),r},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;re)return t=e,!0;e-=o,++n}),_e(this,ge(n,t))},indexFromPos:function(e){var t=(e=_e(this,e)).ch;if(e.linet&&(t=e.from),null!=e.to&&e.to-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var u=e.dataTransfer.getData("Text");if(u){var d;if(t.state.draggingText&&!t.state.draggingText.copy&&(d=t.listSelections()),Zi(t.doc,ki(n,n)),d)for(var f=0;f=0;t--)uo(e.doc,"",r[t].from,r[t].to,"+delete");Cr(e)})}function Ko(e,t,n){var r=oe(e.text,t+n,n);return r<0||r>e.text.length?null:r}function Yo(e,t,n){var r=Ko(e,t.ch,n);return null==r?null:new ge(t.line,r,n<0?"after":"before")}function Zo(e,t,n,r,i){if(e){var o=Qe(n,t.doc.direction);if(o){var a,s=i<0?Y(o):o[0],l=i<0==(1==s.level),c=l?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var u=Dn(t,n);a=i<0?n.text.length-1:0;var d=Nn(t,u,a).top;a=ae(function(e){return Nn(t,u,e).top==d},i<0==(1==s.level)?s.from:s.to-1,a),"before"==c&&(a=Ko(n,a,1))}else a=i<0?s.to:s.from;return new ge(r,a,c)}}return new ge(r,i<0?n.text.length:0,i<0?"before":"after")}Fo.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Fo.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Fo.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Fo.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Fo.default=y?Fo.macDefault:Fo.pcDefault;var Xo={selectAll:ro,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),W)},killLine:function(e){return Vo(e,function(t){if(t.empty()){var n=le(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)i=new ge(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),ge(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var a=le(e.doc,i.line-1).text;a&&(i=new ge(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+a.charAt(a.length-1),ge(i.line-1,a.length-1),i,"+transpose"))}n.push(new bi(i,i))}e.setSelections(n)})},newlineAndIndent:function(e){return Kr(e,function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var r=0;r-1&&(ve((i=c.ranges[i]).from(),t)<0||t.xRel>0)&&(ve(i.to(),t)>0||t.xRel<0)?function(e,t,n,r){var i=e.display,o=!1,c=Yr(e,function(t){l&&(i.scroller.draggable=!1),e.state.draggingText=!1,rt(i.wrapper.ownerDocument,"mouseup",c),rt(i.wrapper.ownerDocument,"mousemove",u),rt(i.scroller,"dragstart",d),rt(i.scroller,"drop",c),o||(ct(t),r.addNew||Bi(e.doc,n,null,null,r.extend),l||a&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),u=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},d=function(){return o=!0};l&&(i.scroller.draggable=!0),e.state.draggingText=c,c.copy=!r.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop(),tt(i.wrapper.ownerDocument,"mouseup",c),tt(i.wrapper.ownerDocument,"mousemove",u),tt(i.scroller,"dragstart",d),tt(i.scroller,"drop",c),vr(e),setTimeout(function(){return i.input.focus()},20)}(e,r,t,o):function(e,t,n,r){var i=e.display,o=e.doc;ct(t);var a,s,l=o.sel,c=l.ranges;if(r.addNew&&!r.extend?(s=o.sel.contains(n),a=s>-1?c[s]:new bi(n,n)):(a=o.sel.primary(),s=o.sel.primIndex),"rectangle"==r.unit)r.addNew||(a=new bi(n,n)),n=lr(e,t,!0,!0),s=-1;else{var u=pa(e,n,r.unit);a=r.extend?Wi(a,u.anchor,u.head,r.extend):u}r.addNew?-1==s?(s=c.length,Yi(o,xi(e,c.concat([a]),s),{scroll:!1,origin:"*mouse"})):c.length>1&&c[s].empty()&&"char"==r.unit&&!r.extend?(Yi(o,xi(e,c.slice(0,s).concat(c.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),l=o.sel):Gi(o,s,a,B):(s=0,Yi(o,new yi([a],0),B),l=o.sel);var d=n;function f(t){if(0!=ve(d,t))if(d=t,"rectangle"==r.unit){for(var i=[],c=e.options.tabSize,u=P(le(o,n.line).text,n.ch,c),f=P(le(o,t.line).text,t.ch,c),p=Math.min(u,f),m=Math.max(u,f),h=Math.min(n.line,t.line),g=Math.min(e.lastLine(),Math.max(n.line,t.line));h<=g;h++){var v=le(o,h).text,y=G(v,p,c);p==m?i.push(new bi(ge(h,y),ge(h,y))):v.length>y&&i.push(new bi(ge(h,y),ge(h,G(v,m,c))))}i.length||i.push(new bi(n,n)),Yi(o,xi(e,l.ranges.slice(0,s).concat(i),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b,x=a,k=pa(e,t,r.unit),w=x.anchor;ve(k.anchor,w)>0?(b=k.head,w=ke(x.from(),k.anchor)):(b=k.anchor,w=xe(x.to(),k.head));var _=l.ranges.slice(0);_[s]=function(e,t){var n=t.anchor,r=t.head,i=le(e.doc,n.line);if(0==ve(n,r)&&n.sticky==r.sticky)return t;var o=Qe(i);if(!o)return t;var a=Xe(o,n.ch,n.sticky),s=o[a];if(s.from!=n.ch&&s.to!=n.ch)return t;var l,c=a+(s.from==n.ch==(1!=s.level)?0:1);if(0==c||c==o.length)return t;if(r.line!=n.line)l=(r.line-n.line)*("ltr"==e.doc.direction?1:-1)>0;else{var u=Xe(o,r.ch,r.sticky),d=u-a||(r.ch-n.ch)*(1==s.level?-1:1);l=u==c-1||u==c?d<0:d>0}var f=o[c+(l?-1:0)],p=l==(1==f.level),m=p?f.from:f.to,h=p?"after":"before";return n.ch==m&&n.sticky==h?t:new bi(new ge(n.line,m,h),r)}(e,new bi(_e(o,w),b)),Yi(o,xi(e,_,s),B)}}var p=i.wrapper.getBoundingClientRect(),m=0;function h(t){e.state.selectingText=!1,m=1/0,ct(t),i.input.focus(),rt(i.wrapper.ownerDocument,"mousemove",g),rt(i.wrapper.ownerDocument,"mouseup",v),o.history.lastSelOrigin=null}var g=Yr(e,function(t){0!==t.buttons&&mt(t)?function t(n){var a=++m,s=lr(e,n,!0,"rectangle"==r.unit);if(s)if(0!=ve(s,d)){e.curOp.focus=L(),f(s);var l=wr(i,o);(s.line>=l.to||s.linep.bottom?20:0;c&&setTimeout(Yr(e,function(){m==a&&(i.scroller.scrollTop+=c,t(n))}),50)}}(t):h(t)}),v=Yr(e,h);e.state.selectingText=v,tt(i.wrapper.ownerDocument,"mousemove",g),tt(i.wrapper.ownerDocument,"mouseup",v)}(e,r,t,o)}(t,r,o,e):pt(e)==n.scroller&&ct(e):2==i?(r&&Bi(t.doc,r),setTimeout(function(){return n.input.focus()},20)):3==i&&(_?t.display.input.onContextMenu(e):vr(t)))}}function pa(e,t,n){if("char"==n)return new bi(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new bi(ge(t.line,0),_e(e.doc,ge(t.line+1,0)));var r=n(e,t);return new bi(r.from,r.to)}function ma(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&ct(t);var a=e.display,s=a.lineDiv.getBoundingClientRect();if(o>s.bottom||!st(e,n))return dt(t);o-=s.top-a.viewOffset;for(var l=0;l=i){var u=pe(e.doc,o),d=e.options.gutters[l];return it(e,n,e,u,d,t),dt(t)}}}function ha(e,t){return ma(e,t,"gutterClick",!0)}function ga(e,t){_n(e.display,t)||function(e,t){return!!st(e,"gutterContextMenu")&&ma(e,t,"gutterContextMenu",!1)}(e,t)||ot(e,t,"contextmenu")||_||e.display.input.onContextMenu(t)}function va(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),qn(e)}da.prototype.compare=function(e,t,n){return this.time+400>e&&0==ve(t,this.pos)&&n==this.button};var ya={toString:function(){return"CodeMirror.Init"}},ba={},xa={};function ka(e){di(e),Jr(e),_r(e)}function wa(e,t,n){var r=n&&n!=ya;if(!t!=!r){var i=e.display.dragFunctions,o=t?tt:rt;o(e.display.scroller,"dragstart",i.start),o(e.display.scroller,"dragenter",i.enter),o(e.display.scroller,"dragover",i.over),o(e.display.scroller,"dragleave",i.leave),o(e.display.scroller,"drop",i.drop)}}function _a(e){e.options.lineWrapping?(D(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),Ye(e)),sr(e),Jr(e),qn(e),setTimeout(function(){return $r(e)},100)}function Sa(e,t){var n=this;if(!(this instanceof Sa))return new Sa(e,t);this.options=t=t?$(t):{},$(ba,t,!1),fi(t);var r=t.value;"string"==typeof r?r=new Co(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new Sa.inputStyles[t.inputStyle](this),o=this.display=new se(e,r,i);for(var c in o.wrapper.CodeMirror=this,di(this),va(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),jr(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new F,keySeq:null,specialChars:null},t.autofocus&&!v&&o.input.focus(),a&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;tt(t.scroller,"mousedown",Yr(e,fa)),tt(t.scroller,"dblclick",a&&s<11?Yr(e,function(t){if(!ot(e,t)){var n=lr(e,t);if(n&&!ha(e,t)&&!_n(e.display,t)){ct(t);var r=e.findWordAt(n);Bi(e.doc,r.anchor,r.head)}}}):function(t){return ot(e,t)||ct(t)}),tt(t.scroller,"contextmenu",function(t){return ga(e,t)});var n,r={end:0};function i(){t.activeTouch&&(n=setTimeout(function(){return t.activeTouch=null},1e3),(r=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var n=t.left-e.left,r=t.top-e.top;return n*n+r*r>400}tt(t.scroller,"touchstart",function(i){if(!ot(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!ha(e,i)){t.input.ensurePolled(),clearTimeout(n);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-r.end<=300?r:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),tt(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),tt(t.scroller,"touchend",function(n){var r=t.activeTouch;if(r&&!_n(t,n)&&null!=r.left&&!r.moved&&new Date-r.start<300){var a,s=e.coordsChar(t.activeTouch,"page");a=!r.prev||o(r,r.prev)?new bi(s,s):!r.prev.prev||o(r,r.prev.prev)?e.findWordAt(s):new bi(ge(s.line,0),_e(e.doc,ge(s.line+1,0))),e.setSelection(a.anchor,a.head),e.focus(),ct(n)}i()}),tt(t.scroller,"touchcancel",i),tt(t.scroller,"scroll",function(){t.scroller.clientHeight&&(Or(e,t.scroller.scrollTop),Dr(e,t.scroller.scrollLeft,!0),it(e,"scroll",e))}),tt(t.scroller,"mousewheel",function(t){return vi(e,t)}),tt(t.scroller,"DOMMouseScroll",function(t){return vi(e,t)}),tt(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){ot(e,t)||ft(t)},over:function(t){ot(e,t)||(function(e,t){var n=lr(e,t);if(n){var r=document.createDocumentFragment();fr(e,n,r),e.display.dragCursor||(e.display.dragCursor=M("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),A(e.display.dragCursor,r)}}(e,t),ft(t))},start:function(t){return function(e,t){if(a&&(!e.state.draggingText||+new Date-Ao<100))ft(t);else if(!ot(e,t)&&!_n(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var n=M("img",null,null,"position: fixed; left: 0; top: 0;");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",d&&(n.width=n.height=1,e.display.wrapper.appendChild(n),n._top=n.offsetTop),t.dataTransfer.setDragImage(n,0,0),d&&n.parentNode.removeChild(n)}}(e,t)},drop:Yr(e,Mo),leave:function(t){ot(e,t)||Io(e)}};var l=t.input.getField();tt(l,"keyup",function(t){return sa.call(e,t)}),tt(l,"keydown",Yr(e,aa)),tt(l,"keypress",Yr(e,la)),tt(l,"focus",function(t){return yr(e,t)}),tt(l,"blur",function(t){return br(e,t)})}(this),Do(),Ur(this),this.curOp.forceUpdate=!0,Oi(this,r),t.autofocus&&!v||this.hasFocus()?setTimeout(R(yr,this),20):br(this),xa)xa.hasOwnProperty(c)&&xa[c](n,t[c],ya);Sr(this),t.finishInit&&t.finishInit(this);for(var u=0;u150)){if(!r)return;n="prev"}}else c=0,n="not";"prev"==n?c=t>o.first?P(le(o,t-1).text,null,a):0:"add"==n?c=l+e.options.indentUnit:"subtract"==n?c=l-e.options.indentUnit:"number"==typeof n&&(c=l+n),c=Math.max(0,c);var d="",f=0;if(e.options.indentWithTabs)for(var p=Math.floor(c/a);p;--p)f+=a,d+="\t";if(f1)if(Ca&&Ca.text.join("\n")==t){if(r.ranges.length%Ca.text.length==0){c=[];for(var u=0;u=0;d--){var f=r.ranges[d],p=f.from(),m=f.to();f.empty()&&(n&&n>0?p=ge(p.line,p.ch-n):e.state.overwrite&&!s?m=ge(m.line,Math.min(le(o,m.line).text.length,m.ch+Y(l).length)):s&&Ca&&Ca.lineWise&&Ca.text.join("\n")==t&&(p=m=ge(p.line,0))),a=e.curOp.updateInput;var h={from:p,to:m,text:c?c[d%c.length]:l,origin:i||(s?"paste":e.state.cutIncoming?"cut":"+input")};oo(e.doc,h),cn(e,"inputRead",e,h)}t&&!s&&Oa(e,t),Cr(e),e.curOp.updateInput=a,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Ia(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||Kr(t,function(){return Ma(t,n,0,null,"paste")}),!0}function Oa(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),a=!1;if(o.electricChars){for(var s=0;s-1){a=Ta(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(le(e.doc,i.head.line).text.slice(0,i.head.ch))&&(a=Ta(e,i.head.line,"smart"));a&&cn(e,"electricInput",e,i.head.line)}}}function La(e){for(var t=[],n=[],r=0;r=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var o=Xe(i,n.ch,n.sticky),a=i[o];if("ltr"==e.doc.direction&&a.level%2==0&&(r>0?a.to>n.ch:a.from=a.from&&f>=u.begin)){var p=d?"before":"after";return new ge(n.line,f,p)}}var m=function(e,t,r){for(var o=function(e,t){return t?new ge(n.line,l(e,1),"before"):new ge(n.line,e,"after")};e>=0&&e0==(1!=a.level),c=s?r.begin:l(r.end,-1);if(a.from<=c&&c0?u.end:l(u.begin,-1);return null==g||r>0&&g==t.text.length||!(h=m(r>0?0:i.length-1,r,c(g)))?null:h}(e.cm,s,t,n):Yo(s,t,n))){if(r||((a=t.line+n)=e.first+e.size||(t=new ge(a,t.ch,t.sticky),!(s=le(e,a)))))return!1;t=Zo(i,e.cm,s,t.line,n)}else t=o;return!0}if("char"==r)l();else if("column"==r)l(!0);else if("word"==r||"group"==r)for(var c=null,u="group"==r,d=e.cm&&e.cm.getHelper(t,"wordChars"),f=!0;!(n<0)||l(!f);f=!1){var p=s.text.charAt(t.ch)||"\n",m=te(p,d)?"w":u&&"\n"==p?"n":!u||/\s/.test(p)?null:"p";if(!u||f||m||(m="s"),c&&c!=m){n<0&&(n=1,l(),t.sticky="after");break}if(m&&(c=m),n>0&&!l(!f))break}var h=to(e,t,o,a,!0);return ye(o,h)&&(h.hitSide=!0),h}function Ra(e,t,n,r){var i,o,a=e.doc,s=t.left;if("page"==r){var l=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),c=Math.max(l-.5*nr(e.display),3);i=(n>0?t.bottom:t.top)+n*c}else"line"==r&&(i=n>0?t.bottom+3:t.top-3);for(;(o=Xn(e,s,i)).outside;){if(n<0?i<=0:i>=a.height){o.hitSide=!0;break}i+=5*n}return o}var $a=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new F,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Pa(e,t){var n=Ln(e,t.line);if(!n||n.hidden)return null;var r=le(e.doc,t.line),i=In(n,r,t.line),o=Qe(r,e.doc.direction),a="left";if(o){var s=Xe(o,t.ch);a=s%2?"right":"left"}var l=$n(i.map,t.ch,a);return l.offset="right"==l.collapse?l.end:l.start,l}function Fa(e,t){return t&&(e.bad=!0),e}function ja(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Fa(e.clipPos(ge(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i=t.display.viewTo||o.line=t.display.viewFrom&&Pa(t,i)||{node:l[0].measure.map[2],offset:0},u=o.liner.firstLine()&&(a=ge(a.line-1,le(r.doc,a.line-1).length)),s.ch==le(r.doc,s.line).text.length&&s.linei.viewTo-1)return!1;a.line==i.viewFrom||0==(e=cr(r,a.line))?(t=fe(i.view[0].line),n=i.view[0].node):(t=fe(i.view[e].line),n=i.view[e-1].node.nextSibling);var l,c,u=cr(r,s.line);if(u==i.view.length-1?(l=i.viewTo-1,c=i.lineDiv.lastChild):(l=fe(i.view[u+1].line)-1,c=i.view[u+1].node.previousSibling),!n)return!1;for(var d=r.doc.splitLines(function(e,t,n,r,i){var o="",a=!1,s=e.doc.lineSeparator(),l=!1;function c(){a&&(o+=s,l&&(o+=s),a=l=!1)}function u(e){e&&(c(),o+=e)}function d(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void u(n);var o,f=t.getAttribute("cm-marker");if(f){var p=e.findMarks(ge(r,0),ge(i+1,0),(g=+f,function(e){return e.id==g}));return void(p.length&&(o=p[0].find(0))&&u(ce(e.doc,o.from,o.to).join(s)))}if("false"==t.getAttribute("contenteditable"))return;var m=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;m&&c();for(var h=0;h1&&f.length>1;)if(Y(d)==Y(f))d.pop(),f.pop(),l--;else{if(d[0]!=f[0])break;d.shift(),f.shift(),t++}for(var p=0,m=0,h=d[0],g=f[0],v=Math.min(h.length,g.length);pa.ch&&y.charCodeAt(y.length-m-1)==b.charCodeAt(b.length-m-1);)p--,m++;d[d.length-1]=y.slice(0,y.length-m).replace(/^\u200b+/,""),d[0]=d[0].slice(p).replace(/\u200b+$/,"");var k=ge(t,p),w=ge(l,f.length?Y(f).length-m:0);return d.length>1||d[0]||ve(k,w)?(uo(r.doc,d,k,w,"+input"),!0):void 0},$a.prototype.ensurePolled=function(){this.forceCompositionEnd()},$a.prototype.reset=function(){this.forceCompositionEnd()},$a.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},$a.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},$a.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Kr(this.cm,function(){return Jr(e.cm)})},$a.prototype.setUneditable=function(e){e.contentEditable="false"},$a.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Yr(this.cm,Ma)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},$a.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},$a.prototype.onContextMenu=function(){},$a.prototype.resetPosition=function(){},$a.prototype.needsContentAttribute=!0;var Ua=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new F,this.hasSelection=!1,this.composing=null};Ua.prototype.init=function(e){var t=this,n=this,r=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!ot(r,e)){if(r.somethingSelected())Aa({lineWise:!1,text:r.getSelections()});else{if(!r.options.lineWiseCopyCut)return;var t=La(r);Aa({lineWise:!0,text:t.text}),"cut"==e.type?r.setSelections(t.ranges,null,W):(n.prevInput="",i.value=t.text.join("\n"),z(i))}"cut"==e.type&&(r.state.cutIncoming=!0)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),h&&(i.style.width="0px"),tt(i,"input",function(){a&&s>=9&&t.hasSelection&&(t.hasSelection=null),n.poll()}),tt(i,"paste",function(e){ot(r,e)||Ia(e,r)||(r.state.pasteIncoming=!0,n.fastPoll())}),tt(i,"cut",o),tt(i,"copy",o),tt(e.scroller,"paste",function(t){_n(e,t)||ot(r,t)||(r.state.pasteIncoming=!0,n.focus())}),tt(e.lineSpace,"selectstart",function(t){_n(e,t)||ct(t)}),tt(i,"compositionstart",function(){var e=r.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:e,range:r.markText(e,r.getCursor("to"),{className:"CodeMirror-composing"})}}),tt(i,"compositionend",function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)})},Ua.prototype.createField=function(e){this.wrapper=Na(),this.textarea=this.wrapper.firstChild},Ua.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,r=dr(e);if(e.options.moveInputWithCursor){var i=Kn(e,n.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),a=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+a.top-o.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+a.left-o.left))}return r},Ua.prototype.showSelection=function(e){var t=this.cm,n=t.display;A(n.cursorDiv,e.cursors),A(n.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Ua.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&z(this.textarea),a&&s>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",a&&s>=9&&(this.hasSelection=null))}},Ua.prototype.getField=function(){return this.textarea},Ua.prototype.supportsTouch=function(){return!1},Ua.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!v||L()!=this.textarea))try{this.textarea.focus()}catch(e){}},Ua.prototype.blur=function(){this.textarea.blur()},Ua.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Ua.prototype.receivedFocus=function(){this.slowPoll()},Ua.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Ua.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function n(){var r=t.poll();r||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,n))})},Ua.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||wt(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(a&&s>=9&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,c=Math.min(r.length,i.length);l1e3||i.indexOf("\n")>-1?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Ua.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Ua.prototype.onKeyPress=function(){a&&s>=9&&(this.hasSelection=null),this.fastPoll()},Ua.prototype.onContextMenu=function(e){var t=this,n=t.cm,r=n.display,i=t.textarea,o=lr(n,e),c=r.scroller.scrollTop;if(o&&!d){var u=n.options.resetSelectionOnContextMenu;u&&-1==n.doc.sel.contains(o)&&Yr(n,Yi)(n.doc,ki(o),W);var f=i.style.cssText,p=t.wrapper.style.cssText;t.wrapper.style.cssText="position: absolute";var m,h=t.wrapper.getBoundingClientRect();if(i.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-h.top-5)+"px; left: "+(e.clientX-h.left-5)+"px;\n z-index: 1000; background: "+(a?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",l&&(m=window.scrollY),r.input.focus(),l&&window.scrollTo(null,m),r.input.reset(),n.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=!0,r.selForContextMenu=n.doc.sel,clearTimeout(r.detectingSelectAll),a&&s>=9&&v(),_){ft(e);var g=function(){rt(window,"mouseup",g),setTimeout(y,20)};tt(window,"mouseup",g)}else setTimeout(y,50)}function v(){if(null!=i.selectionStart){var e=n.somethingSelected(),o="​"+(e?i.value:"");i.value="⇚",i.value=o,t.prevInput=e?"":"​",i.selectionStart=1,i.selectionEnd=o.length,r.selForContextMenu=n.doc.sel}}function y(){if(t.contextMenuPending=!1,t.wrapper.style.cssText=p,i.style.cssText=f,a&&s<9&&r.scrollbars.setScrollTop(r.scroller.scrollTop=c),null!=i.selectionStart){(!a||a&&s<9)&&v();var e=0,o=function(){r.selForContextMenu==n.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&"​"==t.prevInput?Yr(n,ro)(n):e++<10?r.detectingSelectAll=setTimeout(o,500):(r.selForContextMenu=null,r.input.reset())};r.detectingSelectAll=setTimeout(o,200)}}},Ua.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},Ua.prototype.setUneditable=function(){},Ua.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function n(n,r,i,o){e.defaults[n]=r,i&&(t[n]=o?function(e,t,n){n!=ya&&i(e,t,n)}:i)}e.defineOption=n,e.Init=ya,n("value","",function(e,t){return e.setValue(t)},!0),n("mode",null,function(e,t){e.doc.modeOption=t,Ti(e)},!0),n("indentUnit",2,Ti,!0),n("indentWithTabs",!1),n("smartIndent",!0),n("tabSize",4,function(e){Ci(e),qn(e),Jr(e)},!0),n("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var n=[],r=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,n.push(ge(r,o))}r++});for(var i=n.length-1;i>=0;i--)uo(e.doc,t,n[i],ge(n[i].line,n[i].ch+t.length))}}),n("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=ya&&e.refresh()}),n("specialCharPlaceholder",Qt,function(e){return e.refresh()},!0),n("electricChars",!0),n("inputStyle",v?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),n("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),n("rtlMoveVisually",!x),n("wholeLineUpdateBefore",!0),n("theme","default",function(e){va(e),ka(e)},!0),n("keyMap","default",function(e,t,n){var r=Go(t),i=n!=ya&&Go(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)}),n("extraKeys",null),n("configureMouse",null),n("lineWrapping",!1,_a,!0),n("gutters",[],function(e){fi(e.options),ka(e)},!0),n("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?or(e.display)+"px":"0",e.refresh()},!0),n("coverGutterNextToScrollbar",!1,function(e){return $r(e)},!0),n("scrollbarStyle","native",function(e){jr(e),$r(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),n("lineNumbers",!1,function(e){fi(e.options),ka(e)},!0),n("firstLineNumber",1,ka,!0),n("lineNumberFormatter",function(e){return e},ka,!0),n("showCursorWhenSelecting",!1,ur,!0),n("resetSelectionOnContextMenu",!0),n("lineWiseCopyCut",!0),n("pasteLinesPerSelection",!0),n("selectionsMayTouch",!1),n("readOnly",!1,function(e,t){"nocursor"==t&&(br(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),n("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),n("dragDrop",!0,wa),n("allowDropFileTypes",null),n("cursorBlinkRate",530),n("cursorScrollMargin",0),n("cursorHeight",1,ur,!0),n("singleCursorHeightPerLine",!0,ur,!0),n("workTime",100),n("workDelay",100),n("flattenSpans",!0,Ci,!0),n("addModeClass",!1,Ci,!0),n("pollInterval",100),n("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),n("historyEventDelay",1250),n("viewportMargin",10,function(e){return e.refresh()},!0),n("maxHighlightLength",1e4,Ci,!0),n("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),n("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),n("autofocus",null),n("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),n("phrases",null)}(Sa),function(e){var t=e.optionHandlers,n=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,n){var r=this.options,i=r[e];r[e]==n&&"mode"!=e||(r[e]=n,t.hasOwnProperty(e)&&Yr(this,t[e])(this,n,i),it(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Go(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;nn&&(Ta(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Cr(this));else{var o=i.from(),a=i.to(),s=Math.max(n,o.line);n=Math.min(this.lastLine(),a.line-(a.ch?0:1))+1;for(var l=s;l0&&Gi(this.doc,r,new bi(o,c[r].to()),W)}}}),getTokenAt:function(e,t){return Bt(this,e,t)},getLineTokens:function(e,t){return Bt(this,ge(e),t,!0)},getTokenTypeAt:function(e){e=_e(this.doc,e);var t,n=Pt(this,le(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var a=r+i>>1;if((a?n[2*a-1]:0)>=o)i=a;else{if(!(n[2*a+1]o&&(e=o,i=!0),r=le(this.doc,e)}else r=e;return Hn(this,r,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-Ve(r):0)},defaultTextHeight:function(){return nr(this.display)},defaultCharWidth:function(){return rr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,a,s,l=this.display,c=(e=Kn(this,_e(this.doc,e))).bottom,u=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),l.sizer.appendChild(t),"over"==r)c=e.top;else if("above"==r||"near"==r){var d=Math.max(l.wrapper.clientHeight,this.doc.height),f=Math.max(l.sizer.clientWidth,l.lineSpace.clientWidth);("above"==r||e.bottom+t.offsetHeight>d)&&e.top>t.offsetHeight?c=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=d&&(c=e.bottom),u+t.offsetWidth>f&&(u=f-t.offsetWidth)}t.style.top=c+"px",t.style.left=t.style.right="","right"==i?(u=l.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?u=0:"middle"==i&&(u=(l.sizer.clientWidth-t.offsetWidth)/2),t.style.left=u+"px"),n&&(o=this,a={left:u,top:c,right:u+t.offsetWidth,bottom:c+t.offsetHeight},null!=(s=Er(o,a)).scrollTop&&Or(o,s.scrollTop),null!=s.scrollLeft&&Dr(o,s.scrollLeft))},triggerOnKeyDown:Zr(aa),triggerOnKeyPress:Zr(la),triggerOnKeyUp:sa,triggerOnMouseDown:Zr(fa),execCommand:function(e){if(Xo.hasOwnProperty(e))return Xo[e].call(null,this)},triggerElectric:Zr(function(e){Oa(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=_e(this.doc,e),a=0;a0&&s(n.charAt(r-1));)--r;for(;i.5)&&sr(this),it(this,"refresh",this)}),swapDoc:Zr(function(e){var t=this.doc;return t.cm=null,Oi(this,e),qn(this),this.display.input.reset(),Ar(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,cn(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},lt(e),e.registerHelper=function(t,r,i){n.hasOwnProperty(t)||(n[t]=e[t]={_global:[]}),n[t][r]=i},e.registerGlobalHelper=function(t,r,i,o){e.registerHelper(t,r,o),n[t]._global.push({pred:i,val:o})}}(Sa);var Wa="iter insert remove copy getEditor constructor".split(" ");for(var Ba in Co.prototype)Co.prototype.hasOwnProperty(Ba)&&j(Wa,Ba)<0&&(Sa.prototype[Ba]=function(e){return function(){return e.apply(this.doc,arguments)}}(Co.prototype[Ba]));return lt(Co),Sa.inputStyles={textarea:Ua,contenteditable:$a},Sa.defineMode=function(e){Sa.defaults.mode||"null"==e||(Sa.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Et[e]=t}.apply(this,arguments)},Sa.defineMIME=function(e,t){Tt[e]=t},Sa.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),Sa.defineMIME("text/plain","null"),Sa.defineExtension=function(e,t){Sa.prototype[e]=t},Sa.defineDocExtension=function(e,t){Co.prototype[e]=t},Sa.fromTextArea=function(e,t){if((t=t?$(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var n=L();t.autofocus=n==e||null!=e.getAttribute("autofocus")&&n==document.body}function r(){e.value=s.getValue()}var i;if(e.form&&(tt(e.form,"submit",r),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var a=o.submit=function(){r(),o.submit=i,o.submit(),o.submit=a}}catch(e){}}t.finishInit=function(t){t.save=r,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,r(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display="",e.form&&(rt(e.form,"submit",r),"function"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display="none";var s=Sa(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},function(e){e.off=rt,e.on=tt,e.wheelEventPixels=gi,e.Doc=Co,e.splitLines=kt,e.countColumn=P,e.findColumn=G,e.isWordChar=ee,e.Pass=U,e.signal=it,e.Line=Vt,e.changeEnd=wi,e.scrollbarModel=Fr,e.Pos=ge,e.cmpPos=ve,e.modes=Et,e.mimeModes=Tt,e.resolveMode=Ct,e.getMode=At,e.modeExtensions=Mt,e.extendMode=It,e.copyState=Ot,e.startState=Dt,e.innerMode=Lt,e.commands=Xo,e.keyMap=Fo,e.keyName=Ho,e.isModifierKey=Wo,e.lookupKey=Uo,e.normalizeKeyMap=qo,e.StringStream=Nt,e.SharedTextMarker=_o,e.TextMarker=ko,e.LineWidget=yo,e.e_preventDefault=ct,e.e_stopPropagation=ut,e.e_stop=ft,e.addClass=D,e.contains=O,e.rmClass=T,e.keyNames=zo}(Sa),Sa.version="5.42.0",Sa}()},,function(e,t,n){(function(t,n){ +/*! + * Vue.js v2.5.17 + * (c) 2014-2018 Evan You + * Released under the MIT License. + */var r;r=function(){"use strict";var e=Object.freeze({});function r(e){return null==e}function i(e){return null!=e}function o(e){return!0===e}function a(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function s(e){return null!==e&&"object"==typeof e}var l=Object.prototype.toString;function c(e){return l.call(e).slice(8,-1)}function u(e){return"[object Object]"===l.call(e)}function d(e){return"[object RegExp]"===l.call(e)}function f(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function m(e){var t=parseFloat(e);return isNaN(t)?e:t}function h(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function x(e,t){return b.call(e,t)}function k(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var w=/-(\w)/g,_=k(function(e){return e.replace(w,function(e,t){return t?t.toUpperCase():""})}),S=k(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),E=/\B([A-Z])/g,T=k(function(e){return e.replace(E,"-$1").toLowerCase()}),C=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function A(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function M(e,t){for(var n in t)e[n]=t[n];return e}function I(e){for(var t={},n=0;n0,J=Y&&Y.indexOf("edge/")>0,Q=(Y&&Y.indexOf("android"),Y&&/iphone|ipad|ipod|ios/.test(Y)||"ios"===K),ee=Y&&/chrome\/\d+/.test(Y)&&!J,te={}.watch,ne=!1;if(G)try{var re={};Object.defineProperty(re,"passive",{get:function(){ne=!0}}),window.addEventListener("test-passive",null,re)}catch(e){}var ie=function(){return void 0===W&&(W=!G&&!V&&void 0!==t&&"server"===t.process.env.VUE_ENV),W},oe=G&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ae(e){return"function"==typeof e&&/native code/.test(e.toString())}var se,le="undefined"!=typeof Symbol&&ae(Symbol)&&"undefined"!=typeof Reflect&&ae(Reflect.ownKeys);se="undefined"!=typeof Set&&ae(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ce=O,ue=O,de=O,fe=O,pe="undefined"!=typeof console,me=/(?:^|[-_])(\w)/g;ce=function(e,t){var n=t?de(t):"";j.warnHandler?j.warnHandler.call(null,e,t,n):pe&&!j.silent&&console.error("[Vue warn]: "+e+n)},ue=function(e,t){pe&&!j.silent&&console.warn("[Vue tip]: "+e+(t?de(t):""))},fe=function(e,t){if(e.$root===e)return"";var n="function"==typeof e&&null!=e.cid?e.options:e._isVue?e.$options||e.constructor.options:e||{},r=n.name||n._componentTag,i=n.__file;if(!r&&i){var o=i.match(/([^\/\\]+)\.vue$/);r=o&&o[1]}return(r?"<"+r.replace(me,function(e){return e.toUpperCase()}).replace(/[-_]/g,"")+">":"")+(i&&!1!==t?" at "+i:"")},de=function(e){if(e._isVue&&e.$parent){for(var t=[],n=0;e;){if(t.length>0){var r=t[t.length-1];if(r.constructor===e.constructor){n++,e=e.$parent;continue}n>0&&(t[t.length-1]=[r,n],n=0)}t.push(e),e=e.$parent}return"\n\nfound in\n\n"+t.map(function(e,t){return""+(0===t?"---\x3e ":function(e,t){for(var n="";t;)t%2==1&&(n+=e),t>1&&(e+=e),t>>=1;return n}(" ",5+2*t))+(Array.isArray(e)?fe(e[0])+"... ("+e[1]+" recursive calls)":fe(e))}).join("\n")}return"\n\n(found in "+fe(e)+")"};var he=0,ge=function(){this.id=he++,this.subs=[]};ge.prototype.addSub=function(e){this.subs.push(e)},ge.prototype.removeSub=function(e){y(this.subs,e)},ge.prototype.depend=function(){ge.target&&ge.target.addDep(this)},ge.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!x(i,"default"))a=!1;else if(""===a||a===T(e)){var u=Je(String,i.type);(u<0||l0&&(Ot((c=e(c,(n||"")+"_"+l))[0])&&Ot(d)&&(s[u]=_e(d.text+c[0].text),c.shift()),s.push.apply(s,c)):a(c)?Ot(d)?s[u]=_e(d.text+c):""!==c&&s.push(_e(c)):Ot(c)&&Ot(d)?s[u]=_e(d.text+c.text):(o(t._isVList)&&i(c.tag)&&r(c.key)&&i(n)&&(c.key="__vlist"+n+"_"+l+"__"),s.push(c)));return s}(e):void 0}function Ot(e){return i(e)&&i(e.text)&&!1===e.isComment}function Lt(e,t){return(e.__esModule||le&&"Module"===e[Symbol.toStringTag])&&(e=e.default),s(e)?t.extend(e):e}function Dt(e){return e.isComment&&e.asyncFactory}function Nt(e){if(Array.isArray(e))for(var t=0;tGt)){ce("You may have an infinite update loop "+(e.user?'in watcher with expression "'+e.expression+'"':"in a component render function."),e.vm);break}var n=Kt.slice(),r=Vt.slice();Qt=Vt.length=Kt.length=0,Yt={},Zt={},Xt=Jt=!1,function(e){for(var t=0;tQt&&Vt[n].id>e.id;)n--;Vt.splice(n+1,0,e)}else Vt.push(e);Xt||(Xt=!0,pt(en))}}(this)},nn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||s(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Qe(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},nn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},nn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},nn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var rn={enumerable:!0,configurable:!0,get:O,set:O};function on(e,t,n){rn.get=function(){return this[t][n]},rn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,rn)}function an(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&Me(!1);var o=function(o){i.push(o);var a=Ve(o,t,n,e),s=T(o);(v(s)||j.isReservedAttr(s))&&ce('"'+s+'" is a reserved attribute and cannot be used as component prop.',e),Ne(r,o,a,function(){e.$parent&&!Ut&&ce("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+o+'"',e)}),o in e||on(e,"_props",o)};for(var a in t)o(a);Me(!0)}(e,t.props),t.methods&&function(e,t){var n=e.$options.props;for(var r in t)null==t[r]&&ce('Method "'+r+'" has an undefined value in the component definition. Did you reference the function correctly?',e),n&&x(n,r)&&ce('Method "'+r+'" has already been defined as a prop.',e),r in e&&q(r)&&ce('Method "'+r+'" conflicts with an existing Vue instance method. Avoid defining component methods that start with _ or $.'),e[r]=null==t[r]?O:C(t[r],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?function(e,t){ye();try{return e.call(t,t)}catch(e){return Qe(e,t,"data()"),{}}finally{be()}}(t,e):t||{})||(t={},ce("data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",e));var n=Object.keys(t),r=e.$options.props,i=e.$options.methods,o=n.length;for(;o--;){var a=n[o];i&&x(i,a)&&ce('Method "'+a+'" has already been defined as a data property.',e),r&&x(r,a)?ce('The data property "'+a+'" is already declared as a prop. Use prop default value instead.',e):q(a)||on(e,"_data",a)}De(t,!0)}(e):De(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=ie();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;null==a&&ce('Getter is missing for computed property "'+i+'".',e),r||(n[i]=new nn(e,a||O,O,sn)),i in e?i in e.$data?ce('The computed property "'+i+'" is already defined in data.',e):e.$options.props&&i in e.$options.props&&ce('The computed property "'+i+'" is already defined as a prop.',e):ln(e,i,o)}}(e,t.computed),t.watch&&t.watch!==te&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i=0||n.indexOf(e[i])<0)&&r.push(e[i]);return r}return e}function Rn(e){this instanceof Rn||ce("Vue is a constructor and should be called with the `new` keyword"),this._init(e)}function $n(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,i=e._Ctor||(e._Ctor={});if(i[r])return i[r];var o=e.name||n.options.name;o&&We(o);var a=function(e){this._init(e)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=t++,a.options=He(n.options,e),a.super=n,a.options.props&&function(e){var t=e.options.props;for(var n in t)on(e.prototype,"_props",n)}(a),a.options.computed&&function(e){var t=e.options.computed;for(var n in t)ln(e.prototype,n,t[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,P.forEach(function(e){a[e]=n[e]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=M({},a.options),i[r]=a,a}}function Pn(e){return e&&(e.Ctor.options.name||e.tag)}function Fn(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!d(e)&&e.test(t)}function jn(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=Pn(a.componentOptions);s&&!t(s)&&qn(n,o,r,i)}}}function qn(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,y(n,t)}!function(t){t.prototype._init=function(t){var n,r,i=this;i._uid=Dn++,j.performance&&st&&(n="vue-perf-start:"+i._uid,r="vue-perf-end:"+i._uid,st(n)),i._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r,n._parentElm=t._parentElm,n._refElm=t._refElm;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(i,t):i.$options=He(Nn(i.constructor),t||{},i),mt(i),i._self=i,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(i),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&$t(e,t)}(i),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=Pt(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Ln(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Ln(t,e,n,r,i,!0)};var o=r&&r.data;Ne(t,"$attrs",o&&o.attrs||e,function(){!Ut&&ce("$attrs is readonly.",t)},!0),Ne(t,"$listeners",n._parentListeners||e,function(){!Ut&&ce("$listeners is readonly.",t)},!0)}(i),Ht(i,"beforeCreate"),function(e){var t=dn(e.$options.inject,e);t&&(Me(!1),Object.keys(t).forEach(function(n){Ne(e,n,t[n],function(){ce('Avoid mutating an injected value directly since the changes will be overwritten whenever the provided component re-renders. injection being mutated: "'+n+'"',e)})}),Me(!0))}(i),an(i),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(i),Ht(i,"created"),j.performance&&st&&(i._name=fe(i,!1),st(r),lt("vue "+i._name+" init",n,r)),i.$options.el&&i.$mount(i.$options.el)}}(Rn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};t.set=function(e){ce("Avoid replacing instance root $data. Use nested data properties instead.",this)},n.set=function(){ce("$props is readonly.",this)},Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ze,e.prototype.$delete=Re,e.prototype.$watch=function(e,t,n){if(u(t))return un(this,e,t,n);(n=n||{}).user=!0;var r=new nn(this,e,t,n);return n.immediate&&t.call(this,r.value),function(){r.teardown()}}}(Rn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){if(Array.isArray(e))for(var r=0,i=e.length;r1?A(r):r;for(var i=A(arguments,1),o=0,a=r.length;oparseInt(this.max)&&qn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return j},set:function(){ce("Do not replace the Vue.config object, set individual fields instead.")}};Object.defineProperty(e,"config",t),e.util={warn:ce,extend:M,mergeOptions:He,defineReactive:Ne},e.set=ze,e.delete=Re,e.nextTick=pt,e.options=Object.create(null),P.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,M(e.options.components,Wn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=A(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=He(this.options,e),this}}(e),$n(e),function(e){P.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&We(e),"component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(Rn),Object.defineProperty(Rn.prototype,"$isServer",{get:ie}),Object.defineProperty(Rn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Rn,"FunctionalRenderContext",{value:Sn}),Rn.version="2.5.17";var Bn=h("style,class"),Hn=h("input,textarea,option,select,progress"),Gn=function(e,t,n){return"value"===n&&Hn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Vn=h("contenteditable,draggable,spellcheck"),Kn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Yn="http://www.w3.org/1999/xlink",Zn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Xn=function(e){return Zn(e)?e.slice(6,e.length):""},Jn=function(e){return null==e||!1===e};function Qn(e){for(var t=e.data,n=e,r=e;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=er(r.data,t));for(;i(n=n.parent);)n&&n.data&&(t=er(t,n.data));return function(e,t){if(i(e)||i(t))return tr(e,nr(t));return""}(t.staticClass,t.class)}function er(e,t){return{staticClass:tr(e.staticClass,t.staticClass),class:i(e.class)?[e.class,t.class]:t.class}}function tr(e,t){return e?t?e+" "+t:e:t||""}function nr(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,o=e.length;r-1?Cr(e,t,n):Kn(t)?Jn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Vn(t)?e.setAttribute(t,Jn(n)||"false"===n?"false":"true"):Zn(t)?Jn(n)?e.removeAttributeNS(Yn,Xn(t)):e.setAttributeNS(Yn,t,n):Cr(e,t,n)}function Cr(e,t,n){if(Jn(n))e.removeAttribute(t);else{if(Z&&!X&&"TEXTAREA"===e.tagName&&"placeholder"===t&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Ar={create:Er,update:Er};function Mr(e,t){var n=t.elm,o=t.data,a=e.data;if(!(r(o.staticClass)&&r(o.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=Qn(t),l=n._transitionClasses;i(l)&&(s=tr(s,nr(l))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ir,Or,Lr,Dr,Nr,zr,Rr,$r={create:Mr,update:Mr},Pr=/[\w).+\-_$\]]/;function Fr(e){var t,n,r,i,o,a=!1,s=!1,l=!1,c=!1,u=0,d=0,f=0,p=0;for(r=0;r=0&&" "===(h=e.charAt(m));m--);h&&Pr.test(h)||(c=!0)}}else void 0===i?(p=r+1,i=e.slice(0,r).trim()):g();function g(){(o||(o=[])).push(e.slice(p,r).trim()),p=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==p&&g(),o)for(r=0;r-1?{exp:e.slice(0,Dr),key:'"'+e.slice(Dr+1)+'"'}:{exp:e,key:null};Or=e,Dr=Nr=zr=0;for(;!Qr();)ei(Lr=Jr())?ni(Lr):91===Lr&&ti(Lr);return{exp:e.slice(0,Nr),key:e.slice(Nr+1,zr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Jr(){return Or.charCodeAt(++Dr)}function Qr(){return Dr>=Ir}function ei(e){return 34===e||39===e}function ti(e){var t=1;for(Nr=Dr;!Qr();)if(ei(e=Jr()))ni(e);else if(91===e&&t++,93===e&&t--,0===t){zr=Dr;break}}function ni(e){for(var t=e;!Qr()&&(e=Jr())!==t;);}var ri,ii="__r",oi="__c";function ai(e,t,n,r,i){var o;t=(o=t)._withTask||(o._withTask=function(){ct=!0;var e=o.apply(null,arguments);return ct=!1,e}),n&&(t=function(e,t,n){var r=ri;return function i(){null!==e.apply(null,arguments)&&si(t,i,n,r)}}(t,e,r)),ri.addEventListener(e,t,ne?{capture:r,passive:i}:r)}function si(e,t,n,r){(r||ri).removeEventListener(e,t._withTask||t,n)}function li(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},o=e.data.on||{};ri=t.elm,function(e){if(i(e[ii])){var t=Z?"change":"input";e[t]=[].concat(e[ii],e[t]||[]),delete e[ii]}i(e[oi])&&(e.change=[].concat(e[oi],e.change||[]),delete e[oi])}(n),Ct(n,o,ai,si,t.context),ri=void 0}}var ci={create:li,update:li};function ui(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,o,a=t.elm,s=e.data.domProps||{},l=t.data.domProps||{};for(n in i(l.__ob__)&&(l=t.data.domProps=M({},l)),s)r(l[n])&&(a[n]="");for(n in l){if(o=l[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),o===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n){a._value=o;var c=r(o)?"":String(o);di(a,c)&&(a.value=c)}else a[n]=o}}}function di(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(i(r)){if(r.lazy)return!1;if(r.number)return m(n)!==m(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var fi={create:ui,update:ui},pi=k(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function mi(e){var t=hi(e.style);return e.staticStyle?M(e.staticStyle,t):t}function hi(e){return Array.isArray(e)?I(e):"string"==typeof e?pi(e):e}var gi,vi=/^--/,yi=/\s*!important$/,bi=function(e,t,n){if(vi.test(t))e.style.setProperty(t,n);else if(yi.test(n))e.style.setProperty(t,n.replace(yi,""),"important");else{var r=ki(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(/\s+/).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Ei(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function Ti(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&M(t,Ci(e.name||"v")),M(t,e),t}return"string"==typeof e?Ci(e):void 0}}var Ci=k(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),Ai=G&&!X,Mi="transition",Ii="animation",Oi="transition",Li="transitionend",Di="animation",Ni="animationend";Ai&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Oi="WebkitTransition",Li="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Di="WebkitAnimation",Ni="webkitAnimationEnd"));var zi=G?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ri(e){zi(function(){zi(e)})}function $i(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),Si(e,t))}function Pi(e,t){e._transitionClasses&&y(e._transitionClasses,t),Ei(e,t)}function Fi(e,t,n){var r=qi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Mi?Li:Ni,l=0,c=function(){e.removeEventListener(s,u),n()},u=function(t){t.target===e&&++l>=a&&c()};setTimeout(function(){l0&&(n=Mi,u=a,d=o.length):t===Ii?c>0&&(n=Ii,u=c,d=l.length):d=(n=(u=Math.max(a,c))>0?a>c?Mi:Ii:null)?n===Mi?o.length:l.length:0,{type:n,timeout:u,propCount:d,hasTransform:n===Mi&&ji.test(r[Oi+"Property"])}}function Ui(e,t){for(;e.length explicit "+t+" duration is not a valid number - got "+JSON.stringify(e)+".",n.context):isNaN(e)&&ce(" explicit "+t+" duration is NaN - the duration expression might be incorrect.",n.context)}function Vi(e){return"number"==typeof e&&!isNaN(e)}function Ki(e){if(r(e))return!1;var t=e.fns;return i(t)?Ki(Array.isArray(t)?t[0]:t):(e._length||e.length)>1}function Yi(e,t){!0!==t.data.show&&Bi(t)}var Zi=function(e){var t,n,s={},l=e.modules,c=e.nodeOps;for(t=0;t - did you register the component correctly? For recursive components, make sure to provide the "name" option.',e.context),e.elm=e.ns?c.createElementNS(e.ns,h):c.createElement(h,e),k(e),y(e,m,t),i(d)&&x(e,t),v(n,e.elm,r),d&&d.pre&&p--):o(e.isComment)?(e.elm=c.createComment(e.text),v(n,e.elm,r)):(e.elm=c.createTextNode(e.text),v(n,e.elm,r))}}function g(e,t){i(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,b(e)?(x(e,t),k(e)):(pr(e),t.push(e))}function v(e,t,n){i(e)&&(i(n)?n.parentNode===e&&c.insertBefore(e,t,n):c.appendChild(e,t))}function y(e,t,n){if(Array.isArray(t)){T(t);for(var r=0;rp?w(e,r(n[v+1])?null:n[v+1].elm,n,f,v,o):f>v&&S(0,t,d,p)}(l,f,p,n,a):i(p)?(i(e.text)&&c.setTextContent(l,""),w(l,null,p,0,p.length-1,n)):i(f)?S(0,f,0,f.length-1):i(e.text)&&c.setTextContent(l,""):e.text!==t.text&&c.setTextContent(l,t.text),i(d)&&i(u=d.hook)&&i(u=u.postpatch)&&u(e,t)}}}function M(e,t,n){if(o(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r, or missing . Bailing hydration and performing full client-side render.")}d=e,e=new xe(c.tagName(d).toLowerCase(),{},[],void 0,d)}var g=e.elm,v=c.parentNode(g);if(m(t,p,g._leaveCb?null:v,c.nextSibling(g)),i(t.parent))for(var y=t.parent,x=b(t);y;){for(var k=0;k-1,a.selected!==o&&(a.selected=o);else if(N(to(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}else ce('