320 lines
7.7 KiB
JavaScript
320 lines
7.7 KiB
JavaScript
import md5 from './md5'
|
||
import Api from "@/common/js/api.js"
|
||
|
||
/**
|
||
* 转换对象为x-www-form-urlencoded
|
||
* @author NanQi
|
||
* @param {Object} obj
|
||
* @return {String}
|
||
*/
|
||
let transformRequest = obj => {
|
||
let query = ''
|
||
let name, value, fullSubName, subName, subValue, innerObj, i
|
||
|
||
for (name in obj) {
|
||
value = obj[name]
|
||
|
||
if (value instanceof Array) {
|
||
for (i = 0; i < value.length; ++i) {
|
||
subValue = value[i]
|
||
fullSubName = name + '[' + i + ']'
|
||
innerObj = {}
|
||
innerObj[fullSubName] = subValue
|
||
query += transformRequest(innerObj) + '&'
|
||
}
|
||
} else if (value instanceof Object) {
|
||
for (subName in value) {
|
||
subValue = value[subName]
|
||
fullSubName = name + '[' + subName + ']'
|
||
innerObj = {}
|
||
innerObj[fullSubName] = subValue
|
||
query += transformRequest(innerObj) + '&'
|
||
}
|
||
} else if (value !== undefined && value !== null) {
|
||
query += encodeURIComponent(name) + '=' +
|
||
encodeURIComponent(value) + '&'
|
||
}
|
||
}
|
||
|
||
return query.length ? query.substr(0, query.length - 1) : query
|
||
}
|
||
|
||
let timestamp = function() {
|
||
return Date.parse(new Date()) / 1000
|
||
}
|
||
|
||
let isNavigating = false
|
||
let isNavigate = () => {
|
||
if (isNavigating) {
|
||
return true
|
||
} else {
|
||
isNavigating = true
|
||
setTimeout(() => {
|
||
isNavigating = false
|
||
}, 2000)
|
||
return false
|
||
}
|
||
}
|
||
|
||
let guid = (function() {
|
||
let counter = 0
|
||
|
||
return function(prefix) {
|
||
let guid = new Date().getTime().toString(32),
|
||
i
|
||
|
||
for (i = 0; i < 5; i++) {
|
||
guid += Math.floor(Math.random() * 65535).toString(32)
|
||
}
|
||
|
||
return (prefix || '') + guid + (counter++).toString(32)
|
||
}
|
||
}())
|
||
|
||
let sortTransform = (obj) => {
|
||
var objKeys = Object.keys(obj)
|
||
objKeys = objKeys.sort()
|
||
|
||
var ret = {}
|
||
for (var i = 0; i < objKeys.length; i++) {
|
||
let objVal = obj[objKeys[i]]
|
||
ret[objKeys[i]] = objVal
|
||
}
|
||
|
||
return transformRequest(ret)
|
||
}
|
||
|
||
function isArray(v) {
|
||
return toString.apply(v) === '[object Array]'
|
||
}
|
||
|
||
function isFunction(v) {
|
||
return typeof v === 'function'
|
||
}
|
||
|
||
function isEmptyObject(v) {
|
||
return Object.keys(v).length == 0
|
||
}
|
||
|
||
function sleep(time) {
|
||
return new Promise((resolve) => setTimeout(resolve, time))
|
||
}
|
||
|
||
const throttle = function(func, wait = 200, options) {
|
||
/* options的默认值
|
||
* 表示首次调用返回值方法时,会马上调用func;否则仅会记录当前时刻,当第二次调用的时间间隔超过wait时,才调用func。
|
||
* options.leading = true
|
||
* 表示当调用方法时,未到达wait指定的时间间隔,则启动计时器延迟调用func函数,若后续在既未达到wait指定的时间间隔和func函数又未被调用的情况下调用返回值方法,则被调用请求将被丢弃。
|
||
* options.trailing = true
|
||
* 注意:当options.trailing = false时,效果与上面的简单实现效果相同
|
||
*/
|
||
var context, args, result
|
||
var timeout = null
|
||
var previous = 0
|
||
if (!options) options = {
|
||
leading: true,
|
||
trailing: false
|
||
}
|
||
var later = function() {
|
||
previous = options.leading === false ? 0 : new Date().getTime()
|
||
timeout = null
|
||
result = func.apply(context, args)
|
||
if (!timeout) context = args = null
|
||
}
|
||
return function() {
|
||
var now = new Date().getTime()
|
||
if (!previous && options.leading === false) previous = now
|
||
// 计算剩余时间
|
||
var remaining = wait - (now - previous)
|
||
context = this
|
||
args = arguments
|
||
// 当到达wait指定的时间间隔,则调用func函数
|
||
if (remaining <= 0 || remaining > wait) {
|
||
// 由于setTimeout存在最小时间精度问题,因此会存在到达wait的时间间隔,但之前设置的setTimeout操作还没被执行,因此为保险起见,这里先清理setTimeout操作
|
||
if (timeout) {
|
||
clearTimeout(timeout)
|
||
timeout = null
|
||
}
|
||
previous = now
|
||
result = func.apply(context, args)
|
||
if (!timeout) context = args = null
|
||
} else if (!timeout && options.trailing !== false) {
|
||
// options.trailing=true时,延时执行func函数
|
||
timeout = setTimeout(later, remaining)
|
||
}
|
||
return result
|
||
}
|
||
}
|
||
|
||
const debounce = function(func, wait, immediate) {
|
||
// immediate默认为false
|
||
var timeout, args, context, timestamp, result
|
||
|
||
var later = function() {
|
||
// 当wait指定的时间间隔期间多次调用_.debounce返回的函数,则会不断更新timestamp的值,导致last < wait && last >= 0一直为true,从而不断启动新的计时器延时执行func
|
||
var last = new Date().getTime() - timestamp
|
||
|
||
if (last < wait && last >= 0) {
|
||
timeout = setTimeout(later, wait - last)
|
||
} else {
|
||
timeout = null
|
||
if (!immediate) {
|
||
result = func.apply(context, args)
|
||
if (!timeout) context = args = null
|
||
}
|
||
}
|
||
}
|
||
|
||
return function() {
|
||
context = this
|
||
args = arguments
|
||
timestamp = new Date().getTime()
|
||
// 第一次调用该方法时,且immediate为true,则调用func函数
|
||
var callNow = immediate && !timeout
|
||
// 在wait指定的时间间隔内首次调用该方法,则启动计时器定时调用func函数
|
||
if (!timeout) timeout = setTimeout(later, wait)
|
||
if (callNow) {
|
||
result = func.apply(context, args)
|
||
context = args = null
|
||
}
|
||
|
||
return result
|
||
}
|
||
}
|
||
|
||
Promise.prototype.finally = function(callback) {
|
||
let P = this.constructor
|
||
return this.then(
|
||
value => P.resolve(callback()).then(() => value),
|
||
reason => P.resolve(callback()).then(() => {
|
||
throw reason
|
||
})
|
||
)
|
||
}
|
||
const info_distance = function(e) { //获取元素位置
|
||
return new Promise((resolve, reject) => {
|
||
uni.createSelectorQuery().select(`.${e}`).boundingClientRect(res => {
|
||
resolve(res)
|
||
}).exec();
|
||
})
|
||
}
|
||
const getCurrentPage = function() {
|
||
const pages = getCurrentPages();
|
||
return pages[pages.length - 1];
|
||
}
|
||
|
||
const getCurrentRoute = function() {
|
||
return '/' + getCurrentPage().route
|
||
}
|
||
|
||
const pluschooseImage = function() {
|
||
// #ifdef APP
|
||
if (plus.os.name == 'Android' && plus.navigator.checkPermission('android.permission.CAMERA') ===
|
||
'undetermined') {
|
||
//未授权
|
||
uni.showModal({
|
||
title: '权限说明',
|
||
content: '便于您使用该功能上传您的照片/图片等,请您确认授权相机与相册,否则无法使用该功能',
|
||
confirmText: "去设置",
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
uni.openAppAuthorizeSetting({
|
||
success(res) {
|
||
console.log(res);
|
||
}
|
||
});
|
||
}
|
||
if (res.cancel) {
|
||
console.log('用户点击取消');
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
return true
|
||
}
|
||
// #endif
|
||
// #ifdef MP-WEIXIN || MP-ALIPAY
|
||
return true
|
||
// #endif
|
||
}
|
||
|
||
const getUserInfo = function (successCallback, failCallback) {
|
||
// #ifdef MP-WEIXIN
|
||
return new Promise((resolve, reject) => {
|
||
uni.login({
|
||
provider: 'weixin',
|
||
success: (data) => {
|
||
console.log(data)
|
||
// 微信小程序环境
|
||
uni.getUserInfo({
|
||
provider: 'weixin',
|
||
success: async (infoRes) => {
|
||
let res = await Api.userwxlogin({
|
||
code: data.code, //临时登录凭证
|
||
rawData: infoRes.rawData,
|
||
source: 'wechat'
|
||
})
|
||
if (res.code == 0) {
|
||
resolve(res)
|
||
}
|
||
},
|
||
fail: (err) => {}
|
||
});
|
||
|
||
|
||
}
|
||
});
|
||
})
|
||
|
||
// #endif
|
||
// #ifdef MP-ALIPAY
|
||
return new Promise((resolve, reject) => {
|
||
my.getAuthCode({
|
||
scopes: 'auth_base',
|
||
success: async (data) => {
|
||
console.log(data)
|
||
// 支付宝小程序环境
|
||
// my.getAuthUserInfo({
|
||
// success: async (infoRes) => {
|
||
let res = await Api.userwxlogin({
|
||
code: data.authCode, //临时登录凭证
|
||
// rawData: JSON.stringify(infoRes),
|
||
source: 'alipay'
|
||
})
|
||
if (res.code == 0) {
|
||
resolve(res)
|
||
}
|
||
// },
|
||
// fail: (err) => {}
|
||
// });
|
||
}
|
||
});
|
||
})
|
||
|
||
// #endif
|
||
}
|
||
|
||
const payment = function () {
|
||
|
||
}
|
||
|
||
uni.utils = {
|
||
md5,
|
||
transformRequest,
|
||
sortTransform,
|
||
timestamp,
|
||
isNavigate,
|
||
guid,
|
||
info_distance,
|
||
isArray,
|
||
sleep,
|
||
isFunction,
|
||
isEmptyObject,
|
||
throttle,
|
||
debounce,
|
||
getCurrentPage,
|
||
getCurrentRoute,
|
||
pluschooseImage,
|
||
getUserInfo,
|
||
payment
|
||
} |