common.js 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683
  1. var userAgent = navigator.userAgent;
  2. var BROWSER_TYPE = "";
  3. if (userAgent.match(/MicroMessenger/i)) {
  4. BROWSER_TYPE = "wechat";
  5. } else if (userAgent.match(/Alipay/i)) {
  6. BROWSER_TYPE = "alipay";
  7. } else {
  8. //测试页面暂不做限制
  9. if (isTest()) {
  10. } else {
  11. alert("已禁止本次访问:您必须使用微信或支付宝访问本页面!");
  12. var opened = window.open("about:blank", "_self");
  13. opened.opener = null;
  14. opened.close();
  15. }
  16. }
  17. var ua = navigator.userAgent.toLowerCase()
  18. if (/android/i.test(ua)) {
  19. window.OS_TYPE = 'Android'
  20. } else if (/(iphone|ipad|ipod|ios)/i.test(ua)) {
  21. window.OS_TYPE = 'IOS'
  22. } else if (/Windows/i.test(ua)) {
  23. window.OS_TYPE = 'WinPhone'
  24. } else {
  25. window.OS_TYPE = 'Unknown'
  26. }
  27. function setTheme() {
  28. var theme = "";
  29. // 如果是终端用户,则根据浏览器来配置
  30. if (location.pathname.indexOf('/pages') == 0) {
  31. if (BROWSER_TYPE == "wechat") {
  32. theme = "theme-green";
  33. } else if (BROWSER_TYPE == "alipay") {
  34. theme = "theme-alipay";
  35. }
  36. } else {
  37. // 如果是代理商、经销商、测试系统,则用cookied 皮肤配置
  38. theme = getCookie("theme_name") || "theme-alipay";
  39. }
  40. $("html").addClass(theme);
  41. }
  42. setTheme();
  43. //判断是否为测试环境
  44. function isTest(no5tao) {
  45. if (no5tao) {
  46. return location.port != '8000' && (location.host.indexOf("127.0.0.1") > -1 || location.host.indexOf("localhost") > -1 || location.host.indexOf("192.168.") > -1);
  47. } else {
  48. return location.port != '8000' && (location.host.indexOf("127.0.0.1") > -1 || location.host.indexOf("localhost") > -1 || location.host.indexOf("192.168.") > -1 || location.host.indexOf("5tao5ai.com") > -1);
  49. }
  50. }
  51. //rem模式
  52. function remModel() {
  53. (function (doc, win) {
  54. var docEl = doc.documentElement,
  55. resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
  56. isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
  57. recalc = function () {
  58. var clientWidth = docEl.clientWidth;
  59. var clientHeight = docEl.clientHeight;
  60. if (!clientWidth) return;
  61. if (clientWidth >= 750) {
  62. clientWidth = 750
  63. }
  64. docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
  65. docEl.dataset.percent = 100 * (clientWidth / 750)
  66. };
  67. recalc();
  68. if (!doc.addEventListener) return;
  69. win.addEventListener(resizeEvt, recalc, false);
  70. })(document, window);
  71. }
  72. if ($("html").hasClass("remModel")) {
  73. remModel();
  74. }
  75. $(function () {
  76. //测试模式菜单,依赖jQuery,没有mui的css也能显示,只是不好看
  77. if (isTest()) {
  78. var fadeTimer = null
  79. function fadeNode() {
  80. fadeTimer = setTimeout(function () {
  81. testHomeBtn.addClass('fade');
  82. }, 1500);
  83. }
  84. function showNode() {
  85. clearTimeout(fadeTimer)
  86. testHomeBtn.removeClass('fade');
  87. }
  88. function setCss(x, y) {
  89. if (x !== undefined) {
  90. $("#testHomeBtn").css({
  91. 'left': x + 'px',
  92. 'top': y + 'px'
  93. });
  94. }
  95. }
  96. function bindCellClick(cell, url) {
  97. cell.on('click', function () {
  98. if ($('#testHomePort:checked').length === 1 && url.indexOf('#/') > -1) {
  99. url = location.origin + ':8080' + url
  100. }
  101. location.href = url
  102. })
  103. }
  104. function initPanel() {
  105. var list = [
  106. {
  107. "name": "经销商-VUE",
  108. "menu": [
  109. {name: '经营明细', url: '/dealer/index.html#/dealer/billList'},
  110. {name: '订单查询', url: '/dealer/index.html#/order/list'},
  111. {name: '告警管理', url: '/dealer/index.html#/alarm/list'},
  112. {name: '用户审核', url: '/dealer/index.html#/user/identify'},
  113. {name: '虚拟卡券', url: '/dealer/index.html#/dealer/cardCenter/cardTicketList'},
  114. {name: '子账号管理', url: '/dealer/index.html#/subAccount'},
  115. {name: '我的消息', url: '/dealer/index.html#/news/list'},
  116. {name: '导出报表', url: '/dealer/index.html#/export/exportList'},
  117. {name: '用户管理', url: '/dealer/index.html#/user/list'},
  118. {name: '设备信号', url: '/dealer/index.html#/signal/chart'},
  119. {name: '24小时电价', url: '/dealer/index.html#/device/elcPrice24'},
  120. {name: '设备格子配置', url: '/dealer/index.html#/deviceGrid/gridList'},
  121. {name: '从机配置', url: '/dealer/index.html#/device/slaveList'},
  122. {name: '库存管理', url: '/dealer/index.html#/stock/stockList'},
  123. {name: '商品种类管理', url: '/dealer/index.html#/goods/goodsList'},
  124. {name: '加盟管理', url: '/dealer/index.html#/join/main'},
  125. {name: '电费配置', url: '/dealer/index.html#/elecFee/list'},
  126. ]
  127. },
  128. {
  129. name: "用户-VUE",
  130. menu: [
  131. {name: '用户套餐', url: '/user/index.html#/dev?logicalCode=1'},
  132. {name: '用户个人中心', url: '/user/index.html#/user/me'},
  133. {name: '用户地图', url: '/user/index.html#/user/map'},
  134. ]
  135. },
  136. {
  137. "name": "经销商",
  138. "menu": [
  139. {name: '主页', url: '/app/index.html'},
  140. ]
  141. },
  142. {
  143. "name": "代理商",
  144. "menu": [
  145. {name: '主页', url: '/agents/index.html'},
  146. ]
  147. },
  148. {
  149. "name": "测试",
  150. "menu": [
  151. {name: '主页', url: '/test/index.html'},
  152. ]
  153. },
  154. ]
  155. var testHomePort = localStorage.getItem('testHomePort')
  156. var testHomePanel = $('<div id="testHomePanel" class="edit-back edit-bottom"><div class="edit-content mui-content"><div class="mui-content-padded c-black text-center">页面测试导航</div>' +
  157. '<ul class="mui-table-view first-menu"> <li class="mui-table-view-cell">' +
  158. ' <label for="testHomePort" style="width: 100%;display: block">VUE端口 ' +
  159. ' <input id="testHomePort" ' + (testHomePort === '8080' ? ' checked ' : '') +
  160. ' type="checkbox" class="margin-l-10"> 8080 </label>' +
  161. ' </li>' +
  162. '</ul>' +
  163. '</div></div>')
  164. function appendLink(pDom, item) {
  165. var cell = $('<li class="mui-table-view-cell"><div class="mui-navigate-right"><em>' + item.name + '</em><span class="mui-pull-right custom-right"></span></div></li>')
  166. pDom.append(cell)
  167. bindCellClick(cell, item.url)
  168. }
  169. for (var index in list) {
  170. var item = list[index]
  171. var menu = item.menu
  172. var name = item.name
  173. if (menu) {
  174. var groupHtml = $(`
  175. <li class="mui-table-view-cell mui-collapse ">
  176. <a class="mui-navigate-right"><span>${name}</span></a>
  177. <div class="mui-collapse-content">
  178. <ul class="mui-table-view second-menu" style="margin-top: -8px;">
  179. </ul>
  180. </div>
  181. </li>
  182. `);
  183. testHomePanel.find('.first-menu').append(groupHtml)
  184. for (var index2 in menu) {
  185. var item2 = menu[index2]
  186. appendLink(groupHtml.find('.second-menu'), item2)
  187. }
  188. } else {
  189. appendLink(testHomePanel.find('.first-menu'), item)
  190. }
  191. }
  192. $('body').append(testHomePanel)
  193. $('#testHomePanel').on('click', function (evt) {
  194. if ($(evt.target).closest('.edit-content').length === 0) {
  195. $('#testHomePanel').hide();
  196. }
  197. });
  198. $('#testHomePort').on('change', function (evt) {
  199. localStorage.setItem('testHomePort', this.checked ? '8080' : '')
  200. });
  201. }
  202. function showPanel() {
  203. var testHomePanel = $('#testHomePanel')
  204. if (testHomePanel.length === 0) {
  205. initPanel()
  206. }
  207. testHomePanel.show();
  208. }
  209. var testHomeBtn = $('<div id="testHomeBtn"></div>');
  210. $("body").prepend(testHomeBtn);
  211. $('#testHomeBtn').on('touchmove', function (e) {
  212. // 阻止其他事件
  213. e.preventDefault();
  214. // 判断手指数量
  215. if (e.originalEvent.targetTouches.length === 1) {
  216. var maxW = $(window).width()
  217. var maxH = $(window).height()
  218. // 将元素放在滑动位置
  219. var touch = e.originalEvent.targetTouches[0];
  220. var x = touch.clientX > 0 ? touch.clientX : 0
  221. var y = touch.clientY > 0 ? touch.clientY : 0
  222. x = x > maxW ? maxW : x
  223. y = y > maxH ? maxH : y
  224. setCss(x, y)
  225. localStorage.setItem('testHomeBtn_x', x)
  226. localStorage.setItem('testHomeBtn_y', y)
  227. }
  228. }).on('touchend', function (e) {
  229. fadeNode()
  230. }).on('touchstart', function (e) {
  231. showNode()
  232. }).on('click', function (e) {
  233. showPanel()
  234. });
  235. fadeNode()
  236. setCss(localStorage.getItem('testHomeBtn_x'), localStorage.getItem('testHomeBtn_y'))
  237. }
  238. });
  239. //Cookie常量
  240. var Cookie_Constant = {
  241. //用户头像,或是代理商定义的logo作为用户头像
  242. userHeadImg: "userHeadImg",
  243. agentLogoUrl: "agentLogoUrl",
  244. agentBrandName: "agentBrandName",
  245. };
  246. //初始化设置所有页面的LOGO
  247. $(function () {
  248. var dom = $('<link type="favicon" rel="shortcut icon" type="image/x-icon" href="favicon.ico" />');
  249. dom.attr("href", getCookie(Cookie_Constant.agentLogoUrl) || "/favicon.ico");
  250. $("html head").append(dom);
  251. var titleDom = $("title");
  252. if (titleDom.hasClass("readonly")) {
  253. return;
  254. }
  255. var oldTitle = titleDom.text();
  256. var name = getCookie(Cookie_Constant.agentBrandName) || "";
  257. var title = name + (name && oldTitle ? "-" : "") + oldTitle;
  258. titleDom.text(title);
  259. });
  260. function getCookie(c_name) {
  261. if ($.cookie) {
  262. return $.cookie(c_name);
  263. } else {
  264. return null
  265. }
  266. }
  267. function setCookie(c_name, value, option) {
  268. if ($.cookie) {
  269. $.cookie(c_name, value, option);
  270. }
  271. }
  272. function clearCookie(name) {
  273. $.cookie(name, null);
  274. }
  275. function getQueryString(name) {
  276. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  277. var r = window.location.search.substr(1).match(reg);
  278. if (r != null)
  279. return decodeURI(r[2]);
  280. return null;
  281. }
  282. function getQueryStringByUrl(url, name) {
  283. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  284. url = url.substring(url.indexOf('?') || 0, url.length)
  285. var r = url.substr(1).match(reg);
  286. if (r != null)
  287. return decodeURI(r[2]);
  288. return null;
  289. }
  290. // exp 单位是毫秒
  291. function setLocalStorage(key, value, exp) {
  292. var curTime = new Date().getTime();
  293. exp = exp || (1000 * 3600 * 24 * 30);//默认30天
  294. localStorage.setItem(key, JSON.stringify({data: value, expTime: curTime + exp}));
  295. }
  296. function getLocalStorage(key) {
  297. var curTime = new Date().getTime();
  298. var data = localStorage.getItem(key);
  299. if (data) {
  300. var dataObj = JSON.parse(data);
  301. if (curTime > dataObj.expTime) {
  302. // 信息过期
  303. return null;
  304. } else {
  305. var dataObjDatatoJson = dataObj.data;
  306. return dataObjDatatoJson;
  307. }
  308. }
  309. }
  310. // exp 单位是毫秒
  311. function setSessionStorage(key, value, exp) {
  312. var curTime = new Date().getTime();
  313. exp = exp || (1000 * 3600 * 24 * 30);//默认30天
  314. sessionStorage.setItem(key, JSON.stringify({data: value, expTime: curTime + exp}));
  315. }
  316. function getSessionStorage(key) {
  317. var curTime = new Date().getTime();
  318. var data = sessionStorage.getItem(key);
  319. if (data) {
  320. var dataObj = JSON.parse(data);
  321. if (curTime > dataObj.expTime) {
  322. // 信息过期
  323. return null;
  324. } else {
  325. var dataObjDatatoJson = dataObj.data;
  326. return dataObjDatatoJson;
  327. }
  328. }
  329. }
  330. //展示通知消息
  331. function showNotification(id, text) {
  332. if (localStorage.Notification != id) {
  333. var html = $('<div class="notification"> <span class="notification-text"></span></div>');
  334. $("body").prepend(html);
  335. html.find(".notification-text").text(text);
  336. html.click(function () {
  337. var that = this;
  338. msgPopup('温馨提示', text, "确定", function (e) {
  339. localStorage.Notification = id;
  340. $(that).remove();
  341. });
  342. });
  343. }
  344. }
  345. //测试系统提示,避免让用户产生误解
  346. function showTestInfo() {
  347. if (isTest()) {
  348. var html = $('<div class="notification"> <span class="notification-text shine-text shine-white-red">当前为测试系统,所有数据都是模拟数据!!!</span></div>');
  349. $("body").prepend(html);
  350. html.click(function () {
  351. var that = this;
  352. msgPopup('温馨提示', "当前为测试系统!您可以通过公众号【微付乐管理后台】登录正式系统,谢谢。", "确定", function (e) {
  353. $(that).remove();
  354. });
  355. });
  356. setTimeout(function () {
  357. html.fadeOut(2000);
  358. }, 1000);
  359. }
  360. }
  361. function get_token_session_key(auth_domain) {
  362. return auth_domain + "_session_id";
  363. }
  364. function get_token_headers(auth_domain) {
  365. var token = localStorage.getItem(get_token_session_key(auth_domain)) || "";
  366. return {
  367. 'jwt-auth-domain': auth_domain,
  368. 'jwt-token': token
  369. };
  370. }
  371. //原ajax封装
  372. function myAjax(option) {
  373. //测试用模拟数据,本地局域网调试
  374. if (isTest(true)) {
  375. option.url = "/mock" + option.url;
  376. } else {
  377. option.url = "" + option.url;
  378. }
  379. var type = option.type;
  380. var data = option.data;
  381. var maskText = option.mask;
  382. if (!option.dataType) {
  383. option.dataType = 'json';//后台服务器返回数据类型,全为json
  384. }
  385. //默认超时时间设置
  386. if (!option.timeout) {
  387. option.timeout = 60000;//设置超时时间45秒,后台设备通讯的超时时间保持一致
  388. }
  389. var mask = null;
  390. //利用mask防止post操作重复执行
  391. //如果mask特意配置成false,则不展示
  392. if (maskText != false) {
  393. if ((type && type.toUpperCase() == "POST") || maskText != null) {
  394. //mask倒计时,超时时间为准
  395. var timeout = Math.round(option.timeout / 1000);
  396. mask = initMaskInterval(timeout, option.maskDelay, option.maskContainer, maskText);
  397. }
  398. }
  399. //get请求加参数,避免缓存
  400. if (type.toUpperCase() == "GET") {
  401. if (data == null) {
  402. option.data = data = {};
  403. }
  404. if (typeof data !== "object") {
  405. console.warn('不推荐的参数格式', data)
  406. }
  407. if (data.random === null && option.url.indexOf("random=") == -1) {
  408. data.random = Math.random() * 1000;
  409. }
  410. }
  411. //数据内容适配,
  412. var successHand = option.success;
  413. var errorHand = option.error;
  414. var completeHand = option.complete;
  415. if (successHand) {
  416. option.success = function (response) {
  417. //后台可能传data、para、payload,三者兼容
  418. if (response) {
  419. if (response.payload) {
  420. response.para = response.payload;
  421. response.data = response.payload;
  422. }
  423. }
  424. successHand(response);
  425. }
  426. }
  427. if (errorHand) {
  428. option.error = function (response) {
  429. //后台可能传data、para、payload,三者兼容
  430. if (response) {
  431. if (response.payload) {
  432. response.para = response.payload;
  433. response.data = response.payload;
  434. }
  435. }
  436. errorHand(response);
  437. }
  438. }
  439. option.complete = function (response) {
  440. //后台可能传data、para、payload,三者兼容
  441. if (response) {
  442. if (response.payload) {
  443. response.para = response.payload;
  444. response.data = response.payload;
  445. }
  446. }
  447. //清除mask
  448. if (mask) {
  449. mask.remove();
  450. mask = null;
  451. }
  452. if (completeHand) {
  453. completeHand(response);
  454. }
  455. };
  456. $.ajax(option);
  457. }
  458. function initMaskInterval(timeout, maskDelay, maskContainer, msg) {
  459. if (msg == null) {
  460. msg = "";
  461. }
  462. var mask = new Mask({text: msg, container: maskContainer});
  463. mask.show();
  464. var maskInter = setInterval(function () {
  465. timeout = timeout - 1;
  466. var newMsg = msg + " " + timeout;
  467. if (!mask.dom) {
  468. clearInterval(maskInter);
  469. maskInter = null;
  470. return;
  471. }
  472. if (timeout > 0) {
  473. mask.text(newMsg);
  474. } else {
  475. mask.text("<div class='mask-callback' style='padding: 4px'>" +
  476. "<div class='iconfont '>o(╥﹏╥)o 出了点小问题,点此处关闭......</div><div></div>" +
  477. "</div>");
  478. mask.dark();
  479. mask.dom.find(".mask-callback").click(function () {
  480. mask.remove();
  481. mask = null;
  482. });
  483. clearInterval(maskInter);
  484. maskInter = null;
  485. }
  486. }, maskDelay || 1000);
  487. return mask;
  488. }
  489. //jQuery请求公共方法
  490. function sendRequest(url, type, data, success, contentType, async, complete) {
  491. //可能直接传递option
  492. var optionIn = {};
  493. var mask = null;
  494. var maskContainer = null;
  495. var maskDelay = null;
  496. var headers = null;
  497. if ($.isPlainObject(url)) {
  498. optionIn = url;
  499. url = optionIn.url;
  500. type = optionIn.type;
  501. data = optionIn.data;
  502. headers = optionIn.headers;
  503. success = optionIn.success;
  504. contentType = optionIn.contentType;
  505. async = optionIn.async;
  506. complete = optionIn.complete
  507. mask = optionIn.mask;
  508. maskContainer = optionIn.maskContainer;
  509. maskDelay = optionIn.maskDelay;
  510. }
  511. var options = {
  512. url: url,
  513. type: type,
  514. mask: mask,
  515. headers: headers,
  516. maskDelay: maskDelay,
  517. maskContainer: maskContainer,
  518. success: function (result) {
  519. if (success) {
  520. success(result);
  521. }
  522. },
  523. dataType: 'json',//服务器返回数据类型
  524. timeout: optionIn.timeout || 60000,
  525. error: function (xhr) {
  526. if (xhr.status == 401) {
  527. window.mui && mui.toast('登录超时,即将跳转到登录页面...');
  528. setTimeout(function () {
  529. var url = 'login.html';
  530. goPage(url);
  531. }, 1500)
  532. } else {
  533. if (optionIn.error) {
  534. optionIn.error(xhr)
  535. } else {
  536. var title = "温馨提示";
  537. var msg = '获取数据失败,请检查网络';
  538. var btnword = '我知道了';
  539. msgPopup(title, msg, btnword);
  540. }
  541. }
  542. },
  543. complete: function (result) {
  544. if (complete) {
  545. complete(result);//目前主要用于$("#progress").hide();
  546. }
  547. }
  548. };
  549. if (data) {
  550. if ((type.toUpperCase() == 'PUT' || type.toUpperCase() == 'POST') && contentType == "json" && $.isPlainObject(data)) {
  551. options.data = JSON.stringify(data);
  552. options.contentType = 'application/json';//发送给后台的数据类型
  553. } else {
  554. options.data = data;
  555. }
  556. }
  557. if (typeof async != 'undefined') {
  558. options.async = async;
  559. }
  560. myAjax(options);
  561. }
  562. //带版本号的页面调整
  563. function goPage(url, para) {
  564. if (!url || url.indexOf("#") == 0 || url.indexOf("javascript:") > -1 || url.indexOf("tel:") > -1) {
  565. return;
  566. }
  567. url = getVersionUrl(url, para);
  568. location.href = url;
  569. }
  570. //获得APP版本号
  571. function getAppVersion() {
  572. var today = new Date();
  573. var v = "" + today.getFullYear() + (today.getMonth() + 1) + today.getDay();//默认天为版本号
  574. if (window.APP_VERSION) {
  575. v = window.APP_VERSION;
  576. }
  577. return v;
  578. }
  579. //获取带版本号的url
  580. function getVersionUrl(url, para) {
  581. function addParam(_url, _para) {
  582. for (var key in _para) {
  583. var con = "?";
  584. if (_url.indexOf("?") > 0) {
  585. con = "&";
  586. }
  587. var value = _para[key];
  588. _url = _url + con + key + "=" + encodeURIComponent(value);
  589. }
  590. return _url
  591. }
  592. // 如果含有vue的跳转页面,版本号需要加到html后
  593. var maodian = url.indexOf('#')
  594. var mainUrl = url
  595. var maoUrl = ''
  596. var version = ''
  597. //判断参数是否有自定义的v字段,有的话不加版本
  598. if (para && para.v != null) {
  599. //nothing
  600. } else {
  601. //判断url中是否有v字段,没有v字段则加上版本号
  602. if (url && url.indexOf("?v=") == -1 && url.indexOf("&v=") == -1) {
  603. version = getAppVersion();
  604. }
  605. }
  606. // 如果是vue页面
  607. if (maodian > -1) {
  608. // 拆分路径,一个是html主路径,一个是路由路径
  609. mainUrl = url.substring(0, maodian);
  610. maoUrl = url.substring(maodian);
  611. //增加一个版本号
  612. var urlHead = addParam(mainUrl, {v: version})
  613. //增加路由参数
  614. var urlSub = addParam(maoUrl, para)
  615. return urlHead + urlSub
  616. } else {
  617. return addParam(mainUrl, $.extend({v: version}, para))
  618. }
  619. }
  620. //不产生历史记录的方式跳转,改善返回操作的体验,某些二级页面中包含子模块不需要产生历史记录
  621. function replacePage(url, para) {
  622. history.replaceState(null, null, window.getVersionUrl(url, para));
  623. location.reload();
  624. }
  625. //a标签的html跳转加版本号
  626. $(function () {
  627. //不用mui绑定tap和click事件,mui绑定后各种BUG
  628. $('body').on('tap', 'a[href*=".html"]', function (event) {
  629. console.log("%c jquery tap a", "color:#1ad618;font-weight:bold;");
  630. var href = this.getAttribute("href");
  631. //如果不为空、不是锚点、不是tel和javascript,阻止浏览器的默认跳转,进行自定义跳转
  632. if (href != "") {
  633. event.preventDefault();
  634. goPage(href);
  635. } else {
  636. return true;
  637. }
  638. });
  639. });
  640. function uplog(data) {
  641. return
  642. }
  643. window.onerror = function (errorMessage, scriptURI, lineNumber, columnNumber, errorObj) {
  644. var info = "【错误信息】:" + errorMessage +
  645. " 【出错文件】:" + scriptURI +
  646. " 【出错行号】:" + lineNumber +
  647. " 【出错列号】:" + columnNumber +
  648. " 【错误详情】:" + (errorObj ? errorObj.toString() : "");
  649. uplog && uplog({level: "error", short_message: "js错误", full_message: info});
  650. }
  651. //loading
  652. function showLoading(text) {
  653. var mask = new Mask(text);
  654. mask.show();
  655. }
  656. //隐藏“加载中”
  657. function hideLoading() {
  658. $(".load-mask").remove();
  659. }
  660. //文本过长用...代替
  661. function wordlimit(str, wordlength) {
  662. if (!str) {
  663. return "";
  664. }
  665. var nowLength = str.length;
  666. var wordStr = "";
  667. if (nowLength > wordlength) {
  668. wordStr = str.substr(0, wordlength) + '...';
  669. } else {
  670. wordStr = str;
  671. }
  672. return wordStr;
  673. }
  674. //动画遮盖层
  675. function Mask(text) {
  676. //可能直接传递option
  677. var optionIn = {};
  678. var performance = false;
  679. var container = null;
  680. if ($.isPlainObject(text)) {
  681. optionIn = text;
  682. performance = optionIn.performance;//某些场景不要有动画,否则性能问题
  683. text = optionIn.text;
  684. container = optionIn.container;
  685. }
  686. var dom = $('<div class="load-mask"><div class="loader-inner ' + (performance ? '' : 'ball-pulse') + '"><div></div><div></div><div></div><span class="load-text"></span></div></div>');
  687. this.container = container;
  688. this.dom = dom;
  689. if (text != null) {
  690. dom.find(".load-text").html(text);
  691. }
  692. if (container) {
  693. dom.addClass('absolute')
  694. }
  695. }
  696. Mask.prototype.show = function (quickly) {
  697. var dom = this.dom;
  698. var container = this.container;
  699. if (container) {
  700. $(container).append(dom)
  701. } else {
  702. $("body").append(dom);
  703. }
  704. if (quickly) {
  705. dom.addClass("active");
  706. } else {
  707. setTimeout(function () {
  708. dom.addClass("active");
  709. }, 400);
  710. }
  711. return this;
  712. };
  713. Mask.prototype.hide = function () {
  714. this.dom.hide();
  715. return this;
  716. };
  717. Mask.prototype.dark = function () {
  718. this.dom.addClass("dark");
  719. return this;
  720. };
  721. Mask.prototype.text = function (text) {
  722. if (text != null) {
  723. this.dom.find(".load-text").html(text);
  724. }
  725. return this;
  726. };
  727. Mask.prototype.remove = function () {
  728. if (this.dom) {
  729. this.dom.remove();
  730. this.dom = null;
  731. }
  732. };
  733. //输入框2位小数限制
  734. function myNumberic(e, len) {
  735. var obj = e.srcElement || e.target;
  736. var dot = obj.value.indexOf(".");//alert(e.which);
  737. len = (typeof (len) == "undefined") ? 2 : len;
  738. var key = e.keyCode || e.which;
  739. //不能输入小数点
  740. if (len <= 0 && key == 46) {
  741. return false;
  742. }
  743. if (key == 8 || key == 9 || key == 46 || (key >= 37 && key <= 40))//这里为了兼容Firefox的backspace,tab,del,方向键
  744. return true;
  745. if (key <= 57 && key >= 48) { //数字
  746. if (dot == -1)//没有小数点
  747. return true;
  748. else if (obj.value.length <= dot + len)//小数位数
  749. return true;
  750. } else if ((key == 46) && dot == -1) {//小数点
  751. return true;
  752. }
  753. return false;
  754. }
  755. // 输入时光标bug ,导致只有onchange事件好用,正则有待优化,先输小数点不会被过滤掉。。。todo
  756. function numberFixed(event, len) {
  757. var value = $(event.target).val();
  758. var regStrs = [
  759. ['[^\\d\\.]+$', ''], //禁止录入任何非数字和点
  760. ['\\.(\\d?)\\.+', '.$1'], //禁止录入两个以上的点
  761. ['^(\\d+\\.\\d{' + len + '}).+', '$1'] //禁止录入小数点后len位以上
  762. ];
  763. for (var i = 0; i < regStrs.length; i++) {
  764. var reg = new RegExp(regStrs[i][0]);
  765. value = value.replace(reg, regStrs[i][1]);
  766. }
  767. $(event.target).val(value);
  768. }
  769. //正整数或两位以内的小数(包括一位小数)
  770. function isMoney(str) {
  771. var g = /^\d+(\.\d{1,2})?$/;
  772. return g.test(str);
  773. }
  774. //电话
  775. function isPhone(str) {
  776. var phoneReg = /^[1][3456789]\d{9}$/;
  777. return phoneReg.test(str);
  778. }
  779. //整数
  780. function isPInt(str) {
  781. var g = /^[1-9]*[1-9][0-9]*$/;
  782. return g.test(str);
  783. }
  784. //如果某几个关键字是包含关系,短的关键字放后面,因为设备真实名称一般是比较长的,比如:XXX脉冲充电桩.indexOf('汽车充电桩')
  785. window.DEV_ICON_MAP = {
  786. "空气净化": "kongqijinghuaqi",
  787. "吸氧": "xiyangji",
  788. "制氧": "yangqi",
  789. "微波炉": "weibolu",
  790. "洗衣机": "xiyiji",
  791. "烘干": "hongganji",
  792. "洗鞋": "xiezi",
  793. "洗澡": "xizao",
  794. "搓澡": "xizaomuyu",
  795. "淋浴": "xizaomuyu",
  796. "吹风": "chuifengji",
  797. "售液": "water",
  798. "啤酒": "pijiu",
  799. "售水": "yinshuiji",
  800. "饮料": "yinshuiji",
  801. "喝水": "yinshuiji",
  802. "饮水": "yinshuiji",
  803. "漱口水": "pingzi",
  804. "洗手液": "xishouye",
  805. "洗衣液": "xiyiye",
  806. "游戏": "game",
  807. "射": "sheqiang",
  808. "枪": "sheqiang",
  809. "摇摇车": "yaoyaoche",
  810. "儿童车": "ertongche",
  811. "娃娃机": "zhuawawa",
  812. "购物车": "gouwuche",
  813. "咖啡": "kafei",
  814. "格子": "shouhuoji",
  815. "售货": "shouhuoji",
  816. "储物": "chuwugui",
  817. "纸巾": "zhijin",
  818. "体重": "tizhong",
  819. "洗车": "xicheji",
  820. "汽车充电": "qichechongdian",
  821. "充电桩": "chongdianzhuang",
  822. "充电": "chongdian",
  823. "足底按摩": "zuliao",
  824. "足疗": "zuliao",
  825. "按摩抱枕": "baozhen",
  826. "按摩": "anmoyi",//有按摩坐垫、按摩椅、足底按摩机
  827. "水疗": "shuiliaoyi",
  828. "床": "chuang",
  829. };
  830. function getDevIconName(typeName) {
  831. if (typeName) {
  832. for (var key in DEV_ICON_MAP) {
  833. if (typeName.indexOf(key) > -1) {
  834. return "icon-" + DEV_ICON_MAP[key];
  835. }
  836. }
  837. }
  838. return "icon-device";
  839. }
  840. // 微信提现支持的银行参考:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_4&index=5
  841. var BANK_COLOR_TYPE = {
  842. red: {'background-image': 'linear-gradient(120deg, #D2354F 0%, #A22032 100%)'},
  843. green: {'background-image': 'linear-gradient(120deg, #32A680 0%, #1C9F66 100%)'},
  844. blue: {'background-image': 'linear-gradient(120deg, #166DD3 0%, #0D3F86 100%)'},
  845. yellow: {'background-image': 'linear-gradient(120deg, #DE9651 0%, #FF885C 100%)'},
  846. }
  847. var BANK_STYLE_MAP = {
  848. '中国工商银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#E50112', icon: 'bicon-gongshangyinhang',},
  849. '中国农业银行': {cardStyle: BANK_COLOR_TYPE.green, color: '#008566', icon: 'bicon-nongyeyinhang',},
  850. '中国银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#9E1F31', icon: 'bicon-zhongguoyinhang',},
  851. '中国建设银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#003A90', icon: 'bicon-jiansheyinhang',},
  852. '招商银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#E31E25', icon: 'bicon-zhaoshangyinhang',},
  853. '中国邮政储蓄银行': {cardStyle: BANK_COLOR_TYPE.green, color: '#006F46', icon: 'bicon-youchuyinhang',},
  854. '交通银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#1D1F86', icon: 'bicon-jiaotongyinhang',},
  855. '浦发银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#2D5082', icon: 'bicon-pufayinhang',},
  856. '中国民生银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#1D2087', icon: 'bicon-minshengyinhang',},
  857. '兴业银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#003F8D', icon: 'bicon-xingyeyinhang',},
  858. '平安银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#FF3204', icon: 'bicon-pinganyinhang',},
  859. '中信银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#BB1D20', icon: 'bicon-zhongxinyinhang',},
  860. '华夏银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#E50012', icon: 'bicon-huaxiayinhang',},
  861. '广发银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#E7191B', icon: 'bicon-guangfayinhang',},
  862. '中国光大银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F39C00', icon: 'bicon-guangdayinhang',},
  863. '北京银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#C11E22', icon: 'bicon-beijingyinhang',},
  864. '宁波银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F19339', icon: 'bicon-ningboyinhang',},
  865. '上海银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-shanghaiyinhang',},
  866. '南京银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#F19339', icon: 'bicon-nanjingyinhang',},
  867. '长子县融汇村镇银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F19339', icon: 'bicon-yinhang',},
  868. '长沙银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#F19339', icon: 'bicon-changsha',},
  869. '浙江泰隆商业银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F19339', icon: 'bicon-zhejiangtailongshangyeyinhang',},
  870. '中原银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-zhongyuanyinhang',},
  871. '企业银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-qiyeyinhanglogo',},
  872. '顺德农商银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-shundenongshangyinhang',},
  873. '衡水市商业银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F19339', icon: 'bicon-hengshuiyinhang',},
  874. '长治市商业银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#F19339', icon: 'bicon-changzhiyinhanglogo',},
  875. '大同市商业银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#F19339', icon: 'bicon-datongyinhanglogo',},
  876. '河南省农村信用社': {
  877. cardStyle: BANK_COLOR_TYPE.green,
  878. color: '#F19339',
  879. icon: 'bicon-henanshengnongcunxinyongshelianheshe',
  880. },
  881. '宁夏黄河农村商业银行': {
  882. cardStyle: BANK_COLOR_TYPE.blue,
  883. color: '#F19339',
  884. icon: 'bicon-ningxiahuanghenongcunshangyeyinhang',
  885. },
  886. '山西省农村信用社': {cardStyle: BANK_COLOR_TYPE.green, color: '#F19339', icon: 'bicon-shanxishengnongcunxinyongshe',},
  887. '安徽省农村信用社': {cardStyle: BANK_COLOR_TYPE.green, color: '#F19339', icon: 'bicon-anhuishengnongcunxinyongshe',},
  888. '甘肃省农村信用社': {
  889. cardStyle: BANK_COLOR_TYPE.green,
  890. color: '#F19339',
  891. icon: 'bicon-gansushengnongcunxinyongshelianheshe',
  892. },
  893. '天津农商银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-tianjinnongshangyinhang',},
  894. '广西壮族自治区农村信用社联合社': {
  895. cardStyle: BANK_COLOR_TYPE.green,
  896. color: '#F19339',
  897. icon: 'bicon-guangxizhuangzuzizhiqunongcunxinyongshelianheshe',
  898. },
  899. '陕西省农信社': {
  900. cardStyle: BANK_COLOR_TYPE.green,
  901. color: '#F19339',
  902. icon: 'bicon-shanxishengnongcunxinyongshelianheshe',
  903. },
  904. '深圳农村商业银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-shenzhennongcunshangyeyinhang',},
  905. '宁波鄞州农商行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-yinzhouyinhang',},
  906. '浙江省农村信用社联合社': {
  907. cardStyle: BANK_COLOR_TYPE.green,
  908. color: '#F19339',
  909. icon: 'bicon-zhejiangshengnongcunxinyongshelianheshe',
  910. },
  911. '江苏省农村信用社联合社': {
  912. cardStyle: BANK_COLOR_TYPE.green,
  913. color: '#F19339',
  914. icon: 'bicon-jiangsushengnongcunxinyongshelianheshe',
  915. },
  916. '江苏紫金农村商业银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-jiangsuzijinnongcunshangyeyinhang',},
  917. '北京中关村银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F19339', icon: 'bicon-yinhang',},
  918. '星展银行(中国)': {cardStyle: BANK_COLOR_TYPE.red, color: '#F19339', icon: 'bicon-xingzhanyinhang',},
  919. '枣庄银行': {cardStyle: BANK_COLOR_TYPE.blue, color: '#F19339', icon: 'bicon-zaozhuangyinhang',},
  920. '海口联合农商银行': {cardStyle: BANK_COLOR_TYPE.yellow, color: '#F19339', icon: 'bicon-haikoulianhenongshangyinhang',},
  921. '南洋商业银行': {cardStyle: BANK_COLOR_TYPE.red, color: '#F19339', icon: 'bicon-nanyangshangyeyinhang',},
  922. };
  923. function findBankStyle(name) {
  924. for (var key in BANK_STYLE_MAP) {
  925. var bankStyle = BANK_STYLE_MAP[key];
  926. if (name.indexOf(key) > -1) {
  927. return bankStyle;
  928. }
  929. }
  930. return {color: '#c55055', icon: 'icon-bank-card',};//没找到返回默认图标
  931. }
  932. function msgPopup(title, msg, btnword, callback) {
  933. $('body').append('<div class="backdrop"></div>');
  934. var popupHtml = '<div class="popup">'
  935. + '<div class="popup-inner">'
  936. + '<div class="popup-title">' + title + '</div>'
  937. + '<div class="popup-text">' + msg + '</div>'
  938. + '</div>'
  939. + '<div class="popup-buttons">'
  940. + '<span class="popup-button">' + btnword + '</span>'
  941. + '</div>'
  942. + '</div>';
  943. $('.backdrop').addClass('active').touchmove(function (e) {
  944. e.preventDefault();
  945. }).after(popupHtml);
  946. $('.popup').addClass('popup-in');
  947. $('.popup-button').tap(function () {
  948. if (callback) {
  949. callback();
  950. }
  951. $('.backdrop, .popup').remove();
  952. return false;
  953. });
  954. }
  955. //尝试获取微信权限
  956. function getWxconfig(callback) {
  957. if (!window.wx) {
  958. if (isTest()) {
  959. alert('请引入微信api,否则无法扫码')
  960. }
  961. return;
  962. }
  963. var url = "/user/wxconfig";
  964. if (location.pathname.indexOf('/pages') === 0) {
  965. url = "/user/wxconfig";
  966. } else if (location.pathname.indexOf('/test') === 0) {
  967. url = "/test/wxconfig";
  968. } else if (location.pathname.indexOf('/app') === 0) {
  969. url = "/dealer/wxconfig";
  970. } else if (location.pathname.indexOf('/agents') === 0) {
  971. url = "/agent/wxconfig";
  972. }
  973. var checkUrl = location.href; // 当前页面路径包含问号参数必须一致,否则微信无法通过校验
  974. sendRequest(url,
  975. "GET", {"href": checkUrl}, function (response) {
  976. if (response.result == 1) {
  977. wx.config({
  978. debug: false,
  979. appId: response.para.wxconfig.appId,
  980. timestamp: response.para.wxconfig.timestamp,
  981. nonceStr: response.para.wxconfig.nonceStr,
  982. signature: response.para.wxconfig.signature,
  983. jsApiList: [
  984. 'scanQRCode',
  985. 'getLocation',
  986. // 调用的接口太多,反而容易失败
  987. // 'onMenuShareTimeline',
  988. // 'hideOptionMenu',//界面操作接口1
  989. // 'showOptionMenu',//界面操作接口2
  990. // 'closeWindow', ////界面操作接口3
  991. // 'hideMenuItems',////界面操作接口4
  992. // 'showMenuItems',////界面操作接口5
  993. // 'hideAllNonBaseMenuItem',////界面操作接口6
  994. // 'showAllNonBaseMenuItem'////界面操作接口7
  995. ],
  996. success: function (res) {
  997. console.log('wx.config success')
  998. },
  999. fail: function (res) {
  1000. console.log('wx.config fail')
  1001. },
  1002. error: function (res) {
  1003. console.log('wx.config error')
  1004. },
  1005. });
  1006. if (callback) {
  1007. callback();
  1008. }
  1009. console.log(response)
  1010. }
  1011. });
  1012. }
  1013. /*******
  1014. * 微信扫码必须等待界面加载完,否则微信无法成功调用扫码
  1015. * *******/
  1016. // 获取扫码结果:支付宝、微信都能用,必须导入支付宝、微信api
  1017. function ScanResult(success) {
  1018. getWxconfig(goScan);
  1019. function goScan() {
  1020. if (BROWSER_TYPE == "alipay") {
  1021. if (!window.ap) {
  1022. alert('请引入支付宝api,否则无法扫码')
  1023. return;
  1024. }
  1025. ap.scan(function (res) {
  1026. success(res.code);
  1027. });
  1028. } else if (BROWSER_TYPE == "wechat") {
  1029. if (!window.wx) {
  1030. if (isTest()) {
  1031. alert('请引入微信api,否则无法扫码')
  1032. }
  1033. return;
  1034. }
  1035. var mask = new Mask("正在获取扫码权限...");
  1036. mask.show();
  1037. wx.ready(function () {
  1038. wx.scanQRCode({
  1039. needResult: 1,
  1040. scanType: ["qrCode"],
  1041. success: function (res) {
  1042. var resultStr = res.resultStr;
  1043. success(resultStr);
  1044. },
  1045. fail: function (res) {
  1046. alert(res.errMsg + "权限失效,请重新尝试。");
  1047. },
  1048. error: function (res) {
  1049. if (res.errMsg.indexOf('function_not_exist') > 0) {
  1050. alert('您的微信版本过低,请升级');
  1051. }
  1052. },
  1053. cancel: function () {
  1054. console.log('用户主动取消扫码');
  1055. },
  1056. complete: function () {
  1057. console.log("完成扫码");
  1058. mask.remove();
  1059. }
  1060. });
  1061. });
  1062. }
  1063. }
  1064. }
  1065. // 获取当前地理位置,微信或支付宝接口
  1066. function getLocation(callback, complete) {
  1067. var locationType = "gcj02";
  1068. if (BROWSER_TYPE == "alipay") {
  1069. // 默认是GCJ-02坐标系
  1070. ap.getLocation(function (res) {
  1071. var longitude = res.longitude; // 经度
  1072. var latitude = res.latitude; // 纬度
  1073. if (callback) {
  1074. callback({lng: longitude, lat: latitude, type: locationType})
  1075. }
  1076. complete && complete()
  1077. })
  1078. } else if (BROWSER_TYPE == "wechat") {
  1079. getWxconfig(function () {
  1080. wx.ready(function () {
  1081. wx.getLocation({
  1082. type: locationType, // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
  1083. success: function (res) {
  1084. var longitude = res.longitude; // 经度
  1085. var latitude = res.latitude; // 纬度
  1086. if (callback) {
  1087. callback({lng: longitude, lat: latitude, type: locationType})
  1088. }
  1089. complete && complete()
  1090. },
  1091. fail: function (res) {
  1092. alert('请您打开定位');
  1093. complete && complete()
  1094. },
  1095. error: function (res) {
  1096. if (res.errMsg.indexOf('function_not_exist') > 0) {
  1097. alert('您的微信版本过低,请升级');
  1098. }
  1099. complete && complete()
  1100. },
  1101. cancel: function (res) {
  1102. alert('您已取消定位授权');
  1103. complete && complete()
  1104. }
  1105. });
  1106. });
  1107. });
  1108. }
  1109. }
  1110. // 筛选控件公共事件
  1111. function FilterComponent(optionIn) {
  1112. if ($.isArray(optionIn)) {
  1113. for (var index in optionIn) {
  1114. var optItem = optionIn[index];
  1115. bindEvent(optItem)
  1116. }
  1117. } else {
  1118. bindEvent(optionIn)
  1119. }
  1120. function bindEvent(option) {
  1121. var optionEx = {
  1122. ok: function () {
  1123. },
  1124. cancel: function () {
  1125. }
  1126. };
  1127. option = $.extend(optionEx, option);
  1128. var panelDom;
  1129. if (option.panel) {
  1130. panelDom = $(option.panel)
  1131. } else {
  1132. panelDom = $('#options');
  1133. }
  1134. var maskDom = $('<div class="filter-list-mask mui-hidden"></div>');
  1135. panelDom.append(maskDom);
  1136. var triggerBtn;
  1137. if (option.trigger) {
  1138. triggerBtn = $(option.trigger)
  1139. } else {
  1140. triggerBtn = $('.filter-btn');
  1141. }
  1142. //展开|收起过滤条件
  1143. triggerBtn.tap(function () {
  1144. var hiddenOptions = !panelDom.is(":hidden");
  1145. //无论如何,先隐藏其他模块
  1146. $(".filter-panel").hide();
  1147. $(".filter-btn,.filter-btn-custom").removeClass("active");
  1148. if (hiddenOptions) {
  1149. panelDom.slideUp(100);
  1150. maskDom.addClass("mui-hidden");
  1151. $(this).removeClass("active");
  1152. } else {
  1153. panelDom.slideDown(100);
  1154. maskDom.removeClass("mui-hidden");
  1155. $(this).addClass("active");
  1156. }
  1157. return false;
  1158. });
  1159. maskDom.tap(function () {
  1160. panelDom.slideUp(100);
  1161. $(".filter-list-mask").addClass("mui-hidden");
  1162. option.cancel()
  1163. });
  1164. //弹出查询条件,使用默认的ok-btn按钮
  1165. panelDom.find('.ok-btn').click(function (e) {
  1166. if (option.ok) {
  1167. var flag = option.ok();
  1168. if (flag == false) {
  1169. //如果返回false表示校验不通过,则不收起来
  1170. } else {
  1171. panelDom.slideUp(100);
  1172. maskDom.addClass("mui-hidden");
  1173. }
  1174. }
  1175. });
  1176. if (option.okTrigger) {
  1177. $(option.okTrigger).on("tap", function (e) {
  1178. panelDom.slideUp(100);
  1179. maskDom.addClass("mui-hidden");
  1180. });
  1181. }
  1182. // 弹窗条件取消
  1183. panelDom.find('.cancel-btn').click(function (e) {
  1184. panelDom.slideUp(100);
  1185. maskDom.addClass("mui-hidden");
  1186. option.cancel()
  1187. });
  1188. }
  1189. }
  1190. /***
  1191. * 套餐附加参数选择组件
  1192. */
  1193. function PackageSelectComponent(option) {
  1194. var attachParas = {};
  1195. var devTypeInfo = option.devTypeInfo,
  1196. el = option.el,
  1197. multiple = option.multiple,
  1198. data = option.data || {};
  1199. if($("#modal100200").length === 0) {
  1200. $("body").append(PackageSelectComponentTemplate);//载入模板到页面
  1201. }
  1202. var statusConfig = {
  1203. "idle": {name: "空闲", color: "green"},
  1204. "fault": {name: "故障", color: "red"},
  1205. "busy": {name: "繁忙", color: "lgreen"},
  1206. "ban": {name: "禁用", color: "gray-ccc"},
  1207. "finished": {name: '完成',color: 'lgreen'},
  1208. "connected": {name: '连接',color: "green"},
  1209. "estop": {name: '急停状态',color: 'red'},
  1210. "ready": {name: '就绪',color: 'lgreen'}
  1211. };
  1212. function toggleActive(indexDom) {
  1213. var prevDom = modal.find('.charge-socket.active');
  1214. var prevDefaultClass = prevDom.attr("defaultClass");
  1215. var prevActiveClass = prevDom.attr("activeClass");
  1216. var defaultClass = indexDom.attr("defaultClass");
  1217. var activeClass = indexDom.attr("activeClass");
  1218. if (multiple) {
  1219. if (indexDom.hasClass('active')) {
  1220. indexDom.removeClass('active ' + activeClass).addClass(defaultClass);
  1221. } else {
  1222. indexDom.removeClass(defaultClass).addClass("active " + activeClass);
  1223. }
  1224. } else {
  1225. prevDom.removeClass("active " + prevActiveClass).addClass(prevDefaultClass);
  1226. indexDom.removeClass(defaultClass).addClass("active " + activeClass);
  1227. }
  1228. let portList = [];
  1229. modal.find('.charge-socket.active').each(function () {
  1230. portList.push($(this).attr("chargeIndex"));
  1231. })
  1232. if (multiple) {
  1233. return portList;
  1234. } else {
  1235. return portList[0];
  1236. }
  1237. }
  1238. var modal = "";
  1239. // 平铺展开充电口
  1240. function initChargeIndex() {
  1241. var chargeIndexDom = modal.find(".chargeIndexGrid");
  1242. // 如果设备有充电线路,则渲染
  1243. if (devTypeInfo.chargeIndex) {
  1244. attachParas.needPort = true;
  1245. var initSelectValue;
  1246. var initSelectIndex;
  1247. var index = 0;
  1248. for (var key in devTypeInfo.chargeIndex) {
  1249. var statusEnum = devTypeInfo.chargeIndex[key] || "ban";
  1250. var color = statusConfig[statusEnum].color;
  1251. var name = statusConfig[statusEnum].name;
  1252. var dom = $('<div class="para-item charge-socket c-' + color + '"></div>').attr({
  1253. status: devTypeInfo.chargeIndex[key],
  1254. chargeIndex: key,
  1255. defaultClass: 'c-' + color,
  1256. activeClass: 'btn-' + color + ' border-' + color,
  1257. });
  1258. var tmpText = key + ':' + name;
  1259. dom.html(tmpText);
  1260. chargeIndexDom.append(dom);
  1261. // 匹配初始化端口的信息
  1262. if (data.chargeIndex == key) {
  1263. initSelectValue = devTypeInfo.chargeIndex[key];
  1264. initSelectIndex = index;
  1265. }
  1266. index++;
  1267. }
  1268. // 判断是否有端口,没有则禁用套餐; 目前只支持一个端口选择;
  1269. if (index > 0) {
  1270. //如果有初始化的参数,则选中该端口
  1271. if (data.chargeIndex != null && data.chargeIndex != "") {
  1272. attachParas.chargeIndex = data.chargeIndex;//数据选中
  1273. var indexDom = chargeIndexDom.find(".charge-socket").eq(initSelectIndex);
  1274. toggleActive(indexDom);
  1275. }
  1276. } else {
  1277. //如果没有端口,则显示无可用
  1278. chargeIndexDom.closest(".device-para-row").addClass("fade-node");
  1279. }
  1280. }
  1281. // 点击事件绑定
  1282. modal.off("tap.chargeSocket").on("tap.chargeSocket", ".charge-socket", function () {
  1283. attachParas.chargeIndex = toggleActive($(this));
  1284. })
  1285. }
  1286. // 初始化电池类型选择器:储存在本地,避免用户每次选电池类型
  1287. function initBattery() {
  1288. var batteryTypeList = [
  1289. {"value": "锂电池", "text": "锂电池", "icon": "icon-battery"},
  1290. {"value": "铅酸电池", "text": "铅酸电池", "icon": "icon-xudianchi"}
  1291. ];
  1292. // 获取缓存的默认值
  1293. var defaultValue = localStorage.getItem("user_para_batteryType") || attachParas.batteryType;
  1294. if (defaultValue) {
  1295. attachParas.batteryType = defaultValue;
  1296. }
  1297. console.log(defaultValue)
  1298. var batteryTypeDom = modal.find(".batteryTypeGrid");
  1299. function bind(htmlItem, value) {
  1300. // 点击事件绑定
  1301. htmlItem.on("tap", function () {
  1302. modal.find(".battery-type").removeClass("active2 btn-skin");
  1303. $(this).addClass("active2 btn-skin");
  1304. attachParas.batteryType = value;
  1305. //缓存到本地
  1306. localStorage.setItem("user_para_batteryType", value)
  1307. })
  1308. }
  1309. for (var index in batteryTypeList) {
  1310. var item = batteryTypeList[index];
  1311. var htmlItem = $('<div class="para-item battery-type common-color"><span class="text"></span></div>');
  1312. htmlItem.attr("value", item.value);
  1313. htmlItem.find(".text").text(item.text);
  1314. batteryTypeDom.append(htmlItem);
  1315. // 渲染默认值
  1316. if (defaultValue == item.value) {
  1317. htmlItem.addClass("active2 btn-skin");
  1318. }
  1319. bind(htmlItem, item.value);
  1320. }
  1321. }
  1322. function initVoltage() {
  1323. var voltageList = [
  1324. {"value": 12, "text": "12V"},
  1325. {"value": 24, "text": "24V"},
  1326. {"value": 36, "text": "36V"},
  1327. {"value": 48, "text": "48V"},
  1328. {"value": 60, "text": "60V"},
  1329. {"value": 72, "text": "72V"},
  1330. ];
  1331. // 获取缓存的默认值
  1332. var defaultValue = localStorage.getItem("user_para_voltage") || attachParas.voltage;
  1333. if (defaultValue) {
  1334. attachParas.voltage = defaultValue;
  1335. }
  1336. console.log(defaultValue)
  1337. var voltageDom = modal.find(".voltageGrid");
  1338. function bind(htmlItem, value) {
  1339. // 点击事件绑定
  1340. htmlItem.on("tap", function () {
  1341. modal.find(".voltage-type").removeClass("active2 btn-skin");
  1342. $(this).addClass("active2 btn-skin");
  1343. attachParas.voltage = value;
  1344. //缓存到本地
  1345. localStorage.setItem("user_para_voltage", value)
  1346. })
  1347. }
  1348. for (var index in voltageList) {
  1349. var item = voltageList[index];
  1350. var htmlItem = $('<div class="para-item voltage-type common-color"><span class="text"></span></div>');
  1351. htmlItem.attr("value", item.value);
  1352. htmlItem.find(".text").text(item.text);
  1353. voltageDom.append(htmlItem);
  1354. // 渲染默认值
  1355. if (defaultValue == item.value) {
  1356. htmlItem.addClass("active2 btn-skin");
  1357. }
  1358. bind(htmlItem, item.value);
  1359. }
  1360. }
  1361. // 凯源新能的充电桩
  1362. if (devTypeInfo.code == 100200) {
  1363. attachParas = {"voltage": 12, "batteryType": "锂电池"};//默认附加参数
  1364. modal = $($("#modal100200").html());
  1365. initBattery();
  1366. initVoltage();
  1367. initChargeIndex();
  1368. } else if (!$.isEmptyObject(devTypeInfo.chargeIndex)) {
  1369. attachParas = {};//默认附加参数
  1370. modal = $($("#modal100202").html());
  1371. initChargeIndex();
  1372. }
  1373. if (modal) {
  1374. $(el).html(modal).addClass("active");
  1375. }
  1376. // 如果返回引用,似乎会丢失,暂这样写
  1377. return {attachParas: attachParas};
  1378. }
  1379. var PackageSelectComponentTemplate =
  1380. '<script id="modal100200" desc="" type="text/html">' +
  1381. ' <div class="device-para-row clearfix ">' +
  1382. ' <div class="device-para-grid-title">电池类型</div>' +
  1383. ' <div class="device-para-grid clearfix batteryTypeGrid"></div>' +
  1384. ' </div>' +
  1385. ' <div class="device-para-row clearfix">' +
  1386. ' <div class="device-para-grid-title">充电电压</div>' +
  1387. ' <div class="device-para-grid clearfix voltageGrid"></div>' +
  1388. ' </div>' +
  1389. ' <div class="device-para-row clearfix ">' +
  1390. ' <div class="device-para-grid-title">端口</div>' +
  1391. ' <div class="device-para-grid clearfix chargeIndexGrid"></div>' +
  1392. ' </div>' +
  1393. '</script>' +
  1394. '<script id="modal100202" desc="" type="text/html">' +
  1395. ' <div class="device-para-row clearfix ">' +
  1396. ' <div class="device-para-grid-title">端口</div>' +
  1397. ' <div class="device-para-grid clearfix chargeIndexGrid"></div>' +
  1398. ' </div>' +
  1399. '</script>'
  1400. function loadVconsole() {
  1401. if (OS_TYPE !== 'Android' && OS_TYPE !== 'IOS') {
  1402. // PC 测试无需vconsole
  1403. return
  1404. }
  1405. // 使用缓存获取,避免刷新后重新向服务器请求
  1406. $.ajaxSetup({
  1407. cache: true
  1408. });
  1409. $.ajax({
  1410. url: "/components/lib/vconsole.min.js",
  1411. async: false,
  1412. dataType: "script",
  1413. success: function () {
  1414. new VConsole();
  1415. }
  1416. });
  1417. }
  1418. if (isTest() || getQueryString('isTest')) {
  1419. localStorage.setItem('ENV_TEST', '1');
  1420. loadVconsole()
  1421. } else if (localStorage.getItem('ENV_TEST')) {
  1422. loadVconsole()
  1423. }
  1424. $(function () {
  1425. return
  1426. // 如果是本地纯前台测试,则引入模拟的扫码、支付
  1427. if (isTest(true)) {
  1428. window.WeixinJSBridge = {
  1429. invoke: function (str, obj, callback) {
  1430. callback({err_msg: "get_brand_wcpay_request:ok"})
  1431. }
  1432. }
  1433. window.AlipayJSBridge = {
  1434. call: function (str, obj, callback) {
  1435. callback({resultCode: "9000"})
  1436. }
  1437. }
  1438. window.wx = {
  1439. ready: function (c) {
  1440. c()
  1441. },
  1442. config: function () {
  1443. },
  1444. scanQRCode: function (obj) {
  1445. obj.success({resultStr: "http://www.washpayer.com/dealer/toAuth?l=1001"})
  1446. obj.complete && obj.complete()
  1447. },
  1448. getLocation: function (obj) {
  1449. if (obj.success) {
  1450. obj.success({longitude: 114.31, latitude: 30.52})
  1451. }
  1452. obj.complete && obj.complete()
  1453. }
  1454. }
  1455. window.ap = {
  1456. scan: function (callback) {
  1457. callback({code: "http://www.washpayer.com/userLogin?l=2910"})
  1458. }
  1459. }
  1460. }
  1461. });
  1462. (function () {
  1463. return;
  1464. //此代码为 经销商和代理商系统设置皮肤代码注入gulp源码,使其在其他script之前即可优先执行。 可以用工具压缩再注入。注意加script标签
  1465. // 改代码必须注入到 html标签内部(最好在head结束之前,确保其在其他script之前执行),因为只需要等html加载完即可正常操作html标签,如果注入到html外部,是不能正常修改html标签的!(文档流的html还是空)此段代码写[(function (){})()]其实也没啥用... html文档流严格按从上往下执行!
  1466. function getCookie(name) {
  1467. var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
  1468. if (arr != null) {
  1469. return unescape(arr[2]);
  1470. } else {
  1471. return null;
  1472. }
  1473. }
  1474. var theme = getCookie("theme_name") || "theme-alipay";
  1475. document.querySelectorAll('html')[0].classList.add(theme);
  1476. })();