/**
|
* 表格数据管理组合式函数
|
* 提供分页、搜索、选择等通用功能
|
*/
|
import { ref, reactive } from 'vue';
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
|
export function useTableData(apiFunction, options = {}) {
|
const {
|
pageSize = 10,
|
searchField = 'searchAll'
|
} = options;
|
|
// 响应式数据
|
const tableData = ref([]);
|
const loading = ref(false);
|
const total = ref(0);
|
const selectedRows = ref([]);
|
|
// 查询参数
|
const queryParams = reactive({
|
[searchField]: '',
|
current: 1,
|
size: pageSize,
|
});
|
|
// 获取列表数据
|
const getList = async () => {
|
loading.value = true;
|
try {
|
const params = {
|
[searchField]: queryParams[searchField],
|
current: queryParams.current,
|
size: queryParams.size,
|
page: queryParams.current,
|
pageSize: queryParams.size,
|
pageNum: queryParams.current,
|
limit: queryParams.size,
|
offset: (queryParams.current - 1) * queryParams.size
|
};
|
|
const res = await apiFunction(params);
|
tableData.value = res.data.records || [];
|
total.value = res.data.total || 0;
|
} catch (error) {
|
ElMessage.error('获取数据失败');
|
console.error('API错误:', error);
|
} finally {
|
loading.value = false;
|
}
|
};
|
|
// 搜索
|
const handleSearch = () => {
|
queryParams.current = 1;
|
getList();
|
};
|
|
// 重置搜索
|
const handleReset = () => {
|
queryParams[searchField] = '';
|
handleSearch();
|
};
|
|
// 分页处理
|
const handlePageChange = ({ page, limit }) => {
|
if (page && page !== queryParams.current) {
|
queryParams.current = page;
|
}
|
if (limit && limit !== queryParams.size) {
|
queryParams.size = limit;
|
queryParams.current = 1; // 改变每页大小时回到第一页
|
}
|
getList();
|
};
|
|
// 表格选择处理
|
const handleSelectionChange = (selection) => {
|
selectedRows.value = selection;
|
};
|
|
// 批量删除
|
const deleteSelected = async (deleteFunction) => {
|
if (selectedRows.value.length === 0) {
|
ElMessage.warning('请选择要删除的数据');
|
return;
|
}
|
|
try {
|
await ElMessageBox.confirm(
|
`确认删除选中的 ${selectedRows.value.length} 条数据吗?`,
|
'删除确认',
|
{
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
}
|
);
|
|
const ids = selectedRows.value.map(row => row.id);
|
await deleteFunction(ids);
|
|
ElMessage.success('删除成功');
|
selectedRows.value = [];
|
getList();
|
} catch (error) {
|
if (error !== 'cancel') {
|
ElMessage.error('删除失败');
|
console.error('删除错误:', error);
|
}
|
}
|
};
|
|
// 刷新数据
|
const refresh = () => {
|
getList();
|
};
|
|
return {
|
// 数据
|
tableData,
|
loading,
|
total,
|
selectedRows,
|
queryParams,
|
|
// 方法
|
getList,
|
handleSearch,
|
handleReset,
|
handlePageChange,
|
handleSelectionChange,
|
deleteSelected,
|
refresh
|
};
|
}
|