diff --git a/dubbo-admin-server/pom.xml b/dubbo-admin-server/pom.xml
index de8186dcad17cd5061826c62ec5de03f99be2c41..f7e11259fabb25a0fb29a512d0e47f6055f166c1 100644
--- a/dubbo-admin-server/pom.xml
+++ b/dubbo-admin-server/pom.xml
@@ -41,6 +41,10 @@
spring-boot-starter-web
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
org.springframework.boot
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/DubboAdminApplication.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/DubboAdminApplication.java
index e12b0ca1952b60b15e6fe31c73674fd830b66ac0..4f73eae9bde2c7f0eb6b0d0cefb6925c44fcf61f 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/DubboAdminApplication.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/DubboAdminApplication.java
@@ -19,8 +19,12 @@ package org.apache.dubbo.admin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
-@SpringBootApplication
+@SpringBootApplication(exclude={
+ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class
+})
public class DubboAdminApplication {
public static void main(String[] args) {
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
index c8a04b21b620859b905c13edd78c6e628e86b12f..e1b86798b5fffd499ada61fd9efc4bc7955b7d33 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
@@ -29,6 +29,9 @@ import org.apache.dubbo.admin.service.ProviderService;
import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
import org.apache.dubbo.metadata.identifier.MetadataIdentifier;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -37,6 +40,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
@RestController
@RequestMapping("/api/{env}")
@@ -54,9 +58,21 @@ public class ServiceController {
}
@RequestMapping( value = "/service", method = RequestMethod.GET)
- public Set searchService(@RequestParam String pattern,
- @RequestParam String filter,@PathVariable String env) {
- return providerService.getServiceDTOS(pattern, filter, env);
+ public Page searchService(@RequestParam String pattern,
+ @RequestParam String filter,
+ @PathVariable String env,
+ Pageable pageable) {
+ final Set serviceDTOS = providerService.getServiceDTOS(pattern, filter, env);
+
+ final int total = serviceDTOS.size();
+ final List content =
+ serviceDTOS.stream()
+ .skip(pageable.getOffset())
+ .limit(pageable.getPageSize())
+ .collect(Collectors.toList());
+
+ final Page page = new PageImpl<>(content, pageable, total);
+ return page;
}
@RequestMapping(value = "/service/{service}", method = RequestMethod.GET)
diff --git a/dubbo-admin-ui/src/components/ServiceSearch.vue b/dubbo-admin-ui/src/components/ServiceSearch.vue
index 92880096d13b13980469c7ec0088e3505a81ae05..0b38e27960a083db950a73d4e365573d63cdd19f 100644
--- a/dubbo-admin-ui/src/components/ServiceSearch.vue
+++ b/dubbo-admin-ui/src/components/ServiceSearch.vue
@@ -69,10 +69,12 @@
{{props.item.service}} |
@@ -159,9 +161,15 @@
selected: 0,
input: null,
typeAhead: [],
- services: [],
+ resultPage: {},
filter: '',
- headers: []
+ headers: [],
+ pagination: {
+ page: 1,
+ rowsPerPage: 10 // -1 for All
+ },
+ totalItems: 0,
+ loadingServices: false
}),
computed: {
queryBy () {
@@ -178,6 +186,12 @@
},
area () {
return this.$i18n.locale
+ },
+ services () {
+ if (!this.resultPage || !this.resultPage.content) {
+ return []
+ }
+ return this.resultPage.content
}
},
watch: {
@@ -186,6 +200,17 @@
},
area () {
this.setHeaders()
+ },
+ pagination: {
+ handler (newVal, oldVal) {
+ if (newVal.page === oldVal.page && newVal.rowsPerPage === oldVal.rowsPerPage) {
+ return
+ }
+ const filter = this.$route.query.filter || '*';
+ const pattern = this.$route.query.pattern || 'service'
+ this.search(filter, pattern, false)
+ },
+ deep: true
}
},
methods: {
@@ -273,16 +298,24 @@
}
},
search: function (filter, pattern, rewrite) {
+ const page = this.pagination.page - 1
+ const size = this.pagination.rowsPerPage
+ this.loadingServices = true
this.$axios.get('/service', {
params: {
- pattern: pattern,
- filter: filter
+ pattern,
+ filter,
+ page,
+ size
}
}).then(response => {
- this.services = response.data
+ this.resultPage = response.data
+ this.totalItems = this.resultPage.totalElements
if (rewrite) {
this.$router.push({path: 'service', query: {filter: filter, pattern: pattern}})
}
+ }).finally(() => {
+ this.loadingServices = false
})
},
toTestService (item) {