import Map from '@/js_sdk/fx-openMap/openMap.js' import permision from "@/js_sdk/wa-permission/permission.js" export function mapRoutePlan(data) { //既有起点也有终点 var options = { destination: { //导航终点点坐标和名称 latitude: data.point.latitude, longitude: data.point.longitude, name: data.address }, mode: "drive", //导航方式 公交:bus驾车:drive(默认),步行:walk,骑行:bike mapId: "map" //map 组件的 id (微信小程序端必传) } Map.routePlan(options, "gcj02") } // 在需要的页面中写方法,判断是否在微信浏览器中 export function is_weixin() { let flag = false; // #ifdef H5 flag = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"; // #endif // #ifdef APP-PLUS flag = false; // #endif return flag; } /** * 获取Androoid设备mac地址 * */ export function getMacAddress() { if (window) { return "D1:D1:D1:D1:D1:D1" } var net = plus.android.importClass("java.net.NetworkInterface") var wl0 = net.getByName('wlan0') var macByte = wl0.getHardwareAddress() var str = '' for (var i = 0; i < macByte.length; i++) { var tmp = ""; var num = macByte[i]; if (num < 0) { tmp = (255 + num + 1).toString(16); } else { tmp = num.toString(16); } if (tmp.length == 1) { tmp = "0" + tmp; } if (i == macByte.length - 1) { str += tmp; } else { str = str + tmp + ":"; } } return str.toUpperCase() } /** * 判断传入的值是否为空 * @param {*} val * @returns */ export function isNull(val) { if (typeof val == "boolean") { return false; } if (typeof val == "number") { return false; } if (val instanceof Array) { if (val.length == 0) return true; } else if (val instanceof Object) { if (JSON.stringify(val) === "{}") return true; } else { if ( val == "null" || val == null || val == "undefined" || val == undefined || val == "" ) return true; return false; } return false; } // 不为空 export function isDef(val) { return val !== undefined && val !== null; } // 是否是一个数字 export function isNumeric(val) { return /^\d+(\.\d+)?$/.test(val); } // 是一个对象 export function isObject(val) { return Object.prototype.toString.call(val) === "[object Object]" } // 是一个字符串 export function isString(val) { return Object.prototype.toString.call(val) === "[object String]" } // 添加单位 export function addUnit(value) { if (!isDef(value)) { return undefined; } value = String(value); return isNumeric(value) ? `${value}px` : value; } // 获得角度 export function getAngle(angx, angy) { return Math.atan2(angy, angx) * 180 / Math.PI; }; // 根据起点终点返回方向 1向上 2向下 3向左 4向右 0未滑动 export function getDirection(startx, starty, endx, endy) { var angx = endx - startx; var angy = endy - starty; var result = 0; // 如果滑动距离太短 if (Math.abs(angx) < 5 && Math.abs(angy) < 5) { return result; } var angle = getAngle(angx, angy); if (angle >= -160 && angle <= -20) { result = 1; } else if (angle > 20 && angle < 160) { result = 2; } else if ((angle >= 160 && angle <= 180) || (angle >= -180 && angle < -160)) { result = 3; } else if (angle >= -20 && angle <= 20) { result = 4; } return result; } // 回显数据字典 export function selectDictLabel(datas, value) { if (!datas) return value var actions = []; Object.keys(datas).some((key) => { if (datas[key].dictValue == ('' + value)) { actions.push(datas[key].dictLabel); return true; } }) return actions.join('') || value } /** * 处理后台返回的数据 * 去除无 children 且 isUser为false 的项目 */ export function filterCustomerManager(list) { const newList = list.filter((item) => { if (item.children) { item.name = item.label; item.children = filterCustomerManager(item.children) return item.children.length > 0 } else { item.name = item.label; item.id = item.id.toString() return item.isUser == true } }) return newList } /** * 简单实现防抖方法 * * 防抖(debounce)函数在第一次触发给定的函数时,不立即执行函数,而是给出一个期限值(delay),比如100ms。 * 如果100ms内再次执行函数,就重新开始计时,直到计时结束后再真正执行函数。 * 这样做的好处是如果短时间内大量触发同一事件,只会执行一次函数。 * * @param fn 要防抖的函数 * @param delay 防抖的毫秒数 * @returns {Function} */ export function simpleDebounce(fn, delay = 100) { let timer = null return function() { let args = arguments if (timer) { clearTimeout(timer) } timer = setTimeout(() => { fn.apply(this, args) }, delay) } } /** * 节流 * * @param delay 时间 * @param fn 执行的函数 */ export function throttle(delay, fn) { let valid = true; return function() { if (!valid) { return false } valid = false; fn() setTimeout(() => { valid = true; }, delay) } } // 获取位置 export function getLocation(option = {}) { return new Promise((resolve, reject) => { permision.requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION").then(( result) => { if (result == 1) { uni.getLocation({ type: 'gcj02', // gcj02 wgs84 ...option, success: function(res) { resolve(res); // console.log('当前位置的经度:' + res.longitude); // console.log('当前位置的纬度:' + res.latitude); }, fail() { uni.$u.toast("获取定位失败"); reject(true); } }); } else if (result == 0) { uni.$u.toast("未获得位置授权"); reject(); } else { uni.$u.toast("位置授权被永久拒绝,请手动打开"); reject(); } }); }); } export const pullDownRefreshEnableSwitch = (enable) => { const pages = getCurrentPages() const page = pages[pages.length - 1] // #ifdef APP-PLUS const currentWebview = page.$getAppWebview() currentWebview.setStyle({ pullToRefresh: { support: enable, style: plus.os.name === 'Android' ? 'circle' : 'default', }, }) // #endif // #ifdef WEB || H5 let el = document.querySelector('.uni-page-refresh') if (el) { el.style.display = enable ? 'block' : 'none' } else { let time = 0 setTimeout(() => { time++ el = document.querySelector('.uni-page-refresh') if (time < 20 && !el) { pullDownRefreshEnableSwitch(enable) } }, 100) } // #endif } // 定时器的toast export function toast(option = {}) { let time = null; time = setTimeout(() => { clearTimeout(time); uni.showToast({ icon: "none", ...option }); }, 500); } //判断中文 export function isChinese(param) { var regExp = /^[u4e00-u9fa5]*$/; if (regExp.test(param)) return false; return true; } // 计算两个经纬度之间的距离 export function getDistanceFromLatLonInM(lat1, lon1, lat2, lon2) { var R = 6371; // 地球半径,单位为千米 var dLat = deg2rad(lat2 - lat1); var dLon = deg2rad(lon2 - lon1); var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); var distance = R * c * 1000; // 转换为米 return distance; } function deg2rad(deg) { return deg * (Math.PI / 180); } /** * 构造树型结构数据 * @param {*} data 数据源 * @param {*} id id字段 默认 'id' * @param {*} parentId 父节点字段 默认 'parentId' * @param {*} children 孩子节点字段 默认 'children' * @param {*} rootId 根Id 默认 0 */ export function handleTree(data, id, parentId, children, rootId) { id = id || 'id' parentId = parentId || 'parentId' children = children || 'children' if (id === 'deptId' || id === "id") { if (data[0] && !data[0].ancestors) return rootId = 0 let maxLength = 99999999 data.forEach(item => { const length = item.ancestors.split(",").length if (maxLength > length) { maxLength = length rootId = item.parentId } }) } else { rootId = rootId || Math.min.apply(Math, data.map(item => { return item[parentId] })) || 0 } //对源数据深度克隆 const cloneData = JSON.parse(JSON.stringify(data)) //循环所有项 const treeData = cloneData.filter(father => { let branchArr = cloneData.filter(child => { //返回每一项的子级数组 return father[id] === child[parentId] }); branchArr.length > 0 ? father.children = branchArr : ''; //返回第一层 return father[parentId] === rootId; }); return treeData != '' ? treeData : data; }