123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- 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
- }
|