// =========================== sa对象封装一系列工具方法 ===========================
var sa = {
version: '2.4.3',
update_time: '2020-10-2',
info: '新增双击layer标题处全屏'
};
// =========================== 当前环境配置 =======================================
(function(){
// 公司开发环境
var cfg_dev = {
api_url: 'http://127.0.0.1:8080/sp-admin', // 所有ajax请求接口父地址
web_url: 'http://www.baidu.com' // 此项目前台地址 (此配置项非必须)
}
// 服务器测试环境
var cfg_test = {
api_url: 'http://www.baidu.com',
web_url: 'http://www.baidu.com'
}
// 正式生产环境
var cfg_prod = {
api_url: 'http://www.baidu.com',
web_url: 'http://www.baidu.com'
}
sa.cfg = cfg_dev; // 最终环境 , 上线前请选择正确的环境
})();
// =========================== ajax的封装 =======================================
(function(){
/** 对ajax的再封装, 这个ajax假设你的接口会返回以下格式的内容
{
"code": 200,
"msg": "ok",
"data": []
}
如果返回的不是这个格式, 你可能需要改动一下源码, 要么改动服务端适应此ajax, 要么改动这个ajax适应你的服务端
* @param {Object} url 请求地址
* @param {Object} data 请求参数
* @param {Object} success200 当返回的code码==200时的回调函数
* @param {Object} 其它配置,可配置项有:
{
msg: '', // 默认的提示文字 填null为不提示
type: 'get', // 设定请求类型 默认post
baseUrl: '', // ajax请求拼接的父路径 默认取 sa.cfg.api_url
sleep: 0, // ajax模拟的延时毫秒数, 默认0
success500: fn, // code码等于500时的回调函数 (一般代表服务器错误)
success403: fn, // code码等于403时的回调函数 (一般代表无权限)
success401: fn, // code码等于401时的回调函数 (一般代表未登录)
errorfn: fn, // ajax发生错误时的回调函数 (一般是ajax请求本身发生了错误)
complete: fn, // ajax无论成功还是失败都会执行的回调函数
}
*/
sa.ajax = function(url, data, success200, cfg){
// 如果是简写模式(省略了data参数)
if(typeof data === 'function'){
cfg = success200;
success200 = data;
data = {};
}
// 默认配置
var defaultCfg = {
msg: '努力加载中...', // 提示语
baseUrl: (url.indexOf('http') === 0 ? '' : sa.cfg.api_url),// 父url,拼接在url前面
sleep: 0, // 休眠n毫秒处理回调函数
type: 'post', // 默认请求类型
success200: success200, // code=200, 代表成功
success500: function(res){ // code=500, 代表失败
return layer.alert('失败:' + res.msg);
},
success403: function(res){ // code=403, 代表权限不足
return layer.alert("权限不足," + res.msg, {icon: 5});
},
success401: function(res){ // code=401, 代表未登录
return layer.confirm("您当前暂未登录,是否立即登录?", {}, function(){
layer.closeAll();
return sa.$page.openLogin(cfg.login_url);
});
},
errorfn: function(xhr, type, errorThrown){ // ajax发生异常时的默认处理函数
if(xhr.status == 0){
return layer.alert('无法连接到服务器,请检查网络');
}
return layer.alert("异常:" + JSON.stringify(xhr));
},
complete: function(xhr, ts) { // 成功失败都会执行
}
}
// 将调用者的配置和默认配置合并
cfg = sa.extendJson(cfg, defaultCfg);
// 打印请求地址和参数, 以便调试
console.log("请求地址:" + cfg.baseUrl + url);
console.log("请求参数:" + JSON.stringify(data));
// 开始显示loading图标
if(cfg.msg != null){
sa.loading(cfg.msg);
}
// 开始请求ajax
return $.ajax({
url: cfg.baseUrl + url,
type: cfg.type,
data: data,
dataType: 'json',
// xhrFields: {
// withCredentials: true // 携带跨域cookie
// },
// crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
// 追加token
if(localStorage.tokenName) {
xhr.setRequestHeader(localStorage.tokenName, localStorage.tokenValue);
}
},
success: function(res){
console.log('返回数据:', res);
setTimeout(function() {
sa.hideLoading();
// 如果相应的处理函数存在
if(cfg['success' + res.code] != undefined) {
return cfg['success' + res.code](res);
}
layer.alert('未知状态码:' + JSON.stringify(res));
}, cfg.sleep);
},
error: function(xhr, type, errorThrown){
setTimeout(function() {
sa.hideLoading();
return cfg.errorfn(xhr, type, errorThrown);
}, cfg.sleep);
},
complete: cfg.complete
});
};
// 模拟一个ajax
// 请注意: 本模板中所有ajax请求调用的均为此模拟函数
sa.ajax2 = function(url, data, success200, cfg){
// 如果是简写模式(省略了data参数)
if(typeof data === 'function'){
cfg = success200;
success200 = data;
data = {};
}
// 几个默认配置
cfg = cfg || {};
cfg.baseUrl = (url.indexOf('http') === 0 ? '' : sa.cfg.api_url); // 父url,拼接在url前面
// 设定一个默认的提示文字
if(cfg.msg == undefined || cfg.msg == null || cfg.msg == '') {
cfg.msg = '正在努力加载...';
}
// 默认延时函数
if(cfg.sleep == undefined || cfg.sleep == null || cfg.sleep == '' || cfg.sleep == 0) {
cfg.sleep = 600;
}
// 默认的模拟数据
cfg.res = cfg.res || {
code: 200,
msg: 'ok',
data: []
}
// 开始loding
sa.loading(cfg.msg);
// 打印请求地址和参数, 以便调试
console.log("======= 模拟ajax =======");
console.log("请求地址:" + cfg.baseUrl + url);
console.log("请求参数:" + JSON.stringify(data));
// 模拟ajax的延时
setTimeout(function() {
sa.hideLoading(); // 隐藏掉转圈圈
console.log('返回数据:', cfg.res);
success200(cfg.res);
}, cfg.sleep)
};
})();
// =========================== 封装弹窗相关函数 =======================================
(function() {
var me = sa;
if(window.layer) {
layer.ready(function(){});
}
// tips提示文字
me.msg = function(msg, cfg) {
msg = msg || '操作成功';
layer.msg(msg, cfg);
};
// 操作成功的提示
me.ok = function(msg) {
msg = msg || '操作成功';
layer.msg(msg, {anim: 0, icon: 1 });
}
me.ok2 = function(msg) {
msg = msg || '操作成功';
layer.msg(msg, {anim: 0, icon: 6 });
}
// 操作失败的提示
me.error = function(msg) {
msg = msg || '操作失败';
layer.msg(msg, {anim: 6, icon: 2 });
}
me.error2 = function(msg) {
msg = msg || '操作失败';
layer.msg(msg, {anim: 6, icon: 5 });
}
// alert弹窗 [text=提示文字, okFn=点击确定之后的回调函数]
me.alert = function(text, okFn) {
// 开始弹窗
layer.alert(text, function(index) {
layer.close(index);
if(okFn) {
okFn();
}
});
};
// 询问框 [text=提示文字, okFn=点击确定之后的回调函数]
me.confirm = function(text, okFn) {
layer.confirm(text, {}, function(index) {
layer.close(index);
if(okFn) {
okFn();
}
}.bind(this));
};
// 输入框 [title=提示文字, okFn=点击确定后的回调函数, formType=输入框类型(0=文本,1=密码,2=多行文本域) 可省略, value=默认值 可省略 ]
me.prompt = function(title, okFn, formType, value) {
layer.prompt({
title: title,
formType: formType,
value: value
}, function(pass, index){
layer.close(index);
if(okFn) {
okFn(pass);
}
});
}
// 打开loading
me.loading = function(msg) {
layer.closeAll(); // 开始前先把所有弹窗关了
return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load' });
};
// 隐藏loading
me.hideLoading = function() {
layer.closeAll();
};
// ============== 一些常用弹窗 =====================
// 大窗显示一个图片
// 参数: src=地址、w=宽度(默认80%)、h=高度(默认80%)
me.showImage = function(src, w, h) {
w = w || '80%';
h = h || '80%';
var content = '
' +
'
' +
'
';
layer.open({
type: 1,
title: false,
shadeClose: true,
closeBtn: 0,
area: [w, h], //宽高
content: content
});
}
// 预览一组图片
// srcList=图片路径数组(可以是json样,也可以是逗号切割式), index=打开立即显示哪张(可填下标, 也可填写src路径)
me.showImageList = function(srcList, index) {
// 如果填的是个string
srcList = srcList || [];
if(typeof srcList === 'string') {
try{
srcList = JSON.parse(srcList);
}catch(e){
try{
srcList = srcList.split(','); // 尝试字符串切割
}catch(e){
srcList = [];
}
}
}
// 如果填的是路径
index = index || 0;
if(typeof index === 'string') {
index = srcList.indexOf(index);
index = (index == -1 ? 0 : index);
}
// 开始展示
var arr_list = [];
srcList.forEach(function(item) {
arr_list.push({
alt: '左右键切换',
pid: 1,
src: item,
thumb: item
})
})
layer.photos({
photos: {
title: '',
id: new Date().getTime(),
start: index,
data: arr_list
}
,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数)
});
}
// 显示一个iframe
// 参数: 标题,地址,宽,高 , 点击遮罩是否关闭, 默认false
me.showIframe = function(title, url, w, h, shadeClose) {
// 参数修正
w = w || '95%';
h = h || '95%';
shadeClose = (shadeClose === undefined ? false : shadeClose);
// 弹出面板
var index = layer.open({
type: 2,
title: title, // 标题
shadeClose: shadeClose, // 是否点击遮罩关闭
maxmin: true, // 显示最大化按钮
shade: 0.8, // 遮罩透明度
scrollbar: false, // 屏蔽掉外层的滚动条
moveOut: true, // 是否可拖动到外面
area: [w, h], // 大小
content: url, // 传值
// 解决拉伸或者最大化的时候,iframe高度不能自适应的问题
resizing: function(layero) {
solveLayerBug(index);
}
});
// 解决拉伸或者最大化的时候,iframe高度不能自适应的问题
$('#layui-layer' + index + ' .layui-layer-max').click(function() {
setTimeout(function() {
solveLayerBug(index);
}, 200)
})
}
me.showView = me.showIframe;
// 显示一个iframe, 底部按钮方式
// 参数: 标题,地址,点击确定按钮执行的代码(在子窗口执行),宽,高
me.showIframe2 = function(title, url, evalStr, w, h) {
// 参数修正
w = w || '95%';
h = h || '95%';
// 弹出面板
var index = layer.open({
type: 2,
title: title, // 标题
closeBtn: (title ? 1 : 0), // 是否显示关闭按钮
btn: ['确定', '取消'],
shadeClose: false, // 是否点击遮罩关闭
maxmin: true, // 显示最大化按钮
shade: 0.8, // 遮罩透明度
scrollbar: false, // 屏蔽掉外层的滚动条
moveOut: true, // 是否可拖动到外面
area: [w, h], // 大小
content: url, // 传值
// 解决拉伸或者最大化的时候,iframe高度不能自适应的问题
resizing: function(layero) {
},
yes: function(index, layero) {
var iframe = document.getElementById('layui-layer-iframe' + index);
var iframeWindow = iframe.contentWindow;
iframeWindow.eval(evalStr);
}
});
}
// 当前iframe关闭自身 (在iframe中调用)
me.closeCurrIframe = function() {
try{
var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
parent.layer.close(index); //再执行关闭
}catch(e){
//TODO handle the exception
}
}
me.closeCurrView = me.closeCurrIframe;
//执行一个函数, 解决layer拉伸或者最大化的时候,iframe高度不能自适应的问题
function solveLayerBug(index) {
var selected = '#layui-layer' + index;
var height = $(selected).height();
var title_height = $(selected).find('.layui-layer-title').height();
$(selected).find('iframe').css('height', (height - title_height) + 'px');
}
// 监听回车事件,达到回车关闭弹窗的效果
if(window.$) {
$(document).on('keydown', function() {
if(event.keyCode === 13 && $(".layui-layer-btn0").length == 1 && !window.is_not_watch_enter && $(this).find('.layui-layer-input').length == 0){
$(".layui-layer-btn0").click();
return false;
}
});
}
})();
// =========================== 常用util函数封装 =======================================
(function () {
// 超级对象
var me = sa;
// =========================== 常用util函数封装 =======================================
if(true) {
// 从url中查询到指定参数值
me.p = function(name, defaultValue){
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i 0 ? cha : 0 - cha);
if(cha < (86400 * 1000)) {
return me.forDate2(d);
}
return me.forDate(d, way);
}
// 返回时间差, 此格式数组:[x, x, x, 天, 时, 分, 秒]
me.getSJC = function (small_time, big_time) {
var date1 = new Date(small_time); //开始时间
var date2 = new Date(big_time); //结束时间
var date3 = date2.getTime() - date1.getTime(); //时间差秒
//计算出相差天数
var days = Math.floor(date3 / (24 * 3600 * 1000));
//计算出小时数
var leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
var hours = Math.floor(leave1 / (3600 * 1000));
//计算相差分钟数
var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
var minutes = Math.floor(leave2 / (60 * 1000));
//计算相差秒数
var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
var seconds = Math.round(leave3 / 1000);
// 返回数组
return [0, 0, 0, days, hours, minutes, seconds];
}
// 将日期,加上指定天数
me.dateAdd = function(d, n) {
var s = new Date(d).getTime();
s += 86400000 * n;
return new Date(s);
}
// 转化json,出错返回默认值
me.JSONParse = function(obj, default_obj){
try{
return JSON.parse(obj) || default_obj;
}catch(e){
return default_obj || {};
}
}
// 截取指定长度字符,默认50
me.maxLength = function (str, length) {
length = length || 50;
if(!str){
return "";
}
return (str.length > length) ? str.substr(0, length) + ' ...' : str;
},
// 过滤掉标签
me.text = function(str){
if(!str){
return "";
}
return str.replace(/<[^>]+>/g,"");
}
// 为指定集合的每一项元素添加上is_update属性
me.listAU = function(list){
list.forEach(function(ts){
ts.is_update = false;
})
return list;
}
// 获得一段文字中所有图片的路径
me.getSrcList = function(str){
try{
var imgReg = /|\/>)/gi; //匹配图片(g表示匹配所有结果i表示区分大小写)
var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; //匹配src属性
var arr = str.match(imgReg); // 图片数组
var srcList = [];
for (var i = 0; i < arr.length; i++) {
var src = arr[i].match(srcReg);
srcList.push(src[1]);
}
return srcList;
} catch (e){
return [];
}
}
// 无精度损失的乘法
me.accMul = function(arg1, arg2) {
var m = 0,
s1 = arg1.toString(),
s2 = arg2.toString(),
t;
t = s1.split(".");
// 判断有没有小数位,避免出错
if (t[1]) {
m += t[1].length
}
t = s2.split(".");
if (t[1]) {
m += t[1].length
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}
// 正则验证是否为手机号
me.isPhone = function(str) {
str = str + '';
if((/^1[34578]\d{9}$/.test(str))){
return true;
}
return false;
}
// 产生随机字符串
me.randomString = function(len) {
len = len || 32;
var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
var maxPos = $chars.length;
var str = '';
for (i = 0; i < len; i++) {
str += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return str;
}
// 刷新页面
me.f5 = function() {
location.reload();
}
// 动态加载js
me.loadJS = function(src, onload) {
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.src = src;
script.onload = onload;
document.body.appendChild(script);
}
// 产生随机数字
me.randomNum = function(min, max) {
return parseInt(Math.random() * (max - min + 1) + min, 10);
}
// 打开页面
me.open = function(url) {
window.open(url);
}
// == if 结束
}
// =========================== 数组操作 =======================================
if (true) {
// 从数组里获取数据,根据指定数据
me.getArrayField = function(arr, prop){
var propArr = [];
for (var i = 0; i < arr.length; i++) {
propArr.push(arr[i][prop]);
}
return propArr;
}
// 从数组里获取数据,根据指定数据
me.arrayGet = function(arr, prop, value){
for (var i = 0; i < arr.length; i++) {
if(arr[i][prop] == value){
return arr[i];
}
}
return null;
}
// 从数组删除指定记录
me.arrayDelete = function(arr, item){
if(item instanceof Array) {
for (let i = 0; i < item.length; i++) {
let ite = item[i];
let index = arr.indexOf(ite);
if (index > -1) {
arr.splice(index, 1);
}
}
} else {
var index = arr.indexOf(item);
if (index > -1) {
arr.splice(index, 1);
}
}
}
// 从数组删除指定id的记录
me.arrayDeleteById = function(arr, id){
var item = me.arrayGet(arr, 'id', id);
me.arrayDelete(arr, item);
}
// 将数组B添加到数组A的开头
me.unshiftArray = function(arrA, arrB){
if(arrB){
arrB.reverse().forEach(function(ts){
arrA.unshift(ts);
})
}
return arrA;
}
// 将数组B添加到数组A的末尾
me.pushArray = function(arrA, arrB){
if(arrB){
arrB.forEach(function(ts){
arrA.push(ts);
})
}
return arrA;
}
// == if 结束
}
// =========================== 浏览器相关 =======================================
if (true) {
// set cookie 值
me.setCookie = function setCookie(cname, cvalue, exdays) {
exdays = exdays || 30;
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + escape(cvalue) + "; " + expires + "; path=/";
}
// get cookie 值
me.getCookie = function(objName){
var arrStr = document.cookie.split("; ");
for (var i = 0; i < arrStr.length; i++) {
var temp = arrStr[i].split("=");
if (temp[0] == objName){
return unescape(temp[1])
};
}
return "";
}
// 复制指定文本
me.copyText = function(str){
var oInput = document.createElement('input');
oInput.value = str;
document.body.appendChild(oInput);
oInput.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
oInput.className = 'oInput';
oInput.style.display='none';
}
// jquery序列化表单增强版: 排除空值
me.serializeNotNull = function(selected){
var serStr = $(selected).serialize();
return serStr.split("&").filter(function(str){return !str.endsWith("=")}).join("&");
}
// 将cookie序列化为k=v形式
me.strCookie = function(){
return document.cookie.replace(/; /g,"&");
}
// 回到顶部
me.goTop = function() {
function smoothscroll(){
var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
if (currentScroll > 0) {
window.requestAnimationFrame(smoothscroll);
window.scrollTo (0,currentScroll - (currentScroll/5));
}
};
smoothscroll();
}
// == if 结束
}
// =========================== javascript对象操作 =======================================
if (true) {
// 去除json对象中的空值
me.removeNull = function(obj){
var newObj = {};
if(obj != undefined && obj != null) {
for(var key in obj) {
if(obj[key] === undefined || obj[key] === null || obj[key] === '') {
//
} else {
newObj[key] = obj[key];
}
}
}
return newObj;
}
// JSON 浅拷贝, 返回拷贝后的obj
me.copyJSON = function(obj){
if(obj === null || obj === undefined) {
return obj;
};
var new_obj = {};
for(var key in obj) {
new_obj[key] = obj [key];
}
return new_obj;
}
// json合并, 将 defaulet配置项 转移到 user配置项里 并返回 user配置项
me.extendJson = function(userOption, defaultOption) {
if(!userOption) {
return defaultOption;
};
for(var key in defaultOption) {
if(userOption[key] === undefined) {
userOption[key] = defaultOption[key];
} else if(userOption[key] == null){
} else if(typeof userOption[key] == "object") {
me.extendJson(userOption[key], defaultOption[key]); //深度匹配
}
}
return userOption;
}
// == if 结束
}
// =========================== 本地集合存储 =======================================
if (true) {
// 获取指定key的list
me.keyListGet = function(key){
try{
var str = localStorage.getItem('LIST_' + key);
if(str == undefined || str == null || str =='' || str == 'undefined' || typeof(JSON.parse(str)) == 'string'){
//alert('key' + str);
str = '[]';
}
return JSON.parse(str);
}catch(e){
return [];
}
},
me.keyListSet = function(key, list){
localStorage.setItem('LIST_' + key, JSON.stringify(list));
},
me.keyListHas = function(key, item){
var arr2 = me.keyListGet(key);
return arr2.indexOf(item) != -1;
},
me.keyListAdd = function(key, item){
var arr = me.keyListGet(key);
arr.push(item);
me.keyListSet(key,arr);
},
me.keyListRemove = function(key, item){
var arr = me.keyListGet(key);
var index = arr.indexOf(item);
if (index > -1) {
arr.splice(index, 1);
}
me.keyListSet(key,arr);
}
// == if 结束
}
// =========================== 对sa-admin的优化 =======================================
if (true) {
// 封装element-ui的导出表格
// 参数:选择器(默认.data-count),fileName=导出的文件名称
me.exportExcel = function(select, fileName) {
// 声明函数
let exportExcel_fn = function(select, fileName) {
// 赋默认值
select = select || '.data-table';
fileName = fileName || 'table.xlsx';
// 开始导出
let wb = XLSX.utils.table_to_book(document.querySelector(select)); // 这里就是表格
let sheet = wb.Sheets.Sheet1; // 单元表
try{
// 强改宽度
sheet['!cols'] = sheet['!cols'] || [];
let thList = document.querySelector(select).querySelectorAll('.el-table__header-wrapper tr th');
for (var i = 0; i < thList.length; i++) {
// 如果是多选框
if(thList[i].querySelector('.el-checkbox')) {
sheet['!cols'].push({ wch: 5 }); // 强改宽度
continue;
}
sheet['!cols'].push({ wch: 15 }); // 强改宽度
}
// 强改高度
sheet['!rows'] = sheet['!rows'] || [];
let trList = document.querySelector(select).querySelectorAll('.el-table__body-wrapper tbody tr');
for (var i = 0; i < trList.length + 1; i++) {
sheet['!rows'].push({ hpx: 20 }); // 强改高度
}
} catch(e) {
console.err(e);
}
// 开始制作并输出
let wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' });
// 点击
let blob = new Blob([wbout], { type: 'application/octet-stream'});
const a= document.createElement("a")
a.href = URL.createObjectURL(blob)
a.download = fileName // 这里填保存成的文件名
a.click()
URL.revokeObjectURL(a.href)
a.remove();
sa.hideLoading();
}
sa.loading('正在导出...');
// 判断是否首次加载
if(window.XLSX) {
return exportExcel_fn(select, fileName);
} else {
me.loadJS('https://unpkg.com/xlsx@0.16.6/dist/xlsx.core.min.js', function() {
return exportExcel_fn(select, fileName);
});
}
}
// 刷新表格高度, 请务必在所有表格高度发生变化的地方调用此方法
me.f5TableHeight = function() {
Vue.nextTick(function() {
if($('.el-table.data-table .el-table__body-wrapper table').length == 0) {
return;
}
var _f5Height = function() {
var height = $('.el-table .el-table__body-wrapper table').height();
height = height == 0 ? 60 : height;
// 判断是否有滚动条
var tw = $('.el-table .el-table__body-wrapper').get(0);
if(tw.scrollWidth > tw.clientWidth) {
height = height + 16;
}
if($('.el-table .el-table__body-wrapper table td').width() == 0) {
return;
}
// 设置高度
$('.el-table .el-table__body-wrapper').css('min-height', height);
$('.el-table .el-table__body-wrapper').css('max-height', height);
};
setTimeout(_f5Height, 0)
setTimeout(_f5Height, 200)
})
}
// 在表格查询的页面,监听input回车事件,提交查询
me.onInputEnter = function(app) {
Vue.nextTick(function() {
app = app || window.app;
// document.querySelectorAll('.el-form input').forEach(function(item) {
// item.onkeydown = function(e) {
// var theEvent = e || window.event;
// var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
// if (code == 13) {
// app.p.pageNo = 1;
// app.f5();
// }
// }
// })
document.querySelectorAll('.el-form').forEach(function(item) {
item.onkeydown = function(e) {
var theEvent = e || window.event;
var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
var target = e.target||e.srcElement;
if(target.tagName.toLowerCase()=="input") {
app.p.pageNo = 1;
app.f5();
}
}
}
})
})
}
// 如果value为true,则抛出异常
me.check = function(value, errorMsg) {
if(value === true) {
throw {type: 'sa-error', msg: errorMsg};
}
}
// 如果value为null,则抛出异常
me.checkNull = function(value, errorMsg) {
if(me.isNull(value)) {
throw {type: 'sa-error', msg: errorMsg};
}
}
// 监听窗口变动
if(!window.onresize) {
window.onresize = function() {
try{
me.f5TableHeight();
}catch(e){
// console.log(e);
}
}
}
// 双击layer标题处全屏
if(window.$) {
$(document).on('mousedown', '.layui-layer-title', function(e) {
// console.log('单击中');
if(window.layer_title_last_click_time) {
var cz = new Date().getTime() - window.layer_title_last_click_time;
if(cz < 250) {
console.log('双击');
$(this).parent().find('.layui-layer-max').click();
}
}
window.layer_title_last_click_time = new Date().getTime();
})
}
// == if 结束
}
})();
// =========================== $sys 有关当前系统的方法 一般不能复制到别的项目中用 =======================================
(function(){
// 超级对象
var me = {};
sa.$sys = me;
// ======================= 登录相关 ============================
// 写入当前已登陆用户信息
me.setCurrUser = function(currUser){
localStorage.setItem('currUser', JSON.stringify(currUser));
}
// 获得当前已登陆用户信息
me.getCurrUser = function(){
var user = localStorage.getItem("currUser");
if(user == undefined || user == null || user == 'null' || user == '' || user == '{}' || user.length < 10){
user = {
id: '0',
username: '未登录'
}
}else{
user = JSON.parse(user);
}
return user;
}
// 如果未登录,则强制跳转到登录
me.checkLogin = function(not_login_url){
console.log(me.getCurrUser());
if(me.getCurrUser().id == 0) {
location.href= not_login_url || '../../login.html';
throw '未登录,请先登录';
}
}
// 同上, 只不过是以弹窗的形式显示未登录
me.checkLoginTs = function(not_login_url){
if(me.getCurrUser().id == 0) {
sa.$page.openLogin(not_login_url || '../../login.html');
throw '未登录,请先登录';
}
}
// ========================= 权限验证 =========================
// 定义key
var pcode_key = 'permission_code';
// 写入当前会话的权限码集合
sa.setAuth = function(codeList) {
sa.keyListSet(pcode_key, codeList);
}
// 清除当前会话的权限码集合
sa.clearAuth = function() {
sa.keyListSet(pcode_key, []);
}
// 检查当前会话是否拥有一个权限码, 返回true和false
sa.isAuth = function(pcode) {
return sa.keyListHas(pcode_key, pcode);
}
// 检查当前会话是否拥有一个权限码, 如果没有, 则跳转到无权限页面
// 注意: 非二级目录页面请注意调整路径问题
sa.checkAuth = function(pcode, not_pcode_url) {
var is_have = sa.keyListHas(pcode_key, pcode);
if(is_have == false) {
location.href= not_pcode_url || '../../sa-view/error-page/403.html';
throw '暂无权限: ' + pcode;
}
}
// 同上, 只不过是以弹窗的形式显示出来无权限来
sa.checkAuthTs = function(pcode, not_pcode_url) {
var is_have = sa.keyListHas(pcode_key, pcode);
if(is_have == false) {
var url = not_pcode_url || '../../sa-view/error-page/403.html';
layer.open({
type: 2,
title: false, // 标题
shadeClose: true, // 是否点击遮罩关闭
shade: 0.8, // 遮罩透明度
scrollbar: false, // 屏蔽掉外层的滚动条
closeBtn: false,
area: ['700px', '600px'], // 大小
content: url // 传值
});
throw '暂无权限: ' + pcode;
}
}
// ======================= 配置相关 ============================
// 写入配置信息
me.setAppCfg = function(cfg) {
if(typeof cfg != 'string') {
cfg = JSON.stringify(cfg);
}
localStorage.setItem('app_cfg', cfg);
}
// 获取配置信息
me.getAppCfg = function() {
var app_cfg = sa.JSONParse(localStorage.getItem('app_cfg'), {}) || {};
return app_cfg;
}
})();
// =========================== $page 跳页面相关 避免一次变动,到处乱改 =======================================
(function(){
// 超级对象
var me={};
sa.$page = me;
// 打开登录页面
me.openLogin = function(login_url) {
layer.open({
type: 2,
// title: '登录',
title: false,
closeBtn: false,
shadeClose: true,
shade: 0.8,
// area: ['90%', '100%'],
area: ['70%', '80%'],
// area: ['450px', '360px'],
resize: false,
content: login_url || '../../login.html'
});
}
// 打开admin信息界面
me.openAdminInfo = function(id, username) {
var title = username + ' - 账号详情';
if(username === undefined) {
title = '账号详情';
}
sa.showIframe(title, '../sp-admin/admin-info.html?id=' + id, '700px', '600px');
}
})();
// 如果是sa_admin环境
window.sa_admin = window.sa_admin || parent.sa_admin || top.sa_admin;
window.saAdmin = window.sa_admin;
// 如果当前是Vue环境, 则挂在到 Vue 示例
if(window.Vue) {
// 全局的 sa 对象
Vue.prototype.sa = window.sa;
Vue.prototype.sa_admin = window.sa_admin;
Vue.prototype.saAdmin = window.saAdmin;
// 表单校验异常捕获
Vue.config.errorHandler = function(err, vm) {
if(err.type == 'sa-error') {
return sa.error(err.msg);
}
throw err;
}
// Element-UI 全局组件样式
Vue.prototype.$ELEMENT = { size: 'mini', zIndex: 3000 };
// 加载全局组件 (注意路径问题)
// if(window.httpVueLoader && window.loadComponent !== false) {
// Vue.component("sa-item", httpVueLoader('../../sa-frame/com/sa-item.vue'));
// Vue.component("sa-td", httpVueLoader('../../sa-frame/com/sa-td.vue'));
// }
}
// 对外开放, 在模块化时解开此注释
// export default sa;