commonForVue.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. window.afterClickBack = function () {
  2. console.log('afterClickBack', location.href)
  3. }
  4. var vTools = {
  5. // 公共前缀url
  6. baseUrl: '',
  7. errorCodeMap: {
  8. 1001: '需要重新登录',
  9. 1002: '缺失参数',
  10. 1003: '没有权限',
  11. },
  12. $env: {},
  13. // 传入你要获取的参数的名字
  14. getParam: function (name) {
  15. var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
  16. var r = window.location.search.substr(1).match(reg); //获取url中'?'符后的字符串并正则匹配
  17. var context = '';
  18. if (r != null) context = r[2];
  19. // 释放变量
  20. reg = null;
  21. r = null;
  22. return context == null || context == '' || context == 'undefined' ? '' : context;
  23. },
  24. // 数组对象根据某一个值进行冒泡排序
  25. // arr 数组
  26. // value 字符串
  27. bSort: function (arr, value) {
  28. var len = arr.length;
  29. for (var i = 0; i < len - 1; i++) {
  30. for (var j = 0; j < len - 1 - i; j++) {
  31. // 相邻元素两两对比,元素交换,大的元素交换到后面
  32. if (arr[j][value] > arr[j + 1][value]) {
  33. var temp = arr[j];
  34. arr[j] = arr[j + 1];
  35. arr[j + 1] = temp;
  36. }
  37. }
  38. }
  39. return arr;
  40. },
  41. // 解决ios返回不刷新页面的问题
  42. iosBackRefresh: function () {
  43. var isPageHide = false;
  44. window.addEventListener('pageshow', function () {
  45. if (isPageHide) {
  46. location.reload();
  47. }
  48. });
  49. window.addEventListener('pagehide', function () {
  50. isPageHide = true;
  51. });
  52. },
  53. // 通过userAgent获取用户手机操作系统类型
  54. androidOrIOS: function () {
  55. var u = navigator.userAgent.toLowerCase();
  56. var app = navigator.appVersion;
  57. var agent = null;
  58. if (/iphone|ipod|ipad|ios/.test(u)) {
  59. agent = 'ios'
  60. } else {
  61. agent = 'android'
  62. }
  63. return agent
  64. },
  65. // 取[m, n]随机数
  66. getRandomNumber: function (min, max) {
  67. return Math.floor(Math.random() * (max - min + 1) + min);
  68. },
  69. // 获取唯一的uuid
  70. // https://www.kancloud.cn/ifeng/js100/622666
  71. getRandomUuid: function () {
  72. var s = [];
  73. var hexDigits = "0123456789abcdef";
  74. for (var i = 0; i < 36; i++) {
  75. s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  76. }
  77. s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
  78. s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
  79. s[8] = s[13] = s[18] = s[23] = "-";
  80. var uuid = s.join("");
  81. return uuid;
  82. },
  83. // 获取随机字符串
  84. // 不传参数则获取长度不固定的字符串
  85. getRandomString: function (len) {
  86. var randomString = '';
  87. if (len) {
  88. /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
  89. var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  90. var maxPos = $chars.length;
  91. for (i = 0; i < len; i++) {
  92. randomString += $chars.charAt(Math.floor(Math.random() * maxPos));
  93. }
  94. } else {
  95. // Math.random() 生成随机数字, eg: 0.123456
  96. // .toString(36) 转化成36进制 : "0.4fzyo82mvyr"
  97. // .substring(2) 去掉前面两位 : "yo82mvyr"
  98. // .slice(-8) 截取最后八位 : "yo82mvyr"
  99. randomString = Math.random().toString(36).substring(2)
  100. }
  101. return randomString;
  102. },
  103. // FROM: https://www.jianshu.com/p/90ed8b728975
  104. // 比较两个兑现是否相等
  105. // 返回true为相等,返回false为不相等
  106. deepCompare: function (x, y) {
  107. var i, l, leftChain, rightChain;
  108. function compare2Objects(x, y) {
  109. var p;
  110. // remember that NaN === NaN returns false
  111. // and isNaN(undefined) returns true
  112. if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
  113. return true;
  114. }
  115. // Compare primitives and functions.
  116. // Check if both arguments link to the same object.
  117. // Especially useful on the step where we compare prototypes
  118. if (x === y) {
  119. return true;
  120. }
  121. // Works in case when functions are created in constructor.
  122. // Comparing dates is a common scenario. Another built-ins?
  123. // We can even handle functions passed across iframes
  124. if ((typeof x === 'function' && typeof y === 'function') ||
  125. (x instanceof Date && y instanceof Date) ||
  126. (x instanceof RegExp && y instanceof RegExp) ||
  127. (x instanceof String && y instanceof String) ||
  128. (x instanceof Number && y instanceof Number)) {
  129. return x.toString() === y.toString();
  130. }
  131. // At last checking prototypes as good as we can
  132. if (!(x instanceof Object && y instanceof Object)) {
  133. return false;
  134. }
  135. if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
  136. return false;
  137. }
  138. if (x.constructor !== y.constructor) {
  139. return false;
  140. }
  141. if (x.prototype !== y.prototype) {
  142. return false;
  143. }
  144. // Check for infinitive linking loops
  145. if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
  146. return false;
  147. }
  148. // Quick checking of one object being a subset of another.
  149. // todo: cache the structure of arguments[0] for performance
  150. for (p in y) {
  151. if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
  152. return false;
  153. } else if (typeof y[p] !== typeof x[p]) {
  154. return false;
  155. }
  156. }
  157. for (p in x) {
  158. if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
  159. return false;
  160. } else if (typeof y[p] !== typeof x[p]) {
  161. return false;
  162. }
  163. switch (typeof (x[p])) {
  164. case 'object':
  165. case 'function':
  166. leftChain.push(x);
  167. rightChain.push(y);
  168. if (!compare2Objects(x[p], y[p])) {
  169. return false;
  170. }
  171. leftChain.pop();
  172. rightChain.pop();
  173. break;
  174. default:
  175. if (x[p] !== y[p]) {
  176. return false;
  177. }
  178. break;
  179. }
  180. }
  181. return true;
  182. }
  183. if (arguments.length < 1) {
  184. return true; //Die silently? Don't know how to handle such case, please help...
  185. // throw "Need two or more arguments to compare";
  186. }
  187. for (i = 1, l = arguments.length; i < l; i++) {
  188. leftChain = []; //Todo: this can be cached
  189. rightChain = [];
  190. if (!compare2Objects(arguments[0], arguments[i])) {
  191. return false;
  192. }
  193. }
  194. return true;
  195. },
  196. splitPhone: function (phone) {
  197. return String(phone).replace(/\s/g, '').replace(/(?=(\d{4})+$)/g, ' ')
  198. },
  199. // https://blog.csdn.net/jacoox/article/details/80719456
  200. // https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/129、https://segmentfault.com/a/1190000012490380
  201. // 防抖: 其中 func 为需要进行防抖操作的函数(如发送联想请求的函数),delay 为延迟时间
  202. debounce: function (func, delay) {
  203. var timer = null
  204. return function () {
  205. var _this = this
  206. var _arg = arguments
  207. clearTimeout(timer)
  208. timer = setTimeout(function () {
  209. func.apply(_this, _arg)
  210. }, delay)
  211. }
  212. },
  213. // 节流: 其中 func 为需要进行节流操作的函数,wait为等待时间
  214. throttle: function (func, wait) {
  215. var lastTime = 0
  216. return function (e) {
  217. var now = +new Date()
  218. if (now - lastTime > wait) {
  219. func.apply(this, arguments)
  220. lastTime = now
  221. }
  222. }
  223. },
  224. isWeiXinBrower: function () {
  225. var ua = navigator.userAgent.toLowerCase();
  226. if (ua.match(/MicroMessenger/i) == 'micromessenger') {
  227. return true;
  228. } else {
  229. return false;
  230. }
  231. },
  232. // 解决 客户端2.9.5 replace失效问题
  233. locationReplace: function (url) {
  234. if (history.replaceState) {
  235. history.replaceState(null, document.title, url);
  236. history.go(0);
  237. } else {
  238. location.replace(url);
  239. }
  240. },
  241. iosAppFns: function () {
  242. window.JyObjMessage = new Object()
  243. window.JyObj = {
  244. //清除 JyObjMessage
  245. clearMessage: function () {
  246. JyObjMessage = new Object();
  247. },
  248. //隐藏显示底部菜单栏 0:隐藏;1:显示
  249. hiddenBottom: function (val) {
  250. JyObjMessage["hidden"] = val;
  251. window.webkit.messageHandlers.hiddenBottom.postMessage(JyObjMessage);
  252. JyObj.clearMessage();
  253. },
  254. //微信登录
  255. loginByWeixin: function () {
  256. window.webkit.messageHandlers.loginByWeixin.postMessage(JyObjMessage);
  257. JyObj.clearMessage();
  258. },
  259. //分享功能
  260. share: function (type, title, content, link) {
  261. JyObjMessage["type"] = type
  262. JyObjMessage["title"] = title
  263. JyObjMessage["content"] = content
  264. JyObjMessage["link"] = link
  265. window.webkit.messageHandlers.share.postMessage(JyObjMessage);
  266. JyObj.clearMessage();
  267. },
  268. //保存用户token
  269. saveUserToken: function (val) {
  270. JyObjMessage["token"] = val;
  271. window.webkit.messageHandlers.saveUserToken.postMessage(JyObjMessage);
  272. JyObj.clearMessage();
  273. },
  274. //获取用户token
  275. getUserToken: function () {
  276. return JyObj.IosCall("getUserToken")
  277. },
  278. //移除用户token
  279. removeUserToken: function () {
  280. window.webkit.messageHandlers.removeUserToken.postMessage(JyObjMessage);
  281. JyObj.clearMessage();
  282. },
  283. //查看开关状态 是否接受消息
  284. checkNoticePermission: function () {
  285. return JyObj.IosCall("checkNoticePermission")
  286. },
  287. //打开接受消息开关
  288. openSystemNotification: function () {
  289. window.webkit.messageHandlers.openSystemNotification.postMessage(JyObjMessage);
  290. JyObj.clearMessage();
  291. },
  292. //获取极光推送id
  293. getPushRid: function () {
  294. return JyObj.IosCall("getPushRid")
  295. },
  296. //跳转外部链接
  297. openExternalLink: function (url, title) {
  298. JyObjMessage["url"] = url
  299. JyObjMessage["title"] = title
  300. window.webkit.messageHandlers.openExternalLink.postMessage(JyObjMessage);
  301. JyObj.clearMessage();
  302. },
  303. //获取当前版本号
  304. getVersion: function () {
  305. return JyObj.IosCall("getVersion")
  306. },
  307. alert: function (content) {
  308. JyObjMessage["content"] = content
  309. window.webkit.messageHandlers.alert.postMessage(JyObjMessage);
  310. JyObj.clearMessage();
  311. },
  312. //是否安装了微信
  313. isInstallWeixin: function () {
  314. return JyObj.IosCall("isInstallWeixin")
  315. },
  316. //登录加密
  317. getCipherText: function (val) {
  318. JyObjMessage["phone"] = val
  319. return JyObj.IosCall("getCipherText", JyObjMessage)
  320. },
  321. //刷新首页和订阅页面
  322. checkLab: function () {
  323. window.webkit.messageHandlers.checkLab.postMessage(JyObjMessage);
  324. JyObj.clearMessage();
  325. },
  326. //登录成功后向客户端传参
  327. loginSuccess: function (status) {
  328. JyObjMessage["status"] = status
  329. window.webkit.messageHandlers.loginSuccess.postMessage(JyObjMessage);
  330. JyObj.clearMessage();
  331. },
  332. //客户端登录页面点击返回 跳转到搜索首页
  333. backUrl: function (val) {
  334. JyObjMessage["status"] = val;
  335. window.webkit.messageHandlers.backUrl.postMessage(JyObjMessage);
  336. JyObj.clearMessage();
  337. },
  338. //清空通知栏消息
  339. clearPushMessage: function () {
  340. window.webkit.messageHandlers.clearPushMessage.postMessage(JyObjMessage);
  341. JyObj.clearMessage();
  342. },
  343. //隐藏小红点
  344. hideRedSpotOnMenu: function (menu) {
  345. JyObjMessage["menu"] = menu;
  346. window.webkit.messageHandlers.hideRedSpotOnMenu.postMessage(JyObjMessage);
  347. JyObj.clearMessage();
  348. },
  349. //显示小红点
  350. showRedSpotOnMenu: function (menu) {
  351. JyObjMessage["menu"] = menu;
  352. window.webkit.messageHandlers.showRedSpotOnMenu.postMessage(JyObjMessage);
  353. JyObj.clearMessage();
  354. },
  355. //微信支付
  356. wxPay: function (order) {
  357. JyObjMessage["order"] = order;
  358. window.webkit.messageHandlers.wxPay.postMessage(JyObjMessage);
  359. JyObj.clearMessage();
  360. },
  361. //支付宝支付
  362. aliPay: function (order) {
  363. JyObjMessage["order"] = order;
  364. window.webkit.messageHandlers.aliPay.postMessage(JyObjMessage);
  365. JyObj.clearMessage();
  366. },
  367. //获取原生的推送id
  368. getOtherPushRid: function () {
  369. return JyObj.IosCall("getOtherPushRid")
  370. },
  371. //获取手机型号
  372. getPhoneBrand: function () {
  373. return JyObj.IosCall("getPhoneBrand")
  374. },
  375. //获取定位
  376. getLocation: function () {
  377. return JyObj.IosCall("getLocation")
  378. },
  379. //切换菜单
  380. chooseTab: function (indexTab) {
  381. JyObjMessage["indexTab"] = indexTab;
  382. window.webkit.messageHandlers.chooseTab.postMessage(JyObjMessage);
  383. JyObj.clearMessage();
  384. },
  385. //打开照相机
  386. skipCamera: function () {
  387. window.webkit.messageHandlers.skipCamera.postMessage(JyObjMessage);
  388. JyObj.clearMessage();
  389. },
  390. //打开相册
  391. skipAlbum: function () {
  392. window.webkit.messageHandlers.skipAlbum.postMessage(JyObjMessage);
  393. JyObj.clearMessage();
  394. },
  395. //点击返回调用
  396. judgeIsHidden: function (referer) {
  397. JyObjMessage["referer"] = referer;
  398. window.webkit.messageHandlers.judgeIsHidden.postMessage(JyObjMessage);
  399. JyObj.clearMessage();
  400. },
  401. //返回值 处理
  402. IosCall: function (functionName, args) {
  403. if (args != "" && args != undefined) {
  404. JyObj.clearMessage();
  405. }
  406. var payload = { "jsName": functionName, "arguments": args };
  407. var res = prompt(JSON.stringify(payload));
  408. if (res != "") {
  409. var resObj = JSON.parse(res)
  410. var type = resObj.type
  411. switch (type) {
  412. case "int":
  413. return parseInt(resObj.value)
  414. case "string":
  415. return resObj.value
  416. case "bool":
  417. if (resObj.value == "true") {
  418. return true
  419. }
  420. return false
  421. default:
  422. return ""
  423. }
  424. }
  425. return ""
  426. },
  427. //查看定位开关状态 是否开启
  428. checkLocationPermission: function () {
  429. return JyObj.IosCall("checkLocationPermission")
  430. }
  431. }
  432. }
  433. }
  434. vTools.$env = {
  435. inWeiXin: vTools.isWeiXinBrower(),
  436. platform: vTools.isWeiXinBrower() ? 'wx' : 'app',
  437. operateSystem: vTools.androidOrIOS()
  438. }
  439. // iosApp全局注册内置方法
  440. if (!vTools.$env.inWeiXin && vTools.$env.operateSystem === 'ios') {
  441. vTools.iosAppFns()
  442. }
  443. /*
  444. * 时间格式化函数(将时间格式化为,2019年08月12日,2019-08-12,2019/08/12的形式)
  445. *
  446. *
  447. * pattern参数(想要什么格式的数据就传入什么格式的数据)
  448. * · 'yyyy-MM-dd' ---> 输出如2019-09-20
  449. * · 'yyyy-MM-dd hh:mm' ---> 输出如2019-09-20 08:20
  450. * · 'yyyy-MM-dd hh:mm:ss' ---> 输出如2019-09-20 08:20:23
  451. * · 'yyyy/MM/dd' ---> 输出如2019/09/20
  452. * · 'yyyy年MM月dd日' ---> 输出如2019年09月20日
  453. * · 'yyyy年MM月dd日 hh时mm分' ---> 输出如2019年09月20日 08时20分
  454. * · 'yyyy年MM月dd日 hh时mm分ss秒' ---> 输出如2019年09月20日 08时20分23秒
  455. * · 'yyyy年MM月dd日 hh时mm分ss秒 EE' ---> 输出如2019年09月20日 08时20分23秒 周二
  456. * · 'yyyy年MM月dd日 hh时mm分ss秒 EEE' ---> 输出如2019年09月20日 08时20分23秒 星期二
  457. *
  458. * 参考: https://www.cnblogs.com/mr-wuxiansheng/p/6296646.html
  459. */
  460. Date.prototype.pattern = function (fmt) {
  461. var o = {
  462. 'y+': this.getFullYear(),
  463. 'M+': this.getMonth() + 1, //月份
  464. 'd+': this.getDate(), //日
  465. 'h+': this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时
  466. 'H+': this.getHours(), //小时
  467. 'm+': this.getMinutes(), //分
  468. 's+': this.getSeconds(), //秒
  469. 'q+': Math.floor((this.getMonth() + 3) / 3), //季度
  470. 'S': this.getMilliseconds(), //毫秒
  471. 'E+': this.getDay(), // 周
  472. };
  473. var week = {
  474. '0': '日',
  475. '1': '一',
  476. '2': '二',
  477. '3': '三',
  478. '4': '四',
  479. '5': '五',
  480. '6': '六'
  481. };
  482. if (/(y+)/.test(fmt)) {
  483. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
  484. }
  485. if (/(E+)/.test(fmt)) {
  486. fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '星期' : '周') : '') + week[
  487. this.getDay() + '']);
  488. }
  489. for (var k in o) {
  490. if (new RegExp('(' + k + ')').test(fmt)) {
  491. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
  492. .length)));
  493. }
  494. }
  495. return fmt;
  496. }