diff --git a/src/modules/user/UserListView.vue b/src/modules/user/UserListView.vue index 8680112..532741b 100644 --- a/src/modules/user/UserListView.vue +++ b/src/modules/user/UserListView.vue @@ -91,15 +91,24 @@ function fmtDate(ts: number | null | undefined) { return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}` } -async function load() { +/** + * 构建除 enabled (tab) 外的搜索参数 (用于 stats 查询) + * stats 必须与 tab 解耦, 只反映当前搜索条件下的全量计数 + */ +function buildSearchParams() { + const params: any = {} + if (query.userId) params.id = query.userId + if (query.nickName) params.nickName = query.nickName + if (query.mobile) params.mobile = query.mobile + if (query.enterpriseName) params.enterpriseName = query.enterpriseName + if (query.isEnterprise !== '') params.isEnterprise = Number(query.isEnterprise) + return params +} + +async function loadList() { loading.value = true try { - const params: any = { page: query.page, limit: query.limit } - if (query.userId) params.id = query.userId - if (query.nickName) params.nickName = query.nickName - if (query.mobile) params.mobile = query.mobile - if (query.enterpriseName) params.enterpriseName = query.enterpriseName - if (query.isEnterprise !== '') params.isEnterprise = Number(query.isEnterprise) + const params: any = { page: query.page, limit: query.limit, ...buildSearchParams() } if (query.enabled !== '') params.enabled = Number(query.enabled) const resp: any = await httpGet('/user/user/page', params) if (resp && Array.isArray(resp.list)) { @@ -118,9 +127,6 @@ async function load() { raw: it })) total.value = Number(resp.total || 0) - // 统计 (后端 enabled 语义: 0=正常 1=禁用) - enabledStats.normal = list.value.filter(u => u.enabled === 0).length - enabledStats.disabled = list.value.filter(u => u.enabled === 1).length } else { list.value = [] total.value = 0 @@ -134,6 +140,30 @@ async function load() { } } +/** + * 加载 stats (normal/disabled 全量计数) + * 与 tab 无关, 只跟搜索条件 (userId/nickName/mobile/isEnterprise/enterpriseName) 关联 + * 通过 limit=1 + page=1 拿到 total (后端只 count 不返列表, 开销可忽略) + */ +async function loadStats() { + try { + const baseParams = buildSearchParams() + const [respNormal, respDisabled] = await Promise.all([ + httpGet('/user/user/page', { ...baseParams, enabled: 0, page: 1, limit: 1 }), + httpGet('/user/user/page', { ...baseParams, enabled: 1, page: 1, limit: 1 }) + ]) + enabledStats.normal = Number(respNormal?.total ?? 0) + enabledStats.disabled = Number(respDisabled?.total ?? 0) + } catch { + enabledStats.normal = 0 + enabledStats.disabled = 0 + } +} + +async function load() { + await Promise.all([loadList(), loadStats()]) +} + const tabItems = computed(() => [ { key: 'all', label: '全部', count: total.value }, { key: 'normal', label: '正常', count: enabledStats.normal }, @@ -146,7 +176,7 @@ function onTabChange(key: string) { else if (key === 'normal') query.enabled = '0' else if (key === 'disabled') query.enabled = '1' query.page = 1 - load() + loadList() // 切 tab 只重载列表, stats 已与 tab 解耦 } function onPageChange(p: number) { query.page = p; load() }