import Vue from 'vue'; import { getTicket } from '@/api/index'; import { toastLoading } from '@/utils/commonVant'; import { CJ02BD, gcj02BD } from '@/utils/index'; import { jsonp } from 'vue-jsonp'; // 微信JSSDK实例 const wx = Vue.prototype.wx; // 腾讯位置服务 key const TxMapKey = 'WLCBZ-HRM6L-YOMPV-ME62B-AQOG6-JUBW6'; // 当前设备 const isDevice = localStorage.getItem('isDevice'); /** * 获取当前定位 调用之前确保当前页面已经授权(getTicketFun) * @param isPermit // PC 模式下不能获取定位,是否允许跳过定位 * */ export function getPosition(isPermit = false) { return new Promise((resolve, reject) => { toastLoading(0, '定位中...', true); // PC端没有定位权限依然可以访问 if (process.env.NODE_ENV === 'test') { // 本地开发 test 环境时跳过获取定位功能 模拟定位 let resData = { latitude: 34.615684509277344, longitude: 112.4474105834961, }; // 定位坐标转换 腾讯转百度 let TXisBD = CJ02BD(resData.latitude, resData.longitude); localStorage.setItem('lat', TXisBD.lat); localStorage.setItem('lon', TXisBD.lon); toastLoading().clear(); resolve({ TXisBD: TXisBD, resData: resData }); } else if (isDevice == 'PC') { // PC状态 分允许通过和不允许通过 isPermit: tru允许,false不允许 localStorage.setItem('lat', ''); localStorage.setItem('lon', ''); toastLoading().clear(); if (isPermit) { resolve({ TXisBD: { lat: '', lon: '' }, resData: { latitude: '', longitude: '' } }); } else { reject('GPS未开启'); } } else { wx.ready(() => { wx.getLocation({ type: 'gcj02', success: (resData) => { console.log('success'); toastLoading().clear(); console.log('处理前'); console.log(resData.latitude, resData.longitude); // 定位坐标转换 腾讯转百度 let TXisBD = CJ02BD(resData.latitude, resData.longitude); console.log('处理后'); console.log(TXisBD); localStorage.setItem('lat', TXisBD.lat); localStorage.setItem('lon', TXisBD.lon); resolve({ TXisBD: TXisBD, resData: resData }); }, fail: () => { console.log('fail'); toastLoading().clear(); reject('GPS未开启'); }, complete: () => { console.log('complete'); toastLoading().clear(); }, }); }); wx.error((err) => { console.log('wx.error'); toastLoading().clear(); console.log(err); localStorage.setItem('lat', ''); localStorage.setItem('lon', ''); reject('定位失败,请开启企微定位权限'); }); } }); } /** *当前页面授权 一个url只需要授权一次,wx.config 调用多次,只有第一次会调用成功,后面的都会走失败 * @param {*object} jsApiList //授权接口列表 * @param {*String} getLocation //获取定位 * @param {*String} configType //注入类型 * config,agentConfig * config注入的是企业的身份与权限, * 而agentConfig注入的是应用的身份与权限。 * 尤其是当调用者为第三方服务商时,通过config无法准确区分出调用者是哪个第三方应用, * 而在部分场景下,又必须严谨区分出第三方应用的身份,此时即需要通过agentConfig来注入应用的身份信息。 * */ export function getTicketFun(jsApiList = ['getLocation'], configType = 'config') { return new Promise((resolve, reject) => { // 当前页面 let url = window.location.href; let params = { url: url, }; if (configType == 'agentConfig') { params.agent = 1; } // 获取签名 getTicket(params).then((response) => { console.log(response); toastLoading().clear(); if (response.code == 200) { let qiyeData = response.data; if (configType == 'config') { wx.config({ beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: qiyeData.appId, // 必填,企业微信的corpID timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳 nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串 signature: qiyeData.signature, // 必填,签名,见 附录-JS-SDK使用权限签名算法 jsApiList: ['ready', ...jsApiList], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来 }); console.log('获取签名成功'); resolve('获取签名成功'); } else if (configType == 'agentConfig') { wx.agentConfig({ corpid: qiyeData.appId, // 必填,企业微信的corpid,必须与当前登录的企业一致 agentid: qiyeData.agentId, // 必填,企业微信的应用id (e.g. 1000247) timestamp: qiyeData.timestamp, // 必填,生成签名的时间戳 nonceStr: qiyeData.nonceStr, // 必填,生成签名的随机串 signature: qiyeData.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法 jsApiList: [...jsApiList], //必填,传入需要使用的接口名称 success: function (res) { console.log('获取签名成功'); resolve(qiyeData); }, fail: function (res) { console.log(res); if (res.errMsg.indexOf('function not exist') > -1) { alert('版本过低请升级'); } }, }); } } else { console.log('获取签名失败'); reject('获取签名失败'); alert('获取签名失败'); } }); }); } /** * 地点搜索 获取500米范围poi点 * @param {*object} location //当前位置 * @param {*number} radius //搜索半径 * @param {*number} auto_extend //是否自动扩大范围 0 不扩大 * @returns */ export function getMapPoi(location, radius = 500, auto_extend = 0) { return new Promise((resolve, reject) => { let api = 'https://apis.map.qq.com/ws/place/v1/search?page_size=10&page_index=1&orderby=_distance&output=jsonp'; let boundary = `&boundary=nearby(${location.latitude},${location.longitude},${radius},${auto_extend})`; let key = `&key=${TxMapKey}`; jsonp(api + boundary + key) .then((res) => { console.log(res); resolve(res); }) .catch((err) => { console.log(err); reject(err); }); }); } /** * 关键词搜索 在当前城市范围内搜索 * @param {*object} location //当前位置 * @param {*string} keywordValue //关键字 * @returns */ export function getkeywordPoi(location, keywordValue) { return new Promise((resolve, reject) => { let keyword = keywordValue ? '&keyword=' + encodeURI(keywordValue) : ''; // 关键词搜索 let api = 'https://apis.map.qq.com/ws/place/v1/suggestion?output=jsonp&page_size=10®ion_fix=1'; let key = `&key=${TxMapKey}`; let locationPos = `&location=${location.latitude},${location.longitude}`; jsonp(api + locationPos + keyword + key) .then((res) => { console.log(keyword); console.log(res); resolve(res); }) .catch((err) => { console.log(err); reject(err); }); }); } /** * 逆地址解析 * @param {*object} location //当前位置 * @returns */ export function getGeocoder(location) { return new Promise((resolve, reject) => { let api = 'https://apis.map.qq.com/ws/geocoder/v1/?get_poi=0&output=jsonp'; let key = `&key=${TxMapKey}`; let locationPos = `&location=${location.latitude},${location.longitude}`; jsonp(api + locationPos + key) .then((res) => { console.log(res); resolve(res); }) .catch((err) => { console.log(err); reject(err); }); }); }