base_params.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import json
  2. from fastapi import Query
  3. from app.core.validator import DateTimeStr
  4. class PaginationQueryParam:
  5. """分页查询参数基类"""
  6. def __init__(
  7. self,
  8. page_no: int = Query(default=1, description="当前页码", ge=1),
  9. page_size: int = Query(default=10, description="每页数量", ge=1, le=100),
  10. order_by: str | None = Query(
  11. default=None,
  12. description="排序字段,格式:[{'field1': 'asc'}, {'field2': 'desc'}]",
  13. ),
  14. ) -> None:
  15. """
  16. 初始化分页查询参数。
  17. 参数:
  18. - page_no (int | None): 当前页码,默认 None。
  19. - page_size (int | None): 每页数量,默认 None,最大 100。
  20. - order_by (str | None): 排序字段,格式 'field,asc;field2,desc'。
  21. 返回:
  22. - None
  23. """
  24. self.page_no = page_no
  25. self.page_size = page_size
  26. # 将字符串格式的order_by转换为服务层需要的List[Dict[str, str]]格式
  27. if order_by:
  28. try:
  29. self.order_by = json.loads(order_by)
  30. except ValueError:
  31. # 如果解析失败,使用默认排序
  32. self.order_by = [{"updated_time": "desc"}]
  33. else:
  34. self.order_by = [{"updated_time": "desc"}]
  35. class BaseQueryParam:
  36. """公共查询参数"""
  37. def __init__(
  38. self,
  39. description: str | None = Query(None, description="描述"),
  40. status: str | None = Query(None, description="是否启用"),
  41. created_time: list[DateTimeStr] | None = Query(
  42. None,
  43. description="创建时间范围",
  44. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  45. ),
  46. updated_time: list[DateTimeStr] | None = Query(
  47. None,
  48. description="更新时间范围",
  49. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  50. ),
  51. *args,
  52. **kwargs,
  53. ) -> None:
  54. # 模糊查询字段
  55. if description:
  56. self.description = ("like", description)
  57. # 精确查询字段
  58. if status:
  59. self.status = ("eq", status)
  60. # 时间范围查询
  61. if created_time and len(created_time) == 2:
  62. self.created_time = ("between", (created_time[0], created_time[1]))
  63. if updated_time and len(updated_time) == 2:
  64. self.updated_time = ("between", (updated_time[0], updated_time[1]))
  65. class CommonQueryParam:
  66. """根据用户查询参数"""
  67. def __init__(
  68. self,
  69. created_id: int | None = Query(None, description="创建人"),
  70. updated_id: int | None = Query(None, description="更新人"),
  71. ) -> None:
  72. if created_id:
  73. self.created_id = ("eq", created_id)
  74. if updated_id:
  75. self.updated_id = ("eq", updated_id)