xyf.common.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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. 'zhenguduo': false,
  183. 'batteryManager': false,
  184. 'templateManager': false,
  185. 'apiManager': false,
  186. 'disableAdManager': false,
  187. },
  188. }
  189. // 获取主菜单
  190. function getAccountPermission(callback) {
  191. // 由于 getAccountPermission 这个接口在主页连续调用了两次,还是需要缓存(2秒超时即可)
  192. var menuData = getSessionStorage("ACCOUNT_MENU")
  193. if (menuData) {
  194. if (callback) {
  195. callback(menuData)
  196. }
  197. return
  198. }
  199. sendRequest({
  200. url: "/dealer/getAccountPermission",
  201. type: "GET",
  202. data: null,
  203. mask: "加载菜单...",
  204. success: function (response) {
  205. var payload = response.payload;
  206. let obj = $.extend(true, {}, defaultPermission, payload)
  207. if (callback) {
  208. callback(obj)
  209. }
  210. setSessionStorage("ACCOUNT_MENU", obj, 1000);//1秒失效
  211. },
  212. error: function () {
  213. callback(defaultPermission)
  214. }
  215. });
  216. }
  217. //生成二维码
  218. function getQRCodeImageData(text, label, option) {
  219. option = $.extend({
  220. labelHeight: 30,
  221. size: 200,
  222. labelFontStyle: "bold 24px Arial",// 使用粗体,稍大的字号,否则打印出来的不清晰
  223. }, option)
  224. var logoSize = 40;
  225. //生成二维码
  226. var qrDom = $("<div></div>");
  227. qrDom.qrcode({
  228. render: "canvas", // 渲染方式有table方式(IE兼容)和canvas方式
  229. width: option.size, //宽度
  230. height: option.size, //高度
  231. text: text, // 二维码的内容
  232. typeNumber: -1,//计算模式
  233. correctLevel: 2,//二维码纠错级别
  234. background: "#ffffff",//背景颜色
  235. foreground: "#000000" //二维码颜色
  236. });
  237. var canvas = qrDom.find("canvas")[0];
  238. var context = canvas.getContext("2d");
  239. var imgData = context.getImageData(0, 0, option.size, option.size);//获取到二维码图片数据流
  240. //生成背景(用来绘制标签、背景图等)
  241. var backDom = $("<canvas></canvas>");
  242. var maxW = option.size;
  243. var maxH = option.size + option.labelHeight;
  244. var left = 0;
  245. var top = 0;
  246. backDom.attr({"width": maxW, "height": maxH});
  247. var backCanvas = backDom[0];
  248. var ctx = backCanvas.getContext("2d");
  249. //填充背景为白色
  250. ctx.fillStyle = "#fff";
  251. ctx.fillRect(0, 0, maxW, maxH);
  252. ctx.putImageData(imgData, left, top);//合并二维码到带背景信息的画布
  253. //绘制标题
  254. ctx.font = option.labelFontStyle;
  255. ctx.textAlign = "center";
  256. ctx.fillStyle = "#000";
  257. if (label) {
  258. ctx.fillText(label, option.size / 2 + left, (option.size + option.labelHeight - 8) + top);
  259. }
  260. //绘制logo
  261. var needLogo = false;//logo有跨域的问题 暂时不要
  262. if (needLogo) {
  263. var logoBorder = 4;
  264. var centerSize = 2 * logoBorder + logoSize;
  265. //清空中心区域用来绘制logo
  266. ctx.rect((option.size - centerSize) / 2 + left, (option.size - centerSize) / 2 + top, centerSize, centerSize);
  267. ctx.fillStyle = "#fff";
  268. ctx.fill();
  269. //logo图片
  270. ctx.drawImage($("#logoPic")[0], (option.size - logoSize) / 2 + left, (option.size - logoSize) / 2 + top, logoSize, logoSize);
  271. }
  272. var dataURL = backCanvas.toDataURL("image/png");
  273. return dataURL;
  274. }
  275. // 渲染菜单,并修复多余的底边
  276. function menuPermission(rowCcount) {
  277. rowCcount = rowCcount || 2
  278. $(".index-bd .menu-block").each(function () {
  279. var cellDom = $(this).find(".row-cell");
  280. // 偶数则去除倒数1、2的底边
  281. var len = cellDom.length;
  282. var lastLen = (len % rowCcount) || rowCcount;// 取模,最后一行的个数,如果为0,则用rowCcount
  283. for (var i = 0; i < len; i++) {
  284. if ((i + 1) % rowCcount === 0) {
  285. //右边菜单
  286. cellDom.eq(i).addClass('border-bottom ');
  287. } else {
  288. cellDom.eq(i).addClass('border-bottom border-right');
  289. }
  290. // 最后一行去除底边
  291. if (len - i <= lastLen) {
  292. cellDom.eq(i).removeClass("border-bottom");
  293. }
  294. }
  295. });
  296. }
  297. function renderNav(opt, nowKey, callback) {
  298. var html = $('<nav class="mui-bar mui-bar-tab" id="main-nav"></nav>')
  299. for (var index = 0; index < opt.length; index++) {
  300. var item = opt[index];
  301. if (item.show === false) {
  302. continue
  303. }
  304. var itemHtml = $('<a class="mui-tab-item">' +
  305. '<span class="mui-icon iconfont "></span>' +
  306. '<span class="mui-tab-label">' + item.name + '</span>' +
  307. '</a>')
  308. var icon = ''
  309. if (nowKey === item.key) {
  310. itemHtml.addClass('mui-active')
  311. icon = item.iconFill
  312. } else {
  313. icon = item.icon
  314. itemHtml.attr('nav-href', item.href)
  315. }
  316. itemHtml.find('.iconfont').addClass(icon)
  317. if (item.iconStyle) {
  318. itemHtml.find('.iconfont').css(item.iconStyle)
  319. }
  320. html.append(itemHtml)
  321. }
  322. $('body').append(html)
  323. $('#main-nav').off().on('tap', '.mui-tab-item[nav-href]', function () {
  324. goPage($(this).attr("nav-href"));// 此处必须使用goPage,如果replacePage,会导致IOS|微信的扫码鉴权失败!
  325. });
  326. if (callback) {
  327. callback()
  328. }
  329. }
  330. function initDealerNav(nowKey, callback) {
  331. var opt = [
  332. {
  333. name: '首页',
  334. key: "home",
  335. icon: 'icon-home',
  336. iconFill: 'icon-homefill',
  337. href: 'index.html'
  338. }, {
  339. name: '经营',
  340. key: "business_stats",
  341. icon: 'icon-recharge',
  342. iconFill: 'icon-rechargefill',
  343. href: 'income.html'
  344. }, {
  345. name: '设备',
  346. key: "device_management",
  347. icon: 'icon-deviceo',
  348. iconFill: 'icon-device',
  349. iconStyle: {
  350. // 图标有点大 稍微缩小下
  351. 'font-size': '22px',
  352. 'line-height': '24px'
  353. },
  354. href: 'device-mgr.html'
  355. }, {
  356. name: '我的',
  357. key: "account",
  358. icon: 'icon-account',
  359. iconFill: 'icon-accountfill',
  360. href: 'account-setting.html'
  361. }
  362. ]
  363. getAccountPermission(function (subPayload) {
  364. var mainMenu = subPayload.mainMenu
  365. var role = subPayload.role
  366. if (role === "subaccount") {
  367. if (mainMenu.business_stats === false) {
  368. opt[1].show = false
  369. }
  370. if (mainMenu.device_management === false) {
  371. opt[2].show = false
  372. }
  373. }
  374. renderNav(opt, nowKey, callback)
  375. })
  376. }
  377. function initAgentNav(nowKey, callback) {
  378. var opt = [
  379. {
  380. name: '首页',
  381. key: "home",
  382. icon: 'icon-home',
  383. iconFill: 'icon-homefill',
  384. href: 'index.html'
  385. }, {
  386. name: '收益',
  387. key: "business_stats",
  388. icon: 'icon-recharge',
  389. iconFill: 'icon-rechargefill',
  390. href: 'agent-income.html'
  391. }, {
  392. name: '经销商',
  393. key: "dealer_management",
  394. icon: 'icon-group',
  395. iconFill: 'icon-group_fill',
  396. href: 'customer-mgr.html'
  397. }, {
  398. name: '我的',
  399. key: "account",
  400. icon: 'icon-account',
  401. iconFill: 'icon-accountfill',
  402. href: 'account-setting.html'
  403. }
  404. ]
  405. renderNav(opt, nowKey, callback)
  406. }
  407. function mqtt_push_set_up() {
  408. }
  409. var CAPTCHA_CHECK_DATA = null
  410. /***
  411. * 初始化验证码组件配置
  412. * @param checkType 类型
  413. * @param prevDataCheck 短信验证码发送按钮的前置条件验证
  414. * @param sendSmsUrl
  415. */
  416. function initCheck(checkType, prevDataCheck, sendSmsUrl) {
  417. var nc_token = ["FFFF0N000000000088F1", (new Date()).getTime(), Math.random()].join(':');
  418. var nc = NoCaptcha.init({
  419. //声明滑动验证需要渲染的目标元素ID。
  420. renderTo: '#captcha',
  421. //应用类型标识。它和使用场景标识(scene字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。
  422. appkey: 'FFFF0N000000000088F1',
  423. //使用场景标识。它和应用类型标识(appkey字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的scene值,请务必正确填写。
  424. scene: 'nc_message_h5 ',
  425. //滑动验证码的主键,请勿将该字段定义为固定值。确保每个用户每次打开页面时,其token值都是不同的。系统默认的格式为:”您的appkey”+”时间戳”+”随机数”。
  426. token: nc_token,
  427. //业务键字段,可为空。为便于线上问题的排查,建议您按照线上问题定位文档中推荐的方法配置该字段值。
  428. trans: {"key1": "code0"},
  429. //语言,默认值为cn(中文)。HTML5应用类型默认支持简体中文、繁体中文、英文语言。
  430. language: "cn",
  431. //内部网络请求的超时时间。一般情况建议保持默认值(10000ms)。
  432. timeout: 10000,
  433. //允许服务器超时重复次数,默认5次。
  434. retryTimes: 5,
  435. //验证通过后,验证码组件是否自动隐藏,默认不隐藏(false)。
  436. bannerHidden: false,
  437. //是否默认不渲染,默认值false。当设置为true时,不自动渲染,需要自行调用show方法进行渲染。
  438. initHidden: false,
  439. //前端滑动验证通过时会触发该回调参数。您可以在该回调参数中将请求标识(token)、会话ID(sessionid)、签名串(sig)字段记录下来,随业务请求一同发送至您的服务端调用验签。
  440. callback: function (data) {
  441. CAPTCHA_CHECK_DATA = {
  442. nc_token: nc_token,
  443. csessionid: data.csessionid,
  444. sig: data.sig,
  445. }
  446. },
  447. error: function (s) {
  448. }
  449. });
  450. NoCaptcha.setEnabled(true);
  451. //请务必在此处调用一次reset()方法。
  452. nc.reset();
  453. //用于配置滑动验证的自定义文案。详细信息,请参见自定义文案与多语言文档。
  454. NoCaptcha.upLang('cn', {
  455. //加载状态提示。
  456. 'LOADING': "加载中...",
  457. //等待滑动状态提示。
  458. 'SLIDER_LABEL': "请向右滑动验证",
  459. //验证通过状态提示。
  460. 'CHECK_Y': "验证通过",
  461. //验证失败触发拦截状态提示。
  462. 'ERROR_TITLE': "非常抱歉,这出错了..."
  463. });
  464. bindSendCode(prevDataCheck, sendSmsUrl)
  465. }
  466. var sendFlag = false;
  467. // 绑定发送验证码的按钮事件
  468. function bindSendCode(prevDataCheck, sendSmsUrl) {
  469. var sendBtn = document.getElementById('sendBtn');
  470. $("#sendBtn").on("click", function () {
  471. if (!CAPTCHA_CHECK_DATA) {
  472. return alert('请完成人机交互验证');
  473. }
  474. var prevData = prevDataCheck();
  475. if (!prevData) {
  476. return
  477. }
  478. if (!sendFlag) {
  479. sendFlag = true;
  480. } else {
  481. return
  482. }
  483. var url = sendSmsUrl;
  484. var data = $.extend(true, CAPTCHA_CHECK_DATA, prevData)
  485. var t = 60;
  486. sendBtn.innerHTML = t + " s";
  487. sendBtn.disabled = true;
  488. sendRequest({
  489. url: url,
  490. type: "POST",
  491. data: data,
  492. contentType: "json",
  493. success: function (res) {
  494. sendFlag = false;
  495. if (res.result == 1) {
  496. mui.toast("发送成功");
  497. var interval = setInterval(function () {
  498. if (t == 0) {
  499. sendBtn.innerHTML = "重新获取";
  500. sendBtn.disabled = false;
  501. clearInterval(interval);
  502. } else {
  503. t -= 1;
  504. sendBtn.innerHTML = t + " s";
  505. sendBtn.disabled = true;
  506. }
  507. }, 1000);
  508. } else {
  509. mui.toast(res.description);
  510. }
  511. }
  512. });
  513. })
  514. }