From 94b0187268062177c098aa398040229d7b52a3a9 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Tue, 8 Sep 2026 22:49:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routers/record.py | 13 +++++++++++-- schemas/record.py | 8 ++++++++ service/record_service.py | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/routers/record.py b/routers/record.py index 418718e..de3e071 100644 --- a/routers/record.py +++ b/routers/record.py @@ -1,9 +1,9 @@ -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from typing import List 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 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) +@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="获取记录详情") def get(record_id: int, db: Session = Depends(get_db)): record = record_service.get_record_by_id(db, record_id) diff --git a/schemas/record.py b/schemas/record.py index fb24c24..bea0070 100644 --- a/schemas/record.py +++ b/schemas/record.py @@ -38,3 +38,11 @@ class RecordResponse(BaseModel): 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 diff --git a/service/record_service.py b/service/record_service.py index 7f3ee41..f4efec6 100644 --- a/service/record_service.py +++ b/service/record_service.py @@ -1,8 +1,8 @@ -from sqlalchemy import select, desc +from sqlalchemy import select, desc, func from sqlalchemy.orm import Session, selectinload 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]: @@ -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] +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: data = record_dto.model_dump() record = Records(**data)