|
|
const _toString = Object.prototype.toString
|
|
|
const hasOwnProperty = Object.prototype.hasOwnProperty
|
|
|
|
|
|
/**
|
|
|
* 检查对象是否包含某个属性
|
|
|
* @param {Object} obj 对象
|
|
|
* @param {String} key 属性键值
|
|
|
*/
|
|
|
function hasOwn(obj, key) {
|
|
|
return hasOwnProperty.call(obj, key)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 参数是否为JavaScript的简单对象
|
|
|
* @param {Object} obj
|
|
|
* @returns {Boolean} true|false
|
|
|
*/
|
|
|
function isPlainObject(obj) {
|
|
|
return _toString.call(obj) === '[object Object]'
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 是否为函数
|
|
|
* @param {String} fn 函数名
|
|
|
*/
|
|
|
function isFn(fn) {
|
|
|
return typeof fn === 'function'
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 深度克隆对象
|
|
|
* @param {Object} obj
|
|
|
*/
|
|
|
function deepClone(obj) {
|
|
|
return JSON.parse(JSON.stringify(obj))
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 解析客户端上报的参数
|
|
|
* @param {String} primitiveParams 原始参数
|
|
|
* @param {Object} context 附带的上下文
|
|
|
*/
|
|
|
function parseUrlParams(primitiveParams, context) {
|
|
|
if (!primitiveParams) {
|
|
|
return primitiveParams
|
|
|
}
|
|
|
|
|
|
let params = {}
|
|
|
if(typeof primitiveParams === 'string') {
|
|
|
params = primitiveParams.split('&').reduce((res, cur) => {
|
|
|
const arr = cur.split('=')
|
|
|
return Object.assign({
|
|
|
[arr[0]]: arr[1]
|
|
|
}, res)
|
|
|
}, {})
|
|
|
} else {
|
|
|
//转换参数类型--兼容性
|
|
|
for(let key in primitiveParams) {
|
|
|
if(typeof primitiveParams[key] === 'number') {
|
|
|
params[key] = primitiveParams[key] + ''
|
|
|
} else {
|
|
|
params[key] = primitiveParams[key]
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//原以下数据要从客户端上报,现调整为如果以下参数客户端未上报,则通过请求附带的context参数中获取
|
|
|
const convertParams = {
|
|
|
//appid
|
|
|
ak: 'appId',
|
|
|
//当前登录用户编号
|
|
|
uid: 'uid',
|
|
|
//设备编号
|
|
|
did: 'deviceId',
|
|
|
//uni-app 运行平台,与条件编译平台相同。
|
|
|
up: 'uniPlatform',
|
|
|
//操作系统名称
|
|
|
p: 'osName',
|
|
|
//因为p参数可能会被前端覆盖掉,所以这里单独拿出来一个osName
|
|
|
on: 'osName',
|
|
|
//客户端ip
|
|
|
ip: 'clientIP',
|
|
|
//客户端的UA
|
|
|
ua: 'userAgent',
|
|
|
//当前服务空间编号
|
|
|
spid: 'spaceId',
|
|
|
//当前服务空间提供商
|
|
|
sppd: 'provider',
|
|
|
//应用版本号
|
|
|
v: 'appVersion',
|
|
|
//rom 名称
|
|
|
rn: 'romName',
|
|
|
//rom 版本
|
|
|
rv: 'romVersion',
|
|
|
//操作系统版本
|
|
|
sv: 'osVersion',
|
|
|
//操作系统语言
|
|
|
lang: 'osLanguage',
|
|
|
//操作系统主题
|
|
|
ot: 'osTheme',
|
|
|
//设备类型
|
|
|
dtp: 'deviceType',
|
|
|
//设备品牌
|
|
|
brand: 'deviceBrand',
|
|
|
//设备型号
|
|
|
md: 'deviceModel',
|
|
|
//设备像素比
|
|
|
pr: 'devicePixelRatio',
|
|
|
//可使用窗口宽度
|
|
|
ww: 'windowWidth',
|
|
|
//可使用窗口高度
|
|
|
wh: 'windowHeight',
|
|
|
//屏幕宽度
|
|
|
sw: 'screenWidth',
|
|
|
//屏幕高度
|
|
|
sh: 'screenHeight',
|
|
|
}
|
|
|
context = context ? context : {}
|
|
|
for (let key in convertParams) {
|
|
|
if (!params[key] && context[convertParams[key]]) {
|
|
|
params[key] = context[convertParams[key]]
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return params
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 解析url
|
|
|
* @param {String} url
|
|
|
*/
|
|
|
function parseUrl(url) {
|
|
|
if (typeof url !== "string" || !url) {
|
|
|
return false
|
|
|
}
|
|
|
const urlInfo = url.split('?')
|
|
|
|
|
|
baseurl = urlInfo[0]
|
|
|
if (baseurl !== '/' && baseurl.indexOf('/') === 0) {
|
|
|
baseurl = baseurl.substr(1)
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
path: baseurl,
|
|
|
query: urlInfo[1] ? decodeURI(urlInfo[1]) : ''
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//加载配置中心-uni-config-center
|
|
|
let createConfig
|
|
|
try {
|
|
|
createConfig = require('uni-config-center')
|
|
|
} catch (e) {}
|
|
|
|
|
|
/**
|
|
|
* 获取配置文件信息
|
|
|
* @param {String} file 配置文件名称
|
|
|
* @param {String} key 配置参数键值
|
|
|
*/
|
|
|
function getConfig(file, key) {
|
|
|
if (!file) {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
const uniConfig = createConfig && createConfig({
|
|
|
pluginId: 'uni-stat'
|
|
|
})
|
|
|
|
|
|
if (!uniConfig || !uniConfig.hasFile(file + '.json')) {
|
|
|
console.error('Not found the config file')
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
const config = uniConfig.requireFile(file)
|
|
|
|
|
|
return key ? config[key] : config
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 休眠
|
|
|
* @param {Object} ms 休眠时间(毫秒)
|
|
|
*/
|
|
|
function sleep(ms) {
|
|
|
return new Promise(resolve => setTimeout(() => resolve(), ms))
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
hasOwn,
|
|
|
isPlainObject,
|
|
|
isFn,
|
|
|
deepClone,
|
|
|
parseUrlParams,
|
|
|
parseUrl,
|
|
|
getConfig,
|
|
|
sleep
|
|
|
}
|