request.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # -*- coding: utf-8 -*-
  2. from typing import Any
  3. from pydantic import ConfigDict, Field, BaseModel
  4. from pydantic.alias_generators import to_camel
  5. from app.common.constant import RET
  6. from app.core.exceptions import CustomException
  7. class PageResultSchema(BaseModel):
  8. """分页查询结果模型"""
  9. model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
  10. page_no: int | None = Field(default=None, ge=1, description="页码,默认为1")
  11. page_size: int | None = Field(default=None, ge=1, description="页面大小,默认为10")
  12. total: int = Field(default=0, ge=0, description="总记录数")
  13. has_next: bool | None = Field(default=False, description="是否有下一页")
  14. items: list[Any] = Field(default_factory=list, description="分页后的数据列表")
  15. class PaginationService:
  16. """分页服务类"""
  17. @staticmethod
  18. async def paginate(data_list: list[Any], page_no: int | None = None, page_size: int | None = None) -> dict[str, Any]:
  19. """
  20. 分页数据处理。
  21. 输入数据列表和分页信息,返回分页数据列表结果。
  22. 未传入 page_no 和 page_size 时,使用默认值进行分页。
  23. 参数:
  24. - data_list (list[Any]): 原始数据列表。
  25. - page_no (int | None): 当前页码,默认 None。
  26. - page_size (int | None): 每页数据量,默认 None。
  27. 返回:
  28. - dict[str, Any]: 分页数据对象。
  29. 异常:
  30. - CustomException: 当分页参数不合法时抛出。
  31. """
  32. total = len(data_list)
  33. # 设置默认值
  34. if page_no is None:
  35. page_no = 1
  36. if page_size is None:
  37. page_size = 10
  38. # 验证分页参数
  39. if page_no < 1 or page_size < 1:
  40. raise CustomException(code=RET.ERROR.code, msg="分页参数不合法")
  41. # 计算起始索引和结束索引
  42. start = (page_no - 1) * page_size
  43. end = min(start + page_size, total)
  44. # 根据计算得到的起始索引和结束索引对数据列表进行切片
  45. paginated_data = data_list[start:end]
  46. # 判断是否有下一页
  47. has_next = end < total
  48. return {
  49. "items": paginated_data,
  50. "total": total,
  51. "page_no": page_no,
  52. "page_size": page_size,
  53. "has_next": has_next
  54. }