var util = {} util.data = {} util.data.base_url = 'https://hwjb.homilychart.com/testApi' // util.data.base_url = 'https://dbqb.nfdxy.net/prodApi' // AJAX 请求方法 util.request = (url, callback, data = {}, failCallback) => { url = util.data.base_url + url console.log('请求该接口->', url, '请求参数为->', data); uni.request({ url: url, //仅为示例,并非真实接口地址。 data, method: 'post', header: { 'content-type': 'application/json', 'version': uni.getSystemInfoSync().appVersion, 'client': uni.getSystemInfoSync().platform == 'ios' ? 'ios' : 'android', 'token': uni.getStorageSync('token'), 'deviceId': uni.getSystemInfoSync().deviceId }, sslVerify: false, success: callback, fail: failCallback }); } export default util // 画图需要用到的方法 export const utils = { // 格式化价格 formatPrice(price) { return price.toFixed(2); }, // 计算数据范围 calculateDataRange(data, key) { if (!data || data.length === 0) { return { min: 0, max: 0, }; } const values = data.map((item) => item[key]); return { min: Math.min(...values), max: Math.max(...values), }; }, // 计算标签 calculateLabel(data, type = 2, preClosePrice = 0, key, num) { let label = []; if (key === "price") { // 分时价格区间 if (type == 1) { const priceRange = utils.calculateDataRange(data, "price"); const theMost = Math.max(priceRange.max - preClosePrice, preClosePrice - priceRange.min); const mid = (num - 1) / 2; // 计算分时价格标签 label[mid] = { value: utils.formatPrice(preClosePrice), ratio: utils.formatPrice(0) + "%", }; for (let i = 0; i < mid; i++) { label[i] = { value: utils.formatPrice(preClosePrice + (theMost * (mid - i)) / mid), ratio: utils.formatPrice((100 * (theMost * (mid - i))) / mid / preClosePrice) + "%", }; label[num - 1 - i] = { value: utils.formatPrice(preClosePrice - (theMost * (mid - i)) / mid), ratio: utils.formatPrice((-1 * 100 * (theMost * (mid - i))) / mid / preClosePrice) + "%", }; } timeChartObject.value.max = preClosePrice + theMost; timeChartObject.value.min = preClosePrice - theMost; return label; } else { const highPriceRange = utils.calculateDataRange(data, "high"); const lowPriceRange = utils.calculateDataRange(data, "low"); const priceDiff = highPriceRange.max * 1.01 - lowPriceRange.min * 0.99; for (let i = 0; i < num; ++i) { label[i] = { value: utils.formatPrice(highPriceRange.max - (i * priceDiff) / num), }; } return label; } } else if (key === "volume") { const volumeRange = utils.calculateDataRange(data, "volume"); label[0] = { value: utils.formatPrice(volumeRange.max), }; label[1] = { value: utils.formatPrice(0), }; return label; } return null; }, // 线性插值 lerp(start, end, factor) { return start + (end - start) * factor; }, // 股市数值格式化方法 formatStockNumber(value, decimalPlaces = 2) { const num = Number(value); if (isNaN(num)) return "0"; const absNum = Math.abs(num); const sign = num < 0 ? "-" : ""; if (absNum >= 1000000000000) { // 万亿级别 return sign + (absNum / 1000000000000).toFixed(decimalPlaces) + "万亿"; } else if (absNum >= 100000000) { // 亿级别 return sign + (absNum / 100000000).toFixed(decimalPlaces) + "亿"; } else if (absNum >= 10000) { // 万级别 return sign + (absNum / 10000).toFixed(decimalPlaces) + "万"; } else { // 小于万的直接显示 return sign + absNum.toFixed(decimalPlaces); } }, }; // 防抖函数 export const throttle = (fn, delay = 1000) => { //距离上一次的执行时间 let lastTime = 0; return function() { let _this = this; let _arguments = arguments; let now = new Date().getTime(); //如果距离上一次执行超过了delay才能再次执行 if (now - lastTime > delay) { fn.apply(_this, _arguments); lastTime = now; } }; };