40 lines
1.0 KiB
Python
40 lines
1.0 KiB
Python
"""分页通用工具:统一页码校验、偏移量和列表响应结构。"""
|
|||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from collections.abc import Sequence
|
||
|
|
from math import ceil
|
||
|
|
from typing import Any
|
||
|
|
|
||
|
|
|
||
|
|
def normalize_pagination(
|
||
|
|
page: int = 1,
|
||
|
|
page_size: int = 10,
|
||
|
|
*,
|
||
|
|
max_page_size: int = 10,
|
||
|
|
) -> tuple[int, int, int]:
|
||
|
|
"""规范化分页参数,返回 ``(page, page_size, offset)``。"""
|
||
|
|
page = max(1, int(page))
|
||
|
|
page_size = min(max_page_size, max(1, int(page_size)))
|
||
|
|
return page, page_size, (page - 1) * page_size
|
||
|
|
|
||
|
|
|
||
|
|
def pagination_result(
|
||
|
|
items: Sequence[Any],
|
||
|
|
total: int,
|
||
|
|
*,
|
||
|
|
page: int,
|
||
|
|
page_size: int,
|
||
|
|
) -> dict[str, Any]:
|
||
|
|
"""构造统一分页响应,包含总页数供前端直接计算翻页状态。"""
|
||
|
|
total = max(0, int(total))
|
||
|
|
return {
|
||
|
|
"items": list(items),
|
||
|
|
"total": total,
|
||
|
|
"page": page,
|
||
|
|
"page_size": page_size,
|
||
|
|
"total_pages": ceil(total / page_size) if total else 0,
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
__all__ = ["normalize_pagination", "pagination_result"]
|