张诺
23 小时以前 7619d415522ab3dc3299d6a2a9f5c9964a692d3f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
 * 表格数据管理组合式函数
 * 提供分页、搜索、选择等通用功能
 */
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
  };
}