daoji_h5/utils/index.js

719 lines
17 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Validate from './validate.js';
import $store from "@/store/index.js"
export default {
Validate,
log: console.log,
// log: () => {},
//格式化时间
formatTime(date, format) {
let newFormat = format || 'YY-M-D h:m:s';
let formatNumber = this.formatNumber;
let newDate = date || new Date();
if (Object.prototype.toString.call(newDate).slice(8, -1) !== "Date") {
newDate = new Date(date);
}
let week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', '日', '一', '二', '三',
'四',
'五', '六'
];
return newFormat.replace(/YY|Y|M|D|h|m|s|week|星期/g, function(a) {
switch (a) {
case 'YY':
return newDate.getFullYear();
case 'Y':
return (newDate.getFullYear() + '').slice(2);
case 'M':
return formatNumber(newDate.getMonth() + 1);
case 'D':
return formatNumber(newDate.getDate());
case 'h':
return formatNumber(newDate.getHours());
case 'm':
return formatNumber(newDate.getMinutes());
case 's':
return formatNumber(newDate.getSeconds());
case '星期':
return "星期" + week[newDate.getDay() + 7];
case 'week':
return week[newDate.getDay()];
}
})
},
// 日期转时间戳
DateToUnix: function(string) {
var f = string.split(' ', 2);
var d = (f[0] ? f[0] : '').split('-', 3);
var t = (f[1] ? f[1] : '').split(':', 3);
return (new Date(
parseInt(d[0], 10) || null,
(parseInt(d[1], 10) || 1) - 1,
parseInt(d[2], 10) || null,
parseInt(t[0], 10) || null,
parseInt(t[1], 10) || null,
parseInt(t[2], 10) || null
)).getTime() / 1000;
},
//格式化数字
formatNumber(n) {
n = n.toString();
return n[1] ? n : '0' + n
},
// 保留小数 (不四舍五入)
formatDecimal(num, decimal) {
num = num.toString()
let index = num.indexOf('.')
if (index !== -1) {
num = num.substring(0, decimal + index + 1)
} else {
num = num.substring(0)
}
return parseFloat(num).toFixed(decimal)
},
// 实时检测输入金额
formatMoney(val) {
if (val.slice(0, 1) == "0" && val.slice(1, 2) > 0) {
val = val.slice(1, 2);
}
if (val.slice(0, 1) == ".") {
val = '0.';
}
if (val == "0.00") {
val = '0.0';
}
return val.replace(/[^\d\.]|^\./g, '').replace(/\.{2}/g, '.').replace(
/^([1-9]\d*|0)(\.\d{1,2})(\.|\d{1})?$/, '$1$2').replace(/^0\d{1}/g, '0')
},
toWeiXinString(date) {
let str;
let newDate = date || new Date();
if (Object.prototype.toString.call(newDate).slice(8, -1) !== "Date") {
newDate = new Date(date);
}
const now = newDate;
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
const beforeYesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 2);
const monday = new Date(today);
monday.setDate(today.getDate() - (today.getDay() ? today.getDay() - 1 : 6));
//注意date初始化默认是按本地时间初始的但打印默认却是按GMT时间打印的也就是说打印出的不是本地现在的时间
//LocaleString的打印也有点问题"0点"会被打印为"上午12点"
if (now.getTime() > today.getTime()) {
str = "";
} else if (now.getTime() > yesterday.getTime()) {
str = "昨天";
} else if (now.getTime() > beforeYesterday.getTime()) {
str = "前天";
} else if (now.getTime() > monday.getTime()) {
const week = {
"0": "周日",
"1": "周一",
"2": "周二",
"3": "周三",
"4": "周四",
"5": "周五",
"6": "周六"
};
str = week[now.getDay() + ""];
} else {
const hour = ["凌晨", "早上", "下午", "晚上"];
const h = now.getHours();
if (h == 12) str = "中午";
else str = hour[parseInt(h / 6)];
str = now.format("MM月dd ") + str;
}
str += now.format("HH:ss");
return str;
},
//返回类型
typeOf(param) {
return Object.prototype.toString.call(param).slice(8, -1)
},
//判断是否为空
isEmpty(param) {
//基本类型为空
let condition1 = param === '' || param === null || param === undefined || param === "NaN";
let condition2;
let condition3
//引用类型为空
if (!condition1) {
condition2 = this.typeOf(param) === "Object" && Object.keys(param).length < 1;
condition3 = this.typeOf(param) === "Array" && param.length < 1;
}
return condition1 || condition2 || condition3;
},
showLoading({
title = "加载中",
mask = true
} = {}) {
uni.showLoading({
title,
mask
});
},
showToast({
title,
icon = "none"
} = {}) {
uni.showToast({
title,
icon,
duration: 2000
});
},
hideAll() {
uni.hideLoading();
uni.stopPullDownRefresh();
uni.hideNavigationBarLoading();
},
showModal({
title = "提示",
content = "没有返回值,检查服务器是否正常"
}) {
uni.showModal({
title,
content,
showCancel: false
});
},
setNavigationBarColor({
color = '#ffffff',
bg
}) {
uni.setNavigationBarColor({
frontColor: color,
backgroundColor: bg,
// animation: {
// duration: 100,
// timingFunc: 'easeIn'
// }
})
},
getQueryString(name) {
let reg = new RegExp("([^?&]*)" + name + "=([^&]*)(&|$)");
let r = window.location.href.match(reg);
if (r !== null) return unescape(r[2]);
return null
},
getHostname(url) {
var reg = /^http(s)?:\/\/(.*?)\//
// 必须是http开头或者https开头结尾为'/'
var ToReplace = 'Host/'
url.replace(reg, ToReplace)
url = reg.exec(url)[2];
return url;
},
//获取标签上data
getDataSet(e) {
return e.currentTarget.dataset
},
//获表单控件值
getValue(e) {
return e.detail.value
},
async getNavBarHeight() {
var {
statusBarHeight,
navigationBarHeight
} = await uni.getSystemInfoSync()
let navBarHeight = statusBarHeight * 1 + 44
// #ifdef MP-BAIDU
navBarHeight = statusBarHeight * 1 + navigationBarHeight * 1
// #endif
return navBarHeight
},
pick(obj, arr) {
return arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
},
getUrlToStr(url, params) {
let text = url
if (params) {
text = `${url}?` + Object.keys(params)
.filter(key => params[key] || params[key] === 0) // 删除无值的字段,可根据需要进行保留或删除
.map(key => `${key}=${params[key]}`)
.toString().replace(/,/g, '&')
}
return text
},
toCheckLogin(param) {
let {
loginType = 'weixin',
userInfo
} = $store.state.user
let {
id: uid = 0,
phone = ''
} = userInfo
let {
short_code_status = 0
} = $store.state.config.configInfo
let checkLogin = true
// #ifdef H5
loginType = 'weixin'
// #endif
// #ifndef MP-WEIXIN
if (!uid || (loginType === 'weixin' && short_code_status && !phone)) {
checkLogin = false
let pages = getCurrentPages()
let {
route,
options = {}
} = pages[pages.length - 1]
let routeUrl = this.getUrlToStr(`/${route}`, options)
let url = !uid ? `/pages/login` : `/user/pages/phone`
$store.commit('updateUserItem', {
key: 'loginPage',
val: routeUrl
})
this.goUrl({
url
})
}
// #endif
if (checkLogin) {
this.goUrl(param)
}
},
goUrl({
url = "",
openType = "navigateTo",
path = "",
query = ""
} = {}) {
let that = this;
if (!url) return;
if (this.typeOf(query) == 'Object') {
let queryStr = Object.keys(query).map(k => `${k}=${query[k]}`).join('&');
url = `${url}&${queryStr}`
}
let list = ["navigateTo", "redirectTo", "switchTab", "reLaunch"];
if (list.includes(openType)) {
if (openType == 'navigateTo' && getCurrentPages().length > 9) {
uni.redirectTo({
url
})
} else {
uni[openType]({
url
})
}
}
//返回
openType == "navigateBack" && uni.navigateBack({
delta: url
})
//跳转小程序
openType == "miniProgram" && uni.navigateToMiniProgram({
appId: url,
path
})
//打电话
openType == "call" && uni.makePhoneCall({
phoneNumber: url
})
// 复制文本
openType == 'copy' && uni.setClipboardData({
data: url,
success: function(res) {
uni.getClipboardData({
success: function(res) {
// #ifdef MP-BAIDU
that.showToast({
title: '复制成功'
})
// #endif
console.log('复制文本成功 ==>', res.data);
}
});
}
})
//跳转网页/播放视频
if (openType == "web" || openType == 'video') {
let encode_url = encodeURIComponent(url)
uni.navigateTo({
url: `/user/pages/common/${openType}?url=${encode_url}`
})
}
},
// 刷新上页数据
back() {
let pages = getCurrentPages(); //当前页面栈
if (pages.length > 1) {
var beforePage = pages[pages.length - 2]; //获取上一个页面实例对象
//触发父页面中的方法change()
beforePage.$vm.initRefresh()
}
},
//获取页面对象0时为当前页面
getPage(index = 0) {
let pages = getCurrentPages();
let page = pages[pages.length - 1 + index]
return page.$vm
},
// 预览图片
previewImage(param) {
let {
current,
urls
} = param;
uni.previewImage({
current,
urls,
})
},
// 根据type获取数据字符串
getItems(o, type = 'id', sign = ',') {
let items = [];
o = o || [];
o.forEach((item) => {
items.push(item[type])
})
return items.join(sign);
},
// 检查授权
async checkAuth({
type = "userLocation",
tip = ""
} = {}) {
// #ifdef MP-WEIXIN
let contentList = {
phone: "授权获取手机号",
userLocation: "你的地理位置",
address: "你的通讯地址",
invoiceTitle: "发票抬头",
invoice: "获取发票",
werun: "微信运动步数",
record: "你的录音功能",
writePhotosAlbum: "你的保存到相册功能",
camera: "摄像头"
}
tip = tip || `您暂未开启${contentList[type]}的授权,是否开启?`
// 声明
let err, result;
[err, result] = await uni.getSetting();
//获取配置失败
if (err) {
return Promise.reject(err);
}
//如果已授权
if (result.authSetting[`scope.${type}`]) {
return true
}
// 调用获取权限
[err, result] = await uni.authorize({
scope: `scope.${type}`
})
//获取成功
if (!err) {
return true
}
uni.hideLoading()
//提示去设置
return new Promise((resove, reject) => {
uni.showModal({
content: tip,
success(res) {
if (res.confirm) {
uni.openSetting({
success(result) {
if (result.authSetting[`scope.${type}`]) {
resove(true)
} else {
reject()
}
}
})
} else {
reject()
}
}
})
})
// #endif
},
//深拷贝
deepCopy(o) {
let that = this;
if (o instanceof Array) {
var n = [];
for (var i = 0; i < o.length; ++i) {
n[i] = that.deepCopy(o[i]);
}
return n;
} else if (o instanceof Function) {
var n = new Function("return " + o.toString())();
return n
} else if (o instanceof Object) {
var n = {}
for (var i in o) {
n[i] = that.deepCopy(o[i]);
}
return n;
} else {
return o;
}
},
getOptions(options, comminOptions = {}) {
return Object.assign({}, comminOptions, this.formatOptions(options))
},
//获取用户端公共参数
getCommonOptions(options) {
return this.pick(options, ["staff_id"])
},
// 微信支付
async pay(pay_list) {
let that = this;
let param = {}
// #ifdef H5
param = that.pick(pay_list, ['appId', 'timeStamp', 'nonceStr', 'package', 'signType',
'paySign'
])
if (typeof WeixinJSBridge != "undefined") {
return new Promise((resove, reject) => {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', param,
function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
setTimeout(() => {
resove(true)
}, 1000)
} else {
that.showToast({
title: `支付失败`
})
setTimeout(() => {
reject("支付失败")
}, 1000)
}
})
});
}
// #endif
let {
provider = 'wxpay',
orderInfo = ''
} = pay_list
// #ifdef MP-WEIXIN
param = that.pick(pay_list, ['nonceStr', 'package', 'signType', 'paySign', 'timeStamp'])
// #endif
// #ifdef APP-PLUS
if (provider == 'wxpay') {
orderInfo = that.pick(pay_list, ['appid', 'noncestr', 'package', 'partnerid', 'prepayid',
'timestamp'
])
orderInfo.sign = pay_list.paySign
orderInfo = JSON.stringify(orderInfo)
}
param = {
provider,
orderInfo
}
// #endif
// #ifndef H5
let [err, res] = await uni.requestPayment(param)
if (err) {
console.log("=======pay err", err)
that.showToast({
title: `支付失败`
})
await Promise.reject("支付失败")
} else {
return true
}
// #endif
},
//小程序自带获取定位
getLocation() {
let that = this;
return new Promise((resove, reject) => {
uni.getLocation({
success: function(res) {
resove(res)
},
fail: function(e) {
console.log(e)
reject(e)
}
})
})
},
//百度地图获取定位
getBmapLocation: function(ak = 'GoI7BxLpfvBEyf1TcMXCloi99Vov7flZ', openLocation = false) {
//定位
let that = this;
let bmap = require('./bmap-wx.min.js');
let BMap = new bmap.BMapWX({
ak
});
return new Promise((resove, reject) => {
BMap.regeocoding({
success: function(data) {
let addressInfo = data.originalData.result;
let {
lat,
lng
} = addressInfo.location;
let {
formatted_address: address,
addressComponent
} = addressInfo;
let {
province,
city,
district
} = addressComponent
//只返回需要的数据
let locationInfo = {
lat,
lng,
address,
province,
city,
district,
}
// console.log(locationInfo, "====util locationInfo");
//成功回调
resove(locationInfo)
},
fail: function(res) {
//失败返回默认的数据
let locationInfo = {
name: '',
latitude: 0,
longitude: 0,
address: '',
city: ''
}
resove(locationInfo)
that.hideAll()
//失败后的提示
let errMsg = res.errMsg;
// #ifdef APP-PLUS
let {
isIos = false
} = $store.state.config.configInfo
if (!isIos || openLocation) {
if (errMsg.includes("domain")) {
uni.showModal({
title: "获取定位失败",
content: `请在小程序公众平台添加百度域名api.map.baidu.com`,
showCancel: false
})
return;
}
if (errMsg.includes("Referer")) {
uni.showModal({
title: "获取定位失败",
content: `登录百度开放平台给ak添加白名单`,
showCancel: false
})
return;
}
uni.showModal({
title: '提示',
content: '获取定位失败,是否授权打开定位',
success: (res) => {
if (res.confirm) {
uni.getSystemInfo({
success: (sys) => {
if (sys.platform ==
'ios') {
plus.runtime
.openURL(
"app-settings://"
);
} else {
var main = plus
.android
.runtimeMainActivity();
var Intent = plus
.android
.importClass(
"android.content.Intent"
);
//可能应该直接进入应用列表的权限设置?=> android.settings.APPLICATION_SETTINGS
var mIntent =
new Intent(
'android.settings.LOCATION_SOURCE_SETTINGS'
);
main.startActivity(
mIntent);
}
}
})
}
}
})
}
// #endif
// #ifndef APP-PLUS
if (errMsg.includes("domain")) {
uni.showModal({
title: "获取定位失败",
content: `请在小程序公众平台添加百度域名api.map.baidu.com`,
showCancel: false
})
return;
}
if (errMsg.includes("Referer")) {
uni.showModal({
title: "获取定位失败",
content: `登录百度开放平台给ak添加白名单`,
showCancel: false
})
return;
}
uni.showModal({
title: "地理位置授权",
content: "为了更好的为您服务,请开启您手机中的定位授权",
confirmText: "去授权",
success(res) {
if (res.confirm) {
uni.openSetting({
success(result) {
if (result.authSetting[
`scope.userLocation`]) {
resove(true)
} else {
reject()
}
}
})
} else {
uni.showModal({
title: "提示",
content: "您取消了授权,是否重新设置【位置信息】权限",
confirmText: "去授权",
success(res) {
if (!res.confirm) return
uni.openSetting({
success(result) {
if (result.authSetting[
`scope.userLocation`
]) {
resove(true)
} else {
reject()
}
}
})
}
})
}
}
})
// #endif
}
})
})
},
}