From fe75b4d3f2c824d4f6add524d67c55abc6796f84 Mon Sep 17 00:00:00 2001 From: kl <632104866@QQ.com> Date: Thu, 16 May 2019 11:07:18 +0800 Subject: [PATCH 1/8] add tech-support-qq-4.png --- doc/images/tech-support-qq-4.png | Bin 0 -> 7285 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/tech-support-qq-4.png diff --git a/doc/images/tech-support-qq-4.png b/doc/images/tech-support-qq-4.png new file mode 100644 index 0000000000000000000000000000000000000000..398a8c509bfe7c62ddba3b41593495eecce38b6d GIT binary patch literal 7285 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 Date: Thu, 16 May 2019 11:13:55 +0800 Subject: [PATCH 2/8] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 83a9be9aea8..70e5f61fa93 100644 --- a/README.md +++ b/README.md @@ -115,12 +115,14 @@ Java客户端不依赖任何框架,能够运行于所有Java运行时环境, # Support - + + + From d7d3fd908dfd11113fd891b581c1ebf43c60eb1a Mon Sep 17 00:00:00 2001 From: kl Date: Fri, 11 Dec 2020 17:03:33 +0800 Subject: [PATCH 3/8] Enhance the user experience in the scenario of submitting duplicate keys --- .../txtresolver/PropertyResolver.java | 19 ++++++++++--------- .../directive/namespace-panel-directive.js | 1 - 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java index 89cdc9705da..bdea8b73666 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java @@ -8,6 +8,7 @@ import com.google.common.base.Strings; import org.springframework.stereotype.Component; +import javax.validation.constraints.NotNull; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -35,9 +36,9 @@ public ItemChangeSets resolve(long namespaceId, String configText, List oldKeyMapItem.remove(""); String[] newItems = configText.split(ITEM_SEPARATOR); - - if (isHasRepeatKey(newItems)) { - throw new BadRequestException("config text has repeat key please check."); + Set repeatKeys = new HashSet<>(); + if (isHasRepeatKey(newItems,repeatKeys)) { + throw new BadRequestException(String.format("config text has repeat key please check.repeat keys:%s", repeatKeys.toString())); } ItemChangeSets changeSets = new ItemChangeSets(); @@ -72,24 +73,24 @@ public ItemChangeSets resolve(long namespaceId, String configText, List return changeSets; } - private boolean isHasRepeatKey(String[] newItems) { + private boolean isHasRepeatKey(String[] newItems,@NotNull Set repeatKeys) { Set keys = new HashSet<>(); int lineCounter = 1; - int keyCount = 0; for (String item : newItems) { if (!isCommentItem(item) && !isBlankItem(item)) { - keyCount++; String[] kv = parseKeyValueFromItem(item); if (kv != null) { - keys.add(kv[0].toLowerCase()); + String key = kv[0].toLowerCase(); + if(!keys.add(key)){ + repeatKeys.add(key); + } } else { throw new BadRequestException("line:" + lineCounter + " key value must separate by '='"); } } lineCounter++; } - - return keyCount > keys.size(); + return !repeatKeys.isEmpty(); } private String[] parseKeyValueFromItem(String item) { diff --git a/apollo-portal/src/main/resources/static/scripts/directive/namespace-panel-directive.js b/apollo-portal/src/main/resources/static/scripts/directive/namespace-panel-directive.js index 66b5e46d0e3..7b4f88ae0cc 100644 --- a/apollo-portal/src/main/resources/static/scripts/directive/namespace-panel-directive.js +++ b/apollo-portal/src/main/resources/static/scripts/directive/namespace-panel-directive.js @@ -745,7 +745,6 @@ function directive($window, $translate, toastr, AppUtil, EventManager, Permissio } ); namespace.commited = true; - toggleTextEditStatus(namespace); } function syntaxCheck(namespace) { From 5def448b7632b2992c7dda29c38750ff1368d0f9 Mon Sep 17 00:00:00 2001 From: chenkailing <632104866@qq.com> Date: Sat, 12 Dec 2020 14:16:43 +0800 Subject: [PATCH 4/8] Modify the key-value conflict exception prompt, adjust the code style --- .../portal/component/txtresolver/PropertyResolver.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java index bdea8b73666..10a614b69d1 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/txtresolver/PropertyResolver.java @@ -37,8 +37,8 @@ public ItemChangeSets resolve(long namespaceId, String configText, List String[] newItems = configText.split(ITEM_SEPARATOR); Set repeatKeys = new HashSet<>(); - if (isHasRepeatKey(newItems,repeatKeys)) { - throw new BadRequestException(String.format("config text has repeat key please check.repeat keys:%s", repeatKeys.toString())); + if (isHasRepeatKey(newItems, repeatKeys)) { + throw new BadRequestException(String.format("Config text has repeated keys: %s, please check your input.", repeatKeys.toString())); } ItemChangeSets changeSets = new ItemChangeSets(); @@ -73,7 +73,7 @@ public ItemChangeSets resolve(long namespaceId, String configText, List return changeSets; } - private boolean isHasRepeatKey(String[] newItems,@NotNull Set repeatKeys) { + private boolean isHasRepeatKey(String[] newItems, @NotNull Set repeatKeys) { Set keys = new HashSet<>(); int lineCounter = 1; for (String item : newItems) { From da97b0e33acc4d8b5bfc32c46d5fd02f8447e772 Mon Sep 17 00:00:00 2001 From: kl Date: Wed, 14 Dec 2022 11:12:38 +0800 Subject: [PATCH 5/8] feat(apollo-portal): Added serverconfig configuration management for ApolloConfigDB --- .../controller/ServerConfigController.java | 31 ++ .../ServerConfigControllerTest.java | 55 +++ .../controller/test-server-config.sql | 18 + .../repository/ServerConfigRepository.java | 2 + .../biz/service/ServerConfigService.java | 51 +++ .../apollo/portal/api/AdminServiceAPI.java | 12 + .../controller/ServerConfigController.java | 47 +- .../portal/service/ServerConfigService.java | 46 +- .../main/resources/static/config-manage.html | 230 ---------- .../src/main/resources/static/i18n/en.json | 6 +- .../src/main/resources/static/i18n/zh-CN.json | 6 +- .../src/main/resources/static/scripts/app.js | 2 +- .../scripts/controller/ConfigController.js | 121 ------ .../controller/ServerConfigController.js | 203 +++++++-- .../scripts/services/ServerConfigService.js | 46 +- .../main/resources/static/server_config.html | 132 ------ .../static/server_config_manage.html | 408 ++++++++++++++++++ .../resources/static/views/common/nav.html | 2 +- .../ServerConfigControllerTest.java | 27 +- doc/images/configure-view-permissions.png | Bin 36219 -> 49165 bytes doc/images/show-all-config.png | Bin 84054 -> 0 bytes docs/en/usage/apollo-user-guide.md | 2 - docs/zh/usage/apollo-user-guide.md | 2 - 23 files changed, 860 insertions(+), 589 deletions(-) create mode 100644 apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java create mode 100644 apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java create mode 100644 apollo-adminservice/src/test/resources/controller/test-server-config.sql create mode 100644 apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java delete mode 100644 apollo-portal/src/main/resources/static/config-manage.html delete mode 100644 apollo-portal/src/main/resources/static/scripts/controller/ConfigController.js delete mode 100644 apollo-portal/src/main/resources/static/server_config.html create mode 100644 apollo-portal/src/main/resources/static/server_config_manage.html delete mode 100644 doc/images/show-all-config.png diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java new file mode 100644 index 00000000000..28fd9b47ab8 --- /dev/null +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java @@ -0,0 +1,31 @@ +package com.ctrip.framework.apollo.adminservice.controller; + +import com.ctrip.framework.apollo.biz.entity.ServerConfig; +import com.ctrip.framework.apollo.biz.service.ServerConfigService; +import java.util.List; +import javax.validation.Valid; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author kl (http://kailing.pub) + * @since 2022/12/13 + */ +@RestController +public class ServerConfigController { + private final ServerConfigService serverConfigService; + public ServerConfigController(ServerConfigService serverConfigService) { + this.serverConfigService = serverConfigService; + } + @GetMapping("/server/config/find-all-config") + public List findAllServerConfig() { + return serverConfigService.findAll(); + } + + @PostMapping("/server/config") + public ServerConfig createOrUpdatePortalDBConfig(@Valid @RequestBody ServerConfig serverConfig) { + return serverConfigService.createOrUpdateConfig(serverConfig); + } +} diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java new file mode 100644 index 00000000000..16c263a20c8 --- /dev/null +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java @@ -0,0 +1,55 @@ +package com.ctrip.framework.apollo.adminservice.controller; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.ctrip.framework.apollo.biz.entity.ServerConfig; +import org.junit.jupiter.api.Test; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.Sql.ExecutionPhase; + +/** + * @author kl (http://kailing.pub) + * @since 2022/12/14 + */ +class ServerConfigControllerTest extends AbstractControllerTest { + + @Test + @Sql(scripts = "/controller/test-server-config.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/controller/cleanup.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD) + void findAllServerConfig() { + ServerConfig[] serverConfigs = restTemplate.getForObject(url("/server/config/find-all-config"), ServerConfig[].class); + assertNotNull(serverConfigs); + assertEquals(1, serverConfigs.length); + assertEquals("name", serverConfigs[0].getKey()); + assertEquals("kl", serverConfigs[0].getValue()); + } + + @Test + @Sql(scripts = "/controller/test-server-config.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/controller/cleanup.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD) + void createOrUpdatePortalDBConfig() { + ServerConfig serverConfig = new ServerConfig(); + serverConfig.setKey("name"); + serverConfig.setValue("ckl"); + ServerConfig response = restTemplate.postForObject(url("/server/config"), serverConfig, ServerConfig.class); + assertNotNull(response); + + ServerConfig[] serverConfigs = restTemplate.getForObject(url("/server/config/find-all-config"), ServerConfig[].class); + assertNotNull(serverConfigs); + assertEquals(1, serverConfigs.length); + assertEquals("name", serverConfigs[0].getKey()); + assertEquals("ckl", serverConfigs[0].getValue()); + + serverConfig = new ServerConfig(); + serverConfig.setKey("age"); + serverConfig.setValue("30"); + response = restTemplate.postForObject(url("/server/config"), serverConfig, ServerConfig.class); + assertNotNull(response); + + serverConfigs = restTemplate.getForObject(url("/server/config/find-all-config"), ServerConfig[].class); + assertNotNull(serverConfigs); + assertEquals(2, serverConfigs.length); + + } +} \ No newline at end of file diff --git a/apollo-adminservice/src/test/resources/controller/test-server-config.sql b/apollo-adminservice/src/test/resources/controller/test-server-config.sql new file mode 100644 index 00000000000..9b22d35b36f --- /dev/null +++ b/apollo-adminservice/src/test/resources/controller/test-server-config.sql @@ -0,0 +1,18 @@ +-- +-- Copyright 2022 Apollo Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +INSERT INTO `ServerConfig` (`Key`, `Cluster`, `Value`) +VALUES + ('name', 'default', 'kl'); diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ServerConfigRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ServerConfigRepository.java index 464d379eddb..9c01f72654d 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ServerConfigRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ServerConfigRepository.java @@ -25,4 +25,6 @@ */ public interface ServerConfigRepository extends PagingAndSortingRepository { ServerConfig findTopByKeyAndCluster(String key, String cluster); + + ServerConfig findByKey(String key); } diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java new file mode 100644 index 00000000000..8a85f985264 --- /dev/null +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java @@ -0,0 +1,51 @@ +package com.ctrip.framework.apollo.biz.service; + +import com.ctrip.framework.apollo.biz.entity.ServerConfig; +import com.ctrip.framework.apollo.biz.repository.ServerConfigRepository; +import com.ctrip.framework.apollo.common.utils.BeanUtils; +import com.google.common.collect.Lists; +import java.util.List; +import java.util.Objects; +import javax.transaction.Transactional; +import org.springframework.stereotype.Service; + +/** + * @author kl (http://kailing.pub) + * @since 2022/12/13 + */ +@Service +public class ServerConfigService { + + private final ServerConfigRepository serverConfigRepository; + + public ServerConfigService(ServerConfigRepository serverConfigRepository) { + this.serverConfigRepository = serverConfigRepository; + } + + public List findAll() { + Iterable serverConfigs = serverConfigRepository.findAll(); + return Lists.newArrayList(serverConfigs); + } + + @Transactional + public ServerConfig createOrUpdateConfig(ServerConfig serverConfig) { + + ServerConfig storedConfig = serverConfigRepository.findByKey(serverConfig.getKey()); + + if (Objects.isNull(storedConfig)) {//create + serverConfig.setId(0L);//为空,设置ID 为0,jpa执行新增操作 + if(Objects.isNull(serverConfig.getCluster())){ + serverConfig.setCluster("default"); + } + return serverConfigRepository.save(serverConfig); + } + + //update + storedConfig.setComment(serverConfig.getComment()); + storedConfig.setDataChangeLastModifiedBy(serverConfig.getDataChangeLastModifiedBy()); + storedConfig.setValue(serverConfig.getValue()); + + return serverConfigRepository.save(storedConfig); + } + +} diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java index 692978d2967..e49282301c8 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java @@ -18,6 +18,7 @@ import com.ctrip.framework.apollo.common.dto.*; import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO; +import com.ctrip.framework.apollo.portal.entity.po.ServerConfig; import com.ctrip.framework.apollo.portal.environment.Env; import com.google.common.base.Joiner; import java.nio.charset.StandardCharsets; @@ -574,5 +575,16 @@ public PageDTO findByPreviousReleaseIdAndOperation(Env env, l } } + @Service + public static class ServerConfigAPI extends API { + public List findAllConfigDBConfig(Env env){ + return restTemplate.get(env, "/server/config/find-all-config", new ParameterizedTypeReference>() { + }).getBody(); + } + + public ServerConfig createOrUpdateConfigDBConfig(Env env, ServerConfig serverConfig){ + return restTemplate.post(env, "/server/config", serverConfig, ServerConfig.class); + } + } } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ServerConfigController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ServerConfigController.java index 0bf5bb94b8e..3760c3abb24 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ServerConfigController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ServerConfigController.java @@ -17,13 +17,10 @@ package com.ctrip.framework.apollo.portal.controller; -import com.ctrip.framework.apollo.common.utils.BeanUtils; import com.ctrip.framework.apollo.portal.entity.po.ServerConfig; -import com.ctrip.framework.apollo.portal.repository.ServerConfigRepository; +import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.service.ServerConfigService; -import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; import java.util.List; -import java.util.Objects; import javax.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; @@ -37,46 +34,34 @@ */ @RestController public class ServerConfigController { - - private final ServerConfigRepository serverConfigRepository; - private final UserInfoHolder userInfoHolder; private final ServerConfigService serverConfigService; - public ServerConfigController(final ServerConfigRepository serverConfigRepository, final UserInfoHolder userInfoHolder, final ServerConfigService serverConfigService) { - this.serverConfigRepository = serverConfigRepository; - this.userInfoHolder = userInfoHolder; + public ServerConfigController(final ServerConfigService serverConfigService) { this.serverConfigService = serverConfigService; } @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") - @PostMapping("/server/config") - public ServerConfig createOrUpdate(@Valid @RequestBody ServerConfig serverConfig) { - String modifiedBy = userInfoHolder.getUser().getUserId(); - - ServerConfig storedConfig = serverConfigRepository.findByKey(serverConfig.getKey()); + @PostMapping("/server/portal-db/config") + public ServerConfig createOrUpdatePortalDBConfig(@Valid @RequestBody ServerConfig serverConfig) { + return serverConfigService.createOrUpdatePortalDBConfig(serverConfig); + } - if (Objects.isNull(storedConfig)) {//create - serverConfig.setDataChangeCreatedBy(modifiedBy); - serverConfig.setDataChangeLastModifiedBy(modifiedBy); - serverConfig.setId(0L);//为空,设置ID 为0,jpa执行新增操作 - return serverConfigRepository.save(serverConfig); - } - //update - BeanUtils.copyEntityProperties(serverConfig, storedConfig); - storedConfig.setDataChangeLastModifiedBy(modifiedBy); - return serverConfigRepository.save(storedConfig); + @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") + @PostMapping("/server/envs/{env}/config-db/config") + public ServerConfig createOrUpdateConfigDBConfig(@Valid @RequestBody ServerConfig serverConfig, @PathVariable String env) { + return serverConfigService.createOrUpdateConfigDBConfig(Env.transformEnv(env), serverConfig); } @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") - @GetMapping("/server/config/find-all-config") - public List findAllServerConfig() { - return serverConfigService.findAll(); + @GetMapping("/server/portal-db/config/find-all-config") + public List findAllPortalDBServerConfig() { + return serverConfigService.findAllPortalDBConfig(); } @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") - @GetMapping("/server/config/{key:.+}") - public ServerConfig loadServerConfig(@PathVariable String key) { - return serverConfigRepository.findByKey(key); + @GetMapping("/server/envs/{env}/config-db/config/find-all-config") + public List findAllConfigDBServerConfig(@PathVariable String env) { + return serverConfigService.findAllConfigDBConfig(Env.transformEnv(env)); } } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ServerConfigService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ServerConfigService.java index 9cf5dabaf42..fd9b8325f5f 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ServerConfigService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ServerConfigService.java @@ -17,10 +17,17 @@ package com.ctrip.framework.apollo.portal.service; +import com.ctrip.framework.apollo.common.utils.BeanUtils; +import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; +import com.ctrip.framework.apollo.portal.api.AdminServiceAPI.ServerConfigAPI; import com.ctrip.framework.apollo.portal.entity.po.ServerConfig; +import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.repository.ServerConfigRepository; +import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; import com.google.common.collect.Lists; import java.util.List; +import java.util.Objects; +import javax.transaction.Transactional; import org.springframework.stereotype.Service; @Service @@ -28,12 +35,47 @@ public class ServerConfigService { private final ServerConfigRepository serverConfigRepository; - public ServerConfigService(final ServerConfigRepository serverConfigRepository) { + private final AdminServiceAPI.ServerConfigAPI serverConfigAPI; + private final UserInfoHolder userInfoHolder; + + public ServerConfigService(final ServerConfigRepository serverConfigRepository, + ServerConfigAPI serverConfigAPI, UserInfoHolder userInfoHolder) { this.serverConfigRepository = serverConfigRepository; + this.serverConfigAPI = serverConfigAPI; + this.userInfoHolder = userInfoHolder; } - public List findAll() { + public List findAllPortalDBConfig() { Iterable serverConfigs = serverConfigRepository.findAll(); return Lists.newArrayList(serverConfigs); } + public List findAllConfigDBConfig(Env env) { + return serverConfigAPI.findAllConfigDBConfig(env); + } + + @Transactional + public ServerConfig createOrUpdatePortalDBConfig(ServerConfig serverConfig) { + String modifiedBy = userInfoHolder.getUser().getUserId(); + + ServerConfig storedConfig = serverConfigRepository.findByKey(serverConfig.getKey()); + + if (Objects.isNull(storedConfig)) {//create + serverConfig.setDataChangeCreatedBy(modifiedBy); + serverConfig.setDataChangeLastModifiedBy(modifiedBy); + serverConfig.setId(0L);//为空,设置ID 为0,jpa执行新增操作 + return serverConfigRepository.save(serverConfig); + } + //update + BeanUtils.copyEntityProperties(serverConfig, storedConfig); + storedConfig.setDataChangeLastModifiedBy(modifiedBy); + return serverConfigRepository.save(storedConfig); + } + + @Transactional + public ServerConfig createOrUpdateConfigDBConfig(Env env, ServerConfig serverConfig) { + String modifiedBy = userInfoHolder.getUser().getUserId(); + serverConfig.setDataChangeCreatedBy(modifiedBy); + serverConfig.setDataChangeLastModifiedBy(modifiedBy); + return serverConfigAPI.createOrUpdateConfigDBConfig(env, serverConfig); + } } diff --git a/apollo-portal/src/main/resources/static/config-manage.html b/apollo-portal/src/main/resources/static/config-manage.html deleted file mode 100644 index d4b3e00f84c..00000000000 --- a/apollo-portal/src/main/resources/static/config-manage.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - - - - - - - - {{'ServiceConfig.Title' | translate }} - - - - - -
-
-
-
-
- -
-
-
-
-
- {{'ServiceConfig.Title' | translate }} - {{'ServiceConfig.Tips' | translate }} -
- -
-
- -
- - - -
-
-
- -
Apollo配置中心技术支持③群
群号:742035428
Apollo配置中心技术支持④群
群号:516773934
Apollo配置中心技术支持③群
群号:742035428(已满)
Apollo配置中心技术支持②群
群号:904287263(已满)
Apollo配置中心技术支持①群
群号:375526581(已满)
tech-support-qq-4 tech-support-qq-3 tech-support-qq-2 tech-support-qq-1
- - - - - - - - - - - - -
{{'Config.Key' | translate }}{{'Config.Value' | translate }}{{'Config.Comment' | translate }}{{'Config.Operation' | translate }}
{{ config.key }}{{ config.value }}{{ config.comment }} - - {{'UserMange.Edit' | translate }} - -
- -
-
- - -
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
-
- - -
-
-
-
-
- -
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
-
- - -
-
-
-
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apollo-portal/src/main/resources/static/i18n/en.json b/apollo-portal/src/main/resources/static/i18n/en.json index 64a88572181..b3ae4191adf 100644 --- a/apollo-portal/src/main/resources/static/i18n/en.json +++ b/apollo-portal/src/main/resources/static/i18n/en.json @@ -497,7 +497,11 @@ "Namespace.PleaseChooseCluster": "Select Cluster", "Namespace.CheckNamespaceNameLengthTip": "The namespace name should not be longer than 32 characters. Department prefix:'{{departmentLength}}' characters, name {{namespaceLength}} characters", "ServiceConfig.Title": "System Configuration", - "ServiceConfig.Tips": "(Maintain Apollo PortalDB.ServerConfig table data, will override configuration items if they already exist in the edit operation, or create configuration items. Configuration updates take effect automatically in a minute)", + "ServiceConfig.PortalDB.Tips": "(Maintain Apollo PortalDB.ServerConfig table data, will override configuration items if they already exist in the edit operation, or create configuration items. Configuration updates take effect automatically in a minute)", + "ServiceConfig.ConfigDB.Tips": "(Maintain Apollo ConfigDB.ServerConfig table data, will override configuration items if they already exist in the edit operation, or create configuration items. Configuration updates take effect automatically in a minute)", + "ServiceConfig.PortalDB.Tab": "PortalDB configuration management", + "ServiceConfig.ConfigDB.Tab": "ConfigDB configuration management", + "ServiceConfig.Switch.Env": "Switch Environment", "ServiceConfig.Key": "Key", "ServiceConfig.KeyTips": "(Please query the configuration information before modifying the configuration)", "ServiceConfig.Value": "Value", diff --git a/apollo-portal/src/main/resources/static/i18n/zh-CN.json b/apollo-portal/src/main/resources/static/i18n/zh-CN.json index c50dfd07309..d9cc68e2f1b 100644 --- a/apollo-portal/src/main/resources/static/i18n/zh-CN.json +++ b/apollo-portal/src/main/resources/static/i18n/zh-CN.json @@ -497,7 +497,11 @@ "Namespace.PleaseChooseCluster": "请选择集群", "Namespace.CheckNamespaceNameLengthTip": "Namespace 名称不能大于 32 个字符。 部门前缀:'{{departmentLength}}' 个字符, 名称 {{namespaceLength}} 个字符", "ServiceConfig.Title": "应用配置", - "ServiceConfig.Tips": "(维护 ApolloPortalDB.ServerConfig 表数据,编辑操作中如果已存在配置项则会覆盖,否则会创建配置项。配置更新后,一分钟后自动生效)", + "ServiceConfig.PortalDB.Tips": "(维护 ApolloPortalDB.ServerConfig 表数据,编辑操作中如果已存在配置项则会覆盖,否则会创建配置项。配置更新后,一分钟后自动生效)", + "ServiceConfig.ConfigDB.Tips": "(维护 ApolloConfigDB.ServerConfig 表数据,编辑操作中如果已存在配置项则会覆盖,否则会创建配置项。配置更新后,一分钟后自动生效)", + "ServiceConfig.PortalDB.Tab": "PortalDB 配置管理", + "ServiceConfig.ConfigDB.Tab": "ConfigDB 配置管理", + "ServiceConfig.Switch.Env": "切换环境", "ServiceConfig.Key": "Key", "ServiceConfig.KeyTips": "(修改配置前请先查询该配置信息)", "ServiceConfig.Value": "Value", diff --git a/apollo-portal/src/main/resources/static/scripts/app.js b/apollo-portal/src/main/resources/static/scripts/app.js index 16eb0ef4141..09b698df410 100644 --- a/apollo-portal/src/main/resources/static/scripts/app.js +++ b/apollo-portal/src/main/resources/static/scripts/app.js @@ -63,7 +63,7 @@ var diff_item_module = angular.module('diff_item', ['app.service', 'apollo.direc //namespace var namespace_module = angular.module('namespace', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar', 'valdr']); //server config -var server_config_module = angular.module('server_config', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar']); +var server_config_manage_module = angular.module('server_config_manage', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar']); //setting var setting_module = angular.module('setting', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar', 'valdr']); //role diff --git a/apollo-portal/src/main/resources/static/scripts/controller/ConfigController.js b/apollo-portal/src/main/resources/static/scripts/controller/ConfigController.js deleted file mode 100644 index 43de8742411..00000000000 --- a/apollo-portal/src/main/resources/static/scripts/controller/ConfigController.js +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2022 Apollo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -user_module.controller('ConfigController', - ['$scope', '$window', '$translate', 'toastr', 'AppUtil', 'ServerConfigService', 'PermissionService', - ConfigController]); - -function ConfigController($scope, $window, $translate, toastr, AppUtil, ServerConfigService, PermissionService) { - - $scope.serverConfig = {}; - $scope.createdConfigs = []; - $scope.filterConfig = []; - $scope.status = '1'; - $scope.searchKey = ''; - $scope.configEdit = configEdit; - $scope.create = create; - $scope.goback = goback; - $scope.portalDB = portalDB; - $scope.searchKeys = searchKeys; - $scope.resetSearchKey = resetSearchKey; - $scope.ConfigPage = 0; - - - initPermission(); - - getPortalDBConfig(); - - function initPermission() { - PermissionService.has_root_permission() - .then(function (result) { - $scope.isRootUser = result.hasPermission; - }) - } - - function getPortalDBConfig() { - ServerConfigService.findPortalDBConfig() - .then(function (result) { - if (!result || result.length === 0) { - $scope.ConfigPage = $scope.ConfigPage - 1; - return; - } - $scope.createdConfigs = []; - $scope.filterConfig = []; - result.forEach(function (user) { - $scope.createdConfigs.push(user); - $scope.filterConfig.push(user); - }); - }) - } - - - function configEdit (status,config) { - $scope.status = status; - - $scope.serverConfig = {}; - if (config != null) { - $scope.serverConfig = { - key: config.key, - value: config.value, - comment: config.comment - } - } - } - - function create() { - ServerConfigService.create($scope.serverConfig).then(function (result) { - toastr.success($translate.instant('ServiceConfig.Saved')); - $scope.serverConfig = result; - getPortalDBConfig(); - $scope.status = '1'; - }, function (result) { - toastr.error(AppUtil.errorMsg(result), $translate.instant('ServiceConfig.SaveFailed')); - }); - } - - - function goback(){ - $scope.status = '1'; - - getPortalDBConfig(); - } - - - function portalDB(){ - $scope.status = '1'; - $scope.ConfigPage = 0; - getPortalDBConfig(); - } - - function searchKeys() { - $scope.searchKey = $scope.searchKey.toLowerCase(); - var filterConfig = [] - $scope.createdConfigs.forEach(function (item) { - var keyName = item.key; - if (keyName && keyName.toLowerCase().indexOf( $scope.searchKey) >= 0) { - filterConfig.push(item); - } - }); - $scope.filterConfig = filterConfig - } - - function resetSearchKey() { - $scope.searchKey = '' - searchKeys() - } - - -} diff --git a/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js b/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js index 0980bb2805b..45772f7aa30 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js @@ -14,51 +14,172 @@ * limitations under the License. * */ -server_config_module.controller('ServerConfigController', - ['$scope', '$window', '$translate', 'toastr', 'ServerConfigService', 'AppUtil', 'PermissionService', - function ($scope, $window, $translate, toastr, ServerConfigService, AppUtil, PermissionService) { +server_config_manage_module.controller('ServerConfigController', + ['$scope', '$window', '$translate', 'toastr', 'AppUtil', 'ServerConfigService', 'PermissionService', + 'EnvService', ServerConfigController]); - $scope.serverConfig = {}; - $scope.saveBtnDisabled = true; +function ServerConfigController($scope, $window, $translate, toastr, AppUtil, ServerConfigService, PermissionService, EnvService) { - initPermission(); + $scope.serverConfig = {}; + $scope.portalDBConfigs = []; + $scope.portalDBFilterConfigs = []; + $scope.configDBConfigs = []; + $scope.configDBFilterConfigs = []; + $scope.envs = []; + $scope.selectedEnv = ''; + $scope.displayModule = 'home'; + $scope.portalDBConfigSearchKey = ''; + $scope.configDBConfigSearchKey = ''; + $scope.configEdit = configEdit; + $scope.createPortalDBConfig = createPortalDBConfig; + $scope.createConfigDBConfig = createConfigDBConfig; + $scope.gobackPortalDBTabs = gobackPortalDBTabs; + $scope.gobackConfigDBTabs = gobackConfigDBTabs; + $scope.portalDBConfigFilter = portalDBConfigFilter; + $scope.configDBConfigFilter = configDBConfigFilter; + $scope.resetPortalDBConfigSearchKey = resetPortalDBConfigSearchKey; + $scope.resetConfigDBConfigSearchKey = resetConfigDBConfigSearchKey; + $scope.switchConfigDBEnvs = switchConfigDBEnvs; - function initPermission() { - PermissionService.has_root_permission() - .then(function (result) { - $scope.isRootUser = result.hasPermission; - }) + $scope.allowSwitchingTabs = true; + + init(); + function init() { + initPermission(); + getPortalDBConfig(); + initEnv(); + } + function initEnv() { + EnvService.find_all_envs().then(function (result) { + $scope.envs = result; + $scope.selectedEnv = result[0]; + getConfigDBConfig(); + }); + } + function initPermission() { + PermissionService.has_root_permission() + .then(function (result) { + $scope.isRootUser = result.hasPermission; + }) + } + + function getPortalDBConfig() { + ServerConfigService.findPortalDBConfig() + .then(function (result) { + $scope.portalDBConfigs = []; + $scope.portalDBFilterConfigs = []; + result.forEach(function (user) { + $scope.portalDBConfigs.push(user); + $scope.portalDBFilterConfigs.push(user); + }); + },function (result) { + $scope.portalDBConfigs = []; + $scope.portalDBFilterConfigs = []; + toastr.error(AppUtil.errorMsg(result), $translate.instant('Config.SystemError')); + }) + } + + function getConfigDBConfig() { + ServerConfigService.findConfigDBConfig($scope.selectedEnv) + .then(function (result) { + $scope.configDBConfigs = []; + $scope.configDBFilterConfigs = []; + result.forEach(function (user) { + $scope.configDBConfigs.push(user); + $scope.configDBFilterConfigs.push(user); + }); + },function (result) { + $scope.configDBConfigs = []; + $scope.configDBFilterConfigs = []; + toastr.error(AppUtil.errorMsg(result), $translate.instant('Config.SystemError')); + }); + } + + function configEdit (displayModule,config) { + $scope.displayModule = displayModule; + $scope.allowSwitchingTabs = false; + + $scope.serverConfig = {}; + if (config != null) { + $scope.serverConfig = { + key: config.key, + value: config.value, + comment: config.comment + } + } + } + + function switchConfigDBEnvs(env) { + $scope.selectedEnv = env; + getConfigDBConfig(); + } + + function createPortalDBConfig() { + ServerConfigService.createPortalDBConfig($scope.serverConfig).then(function (result) { + toastr.success($translate.instant('ServiceConfig.Saved')); + getPortalDBConfig(); + $scope.displayModule = 'home'; + $scope.allowSwitchingTabs = true; + }, function (result) { + toastr.error(AppUtil.errorMsg(result), $translate.instant('ServiceConfig.SaveFailed')); + }); + } + + function createConfigDBConfig() { + ServerConfigService.createConfigDBConfig($scope.selectedEnv, $scope.serverConfig).then(function (result) { + toastr.success($translate.instant('ServiceConfig.Saved')); + getConfigDBConfig(); + $scope.displayModule = 'home'; + $scope.allowSwitchingTabs = true; + }, function (result) { + toastr.error(AppUtil.errorMsg(result), $translate.instant('ServiceConfig.SaveFailed')); + }); + } + + + function gobackPortalDBTabs(){ + $scope.displayModule = 'home'; + $scope.allowSwitchingTabs = true; + getPortalDBConfig(); + } + + function gobackConfigDBTabs(){ + $scope.displayModule = 'home'; + $scope.allowSwitchingTabs = true; + getConfigDBConfig(); + } + + function portalDBConfigFilter() { + $scope.portalDBConfigSearchKey = $scope.portalDBConfigSearchKey.toLowerCase(); + let filterConfig = [] + $scope.portalDBConfigs.forEach(function (item) { + let keyName = item.key; + if (keyName && keyName.toLowerCase().indexOf( $scope.portalDBConfigSearchKey) >= 0) { + filterConfig.push(item); } + }); + $scope.portalDBFilterConfigs = filterConfig + } + + function resetPortalDBConfigSearchKey() { + $scope.portalDBConfigSearchKey = '' + portalDBConfigFilter() + } - $scope.create = function () { - ServerConfigService.create($scope.serverConfig).then(function (result) { - toastr.success($translate.instant('ServiceConfig.Saved')); - $scope.saveBtnDisabled = true; - $scope.serverConfig = result; - }, function (result) { - toastr.error(AppUtil.errorMsg(result), $translate.instant('ServiceConfig.SaveFailed')); - }); - }; - - $scope.getServerConfigInfo = function () { - if (!$scope.serverConfig.key) { - toastr.warning($translate.instant('ServiceConfig.PleaseEnterKey')); - return; - } - - ServerConfigService.getServerConfigInfo($scope.serverConfig.key).then(function (result) { - $scope.saveBtnDisabled = false; - - if (!result.key) { - toastr.info($translate.instant('ServiceConfig.KeyNotExistsAndCreateTip', { key: $scope.serverConfig.key })); - return; - } - - toastr.info($translate.instant('ServiceConfig.KeyExistsAndSaveTip', { key: $scope.serverConfig.key })); - $scope.serverConfig = result; - }, function (result) { - AppUtil.showErrorMsg(result); - }) + function configDBConfigFilter() { + $scope.configDBConfigSearchKey = $scope.configDBConfigSearchKey.toLowerCase(); + let filterConfig = [] + $scope.configDBConfigs.forEach(function (item) { + let keyName = item.key; + if (keyName && keyName.toLowerCase().indexOf( $scope.configDBConfigSearchKey) >= 0) { + filterConfig.push(item); } + }); + $scope.configDBFilterConfigs = filterConfig + } - }]); + function resetConfigDBConfigSearchKey() { + $scope.configDBConfigSearchKey = '' + configDBConfigFilter() + } +} diff --git a/apollo-portal/src/main/resources/static/scripts/services/ServerConfigService.js b/apollo-portal/src/main/resources/static/scripts/services/ServerConfigService.js index b6aa0edd72c..878b2c7e9ae 100644 --- a/apollo-portal/src/main/resources/static/scripts/services/ServerConfigService.js +++ b/apollo-portal/src/main/resources/static/scripts/services/ServerConfigService.js @@ -15,36 +15,41 @@ * */ appService.service('ServerConfigService', ['$resource', '$q', 'AppUtil', function ($resource, $q, AppUtil) { - var server_config_resource = $resource('', {}, { - create_server_config: { + let server_config_resource = $resource('', {}, { + create_portal_db_config: { method: 'POST', - url: AppUtil.prefixPath() + '/server/config' + url: AppUtil.prefixPath() + '/server/portal-db/config' }, - get_server_config_info: { - method: 'GET', - url: AppUtil.prefixPath() + '/server/config/:key' + create_config_db_config: { + method: 'POST', + url: AppUtil.prefixPath() + '/server/envs/:env/config-db/config' }, find_portal_db_config: { method: 'GET', isArray: true, - url: AppUtil.prefixPath() + '/server/config/find-all-config' + url: AppUtil.prefixPath() + + '/server/portal-db/config/find-all-config' + }, + find_config_db_config: { + method: 'GET', + isArray: true, + url: AppUtil.prefixPath() + + '/server/envs/:env/config-db/config/find-all-config' } }); return { - create: function (serverConfig) { - var d = $q.defer(); - server_config_resource.create_server_config({}, serverConfig, function (result) { + createPortalDBConfig: function (serverConfig) { + let d = $q.defer(); + server_config_resource.create_portal_db_config({}, serverConfig, function (result) { d.resolve(result); }, function (result) { d.reject(result); }); return d.promise; }, - getServerConfigInfo: function (key) { - var d = $q.defer(); - server_config_resource.get_server_config_info({ - key: key - }, function (result) { + createConfigDBConfig: function (env, serverConfig) { + let d = $q.defer(); + server_config_resource.create_config_db_config({env:env}, serverConfig, function (result) { d.resolve(result); }, function (result) { d.reject(result); @@ -52,7 +57,7 @@ appService.service('ServerConfigService', ['$resource', '$q', 'AppUtil', functio return d.promise; }, findPortalDBConfig:function (){ - var d = $q.defer(); + let d = $q.defer(); server_config_resource.find_portal_db_config({ }, function (result) { d.resolve(result); @@ -60,6 +65,15 @@ appService.service('ServerConfigService', ['$resource', '$q', 'AppUtil', functio d.reject(result); }); return d.promise; + }, + findConfigDBConfig:function (env){ + let d = $q.defer(); + server_config_resource.find_config_db_config({env: env}, function (result) { + d.resolve(result); + }, function (result) { + d.reject(result); + }); + return d.promise; } } }]); diff --git a/apollo-portal/src/main/resources/static/server_config.html b/apollo-portal/src/main/resources/static/server_config.html deleted file mode 100644 index 105fea6170b..00000000000 --- a/apollo-portal/src/main/resources/static/server_config.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - {{'ServiceConfig.Title' | translate }} - - - - - -
-
-
-
-
- {{'ServiceConfig.Title' | translate }} - {{'ServiceConfig.Tips' | translate }} -
- -
-
-
- -
- - {{'ServiceConfig.KeyTips' | translate }} -
-
- -
-
-
- -
- -
-
-
- -
- -
-
- -
-
- -
-
-
-
-
-
-
-

{{'Common.IsRootUser' | translate }}

-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apollo-portal/src/main/resources/static/server_config_manage.html b/apollo-portal/src/main/resources/static/server_config_manage.html new file mode 100644 index 00000000000..9ba65f5076c --- /dev/null +++ b/apollo-portal/src/main/resources/static/server_config_manage.html @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + {{'ServiceConfig.Title' | translate }} + + + + + +
+
+ + +
+
+
+
+
+
+
+
+ {{'ServiceConfig.Title' | translate }} + {{'ServiceConfig.PortalDB.Tips' | translate }} +
+
+ +
+
+ +
+ + +
+
+
+
+ + + + + + + + + + + + + + +
{{'Config.Key' | translate }}{{'Config.Value' | translate }}{{'Config.Comment' | translate }}{{'Config.Operation' | translate }}
{{ config.key }}{{ config.value }}{{ config.comment }} + + {{'UserMange.Edit' | translate }} + +
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ {{'ServiceConfig.Title' | translate }} + {{'ServiceConfig.ConfigDB.Tips' | translate }} +
+
+
+
+
+ + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+ + +
+
+
+
+ + + + + + + + + + + + + + + +
{{'Config.Key' | translate }}{{'Config.Value' | translate }}{{'Config.Comment' | translate }}{{'Config.Operation' | translate }}
{{ config.key }}{{ config.value }}{{ config.comment }} + + {{'UserMange.Edit' | translate }} + +
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+
+
+
+
+
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apollo-portal/src/main/resources/static/views/common/nav.html b/apollo-portal/src/main/resources/static/views/common/nav.html index a887ace75e9..42056f85ad7 100644 --- a/apollo-portal/src/main/resources/static/views/common/nav.html +++ b/apollo-portal/src/main/resources/static/views/common/nav.html @@ -61,7 +61,7 @@
  • {{'Common.Nav.UserManage' | translate }}
  • {{'Common.Nav.SystemRoleManage' | translate }}
  • {{'Common.Nav.OpenMange' | translate }}
  • -
  • {{'Common.Nav.SystemConfig' | translate }}
  • +
  • {{'Common.Nav.SystemConfig' | translate }}
  • {{'Common.Nav.DeleteApp-Cluster-Namespace' | translate }}
  • {{'Common.Nav.SystemInfo' | translate }}
  • {{'Common.Nav.ConfigExport' | translate }}
  • diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/ServerConfigControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/ServerConfigControllerTest.java index 6af63ca4d18..e948d933d7a 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/ServerConfigControllerTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/ServerConfigControllerTest.java @@ -17,7 +17,9 @@ package com.ctrip.framework.apollo.portal.controller; import com.ctrip.framework.apollo.portal.AbstractIntegrationTest; +import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; import com.ctrip.framework.apollo.portal.entity.po.ServerConfig; +import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.service.ServerConfigService; import org.junit.Assert; import org.junit.Test; @@ -33,7 +35,8 @@ import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertEquals; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; /** * Created by kezhenxu at 2019/1/14 13:24. @@ -44,30 +47,31 @@ public class ServerConfigControllerTest extends AbstractIntegrationTest { @Mock private ServerConfigService serverConfigService; + @InjectMocks private ServerConfigController serverConfigController; @Test @Sql(scripts = "/sql/cleanup.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) - public void shouldSuccessWhenParameterValid() { + public void shouldSuccessWhenParameterValidForPortalDBConfig() { ServerConfig serverConfig = new ServerConfig(); serverConfig.setKey("validKey"); serverConfig.setValue("validValue"); ResponseEntity responseEntity = restTemplate.postForEntity( - url("/server/config"), serverConfig, ServerConfig.class + url("/server/portal-db/config"), serverConfig, ServerConfig.class ); assertEquals(responseEntity.getBody().getKey(), serverConfig.getKey()); assertEquals(responseEntity.getBody().getValue(), serverConfig.getValue()); } @Test - public void shouldFailWhenParameterInvalid() { + public void shouldFailWhenParameterInvalidForPortalDBConfig() { ServerConfig serverConfig = new ServerConfig(); serverConfig.setKey(" "); serverConfig.setValue("valid"); try { restTemplate.postForEntity( - url("/server/config"), serverConfig, ServerConfig.class + url("/server/portal-db/config"), serverConfig, ServerConfig.class ); Assert.fail("Should throw"); } catch (final HttpClientErrorException e) { @@ -80,7 +84,7 @@ public void shouldFailWhenParameterInvalid() { serverConfig.setValue(" "); try { restTemplate.postForEntity( - url("/server/config"), serverConfig, ServerConfig.class + url("/server/portal-db/config"), serverConfig, ServerConfig.class ); Assert.fail("Should throw"); } catch (final HttpClientErrorException e) { @@ -93,9 +97,16 @@ public void shouldFailWhenParameterInvalid() { @Test public void testFindEmpty() { - when(serverConfigService.findAll()).thenReturn(new ArrayList<>()); - List serverConfigList = serverConfigController.findAllServerConfig(); + when(serverConfigService.findAllPortalDBConfig()).thenReturn(new ArrayList<>()); + when(serverConfigService.findAllConfigDBConfig(Env.DEV)).thenReturn(new ArrayList<>()); + + List serverConfigList = serverConfigController.findAllPortalDBServerConfig(); + Assert.assertNotNull(serverConfigList); + Assert.assertEquals(0, serverConfigList.size()); + + serverConfigList = serverConfigController.findAllConfigDBServerConfig(Env.DEV.getName()); Assert.assertNotNull(serverConfigList); Assert.assertEquals(0, serverConfigList.size()); + } } diff --git a/doc/images/configure-view-permissions.png b/doc/images/configure-view-permissions.png index c5bc20d6ebc4737b604cebfadd889443e6b3afb5..6bd4e94d45e193dac02b009d3e52ffe2f93a77e6 100644 GIT binary patch literal 49165 zcmeFZ%=N)F2ImbO{ne z=g{z6+=(S4xvo8Xuf5jVYp=aNynCvlM0%6zjVtwcU(_{CG4;D&hPq~~AN}6gnn8|^Rwpue zZf|XF&1UpY78~D_*AmDv?Wc)GKsX@AGI|sgkd+ACr@?{ue-gj%Og(Dx-28;FEeYir z{rK&)sg`kB-?jgVSv2j7L)c;LY3ITN?%SuP9bc;)X6o*<{=4^o)mgC4N4eV8G4ONB`-Es5z4=ikB4 zg!4C_3pSo@)!VebCBeMo$W&hJjM09=^-Ep8`C>#{Gd~V?%2}*iSuouZ6%nDFIQWH- z$#RB{Nkc6pocyQd?9!2bTA!35Kb?nq&z$vO8S?v>E&A_{irf^PlhcUIBw7O%<}zV64yv9{3oi zA#mK)3)y~9t13+Qv8{e=Boyhr~o z_3-_-NYuB82)6*?t>kwV7Qwv6&dQz_edppmEPOQ~DYy*p0Gg8_^?Qw9#K5eM1+=k@ija zn(vWjL0F3oYO1At|5}I*-v92mYXwyzdc0LDVsJFrXS2Kaz~-{y1hbkO`{w5?cN*ML zGaXUbxW0Qf++q^4?|K#%OOyGs7^_S6R|tI(zzCJU56)8ok~IV*OLw%UZDg@ykWx~& zeJbqvyWyaN+9*$(5Y#m=%l*+8?5~8~Otb7oB#agrByRaFAnibgE@K}~E?#SL{%7fK z1NNNoW+<9)?(2(h!wVfzu69~^Yh~NKMorVM-vVS|SLgc&KRL4UPWD$)ns3|WXoH$O zVcyaP5^hdCLdTf_XG`ZN;{s+C$ndVowt2Iz{!0`?$~``PL_p<1l!eWj6&kI&-Slzx z*xK*qe>{aS6D^#T_1C9VP?Pumay}6g9Ae-xVS#DA#jloP=wnm27%MrPr;^w$ZQnJV zuPW;63!zCHGCtp^92jmRmrn1OzB+g7<|@nstVT*50b$|Qt1dd%#;{YcHUD|9It)FU z*1r78a&1Xb_jn%$q))YWf8g$6Ql*l;I=FTVfc;8lIJJ^sdW8nma+TsVY)6Z@uB!B8 z^wPy$Ew!s9N8h9bVW>|gCDGuHlS=dND6vo&@J~pDEqv$aa%E@uVbH>}M&SPgD-Wq)3-LaH% z?U+8FYyYDr2?gfbq%b^90=6jXU*;AR@Y4gd=B;Ks(Ee{StBLrZi5!m4#2v^GI0O@~ zN(~JzzxJ?{$v*`>^5JKtL-P>MahEo{?-yT5ciSjO6_~|}7bu+j?fv9fF(WU~v!$^0 zy}CF;OKvwLmeekPwDZ|Lnyz(43k^smGJ5|>I9Sb%v-CUPMS0UMD>Zj+4+3iu--DkS zaCssOKi*kjtxLale7SKjiOt%TOiZ*;zcQOrtXiYb;S<2^I!bI-p`!&n*sMLP1SY4@ zn$j6l5}R3++txiJk5*J;ypCo(D@inbEhYMiAVQE1fgr2Cj~}ELKP)nrri-ej3O;Dw z6J^)lpsV7T%_WyUcM7o>s%G?>4~l7r?fpsAbQlRRe%+rc#IYR^VgGp7^K*k{^G@q6 z@0s;?{$De5CKz(IAlN|_j*KLuIO)sdgSBs^$pMo#Ps6pCcANA|i)DRtcwJmOlJECp zy0__&u&|)nj58GAI*fZ&7t#5iMvbs2$MJb#x84hz*-wX`kUssp#9J)|v~YrlKiC*tLro%x`={N<3@{T`S?X~fP7=R09g$=PQ5W&{y%Rs4M0eXhhhv;NEGl&dwIMK#|u%I)AiB;Q(D0(ud88I z{-t@orPikCgw{*412di@U_~{?41Mh-cH61+@HP&hH8UQ1&Xfi>*}I(qKcf!r<~&^w zxZKaeEJX45`-#nIX2BYTmrkP;;4btUVuKH|3$xEcP!kl#8 z=dorFHbXF(UJLKe8Jc+?*Dt#Ex`0&LePe%Z7JRa_%Sve2 z!{(KmssvtA`@7n8=S{p~MvQ{yUH59qRzVVdz;?R2pI+-ZQD$556SW>sS(85o^Aak4 zU3uBM&`IZ@e0I2zT6yfn@VdTi>b+Ch*+sym$OTrkS%V{UQ2OGOx>-5k1by{KadLv^ zvqA4x`BVvJMf%Lev!$`R4Qz`)Iw4*!=An{IFrq6ONh#XUoW>WHVV%&^%1y3fk&=jWjkp zCHA3a;Z)APs9P`TX=YK@7|eK;EC;P#AzM>4zT;x`2v?!|z4v=Rxzuuo5ux?2x{56` zRIGh!^7aI*QUlHz9$M~{$A%D*_lrJoqF<~T$GO6K-vsbA}#xFnC;rWC0(pCI!PsfgDz?WYcj zk}M;sF!eEBa6-m7hw9!TWRhhGR%gjflg%a)3X^P%nxjm&x9w7H;uusNe48yJzEfLE zA>&}~VzOg$?|U-Cm|<&DORa7U zlAGiSKn?mLy6ni8g_dM!v;vComwE&_ZSme!jVa1A|jZTJkB?mX* zp(ABBZ&2&USE6Yx9NfPn!-JHJ=@Rj^-yi-4w~^8$u*7H~kIZ)yUg(iyZKH8c@$k^o z?SZ;o{xL`;#{`3@5ov-DT=CbUicBOE|xEZwJ*&V+ZllHiKfc?*pmR&rdcXhdq zTAoR+;y;7^8^sRpH^-!LcgsDiP;+=z?F#{IijW;62q1)qqYh?=DuMiUF_aUu7EQ>c&+vPl);f_h_$lVK- z-J=6?=h*HQp2{DWxGRP{QQmjPvi5EI4;P>-UbucN`{s2n&Gj!g;Vr^T{u4HwmV+H-AZ zd2(bD5C+c;fm$J6zT8GaCdsh})J91@M-ulBC62S*G&XU1e`+-D0cSy=VbmsVcPQyw zcvz{(Ln7v%A=nAU2l<&3T_&gG;z*)-R!;ND8NR z^FMs9hEYKd!MOSZ4eky7;a>-CEFk52X2+PD{kRq0e2jH4MjTldVt!i2KioVxXKZY;lQ1#zI_#Dr;Ta?9Rv5E6 zjGzZ|2FCJNd`uNh^_MY<*;N3=`G*Qdu}E-HsZnJQY&;2xvoGL#r(4lvM?R$hMK_l> z64cjz3Cv+QX;9V!d=9*qx;jgc4IO$JClaJ0lbyAQyN>is5GSM$KhE4+c0F}e%l(lW z9^JYSBSw!hfzY3ggm^ym1UiV_`9l+Bb6BgDQEP$bmI0!2oIE7_!BRooWYl+M6BH=V_y@s(xs z@6H=ohDnv^r^s4zMZ1FlII31X{j5wH?O+=59Lv>jpYtdr&gZu!XLpu&WmZL|0NiTG z4ZpuntnklK5&i}41>QBr!6dEATXeh{;JtHT?CT4o}1Wfw`!aof*-s-&Jo8!^nH`Oz1s( z1y01_2)IAIdCrS-lk0TSQ&Y^@cT7tB=h;8Pc-d`&ZK|6Jvy^~dvthS%w(%} zVD@C+XP}Ahg=EXQ(-f0Al~dYw0Ke^eaZ^fGTFw643%JTJo$tA1v zi!za!xSA`INsqMReL=EySL@=%)b{~n$w*Xx8$|(#<4N*w?38^!K0qvgAmUcAl<(dvswYw|h=Y$8ttP@a)q*#)0}={@E*~2lbW$iw(B;Su^rnKnvpeiF+`?&XDP(d%+PI1znpl&?~N!`i4-dhnhKn(g!x2!p# zZDk@MWFX}TnHP$7sGbAKoJb5Z4LM+XCO>^6g^gB%S1mc8V7~nucP%U|*AQMfGX9%wYSArk-O;%Y%SnX5sY-#?j+ziqwwOZqNdjI3!we-aE zsQup4159F1`1a9Uz*WpzBX3At6Q$XM*tThK2(H3}GZjgv94Mn(;D&3^Wt16C(6P0& zImU@TzX=it0TC}#n|(t-H#QS+aYd5WUA`pj}A@@-1v5p8% zy8x|p&z)|VY%Ly2wwET_tyiiS24Yx7I#av8U8J_SXU_zQ1G9@(U=d9Fam~6Y(}}Tb z?|#_UL`~=sVJ2=LwyE(p*SpLK_8aVc5Y{@!Xcn7HqpWbJ@UC z@|HeF@TCAf{~7mE=brWc$X)lo+8Y)Mbe~8Ex5Nf`=-}X!-Y7M+SWQk=_SHK&X3jCw zEV)s8(8W!2P(|}IY!UfXpSMtt)m*-Gwt)+y;+$Hi+rf+UqanV>t6lOM z^)XOW-BRmjpXjV|!1!)+1D8twkr27-&irK621vL}k#LToW-hr8 zX|%CZ`FbKVt#j04b@zM!dSnm3YV*ZmX@!l~(%nN%)4wS&iI7sW9ZH;eyfoYVt|Hb| zc?cdpzH<&!n*-%JD@3V)KFh330E(RI`aDk?wJyjv8r62|!*7Xb9GPhvHJRx8NH$~T z!9*P9PKNzIK2d=X>H`5OdRfI_4(EL?+*_kiympfvTwL{n4o)_i$2*Dh_{g|EKP;uE zK_z3-t*Q3YGO22g?pXIv(NP6YK|{Jll~~~K+Y0va)(TE?wencuOr3yWA%dcD!d_lH zl@V0}4qcJRqE^-<-Y`aVD2rNrShE1ZNi0@74{+O?_o-NdKfvc0L*hJSb}9^=Vk-(W zDjgCGeo9mtP|6glcR*ew5zT#n$;7(J5?p9M^ox+mPfIF*+=Pts?UGJgQWW(4?Lr}B6e2e^n;`d7rK!{Mmv_e1g&2)`76+C{c7q4t&t|M!a;&YVB` z!(cIiLW(qgH&FDacjX5esbX*>QS{wk;EA%p*14b0Bi3(R;6!zU&*G$O_>HF^dLvz58J+3Q->8|I8%TL61hrulKE;h zb#5rkhC9JVV``-#M5Jx7q#?{?G+CwUK@NTH6>5;{<87H4lY*gToB9r|8<7yEHAcB` zm&NHXoNMv+ykzgX;p60=HDS4p?aH?{ToH4-c9W)nH5soGq`xx0M<@{O!v=&|s{N-~` zjkKf>?k>UJ`zK*Ly?F}^oDq8c559OVqmC>>;ui6jjQV-Zo7w7P_idWEY2j)E@Kh#6 z-euNi3j-U;1M-gO0Ue@b70F1~wZLk{IkM|_2rR;6br{8iwinsujA1b#*t~v%V0LLl zwcHi5Nk`*!O--VG-fTSS+H^2eS6D}zwBqU~a~DSenn3bzn>XXE&fONxHW2#+KiqI; zZ=;dJ$d~;WCO}ZQ9c@c=Q%y>($!--$8ia4i!()d~o``_(5yN$h>F=G~->G&0BSIg9 zU(Gt_CVG)U0;Zi&2j7g&r9?Yf!Ep20L&>!+Qkc=<(pR^DP1D7(?>1d!X~LM?^OIc^ zW1@P4wgzL_P)3w?p_=*`cAO*aozyKS%=>(I(kAD{%r2tWY8_dZe^8j&XKzHL1U&3c z2d<9QPk#+~Dwk4ss{bqKb#@+5kir!WexzUI%G-HJ!-_yDNKx;DU!GUfN3eI%w%zZ{ zsM1fT>ayKt7#BD&FXG4LJ59Um``_pmJ5ibz@v?Guaml+R2 z;7bz!G>*WTlP-GrM}20tLE}oH-Ax{D!TU6mNrzEtqHFP+?8el(@TJ~c-ND9ENWNKZ zqlV!y$m-fJ=ZX2;m^-AfVDmvB)NtVhLTSH{I=)!}vMO&F>Nuw8SJ!IpMVZ~C4T!q? zlxp72+%U@Rj)DEokSOI2DOH?|s2|J^l-S)gV|b z3*v2W%4KE~xH8eqLJD0Do-Sz4=iw5&FvDBkQ9U*!6Jj4UnH0wV6X`C2=T%EW*oW z>Un4dijnHtNhTlxhEGyruQ;XC;$8W=gTzGKTLeE#PeLu(?1}C!PSc|~&jRUx(hfyrbS*-^f;TiJc$HB>q4dLNhK`eW(KR>L<8qX< zdM;^l72O`B+3z?Lq4*>>lbZI69rKysS7+iOj^DQ791IgRj;e(xvq|KxqlQwR+oPy0 zjhM8FhV72kR*%C6C?+&N-ACc@cFLIAO{82ROym#@XFueg8`U(tJVjQa3S-%R+kxzA4o$<_{_)b{6xE+vkc|0ds zJy{#=4}Z>RnP{JlKVus=BPw{D33qu+`^uKHL3(*LSG4XkX+LyjqhaG)$@v`F^S`MV zAt3dFnpveZURYq%j%;C5qza%4oNrB^r(y+b^^!4{wSVWNK7=a`#?on$5F7JRe&!_O z(2XNzG%cdQAu+k5=oFaE(Fwv0XEl!y;FaaWqqcA*Mu%f?61hRJ%-{0!`Cxh0ABr+2 zu7DYsQC6{V2gxYdu~|GG4Bz8RQx#C7ktJJuTVdtLd1VTTZ*fTCnjr0snv?gCAwZG5 zS13zowl|k_Ak*qkVi;?0rzIw!{Ly~!kmy@CMU|;fcW8ZARO=l}$+ZvCvK-wXsug8Y z?JcHA-Z(}gl}-d1nptj9x_&}fw45K4?#C6qcup^v?7rlS<(>3xRFg^Im3>7A=ShL3 z%D@p`yXoquvyjWD%Yz4CWi@JN z&C?K_!jeG$1RU6fa3|67D|5eHQA-M>efL+xIZEL0c;+)`b+^(|Y*et9$4GjSQUI=;VVSq2Q4jBjKo zEBk{fL;jLT@weW?Jj;wrEdoJB6|9s(qlJMY};%!JFhmhFT}by>p0~5pncj z$v8jc;?bJ#2S#{oP!-9t!c3xf)VQZOpP(Dt z3LE^DNclP?JMBub!LQ~IzZ+sMLoYr_$#ZPd?MLkgjS8NOmyU}@t$;@qz-80XGJf}J zQud|0MH~uRa)~3)SXLea8yMZ9Sk1#D-1PM_{>tWZX=+D_?2<@Ah@S{xZY(`H0i5gx zk&|$liK;yGA$-I1lZD zI!-nn{e{we!M@EWze7?hbe@DRCfJ(hb8&J{6-x#=xA(Ht3)^Vhm=i1M6X(o* zJ@%vB?2O@)9NxXB#d3?Hg;^eNPPqSG25IB~CjshnF#B}g&rtEP9`R@RV2o|2h$Ud8GC z(b8|BwwBg(GjR){1npv-#!?m7R=hW9whZzz!TM@ivjH*ULnsJrD1$ur9M`*eXg zhC}mF*}SDiRsy#1_IXl>~9G8XM&Yu;}#f5x=COC?H4ma?a|sz;yjf46Nj`!ntIa z&&%4#di?JDajeH^1$N5`6CLamU@>W{mE&7teD6<`uT*g|{NueiIyo)+N!iSQQ>OD1 z9$^MpyELYdPI*~*nihT#QwTGJNXO{ZBbJL`o8~lDMoRI2ea^AniE`ai$BtkK+#U3H(I$TNC9)hG}k4E%BOHXE;L3|$* z(%GKPrmHgd=j$+m5|2S0jyj^CEH6X8by;?^baG?EA@Z_IJ35P({c3ik%SHnSn>WYD zR_n3kevw-I!P5G>a0?Cl^^*>3D6AK$AaXr-jlcd_(Yw6B8=0) zd)9M^$Ps=&io#>7Ik0_u3$4}Wpo(~`cC*`7fA*C%s?D)(PNYc^_b(` zetrmQ;^2tZteJIj&D=gTsvSB6znqdi>C?5!)Vlmz2b8C6U5ccpIABqx#Z`(X#S=!T z>YJlnUv$g8q5Oe7W;TBNI~W<3AkQ2r!`Mlm_2?$nWsH~lc&SAL6s`;joPTM4tWXx= zeOq|`V;nO*k^+ytJeB}*%oFwwI0h7P%MOF_k}xDq@y=j&RwN-Fzn!XY&bf}F6kX&z zyKIRmPOQ%t&q4uY#a?CZago%Yr?vz0i*@NZw!WmW?(og2BooOAGBv^Kck>{NCpbTV ztDNdeScl1L8>O=|4w3AGCOTEvocyEesp@$W9G`zF3F^^?P#Q;wyn9R)fs705<29wtA7kc*x3NLx%j8XSl{4!bCKP1o?hnQ3G*!A zOUeWL0}L)9?itGk(b;`j%qqD6HROtfr_ym)sr_jvLIFWbkS0F5bF@6$HAv|MTGDZ9 zr&P+jz)tZuV>c#*hz>B)J*fIXi2`~t*xgWE`R1Ry_t0c!i34n|sh1Q()YND9f%GZm zsw9R(Jhp-iL1um@Ok6fu2p6t)BUYRKC^gwVe_EFvdAS-FrR&=pa{9^d857tP9NZ$1 zn)+TYS zSXQ~lHb)GIkC`@`)A~mRMPi;XXkGTwX{RqeJu=xDya%~`LRM~IqJgp^W{X>7MyYg% zxN=}s!lGjK8M6I`32nI3d@e_LoD5sA*F_d|7IydUW-+;sXw~*c4%84}>3WC99mR~Y zi(02U-!8&KTo!z>G^bU89-*~r8D(=%Q=Bh*F7K`AflW7zoVR*vnOAg2==R(HaL;^ZU&r_y~?3+pc=@!nH`t-2OCg%R;sBLk7g=EhC zKT?feF)bc0eB-Z~CN}Jnk)jRNxqA)JiX$%zYt>`(Qp#RzV)oZq)z=APa%>h5`Pu*Y;{%OV}x8=h8Yy7~JH+Sz2EH0kFsmDC_Mm5~T zZ91K%{HK`ma5*yLOTJ}*jePs&W8^#O6(`7m3+72oX@H8WWvM0+dC2x>wm8l{?~8Yx z*BPEZS$`$78H>VZi?*$fQZhaZ$X4}?<+_x#M>N!P&fY9!`zHzJ`zxb9IdAOv8B^^( zPaE#qXSUM zT<>>6y4^+}6=-KG%ZPWIfJnz5N{nX)1dgn$KN(sG)Jc3OoS4Nr>u$r@vSsJ*H*v_w z>^uy1O!$rxapCQq<4HT@*ipnOItGa?)5xw6hkd^>_Kt^IJHm$8ql3GZ$AX4H;y6vv z%#T&51Wb>+6%qS;S;uPhov|7;B#uXTIq0`Sc0Ffz%Hcy=^kkO#3aaE%Oe;_W}Zvu$T}M!eiUbEPn((LIsb&c@m7k{ynva95=JR9wjr6Xwq5 z`~Hv%#igS;$+Ogr)l#Z@FnMz`!rjy_3Qal9L$oMgE!=0ib7LcI10PICU^j6!S?|z3 z8)*qs!4sI~yST}2usdPeQ6!wLIX^BV^HGQXOj_3a^xP$2=)+)md4~D-LF(k1#r5IY zqR-4>*?b=b8aT8IycWqU#wI29yc=C_b~jjKo%P$8AI>?+LLX_*z!}Er&%8fR7s$O+fNAA-)e=tL+wVp{#dx|x|Gk@_d}>{gwyZ0 zGA~2Vn8H-y_p;qq6AAx4T{?%&cZ76HP84~Q>UZK$}K}XedvXEk_hjN3H{@QRt zBil22r!6g*qYe3CGD&*#kVfPgbR}fTFVTn3^6Zh|lAhj6y`)0344s-j29;dy37(Mc zXtd@)!IX%e{RjW584pa~B(BG=kH0XnKvkox9Fdh7zpyn>6J)os(~yY9?DaOxcuYLl zET3{Hep3p?0@+6(1JdXiAek1yB1jnUW3&21J~a}y^e533%Q&#G?gOQ3CUnxW7SsG{1Fu$RAL$Nqm@f^ta5kBLDhScZ8rOpd}V`CRJ*AXM98U z{+2LDpsI1C4B;}(@@-(#ktaYvx_`v72L9Y8=23tIO9qmho2<1{gewp~G*c>L5(siI?MiS`L7jx z_Imk5obxAE;0jVR89Zm~6czobKxt6xt^%I3;3i%+9M3 zjTFY|f&t62zA=(NNn%X|A%2Y&xc;hVB~~(J235t7kT15~ksk83$%QPp!my*SowUtW z2ki)rlv-iqvvj1v3(g__1>YAVikf8!DnoP5S5q*RKX(?um9uv!jm_zY{LAxE39~WcW{wd49_?}qyUlmy>_kZGRKALnpypS6X z&cB5&q7g!u2AuSye+c&;Q|_&|-U`*(iZLS1@;=Fy759x(YifJ5{@f9KPvZSzthj{z z;f!OAIc;@EnTZ^FRL_r}q3p`PmI@iMI03)fT{p_l@I1BcACzmp=qp8w%v~9t&NyDN zse`3UEPT3i$B;xzIYOT27u&-m7jc>^nXVpdzT+ksYRPjRt8D|f-#2O#S!cY)GCaG( z=E9l$<4N0!n~!Gf9^$1&N>S|)=>5O)dUNsdh%?)2R%`S4?Px&QD7cUE&$0fn5B30d-X!_s4h{k)->W_#Ir zYPtMO48A^x>1h&aQEZ@~c|CUsGAGvrBF^~{PR4J%QH*288apxDT-sd>J%4y=$ zfz9ThW6|c*7g63QZaMfU`sLh7zv8kX7%uvYFK<4whtC#0pQdZuaBf*+;Gsdq;UIRd zZ0nRQcHDwLtPyZw+oYEy$?18F(X2=fn@B!9o3l#X{)5Yr|H{z6Rx0X1ck@0I+g6J7 z91EQv*ljiLs?p5;BD_j?T;cnzB01lqCz4m2rIvM&sPgW{xLp7 z9|pM7=@5BMUusZqIE$>nNoUROhV0*yE3djQY10-SA?1Y8VKhTT4!5MBG1oKl1*&Op z&20TVp`pK($s#@Tl4rd_qTo;aF=IxWwxcB~a;WJnLb665{E)bnUFgmqHXDOYCPlEE zogl*i`m87GGU>WXsPEe+vdv%Ix_n_YAiU!}DmwW*?cbS7Y_VS*KOJ<{FRk^c2M;}o+Z|b4V_BH0oa*Z-G1zpEyq!frCBM|)9o(+VQ2Hza>qHN^SiF? z01L}}-yuR5zal>;M&V_?vehT#b(w#|briMmJ6un2qv>qZu~3z-jxzw}*B|YMX7kJo z@-)gIBx6YLYtp;)e)aKDfCr34%)2Ggo|> z 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 literal 36219 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%0DRcID zo|sC(ri?aPapFx##H-cbg+td+kP|-8$fWuL?xP-{<1+=)3;s^_y?rh+QaA|20F_B}f562PFA&(et3fU!|e2jR~++^cf371SqdJ#&fR3?uU522<6p!s#>B6VjI@{w!I zx5=0SW%x>{X76rA);g0shKtxx0$WbI_`6wW-%wD*j=T6zS1o7I11{XB3Uhx|Pho`X zZvVOcDI6R>y{^mFXnY_1b*EPK83T*Y&2!g*4Kf`zZPlLpt6C%>*+J`HS4N@i2IbD` zH)#QcqtvfxR%OoD?6dVtgZMB6oz-3ZPv8ygbnJ>iD8y)b1$t%T-=+tB&!? zOcCPHR`Bk#V0ts=UW1=y9Ztxy*y=d1*7sK*y^(VlaXSf0;fGOW=%HXN{aLy$yMD&8 z^~z=;o~7b09%e3c81xeP!_g^^^SdX6!7K`f>c9^SfA6=YTFY9!A-bPZyv>0%vO)2d zOy90$+)cP~R>(6QOtCvAR9eFBIoCPx5pEsATki_5f$s!Xr6%@C&pA(sdU&{FBP*6e zzj{%v6@@w8OgKA1JVp8`5s}4-P!x zZFtm+$&cNI**WUaqK}j3yg>dpazX;Kt;+a$TWgdcQM%z-hZ~m2aQV}6VYHQprBt%K z#%mdK?N@et8cOBhyu%Ehh`^||X+uY-j94p4uGl8q%JqE^&cF4i>&#H)ICav{-Bmkd zkJ^V?T;%V#S88>OlQkX-9h~IeOL~_Gn$@Rl!eCOn54*O9Orm5rMyjeF9r zGAf>^KknHXmU!NTRXIe3~xO zO?@St<3SE&O1pe4&3`t%+exSL!ASMJz88y6a%ta0mroLhOuhh35QqMTgY!@j-#GHzutr55lTO`WutY zW9V>wcKvV6w4Xo=2Ocu|$qX**{_=e9!`6jKDT^=4dYu+7_QOR`k@{Z^-1y%zv*nOB zUe@=6a^4#$76k+k>_yLx290{U+Dd15=UKRoZW!VoC?pk3Pr_C-at$i{j@UJxC?BtC zQXLJ}m*y|M7dM>m2|wL^&&z=7!LrYK8+oE)A(TueAZNbpSQfXuqY~S5lh3l|Jr>elkNzRnSj`@ZMr)^iOKCG^P zU}jFeJruPQY(S+R9-j8~{-SGpKcDZB)F8&{4`s=j66yU4-%AUHb)|6jko|?}*-_TJ z{fFZ3={M*1q2*ZqT8q&wT3JtITWhcyqIJuw-czB#T5n+KY>9akV9i=t=IMp^}ai5~7%-w3BDjdDBrRPKyCblt1T1tDf`rux(n)Z-sLuhAdbIR7F zoKhHI+v)(@Hk-l?AYLBy_wQ_QA%WZD2(*o?xt5Xkk<~7_Qcl`n32kmQa#DI!z2dUq zE6T`zDz!}rDy<+Tn7%b0Y+|Y1{(5Z=%GPY!>6BAoTmv#3J}DL$z#;S04gHn|WL(nX zqD7;LnoA_ia~_dFmubd#wobvl_V$h&(dT0l@#|*W!>0PqPII&D-Aad@Frf!Dbu+4P zCV8^WB;3}I72-!xzp}~NU6#|KNN4D6cU{IjQ(CO>@ndK5?R7xQU;F}k-x` zjLJ05w#~Rb|rk42zqdiGq5ehlhhGZ`>Yy6C= zyii%-0H9E2)#Fv~k*yCmLg5#OzIhFPEO3H0GSm2=;I&eKjtKx$ZR)kQqR!h~te6A3US5r75T{8H)m@FwVd- z0C2)$H2Y7nHnIctQ-Y4|RKX+rRvUJXs#36XyPL!(0cs$~-m z&(iiPm2!1QHD8VBJGL*OQu;Cp)h(p>0K>*!A8r0pF;ov`&}FDq8j@4KH*o_9cdKSq z4zvGcmb15G&4zcr@}boi*O;Vmo7oh4-gPC_$FXH{C0dvAc5~&EuC8=08KI< z)xB~ftzCG|_(uv}!GBXsR3UHYkCn1z!}0z<2WrA#+CYGKL6#U_E@OvU45sYb)d47B zWhP0Nz2^y}-BqF@FMpterfF&uQlaw)3UpVZOG*3%z0Ol%KP|~Bv-9ahcT*~?tyK~lRPV1yvT=LfU4tp+liO}!{0A$yavu3m3>+DOd)onx?24-2B` zow4T;OJ*U(lcXbg$nM-sgjD-NaL%2&_7n67sSM7>kYyi*>oh!j6dz`?hi41n@IWYk zac7OFB8E4%nGEodnUo6N363f*wawGue<|QR>RQe!X;5 zl0ex~Yg`?Er;Sv}oGJ*P`ZNF}`*jLaO{=rbxJs9rXnpU&x8@ab&8y(82_F-$OQ1hW z03@x(>Wi;g>4O64i0AsAI$h(FufVAmbwkc&0Ph z#`D$Z#85HOa80;px}J1^O#*itt}}YYxP%mNn%XcP23wx(Z}4Ax`(;g7Akh{T3mRY8 z&_Z<-Nkhyy^rH&Y)kkD)?Q#vn`ok3L&d9{G`QmCFD33f(LLP3?x@aEa!rT^GHuG?19BcI68Oj7Z_RZ zCM(~0Lyb_p7BY!;7P4TM##^JaZ@)+2PGmjx*z zc?9HCdo;E7u-rX)8{Nu2W9pVv+OHX*o5PE`pc-7GN>lS{`bux10JQ>dJ789mf!ts^ z3^s`nW)#LVgEre~SiU}`y5E}0d|fwvL_-_=mPS?7_F7VYTA!D!*OJo2k?5Enhgvg%+pFJ)=o^WlNeeQieA@C=lvMNHZ5LZYc5d zmXATXCr>>R8(^F_3zfk`6ZEYPkJA8sypyXJoyQwfa}H^*ENN@EZdPY0q&|(jsf2cq za+yfg4)j+4_UJG{g$y~lIf}r0&gUhmVmkh%inTlLp-a5>d^bgv5%Jv3f~DP|c}}CV z#MgrxuG$kT6(Y3sOtn?W+U^6K{SE%}3XBj6B&w(~z z|H92FUM_NctBZ9Yd->Y+)7L0>(95-k4eO$VOqb3Tm-{rZ8EdiALoCRodKvqf^u=sG z8Gt2MLT$EITU`)MDi)=F+Zs@&#@oGH*Z@|dVs5BSC^ zqu?k+k0_E_DO78fzXPvJ-F9b5NU(BNwx?oat?Jsdw>orpOg9-5lyN!j{eJVdwnRw4 z$EuaEbluGH*`AB*LWhA0?Vnf<$0Dwj?>CxTIZ4Lnk_Py>-xj*^wB($VBi7DHkMwWc zakQ3jtUE=dOf2mc5LE7J-{rpx&+OPVi1$p8WWK-zDJ0dlj3i{i^YaF=W`Leu<&b2( z2!m0p5qNA;f`0jo2clS?>e~^$@o?Fse)n#3rs0V&n4iy-7lRfbg5ZfD-qg0M{Eo-p zryOqRJt*SbOejq#kkvIalXScO(JZa@c4WLkg6dgF#nUP=!K;op+E3BN435^0smT5s(B+-Ch^zB-Z9Zp&WQ7-zj@41H@ zt|u>4Lk;0&Ye+PbM_h>-)r4AC;l!C+kTE_3`bX7X`fAl=)8|R)f^dS0=^xWuZ%Y#g zhU~<^B+DgYeb7?)(L7R|c<&}s2Jo(#GA&_HFV;eZ6110Bsqr^cP0Pfn2zcC>iD8Z* z2Xaj#6Ph`>m#}+(zOrU-=rcW{)koqE3;aHarxI>)5#A&#P&&Imt)$>Y(+96-mHmL9 zZ0at!2P13(Ha0A%2)>EaJ&nuRiLa|Q8jyp`1CGal>F}_z=zuVHM=YDdwvk1n_lZzv z$@}u?%%Ft=&t3`E?S_1sQxc^2t83U4(wy&A ziV6srT?L)pEZ;cV~l>B^Z}rUMmkQbaY;&FG;X|xoDuvikE9E&SD0c1uV=Em zW}+ApYOZFMS7L#9U_)cW1oJ=_4X?#Mz&wmO;+GH*^ajeBoTXmQ9FftAUVANR7+DDd z^;-i9H!7g4Fm0NXW)Oe1A_6(I}|PHkR6A%X>^lOOqCTQFAs8X=%ARL(Yq1Z*QSVr5g?R z+aleYOIb8%%W=RK7*cm=(7iKSNDlzG-1kdHQNxBmbq7R#yG&9)s|^&XslzUrr!THr z7oqoBBnTKVGop+pga>#-3x)3AA1VW>9NW=te59HhNmL@~)wDZ_qJaVi=VaYWT^6;q zcd;?QZX;8aK#Rfb92z*?p&PtW-T9ls65gG;cX?MQrV_#`1ET z=rA8tyof`$d7MI4wVv4t?NF^9;V}U#4Jy44}J?7Vnr=PhR?|iKevY*K6 zkWC1(ozL$QPpR#OQE*L0Nm)-vZjCMzHmX-f`mSPqQjzo<*%!J+3OtRP{YMa$6&amV zt>Adkw?D;j+cqvIkta(O`Uw9dcH2}@b}NA_q49G zeNsA+Lf>BsruZ|&>CO{9)iH^*W8R-)`b?dhB+(I)ACo!bYWss6gpSAUnAu z3(?&zFsY7DZCq-A)$P}e{-XZ|S9b0ee!jvCAha;aP|=Brbw5i^FnfRAhu0!)DCHMgJ(dM3MLrM1y zQWLP zXMH4s=03VN0`@`A>*rM^l;0gc$^n|`*@Zx#6hCD}A1JbPBCkf1KSX0G#YI@&-4K6l zG5>^3CM@D2cB|8RtBt(+8V3&{ zAB^`3{|v^?-SB3`LV5PTCYiSU?1^jBVCtIXtWx>bIA zT;A}yQs_mIyc8&TJ590a+ml6{S4My^1-iHALRCU*sCCtSfBkqi)LDJ9BV0}YBZ`&^ zRB^i+G~I>kp#4Cqp2@z-rxTy9s0n7PqxZH7Fln!&chZ9<0`Eoa4~*kp8^z{0NM-u= zz97dR0lm-h;A>Ab>>WJ*cK(V~JXhsg|A~v+K86m~qT|Cj-_Lp{dYb5=(h)!MBRso7 z?Dw~7+Gi^HWJ|j>imRW=XL{F6YPfH4lABc9Jft+mslwsE96+?F2J7xn`I0(&QIZ)8>ULJFYO)hSiNWYQcFm55|v!+qkU3E|BPug8rF?`SjcGFHkh-O&>#lLy4 zqGEu_20;xwQB5#uqKfr%*=37uLQ$13r4u_>4{ZtAT~M&;0cx?w4~pqP)XQRfbr^F= ziJ~Ei6bW=l@*ZBw$!UQC1OrVtXCtq2BN`dYhfdW}+haYOYC%ybY6oT2%D$a;Q;hE3 zM;7(_XST=;DK#nGO&!773mo2QJzfCd(Y$hZi#c7=1D!V+P?sL}w`z8?s(>V7Qgrsp zS}OWP(5u{y4{~5z%w_+Ui+H9{-40M>lT*Sk-XVZM0-`UC=4<{~@U<9mW1m!b4NMMrngiBX~=}gHYEz%#P2+TGAek`JzJ>d>@w{xe`RVzmqCo2 zrm5jJt3B7TD3$xT)d6gx!C=V!)2FZ+!iJ;(qy8K;lbBes@j_x>+T99|+g?wZd^o5s z>)V~8a?jzk$&s|B2O3g)&h@y?tPpB)NonQ?S!l*GoT~uw{ z*F4#Ws4(nj+u-X;K8pr`_x6uN@gCg$9kMQQN(W zjq#C#$x6#jK6UQxFN>{ShD}Z<*$JaUh8z^aXy0{N7v+TYui`xSTO#lh)f*s?eTU}- zLD2d0lvNPOH~UWAgg2vG0rOJ~o3-Q7=tNeJ&iR89GF!5;?PKzM*ngb=AZ+y)Yy2yjiU&1%AQHP_Xeyj^(j;!Q2grERqw8K`u+bRe{xE<+l0s)L z4+kx-uf~Q01>6ge&;bjFfg-FkqpgoBj$SOMzIr^$01_lsSGV=qn0Ek0{k_oN$g6-s z&=!Ep>oKmo${V8(NP@UvdUt1kH^8VIpbb6~va=J+uqjuT2N*2Z*PUqirU->Cx`d zP74Qg%zOY#*#7!^cvXCfuI}2W6#xwrO2kbaQ0W)iK3aj2lS2T4^_K`Bp5h)LDmBW> z-C%^xv-e}!oV&}FCVsYq0S({cEs89|d`KEni#4=Tg{^4jq+;VU*e|TJDk=-gf<*^~ zOV0%v%!BE9FZ`~p>J^m?MRmyuoc+fqo+AYqXR=#&QprVtn>Y2|&fk~0Ha#poHZNp% zY8kh?oPp)z27TE6i?I5y9TaUBx-sC{N)1mk=sO4>`3|r>YS~rZqq7;Ieg_)qz}jO{ zp98Q88obfJvLCv6G;_ig)4PBF-fk*TG$^)dtl7Tp02CR9=LSy3=%|YNt$gh6T^G_9 zOAshqKL61919-c2{s1&wEZ<$uTdOi{T3(MZc`!{A@}JNE*jH?= zkV!nNXnF)29pY<0ahOm2H*NNqPh0rsR#;7j|8l*86YT72L$Ut;cPZ)|lyyneXZ z%yqG)EP&m5&?T_y46+xE`qz!k?$zm)H-+q#cMwc<_gyVB1i1(Nm_z!y!ZEs=LyPM; z3n$psG#tQ__nenZ0xA$%#dq>+h`)1)@%N-$lGNT^tQ;-~`3YpNAH2UoZdn|zY#C{l zR0cg-l|o@U=$qRBqZ@SA)dqOVvCz=&6wiGmIqV>83Hg3iLN=j@+1kfNuchOt8F;pi z`$%1R5v-uyw0bqD1Pz{!H!HWkr9Hkv2Z#c}X+SwV)@lLZJ@2~C_vQ^h9#$7_pAY-V zJ|vPtU2W7pcpN~gnQH}rfUEMxlptEk%BQoj&n{zb9R=w9p4&f+h39_zUA!>LcP@*n zG@EuZ1ISw!g$u{|O9EF><=VFO-cHFrjBe`UWzw+@qm+1CJhB&o7GdpSbi-gS-CTx( zO1!D6@CBw9K;NNEN+$;_d<X?Y^m;$E7e=w~xw21&MZ6KX&W1s)|U{uXj?HR$?W`Wp_h!_1bTz8KbTtDcO z0D-=sfj`F&t~m$1!e4vm5tztDMj{eo{x1gq)fqOY3tagE&~~>I2Mr-0(0b;9>QiOU zs6_nLMYdxC{5hC*$~Azo3>^CyPl4kHt6`M=W1~J|nb$?W0QN`jdDFT>z<@v4GQfU1 zScf+UE*04OY~atCgE`;)ALjhOr}1|Q{_oZJUw1Vg&z00pa2=Q;ZXv~E+=BAI{%8a} zT^oTXw^9(3bd3usf7?eNVAy6s@zC|JWg*P9GUx7;$D}aiUu~jOs;gTm+q*`4I#Mj$ z;hgJ#+rS%w>`5*0X9ra2p)!Z70lQ1JE%`>Ne>uB$_#|Crbt`o{*my6rGC#0FC-3cr>Qg%(0*2~ew&_aqK}7H<;udh) z?Ell#mzK4)q@J0Za61f|x5?ZT$-wDARA`0rwYtq&$Vo#!Rg5iiso7z8X7DreAZG%d zzZ52ybMwFD*jZP(*ZC`WPv>mH{FseRs7Y3x3Mn(Vsn;7Dv+Wz2KQt`pFr*byLS9IILx|{xTu{O$>2HYdKfOVS$IcWu!O> zBIu#(d{Oq49@2@Nmo#s1tH-lp2 zp*4y6(zE(zwZl@H7bAgLz2p7oVt00hau5d@`Qa-cAG0awZ)}QuPk&*xr>&r1wb8g%3JfE&0a9CCA}zk509+o8Onh3+$I!fhKQHCQj$SwBRE5s2B@Dsu$z( z`<`yCZnzg+%nroPXN^ZZjl#TI{`^n}So)OP|5y_d8wnnVS-$5hpZk76XVmL+N{mT9 ztH)OL+}Mqk-%^=u>X48v{ij)~_V8>jcz%Uunan(#Ev zd8XsYT6x$$wlo|v^#>bhTu`}Ve%-9{{emaX{h5Q~&#q^guZz@6;;;%c4}jF8xw>48&K2JiM5V2*kx_@w@X_1O^=0*hvPz#G&5`GEKh(fSTd?o z@|29}W_@W`>}L>N`TO8@eM_=AKY@1s_=g_iin*x?dPc(R@k?oMx~|tB6(KzBdrq%ab?4z$65C-W`w*HD$GVXejjOdrM;YeRt*83Q zglY}hvgD9^=88|P&7@zaRM<3t40FwY$<;Itja zoaLW&Z2}L3dDt;k#8FEgM&J$t>$WJ>x?E`*lfc#g+!&e}R|8u{B7k-&iEHr`zC7JC zrwpcd4uKXyTzB=}{I|hRh$x+oC-}=BWB6dW!Cr%tU(8f+%2KyH_$#E8OZzmFPsWNg z?6(e6>(%M6hr7R4m`l7k>)?~OSiklBV|lqFl+8t^o+!8KDo)XAhJ50WYKq*QHLMSD zH5ZK=x+9N$9&cE_fGh~=x^?}urHX9%(o{^@%l=RfL@NLJwrshJXKJ>aQoXN3ylo9e zD^`PYiEF-((;CnYI^1FQZnkD^_O2SgH;biWZQEcYpK%FFQF1lTMZMr8rBKG`Isf4M zsqu8Ed`OW8Vs3KdGn~A>Y238jw)9n+ol26_fsXaGZ5;u9h{^SIQvO@C`gYD5OKp&S zHo$1nh&C-=t@;?{EhT8@d);SZ0doA84qWLmA7ilw_{dYBq{7kCpB3mVKd1k=-f_Li z(@4PDDPmGe$xC>AVLDNt>|`)K@XkAM7-ieZP|ICTQcTHS^Ddl)8_UIvzy+OxL{Gw?nwk_f=$dC|{hLb0!_Dgf@k+Blp48p=&3IGRAVa!~!RQD0bnf!LEL4=uwb8@NTD#{?Gh? z>+bmmGpeS2%VG0y?*5zREl;mvevWZ+pRz8IvP+6~gu?=cFB6)#x=&e8ye#wd@#-lr zf`-9HY2m6b@0^n4s`M_nEYD09$TN4~ z8zZQ+-n8gV&(T`^nDsRet8#UDVy4`7ba0Et@FnA8QW?s3`t2Ik)mnxyo<>+;_Dxrq z@sQZx^QL_*>I4mH7QIA9&+7{Ntx(!#$FlD?=GFxI7{Iy7)X57fB^GYGc^t6#lY^@l}`HyYc5t~mzuQ{H$L$ZHnz#+ zx6pBZZ)eQf{2r{7w?yLr8dRnKsX(0s6@KCXl~!MBtFCoR<9BE-Zvxh(=O{_QM5yV( z=E^1G^plo?=VOukvJghjNTg)XNg-aL%iZQNi3a7=uMx~_OyOR{>pYX|ad+&DbNJB{kwo~wvR4#My^beR(lX~=sxkzp@_>Z=w%O^egt^~XCC6b%n+S=H zqMiCBiL#b*KC%rEplX#I#E=GV!hc5~aDI7D5G#Rx4T$SYTTjPW<|BRsqssNRdO`4C zW}2%_ONC}0e(k22Gn3&phK!B3;BC>!QFUXJ@x&A%kUfXlzdOa-aGH$>;W^LKVXJ|g zGhAfz*_hgf>ew*YDMh!=&q9BkP1~%#-E}8X*CCjj{7QRc-abFv#+)%*JyzSmNn7?h zNs{^=g(p<)d7DW(P1a2Mx!&c?A8g)HnVU|0o4VhitOWYN`wz?I5d0l`B-praD|&Lh z9Ge*iJ8#;M+nE^R)#rhWBW5m1LoSCs@pvC!n1RmqJJzYQ?YBxWAvs|GZ?z9Jv;~ zUs=bR2QIRvOxCzDlHs+6(>V2W&|jsz~^Ru{tE1cvZuf*u|Jht-<1V>Ogrl(O5lx2i5tCvU&=G%66b;MB5o zta5cbCkuR9#Pr{#_NBQ5tH{Mb)X74SEqi4vc{~o<GL{Wj^`fpIQ{8=%IQ%;7=&@mV8jm@{!4^EREYPb;NMcnewzb{|9XF8Vc?(#feKJm z4ypnt{)uj^Zi$_>J+1IJ&3a!8D2jlb)sD67to3*)>1n4&vT!KNZx zg@rqbra%7r?(ZN#6j{|8j|#P{X+M1OKx_Zp+dt3BIEki2;I}?Jy#4p|U%{&EH?8T! zii2(X5P(@y)et?X|KWZd;*-!&fRTCY+G;-mh(rDj8!;b_H*y<^5b zzUPtk)(Q=0M18t0-plW@u}HI)JHRLH&-}x(FM1NO$Eb%TI33n<+GL!RNJlZe0y!ON zm!#z7jAJv>#f;s%eC7#XOp)(B;buR;nYRFDll$M|atg0sPWm0P_Xj7UM?@atqR2!2 zD0g*xb$v2TL#`#wJiN2t(U`}_PSKdpVOZf!>h%0eeJy!jfl?s0{ZA7*g?&~==J+LQ zP!GKQF$>Lh;bhD9=(-Oy$-q0mIyv;nTn$^yJ?%i9A$*tRBA-7%zAwc6!wLAkN7AmS zBQaUo8{dAlJGC9?=#~Ej$P41zWuB6fC9D^|?#YC^C~`TBJ}+C7@F58F;10x`u^y;{D;T&tY@uz-RnNB-+eEe#olUTz1Y92{-N2+rFKb`i~HbD z<(FJ7$Vb0Ci|SdL+B-He*m5JFW&yu15&O}@C55M7I!Fq;A67Jfg!{-VD?M^hepVRv zrySVj*sOcLINf^u1N^qc3E8#m?`Vyi`g2Os2l}djBgs`; z1J)OvRwxW7jJr}F{!;3j*ElIljPB?P$Wsg3I$?D&2Sh$wS01ATWr%**slhKJL~f;o z0PzCx`kc_p)^9RDjEe-k#4jFdY10d`E#tfd*T%AdHDgOK?p<1@fCbj7zuR9{E}8Bi zJH;D+Z3Oo5A2t10q;f}QbxM+CMqTm)S4{D(;H(Y=WxceKGZ>!Vi1Z>RJ`8@#cb`Wd ze#f|OxB7l@?gxMQ^ungFJ39_s{B`pO{98xwo*TJ(rS7NiT@p_Ce099Ie{W)N%PP|p zp5(TxL?t0HuK9Vz_ZTX@yjtT?>1@63f-j#tFfee<%S$b_o z3yvEf#@@H_6nsa0QGGRM)Z?rZ!Aaj+++4t!B5sZqgc8lCQjB0xq)pfHMPJH70?2mX z@6z;-cW}^PnO5{xt&*^2~1r@o1PfDV#`7r z962ysbfr4XIHPmsaKQffo}-_hqv1XC26`z`{)yJ_riY9@y0jbqD*FP4n)=H8;E`NL ztoDVKesgG15T)mQn}d#A>QKw?VPr;(^;$|f14Sng-oGJhf!%QTT6^)P*_+nC4iJ4e}-LG8>~{_499?VPjk~Om5L4$Lykm% zShhoBSnVhy@WF~h+4g)1bf2tV6KFVz%x>8pv^T@1=~Zaz+r32x`1l4wceS=#&$I8g zfW;wjHL)`7a{uex1HR{Wr;UzzSlsnHG%Z7!*m5i@RBePcj1u8_Flzk1CK2`1O& z3K@2k>}1`#T;Mx5mc=Z;+DFsBQrl1GkY%|uZTx%%OAYP9Rs zaa!&9X||EH^ps<)Fp^7L0p1=k!;UAP-ftJNXESB*f=lhiPYk1B$h!>uw3E9ezwAS& zNdu1lSccah7l!(;wDXAZU{q`X)0ai^&s+a7RMqay&EuYAbpuiP)o;;gLDM2IW%NB= zEHW!G&C^mgY;8x>Oo#AKqh!E0&u*Mc&jn3x>>)tOCU1Ug`nmlJfm6_5uPmQSlmGF< zJlENC%Mf?$x;S9Qm)egW`e`9yae4c!g|PYE!*>LE#|-Z_!aK?EPAdN2HNqt|2B@*H z_AS$9r4M%2(^$goKc75uYvUg^%Z2l2EnFg+lumui_`1lN)q54`kT}?xxmtM1Nv~O7 zs`i+qzwFP{-#OB`1lB^rkAMxg2Tb*a7a+&=!SDbUkO?pA0Qokl+%%h*0tI z@2dXaA9+&KM9TWpaV>@1JkOWEZ7*I-gu_7=c_`+5)j~jJ|B_Z%2dRyiVh0#x?#r;h z+b+5Nj3oszfHS|;e3yt*zaeCuui=ZP!!j^5wHyIT*45ZfF&>SslewqF8$p; zTX4z%&5=Qyi)}5>S>?W~_FVc*-dFOvZD#zsIIrIq2QX0QZQS$(M&E3 znuYWBmqD)rw77b~tT|xy`@+_C88iOfra7Nb%_3N!4^Gb_T53MGRcI!LI|kT+8|~h( zRMUvF`xL_nl%2o&i@82`5#g<=&F$q28}{Uzz3@+2a{5np@y7r64_DwM7HyNZ zUka+tW;xB9sN6i)Hs33}dEeFplN-6UoJSt9Upp^_AV&>pmQmWNvhou7LIPu7sYmvD zh&558YSQ^GBe8%*m<# zP$v}2@w93aWOG0)uDTh7sFI#N!%P*Lq_IfDq}sYn7adc3gU8hQ3;$R=9#0}zts`cC!*Xmk2X^7V42U<{)|`))ops3wGQ{WMj2`D z|Iq%ofwRb~?QjlXwY+q#roH7LnjXGWRO7-{CFa!|rSw}Gr1v^h<>5d|I6K#BO3YTW zb6@C-KZ-|J@;&$k!Z0eMIn18_zz|2x8BmV9ZKJ#5Y!C*SOpujGc4mWaHuyPaSUWCL zdsR>Hhy7{w2cYw>|N53!yw54Ax<0hQsX?|OW^V*~I)^$Xb =urRVvZfLGey%JQ^ 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 diff --git a/doc/images/show-all-config.png b/doc/images/show-all-config.png deleted file mode 100644 index 7a46607b65f134f43a7400f4ddd0d0cc570d03b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84054 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 diff --git a/docs/en/usage/apollo-user-guide.md b/docs/en/usage/apollo-user-guide.md index d066a410246..4eeee275bae 100644 --- a/docs/en/usage/apollo-user-guide.md +++ b/docs/en/usage/apollo-user-guide.md @@ -458,8 +458,6 @@ The project members here are : The configuration is very simple. After logging in with your super administrator account, go to the `Administrator Tools - System Parameters` page and add or modify the `configView.memberOnly.envs` configuration item. -![show-all-config](https://cdn.jsdelivr.net/gh/apolloconfig/apollo@master/doc/images/show-all-config.png) - ![configView.memberOnly.envs](https://cdn.jsdelivr.net/gh/apolloconfig/apollo@master/doc/images/configure-view-permissions.png) ## 6.2 Configuring access keys diff --git a/docs/zh/usage/apollo-user-guide.md b/docs/zh/usage/apollo-user-guide.md index 4f6d17617b2..b6a7f5aa108 100644 --- a/docs/zh/usage/apollo-user-guide.md +++ b/docs/zh/usage/apollo-user-guide.md @@ -431,8 +431,6 @@ Apollo目前提供Java客户端,具体信息请点击[Java客户端使用文 配置方式很简单,用超级管理员账号登录后,进入`管理员工具 - 系统参数`页面新增或修改`configView.memberOnly.envs`配置项即可。 -![show-all-config](https://cdn.jsdelivr.net/gh/apolloconfig/apollo@master/doc/images/show-all-config.png) - ![configView.memberOnly.envs](https://cdn.jsdelivr.net/gh/apolloconfig/apollo@master/doc/images/configure-view-permissions.png) ## 6.2 配置访问密钥 From 6d53524616158d69bf74cafb2ff3824c4f8ccde9 Mon Sep 17 00:00:00 2001 From: kl Date: Wed, 14 Dec 2022 11:45:08 +0800 Subject: [PATCH 6/8] doc(CHANGES.md): update CHANGES.md --- CHANGES.md | 1 + .../controller/ServerConfigController.js | 22 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 53cc8e5f087..66a966b7d59 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,6 +39,7 @@ Apollo 2.1.0 * [feat: use can change spring.profiles.active's value without rebuild project](https://github.com/apolloconfig/apollo/pull/4616) * [refactor: remove app.properties and move some config file's location](https://github.com/apolloconfig/apollo/pull/4637) * [Fix the problem of deleting blank items appear at the end](https://github.com/apolloconfig/apollo/pull/4662) +* [Portal-UI adds serverConfig configuration management of ApolloConfigDB](https://github.com/apolloconfig/apollo/pull/4680) ------------------ All issues and pull requests are [here](https://github.com/apolloconfig/apollo/milestone/11?closed=1) diff --git a/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js b/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js index 45772f7aa30..44ed4fad8a2 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js @@ -60,7 +60,7 @@ function ServerConfigController($scope, $window, $translate, toastr, AppUtil, Se PermissionService.has_root_permission() .then(function (result) { $scope.isRootUser = result.hasPermission; - }) + }); } function getPortalDBConfig() { @@ -76,7 +76,7 @@ function ServerConfigController($scope, $window, $translate, toastr, AppUtil, Se $scope.portalDBConfigs = []; $scope.portalDBFilterConfigs = []; toastr.error(AppUtil.errorMsg(result), $translate.instant('Config.SystemError')); - }) + }); } function getConfigDBConfig() { @@ -105,7 +105,7 @@ function ServerConfigController($scope, $window, $translate, toastr, AppUtil, Se key: config.key, value: config.value, comment: config.comment - } + }; } } @@ -151,35 +151,35 @@ function ServerConfigController($scope, $window, $translate, toastr, AppUtil, Se function portalDBConfigFilter() { $scope.portalDBConfigSearchKey = $scope.portalDBConfigSearchKey.toLowerCase(); - let filterConfig = [] + let filterConfig = []; $scope.portalDBConfigs.forEach(function (item) { let keyName = item.key; if (keyName && keyName.toLowerCase().indexOf( $scope.portalDBConfigSearchKey) >= 0) { filterConfig.push(item); } }); - $scope.portalDBFilterConfigs = filterConfig + $scope.portalDBFilterConfigs = filterConfig; } function resetPortalDBConfigSearchKey() { - $scope.portalDBConfigSearchKey = '' - portalDBConfigFilter() + $scope.portalDBConfigSearchKey = ''; + portalDBConfigFilter(); } function configDBConfigFilter() { $scope.configDBConfigSearchKey = $scope.configDBConfigSearchKey.toLowerCase(); - let filterConfig = [] + let filterConfig = []; $scope.configDBConfigs.forEach(function (item) { let keyName = item.key; if (keyName && keyName.toLowerCase().indexOf( $scope.configDBConfigSearchKey) >= 0) { filterConfig.push(item); } }); - $scope.configDBFilterConfigs = filterConfig + $scope.configDBFilterConfigs = filterConfig; } function resetConfigDBConfigSearchKey() { - $scope.configDBConfigSearchKey = '' - configDBConfigFilter() + $scope.configDBConfigSearchKey = ''; + configDBConfigFilter(); } } From deeadf3c4803d9732a432e69c07a25da6d756ceb Mon Sep 17 00:00:00 2001 From: kl Date: Wed, 14 Dec 2022 11:59:01 +0800 Subject: [PATCH 7/8] Fix(CI): Fix CI check license failures --- .../controller/ServerConfigController.java | 16 ++++++++++++++++ .../controller/ServerConfigControllerTest.java | 16 ++++++++++++++++ .../apollo/biz/service/ServerConfigService.java | 17 ++++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java index 28fd9b47ab8..260478d8dc4 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigController.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.ctrip.framework.apollo.adminservice.controller; import com.ctrip.framework.apollo.biz.entity.ServerConfig; diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java index 16c263a20c8..b7c2495c6a3 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ServerConfigControllerTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.ctrip.framework.apollo.adminservice.controller; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java index 8a85f985264..7a260b6910c 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java @@ -1,8 +1,23 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.ctrip.framework.apollo.biz.service; import com.ctrip.framework.apollo.biz.entity.ServerConfig; import com.ctrip.framework.apollo.biz.repository.ServerConfigRepository; -import com.ctrip.framework.apollo.common.utils.BeanUtils; import com.google.common.collect.Lists; import java.util.List; import java.util.Objects; From 99fc20bb256cbc89d7949e71c78d22a94d4cddb8 Mon Sep 17 00:00:00 2001 From: kl Date: Wed, 14 Dec 2022 15:06:36 +0800 Subject: [PATCH 8/8] feat(apollo-biz): Additional test cases --- .../biz/service/ServerConfigServiceTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ServerConfigServiceTest.java diff --git a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ServerConfigServiceTest.java b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ServerConfigServiceTest.java new file mode 100644 index 00000000000..741204a9e0f --- /dev/null +++ b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ServerConfigServiceTest.java @@ -0,0 +1,76 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.biz.service; + +import com.ctrip.framework.apollo.biz.AbstractIntegrationTest; +import com.ctrip.framework.apollo.biz.entity.ServerConfig; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author kl (http://kailing.pub) + * @since 2022/12/14 + */ +public class ServerConfigServiceTest extends AbstractIntegrationTest { + + @Autowired + private ServerConfigService serverConfigService; + + @Test + public void findAll() { + List serverConfigs = serverConfigService.findAll(); + assertThat(serverConfigs).isNotNull(); + assertThat(serverConfigs.size()).isGreaterThanOrEqualTo(0); + } + + @Test + public void createOrUpdateConfig() { + ServerConfig serverConfig = new ServerConfig(); + serverConfig.setKey("name"); + serverConfig.setValue("kl"); + serverConfigService.createOrUpdateConfig(serverConfig); + + List serverConfigs = serverConfigService.findAll(); + assertThat(serverConfigs).isNotNull(); + assertThat(serverConfigs.get(0).getValue()).isEqualTo("kl"); + assertThat(serverConfigs.get(0).getCluster()).isEqualTo("default"); + assertThat(serverConfigs.get(0).getKey()).isEqualTo("name"); + + + serverConfig.setValue("kl2"); + serverConfigService.createOrUpdateConfig(serverConfig); + + serverConfigs = serverConfigService.findAll(); + assertThat(serverConfigs).isNotNull(); + assertThat(serverConfigs.size()).isEqualTo(1); + assertThat(serverConfigs.get(0).getValue()).isEqualTo("kl2"); + assertThat(serverConfigs.get(0).getKey()).isEqualTo("name"); + + serverConfig = new ServerConfig(); + serverConfig.setKey("name2"); + serverConfig.setValue("kl2"); + serverConfigService.createOrUpdateConfig(serverConfig); + + serverConfigs = serverConfigService.findAll(); + assertThat(serverConfigs).isNotNull(); + assertThat(serverConfigs.size()).isEqualTo(2); + } +} \ No newline at end of file