util.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. function formatTime(time) {
  2. if (typeof time !== 'number' || time < 0) {
  3. return time
  4. }
  5. var hour = parseInt(time / 3600)
  6. time = time % 3600
  7. var minute = parseInt(time / 60)
  8. time = time % 60
  9. var second = time
  10. return ([hour, minute, second]).map(function(n) {
  11. n = n.toString()
  12. return n[1] ? n : '0' + n
  13. }).join(':')
  14. }
  15. function formatLocation(longitude, latitude) {
  16. if (typeof longitude === 'string' && typeof latitude === 'string') {
  17. longitude = parseFloat(longitude)
  18. latitude = parseFloat(latitude)
  19. }
  20. longitude = longitude.toFixed(2)
  21. latitude = latitude.toFixed(2)
  22. return {
  23. longitude: longitude.toString().split('.'),
  24. latitude: latitude.toString().split('.')
  25. }
  26. }
  27. function distanceByLnglat(lat1, lng1, lat2, lng2) {
  28. var radLat1 = lat1 * Math.PI / 180.0;
  29. var radLat2 = lat2 * Math.PI / 180.0;
  30. var a = radLat1 - radLat2;
  31. var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
  32. var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math
  33. .sin(b / 2), 2)));
  34. s = s * 6378.137;
  35. s = Math.round(s * 10000) / 10000;
  36. return s
  37. };
  38. var dateUtils = {
  39. UNITS: {
  40. '年': 31557600000,
  41. '月': 2629800000,
  42. '天': 86400000,
  43. '小时': 3600000,
  44. '分钟': 60000,
  45. '秒': 1000
  46. },
  47. humanize: function(milliseconds) {
  48. var humanize = '';
  49. for (var key in this.UNITS) {
  50. if (milliseconds >= this.UNITS[key]) {
  51. humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
  52. break;
  53. }
  54. }
  55. return humanize || '刚刚';
  56. },
  57. format: function(dateStr) {
  58. // var date = this.parse(dateStr)
  59. var date = dateStr;
  60. var diff = Date.now() - date.getTime();
  61. if (diff < this.UNITS['天']) {
  62. return this.humanize(diff);
  63. }
  64. var _format = function(number) {
  65. return (number < 10 ? ('0' + number) : number);
  66. };
  67. return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDay()) + '-' +
  68. _format(date.getHours()) + ':' + _format(date.getMinutes());
  69. },
  70. parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象
  71. var a = str.split(/[^0-9]/);
  72. return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
  73. }
  74. };
  75. var currentFormatDate = {
  76. formatDate: function(nows, type) {
  77. var now = new Date(nows * 1000);
  78. var year = now.getFullYear(); //取得4位数的年份
  79. var month = now.getMonth() + 1; //取得日期中的月份,其中0表示1月,11表示12月
  80. var date = now.getDate(); //返回日期月份中的天数(1到31)
  81. var hour = now.getHours(); //返回日期中的小时数(0到23)
  82. var minute = now.getMinutes(); //返回日期中的分钟数(0到59)
  83. var second = now.getSeconds(); //返回日期中的秒数(0到59)
  84. // return year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
  85. if (type == 1) {
  86. return year + "-" + this._format(month) + "-" + this._format(date);
  87. } else {
  88. return year + "-" + this._format(month) + "-" + this._format(date) + " " + this._format(hour) +
  89. ":" + this._format(
  90. minute);
  91. }
  92. },
  93. _format: function(number) {
  94. return (number < 10 ? ('0' + number) : number);
  95. },
  96. }
  97. var formatDates = {
  98. formatDate: function(nows) {
  99. var now = new Date(nows * 1000);
  100. var year = now.getFullYear(); //取得4位数的年份
  101. var month = now.getMonth() + 1; //取得日期中的月份,其中0表示1月,11表示12月
  102. var date = now.getDate(); //返回日期月份中的天数(1到31)
  103. var hour = now.getHours(); //返回日期中的小时数(0到23)
  104. var minute = now.getMinutes(); //返回日期中的分钟数(0到59)
  105. var second = now.getSeconds(); //返回日期中的秒数(0到59)
  106. // return year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
  107. // return year + "-" + this._format(month) + "-" + this._format(date) + " " + this._format(hour) + ":" + this._format(
  108. // minute);
  109. return this._format(month) + "/" + this._format(date) + " " + this._format(hour) + ":" + this._format(
  110. minute);
  111. },
  112. _format: function(number) {
  113. return (number < 10 ? ('0' + number) : number);
  114. },
  115. }
  116. function getNumber(num, total) {
  117. var num = parseFloat(num);
  118. var total = parseFloat(total);
  119. if (isNaN(num) || isNaN(total)) {
  120. return;
  121. }
  122. return (Math.round((total - num) / total * 100))
  123. }
  124. var getUrlArgs = function() {
  125. // var argStr = window.location.href ? window.location.href.substring(1) : "";
  126. var argStr = window.location.search ? window.location.search.substring(1) : "";
  127. var argObj = {},
  128. item = null,
  129. value = null,
  130. key = null,
  131. argArr = argStr.length > 0 ? argStr.split("&") : [];
  132. for (var i = 0, len = argArr.length; i < len; i++) {
  133. item = argArr[i].split("=");
  134. key = item[0];
  135. value = item[1];
  136. argObj[key] = value;
  137. }
  138. return argObj;
  139. }
  140. let _debounceTimeout = null,
  141. _throttleRunning = false
  142. /**
  143. * 防抖
  144. * @param {Function} 执行函数
  145. * @param {Number} delay 延时ms
  146. */
  147. export const debounce = (fn, delay = 500) => {
  148. clearTimeout(_debounceTimeout);
  149. _debounceTimeout = setTimeout(() => {
  150. fn();
  151. }, delay);
  152. }
  153. /**
  154. * 节流
  155. * @param {Function} 执行函数
  156. * @param {Number} delay 延时ms
  157. */
  158. const throttle = (fn, delay = 500) => {
  159. if (_throttleRunning) {
  160. return;
  161. }
  162. _throttleRunning = true;
  163. fn();
  164. setTimeout(() => {
  165. _throttleRunning = false;
  166. }, delay);
  167. }
  168. /**
  169. * 检查登录
  170. * @return {Boolean}
  171. */
  172. export const isLogin = (options = {}) => {
  173. const token = uni.getStorageSync('token');
  174. if (token) {
  175. return true;
  176. }
  177. if (options.nav !== false) {
  178. uni.navigateTo({
  179. url: '/pages/auth/login'
  180. })
  181. }
  182. return false;
  183. }
  184. /**
  185. * 获取页面栈
  186. * @param {Number} preIndex为1时获取上一页
  187. * @return {Object}
  188. */
  189. const prePage = (preIndex = 1) => {
  190. const pages = getCurrentPages();
  191. const prePage = pages[pages.length - (preIndex + 1)];
  192. return prePage.$vm;
  193. }
  194. /**
  195. * 格式化时间戳 Y-m-d H:i:s
  196. * @param {String} format Y-m-d H:i:s
  197. * @param {Number} timestamp 时间戳
  198. * @return {String}
  199. */
  200. export const date = (format, timeStamp) => {
  201. if ('' + timeStamp.length <= 10) {
  202. timeStamp = +timeStamp * 1000;
  203. } else {
  204. timeStamp = +timeStamp;
  205. }
  206. let _date = new Date(timeStamp),
  207. Y = _date.getFullYear(),
  208. m = _date.getMonth() + 1,
  209. d = _date.getDate(),
  210. H = _date.getHours(),
  211. i = _date.getMinutes(),
  212. s = _date.getSeconds();
  213. m = m < 10 ? '0' + m : m;
  214. d = d < 10 ? '0' + d : d;
  215. H = H < 10 ? '0' + H : H;
  216. i = i < 10 ? '0' + i : i;
  217. s = s < 10 ? '0' + s : s;
  218. return format.replace(/[YmdHis]/g, key => {
  219. return {
  220. Y,
  221. m,
  222. d,
  223. H,
  224. i,
  225. s
  226. } [key];
  227. });
  228. }
  229. //二维数组去重
  230. export const getUnique = array => {
  231. let obj = {}
  232. return array.filter((item, index) => {
  233. let newItem = item + JSON.stringify(item)
  234. return obj.hasOwnProperty(newItem) ? false : obj[newItem] = true
  235. })
  236. }
  237. // 判断类型集合
  238. const checkStr = (str, type) => {
  239. switch (type) {
  240. case 'mobile': //手机号码
  241. return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
  242. case 'tel': //座机
  243. return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
  244. case 'card': //身份证
  245. return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
  246. case 'mobileCode': //6位数字验证码
  247. return /^[0-9]{6}$/.test(str)
  248. case 'pwd': //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
  249. return /^([a-zA-Z0-9_]){6,18}$/.test(str)
  250. case 'payPwd': //支付密码 6位纯数字
  251. return /^[0-9]{6}$/.test(str)
  252. case 'postal': //邮政编码
  253. return /[1-9]\d{5}(?!\d)/.test(str);
  254. case 'QQ': //QQ号
  255. return /^[1-9][0-9]{4,9}$/.test(str);
  256. case 'email': //邮箱
  257. return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
  258. case 'money': //金额(小数点2位)
  259. return /^\d*(?:\.\d{0,2})?$/.test(str);
  260. case 'URL': //网址
  261. return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
  262. case 'IP': //IP
  263. return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
  264. case 'date': //日期时间
  265. return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) ||
  266. /^(\d{4})\-(\d{2})\-(\d{2})$/
  267. .test(str)
  268. case 'number': //数字
  269. return /^[0-9]$/.test(str);
  270. case 'english': //英文
  271. return /^[a-zA-Z]+$/.test(str);
  272. case 'chinese': //中文
  273. return /^[\\u4E00-\\u9FA5]+$/.test(str);
  274. case 'lower': //小写
  275. return /^[a-z]+$/.test(str);
  276. case 'upper': //大写
  277. return /^[A-Z]+$/.test(str);
  278. case 'HTML': //HTML标记
  279. return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
  280. default:
  281. return true;
  282. }
  283. }
  284. /**
  285. * toast
  286. */
  287. export const msg = (title = '', param = {}) => {
  288. if (!title) return;
  289. uni.showToast({
  290. title,
  291. duration: param.duration || 1500,
  292. mask: param.mask || false,
  293. icon: param.icon || 'none'
  294. });
  295. }
  296. /**
  297. * getDate
  298. */
  299. export const getDate = (type) => {
  300. const date = new Date();
  301. let year = date.getFullYear();
  302. let month = date.getMonth() + 1;
  303. let day = date.getDate();
  304. if (type === 'start') {
  305. year = year - 10;
  306. } else if (type === 'end') {
  307. year = year + 10;
  308. }
  309. month = month > 9 ? month : '0' + month;;
  310. day = day > 9 ? day : '0' + day;
  311. return `${year}-${month}-${day}`;
  312. }
  313. module.exports = {
  314. formatTime: formatTime,
  315. formatLocation: formatLocation,
  316. distanceByLnglat: distanceByLnglat,
  317. dateUtils: dateUtils,
  318. getNumber: getNumber,
  319. currentFormatDate: currentFormatDate,
  320. getUrlArgs: getUrlArgs,
  321. checkStr: checkStr,
  322. throttle: throttle,
  323. isLogin: isLogin,
  324. debounce: debounce,
  325. prePage: prePage,
  326. date: date,
  327. msg: msg,
  328. getDate: getDate
  329. }