diff --git a/api/blog.py b/api/blog.py index 435eb5a..87544b7 100644 --- a/api/blog.py +++ b/api/blog.py @@ -47,6 +47,14 @@ def query_blog_by_condition(query: BlogQuery = Depends(), return blog_service.query_blog_by_condition(db, query) +@router.get("/condition/page", summary="条件分页查询博客", response_model=PageResult[BlogResponse]) +def query_blog_by_condition_page(query: BlogQuery = Depends(), + current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码"), + page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页数量"), + db: Session = Depends(get_db)): + return blog_service.query_blog_by_condition_page(db, query, current_page, page_size) + + @router.get("/unapproved", summary="查询待发布博客", response_model=List[BlogResponse]) def query_unapproved_blog(db: Session = Depends(get_db), _=Depends(verify_token)): return blog_service.query_unapproved_blog(db) diff --git a/service/blog_service.py b/service/blog_service.py index 188c708..a480603 100644 --- a/service/blog_service.py +++ b/service/blog_service.py @@ -44,6 +44,12 @@ def query_blog_by_page(db: Session, current_page: int = 1, page_size: int = 10, def query_blog_by_condition(db: Session, blog_query: BlogQuery) -> List[BlogResponse]: + stmt = get_query_blog_by_condition_stmt(blog_query) + results = db.execute(stmt).fetchall() + return [BlogResponse.model_validate(result) for result in results] + + +def get_query_blog_by_condition_stmt(blog_query: BlogQuery): stmt = (select( Blog.id, Blog.title, @@ -54,12 +60,15 @@ def query_blog_by_condition(db: Session, blog_query: BlogQuery) -> List[BlogResp BlogContent.content.label("content"), Blog.word_count.label("wordCount"), Blog.read_duration.label("readDuration"), + func.count(BlogVisit.id).label("visitCount"), Blog.is_approved.label("isApproved"), Blog.create_time.label("createTime"), Blog.update_time.label("updateTime") ).where(Blog.is_approved == 1) .outerjoin(BlogCategory, Blog.category_id == BlogCategory.id) - .outerjoin(BlogContent, Blog.content_id == BlogContent.id)) + .outerjoin(BlogContent, Blog.content_id == BlogContent.id) + .outerjoin(BlogVisit, Blog.id == BlogVisit.blog_id) + .group_by(Blog.id)) conditions = [] @@ -77,9 +86,13 @@ def query_blog_by_condition(db: Session, blog_query: BlogQuery) -> List[BlogResp stmt = stmt.order_by(desc(Blog.is_great), desc(Blog.update_time)) - results = db.execute(stmt).fetchall() + return stmt - return [BlogResponse.model_validate(result) for result in results] + +def query_blog_by_condition_page(db: Session, blog_query: BlogQuery, + current_page: int = 1, page_size: int = 10) -> PageResult[BlogResponse]: + stmt = get_query_blog_by_condition_stmt(blog_query) + return paginate_query(db, stmt, current_page, page_size) def query_unapproved_blog(db: Session) -> List[BlogResponse]: