task-44(账号/权限页面): 实现用户分页边界行为
新增 user-pagination.ts 纯函数:totalPageCount(空数据=0、非整倍向上取整)、 clampPage(<1→1、超末页→末页、空态留第1页)、isPageOutOfRange;UsersPage 加载后若总页数收缩致当前页越界则回钳末页重新拉取一次。8 用例全过,315 单测 + build 绿。
This commit is contained in:
@@ -5,6 +5,7 @@ import { http } from '@/api/http'
|
||||
import type { AdminUser } from '@/types/admin'
|
||||
import { fetchUserList } from '@/api/users'
|
||||
import { createUserFilterState, toUserListParams } from './users-filter'
|
||||
import { totalPageCount } from './user-pagination'
|
||||
|
||||
const loading = ref(false)
|
||||
const rows = ref<AdminUser[]>([])
|
||||
@@ -17,6 +18,14 @@ async function loadUsers() {
|
||||
const page = await fetchUserList(toUserListParams(filters))
|
||||
rows.value = page.items
|
||||
total.value = page.total
|
||||
// 数据被删/筛选后总页数收缩:页码越界时回钳到末页并重新加载一次。
|
||||
const last = totalPageCount(page.total, filters.pageSize)
|
||||
if (last > 0 && filters.page > last) {
|
||||
filters.page = last
|
||||
const retried = await fetchUserList(toUserListParams(filters))
|
||||
rows.value = retried.items
|
||||
total.value = retried.total
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error(error instanceof Error ? error.message : '用户列表加载失败')
|
||||
} finally {
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/** 用户列表分页边界(任务 44):纯函数,处理总页数、越界页码回钳与空数据。 */
|
||||
import { USER_PAGE_DEFAULT_SIZE } from '../../api/users-dto.ts'
|
||||
|
||||
/** 总页数;无数据返回 0,pageSize 非法时用默认。 */
|
||||
export function totalPageCount(total: number, pageSize: number): number {
|
||||
if (!Number.isFinite(total) || total <= 0) return 0
|
||||
const size = Number.isFinite(pageSize) && pageSize >= 1 ? Math.floor(pageSize) : USER_PAGE_DEFAULT_SIZE
|
||||
return Math.ceil(total / size)
|
||||
}
|
||||
|
||||
/** 请求页是否超过末页(无数据时不算越界)。 */
|
||||
export function isPageOutOfRange(page: number, total: number, pageSize: number): boolean {
|
||||
const requested = Number.isFinite(page) ? Math.floor(page) : 1
|
||||
if (requested < 1) return false
|
||||
const last = totalPageCount(total, pageSize)
|
||||
return last > 0 && requested > last
|
||||
}
|
||||
|
||||
/** 把请求页钳到合法范围:<1 回首页,超过末页回末页;无数据允许第 1 页空态。 */
|
||||
export function clampPage(page: number, total: number, pageSize: number): number {
|
||||
const requested = Number.isFinite(page) ? Math.floor(page) : 1
|
||||
if (requested < 1) return 1
|
||||
const last = totalPageCount(total, pageSize)
|
||||
if (last === 0) return 1
|
||||
return Math.min(requested, last)
|
||||
}
|
||||
Reference in New Issue
Block a user