xyf.common.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. function sendRequestWithHeaders(url, type, headers, data, success, contentType, async, complete) {
  2. //可能直接传递option
  3. var optionIn = {};
  4. var mask = null;
  5. var maskContainer = null;
  6. var maskDelay = null;
  7. if ($.isPlainObject(url)) {
  8. optionIn = url;
  9. url = optionIn.url;
  10. type = optionIn.type;
  11. data = optionIn.data;
  12. success = optionIn.success;
  13. contentType = optionIn.contentType;
  14. async = optionIn.async;
  15. complete = optionIn.complete
  16. mask = optionIn.mask;
  17. maskContainer = optionIn.maskContainer;
  18. maskDelay = optionIn.maskDelay;
  19. headers = optionIn.headers;
  20. }
  21. var options = {
  22. url: url,
  23. type: type,
  24. mask: mask,
  25. maskDelay: maskDelay,
  26. maskContainer: maskContainer,
  27. headers: headers,
  28. success: function (result) {
  29. if (success) {
  30. success(result);
  31. }
  32. },
  33. dataType: 'json',//服务器返回数据类型
  34. timeout: 60000,
  35. error: function (xhr) {
  36. if (xhr.status === 401) {
  37. window.mui && mui.toast('登录超时,即将跳转到登录页面...');
  38. setTimeout(function () {
  39. var url = 'login.html';
  40. goPage(url);
  41. }, 1500)
  42. } else {
  43. var title = "温馨提示";
  44. var msg = '获取数据失败,请检查网络';
  45. var btnword = '我知道了';
  46. msgPopup(title, msg, btnword);
  47. }
  48. },
  49. complete: function (result) {
  50. if (complete) {
  51. complete(result);//目前主要用于$("#progress").hide();
  52. }
  53. }
  54. };
  55. if (data) {
  56. if ((type.toUpperCase() == 'PUT' || type.toUpperCase() == 'POST') && contentType == "json" && $.isPlainObject(data)) {
  57. options.data = JSON.stringify(data);
  58. options.contentType = 'application/json';//发送给后台的数据类型
  59. } else {
  60. options.data = data;
  61. }
  62. }
  63. if (typeof async != 'undefined') {
  64. options.async = async;
  65. }
  66. myAjax(options);
  67. }
  68. //设备注册、已注册设备查看、上分,等需要调用
  69. function scanQRCodeToReg() {
  70. ScanResult(function (resultStr) {
  71. // 表示经销商扫描登录
  72. if (resultStr.indexOf('app/qrcodeLg.html') > -1) {
  73. sendRequest({
  74. url: "/dealer/scanLogin?url=" + resultStr,
  75. type: "GET",
  76. success: function (response) {
  77. if (response.result === 1) {
  78. window.mui && mui.toast('PC端登录成功');
  79. } else {
  80. alert(response.description);
  81. }
  82. }
  83. });
  84. }
  85. // 扫码,给别人授权。 然后需要在授权人管理列表中 配置权限,别人才有操作权限。
  86. else if (resultStr.indexOf('dealer/toAuth') > -1) {
  87. mui.confirm('您确定要把您的账号权限开放给这个用户?', '<span class="c-red">授权提示</span>', ['取消', '<span class="c-red">确认</span>'], function (e) {
  88. if (e.index == 1) {
  89. sendRequest({
  90. url: "/dealer/toOtherDealerAuth?url=" + encodeURIComponent(resultStr),
  91. type: "GET",
  92. success: function (response) {
  93. if (response.result === 1) {
  94. window.mui && mui.toast('您已成功授权给申请授权人');
  95. } else {
  96. alert(response.description);
  97. }
  98. }
  99. });
  100. }
  101. });
  102. } else {
  103. var url = "/dealer/index.html#/deviceReg?uniqueCode=" +resultStr;
  104. goPage(url);
  105. }
  106. });
  107. }
  108. $(function () {
  109. function tip(that) {
  110. var tipsDom;
  111. if ($(that).hasClass("tips")) {
  112. tipsDom = $(that)
  113. } else {
  114. tipsDom = $(that).find(".tips")
  115. }
  116. var tipsText = tipsDom.attr("title");
  117. var tipsTitle = tipsDom.attr("tip-title");
  118. var tipsBtn = tipsDom.attr("tip-btn");
  119. if (mui) {
  120. mui.confirm(tipsText, tipsTitle || '说明', [tipsBtn || '好的'], function (e) {
  121. });
  122. } else {
  123. confirm(tipsText);
  124. }
  125. }
  126. // 提示信息事件绑定
  127. $("body").on("click", ".tips-event", function (evt) {
  128. evt.stopPropagation();
  129. tip(this);
  130. });
  131. $("body").on("tap", ".tips-event-tap", function (evt) {
  132. evt.stopPropagation();
  133. tip(this);
  134. });
  135. });
  136. // 获取特性列表
  137. function getFeatureList(role, option, callback) {
  138. var opt = {
  139. url: "/" + role + "/getFeatureList",
  140. type: "POST",
  141. mask: "加载配置...",
  142. contentType: "json",
  143. data: {list: option.list},
  144. success: function (response) {
  145. if (response.result === 1) {
  146. if (callback) {
  147. var payload = response.payload;
  148. callback(payload);
  149. }
  150. }
  151. }
  152. }
  153. if(role==='test'){
  154. opt.headers = get_token_headers("Tester")
  155. }
  156. sendRequest(opt);
  157. }
  158. var defaultPermission = {
  159. "homepageData": {
  160. "today_income": true,
  161. "today_pay_income": true,
  162. "today_ad_income": false,
  163. "offline_coins": false
  164. },
  165. mainMenu: {
  166. 'device_reg': true,
  167. 'device_management': true,
  168. 'business_stats': true,
  169. 'stock_management': false,
  170. 'order_query': true,
  171. 'remote_upper': true,
  172. 'payoff_recharge': true,
  173. 'user_management': true,
  174. 'marketing': true,
  175. 'payoff_activity': true,
  176. 'card_management': true,
  177. 'sim_card': true,
  178. 'interconnection': false,
  179. 'user_feedback': true,
  180. 'support_alarm': false,
  181. 'user_identify': false,
  182. 'merchant': false,
  183. 'zhenguduo': false,
  184. 'batteryManager': false,
  185. 'templateManager': false,
  186. 'apiManager': false,
  187. 'disableAdManager': false,
  188. },
  189. }
  190. // 获取主菜单
  191. function getAccountPermission(callback) {
  192. // 由于 getAccountPermission 这个接口在主页连续调用了两次,还是需要缓存(2秒超时即可)
  193. var menuData = getSessionStorage("ACCOUNT_MENU")
  194. if (menuData) {
  195. if (callback) {
  196. callback(menuData)
  197. }
  198. return
  199. }
  200. sendRequest({
  201. url: "/dealer/getAccountPermission",
  202. type: "GET",
  203. data: null,
  204. mask: "加载菜单...",
  205. success: function (response) {
  206. var payload = response.payload;
  207. let obj = $.extend(true, {}, defaultPermission, payload)
  208. if (callback) {
  209. callback(obj)
  210. }
  211. setSessionStorage("ACCOUNT_MENU", obj, 1000);//1秒失效
  212. },
  213. error: function () {
  214. callback(defaultPermission)
  215. }
  216. });
  217. }
  218. //生成二维码
  219. function getQRCodeImageData(text, label, option) {
  220. option = $.extend({
  221. labelHeight: 30,
  222. size: 200,
  223. labelFontStyle: "bold 24px Arial",// 使用粗体,稍大的字号,否则打印出来的不清晰
  224. }, option)
  225. var logoSize = 40;
  226. //生成二维码
  227. var qrDom = $("<div></div>");
  228. qrDom.qrcode({
  229. render: "canvas", // 渲染方式有table方式(IE兼容)和canvas方式
  230. width: option.size, //宽度
  231. height: option.size, //高度
  232. text: text, // 二维码的内容
  233. typeNumber: -1,//计算模式
  234. correctLevel: 2,//二维码纠错级别
  235. background: "#ffffff",//背景颜色
  236. foreground: "#000000" //二维码颜色
  237. });
  238. var canvas = qrDom.find("canvas")[0];
  239. var context = canvas.getContext("2d");
  240. var imgData = context.getImageData(0, 0, option.size, option.size);//获取到二维码图片数据流
  241. //生成背景(用来绘制标签、背景图等)
  242. var backDom = $("<canvas></canvas>");
  243. var maxW = option.size;
  244. var maxH = option.size + option.labelHeight;
  245. var left = 0;
  246. var top = 0;
  247. backDom.attr({"width": maxW, "height": maxH});
  248. var backCanvas = backDom[0];
  249. var ctx = backCanvas.getContext("2d");
  250. //填充背景为白色
  251. ctx.fillStyle = "#fff";
  252. ctx.fillRect(0, 0, maxW, maxH);
  253. ctx.putImageData(imgData, left, top);//合并二维码到带背景信息的画布
  254. //绘制标题
  255. ctx.font = option.labelFontStyle;
  256. ctx.textAlign = "center";
  257. ctx.fillStyle = "#000";
  258. if (label) {
  259. ctx.fillText(label, option.size / 2 + left, (option.size + option.labelHeight - 8) + top);
  260. }
  261. //绘制logo
  262. var needLogo = false;//logo有跨域的问题 暂时不要
  263. if (needLogo) {
  264. var logoBorder = 4;
  265. var centerSize = 2 * logoBorder + logoSize;
  266. //清空中心区域用来绘制logo
  267. ctx.rect((option.size - centerSize) / 2 + left, (option.size - centerSize) / 2 + top, centerSize, centerSize);
  268. ctx.fillStyle = "#fff";
  269. ctx.fill();
  270. //logo图片
  271. ctx.drawImage($("#logoPic")[0], (option.size - logoSize) / 2 + left, (option.size - logoSize) / 2 + top, logoSize, logoSize);
  272. }
  273. var dataURL = backCanvas.toDataURL("image/png");
  274. return dataURL;
  275. }
  276. // 渲染菜单,并修复多余的底边
  277. function menuPermission(rowCcount) {
  278. rowCcount = rowCcount || 2
  279. $(".index-bd .menu-block").each(function () {
  280. var cellDom = $(this).find(".row-cell");
  281. // 偶数则去除倒数1、2的底边
  282. var len = cellDom.length;
  283. var lastLen = (len % rowCcount) || rowCcount;// 取模,最后一行的个数,如果为0,则用rowCcount
  284. for (var i = 0; i < len; i++) {
  285. if ((i + 1) % rowCcount === 0) {
  286. //右边菜单
  287. cellDom.eq(i).addClass('border-bottom ');
  288. } else {
  289. cellDom.eq(i).addClass('border-bottom border-right');
  290. }
  291. // 最后一行去除底边
  292. if (len - i <= lastLen) {
  293. cellDom.eq(i).removeClass("border-bottom");
  294. }
  295. }
  296. });
  297. }
  298. function renderNav(opt, nowKey, callback) {
  299. var html = $('<nav class="mui-bar mui-bar-tab" id="main-nav"></nav>')
  300. for (var index = 0; index < opt.length; index++) {
  301. var item = opt[index];
  302. if (item.show === false) {
  303. continue
  304. }
  305. var itemHtml = $('<a class="mui-tab-item">' +
  306. '<span class="mui-icon iconfont "></span>' +
  307. '<span class="mui-tab-label">' + item.name + '</span>' +
  308. '</a>')
  309. var icon = ''
  310. if (nowKey === item.key) {
  311. itemHtml.addClass('mui-active')
  312. icon = item.iconFill
  313. } else {
  314. icon = item.icon
  315. itemHtml.attr('nav-href', item.href)
  316. }
  317. itemHtml.find('.iconfont').addClass(icon)
  318. if (item.iconStyle) {
  319. itemHtml.find('.iconfont').css(item.iconStyle)
  320. }
  321. html.append(itemHtml)
  322. }
  323. $('body').append(html)
  324. $('#main-nav').off().on('tap', '.mui-tab-item[nav-href]', function () {
  325. goPage($(this).attr("nav-href"));// 此处必须使用goPage,如果replacePage,会导致IOS|微信的扫码鉴权失败!
  326. });
  327. if (callback) {
  328. callback()
  329. }
  330. }
  331. function initDealerNav(nowKey, callback) {
  332. var opt = [
  333. {
  334. name: '首页',
  335. key: "home",
  336. icon: 'icon-home',
  337. iconFill: 'icon-homefill',
  338. href: 'index.html'
  339. }, {
  340. name: '经营',
  341. key: "business_stats",
  342. icon: 'icon-recharge',
  343. iconFill: 'icon-rechargefill',
  344. href: 'income.html'
  345. }, {
  346. name: '设备',
  347. key: "device_management",
  348. icon: 'icon-deviceo',
  349. iconFill: 'icon-device',
  350. iconStyle: {
  351. // 图标有点大 稍微缩小下
  352. 'font-size': '22px',
  353. 'line-height': '24px'
  354. },
  355. href: 'device-mgr.html'
  356. }, {
  357. name: '我的',
  358. key: "account",
  359. icon: 'icon-account',
  360. iconFill: 'icon-accountfill',
  361. href: 'account-setting.html'
  362. }
  363. ]
  364. getAccountPermission(function (subPayload) {
  365. var mainMenu = subPayload.mainMenu
  366. var role = subPayload.role
  367. if (role === "subaccount") {
  368. if (mainMenu.business_stats === false) {
  369. opt[1].show = false
  370. }
  371. if (mainMenu.device_management === false) {
  372. opt[2].show = false
  373. }
  374. }
  375. renderNav(opt, nowKey, callback)
  376. })
  377. }
  378. function initAgentNav(nowKey, callback) {
  379. var opt = [
  380. {
  381. name: '首页',
  382. key: "home",
  383. icon: 'icon-home',
  384. iconFill: 'icon-homefill',
  385. href: 'index.html'
  386. }, {
  387. name: '收益',
  388. key: "business_stats",
  389. icon: 'icon-recharge',
  390. iconFill: 'icon-rechargefill',
  391. href: 'agent-income.html'
  392. }, {
  393. name: '经销商',
  394. key: "dealer_management",
  395. icon: 'icon-group',
  396. iconFill: 'icon-group_fill',
  397. href: 'customer-mgr.html'
  398. }, {
  399. name: '我的',
  400. key: "account",
  401. icon: 'icon-account',
  402. iconFill: 'icon-accountfill',
  403. href: 'account-setting.html'
  404. }
  405. ]
  406. renderNav(opt, nowKey, callback)
  407. }
  408. function mqtt_push_set_up() {
  409. }
  410. var CAPTCHA_CHECK_DATA = null
  411. /***
  412. * 初始化验证码组件配置
  413. * @param checkType 类型
  414. * @param prevDataCheck 短信验证码发送按钮的前置条件验证
  415. * @param sendSmsUrl
  416. */
  417. function initCheck(checkType, prevDataCheck, sendSmsUrl) {
  418. var nc_token = ["FFFF0N000000000088F1", (new Date()).getTime(), Math.random()].join(':');
  419. var nc = NoCaptcha.init({
  420. //声明滑动验证需要渲染的目标元素ID。
  421. renderTo: '#captcha',
  422. //应用类型标识。它和使用场景标识(scene字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。
  423. appkey: 'FFFF0N000000000088F1',
  424. //使用场景标识。它和应用类型标识(appkey字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的scene值,请务必正确填写。
  425. scene: 'nc_message_h5 ',
  426. //滑动验证码的主键,请勿将该字段定义为固定值。确保每个用户每次打开页面时,其token值都是不同的。系统默认的格式为:”您的appkey”+”时间戳”+”随机数”。
  427. token: nc_token,
  428. //业务键字段,可为空。为便于线上问题的排查,建议您按照线上问题定位文档中推荐的方法配置该字段值。
  429. trans: {"key1": "code0"},
  430. //语言,默认值为cn(中文)。HTML5应用类型默认支持简体中文、繁体中文、英文语言。
  431. language: "cn",
  432. //内部网络请求的超时时间。一般情况建议保持默认值(10000ms)。
  433. timeout: 10000,
  434. //允许服务器超时重复次数,默认5次。
  435. retryTimes: 5,
  436. //验证通过后,验证码组件是否自动隐藏,默认不隐藏(false)。
  437. bannerHidden: false,
  438. //是否默认不渲染,默认值false。当设置为true时,不自动渲染,需要自行调用show方法进行渲染。
  439. initHidden: false,
  440. //前端滑动验证通过时会触发该回调参数。您可以在该回调参数中将请求标识(token)、会话ID(sessionid)、签名串(sig)字段记录下来,随业务请求一同发送至您的服务端调用验签。
  441. callback: function (data) {
  442. CAPTCHA_CHECK_DATA = {
  443. nc_token: nc_token,
  444. csessionid: data.csessionid,
  445. sig: data.sig,
  446. }
  447. },
  448. error: function (s) {
  449. }
  450. });
  451. NoCaptcha.setEnabled(true);
  452. //请务必在此处调用一次reset()方法。
  453. nc.reset();
  454. //用于配置滑动验证的自定义文案。详细信息,请参见自定义文案与多语言文档。
  455. NoCaptcha.upLang('cn', {
  456. //加载状态提示。
  457. 'LOADING': "加载中...",
  458. //等待滑动状态提示。
  459. 'SLIDER_LABEL': "请向右滑动验证",
  460. //验证通过状态提示。
  461. 'CHECK_Y': "验证通过",
  462. //验证失败触发拦截状态提示。
  463. 'ERROR_TITLE': "非常抱歉,这出错了..."
  464. });
  465. bindSendCode(prevDataCheck, sendSmsUrl)
  466. }
  467. var sendFlag = false;
  468. // 绑定发送验证码的按钮事件
  469. function bindSendCode(prevDataCheck, sendSmsUrl) {
  470. var sendBtn = document.getElementById('sendBtn');
  471. $("#sendBtn").on("click", function () {
  472. if (!CAPTCHA_CHECK_DATA) {
  473. return alert('请完成人机交互验证');
  474. }
  475. var prevData = prevDataCheck();
  476. if (!prevData) {
  477. return
  478. }
  479. if (!sendFlag) {
  480. sendFlag = true;
  481. } else {
  482. return
  483. }
  484. var url = sendSmsUrl;
  485. var data = $.extend(true, CAPTCHA_CHECK_DATA, prevData)
  486. var t = 60;
  487. sendBtn.innerHTML = t + " s";
  488. sendBtn.disabled = true;
  489. sendRequest({
  490. url: url,
  491. type: "POST",
  492. data: data,
  493. contentType: "json",
  494. success: function (res) {
  495. sendFlag = false;
  496. if (res.result == 1) {
  497. mui.toast("发送成功");
  498. var interval = setInterval(function () {
  499. if (t == 0) {
  500. sendBtn.innerHTML = "重新获取";
  501. sendBtn.disabled = false;
  502. clearInterval(interval);
  503. } else {
  504. t -= 1;
  505. sendBtn.innerHTML = t + " s";
  506. sendBtn.disabled = true;
  507. }
  508. }, 1000);
  509. } else {
  510. mui.toast(res.description);
  511. }
  512. }
  513. });
  514. })
  515. }