0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Phân Trang Bài Viết Trong EzyPlatform Cho Dự Án Web Blog

Đăng vào 3 tuần trước

• 6 phút đọc

Chủ đề:

@ezyplatform

Phân Trang Trong EzyPlatform

Giới Thiệu Về PaginationModel Và Chức Năng Của Nó

1. PaginationModel:

Để hiểu về cách phân trang trong EzyPlatform, chúng ta bắt đầu với lớp PaginationModel, một thành phần quan trọng. Lớp này bao gồm các thuộc tính sau:

  • PageToken: chứa thông tin về các nút nextprev, với kiểu dữ liệu là String.
  • Continuation: chứa hai thuộc tính hasNexthasPrev với kiểu dữ liệu là Boolean, giúp kiểm tra xem còn dữ liệu tiếp theo hoặc dữ liệu trước đó hay không.

2. PaginationPostService

Trong thư viện Ezyarticle, chúng ta có các gói dịch vụ đã được cấu hình sẵn với những phương thức hỗ trợ việc phân trang một cách dễ dàng. Đối với các bài Post, lớp PaginationPostService được sử dụng để thực hiện phân trang:

Lớp này kế thừa từ lớp trừu tượng CommonPaginationService, được dùng chung cho việc phân trang các Entity trong dự án của bạn. Tham khảo thêm tại:

Copy
package org.youngmonkeys.ezyplatform.service;

3. PaginationModelFetchers

Lớp này có chức năng lấy dữ liệu phân trang, cung cấp các phương thức để lấy trang đầu tiên, trang cuối, trang tiếp theo và trang trước dựa trên các tham số như PaginationService, filter, nextPageToken, prevPageToken, thông tin về trang cuối (lastPage) và giới hạn số phần tử trên trang (limit).

  • Lớp này nằm trong gói:
Copy
package org.youngmonkeys.ezyplatform.pagination;

4. CommonValidator

Lớp này chứa các phương thức dùng để kiểm tra và xử lý lỗi cho các tham số đầu vào trong Web:

  • Lớp này nằm trong gói:
Copy
package org.youngmonkeys.ezyplatform.validator;

Cách Hoạt Động Của Phân Trang

  • Lớp CommonValidator thực hiện các kiểm tra sự hợp lệ cho các đầu vào từ người dùng. Nếu điều kiện không được đáp ứng (ví dụ: pageSize không hợp lệ, kích thước Collection quá lớn, v.v.), nó sẽ ném ra một HttpBadRequestException với thông báo lỗi phù hợp. Sử dụng Collections.singletonMap để chỉ định lỗi cụ thể (ví dụ: "pageSize": "invalid").

Cách Cài Đặt Phân Trang

B1: Tạo lớp Response chứa thông tin Model cần gửi tới Front-End.

Trong lớp này, chỉ lấy ra các nội dung chính của bài viết như tiêu đề, nội dung, hình ảnh.

B2: Tại lớp Service, thêm các thông tin sau:

Copy
@Service
@AllArgsConstructor
public class WebBlogPostControllerService {

    private final WebPostFilterFactory postFilterFactory;
    private final WebPaginationPostService paginationPostService;
    private final WebBlogPostModelDecorator blogPostModelDecorator;

    public PaginationModel<WebBlogPostResponse> getBlogPostPagination(
        String keyword,
        String nextPageToken,
        String prevPageToken,
        boolean lastPage,
        int limit
    ) {
        PaginationModel<PostModel> pagination = PaginationModelFetchers.getPaginationModel(
            this.paginationPostService,
            postFilterFactory.newDefaultPostFilterBuilder(keyword)
                .postStatus(PostStatus.PUBLISHED.toString())
                .build(),
            nextPageToken,
            prevPageToken,
            lastPage,
            limit
        );
        return blogPostModelDecorator.decorateBlogPostPagination(
            pagination
        );
    }
}

Phương thức getBlogPostPagination được tạo ra với nhiệm vụ lấy danh sách Blog để phân trang dựa trên các tham số truyền vào. Sau khi có được pagination, phương thức này sẽ gửi dữ liệu tới lớp Decorator.

B3: Tạo lớp Decorator với các thông tin sau:

Copy
@EzySingleton
@AllArgsConstructor
public class WebBlogPostModelDecorator {

    private final WebMediaService mediaService;
    private final WebPostSlugService postSlugService;
    private final WebBlogModelToResponseConverter blogModelToResponseConverter;

    public PaginationModel<WebBlogPostResponse> decorateBlogPostPagination(
        PaginationModel<PostModel> pagination
    ) {
        List<PostModel> models = pagination.getItems();
        List<Long> postIds = newArrayList(
            models,
            PostModel::getId
        );
        Map<Long, String> slugByPostId = postSlugService.getLatestSlugMapByPostIds(
            postIds
        );
        Set<Long> imageIds = newHashSet(
            models,
            PostModel::getFeaturedImageId
        );
        Map<Long, MediaNameModel> imageById = mediaService
            .getMediaNameMapByIds(imageIds);
        return pagination.map(it ->
            blogModelToResponseConverter.toBlogPostResponse(
                it,
                slugByPostId.get(it.getId()),
                imageById.get(it.getFeaturedImageId())
            )
        );
    }
}

Lớp này có nhiệm vụ xử lý các thông tin đã nhận từ phương thức getBlogPostPagination và thực hiện tìm kiếm các thông tin yêu cầu.

B4: Tại Controller, truyền tham số và gọi tới Service:

Copy
@Controller
@AllArgsConstructor
public class HomeController {

    private final WebBlogPostControllerService blogPostControllerService;
    private final WebCommonValidator commonValidator;

    @DoGet("/")
    public View home(
        @RequestParam(value = "keyword") String keyword,
        @RequestParam(value = "nextPageToken") String nextPageToken,
        @RequestParam(value = "prevPageToken") String prevPageToken,
        @RequestParam(value = "lastPage") boolean lastPage,
        @RequestParam(value = "limit", defaultValue = "2") int limit
    ) {
        commonValidator.validatePageSize(limit);
        return View.builder()
            .template("home")
            .addVariable(
                "postPagination",
                blogPostControllerService.getBlogPostPagination(
                    keyword,
                    nextPageToken,
                    prevPageToken,
                    lastPage,
                    limit
                )
            )
            .addVariable(VIEW_VARIABLE_PAGE_TITLE, "home")
            .build();
    }
}

Tại Controller, sử dụng CommonValidator để kiểm tra giá trị pageSize có hợp lệ hay không. Nếu giá trị hợp lệ, sẽ gửi biến tới giao diện.

Tóm Tắt

Bài viết đã hướng dẫn cách phân trang bài viết trong EzyPlatform, giúp bạn có thể tùy chỉnh và áp dụng cho dự án Blog của mình một cách linh hoạt và hiệu quả.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào