Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | 16x 16x 16x 6x 6x 6x 13x 16x 1x 15x 14x 14x 4x 4x 4x 4x 4x 4x 4x | /**
* 分页计算工具函数
*/
import { PAGINATION_DEFAULTS, type PaginationParams, type OffsetPaginationParams } from '../types';
/**
* Offset 风格分页参数
*/
export type OffsetPaginationResult = {
/**
* 页码
*/
page: number;
/**
* 每页数量
*/
pageSize: number;
};
/**
* Page 风格分页参数
*/
export type PagePaginationResult = {
/**
* 偏移量
*/
offset: number;
/**
* 限制数量
*/
limit: number;
};
/**
* 规范化分页参数
* 确保参数在有效范围内
*
* @param params - 原始分页参数
* @returns 规范化后的分页参数
*/
export function normalizePagination(params?: PaginationParams): Required<PaginationParams> {
/**
* 规范化后的页码
*/
const page = Math.max(1, Math.floor(params?.page ?? PAGINATION_DEFAULTS.page));
/**
* 规范化后的每页数量
*/
const pageSize = Math.min(
PAGINATION_DEFAULTS.maxPageSize,
Math.max(
PAGINATION_DEFAULTS.minPageSize,
Math.floor(params?.pageSize ?? PAGINATION_DEFAULTS.pageSize),
),
);
return { page, pageSize };
}
/**
* 规范化 offset 分页参数
*
* @param params - 原始 offset 分页参数
* @returns 规范化后的 offset 分页参数
*/
export function normalizeOffsetPagination(
params?: OffsetPaginationParams,
): Required<OffsetPaginationParams> {
/**
* 规范化后的限制数量
*/
const limit = Math.min(
PAGINATION_DEFAULTS.maxPageSize,
Math.max(
PAGINATION_DEFAULTS.minPageSize,
Math.floor(params?.limit ?? PAGINATION_DEFAULTS.pageSize),
),
);
/**
* 规范化后的偏移量
*/
const offset = Math.max(0, Math.floor(params?.offset ?? 0));
return { limit, offset };
}
/**
* 计算偏移量
*
* @param page - 页码(从 1 开始)
* @param pageSize - 每页数量
* @returns 偏移量
*/
export function calculateOffset(page: number, pageSize: number): number {
return (page - 1) * pageSize;
}
/**
* 计算总页数
*
* @param total - 总记录数
* @param pageSize - 每页数量
* @returns 总页数
*/
export function calculateTotalPages(total: number, pageSize: number): number {
if (pageSize <= 0) {
return 0;
}
return Math.ceil(total / pageSize);
}
/**
* 判断是否有下一页
*
* @param page - 当前页码
* @param totalPages - 总页数
* @returns 是否有下一页
*/
export function hasNextPage(page: number, totalPages: number): boolean {
return page < totalPages;
}
/**
* 判断是否有上一页
*
* @param page - 当前页码
* @returns 是否有上一页
*/
export function hasPreviousPage(page: number): boolean {
return page > 1;
}
/**
* offset 风格转 page 风格
*
* @param offset - 偏移量
* @param limit - 每页数量
* @returns page 风格参数
*/
export function offsetToPage(offset: number, limit: number): OffsetPaginationResult {
/**
* 规范化后的限制数量
*/
const safeLimit = Math.max(1, limit);
return {
page: Math.floor(offset / safeLimit) + 1,
pageSize: safeLimit,
};
}
/**
* page 风格转 offset 风格
*
* @param page - 页码
* @param pageSize - 每页数量
* @returns offset 风格参数
*/
export function pageToOffset(page: number, pageSize: number): PagePaginationResult {
/**
* 规范化后的页码
*/
const safePage = Math.max(1, page);
/**
* 规范化后的每页数量
*/
const safePageSize = Math.max(1, pageSize);
return {
offset: (safePage - 1) * safePageSize,
limit: safePageSize,
};
}
/**
* 创建分页结果对象
*
* @typeParam T - 数据项类型
* @param items - 数据项数组
* @param total - 总记录数
* @param page - 当前页码
* @param pageSize - 每页数量
* @returns 分页结果
*/
export function createPaginatedResult<T>(
items: T[],
total: number,
page: number,
pageSize: number,
): import('../types').PaginatedResult<T> {
/**
* 计算的总页数
*/
const totalPages = calculateTotalPages(total, pageSize);
return {
items,
total,
page,
pageSize,
totalPages,
hasNextPage: hasNextPage(page, totalPages),
hasPreviousPage: hasPreviousPage(page),
};
}
|