247 lines
6.3 KiB
JavaScript
247 lines
6.3 KiB
JavaScript
/**
|
|
* 数据管理 Mixin
|
|
* 提供通用的数据获取、分页加载功能
|
|
* 支持多种数据格式和灵活的配置
|
|
*/
|
|
export const dataManagerMixin = {
|
|
data() {
|
|
return {
|
|
// 数据数组
|
|
dataList: [],
|
|
// 加载状态
|
|
loading: false,
|
|
// 分页参数
|
|
pageNum: 1,
|
|
pageSize: 8,
|
|
hasMore: true,
|
|
// 总数据量
|
|
total: 0,
|
|
// 当前查询参数
|
|
currentParams: {},
|
|
};
|
|
},
|
|
|
|
methods: {
|
|
/**
|
|
* 获取数据
|
|
* @param {Object} options 配置选项
|
|
* @param {boolean} options.isLoadMore 是否为加载更多
|
|
* @param {Function} options.apiCall API调用函数
|
|
* @param {Function} options.dataTransformer 数据转换函数
|
|
* @param {Object} options.params 查询参数
|
|
* @param {string} options.dataPath 数据路径,如 'data.list.rows'
|
|
* @param {string} options.totalPath 总数路径,如 'data.total'
|
|
* @param {Function} options.onSuccess 成功回调
|
|
* @param {Function} options.onError 错误回调
|
|
* @param {boolean} options.showLoading 是否显示loading
|
|
* @param {boolean} options.showError 是否显示错误提示
|
|
*/
|
|
async fetchData(options = {}) {
|
|
const {
|
|
isLoadMore = false,
|
|
apiCall,
|
|
dataTransformer,
|
|
params = {},
|
|
dataPath = "rows",
|
|
totalPath = "total",
|
|
onSuccess,
|
|
onError,
|
|
showLoading = true,
|
|
showError = true,
|
|
} = options;
|
|
|
|
if (!apiCall) {
|
|
console.error("fetchData: apiCall 是必需的");
|
|
return;
|
|
}
|
|
|
|
// 设置loading状态
|
|
if (showLoading) {
|
|
this.loading = true;
|
|
}
|
|
|
|
try {
|
|
console.log("isLoadMore", isLoadMore);
|
|
// 更新页码
|
|
if (isLoadMore) {
|
|
this.pageNum++;
|
|
console.log("this.pageNum", this.pageNum);
|
|
} else {
|
|
this.pageNum = 1;
|
|
}
|
|
|
|
// 构建请求参数
|
|
const requestParams = {
|
|
...this.currentParams,
|
|
...params,
|
|
pageNum: this.pageNum,
|
|
pageSize: this.pageSize,
|
|
};
|
|
console.log("requestParams", requestParams);
|
|
// 调用API
|
|
const response = await apiCall(requestParams);
|
|
|
|
console.log("API响应:", response);
|
|
console.log("数据路径:", dataPath);
|
|
console.log("总数路径:", totalPath);
|
|
|
|
if (response.code === 200) {
|
|
// 根据路径获取数据
|
|
const dataArray = this.getNestedValue(response, dataPath) || [];
|
|
const total = this.getNestedValue(response, totalPath) || 0;
|
|
|
|
console.log("提取的数据数组:", dataArray);
|
|
console.log("总数:", total);
|
|
|
|
// 转换数据
|
|
const newData = dataTransformer
|
|
? dataTransformer(dataArray)
|
|
: dataArray;
|
|
|
|
console.log("转换后的数据:", newData);
|
|
|
|
// 更新数据
|
|
if (isLoadMore) {
|
|
this.dataList = [...this.dataList, ...newData];
|
|
} else {
|
|
this.dataList = newData;
|
|
}
|
|
|
|
console.log("更新后的 dataList:", this.dataList);
|
|
|
|
// 更新状态
|
|
this.total = total;
|
|
|
|
this.currentParams = { ...requestParams };
|
|
console.log("@@@hasMore", this.hasMore);
|
|
this.hasMore =
|
|
this.pageSize * this.currentParams.pageNum < this.total;
|
|
|
|
console.log("this.hasMore", this.hasMore);
|
|
console.log("this.total", this.total);
|
|
console.log("this.pageSize", this.pageSize);
|
|
console.log("this.currentParams.pageNum", this.currentParams.pageNum);
|
|
|
|
// 成功回调
|
|
if (onSuccess) {
|
|
onSuccess(newData, response);
|
|
}
|
|
} else {
|
|
const errorMsg = response.msg || "获取数据失败";
|
|
if (showError) {
|
|
uni.showToast({
|
|
title: errorMsg,
|
|
icon: "none",
|
|
});
|
|
}
|
|
if (onError) {
|
|
onError(errorMsg, response);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("获取数据失败:", error);
|
|
const errorMsg = "网络错误";
|
|
if (showError) {
|
|
uni.showToast({
|
|
title: errorMsg,
|
|
icon: "none",
|
|
});
|
|
}
|
|
if (onError) {
|
|
onError(errorMsg, error);
|
|
}
|
|
} finally {
|
|
if (showLoading) {
|
|
this.loading = false;
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 刷新数据
|
|
* @param {Object} options 配置选项
|
|
*/
|
|
refreshData(options = {}) {
|
|
return this.fetchData({
|
|
isLoadMore: false,
|
|
...options,
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 加载更多数据
|
|
* @param {Object} options 配置选项
|
|
*/
|
|
loadMoreData(options = {}) {
|
|
if (this.hasMore && !this.loading) {
|
|
return this.fetchData({
|
|
isLoadMore: true,
|
|
...options,
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 搜索数据
|
|
* @param {Object} searchParams 搜索参数
|
|
* @param {Object} options 配置选项
|
|
*/
|
|
searchData(searchParams = {}, options = {}) {
|
|
return this.fetchData({
|
|
// isLoadMore: false,
|
|
params: searchParams,
|
|
...options,
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 重置分页状态
|
|
*/
|
|
resetPagination() {
|
|
this.pageNum = 1;
|
|
this.hasMore = true; //可能就单页
|
|
this.dataList = [];
|
|
this.total = 0;
|
|
this.currentParams = {};
|
|
},
|
|
|
|
/**
|
|
* 获取嵌套对象的值
|
|
* @param {Object} obj 对象
|
|
* @param {string} path 路径,如 'data.list.rows'
|
|
* @returns {*} 值
|
|
*/
|
|
getNestedValue(obj, path) {
|
|
if (!path) return obj;
|
|
return path.split(".").reduce((current, key) => {
|
|
return current && current[key] !== undefined ? current[key] : null;
|
|
}, obj);
|
|
},
|
|
|
|
/**
|
|
* 设置分页大小
|
|
* @param {number} pageSize 分页大小
|
|
*/
|
|
setPageSize(pageSize) {
|
|
this.pageSize = pageSize;
|
|
this.resetPagination();
|
|
},
|
|
|
|
/**
|
|
* 获取当前数据状态
|
|
* @returns {Object} 数据状态
|
|
*/
|
|
getDataState() {
|
|
return {
|
|
dataList: this.dataList,
|
|
loading: this.loading,
|
|
pageNum: this.pageNum,
|
|
pageSize: this.pageSize,
|
|
hasMore: this.hasMore,
|
|
total: this.total,
|
|
currentParams: this.currentParams,
|
|
};
|
|
},
|
|
},
|
|
};
|