//加载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("