719 lines
17 KiB
JavaScript
719 lines
17 KiB
JavaScript
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
|
||
}
|
||
})
|
||
})
|
||
},
|
||
}
|