| | |
| | | class commonUtils { |
| | | serverUrl |
| | | serverUrl |
| | | |
| | | constructor() { |
| | | this.serverUrl = uni.getStorageSync('serverUrl') || 'http://47.96.97.237/API'; |
| | | } |
| | | constructor() { |
| | | this.serverUrl = uni.getStorageSync('serverUrl') || 'http://47.96.97.237/API/'; |
| | | } |
| | | |
| | | // 防抖函数 |
| | | debounce(func, delay, immediate = false) { |
| | | let timer = null; |
| | | return function() { |
| | | const context = this; |
| | | const args = arguments; |
| | | setServerUrl(url) { |
| | | this.serverUrl = url |
| | | } |
| | | |
| | | const callNow = immediate && !timer; |
| | | // 如果定时器已经存在,清除它 |
| | | if (timer) { |
| | | clearTimeout(timer); |
| | | } |
| | | // 防抖函数 |
| | | debounce(func, delay, immediate = false) { |
| | | let timer = null; |
| | | return function() { |
| | | const context = this; |
| | | const args = arguments; |
| | | |
| | | // 设置一个新的定时器 |
| | | timer = setTimeout(() => { |
| | | if (!immediate) { |
| | | func.apply(context, args); |
| | | } |
| | | timer = null; |
| | | }, delay); |
| | | const callNow = immediate && !timer; |
| | | // 如果定时器已经存在,清除它 |
| | | if (timer) { |
| | | clearTimeout(timer); |
| | | } |
| | | |
| | | // 配置立即执行 |
| | | if (callNow == true) { |
| | | func.apply(context, args) |
| | | } |
| | | }; |
| | | } |
| | | // 设置一个新的定时器 |
| | | timer = setTimeout(() => { |
| | | if (!immediate) { |
| | | func.apply(context, args); |
| | | } |
| | | timer = null; |
| | | }, delay); |
| | | |
| | | // 判空函数 |
| | | 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 (callNow == true) { |
| | | func.apply(context, args) |
| | | } |
| | | }; |
| | | } |
| | | |
| | | // 是否是字符串类型 |
| | | if (typeof val === 'string') { |
| | | return val.trim().length === 0; |
| | | } |
| | | // 判空函数 |
| | | 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 (Array.isArray(val)) { |
| | | return val.length === 0; |
| | | } |
| | | // 是否是字符串类型 |
| | | if (typeof val === 'string') { |
| | | return val.trim().length === 0; |
| | | } |
| | | |
| | | //是否是对象 |
| | | if (typeof val === 'object') { |
| | | return Object.keys(val).length === 0; |
| | | } |
| | | // 是否是数组 |
| | | if (Array.isArray(val)) { |
| | | return val.length === 0; |
| | | } |
| | | |
| | | // 数字类型默认不为空 |
| | | if (typeof val === 'number') { |
| | | // 数字为0视为空 |
| | | if (zeroIsEmpty == true) { |
| | | if (val === 0) { |
| | | return true |
| | | } |
| | | } |
| | | return false |
| | | } |
| | | //是否是对象 |
| | | if (typeof val === 'object') { |
| | | return Object.keys(val).length === 0; |
| | | } |
| | | |
| | | // 布尔类型默认不为空 |
| | | if (typeof val === 'boolean') { |
| | | // false值视为空 |
| | | if (falseIsEmpty == true) { |
| | | if (val === 0) { |
| | | return true |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | // 数字类型默认不为空 |
| | | if (typeof val === 'number') { |
| | | // 数字为0视为空 |
| | | if (zeroIsEmpty == true) { |
| | | if (val === 0) { |
| | | return true |
| | | } |
| | | } |
| | | return false |
| | | } |
| | | |
| | | // 判断是否全是数字 |
| | | isAllDigits(str) { |
| | | return /^\d+$/.test(str); |
| | | } |
| | | // 布尔类型默认不为空 |
| | | if (typeof val === 'boolean') { |
| | | // false值视为空 |
| | | if (falseIsEmpty == true) { |
| | | if (val === 0) { |
| | | return true |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | isJson(str) { |
| | | try { |
| | | JSON.parse(str) |
| | | return true |
| | | } catch { |
| | | return false |
| | | } |
| | | } |
| | | // 判断是否全是数字 |
| | | isAllDigits(str) { |
| | | return /^\d+$/.test(str); |
| | | } |
| | | |
| | | timeClock(callback, delay) { |
| | | let timeoutId; |
| | | let isRunning = false; |
| | | isJson(str) { |
| | | try { |
| | | JSON.parse(str) |
| | | return true |
| | | } catch { |
| | | return false |
| | | } |
| | | } |
| | | |
| | | function interval() { |
| | | timeoutId = setTimeout(() => { |
| | | callback(); |
| | | clearTimeout(timeoutId); // 立即清除当前定时器ID |
| | | if (isRunning) { |
| | | interval(); |
| | | } |
| | | }, delay); |
| | | } |
| | | timeClock(callback, delay) { |
| | | let timeoutId; |
| | | let isRunning = false; |
| | | |
| | | return { |
| | | start() { |
| | | if (!isRunning) { |
| | | isRunning = true; |
| | | interval(); |
| | | } |
| | | }, |
| | | stop() { |
| | | if (isRunning) { |
| | | isRunning = false; |
| | | clearTimeout(timeoutId); |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | function interval() { |
| | | timeoutId = setTimeout(() => { |
| | | callback(); |
| | | clearTimeout(timeoutId); // 立即清除当前定时器ID |
| | | if (isRunning) { |
| | | interval(); |
| | | } |
| | | }, delay); |
| | | } |
| | | |
| | | deepClone(target, map = new WeakMap()) { |
| | | // 处理原始值和函数(typeof 数组会返回object) |
| | | if (typeof target !== 'object' || target === null) { |
| | | return target; |
| | | } |
| | | return { |
| | | start() { |
| | | if (!isRunning) { |
| | | isRunning = true; |
| | | interval(); |
| | | } |
| | | }, |
| | | stop() { |
| | | if (isRunning) { |
| | | isRunning = false; |
| | | clearTimeout(timeoutId); |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | |
| | | // 处理循环引用 |
| | | if (map.has(target)) { |
| | | return map.get(target); |
| | | } |
| | | deepClone(target, map = new WeakMap()) { |
| | | // 处理原始值和函数(typeof 数组会返回object) |
| | | if (typeof target !== 'object' || target === null) { |
| | | return target; |
| | | } |
| | | |
| | | let clone; |
| | | // 处理循环引用 |
| | | if (map.has(target)) { |
| | | return map.get(target); |
| | | } |
| | | |
| | | // 处理数组 |
| | | if (Array.isArray(target)) { |
| | | clone = []; |
| | | map.set(target, clone); |
| | | target.forEach((item, index) => { |
| | | clone[index] = deepClone(item, map); |
| | | }); |
| | | return clone; |
| | | } |
| | | let clone; |
| | | |
| | | // 处理日期对象 |
| | | if (target instanceof Date) { |
| | | clone = new Date(target.getTime()); |
| | | map.set(target, clone); |
| | | return clone; |
| | | } |
| | | // 处理数组 |
| | | if (Array.isArray(target)) { |
| | | clone = []; |
| | | map.set(target, clone); |
| | | target.forEach((item, index) => { |
| | | clone[index] = deepClone(item, map); |
| | | }); |
| | | return clone; |
| | | } |
| | | |
| | | // 处理正则表达式 |
| | | if (target instanceof RegExp) { |
| | | clone = new RegExp(target); |
| | | map.set(target, clone); |
| | | return clone; |
| | | } |
| | | // 处理日期对象 |
| | | if (target instanceof Date) { |
| | | clone = new Date(target.getTime()); |
| | | map.set(target, clone); |
| | | return clone; |
| | | } |
| | | |
| | | // 处理函数 (直接使用函数的引用) |
| | | if (typeof target === 'function') { |
| | | return target; |
| | | } |
| | | // 处理正则表达式 |
| | | if (target instanceof RegExp) { |
| | | clone = new RegExp(target); |
| | | map.set(target, clone); |
| | | return clone; |
| | | } |
| | | |
| | | // 处理其他对象(普通对象、类实例等) |
| | | clone = Object.create(Object.getPrototypeOf(target)); |
| | | map.set(target, clone); |
| | | // 处理函数 (直接使用函数的引用) |
| | | if (typeof target === 'function') { |
| | | return target; |
| | | } |
| | | |
| | | // 获取所有属性(包括 Symbol 类型) |
| | | const allKeys = [...Object.getOwnPropertyNames(target), ...Object.getOwnPropertySymbols(target)]; |
| | | // 处理其他对象(普通对象、类实例等) |
| | | clone = Object.create(Object.getPrototypeOf(target)); |
| | | map.set(target, clone); |
| | | |
| | | allKeys.forEach(key => { |
| | | const descriptor = Object.getOwnPropertyDescriptor(target, key); |
| | | if (descriptor && descriptor.enumerable) { |
| | | // 递归复制属性值 |
| | | clone[key] = deepClone(target[key], map); |
| | | } |
| | | }); |
| | | // 获取所有属性(包括 Symbol 类型) |
| | | const allKeys = [...Object.getOwnPropertyNames(target), ...Object.getOwnPropertySymbols(target)]; |
| | | |
| | | return clone; |
| | | } |
| | | allKeys.forEach(key => { |
| | | const descriptor = Object.getOwnPropertyDescriptor(target, key); |
| | | if (descriptor && descriptor.enumerable) { |
| | | // 递归复制属性值 |
| | | clone[key] = deepClone(target[key], map); |
| | | } |
| | | }); |
| | | |
| | | // 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("访问失败回调函数类型不为函数或者空!") |
| | | } |
| | | return clone; |
| | | } |
| | | |
| | | }, |
| | | complete() { |
| | | setTimeout(() => { |
| | | uni.hideLoading() |
| | | if (errorTip != null) { |
| | | errorTip() |
| | | } |
| | | }, 1000) |
| | | } |
| | | }) |
| | | } |
| | | // 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("访问失败回调函数类型不为函数或者空!") |
| | | } |
| | | |
| | | // uni-app 播放音频封装 |
| | | playSound(e) { |
| | | const innerAudioContext = uni.createInnerAudioContext(); |
| | | if (e == 1) { |
| | | innerAudioContext.src = '/static/success.wav'; |
| | | } else { |
| | | innerAudioContext.src = '/static/jingbao.wav'; |
| | | } |
| | | innerAudioContext.play(); // 播放音频 |
| | | } |
| | | }, |
| | | complete() { |
| | | setTimeout(() => { |
| | | uni.hideLoading() |
| | | if (errorTip != null) { |
| | | errorTip() |
| | | } |
| | | }, 1000) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // uni-app 播放音频封装 |
| | | playSound(e) { |
| | | const innerAudioContext = uni.createInnerAudioContext(); |
| | | if (e == 1) { |
| | | innerAudioContext.src = '/static/success.wav'; |
| | | } else { |
| | | innerAudioContext.src = '/static/jingbao.wav'; |
| | | } |
| | | innerAudioContext.play(); // 播放音频 |
| | | } |
| | | } |
| | | |
| | | export const CommonUtils = Object.freeze(new commonUtils()); |
| | | export const CommonUtils = new commonUtils() |