feat: 增加分页功能
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user