Merge commit '47296980495f8bbfc9493e93de85dd62de6fa6b9' as 'paste-framework'

This commit is contained in:
zwf
2026-06-02 19:09:22 +08:00
107 changed files with 21484 additions and 0 deletions
+125
View File
@@ -0,0 +1,125 @@
"""
基础分页程序,处理分页计算,后续应当扩展其功能。
"""
class Pagination:
"""
分页程序。
"""
def __init__(self, row_count: int):
"""
初始化分页。
:param row_count: 总记录行数
"""
self._offset = 0
"""
偏移量。
"""
self._pages = -1
"""
总页数。
"""
self._page_number = 1
"""
当前页码。
"""
self.row_count = row_count
"""
数据行数。
"""
self.page_size = 20
"""
每页显示的数据量。默认 20 行每页。
"""
@property
def page_count(self):
"""
取得页数。该属性必须在调用 :meth:`.pages` 方法后调用,例如::
>>> self.pages()
>>> self.page_count
:return: 页数
"""
return self._pages
@property
def page_number(self):
"""
取得当前页码。该属性必须在调用 :meth:`.number` 方法后调用, 例如::
>>> self.number(3)
>>> self.page_number
:return: 页码
"""
return self._page_number
@property
def offset_size(self):
"""
取得偏移量。
"""
return self._offset
def pages(self, page_size: int = 20):
"""
计算页数。
:param page_size: 每页行数,必须处于 [1, 1000] 区间中。若不在此区间,则强制转换到此区间。默认每页 20 条。
:return: 计算取得的页数。
"""
page_size = 1 if page_size < 1 else page_size
page_size = 1000 if page_size > 1000 else page_size
self.page_size = page_size
if self.row_count == 0:
self._pages = 1
else:
_v1 = self.row_count / page_size
_v2 = self.row_count // page_size
self._pages = _v2 if _v1 == _v2 else _v2 + 1
return self._pages
def number(self, page_number: int):
"""
检查页码范围。
:param page_number: 页码
:return: 正确页码
"""
_pages = self.pages(self.page_size)
self._page_number = 1 if page_number < 1 else page_number
self._page_number = _pages if self._page_number > _pages else self._page_number
return self._page_number
def offset(self, page_number: int):
"""
偏移量。
:param page_number: 页码
:return: 偏移量
"""
self._offset = self.page_size * (page_number - 1)
return self._offset
def paging(self, page_number: int = 1, page_size: int = 20):
"""
分页计算,支持链式调用。
:params page_number 页码
:params page_size 每页显示的数量
:return self
"""
self.pages(page_size=page_size)
self.offset(self.number(page_number))
return self