function sendRequestWithHeaders(url, type, headers, data, success, contentType, async, complete) { //可能直接传递option var optionIn = {}; var mask = null; var maskContainer = null; var maskDelay = null; if ($.isPlainObject(url)) { optionIn = url; url = optionIn.url; type = optionIn.type; data = optionIn.data; success = optionIn.success; contentType = optionIn.contentType; async = optionIn.async; complete = optionIn.complete mask = optionIn.mask; maskContainer = optionIn.maskContainer; maskDelay = optionIn.maskDelay; headers = optionIn.headers; } var options = { url: url, type: type, mask: mask, maskDelay: maskDelay, maskContainer: maskContainer, headers: headers, success: function (result) { if (success) { success(result); } }, dataType: 'json',//服务器返回数据类型 timeout: 60000, error: function (xhr) { if (xhr.status === 401) { window.mui && mui.toast('登录超时,即将跳转到登录页面...'); setTimeout(function () { var url = 'login.html'; goPage(url); }, 1500) } else { var title = "温馨提示"; var msg = '获取数据失败,请检查网络'; var btnword = '我知道了'; msgPopup(title, msg, btnword); } }, complete: function (result) { if (complete) { complete(result);//目前主要用于$("#progress").hide(); } } }; if (data) { if ((type.toUpperCase() == 'PUT' || type.toUpperCase() == 'POST') && contentType == "json" && $.isPlainObject(data)) { options.data = JSON.stringify(data); options.contentType = 'application/json';//发送给后台的数据类型 } else { options.data = data; } } if (typeof async != 'undefined') { options.async = async; } myAjax(options); } //设备注册、已注册设备查看、上分,等需要调用 function scanQRCodeToReg() { ScanResult(function (resultStr) { // 表示经销商扫描登录 if (resultStr.indexOf('app/qrcodeLg.html') > -1) { sendRequest({ url: "/dealer/scanLogin?url=" + resultStr, type: "GET", success: function (response) { if (response.result === 1) { window.mui && mui.toast('PC端登录成功'); } else { alert(response.description); } } }); } // 扫码,给别人授权。 然后需要在授权人管理列表中 配置权限,别人才有操作权限。 else if (resultStr.indexOf('dealer/toAuth') > -1) { mui.confirm('您确定要把您的账号权限开放给这个用户?', '授权提示', ['取消', '确认'], function (e) { if (e.index == 1) { sendRequest({ url: "/dealer/toOtherDealerAuth?url=" + encodeURIComponent(resultStr), type: "GET", success: function (response) { if (response.result === 1) { window.mui && mui.toast('您已成功授权给申请授权人'); } else { alert(response.description); } } }); } }); } else { var url = "/dealer/index.html#/deviceReg?uniqueCode=" +resultStr; goPage(url); } }); } $(function () { function tip(that) { var tipsDom; if ($(that).hasClass("tips")) { tipsDom = $(that) } else { tipsDom = $(that).find(".tips") } var tipsText = tipsDom.attr("title"); var tipsTitle = tipsDom.attr("tip-title"); var tipsBtn = tipsDom.attr("tip-btn"); if (mui) { mui.confirm(tipsText, tipsTitle || '说明', [tipsBtn || '好的'], function (e) { }); } else { confirm(tipsText); } } // 提示信息事件绑定 $("body").on("click", ".tips-event", function (evt) { evt.stopPropagation(); tip(this); }); $("body").on("tap", ".tips-event-tap", function (evt) { evt.stopPropagation(); tip(this); }); }); // 获取特性列表 function getFeatureList(role, option, callback) { var opt = { url: "/" + role + "/getFeatureList", type: "POST", mask: "加载配置...", contentType: "json", data: {list: option.list}, success: function (response) { if (response.result === 1) { if (callback) { var payload = response.payload; callback(payload); } } } } if(role==='test'){ opt.headers = get_token_headers("Tester") } sendRequest(opt); } var defaultPermission = { "homepageData": { "today_income": true, "today_pay_income": true, "today_ad_income": false, "offline_coins": false }, mainMenu: { 'device_reg': true, 'device_management': true, 'business_stats': true, 'stock_management': false, 'order_query': true, 'remote_upper': true, 'payoff_recharge': true, 'user_management': true, 'marketing': true, 'payoff_activity': true, 'card_management': true, 'sim_card': true, 'interconnection': false, 'user_feedback': true, 'support_alarm': false, 'user_identify': false, 'zhenguduo': false, 'batteryManager': false, 'templateManager': false, 'apiManager': false, 'disableAdManager': false, }, } // 获取主菜单 function getAccountPermission(callback) { // 由于 getAccountPermission 这个接口在主页连续调用了两次,还是需要缓存(2秒超时即可) var menuData = getSessionStorage("ACCOUNT_MENU") if (menuData) { if (callback) { callback(menuData) } return } sendRequest({ url: "/dealer/getAccountPermission", type: "GET", data: null, mask: "加载菜单...", success: function (response) { var payload = response.payload; let obj = $.extend(true, {}, defaultPermission, payload) if (callback) { callback(obj) } setSessionStorage("ACCOUNT_MENU", obj, 1000);//1秒失效 }, error: function () { callback(defaultPermission) } }); } //生成二维码 function getQRCodeImageData(text, label, option) { option = $.extend({ labelHeight: 30, size: 200, labelFontStyle: "bold 24px Arial",// 使用粗体,稍大的字号,否则打印出来的不清晰 }, option) var logoSize = 40; //生成二维码 var qrDom = $("
"); qrDom.qrcode({ render: "canvas", // 渲染方式有table方式(IE兼容)和canvas方式 width: option.size, //宽度 height: option.size, //高度 text: text, // 二维码的内容 typeNumber: -1,//计算模式 correctLevel: 2,//二维码纠错级别 background: "#ffffff",//背景颜色 foreground: "#000000" //二维码颜色 }); var canvas = qrDom.find("canvas")[0]; var context = canvas.getContext("2d"); var imgData = context.getImageData(0, 0, option.size, option.size);//获取到二维码图片数据流 //生成背景(用来绘制标签、背景图等) var backDom = $(""); var maxW = option.size; var maxH = option.size + option.labelHeight; var left = 0; var top = 0; backDom.attr({"width": maxW, "height": maxH}); var backCanvas = backDom[0]; var ctx = backCanvas.getContext("2d"); //填充背景为白色 ctx.fillStyle = "#fff"; ctx.fillRect(0, 0, maxW, maxH); ctx.putImageData(imgData, left, top);//合并二维码到带背景信息的画布 //绘制标题 ctx.font = option.labelFontStyle; ctx.textAlign = "center"; ctx.fillStyle = "#000"; if (label) { ctx.fillText(label, option.size / 2 + left, (option.size + option.labelHeight - 8) + top); } //绘制logo var needLogo = false;//logo有跨域的问题 暂时不要 if (needLogo) { var logoBorder = 4; var centerSize = 2 * logoBorder + logoSize; //清空中心区域用来绘制logo ctx.rect((option.size - centerSize) / 2 + left, (option.size - centerSize) / 2 + top, centerSize, centerSize); ctx.fillStyle = "#fff"; ctx.fill(); //logo图片 ctx.drawImage($("#logoPic")[0], (option.size - logoSize) / 2 + left, (option.size - logoSize) / 2 + top, logoSize, logoSize); } var dataURL = backCanvas.toDataURL("image/png"); return dataURL; } // 渲染菜单,并修复多余的底边 function menuPermission(rowCcount) { rowCcount = rowCcount || 2 $(".index-bd .menu-block").each(function () { var cellDom = $(this).find(".row-cell"); // 偶数则去除倒数1、2的底边 var len = cellDom.length; var lastLen = (len % rowCcount) || rowCcount;// 取模,最后一行的个数,如果为0,则用rowCcount for (var i = 0; i < len; i++) { if ((i + 1) % rowCcount === 0) { //右边菜单 cellDom.eq(i).addClass('border-bottom '); } else { cellDom.eq(i).addClass('border-bottom border-right'); } // 最后一行去除底边 if (len - i <= lastLen) { cellDom.eq(i).removeClass("border-bottom"); } } }); } function renderNav(opt, nowKey, callback) { var html = $('') for (var index = 0; index < opt.length; index++) { var item = opt[index]; if (item.show === false) { continue } var itemHtml = $('' + '' + '' + item.name + '' + '') var icon = '' if (nowKey === item.key) { itemHtml.addClass('mui-active') icon = item.iconFill } else { icon = item.icon itemHtml.attr('nav-href', item.href) } itemHtml.find('.iconfont').addClass(icon) if (item.iconStyle) { itemHtml.find('.iconfont').css(item.iconStyle) } html.append(itemHtml) } $('body').append(html) $('#main-nav').off().on('tap', '.mui-tab-item[nav-href]', function () { goPage($(this).attr("nav-href"));// 此处必须使用goPage,如果replacePage,会导致IOS|微信的扫码鉴权失败! }); if (callback) { callback() } } function initDealerNav(nowKey, callback) { var opt = [ { name: '首页', key: "home", icon: 'icon-home', iconFill: 'icon-homefill', href: 'index.html' }, { name: '经营', key: "business_stats", icon: 'icon-recharge', iconFill: 'icon-rechargefill', href: 'income.html' }, { name: '设备', key: "device_management", icon: 'icon-deviceo', iconFill: 'icon-device', iconStyle: { // 图标有点大 稍微缩小下 'font-size': '22px', 'line-height': '24px' }, href: 'device-mgr.html' }, { name: '我的', key: "account", icon: 'icon-account', iconFill: 'icon-accountfill', href: 'account-setting.html' } ] getAccountPermission(function (subPayload) { var mainMenu = subPayload.mainMenu var role = subPayload.role if (role === "subaccount") { if (mainMenu.business_stats === false) { opt[1].show = false } if (mainMenu.device_management === false) { opt[2].show = false } } renderNav(opt, nowKey, callback) }) } function initAgentNav(nowKey, callback) { var opt = [ { name: '首页', key: "home", icon: 'icon-home', iconFill: 'icon-homefill', href: 'index.html' }, { name: '收益', key: "business_stats", icon: 'icon-recharge', iconFill: 'icon-rechargefill', href: 'agent-income.html' }, { name: '经销商', key: "dealer_management", icon: 'icon-group', iconFill: 'icon-group_fill', href: 'customer-mgr.html' }, { name: '我的', key: "account", icon: 'icon-account', iconFill: 'icon-accountfill', href: 'account-setting.html' } ] renderNav(opt, nowKey, callback) } function mqtt_push_set_up() { } var CAPTCHA_CHECK_DATA = null /*** * 初始化验证码组件配置 * @param checkType 类型 * @param prevDataCheck 短信验证码发送按钮的前置条件验证 * @param sendSmsUrl */ function initCheck(checkType, prevDataCheck, sendSmsUrl) { var nc_token = ["FFFF0N000000000088F1", (new Date()).getTime(), Math.random()].join(':'); var nc = NoCaptcha.init({ //声明滑动验证需要渲染的目标元素ID。 renderTo: '#captcha', //应用类型标识。它和使用场景标识(scene字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。 appkey: 'FFFF0N000000000088F1', //使用场景标识。它和应用类型标识(appkey字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的scene值,请务必正确填写。 scene: 'nc_message_h5 ', //滑动验证码的主键,请勿将该字段定义为固定值。确保每个用户每次打开页面时,其token值都是不同的。系统默认的格式为:”您的appkey”+”时间戳”+”随机数”。 token: nc_token, //业务键字段,可为空。为便于线上问题的排查,建议您按照线上问题定位文档中推荐的方法配置该字段值。 trans: {"key1": "code0"}, //语言,默认值为cn(中文)。HTML5应用类型默认支持简体中文、繁体中文、英文语言。 language: "cn", //内部网络请求的超时时间。一般情况建议保持默认值(10000ms)。 timeout: 10000, //允许服务器超时重复次数,默认5次。 retryTimes: 5, //验证通过后,验证码组件是否自动隐藏,默认不隐藏(false)。 bannerHidden: false, //是否默认不渲染,默认值false。当设置为true时,不自动渲染,需要自行调用show方法进行渲染。 initHidden: false, //前端滑动验证通过时会触发该回调参数。您可以在该回调参数中将请求标识(token)、会话ID(sessionid)、签名串(sig)字段记录下来,随业务请求一同发送至您的服务端调用验签。 callback: function (data) { CAPTCHA_CHECK_DATA = { nc_token: nc_token, csessionid: data.csessionid, sig: data.sig, } }, error: function (s) { } }); NoCaptcha.setEnabled(true); //请务必在此处调用一次reset()方法。 nc.reset(); //用于配置滑动验证的自定义文案。详细信息,请参见自定义文案与多语言文档。 NoCaptcha.upLang('cn', { //加载状态提示。 'LOADING': "加载中...", //等待滑动状态提示。 'SLIDER_LABEL': "请向右滑动验证", //验证通过状态提示。 'CHECK_Y': "验证通过", //验证失败触发拦截状态提示。 'ERROR_TITLE': "非常抱歉,这出错了..." }); bindSendCode(prevDataCheck, sendSmsUrl) } var sendFlag = false; // 绑定发送验证码的按钮事件 function bindSendCode(prevDataCheck, sendSmsUrl) { var sendBtn = document.getElementById('sendBtn'); $("#sendBtn").on("click", function () { if (!CAPTCHA_CHECK_DATA) { return alert('请完成人机交互验证'); } var prevData = prevDataCheck(); if (!prevData) { return } if (!sendFlag) { sendFlag = true; } else { return } var url = sendSmsUrl; var data = $.extend(true, CAPTCHA_CHECK_DATA, prevData) var t = 60; sendBtn.innerHTML = t + " s"; sendBtn.disabled = true; sendRequest({ url: url, type: "POST", data: data, contentType: "json", success: function (res) { sendFlag = false; if (res.result == 1) { mui.toast("发送成功"); var interval = setInterval(function () { if (t == 0) { sendBtn.innerHTML = "重新获取"; sendBtn.disabled = false; clearInterval(interval); } else { t -= 1; sendBtn.innerHTML = t + " s"; sendBtn.disabled = true; } }, 1000); } else { mui.toast(res.description); } } }); }) }