feat: 分页逻辑处理

This commit is contained in:
rd
2025-09-05 10:39:01 +08:00
parent 8b42a67e9f
commit 72dabf9a9e
18 changed files with 76 additions and 127 deletions

View File

@ -22,31 +22,28 @@ export function useTableSelectionWithPagination(options: UseTableSelectionWithPa
const rowKey = options.rowKey || 'id'; const rowKey = options.rowKey || 'id';
const selectedRowKeys = ref<Array<string | number>>([]); const selectedRowKeys = ref<Array<string | number>>([]);
const selectedRows = ref<any[]>([]); const selectedRows = ref<Array<any>>([]);
const pageInfo = ref(merge({}, DEFAULT_PAGE_INFO, options.pageInfo)); const pageInfo = ref(merge({}, DEFAULT_PAGE_INFO, options.pageInfo));
const dataSource = ref<any[]>([]); const dataSource = ref<any[]>([]);
// 单行选择 // 单行选择
const handleSelect = (selectedKeys: (string | number)[], rowKeyValue: string | number, record: any) => { const handleSelect = (record: any, select: boolean) => {
const select = selectedKeys.includes(rowKeyValue); const _targetKey = record[rowKey];
selectedRowKeys.value = selectedKeys;
console.log('handleSelect', selectedKeys, rowKeyValue, record);
if (select) { if (select) {
if (!selectedRows.value.some((v) => v[rowKey] === record[rowKey])) { selectedRows.value.push(record);
selectedRows.value.push(record); selectedRowKeys.value.push(_targetKey);
}
} else { } else {
selectedRows.value = selectedRows.value.filter((v) => v[rowKey] !== record[rowKey]); selectedRows.value = selectedRows.value.filter((v) => v[rowKey] !== _targetKey);
selectedRowKeys.value = selectedRowKeys.value.filter((key) => key !== _targetKey);
} }
options.onSelectChange?.(); options.onSelectChange?.();
}; };
// 全选/取消全选 // 全选/取消全选
const handleSelectAll = (checked: boolean) => { const handleSelectAll = (checked: boolean) => {
console.log('handleSelectAll', checked)
const currentPageRows = dataSource.value; const currentPageRows = dataSource.value;
const currentPageKeys = currentPageRows.map((v) => v[rowKey]); const currentPageKeys = currentPageRows.map((v) => v[rowKey]);
@ -63,7 +60,7 @@ export function useTableSelectionWithPagination(options: UseTableSelectionWithPa
options.onSelectChange?.(); options.onSelectChange?.();
}; };
const onPageChange = (page: number, pageSize:number) => { const onPageChange = (page: number, pageSize: number) => {
// console.log('onPageChange', page, pageSize); // console.log('onPageChange', page, pageSize);
pageInfo.value.page = page; pageInfo.value.page = page;
pageInfo.value.page_size = pageSize; pageInfo.value.page_size = pageSize;
@ -76,8 +73,8 @@ export function useTableSelectionWithPagination(options: UseTableSelectionWithPa
// options.onPageSizeChange?.(size); // options.onPageSizeChange?.(size);
}; };
const resetPageInfo = () => { const resetPageInfo = () => {
pageInfo.value = cloneDeep(DEFAULT_PAGE_INFO) pageInfo.value = cloneDeep(DEFAULT_PAGE_INFO);
} };
const rowSelection = computed(() => ({ const rowSelection = computed(() => ({
type: 'checkbox', type: 'checkbox',

View File

@ -15,8 +15,6 @@ import DeleteTaskModal from './delete-task-modal.vue';
import icon1 from '@/assets/img/media-account/icon-delete.png'; import icon1 from '@/assets/img/media-account/icon-delete.png';
import { showExportNotification, showFailExportNotification } from '@/utils/arcoD'; import { showExportNotification, showFailExportNotification } from '@/utils/arcoD';
export default { export default {
setup(props, { emit, expose }) { setup(props, { emit, expose }) {
const { const {
@ -25,8 +23,6 @@ export default {
dataSource, dataSource,
pageInfo, pageInfo,
onPageChange, onPageChange,
onPageSizeChange,
rowSelection,
handleSelect, handleSelect,
handleSelectAll, handleSelectAll,
DEFAULT_PAGE_INFO, DEFAULT_PAGE_INFO,
@ -34,9 +30,6 @@ export default {
onPageChange: () => { onPageChange: () => {
getData(); getData();
}, },
onPageSizeChange: () => {
getData();
},
}); });
let queryTaskTimer = null; let queryTaskTimer = null;
@ -281,8 +274,8 @@ export default {
rowKey="id" rowKey="id"
rowSelection={{ rowSelection={{
selectedRowKeys: selectedRowKeys.value, selectedRowKeys: selectedRowKeys.value,
onChange: (keys, rows) => handleSelect(keys, rows), onSelect: handleSelect,
onSelectAll: (selected, rows, changeRows) => handleSelectAll(selected, rows, changeRows) onSelectAll: handleSelectAll,
}} }}
pagination={false} pagination={false}
scroll={{ x: '100%', y: '100%' }} scroll={{ x: '100%', y: '100%' }}
@ -346,13 +339,7 @@ export default {
onClick={() => handleDelete(record)} onClick={() => handleDelete(record)}
/> />
{record.status !== enumTaskStatus.Exporting && ( {record.status !== enumTaskStatus.Exporting && (
<Button <Button type="primary" ghost size="small" class="search-btn" onClick={() => handleDownload(record)}>
type="primary"
ghost
size="small"
class="search-btn"
onClick={() => handleDownload(record)}
>
{record.status === enumTaskStatus.Failed ? '重新导出' : '下载'} {record.status === enumTaskStatus.Failed ? '重新导出' : '下载'}
</Button> </Button>
)} )}
@ -373,7 +360,6 @@ export default {
current={pageInfo.value.page} current={pageInfo.value.page}
pageSize={pageInfo.value.page_size} pageSize={pageInfo.value.page_size}
onChange={onPageChange} onChange={onPageChange}
onShowSizeChange={onPageSizeChange}
/> />
</div> </div>
)} )}

View File

@ -21,8 +21,6 @@ export default {
dataSource, dataSource,
pageInfo, pageInfo,
onPageChange, onPageChange,
onPageSizeChange,
rowSelection,
handleSelect, handleSelect,
handleSelectAll, handleSelectAll,
DEFAULT_PAGE_INFO, DEFAULT_PAGE_INFO,
@ -30,9 +28,6 @@ export default {
onPageChange: () => { onPageChange: () => {
getData(); getData();
}, },
onPageSizeChange: () => {
getData();
},
}); });
const query = ref({ ...INITIAL_FORM }); const query = ref({ ...INITIAL_FORM });
@ -126,8 +121,8 @@ export default {
rowKey="id" rowKey="id"
rowSelection={{ rowSelection={{
selectedRowKeys: selectedRowKeys.value, selectedRowKeys: selectedRowKeys.value,
onChange: (keys, rows) => handleSelect(keys, rows), onSelect: handleSelect,
onSelectAll: (selected, rows, changeRows) => handleSelectAll(selected, rows, changeRows) onSelectAll: handleSelectAll,
}} }}
pagination={false} pagination={false}
scroll={{ x: '100%', y: '100%' }} scroll={{ x: '100%', y: '100%' }}
@ -212,7 +207,6 @@ export default {
current={pageInfo.value.page} current={pageInfo.value.page}
pageSize={pageInfo.value.page_size} pageSize={pageInfo.value.page_size}
onChange={onPageChange} onChange={onPageChange}
onShowSizeChange={onPageSizeChange}
/> />
</div> </div>
)} )}

View File

@ -1,4 +1,9 @@
.ant-table-wrapper { .ant-table-wrapper {
.ant-spin-nested-loading,
.ant-spin-container,
.ant-table{
height: 100%;
}
.ant-table { .ant-table {
border-radius: 0; border-radius: 0;
font-family: $font-family-regular; font-family: $font-family-regular;

View File

@ -269,7 +269,7 @@
<script setup> <script setup>
import topHeader from './topHeader.vue'; import topHeader from './topHeader.vue';
import { Checkbox, Modal, Button, Tooltip, Space } from 'ant-design-vue'; import { Checkbox, Modal, Button, Tooltip, Space, Table } from 'ant-design-vue';
import { import {
fetchKeywordTrendsList, fetchKeywordTrendsList,
fetchIndustryEmotions, fetchIndustryEmotions,

View File

@ -150,10 +150,6 @@ const props = defineProps({
type: Array, type: Array,
default: () => [], default: () => [],
}, },
rowSelection: {
type: Object,
default: () => {},
},
selectedRowKeys: { selectedRowKeys: {
type: Array, type: Array,
default: () => [], default: () => [],
@ -174,16 +170,10 @@ const handleTableChange = (pagination, filters, sorter) => {
const rowSelection = { const rowSelection = {
selectedRowKeys: computed(() => props.selectedRowKeys), selectedRowKeys: computed(() => props.selectedRowKeys),
onSelect: (record, selected, selectedRows, nativeEvent) => { onSelect: (record, selected) => {
console.log(selectedRows, record); emits('select', record, selected);
emits(
'select',
selectedRows.map((row) => row.id),
record.id,
record,
);
}, },
onSelectAll: (selected, selectedRows, changeRows) => { onSelectAll: (selected) => {
emits('selectAll', selected); emits('selectAll', selected);
}, },
}; };

View File

@ -36,7 +36,6 @@
<ManuscriptCheckTable <ManuscriptCheckTable
:key="query.audit_status" :key="query.audit_status"
:tableColumns="tableColumns" :tableColumns="tableColumns"
:rowSelection="rowSelection"
:selectedRowKeys="selectedRowKeys" :selectedRowKeys="selectedRowKeys"
:dataSource="dataSource" :dataSource="dataSource"
:audit_status="query.audit_status" :audit_status="query.audit_status"
@ -85,14 +84,12 @@ const props = defineProps({
const { const {
dataSource, dataSource,
pageInfo, pageInfo,
rowSelection,
onPageChange, onPageChange,
resetPageInfo, resetPageInfo,
selectedRowKeys, selectedRowKeys,
selectedRows, selectedRows,
handleSelect, handleSelect,
handleSelectAll, handleSelectAll,
DEFAULT_PAGE_INFO,
} = useTableSelectionWithPagination({ } = useTableSelectionWithPagination({
onPageChange: () => { onPageChange: () => {
getData(); getData();

View File

@ -24,8 +24,6 @@ export default {
dataSource, dataSource,
pageInfo, pageInfo,
onPageChange, onPageChange,
onPageSizeChange,
rowSelection,
handleSelect, handleSelect,
handleSelectAll, handleSelectAll,
DEFAULT_PAGE_INFO, DEFAULT_PAGE_INFO,
@ -33,9 +31,6 @@ export default {
onPageChange: () => { onPageChange: () => {
getData(); getData();
}, },
onPageSizeChange: () => {
getData();
},
}); });
const visible = ref(false); const visible = ref(false);
const query = ref(cloneDeep(INITIAL_FORM)); const query = ref(cloneDeep(INITIAL_FORM));
@ -168,8 +163,8 @@ export default {
rowKey="id" rowKey="id"
rowSelection={{ rowSelection={{
selectedRowKeys: selectedRowKeys.value, selectedRowKeys: selectedRowKeys.value,
onChange: (keys, rows) => handleSelect(keys, rows), onSelect: handleSelect,
onSelectAll: (selected, rows, changeRows) => handleSelectAll(selected, rows, changeRows), onSelectAll: handleSelectAll,
}} }}
pagination={false} pagination={false}
scroll={{ x: '100%', y: '100%' }} scroll={{ x: '100%', y: '100%' }}
@ -251,13 +246,12 @@ export default {
<Pagination <Pagination
total={pageInfo.value.total} total={pageInfo.value.total}
size="small" size="small"
showTotal={(total, range) => `${total}记录`} showTotal={(total, range) => `${total}`}
showQuickJumper showQuickJumper
showSizeChanger showSizeChanger
current={pageInfo.value.page} current={pageInfo.value.page}
pageSize={pageInfo.value.page_size} pageSize={pageInfo.value.page_size}
onChange={onPageChange} onChange={onPageChange}
onShowSizeChange={onPageSizeChange}
/> />
</div> </div>
)} )}

View File

@ -34,7 +34,7 @@
} }
.ant-table-body { .ant-table-body {
.ant-table-cell { .ant-table-cell {
padding: 6px 16px; padding: 6px 16px !important;
.ant-table-cell-content { .ant-table-cell-content {
font-size: 12px; font-size: 12px;
line-height: 20px; line-height: 20px;

View File

@ -105,10 +105,6 @@ const props = defineProps({
type: Array, type: Array,
default: () => [], default: () => [],
}, },
rowSelection: {
type: Object,
default: () => {},
},
selectedRowKeys: { selectedRowKeys: {
type: Array, type: Array,
default: () => [], default: () => [],
@ -125,10 +121,10 @@ const handleTableChange = (pagination, filters, sorter) => {
const rowSelection = { const rowSelection = {
selectedRowKeys: computed(() => props.selectedRowKeys), selectedRowKeys: computed(() => props.selectedRowKeys),
onSelect: (record, selected, selectedRows, nativeEvent) => { onSelect: (record, selected) => {
emits('select', selectedRows.map(row => row.id), record.id, record); emits('select', record, selected);
}, },
onSelectAll: (selected, selectedRows, changeRows) => { onSelectAll: (selected) => {
emits('selectAll', selected); emits('selectAll', selected);
}, },
}; };

View File

@ -14,7 +14,6 @@ export default defineComponent({
const { const {
dataSource, dataSource,
pageInfo, pageInfo,
rowSelection,
onPageChange, onPageChange,
selectedRowKeys, selectedRowKeys,
selectedRows, selectedRows,
@ -116,7 +115,6 @@ export default defineComponent({
<RawMaterialTable <RawMaterialTable
tableColumns={TABLE_COLUMNS} tableColumns={TABLE_COLUMNS}
rowSelection={rowSelection}
selectedRowKeys={selectedRowKeys.value} selectedRowKeys={selectedRowKeys.value}
dataSource={dataSource.value} dataSource={dataSource.value}
onSorterChange={handleSorterChange} onSorterChange={handleSorterChange}

View File

@ -44,13 +44,16 @@
ref="tableRef" ref="tableRef"
:dataSource="dataSource" :dataSource="dataSource"
rowKey="id" rowKey="id"
:rowSelection="rowSelection" :rowSelection="{
selectedRowKeys,
onSelect: handleSelect,
onSelectAll: handleSelectAll,
}"
:pagination="false" :pagination="false"
:scroll="{ x: '100%', y: '100%' }" :scroll="{ x: '100%', y: '100%' }"
class="flex-1 overflow-hidden" class="flex-1 overflow-hidden"
bordered bordered
:showSorterTooltip="false" :showSorterTooltip="false"
@change="(pagination, filters, sorter) => {}"
> >
<Table.Column <Table.Column
v-for="column in TABLE_COLUMNS" v-for="column in TABLE_COLUMNS"
@ -94,8 +97,8 @@
<div class="flex-1 overflow-y-auto overflow-x-hidden"> <div class="flex-1 overflow-y-auto overflow-x-hidden">
<template v-if="selectedRows?.length"> <template v-if="selectedRows?.length">
<div class="tag-item mb-8px" v-for="item in selectedRows" :key="item.id"> <div class="tag-item mb-8px" v-for="item in selectedRows" :key="item.id">
<Tooltip :title="item.name"> <Tooltip :title="item.title">
<p class="name mr-4px">{{ item.name || '-' }}</p> <p class="name mr-4px">{{ item.title || '-' }}</p>
</Tooltip> </Tooltip>
<icon-close size="12" class="color-#3C4043 cursor-pointer flex-shrink-0" @click="onDelete(item)" /> <icon-close size="12" class="color-#3C4043 cursor-pointer flex-shrink-0" @click="onDelete(item)" />
</div> </div>
@ -146,12 +149,11 @@ const props = defineProps({
}, },
}); });
const { dataSource, selectedRowKeys, selectedRows, rowSelection, handleSelect, handleSelectAll } = const { dataSource, selectedRowKeys, selectedRows, handleSelect, handleSelectAll } = useTableSelectionWithPagination({
useTableSelectionWithPagination({ onSelectChange: () => {
onSelectChange: () => { updateFormQuery();
updateFormQuery(); },
}, });
});
const query = ref({ const query = ref({
uid: '', uid: '',
@ -172,7 +174,7 @@ const handleSearch = () => {
dataSource.value = allData.value.filter((item) => { dataSource.value = allData.value.filter((item) => {
const uinMatch = uid === '' ? true : item.uid.includes(uid); const uinMatch = uid === '' ? true : item.uid.includes(uid);
const titleMatch = title === '' ? true : item.title === title; const titleMatch = title === '' ? true : item.title === title;
const operatorIdMatch = uploader_id === '' ? true : item.uploader?.id === uploader_id; const operatorIdMatch = uploader_id === undefined ? true : item.uploader?.id === uploader_id;
return uinMatch && titleMatch && operatorIdMatch; return uinMatch && titleMatch && operatorIdMatch;
}); });
}; };
@ -180,12 +182,10 @@ const handleSearch = () => {
const getUsers = async () => { const getUsers = async () => {
const { code, data } = await getUserList(); const { code, data } = await getUserList();
if (code === 200) { if (code === 200) {
uploaders.value = data.map( v => ({ uploaders.value = data.map((v) => ({
...v, ...v,
name: v.name || v.mobile name: v.name || v.mobile,
})); }));
console.log(uploaders.value);
} }
}; };
const getTableData = async () => { const getTableData = async () => {

View File

@ -47,7 +47,11 @@
ref="tableRef" ref="tableRef"
:dataSource="dataSource" :dataSource="dataSource"
rowKey="id" rowKey="id"
:rowSelection="rowSelection" :rowSelection="{
selectedRowKeys,
onSelect: handleSelect,
onSelectAll: handleSelectAll,
}"
:pagination="false" :pagination="false"
:scroll="{ x: '100%', y: '100%' }" :scroll="{ x: '100%', y: '100%' }"
class="flex-1 overflow-hidden" class="flex-1 overflow-hidden"
@ -143,7 +147,7 @@ const props = defineProps({
}, },
}); });
const { dataSource, selectedRowKeys, selectedRows, rowSelection, handleSelect, handleSelectAll } = const { dataSource, selectedRowKeys, selectedRows, handleSelect, handleSelectAll } =
useTableSelectionWithPagination({ useTableSelectionWithPagination({
onSelectChange: () => { onSelectChange: () => {
updateFormQuery(); updateFormQuery();
@ -168,8 +172,8 @@ const handleSearch = () => {
const { name, platform, operator_id } = query.value; const { name, platform, operator_id } = query.value;
dataSource.value = allData.value.filter((item) => { dataSource.value = allData.value.filter((item) => {
const nameMatch = name === '' ? true : item.name.includes(name); const nameMatch = name === '' ? true : item.name.includes(name);
const platformMatch = platform === '' ? true : item.platform === platform; const platformMatch = platform === undefined ? true : item.platform === platform;
const operatorIdMatch = operator_id === '' ? true : item.operator_id === operator_id; const operatorIdMatch = operator_id === undefined ? true : item.operator_id === operator_id;
return nameMatch && platformMatch && operatorIdMatch; return nameMatch && platformMatch && operatorIdMatch;
}); });
}; };

View File

@ -48,9 +48,8 @@
:dataSource="dataSource" :dataSource="dataSource"
rowKey="id" rowKey="id"
:rowSelection="{ :rowSelection="{
type: 'checkbox', selectedRowKeys,
selectedRowKeys: selectedRowKeys, onSelect: handleSelect,
onChange: handleSelect,
onSelectAll: handleSelectAll, onSelectAll: handleSelectAll,
}" }"
:pagination="false" :pagination="false"
@ -144,7 +143,7 @@ const props = defineProps({
}, },
}); });
const { dataSource, selectedRowKeys, selectedRows, rowSelection, handleSelect, handleSelectAll } = const { dataSource, selectedRowKeys, selectedRows, handleSelect, handleSelectAll } =
useTableSelectionWithPagination({ useTableSelectionWithPagination({
onSelectChange: () => { onSelectChange: () => {
updateFormQuery(); updateFormQuery();
@ -169,8 +168,8 @@ const handleSearch = () => {
const { name, platform, operator_id } = query.value; const { name, platform, operator_id } = query.value;
dataSource.value = allData.value.filter((item) => { dataSource.value = allData.value.filter((item) => {
const nameMatch = name === '' ? true : item.name.includes(name); const nameMatch = name === '' ? true : item.name.includes(name);
const platformMatch = platform === '' ? true : item.platform === platform; const platformMatch = platform === undefined ? true : item.platform === platform;
const operatorIdMatch = operator_id === '' ? true : item.operator_id === operator_id; const operatorIdMatch = operator_id === undefined ? true : item.operator_id === operator_id;
return nameMatch && platformMatch && operatorIdMatch; return nameMatch && platformMatch && operatorIdMatch;
}); });
}; };

View File

@ -51,7 +51,7 @@ import ProjectTable from './components/project-table';
import AddProjectModal from './components/add-project-modal'; import AddProjectModal from './components/add-project-modal';
import DeleteProjectModal from './components/project-table/delete-project-modal.vue'; import DeleteProjectModal from './components/project-table/delete-project-modal.vue';
const { dataSource, pageInfo, onPageChange, onPageSizeChange, resetPageInfo } = useTableSelectionWithPagination({ const { dataSource, pageInfo, onPageChange, resetPageInfo } = useTableSelectionWithPagination({
onPageChange: () => { onPageChange: () => {
getData(); getData();
}, },

View File

@ -45,7 +45,11 @@
<Table <Table
ref="tableRef" ref="tableRef"
:dataSource="dataSource" :dataSource="dataSource"
:rowSelection="rowSelection" :rowSelection="{
selectedRowKeys,
onSelect: handleSelect,
onSelectAll: handleSelectAll,
}"
:rowKey="ROW_KEY" :rowKey="ROW_KEY"
:pagination="false" :pagination="false"
:scroll="{ x: '100%', y: '100%' }" :scroll="{ x: '100%', y: '100%' }"
@ -125,21 +129,13 @@ const query = ref(cloneDeep(INITIAL_FORM));
const form = ref(null); const form = ref(null);
const ROW_KEY = 'account_id'; const ROW_KEY = 'account_id';
const { const { selectedRowKeys, selectedRows, dataSource, pageInfo, onPageChange, handleSelect, handleSelectAll } =
selectedRowKeys, useTableSelectionWithPagination({
selectedRows, rowKey: ROW_KEY,
dataSource, onPageChange: () => {
pageInfo, getData();
onPageChange, },
rowSelection, });
handleSelect,
handleSelectAll,
} = useTableSelectionWithPagination({
rowKey: ROW_KEY,
onPageChange: () => {
getData();
},
});
const open = (formData) => { const open = (formData) => {
const { platform, account, password } = formData; const { platform, account, password } = formData;

View File

@ -156,10 +156,6 @@ const props = defineProps({
type: Array, type: Array,
default: () => [], default: () => [],
}, },
rowSelection: {
type: Array,
default: () => [],
},
selectedRowKeys: { selectedRowKeys: {
type: Array, type: Array,
default: () => [], default: () => [],
@ -182,10 +178,10 @@ const handleTableChange = (pagination, filters, sorter) => {
const rowSelection = { const rowSelection = {
selectedRowKeys: computed(() => props.selectedRowKeys), selectedRowKeys: computed(() => props.selectedRowKeys),
onSelect: (record, selected, selectedRows, nativeEvent) => { onSelect: (record, selected) => {
emits('select', selectedRows.map(row => row.id), record.id, record); emits('select', record, selected);
}, },
onSelectAll: (selected, selectedRows, changeRows) => { onSelectAll: (selected) => {
emits('selectAll', selected); emits('selectAll', selected);
}, },
}; };

View File

@ -34,7 +34,6 @@
<ManuscriptCheckTable <ManuscriptCheckTable
:key="query.audit_status" :key="query.audit_status"
:tableColumns="tableColumns" :tableColumns="tableColumns"
:rowSelection="rowSelection"
:selectedRowKeys="selectedRowKeys" :selectedRowKeys="selectedRowKeys"
:dataSource="dataSource" :dataSource="dataSource"
:audit_status="query.audit_status" :audit_status="query.audit_status"
@ -85,14 +84,12 @@ const props = defineProps({
const { const {
dataSource, dataSource,
pageInfo, pageInfo,
rowSelection,
onPageChange, onPageChange,
resetPageInfo, resetPageInfo,
selectedRowKeys, selectedRowKeys,
selectedRows, selectedRows,
handleSelect, handleSelect,
handleSelectAll, handleSelectAll,
DEFAULT_PAGE_INFO,
} = useTableSelectionWithPagination({ } = useTableSelectionWithPagination({
onPageChange: () => { onPageChange: () => {
getData(); getData();