智慧教务系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

207 lines
8.0 KiB

import { onLoad } from '@dcloudio/uni-app';
import { isWeixinBrowser } from '@/utils/common';
import { getAddressByLatlng } from '@/app/api/system';
import manifestJson from '@/manifest.json';
import wechat from '@/utils/wechat'
import useSystemStore from '@/stores/system';
export function useLocation(isOpenLocation: any) {
const systemStore = useSystemStore();
// 表示,定位是否开启
let isOpen = isOpenLocation;
if (systemStore.mapConfig.is_open != 1) {
isOpen = false;
}
// 监听页面加载
const onLoadLifeCycle = (callback: any = '') => {
onLoad((option: any) => {
if (option && option.latng) {
getAddressByLatlngFn(option.latng)
}
uni.removeStorageSync('manually_select_location_from_map');
typeof callback == 'function' && callback(option);
});
}
const init = () => {
if (!isOpen) return false;
// 排除手动地图选择位置的情况
if (!uni.getStorageSync('manually_select_location_from_map')) {
// #ifdef H5
if (isWeixinBrowser() && systemStore.mapConfig.is_open && !uni.getStorageSync('location_address')) {
wechat.init(()=>{
wechat.getLocation(res => {
let latlng = res.latitude + ',' + res.longitude; // 纬度(浮点数,范围为90 ~ -90),经度(浮点数,范围为180 ~ -180)
getAddressByLatlngFn(latlng)
})
});
}
// #endif
// #ifdef MP
if (systemStore.mapConfig.is_open && !uni.getStorageSync('location_address')) {
uni.getLocation({
type: 'gcj02',
success: res => {
let latlng = res.latitude + ',' + res.longitude; // 纬度(浮点数,范围为90 ~ -90),经度(浮点数,范围为180 ~ -180)
getAddressByLatlngFn(latlng);
},
fail: (res) => {
systemStore.defaultPositionAddress = '定位失败';
if (res.errno) {
if (res.errno == 104) {
let msg = '用户未授权隐私权限,获取位置失败';
uni.showToast({ title: msg, icon: 'none' })
} else if (res.errno == 112) {
let msg = '隐私协议中未声明,获取位置失败';
uni.showToast({ title: msg, icon: 'none' })
}
}
if (res.errMsg) {
if (res.errMsg.indexOf('getLocation:fail') != -1 || res.errMsg.indexOf('deny') != -1 || res.errMsg.indexOf('denied') != -1) {
let msg = '用户未授权获取位置权限,将无法提供服务';
uni.showToast({ title: msg, icon: 'none' })
} else {
uni.showToast({ title: res.errMsg, icon: 'none' })
}
}
}
});
}
// #endif
}
}
// 刷新页面时需要调用的
const refreshLocation = () => {
if (!isOpen) return false;
if (!uni.getStorageSync('manually_select_location_from_map') && uni.getStorageSync('location_address')) {
if(locationStorage() && !locationStorage().is_expired){
systemStore.setAddressInfo(uni.getStorageSync('location_address'))
}else{
uni.removeStorageSync('location_address');
}
}
// 定位信息过期后,重新获取定位
if (!uni.getStorageSync('manually_select_location_from_map') && locationStorage() && locationStorage().is_expired) {
init();
}
}
// 通过经纬度获取地址信息
const getAddressByLatlngFn = (latlng: any = '') => {
if (!isOpen) return false;
let data = { latlng: '' };
if (latlng) {
data.latlng = latlng;
} else {
data.latlng = systemStore.diyAddressInfo.latitude + ',' + systemStore.diyAddressInfo.longitude;
}
getAddressByLatlng(data).then((res: any) => {
if (res.data && Object.keys(res.data).length) {
let obj: any = {};
let latlngArr = data.latlng.split(',');
obj.latitude = latlngArr[0];
obj.longitude = latlngArr[1];
obj.full_address = res.data.province != undefined ? res.data.province : '';
obj.full_address += res.data.city != undefined ? res.data.city : '';
obj.full_address += res.data.district != undefined ? res.data.district : '';
obj.full_address += res.data.community != undefined ? res.data.community : '';
obj.province_id = res.data.province_id;
obj.province = res.data.province;
obj.city_id = res.data.city_id;
obj.city = res.data.city;
obj.district_id = res.data.district_id;
obj.district = res.data.district;
obj.community = res.data.community;
obj.formatted_addresses = res.data.formatted_addresses;
systemStore.setAddressInfo(obj)
} else {
systemStore.setAddressInfo()
}
// 手动选择地图位置后,清除标识
setTimeout(() => {
// 由于异步请求速度影响,需要延迟删除
uni.removeStorageSync('manually_select_location_from_map');
}, 500);
})
}
// 打开地图重新选择位置
const reposition = () => {
if (!isOpen) return false;
let latitude = systemStore.diyAddressInfo ? systemStore.diyAddressInfo.latitude : '';
let longitude = systemStore.diyAddressInfo ? systemStore.diyAddressInfo.longitude : '';
// #ifdef MP
uni.chooseLocation({
latitude,
longitude,
success: (res) => {
uni.setStorageSync('manually_select_location_from_map', true)
let latng = res.latitude + ',' + res.longitude;
getAddressByLatlngFn(latng)
},
fail: (res) => {
// 在隐私协议中没有声明chooseLocation:fail api作用域
if (res.errMsg && res.errno) {
if (res.errno == 104) {
let msg = '用户未授权隐私权限,选择位置失败';
uni.showToast({ title: msg, icon: 'none' })
} else if (res.errno == 112) {
let msg = '隐私协议中未声明,打开地图选择位置失败';
uni.showToast({ title: msg, icon: 'none' })
} else {
uni.showToast({ title: res.errMsg, icon: 'none' })
}
}
}
});
// #endif
// #ifdef H5
uni.setStorageSync('manually_select_location_from_map', true)
let backurl = location.origin + location.pathname;
window.location.href = 'https://apis.map.qq.com/tools/locpicker?search=1&type=0&backurl=' + encodeURIComponent(backurl) + '&key=' + manifestJson.h5.sdkConfigs.maps.qqmap.key + '&referer=myapp';
// #endif
}
/**
* 定位信息(缓存)
*/
const locationStorage = () => {
let data = uni.getStorageSync('location_address');
if (data) {
var date = new Date();
if (systemStore.mapConfig.valid_time > 0) {
data.is_expired = (date.getTime() / 1000) > data.valid_time; // 是否过期
} else {
data.is_expired = false;
}
}else{
data = {
is_expired : false
};
}
return data;
}
return {
init: init,
onLoad: onLoadLifeCycle,
refresh: refreshLocation,
reposition: reposition
}
}