2
0

修改分页

This commit is contained in:
lai
2025-02-26 21:08:09 +08:00
parent 7f533c4956
commit 063ecfe3df
4 changed files with 154 additions and 159 deletions

View File

@@ -79,13 +79,12 @@ export function useTable<A extends AntDesign.TableApiFn>(config: AntDesign.AntDe
const pagination: TablePaginationConfig = reactive({ const pagination: TablePaginationConfig = reactive({
showSizeChanger: true, showSizeChanger: true,
pageSizeOptions: [10, 15, 20, 25, 30], pageSizeOptions: ['5','10', '15', '20','30'],
total: 0, total: 0,
simple: false, size: 'default',
// size: 'f',
current: 1, current: 1,
pageSize: 10, pageSize: 5,
defaultPageSize: 10, defaultPageSize: 5,
responsive: true, responsive: true,
onChange: async (current: number, pageSize: number) => { onChange: async (current: number, pageSize: number) => {
pagination.current = current; pagination.current = current;
@@ -105,7 +104,6 @@ export function useTable<A extends AntDesign.TableApiFn>(config: AntDesign.AntDe
const mobilePagination = computed(() => { const mobilePagination = computed(() => {
const p: TablePaginationConfig = { const p: TablePaginationConfig = {
...pagination, ...pagination,
simple: appStore.isMobile
}; };
return p; return p;

View File

@@ -37,7 +37,6 @@ interface RawCDRRecord {
// CDR记录数据 // CDR记录数据
const cdrData = ref<CDRRecord[]>([]); const cdrData = ref<CDRRecord[]>([]);
const loading = ref(false);
const pagination = ref({ const pagination = ref({
current: 1, current: 1,
pageSize: 10, pageSize: 10,
@@ -77,7 +76,15 @@ function formatTimestamp(timestamp: number): string {
}); });
} }
const columns: TableColumnsType = [
const { columns, data, loading, getData, mobilePagination, searchParams } = useTable({
apiFn: fetchCDRHistory,
apiParams: {
pageNum: 1,
pageSize: 5,
},
rowKey: 'cdrlrecords',
columns: () => [
{ {
title: t('page.cdrlrecords.devicename'), title: t('page.cdrlrecords.devicename'),
dataIndex: 'deviceName', dataIndex: 'deviceName',
@@ -98,52 +105,16 @@ const columns: TableColumnsType = [
width: '30%', width: '30%',
align: 'right' align: 'right'
} }
]; ]
// 获取CDR记录数据
async function getCDRHistory(page = pagination.value.current, pageSize = pagination.value.pageSize) {
loading.value = true;
try {
const { data, error } = await fetchCDRHistory({
pageNum: page,
pageSize: pageSize
});
if (!error && data) {
// 将原始数据映射为显示所需的格式
cdrData.value = data.rows.map((item: RawCDRRecord) => ({
id: item.id,
deviceName: item.clientName,
macAddress: item.clientMac,
trafficUp: formatTraffic(item.trafficUp), // 格式化上传流量
trafficDown: formatTraffic(item.trafficDown), // 格式化下载流量
startTime: formatTimestamp(item.startTime), // 格式化开始时间
endTime: formatTimestamp(item.endTime) // 格式化结束时间
}));
pagination.value.total = data.total;
}
} catch (err) {
console.error('Failed to fetch CDR history:', err);
} finally {
loading.value = false;
}
}
// 处理分页变化
function handleTableChange(pag: any) {
pagination.value.current = pag.current;
pagination.value.pageSize = pag.pageSize;
getCDRHistory(pag.current, pag.pageSize);
}
// 刷新设备列表
async function handleRefresh() {
await getCDRHistory();
}
// 组件挂载时获取数据
onMounted(() => {
getCDRHistory();
}); });
</script> </script>
<template> <template>
@@ -160,7 +131,7 @@ onMounted(() => {
<a-button @click="handleBack"> <a-button @click="handleBack">
{{ t('page.login.common.back') }} {{ t('page.login.common.back') }}
</a-button> </a-button>
<a-button type="primary" :loading="loading" @click="handleRefresh"> <a-button type="primary" :loading="loading" @click="getData">
<template #icon> <template #icon>
<span class="i-carbon:refresh"></span> <span class="i-carbon:refresh"></span>
</template> </template>
@@ -171,20 +142,11 @@ onMounted(() => {
<a-table <a-table
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data-source="cdrData" :data-source="data"
:row-key="(record: CDRRecord) => record.id" :row-key="(record: CDRRecord) => record.id"
:expanded-row-keys="expandedRowKeys" :expanded-row-keys="expandedRowKeys"
@expand="handleExpandChange" @expand="handleExpandChange"
:pagination="{ :pagination="mobilePagination"
current: pagination.current,
pageSize: pagination.pageSize,
total: pagination.total,
showTotal: (total: number) => `${total}`,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: ['10', '20', '50', '100']
}"
@change="handleTableChange"
> >
<template #expandedRowRender="{ record }"> <template #expandedRowRender="{ record }">
<div class="pl-4"> <div class="pl-4">

View File

@@ -6,6 +6,7 @@ import { useI18n } from "vue-i18n";
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { fetchPackageHistory } from '@/service/api/auth'; import { fetchPackageHistory } from '@/service/api/auth';
import { useWindowSize } from '@vueuse/core'; import { useWindowSize } from '@vueuse/core';
import { useTable, useTableOperate } from '@/hooks/common/table';
const router = useRouter(); const router = useRouter();
const handleBack = () => { const handleBack = () => {
@@ -69,27 +70,27 @@ const showPackageDetail = (record: Api.Package.PackageHistoryRecord) => {
width: 400, width: 400,
content: h('div', { class: 'package-detail' }, [ content: h('div', { class: 'package-detail' }, [
h('div', { class: 'detail-item' }, [ h('div', { class: 'detail-item' }, [
h('span', { class: 'detail-label' }, t('page.packagehistories.packagename')+':'), h('span', { class: 'detail-label' }, t('page.packagehistories.packagename') + ':'),
h('span', { class: 'detail-value' }, record.upackage?.packageName || '未知套餐') h('span', { class: 'detail-value' }, record.upackage?.packageName || '未知套餐')
]), ]),
h('div', { class: 'detail-item' }, [ h('div', { class: 'detail-item' }, [
h('span', { class: 'detail-label' }, t('page.packagehistories.price')+':'), h('span', { class: 'detail-label' }, t('page.packagehistories.price') + ':'),
h('span', { class: 'detail-value' }, `¥${Number(record.upackage?.price || 0).toFixed(2)}`) h('span', { class: 'detail-value' }, `¥${Number(record.upackage?.price || 0).toFixed(2)}`)
]), ]),
h('div', { class: 'detail-item' }, [ h('div', { class: 'detail-item' }, [
h('span', { class: 'detail-label' }, t('page.packagehistories.traffic')+':'), h('span', { class: 'detail-label' }, t('page.packagehistories.traffic') + ':'),
h('span', { class: 'detail-value' }, h('span', { class: 'detail-value' },
record.upackage?.trafficEnable ? formatTraffic(record.upackage.traffic) : t('page.packagehistories.unlimit') record.upackage?.trafficEnable ? formatTraffic(record.upackage.traffic) : t('page.packagehistories.unlimit')
) )
]), ]),
h('div', { class: 'detail-item' }, [ h('div', { class: 'detail-item' }, [
h('span', { class: 'detail-label' }, t('page.packagehistories.Expirationdate')+':'), h('span', { class: 'detail-label' }, t('page.packagehistories.Expirationdate') + ':'),
h('span', { class: 'detail-value' }, h('span', { class: 'detail-value' },
`${record.upackage?.periodNum || 0} ${formatPeriodType(record.upackage?.periodType || 0)}` `${record.upackage?.periodNum || 0} ${formatPeriodType(record.upackage?.periodType || 0)}`
) )
]), ]),
h('div', { class: 'detail-item' }, [ h('div', { class: 'detail-item' }, [
h('span', { class: 'detail-label' }, t('page.packagehistories.orderdate')+':'), h('span', { class: 'detail-label' }, t('page.packagehistories.orderdate') + ':'),
h('span', { class: 'detail-value' }, formatDateTime(record.createTime)) h('span', { class: 'detail-value' }, formatDateTime(record.createTime))
]) ])
]), ]),
@@ -97,53 +98,110 @@ const showPackageDetail = (record: Api.Package.PackageHistoryRecord) => {
}); });
}; };
const columns = computed<TableColumnsType>(() => [ // const columns = computed<TableColumnsType>(() => [
{ // {
title: t('page.packagehistories.orderdate'), // title: t('page.packagehistories.orderdate'),
dataIndex: 'createTime', // dataIndex: 'createTime',
key: 'createTime', // key: 'createTime',
responsive: ['md'], // responsive: ['md'],
customRender: ({ text }) => text ? formatDateTime(text) : '' // customRender: ({ text }) => text ? formatDateTime(text) : ''
// },
// {
// title: t('page.packagehistories.amount'),
// dataIndex: 'orderAmount',
// key: 'orderAmount',
// customRender: ({ text }: { text: string }) => {
// const formattedAmount = Number(text).toFixed(2);
// return `¥${formattedAmount}`;
// }
// },
// {
// title: t('page.packagehistories.packagename'),
// dataIndex: ['upackage', 'packageName'],
// key: 'packageName',
// customRender: ({ text, record }: { text: string; record: Api.Package.PackageHistoryRecord }) => {
// return h(AButton, {
// type: 'link',
// size: 'small',
// onClick: (e: Event) => {
// e.stopPropagation(); // 阻止事件冒泡,避免触发行点击事件
// showPackageDetail(record);
// }
// }, {
// default: () => text || t('page.packagehistories.unpackage')
// });
// }
// },
// {
// title: t('page.packagehistories.status'),
// dataIndex: 'status',
// key: 'status',
// customRender: ({ text }: { text: number }) => {
// return h(ATag, {
// color: text === 1 ? 'success' : 'warning'
// }, {
// default: () => text === 1 ? t('page.packagehistories.paid') : t('page.packagehistories.unpaid')
// })
// }
// }
// ]);
const { columns, data, loading, getData, mobilePagination, searchParams } = useTable({
apiFn: fetchPackageHistory,
apiParams: {
pageNum: 1,
pageSize: 5,
}, },
{ rowKey: 'packageName',
title: t('page.packagehistories.amount'), columns: () => [
dataIndex: 'orderAmount', {
key: 'orderAmount', title: t('page.packagehistories.orderdate'),
customRender: ({ text }: { text: string }) => { dataIndex: 'createTime',
const formattedAmount = Number(text).toFixed(2); key: 'createTime',
return `¥${formattedAmount}`; responsive: ['md'],
customRender: ({ text }) => text ? formatDateTime(text) : ''
},
{
title: t('page.packagehistories.amount'),
dataIndex: 'orderAmount',
key: 'orderAmount',
customRender: ({ text }: { text: string }) => {
const formattedAmount = Number(text).toFixed(2);
return `¥${formattedAmount}`;
}
},
{
title: t('page.packagehistories.packagename'),
dataIndex: ['upackage', 'packageName'],
key: 'packageName',
customRender: ({ text, record }: { text: string; record: Api.Package.PackageHistoryRecord }) => {
return h(AButton, {
type: 'link',
size: 'small',
onClick: (e: Event) => {
e.stopPropagation(); // 阻止事件冒泡,避免触发行点击事件
showPackageDetail(record);
}
}, {
default: () => text || t('page.packagehistories.unpackage')
});
}
},
{
title: t('page.packagehistories.status'),
dataIndex: 'status',
key: 'status',
customRender: ({ text }: { text: number }) => {
return h(ATag, {
color: text === 1 ? 'success' : 'warning'
}, {
default: () => text === 1 ? t('page.packagehistories.paid') : t('page.packagehistories.unpaid')
})
}
} }
}, ]
{ });
title: t('page.packagehistories.packagename'),
dataIndex: ['upackage', 'packageName'],
key: 'packageName',
customRender: ({ text, record }: { text: string; record: Api.Package.PackageHistoryRecord }) => {
return h(AButton, {
type: 'link',
size: 'small',
onClick: (e: Event) => {
e.stopPropagation(); // 阻止事件冒泡,避免触发行点击事件
showPackageDetail(record);
}
}, {
default: () => text || t('page.packagehistories.unpackage')
});
}
},
{
title: t('page.packagehistories.status'),
dataIndex: 'status',
key: 'status',
customRender: ({ text }: { text: number }) => {
return h(ATag, {
color: text === 1 ? 'success' : 'warning'
}, {
default: () => text === 1 ? t('page.packagehistories.paid') : t('page.packagehistories.unpaid')
})
}
}
]);
const formatTraffic = (bytes: number): string => { const formatTraffic = (bytes: number): string => {
if (!bytes) return '0B'; if (!bytes) return '0B';
@@ -157,6 +215,8 @@ const formatTraffic = (bytes: number): string => {
} }
return `${bytes}B`; return `${bytes}B`;
}; };
</script> </script>
<template> <template>
@@ -168,19 +228,8 @@ const formatTraffic = (bytes: number): string => {
</a-button> </a-button>
</div> </div>
<div> <div>
<ATable <ATable :columns="columns" :data-source="data" :row-key="(record: Api.Package.PackageHistoryRecord) => record.id"
:columns="columns" :pagination="mobilePagination" >
:data-source="packageData"
:row-key="(record: Api.Package.PackageHistoryRecord) => record.id"
:pagination="{
pageSize: 5,
total: total,
showTotal: (total: number) => `${total}`,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: ['5', '10', '20', '50']
}"
>
<template #expandedRowRender="{ record }"> <template #expandedRowRender="{ record }">
<div class="pl-4"> <div class="pl-4">
<div v-if="isMobile" class="mb-2"> <div v-if="isMobile" class="mb-2">
@@ -198,15 +247,19 @@ const formatTraffic = (bytes: number): string => {
.p-4 { .p-4 {
padding: 1rem; padding: 1rem;
} }
.mb-4 { .mb-4 {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.text-lg { .text-lg {
font-size: 1.125rem; font-size: 1.125rem;
} }
.font-bold { .font-bold {
font-weight: bold; font-weight: bold;
} }
.pl-4 { .pl-4 {
padding-left: 1rem; padding-left: 1rem;
} }

View File

@@ -34,28 +34,15 @@ const formatDateTime = (dateTimeString: string) => {
}); });
}; };
const getRechargeData = async () => {
try {
const response = await fetchRechargeHistory({
pageNum: 1,
pageSize: 10
});
// console.log('API Response:', response);
if (response?.data?.rows) {
// console.log('Setting data:', response.data.rows);
rechargeData.value = response.data.rows;
total.value = response.data.total;
}
} catch (error) {
// console.error('Failed to fetch recharge history:', error);
}
};
onMounted(() => { const { columns, data, loading, getData, mobilePagination, searchParams } = useTable({
getRechargeData(); apiFn: fetchRechargeHistory,
}); apiParams: {
pageNum: 1,
const columns = computed<TableColumnsType>(() => [ pageSize: 5,
},
rowKey: 'rechargehistory',
columns: () => [
{ {
title: t('page.Rechargehistory.topupdate'), title: t('page.Rechargehistory.topupdate'),
dataIndex: 'createTime', dataIndex: 'createTime',
@@ -96,7 +83,9 @@ const columns = computed<TableColumnsType>(() => [
}) })
} }
} }
]); ]
});
</script> </script>
<template> <template>
@@ -110,16 +99,9 @@ const columns = computed<TableColumnsType>(() => [
<div> <div>
<ATable <ATable
:columns="columns" :columns="columns"
:data-source="rechargeData" :data-source="data"
:row-key="(record: Api.Recharge.RechargeRecord) => record.id" :row-key="(record: Api.Recharge.RechargeRecord) => record.id"
:pagination="{ :pagination="mobilePagination"
pageSize: 5,
total: total,
showTotal: (total: number) => `${total}`,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: ['5', '10', '20', '50']
}"
> >
<template #expandedRowRender="{ record }"> <template #expandedRowRender="{ record }">
<div class="pl-4"> <div class="pl-4">