forked from gxwebsoft/mp-10550
- 完善 reload函数逻辑,添加用户登录流程- 引入加载状态管理,优化异步操作流程 -增加网络诊断工具,帮助排查加载问题 - 改进错误处理,提升用户体验 -详细文档记录解决方案,便于后续支持
156 lines
4.2 KiB
TypeScript
156 lines
4.2 KiB
TypeScript
import Taro from '@tarojs/taro';
|
||
|
||
/**
|
||
* 网络连接检测工具
|
||
*/
|
||
export class NetworkChecker {
|
||
/**
|
||
* 检查网络连接状态
|
||
*/
|
||
static async checkNetworkStatus(): Promise<{
|
||
isConnected: boolean;
|
||
networkType: string;
|
||
message: string;
|
||
}> {
|
||
try {
|
||
const networkInfo = await Taro.getNetworkType();
|
||
const isConnected = networkInfo.networkType !== 'none';
|
||
|
||
return {
|
||
isConnected,
|
||
networkType: networkInfo.networkType,
|
||
message: isConnected
|
||
? `网络连接正常 (${networkInfo.networkType})`
|
||
: '网络连接异常'
|
||
};
|
||
} catch (error) {
|
||
console.error('检查网络状态失败:', error);
|
||
return {
|
||
isConnected: false,
|
||
networkType: 'unknown',
|
||
message: '无法检测网络状态'
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 测试API连接
|
||
*/
|
||
static async testAPIConnection(baseUrl: string): Promise<{
|
||
success: boolean;
|
||
responseTime: number;
|
||
message: string;
|
||
}> {
|
||
const startTime = Date.now();
|
||
|
||
try {
|
||
const response = await Taro.request({
|
||
url: `${baseUrl}/health`,
|
||
method: 'GET',
|
||
timeout: 5000
|
||
});
|
||
|
||
const responseTime = Date.now() - startTime;
|
||
|
||
return {
|
||
success: response.statusCode === 200,
|
||
responseTime,
|
||
message: `API连接${response.statusCode === 200 ? '正常' : '异常'} (${responseTime}ms)`
|
||
};
|
||
} catch (error) {
|
||
const responseTime = Date.now() - startTime;
|
||
console.error('API连接测试失败:', error);
|
||
|
||
return {
|
||
success: false,
|
||
responseTime,
|
||
message: `API连接失败 (${responseTime}ms): ${error}`
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 综合网络诊断
|
||
*/
|
||
static async diagnoseNetwork(baseUrl: string): Promise<{
|
||
network: any;
|
||
api: any;
|
||
suggestions: string[];
|
||
}> {
|
||
console.log('🔍 开始网络诊断...');
|
||
|
||
const network = await this.checkNetworkStatus();
|
||
const api = await this.testAPIConnection(baseUrl);
|
||
|
||
const suggestions: string[] = [];
|
||
|
||
if (!network.isConnected) {
|
||
suggestions.push('请检查网络连接');
|
||
suggestions.push('尝试切换网络环境(WiFi/移动数据)');
|
||
}
|
||
|
||
if (!api.success) {
|
||
suggestions.push('服务器可能暂时不可用');
|
||
suggestions.push('请稍后重试');
|
||
if (api.responseTime > 10000) {
|
||
suggestions.push('网络响应较慢,建议检查网络质量');
|
||
}
|
||
}
|
||
|
||
if (network.networkType === 'wifi') {
|
||
suggestions.push('WiFi连接正常,如仍有问题请检查路由器');
|
||
} else if (network.networkType === '4g' || network.networkType === '5g') {
|
||
suggestions.push('移动网络连接,请确保有足够的流量');
|
||
}
|
||
|
||
console.log('📊 网络诊断结果:', { network, api, suggestions });
|
||
|
||
return { network, api, suggestions };
|
||
}
|
||
|
||
/**
|
||
* 显示网络诊断结果
|
||
*/
|
||
static async showNetworkDiagnosis(baseUrl: string) {
|
||
Taro.showLoading({ title: '诊断网络中...', mask: true });
|
||
|
||
try {
|
||
const diagnosis = await this.diagnoseNetwork(baseUrl);
|
||
Taro.hideLoading();
|
||
|
||
const content = [
|
||
`网络状态: ${diagnosis.network.message}`,
|
||
`API连接: ${diagnosis.api.message}`,
|
||
'',
|
||
'建议:',
|
||
...diagnosis.suggestions.map(s => `• ${s}`)
|
||
].join('\n');
|
||
|
||
Taro.showModal({
|
||
title: '网络诊断结果',
|
||
content,
|
||
showCancel: false,
|
||
confirmText: '知道了'
|
||
});
|
||
} catch (error) {
|
||
Taro.hideLoading();
|
||
console.error('网络诊断失败:', error);
|
||
|
||
Taro.showModal({
|
||
title: '诊断失败',
|
||
content: '无法完成网络诊断,请检查网络连接后重试',
|
||
showCancel: false,
|
||
confirmText: '知道了'
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 便捷方法
|
||
*/
|
||
export const checkNetwork = () => NetworkChecker.checkNetworkStatus();
|
||
export const testAPI = (baseUrl: string) => NetworkChecker.testAPIConnection(baseUrl);
|
||
export const diagnoseNetwork = (baseUrl: string) => NetworkChecker.diagnoseNetwork(baseUrl);
|
||
export const showNetworkDiagnosis = (baseUrl: string) => NetworkChecker.showNetworkDiagnosis(baseUrl);
|