tools.js 12 KB

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