utils.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. const _toString = Object.prototype.toString
  2. const hasOwnProperty = Object.prototype.hasOwnProperty
  3. /**
  4. * 检查对象是否包含某个属性
  5. * @param {Object} obj 对象
  6. * @param {String} key 属性键值
  7. */
  8. function hasOwn(obj, key) {
  9. return hasOwnProperty.call(obj, key)
  10. }
  11. /**
  12. * 参数是否为JavaScript的简单对象
  13. * @param {Object} obj
  14. * @returns {Boolean} true|false
  15. */
  16. function isPlainObject(obj) {
  17. return _toString.call(obj) === '[object Object]'
  18. }
  19. /**
  20. * 是否为函数
  21. * @param {String} fn 函数名
  22. */
  23. function isFn(fn) {
  24. return typeof fn === 'function'
  25. }
  26. /**
  27. * 深度克隆对象
  28. * @param {Object} obj
  29. */
  30. function deepClone(obj) {
  31. return JSON.parse(JSON.stringify(obj))
  32. }
  33. /**
  34. * 解析客户端上报的参数
  35. * @param {String} primitiveParams 原始参数
  36. * @param {Object} context 附带的上下文
  37. */
  38. function parseUrlParams(primitiveParams, context) {
  39. if (!primitiveParams) {
  40. return primitiveParams
  41. }
  42. let params = {}
  43. if(typeof primitiveParams === 'string') {
  44. params = primitiveParams.split('&').reduce((res, cur) => {
  45. const arr = cur.split('=')
  46. return Object.assign({
  47. [arr[0]]: arr[1]
  48. }, res)
  49. }, {})
  50. } else {
  51. //转换参数类型--兼容性
  52. for(let key in primitiveParams) {
  53. if(typeof primitiveParams[key] === 'number') {
  54. params[key] = primitiveParams[key] + ''
  55. } else {
  56. params[key] = primitiveParams[key]
  57. }
  58. }
  59. }
  60. //原以下数据要从客户端上报,现调整为如果以下参数客户端未上报,则通过请求附带的context参数中获取
  61. const convertParams = {
  62. //appid
  63. ak: 'appId',
  64. //当前登录用户编号
  65. uid: 'uid',
  66. //设备编号
  67. did: 'deviceId',
  68. //uni-app 运行平台,与条件编译平台相同。
  69. up: 'uniPlatform',
  70. //操作系统名称
  71. p: 'osName',
  72. //因为p参数可能会被前端覆盖掉,所以这里单独拿出来一个osName
  73. on: 'osName',
  74. //客户端ip
  75. ip: 'clientIP',
  76. //客户端的UA
  77. ua: 'userAgent',
  78. //当前服务空间编号
  79. spid: 'spaceId',
  80. //当前服务空间提供商
  81. sppd: 'provider',
  82. //应用版本号
  83. v: 'appVersion',
  84. //rom 名称
  85. rn: 'romName',
  86. //rom 版本
  87. rv: 'romVersion',
  88. //操作系统版本
  89. sv: 'osVersion',
  90. //操作系统语言
  91. lang: 'osLanguage',
  92. //操作系统主题
  93. ot: 'osTheme',
  94. //设备类型
  95. dtp: 'deviceType',
  96. //设备品牌
  97. brand: 'deviceBrand',
  98. //设备型号
  99. md: 'deviceModel',
  100. //设备像素比
  101. pr: 'devicePixelRatio',
  102. //可使用窗口宽度
  103. ww: 'windowWidth',
  104. //可使用窗口高度
  105. wh: 'windowHeight',
  106. //屏幕宽度
  107. sw: 'screenWidth',
  108. //屏幕高度
  109. sh: 'screenHeight',
  110. }
  111. context = context ? context : {}
  112. for (let key in convertParams) {
  113. if (!params[key] && context[convertParams[key]]) {
  114. params[key] = context[convertParams[key]]
  115. }
  116. }
  117. return params
  118. }
  119. /**
  120. * 解析url
  121. * @param {String} url
  122. */
  123. function parseUrl(url) {
  124. if (typeof url !== "string" || !url) {
  125. return false
  126. }
  127. const urlInfo = url.split('?')
  128. baseurl = urlInfo[0]
  129. if (baseurl !== '/' && baseurl.indexOf('/') === 0) {
  130. baseurl = baseurl.substr(1)
  131. }
  132. return {
  133. path: baseurl,
  134. query: urlInfo[1] ? decodeURI(urlInfo[1]) : ''
  135. }
  136. }
  137. //加载配置中心-uni-config-center
  138. let createConfig
  139. try {
  140. createConfig = require('uni-config-center')
  141. } catch (e) {}
  142. /**
  143. * 获取配置文件信息
  144. * @param {String} file 配置文件名称
  145. * @param {String} key 配置参数键值
  146. */
  147. function getConfig(file, key) {
  148. if (!file) {
  149. return false
  150. }
  151. const uniConfig = createConfig && createConfig({
  152. pluginId: 'uni-stat'
  153. })
  154. if (!uniConfig || !uniConfig.hasFile(file + '.json')) {
  155. console.error('Not found the config file')
  156. return false
  157. }
  158. const config = uniConfig.requireFile(file)
  159. return key ? config[key] : config
  160. }
  161. /**
  162. * 休眠
  163. * @param {Object} ms 休眠时间(毫秒)
  164. */
  165. function sleep(ms) {
  166. return new Promise(resolve => setTimeout(() => resolve(), ms))
  167. }
  168. module.exports = {
  169. hasOwn,
  170. isPlainObject,
  171. isFn,
  172. deepClone,
  173. parseUrlParams,
  174. parseUrl,
  175. getConfig,
  176. sleep
  177. }