You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					117 lines
				
				3.9 KiB
			
		
		
			
		
	
	
					117 lines
				
				3.9 KiB
			| 
											2 years ago
										 | import math | ||
|  | from pydantic import BaseModel, ConfigDict | ||
|  | from pydantic.alias_generators import to_camel | ||
| 
											1 year ago
										 | from sqlalchemy import func, select, Select | ||
|  | from sqlalchemy.ext.asyncio import AsyncSession | ||
|  | from typing import Optional, List | ||
| 
											2 years ago
										 | from utils.common_util import CamelCaseUtil | ||
| 
											2 years ago
										 | 
 | ||
|  | 
 | ||
|  | class PageResponseModel(BaseModel): | ||
|  |     """
 | ||
|  |     列表分页查询返回模型 | ||
|  |     """
 | ||
| 
											1 year ago
										 | 
 | ||
| 
											2 years ago
										 |     model_config = ConfigDict(alias_generator=to_camel) | ||
|  | 
 | ||
|  |     rows: List = [] | ||
|  |     page_num: Optional[int] = None | ||
|  |     page_size: Optional[int] = None | ||
|  |     total: int | ||
|  |     has_next: Optional[bool] = None | ||
|  | 
 | ||
|  | 
 | ||
| 
											2 years ago
										 | class PageUtil: | ||
| 
											2 years ago
										 |     """
 | ||
| 
											2 years ago
										 |     分页工具类 | ||
| 
											2 years ago
										 |     """
 | ||
|  | 
 | ||
| 
											2 years ago
										 |     @classmethod | ||
|  |     def get_page_obj(cls, data_list: List, page_num: int, page_size: int): | ||
|  |         """
 | ||
|  |         输入数据列表data_list和分页信息,返回分页数据列表结果 | ||
| 
											1 year ago
										 | 
 | ||
| 
											2 years ago
										 |         :param data_list: 原始数据列表 | ||
|  |         :param page_num: 当前页码 | ||
|  |         :param page_size: 当前页面数据量 | ||
|  |         :return: 分页数据对象 | ||
|  |         """
 | ||
|  |         # 计算起始索引和结束索引 | ||
|  |         start = (page_num - 1) * page_size | ||
|  |         end = page_num * page_size | ||
|  | 
 | ||
|  |         # 根据计算得到的起始索引和结束索引对数据列表进行切片 | ||
|  |         paginated_data = data_list[start:end] | ||
|  |         has_next = True if math.ceil(len(data_list) / page_size) > page_num else False | ||
|  | 
 | ||
|  |         result = PageResponseModel( | ||
| 
											1 year ago
										 |             rows=paginated_data, pageNum=page_num, pageSize=page_size, total=len(data_list), hasNext=has_next | ||
| 
											2 years ago
										 |         ) | ||
|  | 
 | ||
|  |         return result | ||
|  | 
 | ||
|  |     @classmethod | ||
| 
											1 year ago
										 |     async def paginate(cls, db: AsyncSession, query: Select, page_num: int, page_size: int, is_page: bool = False): | ||
| 
											2 years ago
										 |         """
 | ||
|  |         输入查询语句和分页信息,返回分页数据列表结果 | ||
| 
											1 year ago
										 | 
 | ||
| 
											1 year ago
										 |         :param db: orm对象 | ||
| 
											2 years ago
										 |         :param query: sqlalchemy查询语句 | ||
|  |         :param page_num: 当前页码 | ||
|  |         :param page_size: 当前页面数据量 | ||
|  |         :param is_page: 是否开启分页 | ||
|  |         :return: 分页数据对象 | ||
|  |         """
 | ||
|  |         if is_page: | ||
| 
											1 year ago
										 |             total = (await db.execute(select(func.count('*')).select_from(query.subquery()))).scalar() | ||
| 
											1 year ago
										 |             query_result = await db.execute(query.offset((page_num - 1) * page_size).limit(page_size)) | ||
| 
											1 year ago
										 |             paginated_data = [] | ||
|  |             for row in query_result: | ||
|  |                 if row and len(row) == 1: | ||
|  |                     paginated_data.append(row[0]) | ||
|  |                 else: | ||
|  |                     paginated_data.append(row) | ||
| 
											1 year ago
										 |             has_next = math.ceil(total / page_size) > page_num | ||
| 
											2 years ago
										 |             result = PageResponseModel( | ||
|  |                 rows=CamelCaseUtil.transform_result(paginated_data), | ||
|  |                 pageNum=page_num, | ||
|  |                 pageSize=page_size, | ||
|  |                 total=total, | ||
| 
											1 year ago
										 |                 hasNext=has_next, | ||
| 
											2 years ago
										 |             ) | ||
|  |         else: | ||
| 
											1 year ago
										 |             query_result = await db.execute(query) | ||
|  |             no_paginated_data = [] | ||
|  |             for row in query_result: | ||
|  |                 if row and len(row) == 1: | ||
|  |                     no_paginated_data.append(row[0]) | ||
|  |                 else: | ||
|  |                     no_paginated_data.append(row) | ||
| 
											2 years ago
										 |             result = CamelCaseUtil.transform_result(no_paginated_data) | ||
| 
											2 years ago
										 | 
 | ||
| 
											2 years ago
										 |         return result | ||
| 
											2 years ago
										 | 
 | ||
|  | 
 | ||
|  | def get_page_obj(data_list: List, page_num: int, page_size: int): | ||
|  |     """
 | ||
|  |     输入数据列表data_list和分页信息,返回分页数据列表结果 | ||
| 
											1 year ago
										 | 
 | ||
| 
											2 years ago
										 |     :param data_list: 原始数据列表 | ||
|  |     :param page_num: 当前页码 | ||
|  |     :param page_size: 当前页面数据量 | ||
|  |     :return: 分页数据对象 | ||
|  |     """
 | ||
|  |     # 计算起始索引和结束索引 | ||
|  |     start = (page_num - 1) * page_size | ||
|  |     end = page_num * page_size | ||
|  | 
 | ||
|  |     # 根据计算得到的起始索引和结束索引对数据列表进行切片 | ||
|  |     paginated_data = data_list[start:end] | ||
|  |     has_next = True if math.ceil(len(data_list) / page_size) > page_num else False | ||
|  | 
 | ||
|  |     result = PageResponseModel( | ||
| 
											1 year ago
										 |         rows=paginated_data, pageNum=page_num, pageSize=page_size, total=len(data_list), hasNext=has_next | ||
| 
											2 years ago
										 |     ) | ||
|  | 
 | ||
|  |     return result |