buddhism/pages/institutionalStructure/mixins/data-manager.js
2025-09-17 16:00:22 +08:00

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,
};
},
},
};