tools.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. var tools = {
  2. // 判断对象数组中指定属性是否有某个值的数据
  3. objArrHasValue(objArr, key, value) {
  4. // console.log("objArrHasValue", objArr, key, value);
  5. return objArr.find(obj => obj[key] === value) !== undefined;
  6. },
  7. // 获取对象数组中指定属性为指定值的对象
  8. objArrGetObjByValue(objArr, key, value) {
  9. // console.log("objArrGetObjByValue", objArr, key, value);
  10. return objArr.find(obj => obj[key] === value);
  11. },
  12. // 对url追加项目版本号,用于页面更新后用户端的强制刷新
  13. // 每次页面变更必须更新项目版本号
  14. urlAddVer(url) {
  15. let newUrl = url;
  16. // 获取当前app的版本
  17. const systemInfo = uni.getSystemInfoSync();
  18. // #ifdef H5
  19. const version_number = systemInfo.appVersion;
  20. // console.log('版本号:', version_number);
  21. if (newUrl.indexOf('_v=') !== -1) {
  22. return newUrl;
  23. }
  24. if (newUrl.indexOf('?') !== -1) {
  25. newUrl += "&_v=" + version_number;
  26. } else {
  27. newUrl += "?_v=" + version_number;
  28. }
  29. // #endif
  30. console.log("[urlAddVer] newUrl", newUrl);
  31. return newUrl;
  32. },
  33. // 导航到彩图奔跑APP内的某个页面或执行APP内部的某些功能
  34. appAction(url, actType = "") {
  35. console.log("appAction", url);
  36. // console.log("getApp", getApp());
  37. // getApp().$audio.destroy();
  38. // getApp().$audio.pause();
  39. if (url.indexOf('http') !== -1) { // http 或 https 开头的网址
  40. window.location.href = this.urlAddVer(url);
  41. } else if (url == "reload") {
  42. window.location.reload();
  43. } else if (actType == "uni.navigateTo") {
  44. uni.navigateTo({
  45. url: this.urlAddVer(url)
  46. });
  47. } else {
  48. window.location.href = url;
  49. }
  50. },
  51. // 格式化赛事时间 09-09 16:48
  52. fmtMcTime(timestamp) {
  53. var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  54. // var Y = date.getFullYear() + '-';
  55. var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
  56. var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
  57. var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
  58. var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
  59. // var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
  60. const timeStr = M + D + h + m;
  61. // console.log("timeStr", timeStr);
  62. return timeStr;
  63. },
  64. // 获取活动时间 09-09 16:48 至 09-30 16:48
  65. getActtime(beginSecond, endSecond) {
  66. const acttime = this.fmtMcTime(beginSecond) + " 至 " + this.fmtMcTime(endSecond);
  67. // console.log("acttime:", acttime);
  68. return acttime;
  69. },
  70. // 格式化赛事时间 2024.9.9-30 2024.9.9-10.30 2024.9.9-2025.10.30
  71. fmtMcTime2(timestamp1, timestamp2) {
  72. const date1 = new Date(timestamp1 * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  73. const date2 = new Date(timestamp2 * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  74. const Y1 = date1.getFullYear();
  75. const Y2 = date2.getFullYear();
  76. const M1 = date1.getMonth() + 1;
  77. const M2 = date2.getMonth() + 1;
  78. const D1 = date1.getDate();
  79. const D2 = date2.getDate();
  80. var timeStr1 = Y1 + '.' + M1 + '.' + D1;
  81. var timeStr2 = '';
  82. if (Y2 != Y1) {
  83. timeStr2 += Y2 + '.' + M2 + '.' + D2;
  84. } else if (M2 != M1) {
  85. timeStr2 += M2 + '.' + D2;
  86. } else if (D2 != D1) {
  87. timeStr2 += D2;
  88. }
  89. var timeStr = timeStr1;
  90. if (timeStr2.length > 0) {
  91. timeStr += '-' + timeStr2;
  92. }
  93. // console.log("timeStr", timeStr);
  94. return timeStr;
  95. },
  96. // 格式化赛事时间 2024年9月9日 至 9月12日 2024年12月9日 至 2025年1月6日
  97. fmtMcTime3(timestamp1, timestamp2) {
  98. const date1 = new Date(timestamp1 * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  99. const date2 = new Date(timestamp2 * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  100. const Y1 = date1.getFullYear();
  101. const Y2 = date2.getFullYear();
  102. const M1 = date1.getMonth() + 1;
  103. const M2 = date2.getMonth() + 1;
  104. const D1 = date1.getDate();
  105. const D2 = date2.getDate();
  106. var timeStr1 = Y1 + '年' + M1 + '月' + D1 + '日';
  107. var timeStr2 = '';
  108. if (Y2 != Y1) {
  109. timeStr2 += Y2 + '年' + M2 + '月' + D2 + '日';
  110. } else {
  111. timeStr2 += M2 + '月' + D2 + '日';
  112. }
  113. var timeStr = timeStr1;
  114. if (timeStr2.length > 0) {
  115. timeStr += ' 至 ' + timeStr2;
  116. }
  117. // console.log("timeStr", timeStr);
  118. return timeStr;
  119. },
  120. // 判断赛事/活动状态 0: 未开始 1: 进行中 2: 已结束
  121. checkMcState(beginSecond, endSecond) {
  122. let mcState = 0; // 未开始
  123. if (beginSecond > 0 && endSecond > 0) {
  124. const now = Date.now() / 1000;
  125. const dif1 = beginSecond - now;
  126. const dif2 = endSecond - now;
  127. // const dif = 3600*24 - 60;
  128. if (dif1 > 0) {
  129. console.log("活动未开始");
  130. mcState = 0; // 未开始
  131. } else if (dif2 > 0) {
  132. console.log("活动进行中");
  133. mcState = 1; // 进行中
  134. } else {
  135. console.log("活动已结束");
  136. mcState = 2; // 已结束
  137. }
  138. }
  139. return mcState;
  140. },
  141. // 动态创建<style>标签,将CSS代码插入到文档中
  142. loadCssCode(cssCode, styleId = "css-custom") {
  143. this.removeCssCode(styleId);
  144. // const styleId = "css-custom";
  145. var style = window.document.createElement("style");
  146. style.type = "text/css";
  147. style.id = styleId;
  148. if (style.styleSheet) {
  149. // This is required for IE8 and below.
  150. style.styleSheet.cssText = cssCode;
  151. } else {
  152. style.appendChild(document.createTextNode(cssCode));
  153. }
  154. document.getElementsByTagName("head")[0].appendChild(style);
  155. // console.log("head:", document.getElementsByTagName("head")[0]);
  156. // console.log("head:", document.getElementById(styleId));
  157. // console.log("style:", style);
  158. },
  159. // 删除之前动态创建的<style>标签
  160. removeCssCode(styleId = "css-custom") {
  161. // const styleId = "css-custom";
  162. var oldCss = document.getElementById(styleId);
  163. // console.log("oldCss:", oldCss);
  164. if (oldCss != null) {
  165. document.getElementsByTagName("head")[0].removeChild(oldCss);
  166. console.log(styleId + " 已移除");
  167. }
  168. },
  169. // uni-data-select 组件,根据选中的值获取对应的文本
  170. getSelectedText(obj, value) {
  171. const selectedOption = obj.find(option => option.value === value);
  172. return selectedOption ? selectedOption.text : '';
  173. },
  174. objectToQueryString(obj) {
  175. return Object.keys(obj).map(k => k + '=' + obj[k]).join('&');
  176. },
  177. // 秒数转换成 XX天XX小时
  178. convertSecondsToDHM(seconds) {
  179. var days = Math.floor(seconds / (3600 * 24));
  180. var hours = Math.floor((seconds % (3600 * 24)) / 3600);
  181. var minutes = Math.floor((seconds % (3600 * 24)) % 3600 / 60);
  182. if (days > 0)
  183. // return `${days.toString().padStart(2, '0')}天${hours.toString().padStart(2, '0')}小时`;
  184. return `${days}天${hours.toString().padStart(2, '0')}小时`;
  185. else
  186. return `${hours.toString().padStart(2, '0')}小时${minutes.toString().padStart(2, '0')}分钟`;
  187. },
  188. // 秒数转换成时分秒
  189. // style: 0 [01:02:03] 1 [1h:02'3"]
  190. convertSecondsToHMS(seconds, style = 0) {
  191. if (!(seconds > 0)) {
  192. return '--';
  193. }
  194. var hours = Math.floor(seconds / 3600);
  195. var minutes = Math.floor((seconds % 3600) / 60);
  196. var remainingSeconds = Math.floor(seconds % 60);
  197. // return hours + ":" + minutes + ":" + remainingSeconds;
  198. if (style == 0)
  199. return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
  200. else if (style == 1) {
  201. if (hours > 0)
  202. return `${hours}h${minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
  203. else
  204. return `${minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
  205. } else if (style == 2) {
  206. if (hours > 0)
  207. return `${hours*60+minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
  208. else
  209. return `${minutes}′${remainingSeconds.toString().padStart(2, '0')}″`;
  210. }
  211. },
  212. // 计算(中英文混合)字符串长度
  213. calStrLen(str) {
  214. var length = 0;
  215. for (var i = 0; i < str.length; i++) {
  216. // 将字符转换为 Unicode 编码
  217. var charCode = str.charCodeAt(i);
  218. if (charCode >= 0 && charCode <= 128) {
  219. length++;
  220. } else {
  221. length += 2;
  222. }
  223. }
  224. return length;
  225. },
  226. // 集合对象去重
  227. unique(arr, field) {
  228. var map = {};
  229. var res = [];
  230. for (var i = 0; i < arr.length; i++) {
  231. if (!map[arr[i][field]]) {
  232. map[arr[i][field]] = 1;
  233. res.push(arr[i]);
  234. }
  235. }
  236. return res;
  237. },
  238. // 正则取出html标签
  239. repalceHtml(str) {
  240. var dd = str.replace(/<\/?.+?>/g, "");
  241. var dds = dd.replace(/ /g, ""); //dds为得到后的内容
  242. return dds;
  243. },
  244. // 判断身份证号
  245. isSfz(idcard) {
  246. var id =
  247. /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$/
  248. if (idcard === '') {
  249. uni.showToast({
  250. title: '请输入身份证号',
  251. icon: 'none'
  252. })
  253. } else if (!id.test(idcard)) {
  254. uni.showToast({
  255. title: '身份证号格式不正确!',
  256. icon: 'none'
  257. })
  258. return false
  259. } else {
  260. return false
  261. }
  262. },
  263. // 判断是否是手机号
  264. isPhone(val) {
  265. var patrn = /^(((1[3456789][0-9]{1})|(15[0-9]{1}))+\d{8})$/
  266. if (!patrn.test(val) || val === '') {
  267. uni.showToast({
  268. title: '手机号格式不正确',
  269. icon: 'none'
  270. })
  271. return false
  272. } else {
  273. return true
  274. }
  275. },
  276. // 判断邮箱
  277. isEmail(email) {
  278. if (email.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
  279. return true;
  280. else
  281. return false;
  282. },
  283. //获取随机数
  284. getSuiji() {
  285. var Range = Max - Min;
  286. var Rand = Math.random();
  287. return (Min + Math.round(Rand * Range));
  288. },
  289. //计算多长时间前
  290. getDateDiff(dateTimeStamp) {
  291. var minute = 1000 * 60;
  292. var hour = minute * 60;
  293. var day = hour * 24;
  294. var halfamonth = day * 15;
  295. var month = day * 30;
  296. var year = day * 365;
  297. var now = new Date().getTime();
  298. var diffValue = now - dateTimeStamp;
  299. if (diffValue < 0) {
  300. return;
  301. }
  302. var yearC = diffValue / year;
  303. var monthC = diffValue / month;
  304. var weekC = diffValue / (7 * day);
  305. var dayC = diffValue / day;
  306. var hourC = diffValue / hour;
  307. var minC = diffValue / minute;
  308. if (yearC >= 1) {
  309. result = "" + parseInt(yearC) + "年前";
  310. }
  311. if (monthC >= 1) {
  312. result = "" + parseInt(monthC) + "月前";
  313. } else if (weekC >= 1) {
  314. result = "" + parseInt(weekC) + "周前";
  315. } else if (dayC >= 1) {
  316. result = "" + parseInt(dayC) + "天前";
  317. } else if (hourC >= 1) {
  318. result = "" + parseInt(hourC) + "小时前";
  319. } else if (minC >= 1) {
  320. result = "" + parseInt(minC) + "分钟前";
  321. } else
  322. result = "刚刚";
  323. return result;
  324. },
  325. // 时间戳转时间
  326. timestampToTime(timestamp, i) {
  327. var date = null;
  328. if (timestamp > 0) {
  329. date = new Date(timestamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  330. } else {
  331. date = new Date();
  332. }
  333. // console.log(date, timestamp)
  334. var Y = date.getFullYear();
  335. var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
  336. var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
  337. var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours());
  338. var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
  339. var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
  340. if (i == 1) {
  341. return Y + '-' + M + '-' + D;
  342. } else if (i == 2) {
  343. return Y + '年' + M + '月' + D + '日';
  344. } else if (i == 3) {
  345. return Y + '-' + M + '-' + D + ' ' + h + ':' + m;
  346. }
  347. return Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s;
  348. },
  349. // 是否是汉字
  350. isHanzi(str) {
  351. let reg = /\p{Unified_Ideograph}/ug;
  352. return reg.test(str);
  353. },
  354. // 是否是字母数字
  355. isStringAndNumber(str) {
  356. let regNumber = new RegExp(/^[0-9A-Za-z]+$/);
  357. return regNumber.test(str)
  358. },
  359. // var arr3 = [30,10,111,35,1899,50,45];
  360. // 集合排序 元素数字
  361. listSort(list) {
  362. arr3.sort(function(a, b) {
  363. return a - b;
  364. })
  365. },
  366. // var arr5 = [{id:10},{id:5},{id:6},{id:9},{id:2},{id:3}];
  367. // 元素 对象
  368. listObjectSort(arr) {
  369. arr.sort(function(a, b) {
  370. return a.id - b.id
  371. })
  372. return arr;
  373. },
  374. /*
  375. * 忽略大小写判断字符串是否相同
  376. * @param str1
  377. * @param str2
  378. * @returns {Boolean}
  379. */
  380. isEqualsIgnorecase: function(str1, str2) {
  381. if (str1.toUpperCase() == str2.toUpperCase()) {
  382. return true;
  383. } else {
  384. return false;
  385. }
  386. },
  387. /**
  388. * 判断是否是数字
  389. * @param value
  390. * @returns {Boolean}
  391. */
  392. isNum: function(value) {
  393. if (value != null && value.length > 0 && isNaN(value) == false) {
  394. return true;
  395. } else {
  396. return false;
  397. }
  398. },
  399. /**
  400. * 判断是否是中文
  401. * @param str
  402. * @returns {Boolean}
  403. */
  404. isChine: function(str) {
  405. var reg = /^([u4E00-u9FA5]|[uFE30-uFFA0])*$/;
  406. if (reg.test(str)) {
  407. return false;
  408. }
  409. return true;
  410. },
  411. /*验证是否为图片*/
  412. tmCheckImage: function(fileName) {
  413. return /(gif|jpg|jpeg|png|GIF|JPG|PNG)$/ig.test(fileName);
  414. },
  415. /*验证是否为视频*/
  416. tmCheckVideo: function(fileName) {
  417. return /(mp4|mp3|flv|wav)$/ig.test(fileName);
  418. },
  419. /**
  420. * 去除字符串两边的空格
  421. * @param str
  422. * @returns {number|Number}
  423. * 调用方法:var str = utils.trim("abcd")
  424. */
  425. trim: function(str) {
  426. String.prototype.trim = function() {
  427. return str.replace(/(^\s*)|(\s*$)/g, "");
  428. }
  429. },
  430. // 判断密码是否符合 至少6位,包括大小写字母、数字、特殊字符
  431. isPassword(val) {
  432. var reg = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$)^.{8,16}$/;
  433. if (val === '') {
  434. uni.showToast({
  435. title: '请输入密码',
  436. icon: 'none'
  437. })
  438. } else if (!reg.test(val)) {
  439. uni.showToast({
  440. title: '至少6位,包括大小写字母、数字、特殊字符',
  441. icon: 'none'
  442. })
  443. return false
  444. } else {
  445. return true
  446. }
  447. },
  448. // 电话匿名
  449. noPassByMobile(str) {
  450. if (null != str && str != undefined) {
  451. var pat = /(\d{3})\d*(\d{4})/;
  452. return str.replace(pat, '$1****$2');
  453. } else {
  454. return "";
  455. }
  456. },
  457. // 获取两点间的距离
  458. //进行经纬度转换为距离的计算
  459. Rad(d) {
  460. return d * Math.PI / 180.0; //经纬度转换成三角函数中度分表形式。
  461. },
  462. /*
  463. 计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
  464. 默认单位km
  465. */
  466. getMapDistance(lat1, lat2, lng1, lng2) {
  467. lat1 = lat1 || 0;
  468. lng1 = lng1 || 0;
  469. lat2 = lat2 || 0;
  470. lng2 = lng2 || 0;
  471. var rad1 = lat1 * Math.PI / 180.0;
  472. var rad2 = lat2 * Math.PI / 180.0;
  473. var a = rad1 - rad2;
  474. var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
  475. var r = 6378137;
  476. var distance = r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) *
  477. Math.pow(Math.sin(b / 2), 2)));
  478. // console.log(lat1, lng1, lat2, lng2);
  479. // console.log(distance);
  480. return Math.round(distance) / 1000;
  481. },
  482. // 预览图片
  483. yulanImg(item) {
  484. let arr = [item]
  485. uni.previewImage({
  486. urls: arr,
  487. });
  488. },
  489. }
  490. export default tools;