2025-08-02 14:46:43 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 全局自动Loading管理器
|
|
|
|
|
|
* 提供智能的Loading状态管理,支持并发请求计数和超时保护
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// 环境配置
|
|
|
|
|
|
const ENV_CONFIG = {
|
|
|
|
|
|
develop: {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
loadingText: "加载中~",
|
2025-08-14 11:22:53 +08:00
|
|
|
|
loadingTime: 100,
|
2025-08-02 14:46:43 +08:00
|
|
|
|
},
|
|
|
|
|
|
trial: {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
loadingText: "加载中~",
|
2025-08-14 11:22:53 +08:00
|
|
|
|
loadingTime: 100,
|
2025-08-02 14:46:43 +08:00
|
|
|
|
},
|
|
|
|
|
|
release: {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
loadingText: "加载中~",
|
2025-08-14 11:22:53 +08:00
|
|
|
|
loadingTime: 100,
|
|
|
|
|
|
},
|
2025-08-14 17:06:05 +08:00
|
|
|
|
};
|
2025-08-02 14:46:43 +08:00
|
|
|
|
|
|
|
|
|
|
// 获取当前环境配置
|
|
|
|
|
|
const getCurrentConfig = () => {
|
|
|
|
|
|
try {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
const { envVersion } = wx.getAccountInfoSync().miniProgram;
|
|
|
|
|
|
console.log("当前环境:", envVersion);
|
|
|
|
|
|
return ENV_CONFIG[envVersion] || ENV_CONFIG.release;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
} catch (error) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.warn("获取环境失败,默认使用正式环境:", error);
|
|
|
|
|
|
return ENV_CONFIG.release;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
2025-08-14 17:06:05 +08:00
|
|
|
|
};
|
2025-08-02 14:46:43 +08:00
|
|
|
|
|
2025-08-14 17:06:05 +08:00
|
|
|
|
const config = getCurrentConfig();
|
2025-08-02 14:46:43 +08:00
|
|
|
|
|
|
|
|
|
|
// 全局状态管理
|
2025-08-14 17:06:05 +08:00
|
|
|
|
let isLoading = false;
|
|
|
|
|
|
let loadingTimer = null;
|
|
|
|
|
|
let loadingCount = 0; // 请求计数器
|
2025-08-02 14:46:43 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 设置loading超时自动清除
|
|
|
|
|
|
*/
|
|
|
|
|
|
const setLoadingTimeout = () => {
|
|
|
|
|
|
if (loadingTimer) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
clearTimeout(loadingTimer);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
loadingTimer = setTimeout(() => {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.warn("Loading超时,强制清除");
|
|
|
|
|
|
forceHideLoading();
|
|
|
|
|
|
}, 30000); // 30秒超时
|
|
|
|
|
|
};
|
2025-08-02 14:46:43 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 显示加载状态
|
|
|
|
|
|
* @param {string} text - 加载提示文字
|
|
|
|
|
|
*/
|
|
|
|
|
|
function showLoading(text = config.loadingText) {
|
|
|
|
|
|
try {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
loadingCount++;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
if (!isLoading) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
isLoading = true;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
uni.showLoading({
|
|
|
|
|
|
title: text,
|
2025-08-14 11:22:53 +08:00
|
|
|
|
mask: true,
|
2025-08-14 17:06:05 +08:00
|
|
|
|
});
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 设置超时清除
|
2025-08-14 17:06:05 +08:00
|
|
|
|
setLoadingTimeout();
|
|
|
|
|
|
console.log("显示Loading:", text);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.warn("显示loading失败:", error);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 隐藏加载状态
|
|
|
|
|
|
*/
|
|
|
|
|
|
function hideLoading() {
|
|
|
|
|
|
try {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
loadingCount--;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
if (loadingCount > 0) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.log(
|
|
|
|
|
|
"还有其他请求在进行,不隐藏Loading, 剩余请求数:",
|
|
|
|
|
|
loadingCount,
|
|
|
|
|
|
);
|
|
|
|
|
|
return; // 还有其他请求在进行
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (isLoading) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
isLoading = false;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 清除超时定时器
|
|
|
|
|
|
if (loadingTimer) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
clearTimeout(loadingTimer);
|
|
|
|
|
|
loadingTimer = null;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
2025-08-14 17:06:05 +08:00
|
|
|
|
uni.hideLoading();
|
|
|
|
|
|
console.log("隐藏Loading");
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.warn("隐藏loading失败:", error);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 强制隐藏loading
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function forceHideLoading() {
|
|
|
|
|
|
try {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
isLoading = false;
|
|
|
|
|
|
loadingCount = 0;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
if (loadingTimer) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
clearTimeout(loadingTimer);
|
|
|
|
|
|
loadingTimer = null;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
2025-08-14 17:06:05 +08:00
|
|
|
|
uni.hideLoading();
|
|
|
|
|
|
console.log("强制隐藏Loading");
|
2025-08-02 14:46:43 +08:00
|
|
|
|
} catch (error) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.warn("强制隐藏loading失败:", error);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前loading状态
|
|
|
|
|
|
* @returns {Object} loading状态信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getLoadingStatus() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
isLoading,
|
|
|
|
|
|
loadingCount,
|
2025-08-14 11:22:53 +08:00
|
|
|
|
hasTimer: !!loadingTimer,
|
2025-08-14 17:06:05 +08:00
|
|
|
|
};
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 设置loading配置
|
|
|
|
|
|
* @param {Object} newConfig - 新的配置
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function setLoadingConfig(newConfig) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
Object.assign(config, newConfig);
|
|
|
|
|
|
console.log("更新Loading配置:", config);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取loading配置
|
|
|
|
|
|
* @returns {Object} 当前配置
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getLoadingConfig() {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
return { ...config };
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 显示loading(带延迟)
|
|
|
|
|
|
* @param {string} text - 加载提示文字
|
|
|
|
|
|
* @param {number} delay - 延迟时间(毫秒)
|
|
|
|
|
|
*/
|
2025-08-14 17:06:05 +08:00
|
|
|
|
export function showLoadingWithDelay(
|
|
|
|
|
|
text = config.loadingText,
|
|
|
|
|
|
delay = config.loadingTime,
|
|
|
|
|
|
) {
|
2025-08-02 14:46:43 +08:00
|
|
|
|
setTimeout(() => {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
showLoading(text);
|
|
|
|
|
|
}, delay);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 隐藏loading(带延迟)
|
|
|
|
|
|
* @param {number} delay - 延迟时间(毫秒)
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function hideLoadingWithDelay(delay = 500) {
|
|
|
|
|
|
setTimeout(() => {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
hideLoading();
|
|
|
|
|
|
}, delay);
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 初始化全局loading管理器
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function initGlobalLoadingManager() {
|
|
|
|
|
|
// 监听页面显示事件
|
2025-08-14 17:06:05 +08:00
|
|
|
|
uni.$on("page-show", () => {
|
|
|
|
|
|
console.log("页面显示,检查loading状态");
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 页面显示时检查loading状态,如果超时则清除
|
|
|
|
|
|
if (isLoading && loadingTimer) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
const remainingTime =
|
|
|
|
|
|
30000 - (Date.now() - (loadingTimer._startTime || Date.now()));
|
2025-08-02 14:46:43 +08:00
|
|
|
|
if (remainingTime <= 0) {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.warn("页面显示时发现超时loading,强制清除");
|
|
|
|
|
|
forceHideLoading();
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-14 17:06:05 +08:00
|
|
|
|
});
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 监听页面隐藏事件
|
2025-08-14 17:06:05 +08:00
|
|
|
|
uni.$on("page-hide", () => {
|
|
|
|
|
|
console.log("页面隐藏");
|
|
|
|
|
|
});
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 监听应用显示事件
|
2025-08-14 17:06:05 +08:00
|
|
|
|
uni.$on("app-show", () => {
|
|
|
|
|
|
console.log("应用显示");
|
|
|
|
|
|
});
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 监听应用隐藏事件
|
2025-08-14 17:06:05 +08:00
|
|
|
|
uni.$on("app-hide", () => {
|
|
|
|
|
|
console.log("应用隐藏,清除loading");
|
|
|
|
|
|
forceHideLoading();
|
|
|
|
|
|
});
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-14 17:06:05 +08:00
|
|
|
|
console.log("全局loading管理器已初始化");
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 简化的自动loading管理类
|
|
|
|
|
|
*/
|
|
|
|
|
|
export class AutoLoadingManager {
|
|
|
|
|
|
constructor() {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
this.isActive = false;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
}
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 显示loading(可选)
|
2025-08-14 17:06:05 +08:00
|
|
|
|
show(text = "加载中...") {
|
|
|
|
|
|
this.isActive = true;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 这里可以选择是否显示额外的loading
|
|
|
|
|
|
// 默认情况下,所有API调用都会自动显示loading
|
|
|
|
|
|
}
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 隐藏loading(可选)
|
|
|
|
|
|
hide() {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
this.isActive = false;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 这里可以选择是否手动隐藏loading
|
|
|
|
|
|
// 默认情况下,API调用完成后会自动隐藏loading
|
|
|
|
|
|
}
|
2025-08-14 11:22:53 +08:00
|
|
|
|
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 销毁管理器
|
|
|
|
|
|
destroy() {
|
2025-08-14 17:06:05 +08:00
|
|
|
|
this.isActive = false;
|
2025-08-02 14:46:43 +08:00
|
|
|
|
// 页面卸载时可以选择是否强制清除loading
|
|
|
|
|
|
// forceHideLoading()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 导出内部方法供request.js使用
|
2025-08-14 17:06:05 +08:00
|
|
|
|
export { showLoading, hideLoading, config };
|