0
0
Lập trình
TT

Hướng dẫn chi tiết lấy danh sách bài viết nổi bật trong dự án Web Blog

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

• 4 phút đọc

Chủ đề:

@ezyplatform

Tạo dữ liệu trong cơ sở dữ liệu

Bước 1: Tạo các term với Term Type là HIGHLIGHT. Term Type sẽ đóng vai trò là danh mục cha, trong khi Term sẽ là danh mục con. Điều này giúp phân loại bài viết mà chúng ta muốn làm nổi bật trên blog.

Bước 2: Sau khi thiết lập các Term, chúng ta tiếp tục tạo ra các bài viết liên kết với các Term vừa được tạo.

Xử lý Backend

B1: Cập nhật giao diện WebBlogTermRepository

Trong package repository, bạn cần sửa đổi nội dung của interface WebBlogTermRepository để thực hiện truy vấn bài viết theo danh sách tên term. Mã nguồn như sau:

java Copy
@EzyRepository
public interface WebBlogTermRepository extends EzyDatabaseRepository<PostTermId, PostTerm> {
    @EzyQuery(
        "SELECT e FROM PostTerm e " +
        "INNER JOIN Term t " +
        "ON e.termId = t.id " +
        "WHERE t.name IN ?0"
    )
    List<PostTerm> findHighlightPostTermsByTermNameIn(Collection<String> termNames);
}

B2: Tạo model WebPostTermModel

Tạo một package mới có tên là model và thêm class WebPostTermModel như sau:

java Copy
@Getter
@Builder
public class WebPostTermModel {
    private final long postId;
    private final long termId;
}

B3: Tạo converter WebBlogEntityToModelConverter

Trong package converter, tạo một class mới WebBlogEntityToModelConverter:

java Copy
@EzySingleton
public class WebBlogEntityToModelConverter {
    public WebPostTermModel toModel(PostTerm entity) {
        if (entity == null) {
            return null;
        }
        return WebPostTermModel.builder()
            .postId(entity.getPostId())
            .termId(entity.getTermId())
            .build();
    }
}

B4: Cập nhật WebBlogTermService

Sửa đổi class WebBlogTermService để thêm hàm getHighlightPostTermsByTermNames nhằm chuyển đổi danh sách PostTerm sang List các WebPostTermModel:

java Copy
public List<WebPostTermModel> getHighlightPostTermsByTermNames(Collection<String> termNames) {
    return newArrayList(
        blogTermRepository.findHighlightPostTermsByTermNameIn(termNames),
        entityToModelConverter::toModel
    );
}

B5: Decorate bài viết trong WebBlogPostModelDecorator

Thêm các hàm decorate trong class WebBlogPostModelDecorator nhằm chuẩn bị cho việc lấy thông tin bài viết:

java Copy
public List<WebBlogPostResponse> decoratePostTerms(List<WebPostTermModel> models) {
    // Logic để lấy thông tin bài viết và trả về danh sách WebBlogPostResponse
}

B6: Tạo hàm getHighlightPosts trong WebBlogPostControllerService

Phát triển hàm getHighlightPosts trong WebBlogPostControllerService để lấy danh sách bài viết nổi bật:

java Copy
public List<WebBlogPostResponse> getHighlightPosts() {
    List<WebPostTermModel> postTerms = blogTermService.getHighlightPostTermsByTermNames(Arrays.asList("main1", "main2", "main3", "main4"));
    return blogPostModelDecorator.decoratePostTerms(postTerms);
}

B7: Cập nhật HomeController

Cuối cùng, trong HomeController, sửa lại hàm home:

java Copy
@DoGet("/")
public View home() {
    return View.builder()
        .template("home")
        .addVariable("highlightPosts", blogPostControllerService.getHighlightPosts())
        .addVariable(VIEW_VARIABLE_PAGE_TITLE, "Trang chủ")
        .build();
}

Xử lý Frontend

Cuối cùng, hãy sửa đổi phần HTML của giao diện blog highlight để hiển thị thông tin bài viết nổi bật:

html Copy
<div class="row mt-4">
    <div th:if="${highlightPosts.size() > 0}" class="col-8">
        <div class="card overflow-hidden">
            <div class="card-img position-relative">
                <img loading="lazy" decoding="async" th:src="${highlightPosts.get(0).image.getUrlOrNull()}" alt="img1">
                <div class="position-absolute bottom-0 start-50 translate-middle-x card-info w-100 text-center">
                    <button class="tag text-capitalize">[[${highlightPosts.get(0).term.name}]]</button><br>
                    <h3 class="line-container text-capitalize">[[${highlightPosts.get(0).title}]]</h3>
                    <p class="text-capitalize date-string">[[${highlightPosts.get(0).publishedAt}]]</p>
                </div>
            </div>
        </div>
    </div>
    <div class="col-4">
        <div class="card overflow-hidden" style="height: 576px">
            <div class="card-img position-relative">
                <img loading="lazy" decoding="async" th:src="${highlightPosts.get(1).image.getUrlOrNull()}" alt="img2">
                <div class="position-absolute bottom-0 start-50 translate-middle-x card-info w-100 text-center">
                    <button class="tag text-capitalize">[[${highlightPosts.get(1).term.name}]]</button><br>
                    <h3 class="line-container text-capitalize">[[${highlightPosts.get(1).title}]]</h3>
                    <p class="text-capitalize date-string">[[${highlightPosts.get(1).publishedAt}]]</p>
                </div>
            </div>
        </div>
    </div>
</div>

Sau khi hoàn thành, bạn sẽ có một giao diện bài viết nổi bật hiển thị các thông tin như hình ảnh, danh mục, tiêu đề và ngày xuất bản.
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