refactor: add page size configuration for post (#2660)

pull/2659/head
guqing 2022-11-08 10:01:50 +08:00 committed by GitHub
parent 36613c0442
commit 8d6838a956
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 107 additions and 46 deletions

View File

@ -54,6 +54,11 @@ public class SystemConfigurableEnvironmentFetcher {
.switchIfEmpty(Mono.just(new SystemSetting.Comment())); .switchIfEmpty(Mono.just(new SystemSetting.Comment()));
} }
public Mono<SystemSetting.Post> fetchPost() {
return fetch(SystemSetting.Post.GROUP, SystemSetting.Post.class)
.switchIfEmpty(Mono.just(new SystemSetting.Post()));
}
@NonNull @NonNull
private Mono<Map<String, String>> getValuesInternal() { private Mono<Map<String, String>> getValuesInternal() {
return getConfigMap() return getConfigMap()

View File

@ -59,8 +59,10 @@ public class SystemSetting {
@Data @Data
public static class Post { public static class Post {
public static final String GROUP = "post"; public static final String GROUP = "post";
String sortOrder; Integer postPageSize;
Integer pageSize; Integer archivePageSize;
Integer categoryPageSize;
Integer tagPageSize;
Boolean review; Boolean review;
} }

View File

@ -67,8 +67,10 @@ public class SiteSettingVo {
.favicon(basicSetting.getFavicon()) .favicon(basicSetting.getFavicon())
.allowRegistration(userSetting.getAllowRegistration()) .allowRegistration(userSetting.getAllowRegistration())
.post(PostSetting.builder() .post(PostSetting.builder()
.sortOrder(postSetting.getSortOrder()) .postPageSize(postSetting.getPostPageSize())
.pageSize(postSetting.getPageSize()) .archivePageSize(postSetting.getArchivePageSize())
.categoryPageSize(postSetting.getCategoryPageSize())
.tagPageSize(postSetting.getTagPageSize())
.build()) .build())
.seo(SeoSetting.builder() .seo(SeoSetting.builder()
.blockSpiders(seoSetting.getBlockSpiders()) .blockSpiders(seoSetting.getBlockSpiders())
@ -94,9 +96,13 @@ public class SiteSettingVo {
@Value @Value
@Builder @Builder
public static class PostSetting { public static class PostSetting {
String sortOrder; Integer postPageSize;
Integer pageSize; Integer archivePageSize;
Integer categoryPageSize;
Integer tagPageSize;
} }
@Value @Value

View File

@ -1,7 +1,9 @@
package run.halo.app.theme.router.strategy; package run.halo.app.theme.router.strategy;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import static run.halo.app.theme.router.PageUrlUtils.pageNum; import static run.halo.app.theme.router.PageUrlUtils.pageNum;
import static run.halo.app.theme.router.PageUrlUtils.totalPage; import static run.halo.app.theme.router.PageUrlUtils.totalPage;
import static run.halo.app.theme.router.strategy.ModelConst.DEFAULT_PAGE_SIZE;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -12,6 +14,8 @@ import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers; import reactor.core.scheduler.Schedulers;
import run.halo.app.extension.ListResult;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.utils.PathUtils; import run.halo.app.infra.utils.PathUtils;
import run.halo.app.theme.DefaultTemplateEnum; import run.halo.app.theme.DefaultTemplateEnum;
import run.halo.app.theme.finders.PostFinder; import run.halo.app.theme.finders.PostFinder;
@ -29,17 +33,21 @@ import run.halo.app.theme.router.UrlContextListResult;
@Component @Component
public class ArchivesRouteStrategy implements ListPageRouteHandlerStrategy { public class ArchivesRouteStrategy implements ListPageRouteHandlerStrategy {
private final PostFinder postFinder; private final PostFinder postFinder;
private final SystemConfigurableEnvironmentFetcher environmentFetcher;
public ArchivesRouteStrategy(PostFinder postFinder) { public ArchivesRouteStrategy(PostFinder postFinder,
SystemConfigurableEnvironmentFetcher environmentFetcher) {
this.postFinder = postFinder; this.postFinder = postFinder;
this.environmentFetcher = environmentFetcher;
} }
private Mono<UrlContextListResult<PostArchiveVo>> postList(ServerRequest request) { private Mono<UrlContextListResult<PostArchiveVo>> postList(ServerRequest request) {
String year = pathVariable(request, "year"); String year = pathVariable(request, "year");
String month = pathVariable(request, "month"); String month = pathVariable(request, "month");
String path = request.path(); String path = request.path();
return Mono.defer(() -> Mono.just(postFinder.archives(pageNum(request), 10, year, month))) return environmentFetcher.fetchPost()
.publishOn(Schedulers.boundedElastic()) .map(postSetting -> defaultIfNull(postSetting.getArchivePageSize(), DEFAULT_PAGE_SIZE))
.flatMap(pageSize -> listPost(pageNum(request), pageSize, year, month))
.map(list -> new UrlContextListResult.Builder<PostArchiveVo>() .map(list -> new UrlContextListResult.Builder<PostArchiveVo>()
.listResult(list) .listResult(list)
.nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list))) .nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list)))
@ -47,6 +55,11 @@ public class ArchivesRouteStrategy implements ListPageRouteHandlerStrategy {
.build()); .build());
} }
Mono<ListResult<PostArchiveVo>> listPost(int pageNum, int pageSize, String year, String month) {
return Mono.fromCallable(() -> postFinder.archives(pageNum, pageSize, year, month))
.subscribeOn(Schedulers.boundedElastic());
}
private String pathVariable(ServerRequest request, String name) { private String pathVariable(ServerRequest request, String name) {
Map<String, String> pathVariables = request.pathVariables(); Map<String, String> pathVariables = request.pathVariables();
if (pathVariables.containsKey(name)) { if (pathVariables.containsKey(name)) {

View File

@ -2,6 +2,7 @@ package run.halo.app.theme.router.strategy;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.HandlerFunction; import org.springframework.web.reactive.function.server.HandlerFunction;
@ -20,13 +21,10 @@ import run.halo.app.theme.finders.vo.CategoryTreeVo;
* @since 2.0.0 * @since 2.0.0
*/ */
@Component @Component
@AllArgsConstructor
public class CategoriesRouteStrategy implements ListPageRouteHandlerStrategy { public class CategoriesRouteStrategy implements ListPageRouteHandlerStrategy {
private final CategoryFinder categoryFinder; private final CategoryFinder categoryFinder;
public CategoriesRouteStrategy(CategoryFinder categoryFinder) {
this.categoryFinder = categoryFinder;
}
private Mono<List<CategoryTreeVo>> categories() { private Mono<List<CategoryTreeVo>> categories() {
return Mono.defer(() -> Mono.just(categoryFinder.listAsTree())) return Mono.defer(() -> Mono.just(categoryFinder.listAsTree()))
.publishOn(Schedulers.boundedElastic()); .publishOn(Schedulers.boundedElastic());

View File

@ -1,10 +1,12 @@
package run.halo.app.theme.router.strategy; package run.halo.app.theme.router.strategy;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import static run.halo.app.theme.router.PageUrlUtils.pageNum; import static run.halo.app.theme.router.PageUrlUtils.pageNum;
import static run.halo.app.theme.router.PageUrlUtils.totalPage; import static run.halo.app.theme.router.PageUrlUtils.totalPage;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.HandlerFunction; import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerRequest;
@ -13,6 +15,8 @@ import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers; import reactor.core.scheduler.Schedulers;
import run.halo.app.core.extension.Category; import run.halo.app.core.extension.Category;
import run.halo.app.extension.GroupVersionKind; import run.halo.app.extension.GroupVersionKind;
import run.halo.app.extension.ListResult;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemSetting; import run.halo.app.infra.SystemSetting;
import run.halo.app.theme.DefaultTemplateEnum; import run.halo.app.theme.DefaultTemplateEnum;
import run.halo.app.theme.finders.CategoryFinder; import run.halo.app.theme.finders.CategoryFinder;
@ -31,6 +35,7 @@ import run.halo.app.theme.router.ViewNameResolver;
* @since 2.0.0 * @since 2.0.0
*/ */
@Component @Component
@AllArgsConstructor
public class CategoryRouteStrategy implements DetailsPageRouteHandlerStrategy { public class CategoryRouteStrategy implements DetailsPageRouteHandlerStrategy {
private final GroupVersionKind gvk = GroupVersionKind.fromExtension(Category.class); private final GroupVersionKind gvk = GroupVersionKind.fromExtension(Category.class);
private final PostFinder postFinder; private final PostFinder postFinder;
@ -39,18 +44,14 @@ public class CategoryRouteStrategy implements DetailsPageRouteHandlerStrategy {
private final ViewNameResolver viewNameResolver; private final ViewNameResolver viewNameResolver;
public CategoryRouteStrategy(PostFinder postFinder, private final SystemConfigurableEnvironmentFetcher environmentFetcher;
CategoryFinder categoryFinder, ViewNameResolver viewNameResolver) {
this.postFinder = postFinder;
this.categoryFinder = categoryFinder;
this.viewNameResolver = viewNameResolver;
}
private Mono<UrlContextListResult<PostVo>> postListByCategoryName(String name, private Mono<UrlContextListResult<PostVo>> postListByCategoryName(String name,
ServerRequest request) { ServerRequest request) {
String path = request.path(); String path = request.path();
return Mono.defer(() -> Mono.just(postFinder.listByCategory(pageNum(request), 10, name))) return environmentFetcher.fetchPost()
.publishOn(Schedulers.boundedElastic()) .map(post -> defaultIfNull(post.getCategoryPageSize(), ModelConst.DEFAULT_PAGE_SIZE))
.flatMap(pageSize -> listPostsByCategory(pageNum(request), pageSize, name))
.map(list -> new UrlContextListResult.Builder<PostVo>() .map(list -> new UrlContextListResult.Builder<PostVo>()
.listResult(list) .listResult(list)
.nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list))) .nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list)))
@ -63,6 +64,11 @@ public class CategoryRouteStrategy implements DetailsPageRouteHandlerStrategy {
.subscribeOn(Schedulers.boundedElastic()); .subscribeOn(Schedulers.boundedElastic());
} }
public Mono<ListResult<PostVo>> listPostsByCategory(int page, int size, String categoryName) {
return Mono.fromCallable(() -> postFinder.listByCategory(page, size, categoryName))
.subscribeOn(Schedulers.boundedElastic());
}
@Override @Override
public HandlerFunction<ServerResponse> getHandler(SystemSetting.ThemeRouteRules routeRules, public HandlerFunction<ServerResponse> getHandler(SystemSetting.ThemeRouteRules routeRules,
String name) { String name) {

View File

@ -1,16 +1,21 @@
package run.halo.app.theme.router.strategy; package run.halo.app.theme.router.strategy;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import static run.halo.app.theme.router.PageUrlUtils.pageNum; import static run.halo.app.theme.router.PageUrlUtils.pageNum;
import static run.halo.app.theme.router.PageUrlUtils.totalPage; import static run.halo.app.theme.router.PageUrlUtils.totalPage;
import static run.halo.app.theme.router.strategy.ModelConst.DEFAULT_PAGE_SIZE;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.HandlerFunction; import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers; import reactor.core.scheduler.Schedulers;
import run.halo.app.extension.ListResult;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.theme.DefaultTemplateEnum; import run.halo.app.theme.DefaultTemplateEnum;
import run.halo.app.theme.finders.PostFinder; import run.halo.app.theme.finders.PostFinder;
import run.halo.app.theme.finders.vo.PostVo; import run.halo.app.theme.finders.vo.PostVo;
@ -25,18 +30,17 @@ import run.halo.app.theme.router.UrlContextListResult;
* @since 2.0.0 * @since 2.0.0
*/ */
@Component @Component
@AllArgsConstructor
public class IndexRouteStrategy implements ListPageRouteHandlerStrategy { public class IndexRouteStrategy implements ListPageRouteHandlerStrategy {
private final PostFinder postFinder; private final PostFinder postFinder;
private final SystemConfigurableEnvironmentFetcher environmentFetcher;
public IndexRouteStrategy(PostFinder postFinder) {
this.postFinder = postFinder;
}
private Mono<UrlContextListResult<PostVo>> postList(ServerRequest request) { private Mono<UrlContextListResult<PostVo>> postList(ServerRequest request) {
String path = request.path(); String path = request.path();
return Mono.defer(() -> Mono.just(postFinder.list(pageNum(request), 10))) return environmentFetcher.fetchPost()
.publishOn(Schedulers.boundedElastic()) .map(p -> defaultIfNull(p.getPostPageSize(), DEFAULT_PAGE_SIZE))
.flatMap(pageSize -> listPost(pageNum(request), pageSize))
.map(list -> new UrlContextListResult.Builder<PostVo>() .map(list -> new UrlContextListResult.Builder<PostVo>()
.listResult(list) .listResult(list)
.nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list))) .nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list)))
@ -44,6 +48,11 @@ public class IndexRouteStrategy implements ListPageRouteHandlerStrategy {
.build()); .build());
} }
private Mono<ListResult<PostVo>> listPost(int page, int size) {
return Mono.fromCallable(() -> postFinder.list(page, size))
.subscribeOn(Schedulers.boundedElastic());
}
@Override @Override
public HandlerFunction<ServerResponse> getHandler() { public HandlerFunction<ServerResponse> getHandler() {
return request -> ServerResponse.ok() return request -> ServerResponse.ok()

View File

@ -9,4 +9,5 @@ package run.halo.app.theme.router.strategy;
public enum ModelConst { public enum ModelConst {
; ;
public static final String TEMPLATE_ID = "_templateId"; public static final String TEMPLATE_ID = "_templateId";
public static final Integer DEFAULT_PAGE_SIZE = 10;
} }

View File

@ -1,9 +1,11 @@
package run.halo.app.theme.router.strategy; package run.halo.app.theme.router.strategy;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import static run.halo.app.theme.router.PageUrlUtils.pageNum; import static run.halo.app.theme.router.PageUrlUtils.pageNum;
import static run.halo.app.theme.router.PageUrlUtils.totalPage; import static run.halo.app.theme.router.PageUrlUtils.totalPage;
import java.util.Map; import java.util.Map;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.HandlerFunction; import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunction;
@ -13,6 +15,8 @@ import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers; import reactor.core.scheduler.Schedulers;
import run.halo.app.core.extension.Tag; import run.halo.app.core.extension.Tag;
import run.halo.app.extension.GroupVersionKind; import run.halo.app.extension.GroupVersionKind;
import run.halo.app.extension.ListResult;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemSetting; import run.halo.app.infra.SystemSetting;
import run.halo.app.theme.DefaultTemplateEnum; import run.halo.app.theme.DefaultTemplateEnum;
import run.halo.app.theme.finders.PostFinder; import run.halo.app.theme.finders.PostFinder;
@ -30,22 +34,20 @@ import run.halo.app.theme.router.UrlContextListResult;
* @since 2.0.0 * @since 2.0.0
*/ */
@Component @Component
@AllArgsConstructor
public class TagRouteStrategy implements DetailsPageRouteHandlerStrategy { public class TagRouteStrategy implements DetailsPageRouteHandlerStrategy {
private final GroupVersionKind gvk = GroupVersionKind.fromExtension(Tag.class); private final GroupVersionKind gvk = GroupVersionKind.fromExtension(Tag.class);
private final PostFinder postFinder; private final PostFinder postFinder;
private final TagFinder tagFinder; private final TagFinder tagFinder;
public TagRouteStrategy(PostFinder postFinder, private final SystemConfigurableEnvironmentFetcher environmentFetcher;
TagFinder tagFinder) {
this.postFinder = postFinder;
this.tagFinder = tagFinder;
}
private Mono<UrlContextListResult<PostVo>> postList(ServerRequest request, String name) { private Mono<UrlContextListResult<PostVo>> postList(ServerRequest request, String name) {
String path = request.path(); String path = request.path();
return Mono.defer(() -> Mono.just(postFinder.listByTag(pageNum(request), 10, name))) return environmentFetcher.fetchPost()
.publishOn(Schedulers.boundedElastic()) .map(p -> defaultIfNull(p.getTagPageSize(), ModelConst.DEFAULT_PAGE_SIZE))
.flatMap(pageSize -> listPostByTag(pageNum(request), pageSize, name))
.map(list -> new UrlContextListResult.Builder<PostVo>() .map(list -> new UrlContextListResult.Builder<PostVo>()
.listResult(list) .listResult(list)
.nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list))) .nextUrl(PageUrlUtils.nextPageUrl(path, totalPage(list)))
@ -53,6 +55,11 @@ public class TagRouteStrategy implements DetailsPageRouteHandlerStrategy {
.build()); .build());
} }
private Mono<ListResult<PostVo>> listPostByTag(int page, int size, String name) {
return Mono.fromCallable(() -> postFinder.listByTag(page, size, name))
.subscribeOn(Schedulers.boundedElastic());
}
private Mono<TagVo> tagByName(String name) { private Mono<TagVo> tagByName(String name) {
return Mono.defer(() -> Mono.just(tagFinder.getByName(name))) return Mono.defer(() -> Mono.just(tagFinder.getByName(name)))
.publishOn(Schedulers.boundedElastic()); .publishOn(Schedulers.boundedElastic());

View File

@ -23,22 +23,34 @@ spec:
- group: post - group: post
label: 文章设置 label: 文章设置
formSchema: formSchema:
- $formkit: select
label: "列表排序方式"
name: sortOrder
value: "publishTime"
options:
visitCount: "浏览量"
publishTime: "发布时间"
updateTime: "更新时间"
validation: required
- $formkit: number - $formkit: number
label: "列表显示条数" label: "文章列表显示条数"
name: pageSize name: postPageSize
value: 10 value: 10
min: 1 min: 1
max: 100 max: 100
validation: required validation: required | max:100
- $formkit: number
label: "归档页文章显示条数"
name: archivePageSize
value: 10
min: 1
max: 100
validation: required | max:100
- $formkit: number
label: "分类页文章显示条数"
name: categoryPageSize
value: 10
min: 1
max: 100
validation: required | max:100
- $formkit: number
label: "标签页文章显示条数"
name: tagPageSize
value: 10
min: 1
max: 100
validation: required | max:100
- $formkit: checkbox - $formkit: checkbox
label: "新文章审核" label: "新文章审核"
value: false value: false

View File

@ -47,6 +47,8 @@ abstract class RouterStrategyTestSuite {
@BeforeEach @BeforeEach
final void setUpParent() throws URISyntaxException { final void setUpParent() throws URISyntaxException {
lenient().when(environmentFetcher.fetchPost())
.thenReturn(Mono.just(new SystemSetting.Post()));
lenient().when(environmentFetcher.fetch(eq(SystemSetting.ThemeRouteRules.GROUP), lenient().when(environmentFetcher.fetch(eq(SystemSetting.ThemeRouteRules.GROUP),
eq(SystemSetting.ThemeRouteRules.class))).thenReturn(Mono.just(getThemeRouteRules())); eq(SystemSetting.ThemeRouteRules.class))).thenReturn(Mono.just(getThemeRouteRules()));
lenient().when(haloProperties.getExternalUrl()).thenReturn(new URI("http://example.com")); lenient().when(haloProperties.getExternalUrl()).thenReturn(new URI("http://example.com"));