[ISSUE #769]Service input box add serviceVersion and serviceGroup (#770)

* service input box add serviceVersion and serviceGroup

* change equals order
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 7179601..12b7dcc 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
@@ -50,22 +50,12 @@
     }
 
     public static String getIdFromDTO(BaseDTO baseDTO) {
-        String id;
-        if (StringUtils.isNotEmpty(baseDTO.getApplication())) {
-            id = baseDTO.getApplication();
-        } else {
-            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();
+        return new StringBuilder(baseDTO.getService()).append(COLON).append(null2EmptyString(baseDTO.getServiceVersion()))
+                .append(COLON).append(null2EmptyString(baseDTO.getServiceGroup())).toString();
     }
 
     /**
@@ -81,6 +71,17 @@
         }
     }
 
+    public static void detachIdToService(String id, BaseDTO baseDTO) {
+        String[] detachResult = detachId(id);
+        baseDTO.setService(detachResult[0]);
+        if (detachResult.length > 1) {
+            baseDTO.setServiceVersion(detachResult[1]);
+        }
+        if (detachResult.length > 2) {
+            baseDTO.setServiceGroup(detachResult[2]);
+        }
+    }
+
     public static String getServiceIdFromDTO(BaseDTO baseDTO, String serviceVersion, String serviceGroup,
                                              boolean groupAsFolder) {
         StringBuilder buf = new StringBuilder();
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java
index cc1840e..1e502eb 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java
@@ -353,7 +353,7 @@
 
     public static ConditionRouteDTO createConditionRouteFromRule(RoutingRule routingRule) {
         ConditionRouteDTO conditionRouteDTO = new ConditionRouteDTO();
-        if (routingRule.getScope().equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(routingRule.getScope())) {
             conditionRouteDTO.setService(routingRule.getKey());
         } else {
             conditionRouteDTO.setApplication(routingRule.getKey());
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/AccessesController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/AccessesController.java
index 4edaaf5..954172f 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/AccessesController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/AccessesController.java
@@ -20,7 +20,7 @@
 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.AccessDTO;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
 import org.apache.dubbo.admin.service.ConsumerService;
@@ -61,7 +61,9 @@
     @RequestMapping(method = RequestMethod.GET)
     public List<AccessDTO> searchAccess(@RequestParam(required = false) String service,
                                         @RequestParam(required = false) String application,
-                                        @PathVariable String env) {
+                                        @PathVariable String env,
+                                        @RequestParam(required = false) String serviceVersion,
+                                        @RequestParam(required = false) String serviceGroup) {
         if (StringUtils.isBlank(service) && StringUtils.isBlank(application)) {
             throw new ParamValidationException("Either service or application is required");
         }
@@ -70,7 +72,12 @@
         if (StringUtils.isNotBlank(application)) {
             accessDTO = routeService.findAccess(application);
         } else {
-            accessDTO = routeService.findAccess(service);
+            AccessDTO dto = new AccessDTO();
+            dto.setService(service);
+            dto.setServiceVersion(serviceVersion);
+            dto.setServiceGroup(serviceGroup);
+            String id = ConvertUtil.getIdFromDTO(dto);
+            accessDTO = routeService.findAccess(id);
         }
         if (accessDTO != null) {
             accessDTO.setEnabled(true);
@@ -81,20 +88,22 @@
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public AccessDTO detailAccess(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         AccessDTO accessDTO = routeService.findAccess(id);
+        if (accessDTO == null) {
+            throw new ResourceNotFoundException("Unknown ID!");
+        }
         return accessDTO;
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
-    public void deleteAccess(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
+    public boolean deleteAccess(@PathVariable String id, @PathVariable String env) {
         routeService.deleteAccess(id);
+        return true;
     }
 
     @RequestMapping(method = RequestMethod.POST)
     @ResponseStatus(HttpStatus.CREATED)
-    public void createAccess(@RequestBody AccessDTO accessDTO, @PathVariable String env) {
+    public boolean createAccess(@RequestBody AccessDTO accessDTO, @PathVariable String env) {
         if (StringUtils.isBlank(accessDTO.getService()) && StringUtils.isBlank(accessDTO.getApplication())) {
             throw new ParamValidationException("Either Service or application is required.");
         }
@@ -106,16 +115,16 @@
             throw new ParamValidationException("One of Blacklist/Whitelist is required.");
         }
         routeService.createAccess(accessDTO);
+        return true;
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
-    public void updateAccess(@PathVariable String id, @RequestBody AccessDTO accessDTO, @PathVariable String env) {
-
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
+    public boolean updateAccess(@PathVariable String id, @RequestBody AccessDTO accessDTO, @PathVariable String env) {
         ConditionRouteDTO route = routeService.findConditionRoute(id);
         if (Objects.isNull(route)) {
             throw new ResourceNotFoundException("Unknown ID!");
         }
         routeService.updateAccess(accessDTO);
+        return true;
     }
 }
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 9bfc5c1..c19b8ed 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
@@ -23,10 +23,7 @@
 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.ConsumerService;
 import org.apache.dubbo.admin.service.RouteService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,9 +54,7 @@
 
     @RequestMapping(method = RequestMethod.POST)
     @ResponseStatus(HttpStatus.CREATED)
-    public boolean createRule(@RequestBody ConditionRouteDTO routeDTO, @PathVariable String env,
-                              @RequestParam(required = false) String serviceVersion,
-                              @RequestParam(required = false) String serviceGroup) {
+    public boolean createRule(@RequestBody ConditionRouteDTO routeDTO, @PathVariable String env) {
         String serviceName = routeDTO.getService();
         String app = routeDTO.getApplication();
         if (StringUtils.isEmpty(serviceName) && StringUtils.isEmpty(app)) {
@@ -68,44 +63,36 @@
         if (StringUtils.isNotEmpty(app) && consumerService.findVersionInApplication(app).equals("2.6")) {
             throw new VersionValidationException("dubbo 2.6 does not support application scope routing rule");
         }
-        routeService.createConditionRoute(routeDTO, serviceVersion, serviceGroup);
+        routeService.createConditionRoute(routeDTO);
         return true;
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
-    public boolean updateRule(@PathVariable String id, @RequestBody ConditionRouteDTO newConditionRoute, @PathVariable String env,
-                              @RequestParam(required = false) String serviceVersion,
-                              @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);
-        ConditionRouteDTO oldConditionRoute = routeService.findConditionRoute(crDTO);
+    public boolean updateRule(@PathVariable String id, @RequestBody ConditionRouteDTO newConditionRoute, @PathVariable String env) {
+        ConditionRouteDTO oldConditionRoute = routeService.findConditionRoute(id);
         if (oldConditionRoute == null) {
             throw new ResourceNotFoundException("can not find route rule for: " + id);
         }
-        routeService.updateConditionRoute(newConditionRoute, serviceVersion, serviceGroup);
+        routeService.updateConditionRoute(newConditionRoute);
         return true;
     }
 
     @RequestMapping(method = RequestMethod.GET)
-    public List<ConditionRouteResultDTO> searchRoutes(@RequestParam(required = false) String application,
+    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) {
-        ConditionRouteResultDTO conditionRoute;
-        List<ConditionRouteResultDTO> result = new ArrayList<>();
+        ConditionRouteDTO conditionRoute;
+        List<ConditionRouteDTO> result = new ArrayList<>();
         ConditionRouteDTO crDTO = new ConditionRouteDTO();
         if (StringUtils.isNotBlank(application)) {
-            crDTO.setService(application);
+            crDTO.setApplication(application);
             conditionRoute = routeService.findConditionRoute(crDTO);
         } else if (StringUtils.isNotBlank(service)) {
             crDTO.setService(service);
-            String id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
-            conditionRoute = routeService.findConditionRoute(id);
+            crDTO.setServiceVersion(serviceVersion);
+            crDTO.setServiceGroup(serviceGroup);
+            conditionRoute = routeService.findConditionRoute(crDTO);
         } else {
             throw new ParamValidationException("Either Service or application is required.");
         }
@@ -116,18 +103,8 @@
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    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);
-        if (Constants.SERVICE.equals(scope)) {
-            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
-            crDTO.setService(id);
-        }
-        ConditionRouteResultDTO conditionRoute = routeService.findConditionRoute(crDTO);
+    public ConditionRouteDTO detailRoute(@PathVariable String id, @PathVariable String env) {
+        ConditionRouteDTO conditionRoute = routeService.findConditionRoute(id);
         if (conditionRoute == null || conditionRoute.getConditions() == null) {
             throw new ResourceNotFoundException("Unknown ID!");
         }
@@ -135,50 +112,20 @@
     }
 
     @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 String scope) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
-        ConditionRouteDTO crDTO = new ConditionRouteDTO();
-        crDTO.setService(id);
-        if (Constants.SERVICE.equals(scope)) {
-            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
-            crDTO.setService(id);
-        }
-        routeService.deleteConditionRoute(crDTO);
+    public boolean deleteRoute(@PathVariable String id, @PathVariable String env) {
+        routeService.deleteConditionRoute(id);
         return true;
     }
 
     @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 String scope) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
-        ConditionRouteDTO crDTO = new ConditionRouteDTO();
-        crDTO.setService(id);
-        if (Constants.SERVICE.equals(scope)) {
-            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
-            crDTO.setService(id);
-        }
-        routeService.enableConditionRoute(crDTO);
+    public boolean enableRoute(@PathVariable String id) {
+        routeService.enableConditionRoute(id);
         return true;
     }
 
     @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 String scope) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
-        ConditionRouteDTO crDTO = new ConditionRouteDTO();
-        crDTO.setService(id);
-        if (Constants.SERVICE.equals(scope)) {
-            id = ConvertUtil.getIdFromDTO(crDTO, serviceVersion, serviceGroup);
-            crDTO.setService(id);
-        }
-        routeService.disableConditionRoute(crDTO);
+    public boolean disableRoute(@PathVariable String id, @PathVariable String env) {
+        routeService.disableConditionRoute(id);
         return true;
     }
 
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java
index d0f525e..b6cf124 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java
@@ -23,7 +23,7 @@
 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.BalancingDTO;
 import org.apache.dubbo.admin.service.OverrideService;
 import org.apache.dubbo.admin.service.ProviderService;
@@ -73,7 +73,6 @@
         if (id == null) {
             throw new ParamValidationException("Unknown ID!");
         }
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         BalancingDTO balancing = overrideService.findBalance(id);
         if (balancing == null) {
             throw new ResourceNotFoundException("Unknown ID!");
@@ -86,7 +85,9 @@
     @RequestMapping(method = RequestMethod.GET)
     public List<BalancingDTO> searchLoadbalances(@RequestParam(required = false) String service,
                                                  @RequestParam(required = false) String application,
-                                                 @PathVariable String env) {
+                                                 @PathVariable String env,
+                                                 @RequestParam(required = false) String serviceVersion,
+                                                 @RequestParam(required = false) String serviceGroup) {
 
         if (StringUtils.isBlank(service) && StringUtils.isBlank(application)) {
             throw new ParamValidationException("Either service or application is required");
@@ -95,7 +96,12 @@
         if (StringUtils.isNotBlank(application)) {
             balancingDTO = overrideService.findBalance(application);
         } else {
-            balancingDTO = overrideService.findBalance(service);
+            BalancingDTO dto = new BalancingDTO();
+            dto.setService(service);
+            dto.setServiceVersion(serviceVersion);
+            dto.setServiceGroup(serviceGroup);
+            String id = ConvertUtil.getIdFromDTO(dto);
+            balancingDTO = overrideService.findBalance(id);
         }
         List<BalancingDTO> balancingDTOS = new ArrayList<>();
         if (balancingDTO != null) {
@@ -106,7 +112,6 @@
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public BalancingDTO detailLoadBalance(@PathVariable String id, @PathVariable String env) throws ParamValidationException {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         BalancingDTO balancingDTO = overrideService.findBalance(id);
         if (balancingDTO == null) {
             throw new ResourceNotFoundException("Unknown ID!");
@@ -119,7 +124,6 @@
         if (id == null) {
             throw new IllegalArgumentException("Argument of id is null!");
         }
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         overrideService.deleteBalance(id);
         return true;
     }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
index 39667d9..6e2cfbe 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
@@ -23,7 +23,7 @@
 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.DynamicConfigDTO;
 import org.apache.dubbo.admin.service.OverrideService;
 import org.apache.dubbo.admin.service.ProviderService;
@@ -70,7 +70,6 @@
 
     @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
     public boolean updateOverride(@PathVariable String id, @RequestBody DynamicConfigDTO overrideDTO, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         DynamicConfigDTO old = overrideService.findOverride(id);
         if (old == null) {
             throw new ResourceNotFoundException("Unknown ID!");
@@ -82,11 +81,18 @@
     @RequestMapping(method = RequestMethod.GET)
     public List<DynamicConfigDTO> searchOverride(@RequestParam(required = false) String service,
                                                  @RequestParam(required = false) String application,
-                                                 @PathVariable String env) {
-        DynamicConfigDTO override = null;
+                                                 @PathVariable String env,
+                                                 @RequestParam(required = false) String serviceVersion,
+                                                 @RequestParam(required = false) String serviceGroup) {
+        DynamicConfigDTO override;
         List<DynamicConfigDTO> result = new ArrayList<>();
         if (StringUtils.isNotBlank(service)) {
-            override = overrideService.findOverride(service);
+            DynamicConfigDTO configDTO = new DynamicConfigDTO();
+            configDTO.setService(service);
+            configDTO.setServiceVersion(serviceVersion);
+            configDTO.setServiceGroup(serviceGroup);
+            String id = ConvertUtil.getIdFromDTO(configDTO);
+            override = overrideService.findOverride(id);
         } else if(StringUtils.isNotBlank(application)){
             override = overrideService.findOverride(application);
         } else {
@@ -100,34 +106,27 @@
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public DynamicConfigDTO detailOverride(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         DynamicConfigDTO override = overrideService.findOverride(id);
         if (override == null) {
             throw new ResourceNotFoundException("Unknown ID!");
         }
-
         return override;
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public boolean deleteOverride(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         overrideService.deleteOverride(id);
         return true;
     }
 
     @RequestMapping(value = "/enable/{id}", method = RequestMethod.PUT)
     public boolean enableRoute(@PathVariable String id, @PathVariable String env) {
-
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         overrideService.enableOverride(id);
         return true;
     }
 
     @RequestMapping(value = "/disable/{id}", method = RequestMethod.PUT)
     public boolean disableRoute(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
-
         overrideService.disableOverride(id);
         return true;
     }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/WeightController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/WeightController.java
index d6cbc4c..4be7d02 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/WeightController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/WeightController.java
@@ -23,7 +23,7 @@
 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.WeightDTO;
 import org.apache.dubbo.admin.service.OverrideService;
 import org.apache.dubbo.admin.service.ProviderService;
@@ -72,7 +72,6 @@
         if (id == null) {
             throw new ParamValidationException("Unknown ID!");
         }
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         WeightDTO weight = overrideService.findWeight(id);
         if (weight == null) {
             throw new ResourceNotFoundException("Unknown ID!");
@@ -84,7 +83,9 @@
     @RequestMapping(method = RequestMethod.GET)
     public List<WeightDTO> searchWeight(@RequestParam(required = false) String service,
                                         @RequestParam(required = false) String application,
-                                        @PathVariable String env) {
+                                        @PathVariable String env,
+                                        @RequestParam(required = false) String serviceVersion,
+                                        @RequestParam(required = false) String serviceGroup) {
         if (StringUtils.isBlank(service) && StringUtils.isBlank(application)) {
             throw new ParamValidationException("Either service or application is required");
         }
@@ -92,7 +93,12 @@
         if (StringUtils.isNotBlank(application)) {
             weightDTO = overrideService.findWeight(application);
         } else {
-            weightDTO = overrideService.findWeight(service);
+            WeightDTO dto = new WeightDTO();
+            dto.setService(service);
+            dto.setServiceVersion(serviceVersion);
+            dto.setServiceGroup(serviceGroup);
+            String id = ConvertUtil.getIdFromDTO(dto);
+            weightDTO = overrideService.findWeight(id);
         }
         List<WeightDTO> weightDTOS = new ArrayList<>();
         if (weightDTO != null) {
@@ -104,7 +110,6 @@
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public WeightDTO detailWeight(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         WeightDTO weightDTO = overrideService.findWeight(id);
         if (weightDTO == null) {
             throw new ResourceNotFoundException("Unknown ID!");
@@ -114,7 +119,6 @@
 
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public boolean deleteWeight(@PathVariable String id, @PathVariable String env) {
-        id = id.replace(Constants.ANY_VALUE, Constants.PATH_SEPARATOR);
         overrideService.deleteWeight(id);
         return true;
     }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/BaseDTO.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/BaseDTO.java
index 223b25f..61f1f92 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/BaseDTO.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/BaseDTO.java
@@ -24,6 +24,9 @@
 public abstract class BaseDTO {
     private String application;
     private String service;
+    private String id;
+    private String serviceVersion;
+    private String serviceGroup;
 
     public String getApplication() {
         return application;
@@ -40,4 +43,28 @@
     public void setService(String service) {
         this.service = service;
     }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    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;
+    }
 }
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
deleted file mode 100644
index 2f9d247..0000000
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/model/dto/ConditionRouteResultDTO.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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/service/RouteService.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/RouteService.java
index ef42f25..2807665 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,7 +18,6 @@
 
 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;
 
 /**
@@ -27,11 +26,11 @@
  */
 public interface RouteService {
 
-    void createConditionRoute(ConditionRouteDTO conditionRoute, String serviceVersion, String serviceGroup);
+    void createConditionRoute(ConditionRouteDTO conditionRoute);
 
-    void updateConditionRoute(ConditionRouteDTO newConditionRoute, String serviceVersion, String serviceGroup);
+    void updateConditionRoute(ConditionRouteDTO newConditionRoute);
 
-    void deleteConditionRoute(ConditionRouteDTO conditionRoute);
+    void deleteConditionRoute(String id);
 
     void deleteAccess(String id);
 
@@ -41,15 +40,15 @@
 
     void updateAccess(AccessDTO accessDTO);
 
-    void enableConditionRoute(ConditionRouteDTO conditionRoute);
+    void enableConditionRoute(String id);
 
 
-    void disableConditionRoute(ConditionRouteDTO conditionRoute);
+    void disableConditionRoute(String id);
 
 
-    ConditionRouteResultDTO findConditionRoute(ConditionRouteDTO crDTO);
+    ConditionRouteDTO findConditionRoute(ConditionRouteDTO crDTO);
 
-    ConditionRouteResultDTO findConditionRoute(String id);
+    ConditionRouteDTO findConditionRoute(String id);
 
     void createTagRoute(TagRouteDTO tagRoute);
 
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java
index e63e846..1bc018e 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java
@@ -142,7 +142,7 @@
         }
 
         //for 2.6
-        if (overrideDTO.getScope().equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
             List<Override> overrides = convertDTOtoOldOverride(old);
             for (Override o : overrides) {
                 registry.unregister(o.toUrl().addParameter(Constants.COMPATIBLE_CONFIG, true));
@@ -166,7 +166,7 @@
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(override));
 
         //2.6
-        if (override.getScope().equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(override.getScope())) {
             List<Override> overrides = convertDTOtoOldOverride(old);
             for (Override o : overrides) {
                 o.setEnabled(false);
@@ -193,7 +193,7 @@
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(override));
 
         //for 2.6
-        if (override.getScope().equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(override.getScope())) {
             List<Override> overrides = convertDTOtoOldOverride(old);
             for (Override o : overrides) {
                 o.setEnabled(true);
@@ -213,7 +213,14 @@
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             OverrideDTO overrideDTO = YamlParser.loadObject(config, OverrideDTO.class);
-            return OverrideUtils.createFromOverride(overrideDTO);
+            DynamicConfigDTO dynamicConfigDTO = OverrideUtils.createFromOverride(overrideDTO);
+            if (dynamicConfigDTO != null) {
+                dynamicConfigDTO.setId(id);
+                if (Constants.SERVICE.equals(overrideDTO.getScope())) {
+                    ConvertUtil.detachIdToService(id, dynamicConfigDTO);
+                }
+            }
+            return dynamicConfigDTO;
         }
         return null;
     }
@@ -229,7 +236,7 @@
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(overrideDTO));
 
         //for 2.6
-        if (scope.equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(scope)) {
             registerWeight(weightDTO);
         }
 
@@ -248,7 +255,7 @@
             if (configs != null && configs.size() > 0) {
                 for (OverrideConfig overrideConfig : configs) {
                     if (Constants.WEIGHT.equals(overrideConfig.getType())) {
-                        if (overrideDTO.getScope().equals(Constants.SERVICE)) {
+                        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
                             oldWeight = OverrideUtils.configtoWeightDTO(overrideConfig, scope, id);
                         }
                         int index = configs.indexOf(overrideConfig);
@@ -285,7 +292,7 @@
             if (configs != null) {
                 for (OverrideConfig overrideConfig : configs) {
                     if (Constants.WEIGHT.equals(overrideConfig.getType())) {
-                        if (overrideDTO.getScope().equals(Constants.SERVICE)) {
+                        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
                             oldConfig = overrideConfig;
                         }
                         configs.remove(overrideConfig);
@@ -320,6 +327,10 @@
                 for (OverrideConfig overrideConfig : configs) {
                     if (Constants.WEIGHT.equals(overrideConfig.getType())) {
                         WeightDTO weightDTO = OverrideUtils.configtoWeightDTO(overrideConfig, overrideDTO.getScope(), id);
+                        weightDTO.setId(id);
+                        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
+                            ConvertUtil.detachIdToService(id, weightDTO);
+                        }
                         return weightDTO;
                     }
                 }
@@ -340,7 +351,7 @@
 
         //for 2.6
 
-        if (scope.equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(scope)) {
             registerBalancing(balancingDTO);
         }
     }
@@ -358,7 +369,7 @@
             if (configs != null && configs.size() > 0) {
                 for (OverrideConfig overrideConfig : configs) {
                     if (Constants.BALANCING.equals(overrideConfig.getType())) {
-                        if (overrideDTO.getScope().equals(Constants.SERVICE)) {
+                        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
                             oldBalancing = OverrideUtils.configtoBalancingDTO(overrideConfig, Constants.SERVICE, overrideDTO.getKey());
                         }
                         int index = configs.indexOf(overrideConfig);
@@ -393,7 +404,7 @@
             if (configs != null) {
                 for (OverrideConfig overrideConfig : configs) {
                     if (Constants.BALANCING.equals(overrideConfig.getType())) {
-                        if (overrideDTO.getScope().equals(Constants.SERVICE)) {
+                        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
                             oldConfig = overrideConfig;
                         }
                         configs.remove(overrideConfig);
@@ -426,6 +437,10 @@
                 for (OverrideConfig overrideConfig : configs) {
                     if (Constants.BALANCING.equals(overrideConfig.getType())) {
                         BalancingDTO balancingDTO = OverrideUtils.configtoBalancingDTO(overrideConfig, overrideDTO.getScope(), id);
+                        balancingDTO.setId(id);
+                        if (Constants.SERVICE.equals(overrideDTO.getScope())) {
+                            ConvertUtil.detachIdToService(id, balancingDTO);
+                        }
                         return balancingDTO;
                     }
                 }
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 a365eef..788c7d3 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,14 +24,12 @@
 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;
@@ -43,8 +41,8 @@
     private String prefix = Constants.CONFIG_KEY;
 
     @Override
-    public void createConditionRoute(ConditionRouteDTO conditionRoute, String serviceVersion, String serviceGroup) {
-        String id = ConvertUtil.getIdFromDTO(conditionRoute, serviceVersion, serviceGroup);
+    public void createConditionRoute(ConditionRouteDTO conditionRoute) {
+        String id = ConvertUtil.getIdFromDTO(conditionRoute);
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String existConfig = dynamicConfiguration.getConfig(path);
         RoutingRule existRule = null;
@@ -65,8 +63,8 @@
     }
 
     @Override
-    public void updateConditionRoute(ConditionRouteDTO newConditionRoute, String serviceVersion, String serviceGroup) {
-        String id = ConvertUtil.getIdFromDTO(newConditionRoute, serviceVersion, serviceGroup);
+    public void updateConditionRoute(ConditionRouteDTO newConditionRoute) {
+        String id = ConvertUtil.getIdFromDTO(newConditionRoute);
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String existConfig = dynamicConfiguration.getConfig(path);
         if (existConfig == null) {
@@ -89,8 +87,7 @@
     }
 
     @Override
-    public void deleteConditionRoute(ConditionRouteDTO conditionRoute) {
-        String id = ConvertUtil.getIdFromDTO(conditionRoute);
+    public void deleteConditionRoute(String id) {
         String path = getPath(id, Constants.CONDITION_ROUTE);
 
         String config = dynamicConfiguration.getConfig(path);
@@ -107,7 +104,7 @@
         }
 
         //for 2.6
-        if (route.getScope().equals(Constants.SERVICE)) {
+        if (Constants.SERVICE.equals(route.getScope())) {
             RoutingRule originRule = YamlParser.loadObject(config, RoutingRule.class);
             ConditionRouteDTO conditionRouteDTO = RouteUtils.createConditionRouteFromRule(originRule);
             for (Route old : convertRouteToOldRoute(conditionRouteDTO)) {
@@ -131,7 +128,7 @@
                 dynamicConfiguration.setConfig(path, YamlParser.dumpObject(ruleDTO));
             }
             //2.6
-            if (ruleDTO.getScope().equals(Constants.SERVICE) && blackWhiteList.size() > 0) {
+            if (Constants.SERVICE.equals(ruleDTO.getScope()) && blackWhiteList.size() > 0) {
                 Route route = RouteUtils.convertBlackWhiteListtoRoute(blackWhiteList, Constants.SERVICE, id);
                 registry.unregister(route.toUrl());
             }
@@ -180,7 +177,12 @@
         if (config != null) {
             RoutingRule ruleDTO = YamlParser.loadObject(config, RoutingRule.class);
             List<String> blackWhiteList = RouteUtils.filterBlackWhiteListFromConditions(ruleDTO.getConditions());
-            return RouteUtils.convertToAccessDTO(blackWhiteList, ruleDTO.getScope(), ruleDTO.getKey());
+            AccessDTO accessDTO = RouteUtils.convertToAccessDTO(blackWhiteList, ruleDTO.getScope(), ruleDTO.getKey());
+            accessDTO.setId(id);
+            if (Constants.SERVICE.equals(ruleDTO.getScope())) {
+                ConvertUtil.detachIdToService(id, accessDTO);
+            }
+            return accessDTO;
         }
         return null;
     }
@@ -211,22 +213,21 @@
     }
 
     @Override
-    public void enableConditionRoute(ConditionRouteDTO conditionRoute) {
-        String id = ConvertUtil.getIdFromDTO(conditionRoute);
+    public void enableConditionRoute(String id) {
         String path = getPath(id, Constants.CONDITION_ROUTE);
 
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             RoutingRule ruleDTO = YamlParser.loadObject(config, RoutingRule.class);
 
-            if (ruleDTO.getScope().equals(Constants.SERVICE)) {
+            if (Constants.SERVICE.equals(ruleDTO.getScope())) {
                 //for2.6
-            	for (Route oldRoute : convertRouteToOldRoute(RouteUtils.createConditionRouteFromRule(ruleDTO))) {
-	                URL oldURL = oldRoute.toUrl();
-	                registry.unregister(oldURL);
-	                oldURL = oldURL.addParameter("enabled", true);
-	                registry.register(oldURL);
-            	}
+                for (Route oldRoute : convertRouteToOldRoute(RouteUtils.createConditionRouteFromRule(ruleDTO))) {
+                    URL oldURL = oldRoute.toUrl();
+                    registry.unregister(oldURL);
+                    oldURL = oldURL.addParameter("enabled", true);
+                    registry.register(oldURL);
+                }
             }
 
             //2.7
@@ -237,15 +238,14 @@
     }
 
     @Override
-    public void disableConditionRoute(ConditionRouteDTO conditionRoute) {
-        String id = ConvertUtil.getIdFromDTO(conditionRoute);
+    public void disableConditionRoute(String id) {
         String path = getPath(id, Constants.CONDITION_ROUTE);
 
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             RoutingRule routeRule = YamlParser.loadObject(config, RoutingRule.class);
 
-            if (routeRule.getScope().equals(Constants.SERVICE)) {
+            if (Constants.SERVICE.equals(routeRule.getScope())) {
                 //for 2.6
             	for (Route oldRoute : convertRouteToOldRoute(RouteUtils.createConditionRouteFromRule(routeRule))) {
 	                URL oldURL = oldRoute.toUrl();
@@ -263,12 +263,12 @@
     }
 
     @Override
-    public ConditionRouteResultDTO findConditionRoute(ConditionRouteDTO crDTO) {
+    public ConditionRouteDTO findConditionRoute(ConditionRouteDTO crDTO) {
         return findConditionRoute(ConvertUtil.getIdFromDTO(crDTO));
     }
 
     @Override
-    public ConditionRouteResultDTO findConditionRoute(String id) {
+    public ConditionRouteDTO findConditionRoute(String id) {
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
@@ -278,17 +278,15 @@
             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) {
-                result.setServiceVersion(detachResult[1]);
+                conditionRouteDTO.setServiceVersion(detachResult[1]);
             }
             if (detachResult.length > 2) {
-                result.setServiceGroup(detachResult[2]);
+                conditionRouteDTO.setServiceGroup(detachResult[2]);
             }
-            return result;
+            conditionRouteDTO.setId(id);
+            return conditionRouteDTO;
         }
         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 979ea81..c1f3de3 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
@@ -20,8 +20,9 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.dubbo.admin.AbstractSpringIntegrationTest;
+import org.apache.dubbo.admin.common.util.ConvertUtil;
 import org.apache.dubbo.admin.model.dto.AccessDTO;
-import org.apache.dubbo.admin.model.dto.ConditionRouteResultDTO;
+import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
 import org.apache.dubbo.admin.service.ConsumerService;
 import org.apache.dubbo.admin.service.RouteService;
 import org.junit.After;
@@ -79,7 +80,10 @@
 
         // when service is present
         String service = "serviceName";
-        when(routeService.findAccess(service)).thenReturn(accessDTO);
+        AccessDTO dto = new AccessDTO();
+        dto.setService(service);
+        String id = ConvertUtil.getIdFromDTO(dto);
+        when(routeService.findAccess(id)).thenReturn(accessDTO);
         response = restTemplate.getForEntity(url("/api/{env}/rules/access?service={service}"), String.class, env, service);
         exceptResponseBody = objectMapper.writeValueAsString(Collections.singletonList(accessDTO));
         assertEquals(exceptResponseBody, response.getBody());
@@ -130,7 +134,7 @@
         restTemplate.put(url("/api/{env}/rules/access/{id}"), accessDTO, env, id);
         verify(routeService).findConditionRoute(id);
         //
-        ConditionRouteResultDTO conditionRouteDTO = mock(ConditionRouteResultDTO.class);
+        ConditionRouteDTO conditionRouteDTO = mock(ConditionRouteDTO.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 5cff7bb..6b21059 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
@@ -18,6 +18,7 @@
 package org.apache.dubbo.admin.controller;
 
 import org.apache.dubbo.admin.AbstractSpringIntegrationTest;
+import org.apache.dubbo.admin.common.util.ConvertUtil;
 import org.apache.dubbo.admin.common.util.YamlParser;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
 import org.apache.dubbo.admin.model.store.RoutingRule;
@@ -130,9 +131,10 @@
     dto.setConditions(newConditions);
     dto.setService(service);
 
+    String id = ConvertUtil.getIdFromDTO(dto);
     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/{id}"), HttpMethod.PUT,
+        new HttpEntity<>(dto, null), String.class, env, id
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
 
@@ -191,9 +193,12 @@
 
     assertNotNull("zk path should not be null before deleting", zkClient.checkExists().forPath(path));
 
+    ConditionRouteDTO dto = new ConditionRouteDTO();
+    dto.setService(service);
+    String id = ConvertUtil.getIdFromDTO(dto);
     ResponseEntity<String> responseEntity = restTemplate.exchange(
-            url("/api/{env}/rules/route/condition/{service}" + "?scope=service"), HttpMethod.DELETE,
-            null, String.class, env, service
+            url("/api/{env}/rules/route/condition/{id}" + "?scope=service"), HttpMethod.DELETE,
+            null, String.class, env, id
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
 
@@ -251,8 +256,11 @@
     zkClient.create().creatingParentContainersIfNeeded().forPath(path);
     zkClient.setData().forPath(path, content.getBytes());
 
+    ConditionRouteDTO dto = new ConditionRouteDTO();
+    dto.setService(service);
+    String id = ConvertUtil.getIdFromDTO(dto);
     ResponseEntity<ConditionRouteDTO> responseEntity = restTemplate.getForEntity(
-        url("/api/{env}/rules/route/condition/{id}" + "?scope=service"), ConditionRouteDTO.class, env, service
+        url("/api/{env}/rules/route/condition/{id}" + "?scope=service"), ConditionRouteDTO.class, env, id
     );
     assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
 
@@ -310,7 +318,10 @@
     RoutingRule rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
     assertFalse(rule.isEnabled());
 
-    restTemplate.put(url("/api/{env}/rules/route/condition/enable/{id}" + "?scope=service"), null, env, service);
+    ConditionRouteDTO dto = new ConditionRouteDTO();
+    dto.setService(service);
+    String id = ConvertUtil.getIdFromDTO(dto);
+    restTemplate.put(url("/api/{env}/rules/route/condition/enable/{id}" + "?scope=service"), null, env, id);
 
     bytes = zkClient.getData().forPath(path);
     updatedConfig = new String(bytes);
@@ -368,7 +379,10 @@
     RoutingRule rule = YamlParser.loadObject(updatedConfig, RoutingRule.class);
     assertTrue(rule.isEnabled());
 
-    restTemplate.put(url("/api/{env}/rules/route/condition/disable/{id}" + "?scope=service"), null, env, service);
+    ConditionRouteDTO dto = new ConditionRouteDTO();
+    dto.setService(service);
+    String id = ConvertUtil.getIdFromDTO(dto);
+    restTemplate.put(url("/api/{env}/rules/route/condition/disable/{id}" + "?scope=service"), null, env, id);
 
     bytes = zkClient.getData().forPath(path);
     updatedConfig = new String(bytes);
@@ -397,7 +411,10 @@
     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);
+    ConditionRouteDTO dto = new ConditionRouteDTO();
+    dto.setApplication(application);
+    String id = ConvertUtil.getIdFromDTO(dto);
+    restTemplate.put(url("/api/{env}/rules/route/condition/disable/{id}" + "?scope=application"), null, env, id);
 
     bytes = zkClient.getData().forPath(path);
     updatedConfig = new String(bytes);
diff --git a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/LoadBalanceControllerTest.java b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/LoadBalanceControllerTest.java
index acade40..b47b610 100644
--- a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/LoadBalanceControllerTest.java
+++ b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/controller/LoadBalanceControllerTest.java
@@ -19,6 +19,7 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.dubbo.admin.AbstractSpringIntegrationTest;
+import org.apache.dubbo.admin.common.util.ConvertUtil;
 import org.apache.dubbo.admin.model.dto.BalancingDTO;
 import org.apache.dubbo.admin.service.OverrideService;
 import org.apache.dubbo.admin.service.ProviderService;
@@ -111,7 +112,10 @@
         // service is valid
         response = restTemplate.getForEntity(url("/api/{env}/rules/balancing?service={service}&application={application}"), String.class, env, service, null);
         assertEquals(HttpStatus.OK, response.getStatusCode());
-        verify(overrideService).findBalance(service);
+        BalancingDTO dto = new BalancingDTO();
+        dto.setService(service);
+        String id = ConvertUtil.getIdFromDTO(dto);
+        verify(overrideService).findBalance(id);
         // application is valid
         response = restTemplate.getForEntity(url("/api/{env}/rules/balancing?service={service}&application={application}"), String.class, env, null, application);
         assertEquals(HttpStatus.OK, response.getStatusCode());
diff --git a/dubbo-admin-ui/src/components/governance/AccessControl.vue b/dubbo-admin-ui/src/components/governance/AccessControl.vue
index 157a120..c165510 100644
--- a/dubbo-admin-ui/src/components/governance/AccessControl.vue
+++ b/dubbo-admin-ui/src/components/governance/AccessControl.vue
@@ -53,6 +53,18 @@
                     </v-list-tile>
                   </v-list>
                 </v-menu>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Version"
+                  :hint="$t('dataIdVersionHint')"
+                  v-model="serviceVersion4Search"
+                ></v-text-field>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Group"
+                  :hint="$t('dataIdGroupHint')"
+                  v-model="serviceGroup4Search"
+                ></v-text-field>
                 <v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
 
               </v-layout>
@@ -77,7 +89,7 @@
                  class="mb-2">{{$t('create')}}</v-btn>
         </v-toolbar>
 
-        <v-card-text class="pa-0" v-show="selected == 0">
+        <v-card-text class="pa-0" v-show="selected === 0">
           <v-data-table :headers="serviceHeaders"
                         :items="accesses"
                         :loading="loading"
@@ -115,7 +127,7 @@
             </template>
           </v-data-table>
         </v-card-text>
-        <v-card-text class="pa-0" v-show="selected == 1">
+        <v-card-text class="pa-0" v-show="selected === 1">
           <v-data-table :headers="appHeaders"
                         :items="accesses"
                         :loading="loading"
@@ -165,12 +177,29 @@
         </v-card-title>
         <v-card-text>
           <v-form ref="modalForm">
-            <v-text-field
-              label="Service Unique ID"
-              :hint="$t('dataIdHint')"
-              :readonly="modal.readonly"
-              v-model="modal.service"
-            ></v-text-field>
+            <v-layout wrap>
+              <v-flex xs24 sm12 md8>
+                <v-text-field
+                  label="Service class"
+                  :hint="$t('dataIdClassHint')"
+                  v-model="modal.service"
+                ></v-text-field>
+              </v-flex>
+              <v-flex xs6 sm3 md2>
+                <v-text-field
+                  label="Version"
+                  :hint="$t('dataIdVersionHint')"
+                  v-model="modal.serviceVersion"
+                ></v-text-field>
+              </v-flex>
+              <v-flex xs6 sm3 md2>
+                <v-text-field
+                  label="Group"
+                  :hint="$t('dataIdGroupHint')"
+                  v-model="modal.serviceGroup"
+                ></v-text-field>
+              </v-flex>
+            </v-layout>
             <v-text-field
               :label="$t('appName')"
               :hint="$t('appNameHint')"
@@ -192,7 +221,7 @@
                   :label="$t('blackList')"
                   :hint="$t('blackListHint')"
                   v-model="modal.blackList"
-                  :readonly="modal.id != null">
+                  :readonly="modal.readonly">
                 </v-text-field>
               </v-flex>
             </v-layout>
@@ -262,6 +291,8 @@
     typeAhead: [],
     input: null,
     timerID: null,
+    serviceVersion4Search: '',
+    serviceGroup4Search: '',
     modal: {
       enable: false,
       readonly: false,
@@ -270,6 +301,8 @@
       click: () => {},
       id: null,
       service: null,
+      serviceVersion: '',
+      serviceGroup: '',
       application: null,
       content: '',
       blackList: '',
@@ -360,7 +393,11 @@
         if (this.selected === 0) {
           this.$router.push({
             path: 'access',
-            query: {service: this.filter}
+            query: {
+              service: this.filter,
+              serviceVersion: this.serviceVersion4Search,
+              serviceGroup: this.serviceGroup4Search
+            }
           })
         } else if (this.selected === 1) {
           this.$router.push({
@@ -369,7 +406,7 @@
           })
         }
       }
-      let url = '/rules/access/?' + type + '=' + this.filter
+      let url = '/rules/access/?' + type + '=' + this.filter + '&serviceVersion=' + this.serviceVersion4Search + '&serviceGroup=' + this.serviceGroup4Search
       this.$axios.get(url)
         .then(response => {
           this.accesses = response.data
@@ -416,6 +453,8 @@
       }
       this.$axios.post('/rules/access', {
         service: this.modal.service,
+        serviceVersion: this.modal.serviceVersion,
+        serviceGroup: this.modal.serviceGroup,
         application: this.modal.application,
         whitelist: whiteList,
         blacklist: blackList
@@ -435,23 +474,16 @@
       }).catch(error => this.showSnackbar('error', error.response.data.message))
     },
     toEdit (item, readonly) {
-      let itemId = null
-      if (this.selected === 0) {
-        itemId = item.service
-      } else {
-        itemId = item.application
-      }
-      if (itemId.includes('/')) {
-        itemId = itemId.replace('/', '*')
-      }
       Object.assign(this.modal, {
         enable: true,
         readonly: readonly,
         title: 'Edit',
         saveBtn: 'Update',
         click: this.editItem,
-        id: itemId,
+        id: item.id,
         service: item.service,
+        serviceVersion: item.serviceVersion,
+        serviceGroup: item.serviceGroup,
         application: item.application,
         whiteList: item.whitelist,
         blackList: item.blacklist
@@ -460,14 +492,22 @@
     },
     editItem () {
       // let doc = yaml.load(this.modal.content)
-      let blackList = this.modal.blackList.split(',')
-      let whiteList = this.modal.whiteList.split(',')
+      let blackList = []
+      if (this.modal.blackList) {
+        blackList = this.modal.blackList.split(',')
+      }
+      let whiteList = []
+      if (this.modal.whiteList) {
+        whiteList = this.modal.whiteList.split(',')
+      }
       let vm = this
       this.$axios.put('/rules/access/' + this.modal.id, {
         whitelist: whiteList,
         blacklist: blackList,
         application: this.modal.application,
-        service: this.modal.service
+        service: this.modal.service,
+        serviceVersion: this.modal.serviceVersion,
+        serviceGroup: this.modal.serviceGroup
 
       }).then(response => {
         if (response.status === 200) {
@@ -485,20 +525,11 @@
       }).catch(error => this.showSnackbar('error', error.response.data.message))
     },
     toDelete (item) {
-      let itemId = null
-      if (this.selected === 0) {
-        itemId = item.service
-      } else {
-        itemId = item.application
-      }
-      if (itemId.includes('/')) {
-        itemId = itemId.replace('/', '*')
-      }
       Object.assign(this.confirm, {
         enable: true,
         title: 'warnDeleteAccessControl',
-        text: `Id: ${itemId}`,
-        id: itemId
+        text: `Id: ${item.id}`,
+        id: item.id
       })
     },
     deleteItem (id) {
@@ -536,14 +567,28 @@
     this.$store.dispatch('loadServiceItems')
     this.$store.dispatch('loadConsumerItems')
     let query = this.$route.query
+    let queryServiceVersion = null
+    let queryServiceGroup = null
     if ('service' in query) {
       this.filter = query['service']
+      if (query.serviceVersion) {
+        queryServiceVersion = query.serviceVersion
+      }
+      if (query.serviceGroup) {
+        queryServiceGroup = query.serviceGroup
+      }
       this.selected = 0
     }
     if ('application' in query) {
       this.filter = query['application']
       this.selected = 1
     }
+    if (queryServiceVersion != null) {
+      this.serviceVersion4Search = query.serviceVersion
+    }
+    if (queryServiceGroup != null) {
+      this.serviceGroup4Search = query.serviceGroup
+    }
     if (this.filter !== null) {
       this.search()
     }
diff --git a/dubbo-admin-ui/src/components/governance/LoadBalance.vue b/dubbo-admin-ui/src/components/governance/LoadBalance.vue
index 905a790..b950cbe 100644
--- a/dubbo-admin-ui/src/components/governance/LoadBalance.vue
+++ b/dubbo-admin-ui/src/components/governance/LoadBalance.vue
@@ -53,6 +53,18 @@
                     </v-list-tile>
                   </v-list>
                 </v-menu>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Version"
+                  :hint="$t('dataIdVersionHint')"
+                  v-model="serviceVersion4Search"
+                ></v-text-field>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Group"
+                  :hint="$t('dataIdGroupHint')"
+                  v-model="serviceGroup4Search"
+                ></v-text-field>
                 <v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
 
               </v-layout>
@@ -70,7 +82,7 @@
           <v-btn outline color="primary" @click.stop="openDialog" class="mb-2">{{$t('create')}}</v-btn>
         </v-toolbar>
 
-        <v-card-text class="pa-0" v-show="selected == 0">
+        <v-card-text class="pa-0" v-show="selected === 0">
           <v-data-table
             :headers="serviceHeaders"
             :items="loadBalances"
@@ -92,7 +104,7 @@
           </v-data-table>
         </v-card-text>
 
-        <v-card-text class="pa-0" v-show="selected == 1">
+        <v-card-text class="pa-0" v-show="selected === 1">
           <v-data-table
             :headers="appHeaders"
             :items="loadBalances"
@@ -122,12 +134,29 @@
           <span class="headline">{{$t('createNewLoadBalanceRule')}}</span>
         </v-card-title>
         <v-card-text >
-          <v-text-field
-            label="Service Unique ID"
-            :hint="$t('dataIdHint')"
-            v-model="service"
-            :readonly="readonly"
-          ></v-text-field>
+          <v-layout wrap>
+            <v-flex xs24 sm12 md8>
+              <v-text-field
+                label="Service class"
+                :hint="$t('dataIdClassHint')"
+                v-model="service"
+              ></v-text-field>
+            </v-flex>
+            <v-flex xs6 sm3 md2>
+              <v-text-field
+                label="Version"
+                :hint="$t('dataIdVersionHint')"
+                v-model="serviceVersion"
+              ></v-text-field>
+            </v-flex>
+            <v-flex xs6 sm3 md2>
+              <v-text-field
+                label="Group"
+                :hint="$t('dataIdGroupHint')"
+                v-model="serviceGroup"
+              ></v-text-field>
+            </v-flex>
+          </v-layout>
           <v-text-field
             :label="$t('appName')"
             :hint="$t('appNameHint')"
@@ -213,6 +242,10 @@
       warn: false,
       application: '',
       service: '',
+      serviceVersion4Search: '',
+      serviceGroup4Search: '',
+      serviceVersion: '',
+      serviceGroup: '',
       warnTitle: '',
       warnText: '',
       warnStatus: {},
@@ -327,7 +360,7 @@
           return
         }
         let type = this.items[this.selected].value
-        let url = '/rules/balancing/?' + type + '=' + this.filter
+        let url = '/rules/balancing/?' + type + '=' + this.filter + '&serviceVersion=' + this.serviceVersion4Search + '&serviceGroup=' + this.serviceGroup4Search
         this.$axios.get(url)
           .then(response => {
             this.loadBalances = response.data
@@ -374,6 +407,8 @@
         }
         let vm = this
         balancing.service = this.service
+        balancing.serviceVersion = this.serviceVersion
+        balancing.serviceGroup = this.serviceGroup
         balancing.application = this.application
         balancing.methodName = this.rule.method
         balancing.strategy = this.rule.strategy
@@ -419,15 +454,7 @@
         }
       },
       itemOperation: function (icon, item) {
-        let itemId = ''
-        if (this.selected === 0) {
-          itemId = item.service
-        } else {
-          itemId = item.application
-        }
-        if (itemId.includes('/')) {
-          itemId = itemId.replace('/', '*')
-        }
+        let itemId = item.id
         switch (icon) {
           case 'visibility':
             this.$axios.get('/rules/balancing/' + itemId)
@@ -454,6 +481,8 @@
       handleBalance: function (balancing, readonly) {
         this.service = balancing.service
         this.application = balancing.application
+        this.serviceVersion = balancing.serviceVersion
+        this.serviceGroup = balancing.serviceGroup
         // delete balancing.service
         // delete balancing.application
         // delete balancing.id
@@ -514,11 +543,19 @@
       this.$store.dispatch('loadAppItems')
       this.ruleText = this.template
       let query = this.$route.query
+      let queryServiceVersion = null
+      let queryServiceGroup = null
       let filter = null
       let vm = this
       Object.keys(query).forEach(function (key) {
         if (key === 'service') {
           filter = query[key]
+          if (query.serviceVersion) {
+            queryServiceVersion = query.serviceVersion
+          }
+          if (query.serviceGroup) {
+            queryServiceGroup = query.serviceGroup
+          }
           vm.selected = 0
         }
         if (key === 'application') {
@@ -526,6 +563,12 @@
           vm.selected = 1
         }
       })
+      if (queryServiceVersion != null) {
+        this.serviceVersion4Search = query.serviceVersion
+      }
+      if (queryServiceGroup != null) {
+        this.serviceGroup4Search = query.serviceGroup
+      }
       if (filter !== null) {
         this.filter = filter
         this.search(false)
diff --git a/dubbo-admin-ui/src/components/governance/Overrides.vue b/dubbo-admin-ui/src/components/governance/Overrides.vue
index 5ffedd4..629d142 100644
--- a/dubbo-admin-ui/src/components/governance/Overrides.vue
+++ b/dubbo-admin-ui/src/components/governance/Overrides.vue
@@ -53,6 +53,18 @@
                     </v-list-tile>
                   </v-list>
                 </v-menu>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Version"
+                  :hint="$t('dataIdVersionHint')"
+                  v-model="serviceVersion4Search"
+                ></v-text-field>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Group"
+                  :hint="$t('dataIdGroupHint')"
+                  v-model="serviceGroup4Search"
+                ></v-text-field>
                 <v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
 
               </v-layout>
@@ -70,7 +82,7 @@
           <v-btn outline color="primary" @click.stop="openDialog" class="mb-2">{{$t('create')}}</v-btn>
         </v-toolbar>
 
-        <v-card-text class="pa-0" v-show="selected == 0">
+        <v-card-text class="pa-0" v-show="selected === 0">
           <v-data-table
             :headers="serviceHeaders"
             :items="serviceConfigs"
@@ -91,7 +103,7 @@
           </v-data-table>
         </v-card-text>
 
-        <v-card-text class="pa-0" v-show="selected == 1">
+        <v-card-text class="pa-0" v-show="selected === 1">
           <v-data-table
             :headers="appHeaders"
             :items="appConfigs"
@@ -120,11 +132,29 @@
           <span class="headline">{{$t('createNewDynamicConfigRule')}}</span>
         </v-card-title>
         <v-card-text >
-          <v-text-field
-            label="Service Unique ID"
-            hint="A service ID in form of group/service:version, group and version are optional"
-            v-model="service"
-          ></v-text-field>
+          <v-layout wrap>
+            <v-flex xs24 sm12 md8>
+              <v-text-field
+                label="Service class"
+                :hint="$t('dataIdClassHint')"
+                v-model="service"
+              ></v-text-field>
+            </v-flex>
+            <v-flex xs6 sm3 md2>
+              <v-text-field
+                label="Version"
+                :hint="$t('dataIdVersionHint')"
+                v-model="serviceVersion"
+              ></v-text-field>
+            </v-flex>
+            <v-flex xs6 sm3 md2>
+              <v-text-field
+                label="Group"
+                :hint="$t('dataIdGroupHint')"
+                v-model="serviceGroup"
+              ></v-text-field>
+            </v-flex>
+          </v-layout>
           <v-text-field
             label="Application Name"
             hint="Application name the service belongs to"
@@ -194,6 +224,10 @@
       application: '',
       updateId: '',
       service: '',
+      serviceVersion: '',
+      serviceGroup: '',
+      serviceVersion4Search: '',
+      serviceGroup4Search: '',
       warnTitle: '',
       warnText: '',
       warnStatus: {},
@@ -282,7 +316,7 @@
           return
         }
         let type = this.items[this.selected].value
-        let url = '/rules/override/?' + type + '=' + this.filter
+        let url = '/rules/override/?' + type + '=' + this.filter + '&serviceVersion=' + this.serviceVersion4Search + '&serviceGroup=' + this.serviceGroup4Search
         this.$axios.get(url)
           .then(response => {
             if (this.selected === 0) {
@@ -292,7 +326,11 @@
             }
             if (rewrite) {
               if (this.selected === 0) {
-                this.$router.push({path: 'config', query: {service: this.filter}})
+                this.$router.push({path: 'config', query: {
+                    service: this.filter,
+                    serviceVersion: this.serviceVersion4Search,
+                    serviceGroup: this.serviceGroup4Search
+                  }})
               } else if (this.selected === 1) {
                 this.$router.push({path: 'config', query: {application: this.filter}})
               }
@@ -331,6 +369,8 @@
         }
         override.service = this.service
         override.application = this.application
+        override.serviceSerion = this.serviceVersion
+        override.serviceGroup = this.serviceGroup
         let vm = this
         if (this.updateId) {
           if (this.updateId === 'close') {
@@ -373,15 +413,7 @@
         }
       },
       itemOperation: function (icon, item) {
-        let itemId = ''
-        if (this.selected === 0) {
-          itemId = item.service
-        } else {
-          itemId = item.application
-        }
-        if (itemId.includes('/')) {
-          itemId = itemId.replace('/', '*')
-        }
+        let itemId = item.id
         switch (icon) {
           case 'visibility':
             this.$axios.get('/rules/override/' + itemId)
@@ -417,6 +449,8 @@
       },
       handleConfig: function (config, readonly) {
         this.service = config.service
+        this.serviceVersion = config.serviceVersion
+        this.serviceGroup = config.serviceGroup
         this.application = config.application
         delete config.service
         delete config.application
@@ -502,10 +536,18 @@
       this.ruleText = this.template
       let query = this.$route.query
       let filter = null
+      let queryServiceVersion = null
+      let queryServiceGroup = null
       let vm = this
       Object.keys(query).forEach(function (key) {
         if (key === 'service') {
           filter = query[key]
+          if (query.serviceVersion) {
+            queryServiceVersion = query.serviceVersion
+          }
+          if (query.serviceGroup) {
+            queryServiceGroup = query.serviceGroup
+          }
           vm.selected = 0
         }
         if (key === 'application') {
@@ -513,6 +555,12 @@
           vm.selected = 1
         }
       })
+      if (queryServiceVersion != null) {
+        this.serviceVersion4Search = query.serviceVersion
+      }
+      if (queryServiceGroup != null) {
+        this.serviceGroup4Search = query.serviceGroup
+      }
       if (filter !== null) {
         this.filter = filter
         this.search(false)
diff --git a/dubbo-admin-ui/src/components/governance/RoutingRule.vue b/dubbo-admin-ui/src/components/governance/RoutingRule.vue
index 4dbdd02..8217bdf 100644
--- a/dubbo-admin-ui/src/components/governance/RoutingRule.vue
+++ b/dubbo-admin-ui/src/components/governance/RoutingRule.vue
@@ -54,13 +54,13 @@
                   </v-list>
                 </v-menu>
                 <v-text-field
-                  v-show="selected == 0"
+                  v-show="selected === 0"
                   label="Version"
                   :hint="$t('dataIdVersionHint')"
                   v-model="serviceVersion4Search"
                 ></v-text-field>
                 <v-text-field
-                  v-show="selected == 0"
+                  v-show="selected === 0"
                   label="Group"
                   :hint="$t('dataIdGroupHint')"
                   v-model="serviceGroup4Search"
@@ -81,7 +81,7 @@
           <v-btn outline color="primary" @click.stop="openDialog" class="mb-2">{{$t('create')}}</v-btn>
         </v-toolbar>
 
-        <v-card-text class="pa-0" v-show="selected == 0">
+        <v-card-text class="pa-0" v-show="selected === 0">
           <v-data-table
             :headers="serviceHeaders"
             :items="serviceRoutingRules"
@@ -91,6 +91,7 @@
             <template slot="items" slot-scope="props">
               <td class="text-xs-left">{{ props.item.service }}</td>
               <td class="text-xs-left">{{ props.item.serviceGroup }}</td>
+              <td class="text-xs-left">{{ props.item.serviceVersion }}</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">
@@ -103,7 +104,7 @@
             </template>
           </v-data-table>
         </v-card-text>
-        <v-card-text class="pa-0" v-show="selected == 1">
+        <v-card-text class="pa-0" v-show="selected === 1">
           <v-data-table
             :headers="appHeaders"
             :items="appRoutingRules"
@@ -134,21 +135,21 @@
         </v-card-title>
         <v-card-text >
           <v-layout wrap>
-            <v-flex xs12 sm6 md4>
+            <v-flex xs24 sm12 md8>
               <v-text-field
                 label="Service class"
                 :hint="$t('dataIdClassHint')"
                 v-model="service"
               ></v-text-field>
             </v-flex>
-            <v-flex xs12 sm6 md4>
+            <v-flex xs6 sm3 md2>
               <v-text-field
                 label="Version"
                 :hint="$t('dataIdVersionHint')"
                 v-model="serviceVersion"
               ></v-text-field>
             </v-flex>
-            <v-flex xs12 sm6 md4>
+            <v-flex xs6 sm3 md2>
               <v-text-field
                 label="Group"
                 :hint="$t('dataIdGroupHint')"
@@ -287,6 +288,12 @@
 
         },
         {
+          text: this.$t('version'),
+          value: 'group',
+          align: 'left'
+
+        },
+        {
           text: this.$t('enabled'),
           value: 'enabled',
           sortable: false
@@ -384,12 +391,14 @@
       const serviceVersion = this.serviceVersion == null ? '' : this.serviceVersion
       const serviceGroup = this.serviceGroup == null ? '' : this.serviceGroup
       rule.application = this.application
+      rule.serviceVersion = serviceVersion
+      rule.serviceGroup = serviceGroup
       if (this.updateId !== '') {
         if (this.updateId === 'close') {
           this.closeDialog()
         } else {
           rule.id = this.updateId
-          this.$axios.put('/rules/route/condition/' + rule.id + '?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup, rule)
+          this.$axios.put('/rules/route/condition/' + rule.id, rule)
             .then(response => {
               if (response.status === 200) {
                 if (vm.service) {
@@ -407,7 +416,7 @@
             })
         }
       } else {
-        this.$axios.post('/rules/route/condition/' + '?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup, rule)
+        this.$axios.post('/rules/route/condition/', rule)
           .then(response => {
             if (response.status === 201) {
               if (vm.service) {
@@ -429,22 +438,13 @@
       }
     },
     itemOperation: function (icon, item) {
-      let itemId = ''
-      if (this.selected === 0) {
-        itemId = item.service
-      } else {
-        itemId = item.application
-      }
-      const oldItemId = itemId
-      if (itemId.includes('/')) {
-        itemId = itemId.replace('/', '*')
-      }
+      const itemId = item.id
       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=' + serviceVersion + '&serviceGroup=' + serviceGroup + '&scope=' + scope)
+          this.$axios.get('/rules/route/condition/' + itemId)
             .then(response => {
               const conditionRoute = response.data
               this.serviceVersion = conditionRoute.serviceVersion
@@ -458,7 +458,7 @@
             })
           break
         case 'edit':
-          this.$axios.get('/rules/route/condition/' + itemId + '?serviceVersion=' + serviceVersion + '&serviceGroup=' + serviceGroup + '&scope=' + scope)
+          this.$axios.get('/rules/route/condition/' + itemId)
             .then(response => {
               const conditionRoute = response.data
               this.serviceVersion = conditionRoute.serviceVersion
@@ -472,7 +472,7 @@
             })
           break
         case 'block':
-          this.openWarn(' Are you sure to block Routing Rule', 'service: ' + oldItemId)
+          this.openWarn(' Are you sure to block Routing Rule', 'service: ' + itemId)
           this.warnStatus.operation = 'disable'
           this.warnStatus.id = itemId
           this.warnStatus.serviceVersion = serviceVersion
@@ -480,7 +480,7 @@
           this.warnStatus.scope = scope
           break
         case 'check_circle_outline':
-          this.openWarn(' Are you sure to enable Routing Rule', 'service: ' + oldItemId)
+          this.openWarn(' Are you sure to enable Routing Rule', 'service: ' + itemId)
           this.warnStatus.operation = 'enable'
           this.warnStatus.id = itemId
           this.warnStatus.serviceVersion = serviceVersion
@@ -488,7 +488,7 @@
           this.warnStatus.scope = scope
           break
         case 'delete':
-          this.openWarn('warnDeleteRouteRule', 'service: ' + oldItemId)
+          this.openWarn('warnDeleteRouteRule', 'service: ' + itemId)
           this.warnStatus.operation = 'delete'
           this.warnStatus.id = itemId
           this.warnStatus.serviceVersion = serviceVersion
diff --git a/dubbo-admin-ui/src/components/governance/TagRule.vue b/dubbo-admin-ui/src/components/governance/TagRule.vue
index 5714861..7f82881 100644
--- a/dubbo-admin-ui/src/components/governance/TagRule.vue
+++ b/dubbo-admin-ui/src/components/governance/TagRule.vue
@@ -332,6 +332,8 @@
         delete tagRoute.application
         delete tagRoute.service
         delete tagRoute.priority
+        delete tagRoute.serviceVersion
+        delete tagRoute.serviceGroup
         this.ruleText = yaml.safeDump(tagRoute)
         this.readonly = readonly
         this.dialog = true
diff --git a/dubbo-admin-ui/src/components/governance/WeightAdjust.vue b/dubbo-admin-ui/src/components/governance/WeightAdjust.vue
index d530fbc..a104d91 100644
--- a/dubbo-admin-ui/src/components/governance/WeightAdjust.vue
+++ b/dubbo-admin-ui/src/components/governance/WeightAdjust.vue
@@ -53,6 +53,18 @@
                     </v-list-tile>
                   </v-list>
                 </v-menu>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Version"
+                  :hint="$t('dataIdVersionHint')"
+                  v-model="serviceVersion4Search"
+                ></v-text-field>
+                <v-text-field
+                  v-show="selected === 0"
+                  label="Group"
+                  :hint="$t('dataIdGroupHint')"
+                  v-model="serviceGroup4Search"
+                ></v-text-field>
                 <v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
 
               </v-layout>
@@ -70,7 +82,7 @@
           <v-btn outline color="primary" @click.stop="openDialog" class="mb-2">{{$t('create')}}</v-btn>
         </v-toolbar>
 
-        <v-card-text class="pa-0" v-show="selected == 0">
+        <v-card-text class="pa-0" v-show="selected === 0">
           <v-data-table
             :headers="serviceHeaders"
             :items="weights"
@@ -91,7 +103,7 @@
             </template>
           </v-data-table>
         </v-card-text>
-        <v-card-text class="pa-0" v-show="selected == 1">
+        <v-card-text class="pa-0" v-show="selected === 1">
           <v-data-table
             :headers="appHeaders"
             :items="weights"
@@ -121,12 +133,29 @@
           <span class="headline">{{$t('createNewWeightRule')}}</span>
         </v-card-title>
         <v-card-text >
-          <v-text-field
-            label="Service Unique ID"
-            :hint="$t('serviceIdHint')"
-            v-model="service"
-            :readonly="readonly"
-          ></v-text-field>
+          <v-layout wrap>
+            <v-flex xs24 sm12 md8>
+              <v-text-field
+                label="Service class"
+                :hint="$t('dataIdClassHint')"
+                v-model="service"
+              ></v-text-field>
+            </v-flex>
+            <v-flex xs6 sm3 md2>
+              <v-text-field
+                label="Version"
+                :hint="$t('dataIdVersionHint')"
+                v-model="serviceVersion"
+              ></v-text-field>
+            </v-flex>
+            <v-flex xs6 sm3 md2>
+              <v-text-field
+                label="Group"
+                :hint="$t('dataIdGroupHint')"
+                v-model="serviceGroup"
+              ></v-text-field>
+            </v-flex>
+          </v-layout>
           <v-text-field
             :label="$t('appName')"
             :hint="$t('appNameHint')"
@@ -219,6 +248,10 @@
       typeAhead: [],
       input: null,
       timerID: null,
+      serviceVersion4Search: '',
+      serviceGroup4Search: '',
+      serviceVersion: '',
+      serviceGroup: '',
       operations: [
         {id: 0, icon: 'visibility', tooltip: 'view'},
         {id: 1, icon: 'edit', tooltip: 'edit'},
@@ -313,7 +346,7 @@
           return
         }
         let type = this.items[this.selected].value
-        let url = '/rules/weight/?' + type + '=' + this.filter
+        let url = '/rules/weight/?' + type + '=' + this.filter + '&serviceVersion=' + this.serviceVersion4Search + '&serviceGroup=' + this.serviceGroup4Search
         this.$axios.get(url)
           .then(response => {
             this.weights = response.data
@@ -360,6 +393,8 @@
           return
         }
         weight.service = this.service
+        weight.serviceVersion = this.serviceVersion
+        weight.serviceGroup = this.serviceGroup
         weight.application = this.application
         weight.weight = this.rule.weight
         weight.addresses = this.rule.address.split(',')
@@ -406,15 +441,7 @@
         }
       },
       itemOperation: function (icon, item) {
-        let itemId = ''
-        if (this.selected === 0) {
-          itemId = item.service
-        } else {
-          itemId = item.application
-        }
-        if (itemId.includes('/')) {
-          itemId = itemId.replace('/', '*')
-        }
+        let itemId = item.id
         switch (icon) {
           case 'visibility':
             this.$axios.get('/rules/weight/' + itemId)
@@ -440,6 +467,8 @@
       },
       handleWeight: function (weight, readonly) {
         this.service = weight.service
+        this.serviceVersion = weight.serviceVersion
+        this.serviceGroup = weight.serviceGroup
         this.application = weight.application
         // delete weight.service
         // delete weight.application
@@ -490,11 +519,19 @@
       this.$store.dispatch('loadAppItems')
       this.ruleText = this.template
       let query = this.$route.query
+      let queryServiceVersion = null
+      let queryServiceGroup = null
       let filter = null
       let vm = this
       Object.keys(query).forEach(function (key) {
         if (key === 'service') {
           filter = query[key]
+          if (query.serviceVersion) {
+            queryServiceVersion = query.serviceVersion
+          }
+          if (query.serviceGroup) {
+            queryServiceGroup = query.serviceGroup
+          }
           vm.selected = 0
         }
         if (key === 'application') {
@@ -502,6 +539,12 @@
           vm.selected = 1
         }
       })
+      if (queryServiceVersion != null) {
+        this.serviceVersion4Search = query.serviceVersion
+      }
+      if (queryServiceGroup != null) {
+        this.serviceGroup4Search = query.serviceGroup
+      }
       if (filter !== null) {
         this.filter = filter
         this.search(false)