import store from '@/store' import { mobileReg } from './tools/validate' import { uploadPic } from '@/api/common' import CONSTANT from '@/constant/index' import { parse } from '@/utils/util' // 判断是mobile 还是pc export function isMobile() { // 移动端 if (/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent)) { return true } return false } // 获取当前连接地址 export function getUrlHref() { // let comProtocolUrl = window.location.protocol // 协议 // let comHostUrl = window.location.host // 主机 // let url = comProtocolUrl + '//' + comHostUrl // url = 'http://dev.meijiabang.com' return CONSTANT.formal } /** * * 跳转到商城 * @parmas jumpUrl 跳转的页面地址 * @parmas attrUrl 用户的头像地址 * @parmas titleName 用户的名字 * @parmas urlEndStr 跳转的页面url需要补充的参数 例'&aaa=111' */ export function jumpShop(jumpUrl, attrUrl, titleName, urlEndStr) { } // 获取小程序地址完整路径 export function getMiniAppUrl(data = {}, isPath = false) { let getCurPages = getCurrentPages() if (getCurPages.length == 0) return false let getCurPagesObj = getCurPages[getCurPages.length - 1] console.log(getCurPagesObj) // let getRoute = getCurPagesObj.route + queryData(getCurPagesObj.options) // let getRoute = getCurPagesObj.route + queryData(data) let getRoute = getCurPagesObj.route + parse(data) getRoute = isPath ? `${CONSTANT.formal}/#/${getRoute}` : getRoute return getRoute } // 获取当前时间戳 export function getTimestamp() { return Date.parse(new Date()) } // 生成从minNum到maxNum的随机数 export function getRandomNum(minNum, maxNum) { switch (arguments.length) { case 1: return parseInt(Math.random() * minNum + 1, 10) // eslint-disable-next-line no-unreachable break case 2: return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10) break default: return 0 break } } // 节流 export function debounce(fn, time) { let handle return function(e) { // 取消之前的延时调用 clearTimeout(handle) handle = setTimeout(() => { fn(e) }, time || 50) } } // 登录页面公共地址栏参数传递 export function loginParmas(data) { // eslint-disable-next-line one-var const query = {}, ownerUserId = data.owner_user_id, shareUserId = data.share_user_id, pShareUserId = data.p_share_user_id, f = data.f // eslint-disable-next-line camelcase if (ownerUserId) { query['owner_user_id'] = ownerUserId } if (shareUserId) { query['share_user_id'] = shareUserId } if (pShareUserId) { query['p_share_user_id'] = pShareUserId } if (f) { query['f'] = f } return query } /** * * 根据时间戳获取日期时间 * fmt格式 例:yyyy-MM-dd hh:mm:ss * status 为 true 时是13位时间 */ export function getFormatDate(time, fmt, status) { try { time = status ? time : time * 1000 const now = new Date(time) return now.Format(fmt) } catch (e) { if (window.console) { console.log(e) } } } /** * * 时间格式化 */ // eslint-disable-next-line no-extend-native Date.prototype.Format = function(fmt = 'yyyy-MM-dd hh:mm:ss') { const o = { 'M+': this.getMonth() + 1, // 月份 'd+': this.getDate(), // 日 'h+': this.getHours(), // 小时 'm+': this.getMinutes(), // 分 's+': this.getSeconds(), // 秒 'q+': Math.floor((this.getMonth() + 3) / 3), // 季度 S: this.getMilliseconds() // 毫秒 } if (/(y+)/.test(fmt)) { fmt = fmt.replace( RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length) ) } for (const k in o) { if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)) } } return fmt } /** * * 根据日期获取时间戳 * @parmas yyyy-MM-dd hh:mm:ss * @params second true的话获取的时间戳是到秒的 */ // 获取时间戳方法 export function getDataTimestamp(time, second) { let etime = time || new Date if (second) { etime = Date.parse(time) / 1000 } else { etime = new Date(etime) etime = etime.getTime() } return etime } // 判断是否为用户角色类型(个人: true || 企业: false) export function isPersonRoleType(roleType) { // 装修公司或材料商 if (roleType === 1 || roleType === 2) { return false } // 其余类型均属于个人 return true } /** * * 是否是微信浏览器 */ export function isWxBrowser() { let status = false // #ifdef H5 const ua = window.navigator.userAgent.toLowerCase() // 通过正则表达式匹配ua中是否含有MicroMessenger字符串 if (ua.match(/MicroMessenger/i) == 'micromessenger') { status = true } else { status = false } // #endif // #ifdef MP-WEIXIN status = false // #endif return status } /** * * 是否是微信小程序 */ export async function isWxMiniapp() { let status = false const ua = navigator.userAgent.toLowerCase() // ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器) // eslint-disable-next-line if (ua.match(/MicroMessenger/i) == 'micromessenger') { await wx.miniProgram.getEnv(function(res) { if (res.miniprogram) { status = true } else { // 走不在小程序的逻辑 status = false } }) } else { // 走不在小程序的逻辑 status = false } return status } // 判断是用户角色类型 export function getRoleTypeText(roleType) { if (roleType === 0) { return '普通用户' } // 装修公司或材料商 if (roleType === 1) { return '装修公司' } if (roleType === 2) { return '材料商' } if (roleType === 3) { return '设计师' } if (roleType === 4) { return '项目经理/工长' } if (roleType === 5) { return '装修工人' } if (roleType === 6) { return '家居顾问' } } // 判断是用户角色类型 export function getRoleTypeId(roleTypeText) { if (roleTypeText === '普通用户') { return 0 } // 装修公司或材料商 if (roleTypeText === '装修公司') { return 1 } if (roleTypeText === '材料商') { return 2 } if (roleTypeText === '设计师') { return 3 } if (roleTypeText === '项目经理') { return 4 } if (roleTypeText === '装修工人') { return 5 } if (roleTypeText === '家居顾问') { return 6 } } // 验证手机号码格式 export function verifiPhone(phone) { if (phone.length != 11) { return false } return mobileReg.test(phone) } /** * * 获取位置距离 * form 开始经纬度数据信息 * to 结束经纬度数据信息 * rule 运费规则 * onlyDistance 是否只需要距离值 */ export function calcDistance(form = null, to = null, rule = {}, onlyDistance = false) { console.log('我开始计算运费了') console.log('form', form) console.log('to', to) console.log('rule', rule) if (!form || !to) { return } let lat1 = to.lat || to.latitude, lng1 = to.lng || to.longitude, lat2 = form.lat || form.latitude, lng2 = form.lng || form.longitude if (lat1 && lng1 && lat2 && lng2) { // eslint-disable-next-line one-var lat1 = lat1 * 1 lng1 = lng1 * 1 lat2 = parseFloat(lat2) lng2 = parseFloat(lng2) let distance = parseInt(calcDistanceFn(lat1, lng1, lat2, lng2)) // 只需要返回距离的时候 if (onlyDistance) { return distance } // 需要返回具体金额 let freight = (distance - rule.first) * rule.add console.log('freight', freight) return freight } else { return 0 } } // 计算距离 公用方法 export function calcDistanceFn(lat1, lng1, lat2, lng2) { const f = (((lat1 + lat2) / 2) * Math.PI) / 180.0 const g = (((lat1 - lat2) / 2) * Math.PI) / 180.0 const l = (((lng1 - lng2) / 2) * Math.PI) / 180.0 let sg = Math.sin(g) let sl = Math.sin(l) let sf = Math.sin(f) let s, c, w, r, d, h1, h2 const a = 6378.137 // 取WGS84标准参考椭球中的地球长半径 单位M const fl = 1 / 298.257 sg = sg * sg sl = sl * sl sf = sf * sf s = sg * (1 - sl) + (1 - sf) * sl c = (1 - sg) * (1 - sl) + sf * sl w = Math.atan(Math.sqrt(s / c)) r = Math.sqrt(s * c) / w d = 2 * w * a h1 = (3 * r - 1) / 2 / c h2 = (3 * r + 1) / 2 / s return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg)) } // 对象参数转为url参数 // export function queryData(data, getArr) { // let queryStr = '' // let num = 0 // for (const i in data) { // if (!util.isEmpty(data[i])) { // if (num === 0) { // let arr = data[i] // if (getArr && Array.isArray(arr)) { // let str = '' // for (let j = 0; j < arr.length; j++) { // if (j == 0) { // str += `${i}[${j}]=${arr[j]}` // } else { // str += `&${i}[${j}]=${arr[j]}` // } // } // queryStr += `?${str}` // } else { // queryStr += `?${i}=${data[i]}` // } // } else { // let arr = data[i] // if (getArr && Array.isArray(arr)) { // let str = '' // for (let j = 0; j < arr.length; j++) { // str += `&${i}[${j}]=${arr[j]}` // } // queryStr += `${str}` // } else { // queryStr += `&${i}=${data[i]}` // } // } // num++ // } // } // return queryStr // } // 上传图片到服务器 export function upLoadImg(arr) { let params = {} if (arr.length === 1) { params['file[content]'] = arr[0] } else { arr.forEach((item, index) => { params[`file[${index}][content]`] = item }) } return new Promise((resolve, reject) => { if (arr.length) { uploadPic({ ...params, relative_path: 1 }).then(res => { if (res.status === 'success') { const list = res.data.image_url.reverse() resolve(list) } else { reject(res) } }) } else { resolve(arr) } }) } // weixin base64转图片 export function weixinBase64src(base64data) { return new Promise((resolve, reject) => { const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [] if (!format) { return (new Error('ERROR_BASE64SRC_PARSE')) } const filePath = `${wx.env.USER_DATA_PATH}/temporary_files1111aaccdd996633acv.${format}` const buffer = wx.base64ToArrayBuffer(bodyData) uni.getFileSystemManager().writeFile({ filePath, data: buffer, encoding: 'binary', success: function(res) { resolve(filePath) }, fail: function(err) { reject() console.log(err) } }) }) } // 深拷贝 export function deepCopy(obj) { if (typeof obj !== 'object') { return } var str = JSON.stringify(obj) return JSON.parse(str) } // 复制到粘贴板 export function copyText(str) { let that = this // #ifdef H5 // 动态创建 textarea 标签 const textarea = document.createElement('textarea') // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域 textarea.readOnly = 'readonly' textarea.style.position = 'absolute' textarea.style.left = '-9999upx' // 将要 copy 的值赋给 textarea 标签的 value 属性 textarea.value = str // 将 textarea 插入到 body 中 document.body.appendChild(textarea) // 选中值并复制 textarea.select() textarea.setSelectionRange(0, textarea.value.length) const result = document.execCommand('Copy') if (result) { that.$msg('复制成功') } document.body.removeChild(textarea) // #endif // #ifndef H5 uni.setClipboardData({ data: str, success: function() { that.$msg('复制成功') } }) // #endif } // 冒泡排序 export function bubbleSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { var len = array.length, temp for (var i = 0; i < len - 1; i++) { for (var j = len - 1; j >= i; j--) { if (array[j - 1] && array[j].level < array[j - 1].level) { temp = array[j] array[j] = array[j - 1] array[j - 1] = temp } } } return array } else { return 'array is not an Array!' } } export default { copyText, deepCopy, debounce, getUrlHref, jumpShop, getMiniAppUrl, getTimestamp, getRandomNum, loginParmas, getFormatDate, isMobile, getDataTimestamp, isPersonRoleType, isWxBrowser, isWxMiniapp, getRoleTypeText, getRoleTypeId, verifiPhone, calcDistance, upLoadImg, bubbleSort }