This is an automated email from the ASF dual-hosted git repository.

ranke pushed a commit to branch dev-change-ui2antd
in repository https://gitbox.apache.org/repos/asf/dubbo-admin.git


The following commit(s) were added to refs/heads/dev-change-ui2antd by this 
push:
     new c2058e7  Merge the latest code into the antd branch (#721)
c2058e7 is described below

commit c2058e71b9816ad7bfbd38d3bcf23e99a956bc96
Author: 邪影oO <[email protected]>
AuthorDate: Tue Mar 30 13:45:00 2021 +0800

    Merge the latest code into the antd branch (#721)
    
    * Fix and optimize some problems of conditional routing when using ZK to 
make it work (#704)
    
    * Fix and optimize some problems of conditional routing when using ZK to 
make it work
    
    * Fix UT problem
    
    * fix #19 of api docs bug , 
https://github.com/apache/dubbo-spi-extensions/issues/19 (#707)
    
    * nacos support auth (#709)
    
    Co-authored-by: yanhao <[email protected]>
    
    * Fix route rule some problem (#712)
    
    * `BaseDTO` remove service
    fix condition query problem
    
    * remove condition service group
    fix serviceGroup and serviceVersion null string
    
    * fix test
    
    * fix condition application query
    
    * fix ci
    
    * fix #714 (#719)
    
    Co-authored-by: tangziran <823013778@qqcom>
    
    * fix nacos dataId can't match dubbo (#717)
    
    * Merge the latest code into the antd branch
    
    Co-authored-by: haoyann <[email protected]>
    Co-authored-by: yanhao <[email protected]>
    Co-authored-by: tzr164 <[email protected]>
    Co-authored-by: tangziran <823013778@qqcom>
---
 .../dubbo/admin/common/util/ConvertUtil.java       |  30 ++-
 .../controller/ConditionRoutesController.java      |  76 +++---
 .../admin/model/dto/ConditionRouteResultDTO.java   |  49 ++++
 .../registry/config/impl/NacosConfiguration.java   |   2 +-
 .../apache/dubbo/admin/service/RouteService.java   |   9 +-
 .../dubbo/admin/service/impl/RouteServiceImpl.java |  25 +-
 .../admin/controller/AccessesControllerTest.java   |   3 +-
 .../controller/ConditionRoutesControllerTest.java  | 259 +++++++++++++++------
 dubbo-admin-ui/src/components/apiDocs/ApiDocs.vue  |  58 ++++-
 .../src/components/governance/RoutingRule.vue      |  43 ++--
 10 files changed, 404 insertions(+), 150 deletions(-)

diff --git 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/ConvertUtil.java
 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/ConvertUtil.java
index cc7a2b8..a592b82 100644
--- 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/ConvertUtil.java
+++ 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/ConvertUtil.java
@@ -54,13 +54,20 @@ public class ConvertUtil {
         if (StringUtils.isNotEmpty(baseDTO.getApplication())) {
             id = baseDTO.getApplication();
         } else {
-            // id format: "${class}:${version}:${group}"
-            id = new 
StringBuilder(baseDTO.getService()).append(COLON).append(null2EmptyString(baseDTO.getServiceVersion()))
-                    
.append(COLON).append(null2EmptyString(baseDTO.getServiceGroup())).toString();
+            id = baseDTO.getService();
         }
         return id;
     }
 
+    public static String getIdFromDTO(BaseDTO baseDTO, String serviceVersion, 
String serviceGroup) {
+        if (StringUtils.isNotEmpty(baseDTO.getApplication())) {
+            return baseDTO.getApplication();
+        }
+        // id format: "${class}:${version}:${group}"
+        return new 
StringBuilder(baseDTO.getService()).append(COLON).append(null2EmptyString(serviceVersion))
+                
.append(COLON).append(null2EmptyString(serviceGroup)).toString();
+    }
+
     /**
      * Detach interface class, version and group from id.
      * @param id
@@ -74,17 +81,18 @@ public class ConvertUtil {
         }
     }
 
-    public static String getServiceIdFromDTO(BaseDTO baseDTO, boolean 
groupAsFolder) {
+    public static String getServiceIdFromDTO(BaseDTO baseDTO, String 
serviceVersion, String serviceGroup,
+                                             boolean groupAsFolder) {
         StringBuilder buf = new StringBuilder();
         buf.append(baseDTO.getService());
-        if (StringUtils.isNotEmpty(baseDTO.getServiceVersion())) {
-            buf.append(COLON).append(baseDTO.getServiceVersion());
+        if (StringUtils.isNotEmpty(serviceVersion)) {
+            buf.append(COLON).append(serviceVersion);
         }
-        if (StringUtils.isNotEmpty(baseDTO.getServiceGroup())) {
+        if (StringUtils.isNotEmpty(serviceGroup)) {
             if (groupAsFolder) {
-                buf.insert(0, baseDTO.getServiceGroup() + "/");
+                buf.insert(0, serviceGroup + "/");
             } else {
-                buf.append(COLON).append(baseDTO.getServiceGroup());
+                buf.append(COLON).append(serviceGroup);
             }
         }
         return buf.toString();
@@ -99,9 +107,9 @@ public class ConvertUtil {
 
     public static String getScopeFromDTO(BaseDTO baseDTO) {
         if (StringUtils.isNotEmpty(baseDTO.getApplication())) {
-            return org.apache.dubbo.admin.common.util.Constants.APPLICATION;
+            return Constants.APPLICATION;
         } else {
-            return org.apache.dubbo.admin.common.util.Constants.SERVICE;
+            return Constants.SERVICE;
         }
     }
 
diff --git 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
index 6cbebe7..6a7a63b 100644
--- 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
+++ 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
@@ -24,7 +24,9 @@ import 
org.apache.dubbo.admin.common.exception.ParamValidationException;
 import org.apache.dubbo.admin.common.exception.ResourceNotFoundException;
 import org.apache.dubbo.admin.common.exception.VersionValidationException;
 import org.apache.dubbo.admin.common.util.Constants;
+import org.apache.dubbo.admin.common.util.ConvertUtil;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
+import org.apache.dubbo.admin.model.dto.ConditionRouteResultDTO;
 import org.apache.dubbo.admin.service.ProviderService;
 import org.apache.dubbo.admin.service.RouteService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,7 +57,9 @@ public class ConditionRoutesController {
 
     @RequestMapping(method = RequestMethod.POST)
     @ResponseStatus(HttpStatus.CREATED)
-    public boolean createRule(@RequestBody ConditionRouteDTO routeDTO, 
@PathVariable String env) {
+    public boolean createRule(@RequestBody ConditionRouteDTO routeDTO, 
@PathVariable String env,
+                              @RequestParam(required = false) String 
serviceVersion,
+                              @RequestParam(required = false) String 
serviceGroup) {
         String serviceName = routeDTO.getService();
         String app = routeDTO.getApplication();
         if (StringUtils.isEmpty(serviceName) && StringUtils.isEmpty(app)) {
@@ -64,8 +68,7 @@ public class ConditionRoutesController {
         if (StringUtils.isNotEmpty(app) && 
providerService.findVersionInApplication(app).equals("2.6")) {
             throw new VersionValidationException("dubbo 2.6 does not support 
application scope routing rule");
         }
-
-        routeService.createConditionRoute(routeDTO);
+        routeService.createConditionRoute(routeDTO, serviceVersion, 
serviceGroup);
         return true;
     }
 
@@ -75,33 +78,34 @@ public class ConditionRoutesController {
                               @RequestParam(required = false) String 
serviceGroup) {
         id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
+        String serviceName = newConditionRoute.getService();
+        if (StringUtils.isNotEmpty(serviceName)) {
+            id = ConvertUtil.getIdFromDTO(newConditionRoute, serviceVersion, 
serviceGroup);
+        }
         crDTO.setService(id);
-        crDTO.setServiceVersion(serviceVersion);
-        crDTO.setServiceGroup(serviceGroup);
         ConditionRouteDTO oldConditionRoute = 
routeService.findConditionRoute(crDTO);
         if (oldConditionRoute == null) {
             throw new ResourceNotFoundException("can not find route rule for: 
" + id);
         }
-        routeService.updateConditionRoute(newConditionRoute);
+        routeService.updateConditionRoute(newConditionRoute, serviceVersion, 
serviceGroup);
         return true;
     }
 
     @RequestMapping(method = RequestMethod.GET)
-    public List<ConditionRouteDTO> searchRoutes(@RequestParam(required = 
false) String application,
-                                                @RequestParam(required = 
false) String service, @PathVariable String env,
-                                                @RequestParam(required = 
false) String serviceVersion,
-                                                @RequestParam(required = 
false) String serviceGroup) {
-        ConditionRouteDTO conditionRoute;
-        List<ConditionRouteDTO> result = new ArrayList<>();
+    public List<ConditionRouteResultDTO> searchRoutes(@RequestParam(required = 
false) String application,
+                                                      @RequestParam(required = 
false) String service, @PathVariable String env,
+                                                      @RequestParam(required = 
false) String serviceVersion,
+                                                      @RequestParam(required = 
false) String serviceGroup) {
+        ConditionRouteResultDTO conditionRoute;
+        List<ConditionRouteResultDTO> result = new ArrayList<>();
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
         if (StringUtils.isNotBlank(application)) {
             crDTO.setService(application);
             conditionRoute = routeService.findConditionRoute(crDTO);
         } else if (StringUtils.isNotBlank(service)) {
             crDTO.setService(service);
-            crDTO.setServiceVersion(serviceVersion);
-            crDTO.setServiceGroup(serviceGroup);
-            conditionRoute = routeService.findConditionRoute(crDTO);
+            String id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, 
serviceGroup);
+            conditionRoute = routeService.findConditionRoute(id);
         } else {
             throw new ParamValidationException("Either Service or application 
is required.");
         }
@@ -112,15 +116,18 @@ public class ConditionRoutesController {
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public ConditionRouteDTO detailRoute(@PathVariable String id, 
@PathVariable String env,
-                                         @RequestParam(required = false) 
String serviceVersion,
-                                         @RequestParam(required = false) 
String serviceGroup) {
+    public ConditionRouteResultDTO detailRoute(@PathVariable String id, 
@PathVariable String env,
+                                               @RequestParam(required = false) 
String serviceVersion,
+                                               @RequestParam(required = false) 
String serviceGroup,
+                                               @RequestParam String scope) {
         id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
         crDTO.setService(id);
-        crDTO.setServiceVersion(serviceVersion);
-        crDTO.setServiceGroup(serviceGroup);
-        ConditionRouteDTO conditionRoute = 
routeService.findConditionRoute(crDTO);
+        if (Constants.SERVICE.equals(scope)) {
+            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
+            crDTO.setService(id);
+        }
+        ConditionRouteResultDTO conditionRoute = 
routeService.findConditionRoute(crDTO);
         if (conditionRoute == null || conditionRoute.getConditions() == null) {
             throw new ResourceNotFoundException("Unknown ID!");
         }
@@ -130,12 +137,15 @@ public class ConditionRoutesController {
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public boolean deleteRoute(@PathVariable String id, @PathVariable String 
env,
                                @RequestParam(required = false) String 
serviceVersion,
-                               @RequestParam(required = false) String 
serviceGroup) {
+                               @RequestParam(required = false) String 
serviceGroup,
+                               @RequestParam String scope) {
         id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
         crDTO.setService(id);
-        crDTO.setServiceVersion(serviceVersion);
-        crDTO.setServiceGroup(serviceGroup);
+        if (Constants.SERVICE.equals(scope)) {
+            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
+            crDTO.setService(id);
+        }
         routeService.deleteConditionRoute(crDTO);
         return true;
     }
@@ -143,12 +153,15 @@ public class ConditionRoutesController {
     @RequestMapping(value = "/enable/{id}", method = RequestMethod.PUT)
     public boolean enableRoute(@PathVariable String id, @PathVariable String 
env,
                                @RequestParam(required = false) String 
serviceVersion,
-                               @RequestParam(required = false) String 
serviceGroup) {
+                               @RequestParam(required = false) String 
serviceGroup,
+                               @RequestParam String scope) {
         id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
         crDTO.setService(id);
-        crDTO.setServiceVersion(serviceVersion);
-        crDTO.setServiceGroup(serviceGroup);
+        if (Constants.SERVICE.equals(scope)) {
+            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
+            crDTO.setService(id);
+        }
         routeService.enableConditionRoute(crDTO);
         return true;
     }
@@ -156,12 +169,15 @@ public class ConditionRoutesController {
     @RequestMapping(value = "/disable/{id}", method = RequestMethod.PUT)
     public boolean disableRoute(@PathVariable String id, @PathVariable String 
env,
                                 @RequestParam(required = false) String 
serviceVersion,
-                                @RequestParam(required = false) String 
serviceGroup) {
+                                @RequestParam(required = false) String 
serviceGroup,
+                                @RequestParam String scope) {
         id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
         crDTO.setService(id);
-        crDTO.setServiceVersion(serviceVersion);
-        crDTO.setServiceGroup(serviceGroup);
+        if (Constants.SERVICE.equals(scope)) {
+            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
+            crDTO.setService(id);
+        }
         routeService.disableConditionRoute(crDTO);
         return true;
     }
diff --git 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/ConditionRouteResultDTO.java
 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/ConditionRouteResultDTO.java
new file mode 100644
index 0000000..2f9d247
--- /dev/null
+++ 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/ConditionRouteResultDTO.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.dubbo.admin.model.dto;
+
+
+public class ConditionRouteResultDTO extends ConditionRouteDTO {
+    private String serviceVersion;
+    private String serviceGroup;
+    private String scope;
+
+    public String getServiceVersion() {
+        return serviceVersion;
+    }
+
+    public void setServiceVersion(String serviceVersion) {
+        this.serviceVersion = serviceVersion;
+    }
+
+    public String getServiceGroup() {
+        return serviceGroup;
+    }
+
+    public void setServiceGroup(String serviceGroup) {
+        this.serviceGroup = serviceGroup;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+}
diff --git 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/NacosConfiguration.java
 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/NacosConfiguration.java
index 72fae60..f5d0c7b 100644
--- 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/NacosConfiguration.java
+++ 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/NacosConfiguration.java
@@ -192,7 +192,7 @@ public class NacosConfiguration implements 
GovernanceConfiguration {
             groupAndDataId[1] = split[2];
         } else {
             groupAndDataId[0] = group;
-            groupAndDataId[1] = split[1] + Constants.PUNCTUATION_POINT + 
split[2];
+            groupAndDataId[1] = split[2];
         }
         return groupAndDataId;
     }
diff --git 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/RouteService.java
 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/RouteService.java
index b63c175..ef42f25 100644
--- 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/RouteService.java
+++ 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/RouteService.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.admin.service;
 
 import org.apache.dubbo.admin.model.dto.AccessDTO;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
+import org.apache.dubbo.admin.model.dto.ConditionRouteResultDTO;
 import org.apache.dubbo.admin.model.dto.TagRouteDTO;
 
 /**
@@ -26,9 +27,9 @@ import org.apache.dubbo.admin.model.dto.TagRouteDTO;
  */
 public interface RouteService {
 
-    void createConditionRoute(ConditionRouteDTO conditionRoute);
+    void createConditionRoute(ConditionRouteDTO conditionRoute, String 
serviceVersion, String serviceGroup);
 
-    void updateConditionRoute(ConditionRouteDTO newConditionRoute);
+    void updateConditionRoute(ConditionRouteDTO newConditionRoute, String 
serviceVersion, String serviceGroup);
 
     void deleteConditionRoute(ConditionRouteDTO conditionRoute);
 
@@ -46,9 +47,9 @@ public interface RouteService {
     void disableConditionRoute(ConditionRouteDTO conditionRoute);
 
 
-    ConditionRouteDTO findConditionRoute(ConditionRouteDTO crDTO);
+    ConditionRouteResultDTO findConditionRoute(ConditionRouteDTO crDTO);
 
-    ConditionRouteDTO findConditionRoute(String id);
+    ConditionRouteResultDTO findConditionRoute(String id);
 
     void createTagRoute(TagRouteDTO tagRoute);
 
diff --git 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
index fe0f085..a365eef 100644
--- 
a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
+++ 
b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
@@ -24,12 +24,14 @@ import org.apache.dubbo.admin.common.util.YamlParser;
 import org.apache.dubbo.admin.model.domain.Route;
 import org.apache.dubbo.admin.model.dto.AccessDTO;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
+import org.apache.dubbo.admin.model.dto.ConditionRouteResultDTO;
 import org.apache.dubbo.admin.model.dto.TagRouteDTO;
 import org.apache.dubbo.admin.model.store.RoutingRule;
 import org.apache.dubbo.admin.model.store.TagRoute;
 import org.apache.dubbo.admin.service.RouteService;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.LinkedList;
@@ -41,8 +43,8 @@ public class RouteServiceImpl extends AbstractService 
implements RouteService {
     private String prefix = Constants.CONFIG_KEY;
 
     @Override
-    public void createConditionRoute(ConditionRouteDTO conditionRoute) {
-        String id = ConvertUtil.getIdFromDTO(conditionRoute);
+    public void createConditionRoute(ConditionRouteDTO conditionRoute, String 
serviceVersion, String serviceGroup) {
+        String id = ConvertUtil.getIdFromDTO(conditionRoute, serviceVersion, 
serviceGroup);
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String existConfig = dynamicConfiguration.getConfig(path);
         RoutingRule existRule = null;
@@ -63,8 +65,8 @@ public class RouteServiceImpl extends AbstractService 
implements RouteService {
     }
 
     @Override
-    public void updateConditionRoute(ConditionRouteDTO newConditionRoute) {
-        String id = ConvertUtil.getIdFromDTO(newConditionRoute);
+    public void updateConditionRoute(ConditionRouteDTO newConditionRoute, 
String serviceVersion, String serviceGroup) {
+        String id = ConvertUtil.getIdFromDTO(newConditionRoute, 
serviceVersion, serviceGroup);
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String existConfig = dynamicConfiguration.getConfig(path);
         if (existConfig == null) {
@@ -261,12 +263,12 @@ public class RouteServiceImpl extends AbstractService 
implements RouteService {
     }
 
     @Override
-    public ConditionRouteDTO findConditionRoute(ConditionRouteDTO crDTO) {
+    public ConditionRouteResultDTO findConditionRoute(ConditionRouteDTO crDTO) 
{
         return findConditionRoute(ConvertUtil.getIdFromDTO(crDTO));
     }
 
     @Override
-    public ConditionRouteDTO findConditionRoute(String id) {
+    public ConditionRouteResultDTO findConditionRoute(String id) {
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
@@ -276,12 +278,17 @@ public class RouteServiceImpl extends AbstractService 
implements RouteService {
             if (org.apache.commons.lang3.StringUtils.isNotBlank(service)) {
                 conditionRouteDTO.setService(service.replace("*", "/"));
             }
+            ConditionRouteResultDTO result = new ConditionRouteResultDTO();
+            BeanUtils.copyProperties(conditionRouteDTO, result);
+            result.setScope(routingRule.getScope());
             String[] detachResult = ConvertUtil.detachId(id);
             if (detachResult.length > 1) {
-                conditionRouteDTO.setServiceVersion(detachResult[1]);
-                conditionRouteDTO.setServiceGroup(detachResult[2]);
+                result.setServiceVersion(detachResult[1]);
+            }
+            if (detachResult.length > 2) {
+                result.setServiceGroup(detachResult[2]);
             }
-            return conditionRouteDTO;
+            return result;
         }
         return null;
     }
diff --git 
a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/AccessesControllerTest.java
 
b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/AccessesControllerTest.java
index e087898..aaf6c73 100644
--- 
a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/AccessesControllerTest.java
+++ 
b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/AccessesControllerTest.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.dubbo.admin.AbstractSpringIntegrationTest;
 import org.apache.dubbo.admin.model.dto.AccessDTO;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
+import org.apache.dubbo.admin.model.dto.ConditionRouteResultDTO;
 import org.apache.dubbo.admin.service.ProviderService;
 import org.apache.dubbo.admin.service.RouteService;
 import org.junit.After;
@@ -130,7 +131,7 @@ public class AccessesControllerTest extends 
AbstractSpringIntegrationTest {
         restTemplate.put(url("/api/{env}/rules/access/{id}"), accessDTO, env, 
id);
         verify(routeService).findConditionRoute(id);
         //
-        ConditionRouteDTO conditionRouteDTO = mock(ConditionRouteDTO.class);
+        ConditionRouteResultDTO conditionRouteDTO = 
mock(ConditionRouteResultDTO.class);
         
when(routeService.findConditionRoute(id)).thenReturn(conditionRouteDTO);
         restTemplate.put(url("/api/{env}/rules/access/{id}"), accessDTO, env, 
id);
         verify(routeService).updateAccess(any(AccessDTO.class));
diff --git 
a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/ConditionRoutesControllerTest.java
 
b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/ConditionRoutesControllerTest.java
index 4a879cf..92c24ac 100644
--- 
a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/ConditionRoutesControllerTest.java
+++ 
b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/ConditionRoutesControllerTest.java
@@ -67,7 +67,7 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
 
     ConditionRouteDTO dto = new ConditionRouteDTO();
     ResponseEntity<String> responseEntity = restTemplate.postForEntity(
-        url("/api/{env}/rules/route/condition"), dto, String.class, env
+            url("/api/{env}/rules/route/condition"), dto, String.class, env
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.BAD_REQUEST));
     assertThat(responseEntity.getBody(), containsString("serviceName and app 
is Empty!"));
@@ -75,7 +75,7 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     dto.setApplication("application" + uuid);
     
when(providerService.findVersionInApplication(dto.getApplication())).thenReturn("2.6");
     responseEntity = restTemplate.postForEntity(
-        url("/api/{env}/rules/route/condition"), dto, String.class, env
+            url("/api/{env}/rules/route/condition"), dto, String.class, env
     );
     assertThat(responseEntity.getStatusCode(), 
is(HttpStatus.INTERNAL_SERVER_ERROR));
     assertThat(responseEntity.getBody(), containsString("dubbo 2.6 does not 
support application scope routing rule"));
@@ -86,6 +86,8 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     String uuid = UUID.randomUUID().toString();
     String application = "application" + uuid;
     String service = "service" + uuid;
+    String serviceVersion = "version" + uuid;
+    String serviceGroup = "group" + uuid;
     List<String> conditions = Collections.singletonList("=> host != 
172.22.3.91");
 
     ConditionRouteDTO dto = new ConditionRouteDTO();
@@ -93,7 +95,7 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     dto.setConditions(conditions);
 
     ResponseEntity<String> responseEntity = restTemplate.postForEntity(
-        url("/api/{env}/rules/route/condition"), dto, String.class, env
+            url("/api/{env}/rules/route/condition" + "?serviceVersion=" + 
serviceVersion + "&serviceGroup=" + serviceGroup), dto, String.class, env
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.CREATED));
 
@@ -101,7 +103,7 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     
when(providerService.findVersionInApplication(dto.getApplication())).thenReturn("2.7");
 
     responseEntity = restTemplate.postForEntity(
-        url("/api/{env}/rules/route/condition"), dto, String.class, env
+            url("/api/{env}/rules/route/condition"), dto, String.class, env
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.CREATED));
   }
@@ -110,14 +112,14 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
   public void shouldUpdateRule() throws Exception {
     String service = "org.apache.dubbo.demo.DemoService";
     String content = "conditions:\n"
-        + "- => host != 172.22.3.111\n"
-        + "- => host != 172.22.3.112\n"
-        + "enabled: true\n"
-        + "force: true\n"
-        + "key: " + service + "\n"
-        + "priority: 0\n"
-        + "runtime: false\n"
-        + "scope: service";
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: true\n"
+            + "key: " + service + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
     String path = "/dubbo/config/dubbo/" + service + "::.condition-router";
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
     zkClient.setData().forPath(path, content.getBytes());
@@ -129,8 +131,8 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     dto.setService(service);
 
     ResponseEntity<String> responseEntity = restTemplate.exchange(
-        url("/api/{env}/rules/route/condition/{service}"), HttpMethod.PUT,
-        new HttpEntity<>(dto, null), String.class, env, service
+            url("/api/{env}/rules/route/condition/{service}"), HttpMethod.PUT,
+            new HttpEntity<>(dto, null), String.class, env, service
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
 
@@ -144,54 +146,81 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
   public void shouldGetServiceRule() throws Exception {
     String service = "org.apache.dubbo.demo.DemoService";
     String content = "conditions:\n"
-        + "- => host != 172.22.3.111\n"
-        + "- => host != 172.22.3.112\n"
-        + "enabled: true\n"
-        + "force: true\n"
-        + "key: " + service + "\n"
-        + "priority: 0\n"
-        + "runtime: false\n"
-        + "scope: service";
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: true\n"
+            + "key: " + service + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
     String path = "/dubbo/config/dubbo/" + service + "::.condition-router";
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
     zkClient.setData().forPath(path, content.getBytes());
 
     ResponseEntity<List<ConditionRouteDTO>> responseEntity = 
restTemplate.exchange(
-        url("/api/{env}/rules/route/condition/?service={service}"), 
HttpMethod.GET,
-        null, new ParameterizedTypeReference<List<ConditionRouteDTO>>() {
-        }, env, service
+            url("/api/{env}/rules/route/condition/?service={service}"), 
HttpMethod.GET,
+            null, new ParameterizedTypeReference<List<ConditionRouteDTO>>() {
+            }, env, service
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
     assertThat(responseEntity.getBody(), hasSize(1));
     List<String> conditions = responseEntity.getBody()
-        .stream()
-        .flatMap(it -> it.getConditions().stream())
-        .collect(Collectors.toList());
+            .stream()
+            .flatMap(it -> it.getConditions().stream())
+            .collect(Collectors.toList());
     assertThat(conditions, hasSize(2));
     assertThat(conditions, containsInAnyOrder("=> host != 172.22.3.111", "=> 
host != 172.22.3.112"));
   }
 
   @Test
-  public void shouldDeleteRule() throws Exception {
+  public void serviceShouldDeleteRule() throws Exception {
     String service = "org.apache.dubbo.demo.DemoService";
-    String content = "conditions:\n"
-        + "- => host != 172.22.3.111\n"
-        + "- => host != 172.22.3.112\n"
-        + "enabled: true\n"
-        + "force: true\n"
-        + "key: " + service + "\n"
-        + "priority: 0\n"
-        + "runtime: false\n"
-        + "scope: service";
+    String serviceContent = "conditions:\n"
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: true\n"
+            + "key: " + service + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
     String path = "/dubbo/config/dubbo/" + service + "::.condition-router";
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
-    zkClient.setData().forPath(path, content.getBytes());
+    zkClient.setData().forPath(path, serviceContent.getBytes());
+
+    assertNotNull("zk path should not be null before deleting", 
zkClient.checkExists().forPath(path));
+
+    ResponseEntity<String> responseEntity = restTemplate.exchange(
+            url("/api/{env}/rules/route/condition/{service}" + 
"?scope=service"), HttpMethod.DELETE,
+            null, String.class, env, service
+    );
+    assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
+
+    assertNull(zkClient.checkExists().forPath(path));
+  }
+
+  @Test
+  public void applicationShouldDeleteRule() throws Exception {
+    String application = "test-application";
+    String serviceContent = "conditions:\n"
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: true\n"
+            + "key: " + application + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: application";
+    String path = "/dubbo/config/dubbo/" + application + ".condition-router";
+    zkClient.create().creatingParentContainersIfNeeded().forPath(path);
+    zkClient.setData().forPath(path, serviceContent.getBytes());
 
     assertNotNull("zk path should not be null before deleting", 
zkClient.checkExists().forPath(path));
 
     ResponseEntity<String> responseEntity = restTemplate.exchange(
-        url("/api/{env}/rules/route/condition/{service}"), HttpMethod.DELETE,
-        null, String.class, env, service
+            url("/api/{env}/rules/route/condition/{service}" + 
"?scope=application"), HttpMethod.DELETE,
+            null, String.class, env, application
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
 
@@ -201,29 +230,56 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
   @Test
   public void shouldThrowWhenDetailRouteWithUnknownId() {
     ResponseEntity<String> responseEntity = restTemplate.getForEntity(
-        url("/api/{env}/rules/route/condition/{id}"), String.class, env, 
"non-existed-service"
+            url("/api/{env}/rules/route/condition/{id}" + "?scope=service"), 
String.class, env, "non-existed-service"
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.NOT_FOUND));
   }
 
   @Test
-  public void shouldGetRouteDetail() throws Exception {
+  public void serviceShouldGetRouteDetail() throws Exception {
     String service = "org.apache.dubbo.demo.DemoService";
     String content = "conditions:\n"
-        + "- => host != 172.22.3.111\n"
-        + "- => host != 172.22.3.112\n"
-        + "enabled: true\n"
-        + "force: true\n"
-        + "key: " + service + "\n"
-        + "priority: 0\n"
-        + "runtime: false\n"
-        + "scope: service";
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: true\n"
+            + "key: " + service + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
     String path = "/dubbo/config/dubbo/" + service + "::.condition-router";
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
     zkClient.setData().forPath(path, content.getBytes());
 
     ResponseEntity<ConditionRouteDTO> responseEntity = 
restTemplate.getForEntity(
-        url("/api/{env}/rules/route/condition/{id}"), ConditionRouteDTO.class, 
env, service
+            url("/api/{env}/rules/route/condition/{id}" + "?scope=service"), 
ConditionRouteDTO.class, env, service
+    );
+    assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
+
+    ConditionRouteDTO conditionRouteDTO = responseEntity.getBody();
+    assertNotNull(conditionRouteDTO);
+    assertThat(conditionRouteDTO.getConditions(), hasSize(2));
+    assertThat(conditionRouteDTO.getConditions(), containsInAnyOrder("=> host 
!= 172.22.3.111", "=> host != 172.22.3.112"));
+  }
+
+  @Test
+  public void applicationShouldGetRouteDetail() throws Exception {
+    String application = "test-application";
+    String content = "conditions:\n"
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: true\n"
+            + "key: " + application + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: application";
+    String path = "/dubbo/config/dubbo/" + application + ".condition-router";
+    zkClient.create().creatingParentContainersIfNeeded().forPath(path);
+    zkClient.setData().forPath(path, content.getBytes());
+
+    ResponseEntity<ConditionRouteDTO> responseEntity = 
restTemplate.getForEntity(
+            url("/api/{env}/rules/route/condition/{id}" + 
"?scope=application"), ConditionRouteDTO.class, env, application
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
 
@@ -234,17 +290,17 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
   }
 
   @Test
-  public void shouldEnableRoute() throws Exception {
+  public void serviceShouldEnableRoute() throws Exception {
     String service = "org.apache.dubbo.demo.DemoService";
     String content = "conditions:\n"
-        + "- => host != 172.22.3.111\n"
-        + "- => host != 172.22.3.112\n"
-        + "enabled: false\n"
-        + "force: true\n"
-        + "key: " + service + "\n"
-        + "priority: 0\n"
-        + "runtime: false\n"
-        + "scope: service";
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: false\n"
+            + "force: true\n"
+            + "key: " + service + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
     String path = "/dubbo/config/dubbo/" + service + "::.condition-router";
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
     zkClient.setData().forPath(path, content.getBytes());
@@ -254,7 +310,36 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     RoutingRule rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
     assertFalse(rule.isEnabled());
 
-    restTemplate.put(url("/api/{env}/rules/route/condition/enable/{id}"), 
null, env, service);
+    restTemplate.put(url("/api/{env}/rules/route/condition/enable/{id}" + 
"?scope=service"), null, env, service);
+
+    bytes = zkClient.getData().forPath(path);
+    updatedConfig = new String(bytes);
+    rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
+    assertTrue(rule.isEnabled());
+  }
+
+  @Test
+  public void applicationShouldEnableRoute() throws Exception {
+    String application = "test-application";
+    String content = "conditions:\n"
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: false\n"
+            + "force: true\n"
+            + "key: " + application + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
+    String path = "/dubbo/config/dubbo/" + application + ".condition-router";
+    zkClient.create().creatingParentContainersIfNeeded().forPath(path);
+    zkClient.setData().forPath(path, content.getBytes());
+
+    byte[] bytes = zkClient.getData().forPath(path);
+    String updatedConfig = new String(bytes);
+    RoutingRule rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
+    assertFalse(rule.isEnabled());
+
+    restTemplate.put(url("/api/{env}/rules/route/condition/enable/{id}" + 
"?scope=application"), null, env, application);
 
     bytes = zkClient.getData().forPath(path);
     updatedConfig = new String(bytes);
@@ -263,17 +348,17 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
   }
 
   @Test
-  public void shouldDisableRoute() throws Exception {
+  public void serviceShouldDisableRoute() throws Exception {
     String service = "org.apache.dubbo.demo.DemoService";
     String content = "conditions:\n"
-        + "- => host != 172.22.3.111\n"
-        + "- => host != 172.22.3.112\n"
-        + "enabled: true\n"
-        + "force: false\n"
-        + "key: " + service + "\n"
-        + "priority: 0\n"
-        + "runtime: false\n"
-        + "scope: service";
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: false\n"
+            + "key: " + service + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: service";
     String path = "/dubbo/config/dubbo/" + service + "::.condition-router";
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
     zkClient.setData().forPath(path, content.getBytes());
@@ -283,11 +368,41 @@ public class ConditionRoutesControllerTest extends 
AbstractSpringIntegrationTest
     RoutingRule rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
     assertTrue(rule.isEnabled());
 
-    restTemplate.put(url("/api/{env}/rules/route/condition/disable/{id}"), 
null, env, service);
+    restTemplate.put(url("/api/{env}/rules/route/condition/disable/{id}" + 
"?scope=service"), null, env, service);
+
+    bytes = zkClient.getData().forPath(path);
+    updatedConfig = new String(bytes);
+    rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
+    assertFalse(rule.isEnabled());
+  }
+
+  @Test
+  public void applicationShouldDisableRoute() throws Exception {
+    String application = "test-application";
+    String content = "conditions:\n"
+            + "- => host != 172.22.3.111\n"
+            + "- => host != 172.22.3.112\n"
+            + "enabled: true\n"
+            + "force: false\n"
+            + "key: " + application + "\n"
+            + "priority: 0\n"
+            + "runtime: false\n"
+            + "scope: application";
+    String path = "/dubbo/config/dubbo/" + application + ".condition-router";
+    zkClient.create().creatingParentContainersIfNeeded().forPath(path);
+    zkClient.setData().forPath(path, content.getBytes());
+
+    byte[] bytes = zkClient.getData().forPath(path);
+    String updatedConfig = new String(bytes);
+    RoutingRule rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
+    assertTrue(rule.isEnabled());
+
+    restTemplate.put(url("/api/{env}/rules/route/condition/disable/{id}" + 
"?scope=application"), null, env, application);
 
     bytes = zkClient.getData().forPath(path);
     updatedConfig = new String(bytes);
     rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
     assertFalse(rule.isEnabled());
   }
+
 }
diff --git a/dubbo-admin-ui/src/components/apiDocs/ApiDocs.vue 
b/dubbo-admin-ui/src/components/apiDocs/ApiDocs.vue
index 1499be9..2ea8fac 100644
--- a/dubbo-admin-ui/src/components/apiDocs/ApiDocs.vue
+++ b/dubbo-admin-ui/src/components/apiDocs/ApiDocs.vue
@@ -15,7 +15,7 @@
   - limitations under the License.
   -->
 <template>
-  <v-container grid-list-xl fluid>
+  <v-container grid-list-xl fluid v-scroll:#scroll-target="onScroll">
   <v-layout row wrap>
     <v-flex lg12>
     <breadcrumb title="apiDocs" :items="breads"></breadcrumb>
@@ -50,7 +50,7 @@
   </v-layout>
 
   <v-layout row wrap>
-    <v-flex lg3>
+    <v-flex lg3 
:class="{'sticky_top':isApiListDivFixed,'menu_panel_class':isBigScreen}" >
       <v-card id="apiListDiv"
         class="mx-auto"
       >
@@ -59,7 +59,7 @@
           <v-toolbar-title>{{ $t('apiDocsRes.apiListText') }}</v-toolbar-title>
           <v-spacer></v-spacer>
         </v-toolbar>
-        <v-list>
+        <v-list :class="isBigScreen?'menu_panel_content':''">
           <v-list-group
             v-for="item in apiModules"
             :key="item.title"
@@ -87,8 +87,8 @@
         </v-list>
       </v-card>
     </v-flex>
-    <v-flex lg9>
-      <v-card id="apiFormDiv">
+    <v-flex lg9 :class="isBigScreen?'apidocs_content':''">
+      <v-card id="apiFormDiv" ref="apiFormDiv">
         <apiForm :formInfo="formInfo" />
       </v-card>
     </v-flex>
@@ -105,6 +105,21 @@ export default {
     Breadcrumb,
     ApiForm
   },
+  computed:{
+    isBigScreen:function(){
+      const _this = this;
+      var isBigScreen = false;
+      if(_this.$vuetify.breakpoint){
+        isBigScreen = _this.$vuetify.breakpoint.md || 
_this.$vuetify.breakpoint.lg || _this.$vuetify.breakpoint.xl;
+      }
+
+      return  isBigScreen;
+    }
+  },
+  created(){
+    const _this = this;
+    console.debug(_this.$vuetify.breakpoint.md);
+  },
   data: () => ({
     breads: [
       {
@@ -196,17 +211,48 @@ export default {
         
document.getElementById('apiListDiv').classList.remove('apiListDiv-fixed')
         document.getElementById('apiListDiv').style.top = '0px'
       }
+    },
+    onScroll () {
+        const _this = this;
+        var scrollTop = document.documentElement.scrollTop || 
document.body.scrollTop
+        var offsetTop = document.getElementById('apiFormDiv').offsetTop
+
+        if(scrollTop >= offsetTop && _this.isBigScreen){
+          _this.isApiListDivFixed = true;
+        }else{
+          _this.isApiListDivFixed = false;
+        }
+
     }
   },
   mounted () {
-    window.addEventListener('scroll', this.fixedApiListDiv)
+    window.addEventListener('scroll', this.onScroll)
   }
 }
 </script>
 <style scoped>
 
+  .sticky_top{
+    position: fixed;
+    top:64px;
+  }
+
+  .menu_panel_content{
+    max-height: 500px;
+    overflow-y: scroll;
+  }
+
   .apiListDiv-fixed{
     position: fixed;
   }
+  .menu_panel_class{
+    position: fixed;
+    width: 25%;
+    z-index: 1000;
+  }
+
+  .apidocs_content{
+    margin-left:30%;
+  }
 
 </style>
diff --git a/dubbo-admin-ui/src/components/governance/RoutingRule.vue 
b/dubbo-admin-ui/src/components/governance/RoutingRule.vue
index 4316161..b61deb9 100644
--- a/dubbo-admin-ui/src/components/governance/RoutingRule.vue
+++ b/dubbo-admin-ui/src/components/governance/RoutingRule.vue
@@ -90,7 +90,7 @@
           >
             <template slot="items" slot-scope="props">
               <td class="text-xs-left">{{ props.item.service }}</td>
-              <td class="text-xs-left">{{ props.item.group }}</td>
+              <td class="text-xs-left">{{ props.item.serviceGroup }}</td>
               <td class="text-xs-left">{{ props.item.enabled }}</td>
               <td class="text-xs-center px-0">
                 <v-tooltip bottom v-for="op in operations" :key="op.id">
@@ -381,15 +381,15 @@ export default {
       }
       const vm = this
       rule.service = this.service
-      rule.serviceVersion = this.serviceVersion
-      rule.serviceGroup = this.serviceGroup
+      const serviceVersion = this.serviceVersion == null ? '' : 
this.serviceVersion
+      const serviceGroup = this.serviceGroup == null ? '' : this.serviceGroup
       rule.application = this.application
       if (this.updateId !== '') {
         if (this.updateId === 'close') {
           this.closeDialog()
         } else {
           rule.id = this.updateId
-          this.$axios.put('/rules/route/condition/' + rule.id, rule)
+          this.$axios.put('/rules/route/condition/' + rule.id + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup, rule)
             .then(response => {
               if (response.status === 200) {
                 if (vm.service) {
@@ -407,7 +407,7 @@ export default {
             })
         }
       } else {
-        this.$axios.post('/rules/route/condition/', rule)
+        this.$axios.post('/rules/route/condition/' + '?serviceVersion=' + 
serviceVersion + '&serviceGroup=' + serviceGroup, rule)
           .then(response => {
             if (response.status === 201) {
               if (vm.service) {
@@ -439,27 +439,34 @@ export default {
       if (itemId.includes('/')) {
         itemId = itemId.replace('/', '*')
       }
+      const serviceVersion = item.serviceVersion == null ? '' : 
item.serviceVersion
+      const serviceGroup = item.serviceGroup == null ? '' : item.serviceGroup
+      const scope = item.scope == null ? '' : item.scope
       switch (icon) {
         case 'visibility':
-          this.$axios.get('/rules/route/condition/' + itemId + 
'?serviceVersion=' + item.serviceVersion + '&serviceGroup=' + item.serviceGroup)
+          this.$axios.get('/rules/route/condition/' + itemId + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup + 
'&scope=' + scope)
             .then(response => {
               const conditionRoute = response.data
               this.serviceVersion = conditionRoute.serviceVersion
               this.serviceGroup = conditionRoute.serviceGroup
+              this.scope = conditionRoute.scope
               delete conditionRoute.serviceVersion
               delete conditionRoute.serviceGroup
+              delete conditionRoute.scope
               this.handleBalance(conditionRoute, true)
               this.updateId = 'close'
             })
           break
         case 'edit':
-          this.$axios.get('/rules/route/condition/' + itemId + 
'?serviceVersion=' + item.serviceVersion + '&serviceGroup=' + item.serviceGroup)
+          this.$axios.get('/rules/route/condition/' + itemId + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup + 
'&scope=' + scope)
             .then(response => {
               const conditionRoute = response.data
               this.serviceVersion = conditionRoute.serviceVersion
               this.serviceGroup = conditionRoute.serviceGroup
+              this.scope = conditionRoute.scope
               delete conditionRoute.serviceVersion
               delete conditionRoute.serviceGroup
+              delete conditionRoute.scope
               this.handleBalance(conditionRoute, false)
               this.updateId = itemId
             })
@@ -468,22 +475,25 @@ export default {
           this.openWarn(' Are you sure to block Routing Rule', 'service: ' + 
oldItemId)
           this.warnStatus.operation = 'disable'
           this.warnStatus.id = itemId
-          this.warnStatus.serviceVersion = item.serviceVersion
-          this.warnStatus.serviceGroup = item.serviceGroup
+          this.warnStatus.serviceVersion = serviceVersion
+          this.warnStatus.serviceGroup = serviceGroup
+          this.warnStatus.scope = scope
           break
         case 'check_circle_outline':
           this.openWarn(' Are you sure to enable Routing Rule', 'service: ' + 
oldItemId)
           this.warnStatus.operation = 'enable'
           this.warnStatus.id = itemId
-          this.warnStatus.serviceVersion = item.serviceVersion
-          this.warnStatus.serviceGroup = item.serviceGroup
+          this.warnStatus.serviceVersion = serviceVersion
+          this.warnStatus.serviceGroup = serviceGroup
+          this.warnStatus.scope = scope
           break
         case 'delete':
           this.openWarn('warnDeleteRouteRule', 'service: ' + oldItemId)
           this.warnStatus.operation = 'delete'
           this.warnStatus.id = itemId
-          this.warnStatus.serviceVersion = item.serviceVersion
-          this.warnStatus.serviceGroup = item.serviceGroup
+          this.warnStatus.serviceVersion = serviceVersion
+          this.warnStatus.serviceGroup = serviceGroup
+          this.warnStatus.scope = scope
       }
     },
     handleBalance: function (conditionRoute, readonly) {
@@ -507,8 +517,9 @@ export default {
       const operation = warnStatus.operation
       const serviceVersion = warnStatus.serviceVersion
       const serviceGroup = warnStatus.serviceGroup
+      const scope = warnStatus.scope
       if (operation === 'delete') {
-        this.$axios.delete('/rules/route/condition/' + id + '?serviceVersion=' 
+ serviceVersion + '&serviceGroup=' + serviceGroup)
+        this.$axios.delete('/rules/route/condition/' + id + '?serviceVersion=' 
+ serviceVersion + '&serviceGroup=' + serviceGroup + '&scope=' + scope)
           .then(response => {
             if (response.status === 200) {
               this.warn = false
@@ -517,7 +528,7 @@ export default {
             }
           })
       } else if (operation === 'disable') {
-        this.$axios.put('/rules/route/condition/disable/' + id + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup)
+        this.$axios.put('/rules/route/condition/disable/' + id + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup + 
'&scope=' + scope)
           .then(response => {
             if (response.status === 200) {
               this.warn = false
@@ -526,7 +537,7 @@ export default {
             }
           })
       } else if (operation === 'enable') {
-        this.$axios.put('/rules/route/condition/enable/' + id + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup)
+        this.$axios.put('/rules/route/condition/enable/' + id + 
'?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup + 
'&scope=' + scope)
           .then(response => {
             if (response.status === 200) {
               this.warn = false

Reply via email to