//加载md5算法 (function($) { 'use strict'; /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF), msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /* * Bitwise rotate a 32-bit number to the left. */ function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } /* * These functions implement the four basic operations the algorithm uses. */ function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } /* * Calculate the MD5 of an array of little-endian words, and a bit length. */ function binl_md5(x, len) { /* append padding */ x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var i, olda, oldb, oldc, oldd, a = 1732584193, b = -271733879, c = -1732584194, d = 271733878; for (i = 0; i < x.length; i += 16) { olda = a; oldb = b; oldc = c; oldd = d; a = md5_ff(a, b, c, d, x[i], 7, -680876936); d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); b = md5_gg(b, c, d, a, x[i], 20, -373897302); a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); d = md5_hh(d, a, b, c, x[i], 11, -358537222); c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i], 6, -198630844); d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return [a, b, c, d]; } /* * Convert an array of little-endian words to a string */ function binl2rstr(input) { var i, output = ''; for (i = 0; i < input.length * 32; i += 8) { output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); } return output; } /* * Convert a raw string to an array of little-endian words * Characters >255 have their high-byte silently ignored. */ function rstr2binl(input) { var i, output = []; output[(input.length >> 2) - 1] = undefined; for (i = 0; i < output.length; i += 1) { output[i] = 0; } for (i = 0; i < input.length * 8; i += 8) { output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); } return output; } /* * Calculate the MD5 of a raw string */ function rstr_md5(s) { return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); } /* * Calculate the HMAC-MD5, of a key and some data (raw strings) */ function rstr_hmac_md5(key, data) { var i, bkey = rstr2binl(key), ipad = [], opad = [], hash; ipad[15] = opad[15] = undefined; if (bkey.length > 16) { bkey = binl_md5(bkey, key.length * 8); } for (i = 0; i < 16; i += 1) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); } /* * Convert a raw string to a hex string */ function rstr2hex(input) { var hex_tab = '0123456789abcdef', output = '', x, i; for (i = 0; i < input.length; i += 1) { x = input.charCodeAt(i); output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F); } return output; } /* * Encode a string as utf-8 */ function str2rstr_utf8(input) { return unescape(encodeURIComponent(input)); } /* * Take string arguments and return either raw or hex encoded strings */ function raw_md5(s) { return rstr_md5(str2rstr_utf8(s)); } function hex_md5(s) { return rstr2hex(raw_md5(s)); } function raw_hmac_md5(k, d) { return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)); } function hex_hmac_md5(k, d) { return rstr2hex(raw_hmac_md5(k, d)); } $.md5 = function(string, key, raw) { if (!key) { if (!raw) { return hex_md5(string); } else { return raw_md5(string); } } if (!raw) { return hex_hmac_md5(key, string); } else { return raw_hmac_md5(key, string); } }; }(typeof jQuery === 'function' ? jQuery : this)); var Global = { ICON_HINT: 0, ICON_ERROR: 2, ICON_ASK: 3, ICON_LOCK: 4, ICON_OK: 1, ICON_LOADING: 16, hRate: 1, wRate: 1, _autoLayoutFunc: null, //页面初始化事件。主要处理元素自适应布局。 RegAutoLayoutFunc: function(func) { this._autoLayoutFunc = func; //注册事件后,立即执行一次 func(); }, uiWidth: 1920, ////UI设计稿高度 uiHeight: 1080, //UI设计稿宽度 //自增序列值。通过GetSeqNext获取新的值 _seqvalue: (new Date().getTime() + '').substring(0, 10), params: {}, AccessUrl: "", Absolute_path: "/home/go/project/platform_service/", //绝对路径 //初始化接口地址 InitAccessUrl: function() { if (window.location.hostname == "www.jujutong.cloud" || window.location.hostname == "police-s.jujutong.cloud" || window.location.hostname == "police-o.jujutong.cloud") { //正式云平台 this.AccessUrl = "http://www.jujutong.cloud:18010/"; this.params.authorityUrl = "/login.html"; } else if (window.location.hostname == "127.0.0.1" || window.location.hostname == "localhost") { //开发环境 this.AccessUrl = window.location.protocol + "//" + window.location.host; this.params.authorityUrl = "/static/login.html"; } else { //无效的访问 this.AccessUrl = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port + "/"; this.params.authorityUrl = "/static/login.html"; } }, InitRootFontSize: function() { var contentHeight = $(window).height(); var contentWidth = $(window).width(); hRate = contentHeight / (this.uiHeight == null ? 1080 : this.uiHeight); wRate = contentWidth / (this.uiWidth == null ? 1920 : this.uiWidth); $("html").css("font-size", (12 * wRate) + "px"); }, RandomString: function(e) { e = e || 32; var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", a = t.length, n = ""; for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a)); return n; }, InitAjaxSetup: function() { if (typeof $ === 'undefined') return; var randomString = function(e) { e = e || 32; var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", a = t.length, n = ""; for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a)); return n; }; var token = "", role = ""; token = $.trim(localStorage.getItem("sessionid")); var userinfo = JSON.parse(localStorage.getItem("userinfo")); var permission = ["all"]; if (userinfo != null && userinfo.role != 1) { permission = []; var funcs = userinfo["funcs"]; for (var i = 0; i < (funcs == null ? 0 : funcs.length); i++) { var item = funcs[i]; permission.push(item["code"]); } } Global.params = { authorityUrl: "/static/login.html", token: token, roles: userinfo != null ? userinfo.role : "", permission: permission.join(","), rootorg: "", "userinfo": userinfo, "enable_module": '' }; this.accessControl(); $.ajaxSetup({ beforeSend: function(jqXHR, settings) { if (settings.url.indexOf("/api/") > -1) { var now = new Date().getTime(); var nonce = now + randomString(6); var postdata = (settings.multipart != null || settings.multipart == true) ? "" : $.trim(settings.data); var getparam = settings.url.split("?"); var getdata = getparam.length == 0 ? "" : $.trim(getparam[1]); var signparam = postdata == "" ? getdata : postdata + (getdata != "" ? ("&" + getdata) : ""); signparam = (($.trim(signparam) != "" ? signparam + "&" : "") + "auth_nonce=" + nonce + "&auth_time=" + now).split("&").sort().join("&"); signparam = signparam.replace(/\+/gi, "%20"); signparam = decodeURIComponent(signparam); jqXHR.setRequestHeader("auth_time", now); jqXHR.setRequestHeader("auth_nonce", nonce); jqXHR.setRequestHeader("sign", $.md5(signparam)); //console.log(signparam); } }, complete: function(jqXHR, textStatus) { //请求完成处理 }, statusCode: { 401: function() { //跳转到认证页面 if (Global.params.authorityUrl) { //localStorage.removeItem("sessionid"); //localStorage.removeItem("userinfo"); window.location.href = Global.params.authorityUrl; } }, 403: function() { //跳转到认证页面 if (Global.params.authorityUrl) { window.location.href = Global.params.authorityUrl; } }, 450: function() { //跳转到登录页面 if (Global.params.authorityUrl) { window.location.href = "/static/login.html"; } } }, headers: { Authorization: 'Bearer ' + Global.params['token'] }, timeout: (1000 * 60 * 5) }); }, //保持登录。token自动刷新。在需要一直运行的界面上初始化时调用该方法 KeepAlive: function() { setInterval(function() { $.post("/api/keep-alive"); }, 1000 * 60); }, get: function(key) { if (this.params.hasOwnProperty(key)) { return this.params[key]; } return null; }, accessControl: function($targetEle) { //禁用未启用的模块 var modulelist = $.trim(Global.get("enable_module")); if (modulelist != '') { modulelist = JSON.parse(modulelist); for (var k in modulelist) { var m = modulelist[k].m, v = modulelist[k].v; if (v != null && (v == 0 || v == '0' || v == false)) { $("li[access-code='" + m + "']").remove(); } } } //根据当前用户的权限进行操作控制 var permissionlist = Global.get("permission"); if (permissionlist == "all") { $("#m_ver_menu li[access-code='pl_init']").remove(); $("#m_ver_menu li[access-code!='pl_init']").removeClass('hidden'); return; //超级管理员 } if (permissionlist == "pl_init") { $("#m_ver_menu li[access-code!='pl_init']").remove(); $("#m_ver_menu li[access-code='pl_init']").removeClass('hidden').find('a').trigger('click'); return; } permissionlist = "," + permissionlist + ","; var needControlEle = $targetEle != null ? $targetEle.find(".accessControl") : $(".accessControl"); //获取需要权限控制的元素 //业务权限控制 //需要进行权限控制的元素均添加class:accessControl,并通过access-code属性设置权限代码,权限代码格式: //pl_MODEL_XXX:MODEL表示模块编码,如pl_deptstaff;XXX表示业务操作代码,如exp表示导出。 $.each(needControlEle, function(ind, e) { var item = $(e), code = $.trim(item.attr('access-code')); if (code != '') { code = "," + code + ","; if (permissionlist.indexOf(code) == -1) { item.remove(); } else { item.removeClass('hidden'); } } }); }, ToTreeData: function(data, childrenArrayName) { if (childrenArrayName == null || childrenArrayName == "") childrenArrayName = "children"; if (data == null) return []; // 删除 所有 children,以防止多次调用 data.forEach(function(item) { if (childrenArrayName == null) delete item.children; else delete item[childrenArrayName]; }); // 将数据存储为 以 id 为 KEY 的 map 索引数据列 var map = {}; data.forEach(function(item) { map[item.id] = item; }); var val = []; data.forEach(function(item) { // 以当前遍历项,的pid,去map对象中找到索引的id var parent = map[item.pid]; if (parent && item.id != item.pid) { (parent[childrenArrayName] || (parent[childrenArrayName] = [])).push(item); } else { val.push(item); } }); return val; }, //创建zTree的异步树,页面上需要引用以下js和css // // //$ele:显示树节点的元素对象 //opt:初始配置项.{url:"接口地址","idKey":"","pidKey":"","nameKey":"","rootid":"","rootpid":"",callback:{}} Ztree: { zTreeObj: null, Init: function($ele, opt) { opt = opt || { callback: {} }; opt.callback = opt.callback || {}; // zTree 的参数配置,深入使用请参考 API 文档(setting 配置详解) var zTreeSetting = { check: opt.check || { enable: false, chkStyle: "radio", radioType: "level" }, data: { key: { name: opt.nameKey || "title", children: "children" }, simpleData: { enable: true, idKey: opt.idKey || "id", pIdKey: opt.pidKey || "pid", rootPId: opt.rootpid || 0 } }, usericon: { // 折叠icon OPEN: "open fa ftopen fa-folder-open", // 打开文件图标 CLOSE: "close fa ftclose fa-folder", // 折叠文件图标 OPENDK: 'open icon-folder ace-icon tree-minus', // 打开状态图标 CLOSEZD: 'close icon-folder ace-icon tree-plus', // 折叠状态图标 DOCU: "docu", // 子节点图标 CHILDRENNODE: "fa-bookmark", // 复选框图标 UNFACHECK: "fa fa-check", FACHECKED: "fa fa-times", // 编辑图标 EDIT: "fa-pencil-square-o", // 移除图标 REMOVE: "fa-eraser", // 增加节点图标 ADDNODE: "fa-plus-square" }, async: { enable: true, dataType: "text", type: "get", url: opt.url, autoParam: [opt.idKey || "id", opt.pidKey || "pid"].concat(opt.AjaxParam || []), dataFilter: opt.callback.dataFilter || function(treeId, parentNode, childNodes) { for (var i = 0; i < childNodes["data"].length; i++) { childNodes["data"][i]["checked"] = parentNode.checked; } return childNodes["data"]; } }, callback: opt.callback, view: { fontCss: opt.FontCss || null, showTitle: false, selectedMulti: false, expandSpeed: "", showLine: false, addDiyDom: opt.DiyDom || null } }; zTreeSetting.usericon.CHILDRENNODE = $.trim(opt.childrenNodeIcon) == "" ? "fa-home" : opt.childrenNodeIcon; var initQueryParam = {}; initQueryParam[opt.idKey || "id"] = opt.rootid || ""; $.getJSON(opt.url, initQueryParam, function(result) { if (result["code"] == 0) { var treeData = result["data"]; Global.Ztree.zTreeObj = $.fn.zTree.init($ele, zTreeSetting, treeData); //让第一个父节点展开 var rootNode_0 = Global.Ztree.zTreeObj.getNodeByParam((opt.pidKey || "pid"), 0, null); Global.Ztree.zTreeObj.expandNode(rootNode_0, true, false, false, false); if (opt.callback != null && opt.callback.onInitLoad != null) { //初始化数据加载完成回调处理 opt.callback.onInitLoad(rootNode_0); } } }); } }, setModuleTitle: function(title) { $(".module_nav").html(title); }, GetFormData: function(filtername, form) { form = form || $(".layui-form[lay-filter='" + filtername + "']"); var datas = {}; form.find("input,select,textarea").each(function() { var t = $(this); var eleId = $.trim(t.attr("id")); if (eleId == "") return; if ("checkbox,radio".indexOf(t[0].type) > -1 && !t[0].checked) return; datas[eleId] = t.val(); if (t.attr("lay-verify") == "required" && t.parent().is(":visible") && datas[eleId] == "") { datas = null; layer.tips("此项为必填项!", t.parent()[0], { tips: [3, "red"] }); return false; } }); return datas; }, OpenDialog: function(container, set_margin_left) { var total_height = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); $(".clearn").show().css("height", total_height + "px"); container.css("z-index", Global.GetSeqNext()).show(); var left = parseInt(container.width() / 2); left = -left; var top = parseInt(container.height() / 2); top = -top; if (set_margin_left) { container.css({ "margin-left": left + "px", "margin-top": top + "px" }); } if (container.find("input").length > 0) container.find("input:first").focus(); }, CloseDialog: function(container) { if (container == null) $(".layout_dialog,.clearn").hide(); else { container.hide(); $(".clearn").hide(); } }, GetCurrentDate: function() { var date = new Date(); var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); return year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day); }, GetCurrentDateTime: function(type) { var date = new Date(), result = ""; var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); var hour = date.getHours(); result = year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day); if (type == "s") //一般为开始时间 result += " " + "00:00:00"; else if (type == "e")  //-般为结束时间 { date = date.setDate(date.getDate() + 1); date = new Date(date); year = date.getFullYear(); month = date.getMonth() + 1; day = date.getDate(); result = year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day); result += " 00:00:00"; } return result; }, FunctionControl: function() { var userInfo = localStorage.getItem("userinfo"); userInfo = JSON.parse(userInfo); $("#login_user_name").html(userInfo["name"]); if (userInfo["role"] != "1") { } }, //获取一个10位长度的序列值。每调用一次其值增加1 GetSeqNext: function() { this._seqvalue++; return this._seqvalue; }, //修改自己的登录密码 ModifyMyPwd: function() { layer.confirm("
请输入原密码
" + "
" + "
请填写新密码
" + "
" + "
请再次填写密码
" + "
", { "title": "修改密码" }, function(index) { var old = $.trim($("#modify_my_oldpwd").val()); if (old == "") { layer.msg("原密码不能为空!", {}); return false; } var v = $.trim($("#modify_my_pwd").val()); if (v == "") { layer.msg("新密码不能为空!", {}); return false; } if (v != $.trim($("#modify_my_pwd2").val())) { layer.msg("两次密码不一致!", {}); return false; } if (v.length < 6 || v.length > 16) { layer.msg("新密码长度无效!", {}); return; } $.post(Global.AccessUrl + "/api/resetUserPwd", { "newpwd": Tools.GetPassWord(v), "oldpwd": Tools.GetPassWord(old) }, function(result) { if (result["returncode"] == 200) { layer.msg("操作成功!"); } else { layer.msg("操作失败:" + result["msg"]); } }); }); } } Global["SCD_COMP_ATTR_CONST"] = { "ied.config_version": "配置版本", "ied.desc": "装置描述", "ied.manufacturer": "厂商", "ied.name": "装置名称", "ied.type": "装置类型", } function MqttClient(host, port, topics, callback) { var self = this; const options = { // 超时时间 connectTimeout: 4000, // 认证信息 clientId: 'police_s_js_' + new Date().getTime(), //username: "", //password: "", //$.md5(userinfo["account"] + userinfo["userid"]), // 心跳时间 keepalive: 30, clean: true, //离线时发送的topic /*will: { "topic": "", "payload": "offline", "QoS": 0, "retain": true }*/ } var WebSocket_URL = ""; if (port == null) port = "8083"; WebSocket_URL = 'ws://' + host + ':' + port + '/mqtt'; this.MqttClient = null; this.receivedFunList = []; this.connCallback = callback; this.Conn = function(host, port) { this.MqttClient = mqtt.connect(WebSocket_URL, options); this.MqttClient.on('connect', () => { console.log('连接成功'); if (self.connCallback != null) self.connCallback(); if (topics != null) { self.MqttClient.subscribe( topics, { qos: 0 }, (err) => { console.log(err || '订阅成功'); } ); } }); this.MqttClient.on('reconnect', (error) => { console.log('正在重连:', error) }); this.MqttClient.on('error', (error) => { console.log('连接失败:', error) }); this.MqttClient.on('offline', () => { console.log('连接断开') }); this.MqttClient.on('close', () => { console.log('已下线') }); // 监听接收消息事件 this.MqttClient.on('message', (topic, message) => { //console.log('收到来自', topic, '的消息', message.toString()); if (self.receivedFunList == null) return; for (var k in self.receivedFunList) { if (topic.indexOf(k) > -1) { if (self.receivedFunList[k] != null) self.receivedFunList[k](topic, message.toString()); } } }); } this.SubscribeTopic = function(topics) { this.MqttClient.subscribe( topics, { qos: 0 }, (err) => { console.log(err || '订阅成功'); } ); } this.AddReceivedMqttMessage = function(topic, callback) { this.receivedFunList[topic] = callback; } this.SendMqttMessage = function(topic, jsonmsg, callback) { this.MqttClient.publish(topic, jsonmsg, { qos: 0, rein: true }, (error) => { if (error != null) console.log(error) else { if (callback) callback(); } }) } if (host == null) { $.getJSON(Global.AccessUrl + "/api/getSysParamList", { "param_name": "Mqtt_JS_URL" }, function(r) { if (r.code != 0) { return; } if (r.data == null || r.data.length == 0) return; mqtturl = r.data[0].param_value; mqtturlPart = mqtturl.split(":"); WebSocket_URL = 'ws://' + mqtturl + '/mqtt'; self.Conn(mqtturlPart[0], mqtturlPart[1]); }) } else { this.Conn(host, port); } } var menuObject = { HrefUrl: function(url) { if (url == null || url == "") return false; $(".main-body").load(url, function(result) {}); } } var Tools = { html_encode: function(str) { var s = ""; if (str.length == 0) return ""; s = str.replace(/&/g, ">"); s = s.replace(//g, ">"); s = s.replace(/ /g, " "); s = s.replace(/\'/g, "'"); s = s.replace(/\"/g, """); s = s.replace(/\n/g, "
"); return s; }, GetPassWord: function(str) { var val = SmCrypto.doSm3AndSm2Encrypt(str) + "0000", ascCode = 0; for (var i = 0; i < str.length; i++) { ascCode = str.charCodeAt(i).toString(16); if (ascCode.length == 1) val += "00" + ascCode; else if (ascCode.length == 2) val += "0" + ascCode; else val += ascCode; } return val; }, BindTable: function(tableParameter) { var token = $.trim(localStorage.getItem("sessionid")); var token2 = "police-s-admin-" + Global.RandomString(11); tableParameter["headers"] = { "Authorization": "Bearer " + token, "auth_nonce": token2 }; if (!tableParameter.hasOwnProperty("method")) tableParameter["method"] = "get"; if (!tableParameter.hasOwnProperty("cellMinWidth")) tableParameter["cellMinWidth"] = 80; if (!tableParameter.hasOwnProperty("height")) { tableParameter["height"] = $(".main-body").height() - 140; } if (!tableParameter.hasOwnProperty("page")) { tableParameter["page"] = true; } if (!tableParameter.hasOwnProperty("limit")) { tableParameter["limit"] = 20; } if (!tableParameter.hasOwnProperty("loading")) { tableParameter["loading"] = true; } tableParameter["defaultToolbar"] = []; if (!tableParameter.hasOwnProperty("request")) { tableParameter["request"] = { pageName: 'pageindex', limitName: 'pagesize' }; } layui.use(['table'], function() { layui.table.render(tableParameter) }); }, GetOrgName: function(container, orgId, callback) { $.getJSON("/api/get_org_name", {}, function(rturnData) { if (rturnData["code"] == 0) { var data = rturnData["data"]; $.each(data, function(index, item) { if (orgId != null && orgId != "" && item.id == orgId) { container.append(new Option(item.name, item.id, false, true)); } else { container.append(new Option(item.name, item.id)); } }); layui.form.render("select"); if (callback != null && typeof(callback) === "function") { callback(data); } } }); }, //设置声音报警开关状态 SetAudioState: function(state) { window.localStorage.setItem("audio-alert", state); }, Loading2Ok: function(ele) { if (ele == null) return; ele.find(".layui-icon-loading-1").attr("class", "layui-icon layui-icon-ok-circle"); }, OkIcon: function(css) { var style = css != null ? css : "margin:0 1rem"; var icon = ""; return icon; }, LoadingIcon: function(css) { var style = css != null ? css : "margin:0 1rem"; var icon = ""; return icon; }, LoadingText: function(message, color) { var htmlObject = new Array(); htmlObject.push("
"); htmlObject.push(""); if (message != null && message != "") htmlObject.push("" + message + ""); else htmlObject.push("正在加载中..."); htmlObject.push("
"); return htmlObject.join(""); }, HintText: function(message, color) { var htmlObject = new Array(); htmlObject.push("
"); htmlObject.push(""); if (message != null && message != "") htmlObject.push("" + message + ""); else htmlObject.push("正在加载中..."); htmlObject.push("
"); return htmlObject.join(""); }, ShowBigImg: function(e, sizeW, sizeH) { var imgThis = $(e), src = $.trim(imgThis.attr("src")); if (src == "" || src.indexOf("imgerror.png") > -1 || src.indexOf("userhead.png") > -1) return; src = src.replace(/0\_small/gi, "_big").replace(/SNAP/gi, "BACKGROUND"); /*var showDiv = $("#imgBigShow"); if (sizeW == null) sizeW = 500; if (sizeH == null) sizeH = 500; if (showDiv.length == 0) { $("body").append("
X
"); showDiv = $("#imgBigShow"); } else { showDiv.find("a").attr("href", src).find("img").attr("src", src); } showDiv.removeClass("hide");*/ var ind = layui.layer.open({ type: 1, maxmin: true, resize: true, scrollbar: true, title: "查看原图", area: [1920 * 0.7 * wRate + "px", 1080 * 0.7 * hRate + "px"], content: "" }); $("#layui-layer" + ind).css("z-index", Global.GetSeqNext()); }, TransImgUrl: function(sourceSrc) { if (sourceSrc == null || sourceSrc == "") { return "/static/images/userhead.png"; } if (sourceSrc.indexOf("http") == 0) { return sourceSrc; } sourceSrc = sourceSrc.replace("/home/go/project/platform_service", ""); return Global.AccessUrl + sourceSrc; }, SortBy: function(attr, rev) { //第二个参数为true or false 若没有传递 默认升序排列 if (rev == undefined) { rev = 1; } else { rev = (rev) ? 1 : -1; } return function(a, b) { a = a[attr]; b = b[attr]; if (a < b) { return rev * -1; } if (a > b) { return rev * 1; } return 0; } }, AlertStart: function(ele) { function alertTable(t) { this.$t = $(t); this.border = "2"; var self = this; this.start = function() { if (this.$t.length == 0) { return; } setTimeout(function() { var trs = self.$t.find("tr[isnew='1']"); if (trs.length > 0) { self.border = self.border == "2" ? "0" : "2"; trs.css("border-bottom", self.border + "px solid red"); } self.start(); }, 500); } } var newa = new alertTable(ele); newa.start(); }, AlwaysTimer: function() { var time = new Date(); var year = time.getFullYear(); var month = time.getMonth() + 1; var date = time.getDate(); var hour = time.getHours(); var minutes = time.getMinutes(); var seconds = time.getSeconds(); month = month < 10 ? "0" + month : month; date = date < 10 ? "0" + date : date; if (hour < 10) { hour = "0" + hour; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } $(".yyyymmdd").html(year + "-" + month + "-" + date); $(".week").html(Tools.GetWeek()); $(".hour_minute").html(hour + ":" + minutes + ":" + seconds); setTimeout('Tools.AlwaysTimer()', 1000); }, GetWeek: function() { var time = new Date(); var day = time.getDay(); var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; return weeks[day]; }, PlayVideo: function(title, url, errorCall) { var tid = $.trim(localStorage.getItem("tid")); if (tid == "") { if (errorCall != null) errorCall(); } //获取本地是否安装播放客户端程序.未安装时采用web播放 $.getJSON(Global.AccessUrl + "/api/version/get_client", { "clientname": tid, "type": "ffplayer_client" }, function(d) { if (d.returncode == 200) { layer.msg("正在载入远程视频流...需要耐心等待一会(约12秒)", { icon: 6, time: 15000, skin: "tips_css" }); $.post(Global.AccessUrl + "/api/net/video/play", { "url": url, "title": title, "clientname": tid, }, function(r) { if (r.returncode != 200) { layer.msg(r.msg, { time: 3000, skin: "tips_css" }); return; } }); } else { if (errorCall != null) errorCall(); } }) }, ExpExcel: function(para) { layer.msg("正在导出数据中...", { timer: 0 }) $.post(Global.AccessUrl + "/api/expTableData", para, function(r) { layer.closeAll() if (r.code != 0) { DialogObject.Msg(r["msg"]); return; } else { layer.confirm("数据文件已生成完成,点击立即下载", { btn: ['关闭'], icon: 1, title: "数据导出", zIndex: Global.GetSeqNext(), btn1: function() { layer.closeAll() } }); } }) }, CopyTextData: function(e, txt) { //$(e).stopPropagation(); var textArea = document.createElement("textarea"); textArea.id = "tmp_copydata_input" textArea.style.position = 'fixed'; textArea.style.top = -1000; textArea.style.left = -1000; textArea.style.width = '2em'; textArea.style.height = '2em'; textArea.style.background = 'transparent'; textArea.value = txt; document.body.appendChild(textArea); textArea.select(); try { var successful = document.execCommand('copy'); var msg = successful ? '数据已成功复制到剪贴板' : '该浏览器不支持点击复制到剪贴板'; layer.msg(msg); $('#tmp_copydata_input').remove(); } catch (err) { layer.msg('该浏览器不支持点击复制到剪贴板'); } }, GetMapDiffItems: function(t1, t2) { var result = { "_add_cnt": 0, "_del_cnt": 0, "_edit_cnt": 0, "add": {}, "del": {}, "edit": {} }; for (var k in t1) { if (t2[k] == null) { result.add[k] = t1[k]; result._add_cnt++; } else if ((t2[k] != t1[k])) { result.edit[k] = [t1[k], t2[k]]; result._edit_cnt++; } } for (var k in t2) { if (t1[k] == null) { result.del[k] = t2[k]; result._del_cnt++; } } return result } } //报警信息显示 var AlertWin = { window: null, Init: function() { this.window = $("#alert_window") }, MoveTo: function(t) { var $t = $(t); var jd = $.trim($t.attr("jd")); var wd = $.trim($t.attr("wd")); if (jd == "" || wd == "") { DialogObject.Msg("设备未设置坐标,定位失败!"); return; } if (!$("#container_map").is(":visible")) return; if (jd * 1 < 1 || wd * 1 < 1) { DialogObject.Msg("设备未设置有效坐标,定位失败!"); return; } MapObject.SetMarker({ "url": "/static/images/marker_point4.png" }, jd * 1, wd * 1); MapObject.MoveTo(jd * 1, wd * 1, 19); }, RemoveOne: function(t) { var $t = $(t); $t.parent().remove(); if (this.window.find(".alert_item").length == 0) { this.window.addClass("hidden"); } }, Show: function(alertinfo) { if (alertinfo.devicealert == "doorlock" && ("用户布防,用户撤防".indexOf($.trim(alertinfo.event)) > -1)) { return; } var win = this.window; if (win.hasClass("hidden")) { var w = win.width(), h = win.height(); win.css({ position: "absolute", top: ($("body").height() * hRate - 100) / 5, left: ($("body").width() * wRate - 480) / 2, bottom: "auto", width: "480px" }); win.removeClass("hidden"); win.find(".dataitemlist").css({ "min-height": "100px", "max-height": "300px", "overflow-y": "auto" }); } var h = template("alert_list_item_tpl", alertinfo); win.find(".dataitemlist").append(h).find(".alert_item").off().on("mouseover", function() { var t = $(this); t.find(".btn_cancel").removeClass("hidden"); }).on("mouseout", function() { var t = $(this); t.find(".btn_cancel").addClass("hidden"); }); win.find(".dataitemlist .camera_location").off().on("click", function() { var t = $(this), url = t.attr("video_url"); if (url == "") return; Tools.PlayVideo("现场视频", url); }); var startAudio = $.trim(window.localStorage.getItem("audio-alert")); if (startAudio != "1") { //判断是否开启了声音报警。静音图标未隐藏表示不启用声音报警,反之表示开启声音报警 return; } //判断是否关联的视频,如果关联了则播放视频 var video_url = $.trim(alertinfo["video_url"]); if (video_url != "") { Tools.PlayVideo("现场视频", video_url); } //触发声音报警 var audio = new Audio("/static/images/14141.mp3"); audio.play(); /* var strAudio = "