feat: security hardening, wechat pay v3 platform cert integration, companion certification revocation, and audit closed-loop
这个提交包含在:
83
pwuniapp/common/location.js
普通文件
83
pwuniapp/common/location.js
普通文件
@@ -0,0 +1,83 @@
|
||||
// pwuniapp/common/location.js
|
||||
// 同城生活陪伴小程序统一地图与定位能力服务层
|
||||
|
||||
// 默认腾讯位置服务 Key(可在管理后台【安全合规-平台系统配置-地图定位服务】动态更新维护)
|
||||
// 申请地址:https://lbs.qq.com
|
||||
export const DEFAULT_TENCENT_MAP_KEY = '';
|
||||
|
||||
/**
|
||||
* 计算两个经纬度坐标之间的球面距离(千米/km)
|
||||
* @param {number} lat1 纬度1
|
||||
* @param {number} lon1 经度1
|
||||
* @param {number} lat2 纬度2
|
||||
* @param {number} lon2 经度2
|
||||
* @returns {string} 格式化后的距离(例如 "1.2km" 或 "350m")
|
||||
*/
|
||||
export function calculateDistance(lat1, lon1, lat2, lon2) {
|
||||
if (!lat1 || !lon1 || !lat2 || !lon2) return '同城';
|
||||
const toRad = (d) => (d * Math.PI) / 180;
|
||||
const R = 6371; // 地球平均半径(km)
|
||||
const dLat = toRad(lat2 - lat1);
|
||||
const dLon = toRad(lon2 - lon1);
|
||||
const a =
|
||||
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
||||
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
|
||||
Math.sin(dLon / 2) * Math.sin(dLon / 2);
|
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||
const d = R * c;
|
||||
|
||||
if (d < 1) {
|
||||
return `${Math.round(d * 1000)}m`;
|
||||
}
|
||||
return `${d.toFixed(1)}km`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 唤起地图选点 (chooseLocation)
|
||||
* 封装权限申请与平台兼容处理
|
||||
* @returns {Promise<{name: string, address: string, latitude: number, longitude: number}>}
|
||||
*/
|
||||
export function chooseMapLocation() {
|
||||
return new Promise((resolve, reject) => {
|
||||
// #ifdef MP-WEIXIN || APP-PLUS
|
||||
uni.chooseLocation({
|
||||
success: (res) => {
|
||||
resolve({
|
||||
name: res.name || '',
|
||||
address: res.address || '',
|
||||
latitude: res.latitude,
|
||||
longitude: res.longitude
|
||||
});
|
||||
},
|
||||
fail: (err) => {
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
// #endif
|
||||
|
||||
// #ifndef MP-WEIXIN || APP-PLUS
|
||||
reject(new Error('当前运行环境不支持原生地图选点'));
|
||||
// #endif
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户地理位置经纬度 (getLocation)
|
||||
* @returns {Promise<{latitude: number, longitude: number}>}
|
||||
*/
|
||||
export function getUserLocation() {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.getLocation({
|
||||
type: 'gcj02', // 国测局坐标系,腾讯地图/高德地图通用
|
||||
success: (res) => {
|
||||
resolve({
|
||||
latitude: res.latitude,
|
||||
longitude: res.longitude
|
||||
});
|
||||
},
|
||||
fail: (err) => {
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户