tool.js 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. /**
  2. * tool 工具组件
  3. */
  4. mbui.define([], function (exports) {
  5. "use strict";
  6. var tool = {
  7. ajax: function (options, callback) {
  8. let format = 'json';
  9. if (options.hasOwnProperty('data')) {
  10. format = options.data.hasOwnProperty('format') ? options.data.format : 'json';
  11. }
  12. callback = callback || options.success;
  13. callback && delete options.success;
  14. let optsetting = { timeout: 10000 };
  15. if (format == 'jsonp') {
  16. optsetting = { timeout: 10000, dataType: 'jsonp', jsonp: 'callback' }
  17. }
  18. let opts = $.extend({}, optsetting, {
  19. success: function (res) {
  20. if (callback && typeof callback === 'function') {
  21. callback(res);
  22. }
  23. }
  24. }, options);
  25. $.ajax(opts);
  26. },
  27. get: function (url, data, callback) {
  28. this.ajax({ url: url, type: "GET", data: data }, callback);
  29. },
  30. post: function (url, data, callback) {
  31. this.ajax({ url: url, type: "POST", data: data }, callback);
  32. },
  33. put: function (url, data, callback) {
  34. this.ajax({ url: url, type: "PUT", data: data }, callback);
  35. },
  36. delete: function (url, data, callback) {
  37. this.ajax({ url: url, type: "DELETE", data: data }, callback);
  38. },
  39. reload: function (delay) {
  40. //延迟刷新,一般是在编辑完页面数据后需要自动关闭页面用到
  41. if(delay && delay>0){
  42. setTimeout(function () {
  43. location.reload();
  44. }, delay);
  45. }else{
  46. location.reload();
  47. }
  48. },
  49. replace: function (url,delay) {
  50. //延迟刷新,一般是在编辑完页面数据后需要自动关闭页面用到
  51. if(delay && delay>0){
  52. setTimeout(function () {
  53. window.location.replace(url);
  54. }, delay);
  55. }else{
  56. window.location.replace(url);
  57. }
  58. },
  59. //格式化文件大小
  60. renderSize:function(val){
  61. if(null==val||val==''){
  62. return "0 Bytes";
  63. }
  64. var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
  65. var index=0;
  66. var srcsize = parseFloat(val);
  67. index=Math.floor(Math.log(srcsize)/Math.log(1024));
  68. var size =srcsize/Math.pow(1024,index);
  69. size=size.toFixed(2);//保留的小数位数
  70. return size+unitArr[index];
  71. },
  72. // 格式化文件
  73. file_item:function(file,view=''){
  74. let image=['jpg','jpeg','png','gif'];
  75. let fileshow='<div class="mbui-file-icon"><i class="iconfont icon-weizhigeshi"></i></div>';
  76. if(file['fileext'] == 'pdf'){
  77. }
  78. if(image.includes(file['fileext'])){
  79. fileshow='<div class="mbui-file-icon file-img"><img src="'+file['filepath']+'" alt="'+file['name']+'"></div>';
  80. }
  81. let file_del='';
  82. if(view == ''){
  83. file_del = '<div class="mbui-file-del"><i class="iconfont icon-cuowukongxin"></i></div>';
  84. }
  85. let filesize = this.renderSize(file['filesize']);
  86. let filedate = this.formatDate(file['create_time']);
  87. let item = '<div class="mbui-file-div"data-id="'+file['id']+'">\
  88. '+fileshow+'\
  89. <div class="mbui-file-info">\
  90. <div class="mbui-file-name line-limit-1">'+file['name']+'</div>\
  91. <div class="mbui-file-size">'+filesize+','+filedate+'</div>\
  92. </div>\
  93. '+file_del+'\
  94. </div>';
  95. return item;
  96. },
  97. // 倒计时
  98. countdown: function (options) {
  99. var that = this;
  100. // 默认可选项
  101. options = $.extend(true, {
  102. date: new Date(),
  103. now: new Date()
  104. }, options);
  105. // 兼容旧版参数
  106. var args = arguments;
  107. if (args.length > 1) {
  108. options.date = new Date(args[0]);
  109. options.now = new Date(args[1]);
  110. options.clock = args[2];
  111. }
  112. // 实例对象
  113. var inst = {
  114. options: options,
  115. clear: function () { // 清除计时器
  116. clearTimeout(inst.timer);
  117. },
  118. reload: function (opts) { // 重置倒计时
  119. this.clear();
  120. $.extend(true, this.options, {
  121. now: new Date()
  122. }, opts);
  123. count();
  124. }
  125. };
  126. typeof options.ready === 'function' && options.ready();
  127. // 计算倒计时
  128. var count = (function fn() {
  129. var date = new Date(options.date);
  130. var now = new Date(options.now);
  131. var countTime = function (time) {
  132. return time > 0 ? time : 0;
  133. }(date.getTime() - now.getTime());
  134. var result = {
  135. d: Math.floor(countTime / (1000 * 60 * 60 * 24)), // 天
  136. h: Math.floor(countTime / (1000 * 60 * 60)) % 24, // 时
  137. m: Math.floor(countTime / (1000 * 60)) % 60, // 分
  138. s: Math.floor(countTime / 1000) % 60 // 秒
  139. };
  140. var next = function () {
  141. now.setTime(now.getTime() + 1000);
  142. options.now = now;
  143. count();
  144. };
  145. // 计时 - 以秒间隔
  146. inst.timer = setTimeout(next, 1000);
  147. typeof options.clock === 'function' && options.clock(result, inst);
  148. // 计时完成
  149. if (countTime <= 0) {
  150. clearTimeout(inst.timer);
  151. typeof options.done === 'function' && options.done(result, inst);
  152. }
  153. return fn;
  154. })();
  155. return inst;
  156. },
  157. // 某个时间在当前时间的多久前
  158. timeAgo: function (time, onlyDate) {
  159. var that = this;
  160. var arr = [[], []];
  161. var stamp = new Date().getTime() - new Date(time).getTime();
  162. // 返回具体日期
  163. if (stamp > 1000 * 60 * 60 * 24 * 31) {
  164. stamp = new Date(time);
  165. arr[0][0] = that.digit(stamp.getFullYear(), 4);
  166. arr[0][1] = that.digit(stamp.getMonth() + 1);
  167. arr[0][2] = that.digit(stamp.getDate());
  168. // 是否输出时间
  169. if (!onlyDate) {
  170. arr[1][0] = that.digit(stamp.getHours());
  171. arr[1][1] = that.digit(stamp.getMinutes());
  172. arr[1][2] = that.digit(stamp.getSeconds());
  173. }
  174. return arr[0].join('-') + ' ' + arr[1].join(':');
  175. }
  176. // 30 天以内,返回「多久前」
  177. if (stamp >= 1000 * 60 * 60 * 24) {
  178. return ((stamp / 1000 / 60 / 60 / 24) | 0) + ' 天前';
  179. } else if (stamp >= 1000 * 60 * 60) {
  180. return ((stamp / 1000 / 60 / 60) | 0) + ' 小时前';
  181. } else if (stamp >= 1000 * 60 * 3) { // 3 分钟以内为:刚刚
  182. return ((stamp / 1000 / 60) | 0) + ' 分钟前';
  183. } else if (stamp < 0) {
  184. return '未来';
  185. } else {
  186. return '刚刚';
  187. }
  188. },
  189. /**
  190. * 格式化时间戳为指定格式
  191. * @param {number} timestamp - 时间戳(毫秒或秒)
  192. * @param {string} formatStr - 格式字符串,例如 'YYYY-MM-DD HH:mm:ss'
  193. * @returns {string}
  194. */
  195. formatDate:function(timestamp, formatStr = 'YYYY-MM-DD HH:mm:ss') {
  196. const date = new Date(timestamp);
  197. // 如果是秒级时间戳,转为毫秒
  198. if (timestamp.toString().length === 10) {
  199. date.setTime(timestamp * 1000);
  200. }
  201. const padZero = (num) => String(num).padStart(2, '0');
  202. const replacements = {
  203. YYYY: date.getFullYear(),
  204. MM: padZero(date.getMonth() + 1), // 月份从 0 开始
  205. DD: padZero(date.getDate()),
  206. HH: padZero(date.getHours()),
  207. mm: padZero(date.getMinutes()),
  208. ss: padZero(date.getSeconds())
  209. };
  210. return Object.entries(replacements).reduce((str, [key, value]) => {
  211. return str.replace(key, value);
  212. }, formatStr);
  213. },
  214. //返回10位时间戳
  215. time: function () {
  216. return Math.floor((new Date).getTime() / 1e3);
  217. },
  218. /**
  219. *
  220. * @param n 格式化样式Y-m-d H:i:s返回带0 Y-n-j不带0 z一年中第几天要+1才正确 w星期0是周日 N 7是周日D三个字母星期 l英语星期 W周 F月份英语 L闰年判断 c带时区日期时间 r英文形式
  221. * @param t 时间戳
  222. * @returns 格式化时间
  223. */
  224. date: function (n, t) {
  225. var e, r, u = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], o = /\\?(.?)/gi, i = function (n, t) { return r[n] ? r[n]() : t }, c = function (n, t) { for (n = String(n); n.length < t;)n = "0" + n; return n }; r = { d: function () { return c(r.j(), 2) }, D: function () { return r.l().slice(0, 3) }, j: function () { return e.getDate() }, l: function () { return u[r.w()] + "day" }, N: function () { return r.w() || 7 }, S: function () { var n = r.j(), t = n % 10; return t <= 3 && 1 === parseInt(n % 100 / 10, 10) && (t = 0), ["st", "nd", "rd"][t - 1] || "th" }, w: function () { return e.getDay() }, z: function () { var n = new Date(r.Y(), r.n() - 1, r.j()), t = new Date(r.Y(), 0, 1); return Math.round((n - t) / 864e5) }, W: function () { var n = new Date(r.Y(), r.n() - 1, r.j() - r.N() + 3), t = new Date(n.getFullYear(), 0, 4); return c(1 + Math.round((n - t) / 864e5 / 7), 2) }, F: function () { return u[6 + r.n()] }, m: function () { return c(r.n(), 2) }, M: function () { return r.F().slice(0, 3) }, n: function () { return e.getMonth() + 1 }, t: function () { return new Date(r.Y(), r.n(), 0).getDate() }, L: function () { var n = r.Y(); return n % 4 == 0 & n % 100 != 0 | n % 400 == 0 }, o: function () { var n = r.n(), t = r.W(); return r.Y() + (12 === n && t < 9 ? 1 : 1 === n && t > 9 ? -1 : 0) }, Y: function () { return e.getFullYear() }, y: function () { return r.Y().toString().slice(-2) }, a: function () { return e.getHours() > 11 ? "pm" : "am" }, A: function () { return r.a().toUpperCase() }, B: function () { var n = 3600 * e.getUTCHours(), t = 60 * e.getUTCMinutes(), r = e.getUTCSeconds(); return c(Math.floor((n + t + r + 3600) / 86.4) % 1e3, 3) }, g: function () { return r.G() % 12 || 12 }, G: function () { return e.getHours() }, h: function () { return c(r.g(), 2) }, H: function () { return c(r.G(), 2) }, i: function () { return c(e.getMinutes(), 2) }, s: function () { return c(e.getSeconds(), 2) }, u: function () { return c(1e3 * e.getMilliseconds(), 6) }, e: function () { throw new Error("Not supported (see source code of date() for timezone on how to add support)") }, I: function () { return new Date(r.Y(), 0) - Date.UTC(r.Y(), 0) != new Date(r.Y(), 6) - Date.UTC(r.Y(), 6) ? 1 : 0 }, O: function () { var n = e.getTimezoneOffset(), t = Math.abs(n); return (n > 0 ? "-" : "+") + c(100 * Math.floor(t / 60) + t % 60, 4) }, P: function () { var n = r.O(); return n.substr(0, 3) + ":" + n.substr(3, 2) }, T: function () { return "UTC" }, Z: function () { return 60 * -e.getTimezoneOffset() }, c: function () { return "Y-m-d\\TH:i:sP".replace(o, i) }, r: function () { return "D, d M Y H:i:s O".replace(o, i) }, U: function () { return e / 1e3 | 0 } }; return function (n, t) { return e = void 0 === t ? new Date : t instanceof Date ? new Date(t) : new Date(1e3 * t), n.replace(o, i) }(n, t)
  226. },
  227. /**
  228. *
  229. * @param text 转换参数now +-1 day +- 2 days +-1 week
  230. * @param now 默认当前时间戳
  231. * @returns 字符串转换时间戳
  232. */
  233. strtotime: function (text, now) {
  234. var parsed, match, today, year, date, days, ranges, len, times, regex, i, fail = false; if (!text) { return fail } text = text.replace(/^\s+|\s+$/g, "").replace(/\s{2,}/g, " ").replace(/[\t\r\n]/g, "").toLowerCase(); match = text.match(/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/); if (match && match[2] === match[4]) { if (match[1] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": return fail; case "/": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { if (match[5] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case "/": if (match[1] > 12 || match[3] > 31) { return fail } return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31 || (match[1] < 70 && match[1] > 38)) { return fail } year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1]; return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[5] >= 70) { if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } if (match[5] < 60 && !match[6]) { if (match[1] > 23 || match[3] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000 } return fail; case "/": if (match[1] > 12 || match[3] > 31 || (match[5] < 70 && match[5] > 38)) { return fail } year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5]; return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ":": if (match[1] > 23 || match[3] > 59 || match[5] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000 } } } } if (text === "now") { return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0 } if (!isNaN(parsed = Date.parse(text))) { return parsed / 1000 | 0 } date = now ? new Date(now * 1000) : new Date(); days = { "sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6 }; ranges = { "yea": "FullYear", "mon": "Month", "day": "Date", "hou": "Hours", "min": "Minutes", "sec": "Seconds" }; function lastNext(type, range, modifier) { var diff, day = days[range]; if (typeof day !== "undefined") { diff = day - date.getDay(); if (diff === 0) { diff = 7 * modifier } else { if (diff > 0 && type === "last") { diff -= 7 } else { if (diff < 0 && type === "next") { diff += 7 } } } date.setDate(date.getDate() + diff) } } function process(val) { var splt = val.split(" "), type = splt[0], range = splt[1].substring(0, 3), typeIsNumber = /\d+/.test(type), ago = splt[2] === "ago", num = (type === "last" ? -1 : 1) * (ago ? -1 : 1); if (typeIsNumber) { num *= parseInt(type, 10) } if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) { return date["set" + ranges[range]](date["get" + ranges[range]]() + num) } if (range === "wee") { return date.setDate(date.getDate() + (num * 7)) } if (type === "next" || type === "last") { lastNext(type, range, num) } else { if (!typeIsNumber) { return false } } return true } times = "(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec" + "|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?" + "|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)"; regex = "([+-]?\\d+\\s" + times + "|" + "(last|next)\\s" + times + ")(\\sago)?"; match = text.match(new RegExp(regex, "gi")); if (!match) { return fail } for (i = 0, len = match.length; i < len; i++) { if (!process(match[i])) { return fail } } return (date.getTime() / 1000)
  235. },
  236. /**
  237. * date_eq('2019-10-22','2019-10-21') true
  238. * @param 前日期
  239. * @param 后日期
  240. * @returns 判断日期是否前边大于后边
  241. */
  242. date_eq: function (strDate1, strDate2) {
  243. var date1 = new Date(strDate1.replace(/\-/g, "\/")); var date2 = new Date(strDate2.replace(/\-/g, "\/")); if ((date1 - date2) >= 0) { return true; } else { return false; }
  244. },
  245. /**
  246. * @param 时间戳10位
  247. * @returns 格式化时间
  248. */
  249. timeline: function (tt) {
  250. var today = new Date(); var d = new Date(tt * 1000); var m = today.getTime() - d.getTime(); if (m <= 0) { m = 1000 } if (m < 60 * 1000) { return Math.floor(m / 1000) + "秒前" } else { if (m < 60 * 60 * 1000) { return Math.floor(m / (1000 * 60)) + "分钟前" } else { if (m < 60 * 60 * 1000 * 24) { return Math.floor(m / (1000 * 60 * 60)) + "小时前" } else { if (m < 60 * 60 * 1000 * 24 * 7) { return Math.floor(m / (1000 * 60 * 60 * 24)) + "天前" } else { if (m < 60 * 60 * 1000 * 24 * 7 * 56) { return Math.floor(m / (1000 * 60 * 60 * 24 * 7)) + "周前" } else { return Math.floor(m / (1000 * 60 * 60 * 24 * 7 * 52)) + "年前" } } } } }
  251. },
  252. /**
  253. * 获取某个月份的第一天、最后一天
  254. * @param nowDate 时间
  255. * @return {(string|string)[]}
  256. */
  257. getFirstNowLastDay: function (nowDate) {
  258. var now = nowDate ? new Date(nowDate) : new Date();
  259. var strLink = "-";
  260. var year = now.getFullYear();
  261. var month = now.getMonth() + 1;
  262. var day = now.getDate();
  263. if (month >= 1 && month <= 9) {
  264. month = "0" + month;
  265. }
  266. if (day >= 1 && day <= 9) {
  267. day = "0" + day;
  268. }
  269. var yearMonth = year + strLink + month;
  270. var firstDate = year + strLink + month + strLink + '01';
  271. var sysDate = year + strLink + month + strLink + day;
  272. var lastDay = this.getLastDay(year, month);
  273. var lastDate = year + strLink + month + strLink + lastDay;
  274. //以数组形式返回
  275. return [firstDate, sysDate, lastDate, yearMonth];
  276. },
  277. /**
  278. * 获取当月的最后一天
  279. * @param year 年份
  280. * @param month 月份
  281. **/
  282. getLastDay: function (year, month) {
  283. var new_year = year;
  284. var new_month = month++;//取下一个月的第一天,方便计算(最后一天不固定)
  285. if (month > 12) {//如果当前大于12月,则年份转到下一年
  286. new_month -= 12;//月份减
  287. new_year++;//年份增
  288. }
  289. // 取当年当月对应的下个月的前一天,即当前月的最后一天
  290. return new Date(new_year, new_month, 0).getDate();
  291. },
  292. /**
  293. *array_keys( {firstname: 'Kevin', surname: 'van Zonneveld'} );
  294. * @param 数组
  295. * @returns 返回数组中key
  296. */
  297. array_keys: function (r, n, a) {
  298. var e = void 0 !== n, o = [], t = !!a, i = !0, y = ""; for (y in r) r.hasOwnProperty(y) && (i = !0, e && (t && r[y] !== n ? i = !1 : r[y] !== n && (i = !1)), i && (o[o.length] = y)); return o
  299. },
  300. /**
  301. * array_values( {firstname: 'Kevin', surname: 'van Zonneveld'} );
  302. * @param 数组
  303. * @returns 返回数组中值
  304. */
  305. array_values: function (r) {
  306. var n = [], a = ""; for (a in r) n[n.length] = r[a]; return n
  307. },
  308. /**
  309. *array_unique({'a': 'green', 0: 'red', 'b': 'green', 1: 'blue', 2: 'red'})
  310. * @param 数组
  311. * @returns 去除数组重复
  312. */
  313. array_unique: function (r) {
  314. var n = "", t = {}, u = ""; for (n in r) r.hasOwnProperty(n) && (u = r[n], !1 === function (r, n) { var t = ""; for (t in n) if (n.hasOwnProperty(t) && n[t] + "" == r + "") return t; return !1 }(u, t) && (t[n] = u)); return t
  315. },
  316. /**
  317. * array_slice(["a", "b", "c", "d", "e"], 2, -1, true);
  318. * @param 数组
  319. * @param 开始位置
  320. * @param 取出个数
  321. * @param 是否重排
  322. * @returns 截取数组
  323. */
  324. array_slice: function (r, i, e, t) {
  325. var o = ""; if ("[object Array]" !== Object.prototype.toString.call(r) || t && 0 !== i) { var a = 0, c = {}; for (o in r) a += 1, c[o] = r[o]; r = c, i = i < 0 ? a + i : i, e = void 0 === e ? a : e < 0 ? a + e - i : e; var n = {}, l = !1, f = -1, s = 0, v = 0; for (o in r) { if (++f, s >= e) break; f === i && (l = !0), l && (++s, is_int(o) && !t ? n[v++] = r[o] : n[o] = r[o]) } return n } return void 0 === e ? r.slice(i) : e >= 0 ? r.slice(i, i + e) : r.slice(i, e)
  326. },
  327. /**
  328. *array_search('e',["a", "b", "c", "d", "e"])
  329. * @param 要查找的值
  330. * @param 数组
  331. * @returns 数组中搜索指定值返回键
  332. */
  333. array_search: function (r, e, t) {
  334. var n = !!t, i = ""; if ("object" == typeof r && r.exec) { if (!n) { var o = "i" + (r.global ? "g" : "") + (r.multiline ? "m" : "") + (r.sticky ? "y" : ""); r = new RegExp(r.source, o) } for (i in e) if (e.hasOwnProperty(i) && r.test(e[i])) return i; return !1 } for (i in e) if (e.hasOwnProperty(i) && (n && e[i] === r || !n && e[i] == r)) return i; return !1
  335. },
  336. /**
  337. *
  338. * @param 变量
  339. * @returns 是否数组判断
  340. */
  341. is_array: function (t) {
  342. if (!t || "object" != typeof t) return !1; if (function (t) { if (!t || "object" != typeof t || "number" != typeof t.length) return !1; var e = t.length; return t[t.length] = "bogus", e !== t.length ? (t.length -= 1, !0) : (delete t[t.length], !1) }(t)) return !0; var e = Object.prototype.toString.call(t), n = function (t) { var e = /\W*function\s+([\w$]+)\s*\(/.exec(t); return e ? e[1] : "(Anonymous)" }(t.constructor); return "[object Object]" === e && "Object" === n
  343. },
  344. /**
  345. *
  346. * @param 值
  347. * @param 数组
  348. * @returns 判断元素是否在数组中bool
  349. */
  350. in_array: function (r, n, i) {
  351. var f = ""; if (!i) { for (f in n) if (n[f] == r) return !0 } else for (f in n) if (n[f] === r) return !0; return !1
  352. },
  353. /**
  354. *sort(["a","b"],"SORT_STRING",true)
  355. * @param 数组
  356. * @param SORT_STRING|SORT_NUMERIC 排序类型
  357. * @param 默认true只排序不输出,false输出
  358. * @returns 数组排序
  359. */
  360. sort: function (inputArr, sort_flags, strictForIn = true) {
  361. var valArr = [], keyArr = [], k = '', i = 0, sorter = false, populateArr = []; switch (sort_flags) { case 'SORT_STRING': sorter = function (a, b) { return strnatcmp(a, b); }; break; case 'SORT_NUMERIC': sorter = function (a, b) { return (a - b); }; break; default: sorter = function (a, b) { var aFloat = parseFloat(a), bFloat = parseFloat(b), aNumeric = aFloat + '' === a, bNumeric = bFloat + '' === b; if (aNumeric && bNumeric) { return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0; } else if (aNumeric && !bNumeric) { return 1; } else if (!aNumeric && bNumeric) { return -1; } return a > b ? 1 : a < b ? -1 : 0; }; break; }populateArr = strictForIn ? inputArr : populateArr; for (k in inputArr) { if (inputArr.hasOwnProperty(k)) { valArr.push(inputArr[k]); if (strictForIn) { delete inputArr[k]; } } } valArr.sort(sorter); for (i = 0; i < valArr.length; i++) { populateArr[i] = valArr[i]; } return strictForIn || populateArr;
  362. },
  363. /**
  364. *
  365. * @param 字符
  366. * @returns 是否整数判断
  367. */
  368. is_int: function (i) {
  369. return i === +i && isFinite(i) && !(i % 1)
  370. },
  371. /**
  372. *
  373. * @param 字符
  374. * @returns 是否浮点数判断
  375. */
  376. is_float: function (i) {
  377. return !(+i !== i || isFinite(i) && !(i % 1))
  378. },
  379. /**
  380. *
  381. * @param 变量
  382. * @returns 是否对象判断
  383. */
  384. is_object: function (t) {
  385. return "[object Array]" !== Object.prototype.toString.call(t) && (null !== t && "object" == typeof t)
  386. },
  387. /**
  388. * @param 函数名字符串
  389. * @returns 判断函数是否存在
  390. */
  391. function_exists: function (n) {
  392. var o = "undefined" != typeof window ? window : global; return "string" == typeof n && (n = o[n]), "function" == typeof n
  393. },
  394. /**
  395. *
  396. * @param 数组或对象
  397. * @returns 序列化
  398. */
  399. serialize: function (r) {
  400. var e, t, a, n = "", o = 0, i = function (r) { var e, t, a, n, o = typeof r; if ("object" === o && !r) return "null"; if ("object" === o) { if (!r.constructor) return "object"; a = r.constructor.toString(), e = a.match(/(\w+)\(/), e && (a = e[1].toLowerCase()), n = ["boolean", "number", "string", "array"]; for (t in n) if (a == n[t]) { o = n[t]; break } } return o }, c = i(r); switch (c) { case "function": e = ""; break; case "boolean": e = "b:" + (r ? "1" : "0"); break; case "number": e = (Math.round(r) == r ? "i" : "d") + ":" + r; break; case "string": e = "s:" + function (r) { var e = 0, t = 0, a = r.length, n = ""; for (t = 0; t < a; t++)n = r.charCodeAt(t), e += n < 128 ? 1 : n < 2048 ? 2 : 3; return e }(r) + ':"' + r + '"'; break; case "array": case "object": e = "a"; for (t in r) if (r.hasOwnProperty(t)) { if ("function" === i(r[t])) continue; a = t.match(/^[0-9]+$/) ? parseInt(t, 10) : t, n += this.serialize(a) + this.serialize(r[t]), o++ } e += ":" + o + ":{" + n + "}"; break; case "undefined": default: e = "N" }return "object" !== c && "array" !== c && (e += ";"), e
  401. },
  402. /**
  403. *
  404. * @param 字符串
  405. * @returns 解码序列化
  406. */
  407. unserialize: function (r) {
  408. var e = this, n = function (r) { var e = r.charCodeAt(0); return e < 128 ? 0 : e < 2048 ? 1 : 2 }; return error = function (r, n, a, t) { throw new e.window[r](n, a, t) }, read_until = function (r, e, n) { for (var a = 2, t = [], i = r.slice(e, e + 1); i != n;)a + e > r.length && error("Error", "Invalid"), t.push(i), i = r.slice(e + (a - 1), e + a), a += 1; return [t.length, t.join("")] }, read_chrs = function (r, e, a) { var t, i, u; for (u = [], t = 0; t < a; t++)i = r.slice(e + (t - 1), e + t), u.push(i), a -= n(i); return [u.length, u.join("")] }, _unserialize = function (r, e) { var n, a, t, i, u, s, o, l, c, d, f, h, _, p, w, b, k, g, v = 0, I = function (r) { return r }; switch (e || (e = 0), n = r.slice(e, e + 1).toLowerCase(), a = e + 2, n) { case "i": I = function (r) { return parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "b": I = function (r) { return 0 !== parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "d": I = function (r) { return parseFloat(r) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "n": l = null; break; case "s": d = read_until(r, a, ":"), v = d[0], f = d[1], a += v + 2, c = read_chrs(r, a + 1, parseInt(f, 10)), v = c[0], l = c[1], a += v + 2, v != parseInt(f, 10) && v != l.length && error("SyntaxError", "String length mismatch"); break; case "a": for (l = {}, t = read_until(r, a, ":"), v = t[0], i = t[1], a += v + 2, s = parseInt(i, 10), u = !0, h = 0; h < s; h++)p = _unserialize(r, a), w = p[1], _ = p[2], a += w, b = _unserialize(r, a), k = b[1], g = b[2], a += k, _ !== h && (u = !1), l[_] = g; if (u) { for (o = new Array(s), h = 0; h < s; h++)o[h] = l[h]; l = o } a += 1; break; default: error("SyntaxError", "Unknown / Unhandled data type(s): " + n) }return [n, a - e, I(l)] }, _unserialize(r + "", 0)[2]
  409. },
  410. /**
  411. * uniqid('',true)长度23 默认13
  412. * @param 前缀
  413. * @param 是否增加长度
  414. * @returns 生成唯一id
  415. */
  416. uniqid: function (n, e) {
  417. void 0 === n && (n = ""); var t, i = function (n, e) { return n = parseInt(n, 10).toString(16), e < n.length ? n.slice(n.length - e) : e > n.length ? Array(e - n.length + 1).join("0") + n : n }, o = "undefined" != typeof window ? window : global; o.$locutus = o.$locutus || {}; var d = o.$locutus; return d.php = d.php || {}, d.php.uniqidSeed || (d.php.uniqidSeed = Math.floor(123456789 * Math.random())), d.php.uniqidSeed++, t = n, t += i(parseInt((new Date).getTime() / 1e3, 10), 8), t += i(d.php.uniqidSeed, 5), e && (t += (10 * Math.random()).toFixed(8).toString()), t
  418. },
  419. /**
  420. *
  421. * @param 变量
  422. * @param 进制,默认十进制
  423. * @returns 转换成整型
  424. */
  425. intval: function (i, t) {
  426. var n, a, e = typeof i; return "boolean" === e ? +i : "string" === e ? (0 === t && (a = i.match(/^\s*0(x?)/i), t = a ? a[1] ? 16 : 8 : 10), n = parseInt(i, t || 10), isNaN(n) || !isFinite(n) ? 0 : n) : "number" === e && isFinite(i) ? i < 0 ? Math.ceil(i) : Math.floor(i) : 0
  427. },
  428. //转换成浮点型
  429. floatval: function (a) {
  430. return parseFloat(a) || 0
  431. },
  432. //打印变量
  433. log: function (arr) {
  434. console.log(arr);
  435. },
  436. /**
  437. *
  438. * @param 字符串
  439. * @param 要去除的字符,默认为空格
  440. * @returns 去除两边空格
  441. */
  442. trim: function (r, n) {
  443. var t = [" ", "\n", "\r", "\t", "\f", "\v", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "​", "\u2028", "\u2029", " "].join(""), e = 0, i = 0; for (r += "", n && (t = (n + "").replace(/([[\]().?\/*{}+$^:])/g, "$1")), e = r.length, i = 0; i < e; i++)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(i); break } for (e = r.length, i = e - 1; i >= 0; i--)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(0, i + 1); break } return -1 === t.indexOf(r.charAt(0)) ? r : ""
  444. },
  445. /**
  446. *
  447. * @param 字符串
  448. * @param 要去除的字符
  449. * @returns 去除右边空格
  450. */
  451. rtrim: function (e, r) {
  452. return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "\\$1") : " \\s ", (e + "").replace(new RegExp("[" + r + "]+$", "g"), "")
  453. },
  454. /**
  455. *
  456. * @param 字符串
  457. * @param 要去除的字符
  458. * @returns 去除左边空格
  459. */
  460. ltrim: function (e, r) {
  461. return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "$1") : " \\s ", (e + "").replace(new RegExp("^[" + r + "]+", "g"), "")
  462. },
  463. //字符串删除多个空格只保留一个
  464. strtrim: function (a) {
  465. return a.replace(/\s+/g, " ");
  466. },
  467. /**
  468. *str_replace("a","我","来自于a")
  469. * @param 要查找的字符
  470. * @param 要替换的字符
  471. * @param 字符串
  472. * @returns 字符串替换
  473. */
  474. str_replace: function (t, o, e, c) {
  475. var r = 0, l = 0, n = "", a = "", i = 0, p = 0, u = [].concat(t), f = [].concat(o), g = e, y = "[object Array]" === Object.prototype.toString.call(f), b = "[object Array]" === Object.prototype.toString.call(g); g = [].concat(g); var j = "undefined" != typeof window ? window : global; j.$locutus = j.$locutus || {}; var v = j.$locutus; if (v.php = v.php || {}, "object" == typeof t && "string" == typeof o) { for (n = o, o = [], r = 0; r < t.length; r += 1)o[r] = n; n = "", f = [].concat(o), y = "[object Array]" === Object.prototype.toString.call(f) } for (void 0 !== c && (c.value = 0), r = 0, i = g.length; r < i; r++)if ("" !== g[r]) for (l = 0, p = u.length; l < p; l++)n = g[r] + "", a = y ? void 0 !== f[l] ? f[l] : "" : f[0], g[r] = n.split(u[l]).join(a), void 0 !== c && (c.value += n.split(u[l]).length - 1); return b ? g : g[0]
  476. },
  477. /**
  478. *
  479. * @param 字符串
  480. * @param 保留的标签
  481. * @returns 过滤去除html标签
  482. */
  483. strip_tags: function (input, allowed) {
  484. allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(""); var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; return input.replace(commentsAndPhpTags, "").replace(tags, function ($0, $1) { return allowed.indexOf("<" + $1.toLowerCase() + ">") > -1 ? $0 : "" })
  485. },
  486. //字符串转换首字母大写
  487. ucfirst: function (t) {
  488. return t += "", t.charAt(0).toUpperCase() + t.substr(1)
  489. },
  490. //html转换实体
  491. htmlencode: function (sStr) {
  492. var htmlspecialchars = function (e, E, T, _) { var r = 0, t = 0, a = !1; ("undefined" == typeof E || null === E) && (E = 2), e = e.toString(), _ !== !1 && (e = e.replace(/&/g, "&amp;")), e = e.replace(/</g, "&lt;").replace(/>/g, "&gt;"); var N = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (a = !0), "number" != typeof E) { for (E = [].concat(E), t = 0; t < E.length; t++)0 === N[E[t]] ? a = !0 : N[E[t]] && (r |= N[E[t]]); E = r } return E & N.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/'/g, "&#039;")), a || (e = e.replace(/"/g, "&quot;")), e }; return htmlspecialchars(sStr);
  493. },
  494. //html实体还原
  495. htmldecode: function (sStr) {
  496. var htmlspecialchars_decode = function (e, E) { var T = 0, _ = 0, r = !1; "undefined" == typeof E && (E = 2), e = e.toString().replace(/&lt;/g, "<").replace(/&gt;/g, ">"); var t = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (r = !0), "number" != typeof E) { for (E = [].concat(E), _ = 0; _ < E.length; _++)0 === t[E[_]] ? r = !0 : t[E[_]] && (T |= t[E[_]]); E = T } return E & t.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/&#0*39;/g, "'")), r || (e = e.replace(/&quot;/g, '"')), e = e.replace(/&amp;/g, "&") }; return htmlspecialchars_decode(sStr)
  497. },
  498. // 转义 html
  499. escape: function (html) {
  500. var exp = /[<"'>]|&(?=#[a-zA-Z0-9]+)/g;
  501. if (html === undefined || html === null) return '';
  502. html += '';
  503. if (!exp.test(html)) return html;
  504. return html.replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
  505. .replace(/</g, '&lt;').replace(/>/g, '&gt;')
  506. .replace(/'/g, '&#39;').replace(/"/g, '&quot;');
  507. },
  508. // 还原转义的 html
  509. unescape: function (html) {
  510. if (html === undefined || html === null) html = '';
  511. html += '';
  512. return html.replace(/\&amp;/g, '&')
  513. .replace(/\&lt;/g, '<').replace(/\&gt;/g, '>')
  514. .replace(/\&#39;/g, '\'').replace(/\&quot;/g, '"');
  515. },
  516. //base64还原
  517. base64_decode: function (n) {
  518. var r = function (n) { return decodeURIComponent(n.split("").map(function (n) { return "%" + ("00" + n.charCodeAt(0).toString(16)).slice(-2) }).join("")) }; if ("undefined" == typeof window) return new Buffer(n, "base64").toString("utf-8"); if (void 0 !== window.atob) return r(window.atob(n)); var e, t, o, i, d, f, a, c, u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", h = 0, w = 0, C = "", g = []; if (!n) return n; n += ""; do { i = u.indexOf(n.charAt(h++)), d = u.indexOf(n.charAt(h++)), f = u.indexOf(n.charAt(h++)), a = u.indexOf(n.charAt(h++)), c = i << 18 | d << 12 | f << 6 | a, e = c >> 16 & 255, t = c >> 8 & 255, o = 255 & c, g[w++] = 64 === f ? String.fromCharCode(e) : 64 === a ? String.fromCharCode(e, t) : String.fromCharCode(e, t, o) } while (h < n.length); return C = g.join(""), r(C.replace(/\0+$/, ""))
  519. },
  520. // base64编码
  521. base64_encode: function (e) {
  522. var r = function (e) { return encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, r) { return String.fromCharCode("0x" + r) }) }; if ("undefined" == typeof window) return new Buffer(e).toString("base64"); if (void 0 !== window.btoa) return window.btoa(r(e)); var n, t, o, i, a, c, d, f, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", u = 0, w = 0, A = "", l = []; if (!e) return e; e = r(e); do { n = e.charCodeAt(u++), t = e.charCodeAt(u++), o = e.charCodeAt(u++), f = n << 16 | t << 8 | o, i = f >> 18 & 63, a = f >> 12 & 63, c = f >> 6 & 63, d = 63 & f, l[w++] = h.charAt(i) + h.charAt(a) + h.charAt(c) + h.charAt(d) } while (u < e.length); A = l.join(""); var C = e.length % 3; return (C ? A.slice(0, C - 3) : A) + "===".slice(C || 3)
  523. },
  524. //字符串URL编码
  525. urlencode: function (e) {
  526. return e += "", encodeURIComponent(e).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/~/g, "%7E").replace(/%20/g, "+")
  527. },
  528. //字符串URL解码
  529. urldecode: function (e) {
  530. return decodeURIComponent((e + "").replace(/%(?![\da-f]{2})/gi, function () { return "%25" }).replace(/\+/g, "%20"))
  531. },
  532. //unicode解码表情中文
  533. unicode_decode: function (e) {
  534. return e = e.replace(/\\/g, "%"), unescape(e)
  535. },
  536. /**
  537. * @param 字符串
  538. * @param 是否中文也编码
  539. * @returns unicode编码中文表情
  540. */
  541. unicode_encode: function (n) {
  542. if (1 == (arguments.length > 1 && void 0 !== arguments[1] && arguments[1])) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") } var e = function (n) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") }, u = /[\ud800-\udbff][\udc00-\udfff]/g; return n = n.replace(u, function (n) { return 2 === n.length ? e(n) : n })
  543. },
  544. //获取url变量值
  545. get_params: function (c) {
  546. var e = c + "=", b = window.location.href, h = b.indexOf("?"), b = b.slice(h + 1), a = b.split("&"), d = 0, f = "", g = a.length; for (d = 0; d < g; d++) { var f = a[d]; if (f.indexOf(e) === 0) { return decodeURIComponent(f.slice(e.length).replace(/\+/g, "%20")) } } return null
  547. },
  548. /**
  549. * 可以不要参数
  550. * @param 最小
  551. * @param 最大
  552. * @returns 生成更好随机数
  553. */
  554. mt_rand: function (r, e) {
  555. var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else { if (1 === n) throw new Error("Warning: mt_rand() expects exactly 2 parameters, 1 given"); r = parseInt(r, 10), e = parseInt(e, 10) } return Math.floor(Math.random() * (e - r + 1)) + r
  556. },
  557. /**
  558. * 可以不要参数
  559. * @param 最小
  560. * @param 最大
  561. * @returns 生成随机数
  562. */
  563. rand: function (r, e) {
  564. var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else if (1 === n) throw new Error("Warning: rand() expects exactly 2 parameters, 1 given"); return Math.floor(Math.random() * (e - r + 1)) + r
  565. },
  566. /**
  567. *strcut("我爱中国人",4,"...")
  568. * @param 字符串
  569. * @param 长度中文汉字算两个
  570. * @param 显示符号
  571. * @returns 字符串截取
  572. */
  573. strcut: function (str, iMaxBytes, sSuffix) {
  574. if (isNaN(iMaxBytes)) { return str } if (strlen(str) <= iMaxBytes) { return str } var i = 0, bytes = 0; for (; i < str.length && bytes < iMaxBytes; ++i, ++bytes) { if (str.charCodeAt(i) > 255) { ++bytes } } sSuffix = sSuffix || ""; return (bytes - iMaxBytes == 1 ? str.substr(0, i - 1) : str.substr(0, i)) + sSuffix
  575. },
  576. /**
  577. * @param 字符串
  578. * @param 子字符串
  579. * @returns 查找字符串
  580. */
  581. strfind: function (string, find) {
  582. return !(string.indexOf(find) === -1)
  583. },
  584. //判断是否数字
  585. is_num: function (num) {
  586. var reg = new RegExp("^[0-9]*$"); return reg.test(num)
  587. },
  588. //判断是否手机号
  589. is_mobile: function (num) {
  590. var reg = /^1\d{10}$/; return reg.test(num)
  591. },
  592. //判断是否QQ
  593. is_qq: function (num) {
  594. var reg = /^[1-utf8_decode]{1}\d{4,11}$/; return reg.test(num)
  595. },
  596. //判断是否邮箱
  597. is_email: function (str) {
  598. var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; return reg.test(str)
  599. },
  600. //判断是否中文
  601. is_chinese: function (num) {
  602. var reg = /[\u4e00-\u9fa5]/g; return reg.test(num)
  603. },
  604. //判断是否符合注册用户名(数字字母组成,下划钱字母开头)
  605. is_reg: function (num) {
  606. var reg = /^([a-zA-z_]{1})([\w]*)$/g; return reg.test(num)
  607. },
  608. //判断是否电话
  609. is_tel: function (str) {
  610. var reg = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; return reg.test(str)
  611. },
  612. //判断是否是IP
  613. is_ip: function (strIP) {
  614. if (isNull(strIP)) { return false } var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g; if (re.test(strIP)) { if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) { return true } } return false
  615. },
  616. //判断是否邮编
  617. is_zipcode: function (str) {
  618. var reg = /^(\d){6}$/; return reg.test(str)
  619. },
  620. //判断是否英文
  621. is_english: function (str) {
  622. var reg = /^[A-Za-z]+$/; return reg.test(str)
  623. },
  624. //判断是否是URL
  625. is_url: function (url) {
  626. var strRegex = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/; var re = new RegExp(strRegex); return re.test(url);
  627. },
  628. //判断是否http
  629. is_http: function (url) {
  630. if (url.indexOf("http://") === -1 && url.indexOf("https://") === -1) { return false } return true
  631. },
  632. //判断是否金额
  633. is_money: function (n) {
  634. return !!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(n)
  635. },
  636. //是否是银行卡号
  637. is_CardNumber: function (num) {
  638. return num.toString().replace(/\s/g, '').replace(/(.{4})/g, "$1 ");
  639. },
  640. //是否是身份证号
  641. is_IDCard: function (idcode) {
  642. var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  643. var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2', 'x'];
  644. var code = idcode + "";
  645. var last = idcode[17];//最后一位
  646. var seventeen = code.substring(0, 17);
  647. var arr = seventeen.split("");
  648. var len = arr.length;
  649. var num = 0;
  650. for (var i = 0; i < len; i++) {
  651. num = num + arr[i] * weight_factor[i];
  652. }
  653. var resisue = num % 11;
  654. var last_no = check_code[resisue];
  655. var idcard_patter = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
  656. var format = idcard_patter.test(idcode);
  657. return last === last_no && format;
  658. },
  659. /**
  660. *
  661. * @param 整数
  662. * @param 最小
  663. * @param 最大
  664. * @returns 判断是否在两个整数内
  665. */
  666. in_int: function (n, iMin, iMax) {
  667. if (!isFinite(n)) { return false } if (!/^[+-]?\d+$/.test(n)) { return false } if (iMin != undefined && parseInt(n) < parseInt(iMin)) { return false } if (iMax != undefined && parseInt(n) > parseInt(iMax)) { return false } return true
  668. },
  669. /**
  670. *
  671. * @param 浮点数
  672. * @param 最小
  673. * @param 最大
  674. * @returns 判断是否在两个浮点数之内
  675. */
  676. in_float: function (n, fMin, fMax) {
  677. if (!isFinite(n)) { return false } if (fMin != undefined && parseFloat(n) < parseFloat(fMin)) { return false } if (fMax != undefined && parseFloat(n) > parseFloat(fMax)) { return false } return true
  678. },
  679. /**
  680. *number_format('150.456', 2, '.', ',')
  681. * @param 数字
  682. * @param 保留小数位数
  683. * @param 小数点显示符号
  684. * @param 千分位符号
  685. * @returns 格式化数字
  686. */
  687. number_format: function (e, n, t, i) {
  688. e = (e + "").replace(/[^0-9+\-Ee.]/g, ""); var r = isFinite(+e) ? +e : 0, o = isFinite(+n) ? Math.abs(n) : 0, a = void 0 === i ? "," : i, d = void 0 === t ? "." : t, u = ""; return u = (o ? function (e, n) { if (-1 === ("" + e).indexOf("e")) return +(Math.round(e + "e+" + n) + "e-" + n); var t = ("" + e).split("e"), i = ""; return +t[1] + n > 0 && (i = "+"), (+(Math.round(+t[0] + "e" + i + (+t[1] + n)) + "e-" + n)).toFixed(n) }(r, o).toString() : "" + Math.round(r)).split("."), u[0].length > 3 && (u[0] = u[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, a)), (u[1] || "").length < o && (u[1] = u[1] || "", u[1] += new Array(o - u[1].length + 1).join("0")), u.join(d)
  689. },
  690. // 数字前置补零
  691. digit: function (num, length) {
  692. var str = '';
  693. num = String(num);
  694. length = length || 2;
  695. for (var i = num.length; i < length; i++) {
  696. str += '0';
  697. }
  698. return num < Math.pow(10, length) ? str + (num | 0) : num;
  699. },
  700. /**
  701. * 金额数字转大写
  702. * @param num number
  703. * @return {string}
  704. */
  705. upDigit: function (num, is_head = false) {
  706. var fraction = ['角', '分', '厘'];
  707. var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  708. var unit = [
  709. ['元', '万', '亿'],
  710. ['', '拾', '佰', '仟']
  711. ];
  712. var head = num < 0 ? '欠人民币' : '人民币';
  713. num = Math.abs(num);
  714. var s = '', i;
  715. for (i = 0; i < fraction.length; i++) {
  716. s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
  717. }
  718. s = s || '整';
  719. num = Math.floor(num);
  720. for (i = 0; i < unit[0].length && num > 0; i++) {
  721. var p = '';
  722. for (var j = 0; j < unit[1].length && num > 0; j++) {
  723. p = digit[num % 10] + unit[1][j] + p;
  724. num = Math.floor(num / 10);
  725. }
  726. s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
  727. }
  728. if (is_head == true) {
  729. return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
  730. }
  731. else {
  732. return s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
  733. }
  734. },
  735. //隐藏银行号码
  736. hidebank: function (s = "6217995510035399947") {
  737. return s.replace(/^(\d{8})\d+(\d{4})$/, "$1*******$2");
  738. },
  739. // 隐藏手机号中间四位
  740. hidemobile: function (s = "18291447788") {
  741. return s.replace(/^(\d{3})\d+(\d{4})$/, "$1****$2");
  742. },
  743. /**
  744. *
  745. * @param css代码
  746. * @returns 添加css代码
  747. */
  748. addcss: function (e) {
  749. var t = document.createElement("style"), d = document.head || document.getElementsByTagName("head")[0]; if (t.type = "text/css", t.styleSheet) { var a = function () { try { t.styleSheet.cssText = e } catch (e) { } }; t.styleSheet.disabled ? setTimeout(a, 10) : a() } else { var s = document.createTextNode(e); t.appendChild(s) } d.appendChild(t)
  750. },
  751. /**
  752. * @param js代码
  753. * @returns 添加js代码
  754. */
  755. addjs: function (t) {
  756. var e = document.createElement("script"); e.type = "text/javascript"; try { e.appendChild(document.createTextNode(t)) } catch (d) { e.text = t } document.head.appendChild(e)
  757. },
  758. /**
  759. *
  760. * @param js文件路径
  761. * @param 回调函数
  762. * @returns 加载js支持回调
  763. */
  764. loadjs: function (e, a) {
  765. var t = document.createElement("script"); t.src = e, t.onload = function () { var e = t.readyState && "complete" != t.readyState && "loaded" != t.readyState; a && a(!e) }, document.head.appendChild(t)
  766. },
  767. /**
  768. *
  769. * @param css路径
  770. * @param 回调函数
  771. * @returns 加载css支持回调
  772. */
  773. loadcss: function (e, n) {
  774. var t = document.createElement("link"); t.rel = "stylesheet", t.type = "text/css", t.onerror = function () { n(!1) }, t.onload = function () { n(!0) }, t.href = e, document.head.appendChild(t)
  775. },
  776. //获取当前域名主机
  777. gethost: function () {
  778. return window.location.protocol + "//" + window.location.host;
  779. },
  780. /**
  781. * 由经纬度计算两点之间的距离
  782. * @param latlngFirst
  783. * @param latlngLast
  784. * @return {string}
  785. */
  786. distance: function (latlngFirst, latlngLast) {
  787. var La1 = latlngFirst.lat * Math.PI / 180.0;
  788. var La2 = latlngLast.lat * Math.PI / 180.0;
  789. var La3 = La1 - La2;
  790. var Lb3 = latlngFirst.lng * Math.PI / 180.0 - latlngLast.lng * Math.PI / 180.0;
  791. var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2)));
  792. dis = dis * 6378.137;
  793. dis = Math.round(dis * 10000) / 10000;
  794. return dis.toFixed(2);
  795. },
  796. /**
  797. * 设置cookie
  798. * @param name
  799. * @param value
  800. * @param iDay
  801. */
  802. setCookie: function (name, value, iDay) {
  803. var oDate = new Date();
  804. oDate.setDate(oDate.getDate() + iDay);
  805. document.cookie = name + '=' + value + ';expires=' + oDate;
  806. },
  807. /**
  808. * 获取cookie
  809. * @param name
  810. * @return {string}
  811. */
  812. getCookie: function (name) {
  813. var arr = document.cookie.split('; ');
  814. for (var i = 0; i < arr.length; i++) {
  815. var arr2 = arr[i].split('=');
  816. if (arr2[0] == name) {
  817. return arr2[1];
  818. }
  819. }
  820. return '';
  821. },
  822. /**
  823. * 删除Cookie
  824. * @param name
  825. */
  826. removeCookie: function (name) {
  827. this.setCookie(name, 1, -1);
  828. },
  829. /**
  830. * 运算百分制
  831. * @param thisNum
  832. * @param totalNum
  833. * @return {number}
  834. */
  835. computeProgres: function (thisNum, totalNum) {
  836. var num = parseFloat(thisNum) || 0.00, total = parseFloat(totalNum) || 0.00;
  837. return Math.round(num / total * 10000) / 100;
  838. },
  839. /**
  840. * 生成随着大小写token
  841. * @param length 长度,默认32
  842. * @return {string}
  843. */
  844. token: function (length) {
  845. length = length || 32;
  846. var char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  847. var result = '';
  848. for (var i = 0; i < length; i++) {
  849. result += char.charAt(Math.floor(Math.random() * char.length));
  850. }
  851. return result;
  852. }
  853. };
  854. $('body').on('click', '.link-a', function () {
  855. let url = $(this).data('href');
  856. if (url && url !== '') {
  857. window.location.replace(url);
  858. }
  859. return false;
  860. });
  861. // 输出接口
  862. exports('tool', tool);
  863. });