|
|
/*
|
|
|
* 公共方法
|
|
|
*
|
|
|
*/
|
|
|
import moment from 'moment';
|
|
|
import {
|
|
|
lang
|
|
|
} from 'moment';
|
|
|
|
|
|
const base64ToFile = (dataurl, filename = 'file') => {
|
|
|
let arr = dataurl.split(',')
|
|
|
let mime = arr[0].match(/:(.*?);/)[1]
|
|
|
let suffix = mime.split('/')[1]
|
|
|
let bstr = atob(arr[1])
|
|
|
let n = bstr.length
|
|
|
let u8arr = new Uint8Array(n)
|
|
|
while (n--) {
|
|
|
u8arr[n] = bstr.charCodeAt(n)
|
|
|
}
|
|
|
return new File([u8arr], `${filename}.${suffix}`, {
|
|
|
type: mime
|
|
|
})
|
|
|
|
|
|
}
|
|
|
const toast = (msg, time, callback) => {
|
|
|
uni.showToast({
|
|
|
icon: "none",
|
|
|
title: msg,
|
|
|
duration: time || 1500,
|
|
|
success: function(res) {
|
|
|
if (callback && typeof(callback) == 'function') {
|
|
|
console.log(callback)
|
|
|
callback()
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
// 转换日期为日月
|
|
|
const formatDateToMonthDay = (dateString) => {
|
|
|
const month = moment(dateString).format('MM')
|
|
|
const day = moment(dateString).format('DD')
|
|
|
return `${month}月${day}日`;
|
|
|
}
|
|
|
// 比较当前时间是否在活动期间 在true 不在false
|
|
|
const isCurrentTimeBetween = (startTime, endTime) => {
|
|
|
let that = this
|
|
|
const now = moment().valueOf()
|
|
|
const start = moment(startTime).valueOf();
|
|
|
const end = moment(endTime).valueOf();
|
|
|
return now < start || now > end;
|
|
|
}
|
|
|
// 验证是否填写的是中文
|
|
|
const isOnlyChinese = (str) => {
|
|
|
const chineseRegex = /^[\u4e00-\u9fa5]+$/;
|
|
|
return chineseRegex.test(str);
|
|
|
}
|
|
|
|
|
|
// 验证是否为空
|
|
|
const isNull = (p) => {
|
|
|
return p == '' || p == undefined || p == null || p == 'undefined' || p == 'null';
|
|
|
}
|
|
|
|
|
|
// 验证手机号
|
|
|
const isMobile = (phoneNumber) => {
|
|
|
const regex = /^1[3-9]\d{9}$/;
|
|
|
return regex.test(phoneNumber);
|
|
|
}
|
|
|
// 分享
|
|
|
const shareInfo = {
|
|
|
title: "蟹太太",
|
|
|
imageUrl: "/static/share.jpg"
|
|
|
}
|
|
|
|
|
|
// 计算距离
|
|
|
const getDistance = (la1, lo1, la2, lo2) => { // 当前的纬度,当前的经度,接口拿到的纬度,接口拿到的经度
|
|
|
console.log(la1, lo1, la2, lo2)
|
|
|
la1 = parseFloat(la1)
|
|
|
lo1 = parseFloat(lo1)
|
|
|
la2 = parseFloat(la2)
|
|
|
lo2 = parseFloat(lo2)
|
|
|
console.log(la1, lo1, la2, lo2)
|
|
|
let La1 = la1 * Math.PI / 180.0;
|
|
|
let La2 = la2 * Math.PI / 180.0;
|
|
|
let La3 = La1 - La2;
|
|
|
let Lb3 = lo1 * Math.PI / 180.0 - lo2 * Math.PI / 180.0;
|
|
|
let distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math
|
|
|
.pow(Math.sin(Lb3 / 2), 2)));
|
|
|
distance = distance * 6378.137;
|
|
|
distance = Math.round(distance * 10000) / 10000;
|
|
|
if (distance < 0) {
|
|
|
return distance * 1000 + '米'
|
|
|
} else {
|
|
|
return distance.toFixed(2) + '公里'
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 打开导航
|
|
|
const toMapAPP = (lat, lng, name) => {
|
|
|
let that = this
|
|
|
const lat1 = parseFloat(lat)
|
|
|
const lng1 = parseFloat(lng)
|
|
|
// 获取用户是否开启 授权获取当前的地理位置、速度的权限。
|
|
|
uni.getSetting({
|
|
|
success(res) {
|
|
|
console.log(res, '----1')
|
|
|
// 如果没有授权
|
|
|
if (!res.authSetting['scope.userLocation']) {
|
|
|
// 则拉起授权窗口
|
|
|
uni.authorize({
|
|
|
scope: 'scope.userLocation',
|
|
|
success() {
|
|
|
//如果授权了
|
|
|
uni.openLocation({
|
|
|
latitude: lat1, //到达的纬度
|
|
|
longitude: lng1, //到达的经度
|
|
|
name: name, //到达的名字
|
|
|
scale: 12,
|
|
|
success() {
|
|
|
console.log('success')
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
fail(error) {
|
|
|
//点击了拒绝授权后--就一直会进入失败回调函数--此时就可以在这里重新拉起授权窗口
|
|
|
console.log('拒绝授权', error)
|
|
|
|
|
|
uni.showModal({
|
|
|
title: '提示',
|
|
|
content: '若点击不授权,将无法使用位置功能',
|
|
|
cancelText: '不授权',
|
|
|
cancelColor: '#999',
|
|
|
confirmText: '授权',
|
|
|
confirmColor: '#f94218',
|
|
|
success(res) {
|
|
|
console.log(res)
|
|
|
if (res.confirm) {
|
|
|
// 选择弹框内授权
|
|
|
uni.openSetting({
|
|
|
success(res) {
|
|
|
console.log(res.authSetting)
|
|
|
}
|
|
|
})
|
|
|
} else if (res.cancel) {
|
|
|
// 选择弹框内 不授权
|
|
|
console.log('用户点击不授权')
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
} else {
|
|
|
console.log('有授权');
|
|
|
// 有权限则直接获取
|
|
|
uni.openLocation({
|
|
|
latitude: lat1, //到达的纬度
|
|
|
longitude: lng1, //到达的经度
|
|
|
name: name, //到达的名字
|
|
|
scale: 12,
|
|
|
success() {
|
|
|
console.log('success')
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
|
|
|
}
|
|
|
// 检查是否空对象
|
|
|
const isEmptyObject = (obj) => {
|
|
|
// 检查传入参数是否为一个对象
|
|
|
if (typeof obj !== 'object' || obj === null) {
|
|
|
throw new Error('Input must be an object');
|
|
|
}
|
|
|
|
|
|
// 使用Object.keys()方法获取对象的属性键数组,并检查其长度是否为0
|
|
|
return Object.keys(obj).length === 0;
|
|
|
}
|
|
|
|
|
|
const parseAddress = (address) => {
|
|
|
// 正则表达式匹配省市区和直辖市
|
|
|
// 直辖市
|
|
|
const regex = /^(.*?省|.*?市|.*?自治区|.*?特别行政区)(.*?市|.*?自治州|.*?盟|.*?县|.*?区|.*?旗)?/;
|
|
|
// 省市区
|
|
|
const regex1 = /^(.*?省|.*?市|.*?自治区|.*?特别行政区)(.*?市|.*?自治州|.*?盟)(.*?区|.*?县|.*?市|.*?旗)/;
|
|
|
|
|
|
|
|
|
// 初始化返回数组
|
|
|
let regionArray = [];
|
|
|
let match = null
|
|
|
// 检查是否是直辖市
|
|
|
const directCities = ['北京市', '天津市', '上海市', '重庆市'];
|
|
|
if(directCities.some(city => address.includes(city))){
|
|
|
match = address.match(regex);
|
|
|
}else{
|
|
|
match = address.match(regex1);
|
|
|
}
|
|
|
|
|
|
console.log("address",address,match)
|
|
|
if (match) {
|
|
|
if (directCities.includes(match[1])) {
|
|
|
// 直辖市没有省这一级,直接将市名和区名放入数组
|
|
|
regionArray = [match[1], '市辖区', match[2]];
|
|
|
} else {
|
|
|
// 非直辖市,包含省市区
|
|
|
regionArray = [match[1], match[2], match[3]];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return regionArray;
|
|
|
}
|
|
|
|
|
|
|
|
|
export {
|
|
|
base64ToFile,
|
|
|
toast,
|
|
|
formatDateToMonthDay,
|
|
|
isCurrentTimeBetween,
|
|
|
isOnlyChinese,
|
|
|
isNull,
|
|
|
isMobile,
|
|
|
getDistance,
|
|
|
toMapAPP,
|
|
|
shareInfo,
|
|
|
isEmptyObject,
|
|
|
parseAddress
|
|
|
} |