class commonUtils { serverUrl constructor() { this.serverUrl = uni.getStorageSync('serverUrl') || 'http://47.96.97.237/API/'; } setServerUrl(url) { this.serverUrl = url } // 防抖函数 debounce(func, delay, immediate = false) { let timer = null; return function() { const context = this; const args = arguments; const callNow = immediate && !timer; // 如果定时器已经存在,清除它 if (timer) { clearTimeout(timer); } // 设置一个新的定时器 timer = setTimeout(() => { if (!immediate) { func.apply(context, args); } timer = null; }, delay); // 配置立即执行 if (callNow == true) { func.apply(context, args) } }; } // 判空函数 isEmpty(value, zeroIsEmpty = false, falseIsEmpty = false) { let val = value // 检查是否为null 或者 undefind if (val === null || val === undefined) { return true; } //如果字符串全部是由数字构成的,则转化为数字型 if (this.isAllDigits(val) === true) { val = Number(val) } // 是否是字符串类型 if (typeof val === 'string') { return val.trim().length === 0; } // 是否是数组 if (Array.isArray(val)) { return val.length === 0; } //是否是对象 if (typeof val === 'object') { return Object.keys(val).length === 0; } // 数字类型默认不为空 if (typeof val === 'number') { // 数字为0视为空 if (zeroIsEmpty == true) { if (val === 0) { return true } } return false } // 布尔类型默认不为空 if (typeof val === 'boolean') { // false值视为空 if (falseIsEmpty == true) { if (val === 0) { return true } } return false; } } // 判断是否全是数字 isAllDigits(str) { return /^\d+$/.test(str); } isJson(str) { try { JSON.parse(str) return true } catch { return false } } timeClock(callback, delay) { let timeoutId; let isRunning = false; function interval() { timeoutId = setTimeout(() => { callback(); clearTimeout(timeoutId); // 立即清除当前定时器ID if (isRunning) { interval(); } }, delay); } return { start() { if (!isRunning) { isRunning = true; interval(); } }, stop() { if (isRunning) { isRunning = false; clearTimeout(timeoutId); } } }; } deepClone(target, map = new WeakMap()) { // 处理原始值和函数(typeof 数组会返回object) if (typeof target !== 'object' || target === null) { return target; } // 处理循环引用 if (map.has(target)) { return map.get(target); } let clone; // 处理数组 if (Array.isArray(target)) { clone = []; map.set(target, clone); target.forEach((item, index) => { clone[index] = deepClone(item, map); }); return clone; } // 处理日期对象 if (target instanceof Date) { clone = new Date(target.getTime()); map.set(target, clone); return clone; } // 处理正则表达式 if (target instanceof RegExp) { clone = new RegExp(target); map.set(target, clone); return clone; } // 处理函数 (直接使用函数的引用) if (typeof target === 'function') { return target; } // 处理其他对象(普通对象、类实例等) clone = Object.create(Object.getPrototypeOf(target)); map.set(target, clone); // 获取所有属性(包括 Symbol 类型) const allKeys = [...Object.getOwnPropertyNames(target), ...Object.getOwnPropertySymbols(target)]; allKeys.forEach(key => { const descriptor = Object.getOwnPropertyDescriptor(target, key); if (descriptor && descriptor.enumerable) { // 递归复制属性值 clone[key] = deepClone(target[key], map); } }); return clone; } // uni-app 使用 封装请求函数 使用传统函数当作回调需要传that,箭头函数不需要 doRequest(url, data, resFunction, errFunction, method, that) { that = that || this; let errorTip = null; uni.showLoading({ title: '加载中...' }) uni.request({ method: method || "GET", url: this.serverUrl + url, data: data || "", success: (res) => { if (typeof resFunction === 'function') { resFunction.call(that, res) } else if (typeof errFunction === 'undefined' || errFunction === null) { return } else { throw new TypeError("访问成功回调函数类型不为函数或者空!") } }, fail: (err) => { console.error(err) errorTip = () => { uni.showToast({ icon: "none", title: err.errMsg || err.data.message || "接口异常!", duration: 2000 }) } if (typeof errFunction === 'function') { errFunction.call(that, err) } else if (typeof errFunction === 'undefined' || errFunction === null) { return } else { throw new TypeError("访问失败回调函数类型不为函数或者空!") } }, complete() { setTimeout(() => { uni.hideLoading() if (errorTip != null) { errorTip() } }, 1000) } }) } doRequest2({url, data, resFunction, errFunction, method, that}){ that = that || this; let errorTip = null; uni.showLoading({ title: '加载中...' }) uni.request({ method: method || "GET", url: this.serverUrl + url, data: data || "", success: (res) => { if (typeof resFunction === 'function') { resFunction.call(that, res) } else if (typeof errFunction === 'undefined' || errFunction === null) { return } else { throw new TypeError("访问成功回调函数类型不为函数或者空!") } }, fail: (err) => { console.error(err) errorTip = () => { uni.showToast({ icon: "none", title: err.errMsg || err.data.message || "接口异常!", duration: 2000 }) } if (typeof errFunction === 'function') { errFunction.call(that, err) } else if (typeof errFunction === 'undefined' || errFunction === null) { return } else { throw new TypeError("访问失败回调函数类型不为函数或者空!") } }, complete: () => { setTimeout(() => { uni.hideLoading() if (errorTip != null) { errorTip() } }, 1000) } }) } stringToBoolean(str) { // 忽略大小写的转换 return str?.toLowerCase() === "true"; } // uni-app 播放音频封装 playSound(e) { const innerAudioContext = uni.createInnerAudioContext(); if (e == 1) { innerAudioContext.src = '/static/success.wav'; } else { innerAudioContext.src = '/static/jingbao.wav'; } innerAudioContext.play(); // 播放音频 } replaceWithFunction(str, handler) { return str.replace(/\{(.+?)\}/g, (match, key) => { // 调用处理函数,传入匹配到的键 return handler(key, match); }); } } export const CommonUtils = new commonUtils()