初次提交
This commit is contained in:
214
utils.js
Normal file
214
utils.js
Normal file
@@ -0,0 +1,214 @@
|
||||
// 工具类
|
||||
class Utils {
|
||||
constructor() {
|
||||
this.logLevels = {
|
||||
debug: 0,
|
||||
info: 1,
|
||||
warn: 2,
|
||||
error: 3
|
||||
};
|
||||
this.currentLogLevel = this.logLevels[GameConfig.debug.logLevel];
|
||||
}
|
||||
|
||||
// 日志记录
|
||||
log(level, message, ...args) {
|
||||
if (!GameConfig.debug.enableLogging) return;
|
||||
|
||||
const levelNum = this.logLevels[level];
|
||||
if (levelNum >= this.currentLogLevel) {
|
||||
const timestamp = new Date().toISOString();
|
||||
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
|
||||
|
||||
switch (level) {
|
||||
case 'debug':
|
||||
console.debug(prefix, message, ...args);
|
||||
break;
|
||||
case 'info':
|
||||
console.info(prefix, message, ...args);
|
||||
break;
|
||||
case 'warn':
|
||||
console.warn(prefix, message, ...args);
|
||||
break;
|
||||
case 'error':
|
||||
console.error(prefix, message, ...args);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debug(message, ...args) {
|
||||
this.log('debug', message, ...args);
|
||||
}
|
||||
|
||||
info(message, ...args) {
|
||||
this.log('info', message, ...args);
|
||||
}
|
||||
|
||||
warn(message, ...args) {
|
||||
this.log('warn', message, ...args);
|
||||
}
|
||||
|
||||
error(message, ...args) {
|
||||
this.log('error', message, ...args);
|
||||
}
|
||||
|
||||
// 性能监控
|
||||
measurePerformance(name, fn) {
|
||||
const start = performance.now();
|
||||
const result = fn();
|
||||
const end = performance.now();
|
||||
const duration = end - start;
|
||||
|
||||
this.debug(`Performance [${name}]: ${duration.toFixed(2)}ms`);
|
||||
return { result, duration };
|
||||
}
|
||||
|
||||
// 防抖函数
|
||||
debounce(func, wait) {
|
||||
let timeout;
|
||||
return function executedFunction(...args) {
|
||||
const later = () => {
|
||||
clearTimeout(timeout);
|
||||
func(...args);
|
||||
};
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
};
|
||||
}
|
||||
|
||||
// 节流函数
|
||||
throttle(func, limit) {
|
||||
let inThrottle;
|
||||
return function() {
|
||||
const args = arguments;
|
||||
const context = this;
|
||||
if (!inThrottle) {
|
||||
func.apply(context, args);
|
||||
inThrottle = true;
|
||||
setTimeout(() => inThrottle = false, limit);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// 坐标验证
|
||||
validateCoordinates(x, y, maxX = 400, maxY = 400) {
|
||||
// 坐标系以左下角为原点,x轴从左到右,y轴从下到上
|
||||
return x >= 0 && x <= maxX && y >= 0 && y <= maxY;
|
||||
}
|
||||
|
||||
// 随机颜色生成
|
||||
generateRandomColor() {
|
||||
const colors = [
|
||||
'#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4',
|
||||
'#feca57', '#ff9ff3', '#54a0ff', '#5f27cd'
|
||||
];
|
||||
return colors[Math.floor(Math.random() * colors.length)];
|
||||
}
|
||||
|
||||
// 格式化时间
|
||||
formatTime(ms) {
|
||||
if (ms < 1000) return `${ms}ms`;
|
||||
if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;
|
||||
return `${(ms / 60000).toFixed(1)}m`;
|
||||
}
|
||||
|
||||
// 格式化字节大小
|
||||
formatBytes(bytes) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
const k = 1024;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
||||
}
|
||||
|
||||
// 深拷贝
|
||||
deepClone(obj) {
|
||||
if (obj === null || typeof obj !== 'object') return obj;
|
||||
if (obj instanceof Date) return new Date(obj.getTime());
|
||||
if (obj instanceof Array) return obj.map(item => this.deepClone(item));
|
||||
if (typeof obj === 'object') {
|
||||
const clonedObj = {};
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
clonedObj[key] = this.deepClone(obj[key]);
|
||||
}
|
||||
}
|
||||
return clonedObj;
|
||||
}
|
||||
}
|
||||
|
||||
// 本地存储工具
|
||||
storage = {
|
||||
set(key, value) {
|
||||
try {
|
||||
localStorage.setItem(key, JSON.stringify(value));
|
||||
} catch (error) {
|
||||
console.error('Failed to save to localStorage:', error);
|
||||
}
|
||||
},
|
||||
|
||||
get(key, defaultValue = null) {
|
||||
try {
|
||||
const item = localStorage.getItem(key);
|
||||
return item ? JSON.parse(item) : defaultValue;
|
||||
} catch (error) {
|
||||
console.error('Failed to read from localStorage:', error);
|
||||
return defaultValue;
|
||||
}
|
||||
},
|
||||
|
||||
remove(key) {
|
||||
try {
|
||||
localStorage.removeItem(key);
|
||||
} catch (error) {
|
||||
console.error('Failed to remove from localStorage:', error);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 网络状态检测
|
||||
checkNetworkStatus() {
|
||||
return navigator.onLine;
|
||||
}
|
||||
|
||||
// 设备信息
|
||||
getDeviceInfo() {
|
||||
return {
|
||||
userAgent: navigator.userAgent,
|
||||
platform: navigator.platform,
|
||||
language: navigator.language,
|
||||
cookieEnabled: navigator.cookieEnabled,
|
||||
onLine: navigator.onLine,
|
||||
screenWidth: screen.width,
|
||||
screenHeight: screen.height,
|
||||
windowWidth: window.innerWidth,
|
||||
windowHeight: window.innerHeight
|
||||
};
|
||||
}
|
||||
|
||||
// 错误处理
|
||||
handleError(error, context = '') {
|
||||
this.error(`Error in ${context}:`, error);
|
||||
|
||||
// 可以在这里添加错误上报逻辑
|
||||
if (GameConfig.debug.showConnectionDetails) {
|
||||
console.group('Error Details');
|
||||
console.error('Error:', error);
|
||||
console.error('Context:', context);
|
||||
console.error('Stack:', error.stack);
|
||||
console.error('Device Info:', this.getDeviceInfo());
|
||||
console.groupEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 创建全局工具实例
|
||||
const utils = new Utils();
|
||||
|
||||
// 导出工具类
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = Utils;
|
||||
} else {
|
||||
window.Utils = Utils;
|
||||
window.utils = utils;
|
||||
}
|
||||
Reference in New Issue
Block a user