feat: 增加分页功能

This commit is contained in:
2026-09-08 22:49:44 +08:00
parent a81ff36f21
commit 94b0187268
3 changed files with 49 additions and 4 deletions

View File

@@ -1,9 +1,9 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import List from typing import List
from config.database import get_db from config.database import get_db
from schemas.record import RecordCreate, RecordUpdate, RecordResponse from schemas.record import RecordCreate, RecordUpdate, RecordResponse, RecordPageResponse
from service import record_service from service import record_service
router = APIRouter(prefix="/records", tags=["记录"]) router = APIRouter(prefix="/records", tags=["记录"])
@@ -19,6 +19,15 @@ def list_all(skip: int = 0, limit: int = 20, db: Session = Depends(get_db)):
return record_service.get_all_records(db, skip, limit) return record_service.get_all_records(db, skip, limit)
@router.get("/page", response_model=RecordPageResponse, summary="分页获取所有记录")
def list_all_by_page(
page: int = Query(1, ge=1, description="页码从1开始"),
size: int = Query(20, ge=1, le=100, description="每页条数最大100"),
db: Session = Depends(get_db),
):
return record_service.get_all_records_by_page(db, page, size)
@router.get("/{record_id}", response_model=RecordResponse, summary="获取记录详情") @router.get("/{record_id}", response_model=RecordResponse, summary="获取记录详情")
def get(record_id: int, db: Session = Depends(get_db)): def get(record_id: int, db: Session = Depends(get_db)):
record = record_service.get_record_by_id(db, record_id) record = record_service.get_record_by_id(db, record_id)

View File

@@ -38,3 +38,11 @@ class RecordResponse(BaseModel):
datetime: lambda dt: dt.strftime("%Y-%m-%d %H:%M:%S") datetime: lambda dt: dt.strftime("%Y-%m-%d %H:%M:%S")
} }
} }
class RecordPageResponse(BaseModel):
records: List[RecordResponse]
total: int
page: int
size: int
pages: int

View File

@@ -1,8 +1,8 @@
from sqlalchemy import select, desc from sqlalchemy import select, desc, func
from sqlalchemy.orm import Session, selectinload from sqlalchemy.orm import Session, selectinload
from models.family import Records, Comments from models.family import Records, Comments
from schemas.record import RecordCreate, RecordUpdate, RecordResponse from schemas.record import RecordCreate, RecordUpdate, RecordResponse, RecordPageResponse
def get_all_records(db: Session, skip: int = 0, limit: int = 20) -> list[RecordResponse]: def get_all_records(db: Session, skip: int = 0, limit: int = 20) -> list[RecordResponse]:
@@ -20,6 +20,34 @@ def get_all_records(db: Session, skip: int = 0, limit: int = 20) -> list[RecordR
return [RecordResponse.model_validate(r) for r in records] return [RecordResponse.model_validate(r) for r in records]
def get_all_records_by_page(db: Session, page: int = 1, size: int = 20) -> RecordPageResponse:
base_query = select(Records).options(
selectinload(Records.user),
selectinload(Records.comments).selectinload(Comments.user),
)
# 总数
total = db.scalar(
select(func.count()).select_from(base_query.subquery())
)
# 分页数据
records = db.execute(
base_query
.order_by(Records.create_time.desc())
.offset((page - 1) * size)
.limit(size)
).scalars().all()
return RecordPageResponse(
records=[RecordResponse.model_validate(r) for r in records],
total=total,
page=page,
size=size,
pages=(total + size - 1) // size,
)
def create_record(db: Session, record_dto: RecordCreate) -> bool: def create_record(db: Session, record_dto: RecordCreate) -> bool:
data = record_dto.model_dump() data = record_dto.model_dump()
record = Records(**data) record = Records(**data)