567 lines
23 KiB
JavaScript
Executable File
567 lines
23 KiB
JavaScript
Executable File
/**
|
|
* laytp极速后台框架layUI的js扩展,后台界面使用
|
|
* @version: 2.0
|
|
* @Author: JunStar
|
|
* @Date: 2018年09月20日11:47:00
|
|
* @Last Modified by: JunStar
|
|
* @Last Modified time: 2021-09-22 17:19:40
|
|
*/
|
|
layui.define([
|
|
"facade", // 助手函数
|
|
"laytpForm", // 表单元素组件
|
|
"laytpDropdown", // 数据表格顶部批量操作下拉组件
|
|
"laytpTable", // 数据表格处理完成后需要执行的操作组件
|
|
"button", // 按钮点击过渡效果组件
|
|
"drawer", // 抽屉组件
|
|
"react", // 模拟react的响应式组件,允许注册一些数据,方法,钩子并提供简单的响应式
|
|
], function (exports) {
|
|
const MOD_NAME = "laytp";
|
|
|
|
let $ = layui.jquery
|
|
, facade = layui.facade
|
|
, laytp = {}
|
|
;
|
|
|
|
window.$ = $;
|
|
|
|
//数据表格,格式化展示数据
|
|
laytp.tableFormatter = {
|
|
custom: ["#FF5722", "#009688", "#FFB800", "#2F4056", "#1E9FFF", "#393D49", "#999999", "#0b1bf8", "#7a0bf8", "#f00bf8", "#5FB878", "#1E9FFF", "#2F4056"],
|
|
status: function (field, value, json, isTreeTable) {
|
|
let customIndex = 0, key;
|
|
if (value) {
|
|
for (key in json['value']) {
|
|
if (value.toString() === json['value'][key].toString()) {
|
|
if (isTreeTable) {
|
|
return '<span class="layui-icon layui-icon-circle-dot" style="color:' + laytp.tableFormatter.custom[customIndex] + ';font-size:14px;">' + json['text'][key] + '</span>';
|
|
} else {
|
|
return '<a href="javascript:void(0);" class="laytpClickSearch layerTips layui-icon layui-icon-circle-dot" data-field="' + field + '" data-val="' + value + '" data-text="点击搜索 ' + json['text'][key] + '" data-tipsColor="#393D49" style="color:' + laytp.tableFormatter.custom[customIndex] + ';font-size:14px;">' + json['text'][key] + '</a>';
|
|
}
|
|
}
|
|
customIndex++;
|
|
}
|
|
}
|
|
return '';
|
|
},
|
|
colorPicker: function (value) {
|
|
return "<span class='layui-badge' style='background-color:" + value + ";font-size:14px;'> </span>\n\t\t\t";
|
|
},
|
|
//form_type=checkbox
|
|
flag: function (value, dataList) {
|
|
let html = '';
|
|
let customIndex = 0, key, v;
|
|
let valueArr = value.toString().split(',');
|
|
for (key in dataList.value) {
|
|
for (v in valueArr) {
|
|
if (valueArr[v].toString() === dataList.value[key].toString()) {
|
|
customIndex = key % laytp.tableFormatter.custom.length;
|
|
html += '<span class="layui-btn layui-btn-xs" style="background-color: ' + laytp.tableFormatter.custom[customIndex] + '">' + dataList.text[key] + '</span>';
|
|
}
|
|
}
|
|
}
|
|
return html;
|
|
},
|
|
images: function (value) {
|
|
let html = "";
|
|
if (value) {
|
|
let valueArr = value.split(", "), key;
|
|
for (key in valueArr) {
|
|
html += '<a href="javascript:void(0);" onclick="layui.laytp.tableFormatter.showImage(\'' + valueArr[key] + '\')"><img src="' + valueArr[key] + '" class="layerImgTips" style="width:30px;height:30px;" /></a> ';
|
|
}
|
|
}
|
|
return html;
|
|
},
|
|
showImage: function (url) {
|
|
layui.facade.popupDiv({
|
|
title: '查看图片',
|
|
path: "/admin/showImage.html?img_url=" + window.btoa(url)
|
|
});
|
|
},
|
|
video: function (value) {
|
|
let html = '';
|
|
if (value) {
|
|
let i = 1;
|
|
let valueArr = value.split(','), key;
|
|
for (key in valueArr) {
|
|
html += '<a href="javascript:void(0);" onclick="layui.laytp.tableFormatter.showVideo(\'' + valueArr[key] + '\')" class=\"layui-link\">视频' + i + '</a> ';
|
|
i++;
|
|
}
|
|
}
|
|
return html;
|
|
},
|
|
showVideo: function (url) {
|
|
layui.facade.popupDiv({
|
|
title: '查看视频',
|
|
path: "/admin/showVideo.html?video_url=" + window.btoa(url)
|
|
});
|
|
},
|
|
audio: function (value) {
|
|
let html = '';
|
|
if (value) {
|
|
let i = 1;
|
|
let valueArr = value.split(','), key;
|
|
for (key in valueArr) {
|
|
html += '<a href="javascript:void(0);" onclick="layui.laytp.tableFormatter.showAudio(\'' + valueArr[key] + '\')" class=\"layui-link\">音频' + i + '</a> ';
|
|
i++;
|
|
}
|
|
}
|
|
return html;
|
|
},
|
|
showAudio: function (url) {
|
|
layui.facade.popupDiv({
|
|
title: '查看音频',
|
|
path: "/admin/showAudio.html?audio_url=" + window.btoa(url)
|
|
});
|
|
},
|
|
file: function (value) {
|
|
let html = '';
|
|
if (value) {
|
|
let i = 1;
|
|
let valueArr = value.split(','), key;
|
|
for (key in valueArr) {
|
|
html += '<a target="_blank" href="' + valueArr[key] + '" title="点击下载" class="layui-link">文件' + i + '</a> ';
|
|
i++;
|
|
}
|
|
}
|
|
return html;
|
|
},
|
|
};
|
|
|
|
/**
|
|
* 监听数据表格顶部左侧默认按钮点击事件
|
|
*/
|
|
laytp.tableToolbar = function (obj, isTreeTable) {
|
|
// 窗口句柄
|
|
let indexes = [];
|
|
if (obj.event === "add") {
|
|
let options = {};
|
|
options.title = "添 加";
|
|
options.path = facade.compatibleHtmlPath(window.htmlPrefix) + "add.html";
|
|
indexes.push(facade.popupDiv(options));
|
|
} else if (obj.event === "edit") {
|
|
let checkData, checkStatus;
|
|
if (isTreeTable) {
|
|
checkStatus = layui.treeTable.checkStatus(obj.config.id);
|
|
} else {
|
|
checkStatus = layui.table.checkStatus(obj.config.id);
|
|
}
|
|
checkData = checkStatus.data;
|
|
if (checkData.length === 0) {
|
|
facade.error("请选择数据");
|
|
return false;
|
|
}
|
|
if (checkData.length >= 30) {
|
|
facade.error("选择数据量过多,最多选择30条数据,总共选择了" + checkData.length + "条数据");
|
|
return false;
|
|
}
|
|
let key;
|
|
for (key in checkData) {
|
|
indexes.push(facade.popupDiv({
|
|
title: "编辑",
|
|
path: facade.compatibleHtmlPath(window.htmlPrefix) + "edit.html?id=" + checkData[key].id
|
|
}));
|
|
}
|
|
} else if (obj.event === "del") {
|
|
let checkData, checkStatus;
|
|
if (isTreeTable) {
|
|
checkStatus = layui.treeTable.checkStatus(obj.config.id);
|
|
} else {
|
|
checkStatus = layui.table.checkStatus(obj.config.id);
|
|
}
|
|
checkData = checkStatus.data;
|
|
if (checkData.length === 0) {
|
|
facade.error("请选择数据");
|
|
return false;
|
|
}
|
|
let ids = [];
|
|
let key;
|
|
for (key in checkData) {
|
|
ids.push(checkData[key].id);
|
|
}
|
|
if (isTreeTable) {
|
|
facade.popupConfirm({ text: "确定删除么?", route: window.apiPrefix + "del", data: { ids: ids } }, function (res) {
|
|
if (res.code === 0) {
|
|
if (typeof obj.del === "function") {
|
|
obj.del();
|
|
} else {
|
|
funController.tableRender();
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
facade.popupConfirm({ text: "确定删除么?", route: window.apiPrefix + "del", data: { ids: ids } });
|
|
}
|
|
} else if (obj.event === "search") {
|
|
layui.drawer.open({
|
|
direction: "right",
|
|
dom: "#search-form",
|
|
distance: "70%",
|
|
success: function (d) {
|
|
var windowHeight = d.height;
|
|
var height = parseInt(windowHeight) - 115;
|
|
$(".search-form-body").css("height", height + 'px');
|
|
$(".search-form-body").css("max-height", height + 'px');
|
|
$(".search-form-body").css("overflow-y", "auto");
|
|
}
|
|
});
|
|
} else if (obj.event === "recycle-search") {
|
|
layui.drawer.open({
|
|
direction: "right",
|
|
dom: "#recycle-search-form",
|
|
distance: "70%",
|
|
success: function (d) {
|
|
var windowHeight = d.height;
|
|
var height = parseInt(windowHeight) - 115;
|
|
$(".search-form-body").css("height", height + 'px');
|
|
$(".search-form-body").css("max-height", height + 'px');
|
|
$(".search-form-body").css("overflow-y", "auto");
|
|
}
|
|
});
|
|
} else if (obj.event === "recycle") {
|
|
let options = {};
|
|
options.title = "回收站";
|
|
options.path = facade.compatibleHtmlPath(window.htmlPrefix) + "recycle.html";
|
|
options.offset = "auto";
|
|
options.width = facade.isMobile() ? '100%' : '90%';
|
|
options.height = facade.isMobile() ? '100%' : '90%';
|
|
options.anim = 2;
|
|
indexes.push(facade.popupDiv(options));
|
|
} else if (obj.event === "restore") {
|
|
let checkData, checkStatus;
|
|
if (isTreeTable) {
|
|
checkStatus = layui.treeTable.checkStatus(obj.config.id);
|
|
} else {
|
|
checkStatus = layui.table.checkStatus(obj.config.id);
|
|
}
|
|
checkData = checkStatus.data;
|
|
if (checkData.length === 0) {
|
|
facade.error("请选择数据");
|
|
return false;
|
|
}
|
|
let key;
|
|
let ids = [];
|
|
for (key in checkData) {
|
|
ids.push(checkData[key].id);
|
|
}
|
|
facade.ajax({
|
|
route: window.apiPrefix + "restore",
|
|
data: { ids: ids },
|
|
showLoading: true
|
|
}).done(function (res) {
|
|
if (res.code === 0) {
|
|
parent.funController.tableRender();
|
|
funRecycleController.tableRender();
|
|
}
|
|
});
|
|
} else if (obj.event === "true-del") {
|
|
let checkData, checkStatus;
|
|
if (isTreeTable) {
|
|
checkStatus = layui.treeTable.checkStatus(obj.config.id);
|
|
} else {
|
|
checkStatus = layui.table.checkStatus(obj.config.id);
|
|
}
|
|
checkData = checkStatus.data;
|
|
if (checkData.length === 0) {
|
|
facade.error("请选择数据");
|
|
return false;
|
|
}
|
|
|
|
let key;
|
|
let ids = [];
|
|
for (key in checkData) {
|
|
ids.push(checkData[key].id);
|
|
}
|
|
facade.popupConfirm({
|
|
text: "真的在回收站删除么?此次删除将不能还原",
|
|
route: window.apiPrefix + "trueDel",
|
|
data: { ids: ids }
|
|
});
|
|
} else if (obj.event === "refresh") {
|
|
if (typeof funController !== "undefined") {
|
|
funController.tableRender(layui.form.val("layui-form"), $(".layui-laypage-em").next().html());
|
|
}
|
|
} else if (obj.event === "recycle-refresh") {
|
|
if (typeof funRecycleController !== "undefined") {
|
|
funRecycleController.tableRender(layui.form.val("layui-form"), $(".layui-laypage-em").next().html());
|
|
}
|
|
}
|
|
|
|
// 返回窗口句柄
|
|
if (indexes.length === 1) return indexes.pop();
|
|
else return [...indexes];
|
|
};
|
|
|
|
/**
|
|
* 监听数据表格操作列,默认按钮点击事件
|
|
*/
|
|
laytp.tableTool = function (obj, isTreeTable) {
|
|
let indexes = [];
|
|
if (obj.event === "del") {
|
|
if (isTreeTable) {
|
|
facade.popupConfirm({ text: "真的删除么?", route: window.apiPrefix + "del", data: { ids: [obj.data.id] } }, function (res) {
|
|
if (res.code === 0) {
|
|
obj.del();
|
|
}
|
|
});
|
|
} else {
|
|
facade.popupConfirm({ text: "真的删除么?", route: window.apiPrefix + "del", data: { ids: [obj.data.id] } });
|
|
}
|
|
} else if (obj.event === "edit") {
|
|
let options = {};
|
|
options.title = "编 辑";
|
|
options.path = facade.compatibleHtmlPath(window.htmlPrefix) + "edit.html?id=" + obj.data.id;
|
|
indexes.push(facade.popupDiv(options));
|
|
} else if (obj.event === "restore") {
|
|
facade.ajax({ route: window.apiPrefix + "restore", data: { ids: [obj.data.id] } }).done(function (res) {
|
|
if (res.code === 0) {
|
|
parent.funController.tableRender();
|
|
funRecycleController.tableRender();
|
|
}
|
|
});
|
|
} else if (obj.event === "true-del") {
|
|
facade.popupConfirm({
|
|
text: "真的在回收站删除么?此次删除将不能还原",
|
|
route: window.apiPrefix + "trueDel",
|
|
data: { ids: [obj.data.id] }
|
|
});
|
|
}
|
|
if (indexes.length === 1) return indexes.pop();
|
|
else return indexes;
|
|
};
|
|
|
|
//初始化
|
|
laytp.init = {
|
|
/**
|
|
* 全局ajax设置
|
|
* - 设置默认的headers
|
|
* - ajax过度效果设置
|
|
*/
|
|
ajaxSet: function () {
|
|
let commonHeaders = {
|
|
"LayTp-Admin-Token": facade.getCookie("laytpAdminToken"),
|
|
"Cache-Control": "no-cache"
|
|
};
|
|
$.ajaxSetup({
|
|
timeout: 30000,
|
|
headers: commonHeaders,
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 点击按钮弹出表单层
|
|
* 所有拥有popupDiv类名的节点,点击后都会弹出层
|
|
* data-name 弹窗标题,默认为当前节点的html()
|
|
* data-url 必填,弹窗展示的静态文件url
|
|
* data-btn 弹出层底部按钮,只有两种设置方式,1.不设置,表示弹出一个表单,底部展示['确定','取消']两个按钮,点击确定按钮可以提交表单。2.设置为空字符串,表示弹出一个非表单层,仅展示页面,底部没有按钮,其他复杂的弹出层,比如有三个或者三个以上按钮,请自行编写JS实现
|
|
* data-width 属性为弹窗的宽度百分比,非必填,默认值在/a/index.html中设置
|
|
* data-height 属性为弹窗的高度百分比,非必填,默认值在/a/index.html中设置
|
|
* data-shade 属性为弹窗背景阴影,非必填,默认值在/a/index.html中设置
|
|
*/
|
|
popupDiv: function () {
|
|
$(document).off("click", ".popupDiv").on("click", ".popupDiv", function () {
|
|
let options = {};
|
|
options.title = $(this).data("title") ? $(this).data("title") : $(this).html();
|
|
options.shade = $(this).data("shade");
|
|
if (!options.shade) options.shade = 0.01;
|
|
options.width = $(this).data("width");
|
|
options.height = $(this).data("height");
|
|
options.path = $(this).data("url");
|
|
facade.popupDiv(options);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 点击按钮打开新的tab menu
|
|
* 所有拥有tabMenu类名的节点,点击后都会打开新的tab menu
|
|
* data-id 菜单ID,用于菜单自动选中
|
|
* data-url 必填,弹窗展示的静态文件url
|
|
* data-title tab菜单的名称
|
|
*/
|
|
openTabMenu: function () {
|
|
$(document).off("click", ".openTabMenu").on("click", ".openTabMenu", function () {
|
|
if (parent.config.tab.muiltTab) {
|
|
parent.bodyTab.addTabOnly({
|
|
id: $(this).data("id"),
|
|
title: $(this).data("title"),
|
|
url: $(this).data("url"),
|
|
icon: "",
|
|
close: true
|
|
}, 300);
|
|
} else {
|
|
parent.bodyFrame.changePage($(this).data("url"), "", true);
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 监听拥有laytpClickSearch样式的节点,点击进行表单搜索
|
|
*/
|
|
laytpClickSearch: function () {
|
|
$(document).off("click", ".laytpClickSearch").on("click", ".laytpClickSearch", function () {
|
|
let field = $(this).data('field');
|
|
if (!field) facade.error("tab的字段名未定义");
|
|
let value = $(this).data('val');
|
|
$("#" + field).val(value);
|
|
layui.form.render('select');
|
|
$("button[lay-filter=laytp-search-form]").click();
|
|
$("button[lay-filter=laytp-recycle-search-form]").click();
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 监听.delArrayItem节点,删除表格中的一行
|
|
* .delArrayItem节点存在的位置举例:系统配置,数组类型配置,删除某一个数组元素
|
|
*/
|
|
delArrayItem: function () {
|
|
$(document).off("click", ".delArrayItem").on('click', '.delArrayItem', function () {
|
|
let clickObj = $(this);
|
|
let childrenLength = clickObj.parent().parent().parent().children().length;
|
|
if (childrenLength > 2) {
|
|
clickObj.parent().parent().remove();
|
|
} else {
|
|
facade.error('请留下这唯一的一行数据');
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 监听.addArrayItem节点,追加表格中的一行
|
|
* .addArrayItem节点存在的位置举例:系统配置,数组类型配置,追加一个数组元素
|
|
*/
|
|
addArrayItem: function () {
|
|
$(document).off("click", ".addArrayItem").on('click', '.addArrayItem', function () {
|
|
let clickObj = $(this);
|
|
var itemHtml = clickObj.parent().parent().prev().prop("outerHTML");
|
|
clickObj.parent().parent().before(itemHtml);
|
|
layui.form.render();
|
|
layui.laytp.init.tableDnd();
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 监听.tableDnd节点,允许拖动排序
|
|
* .tableDnd节点存在的位置举例:系统配置,数组类型配置,拖动排序数组元素
|
|
*
|
|
* 要求
|
|
* - 页面上要加载jquery_3.3.1.js和jquery.tablednd.js两个js库
|
|
* - table的class要加上tableDnd
|
|
*
|
|
* 注意
|
|
* - 使用任意layui.js不存在的第三方jQuery库都需要加载
|
|
* ```
|
|
* /static/component/jquery_3.3.1.js
|
|
* ```
|
|
* - 然后再加载第三方jQuery库,比如当前是表格排序库
|
|
* ```
|
|
* /static/component/jquery.tablednd.js
|
|
* ```
|
|
* - 且一定要注意加载顺序,layui.js要优先加载,否则layui可能会报错
|
|
* - 先加载layui.js
|
|
* - 然后加载layuiConfig.js
|
|
* - 再加载jquery_3.3.1.js
|
|
* - 最后加载第三方jQuery库jquery.tablednd.js
|
|
*/
|
|
tableDnd: function () {
|
|
layui.each($(".tableDnd"), function (key, item) {
|
|
$(item).tableDnD({});
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 监听拥有layerTips样式的节点,渲染layerTips组件
|
|
* data-color 弹窗背景颜色
|
|
* data-time 弹窗展示时间,单位秒
|
|
* data-text 弹窗内文本
|
|
*/
|
|
layerTips: function () {
|
|
var tipsIndex;
|
|
// 鼠标进入层就展示Tips
|
|
$(document).off('mouseover', '.layerTips').on('mouseover', '.layerTips', function () {
|
|
let obj = $(this);
|
|
let color = (typeof obj.data('color') != 'undefined') ? obj.data('color') : '#3595CC';
|
|
let time = (typeof obj.data('time') != 'undefined') ? obj.data('time') : 5000;
|
|
let text = $(this).data('text');
|
|
tipsIndex = layui.layer.tips(text, this, {
|
|
tips: [4, color]
|
|
, time: time
|
|
});
|
|
});
|
|
|
|
// 鼠标离开层就关闭Tips
|
|
$(document).off('mouseout', '.layerTips').on('mouseout', '.layerTips', function () {
|
|
layui.layer.close(tipsIndex);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 监听拥有layerImgTips样式的节点,渲染layerImgTips组件
|
|
* data-time 弹窗展示时间,单位秒
|
|
* data-text 弹窗内文本
|
|
*/
|
|
layerImgTips: function () {
|
|
var tipsIndex;
|
|
// 鼠标进入层就展示Tips
|
|
$(document).off('mouseover', '.layerImgTips').on('mouseover', '.layerImgTips', function (e) {
|
|
let position = 2;
|
|
if (e.screenY > (window.screen.height) / 2) {
|
|
position = 1
|
|
}
|
|
let obj = $(this);
|
|
let time = (typeof obj.data('time') != 'undefined') ? obj.data('time') : 5000;
|
|
var img = "<img src='" + $(this).attr('src') + "' style='width:300px; max-height:400px;' />";
|
|
tipsIndex = layui.layer.tips(img, this, {
|
|
tips: [position]
|
|
, time: time
|
|
, area: ['300px']
|
|
, skin: "laytpLayerImgTips"
|
|
});
|
|
});
|
|
|
|
// 鼠标离开层就关闭Tips
|
|
$(document).off('mouseout', '.layerImgTips').on('mouseout', '.layerImgTips', function () {
|
|
layui.layer.close(tipsIndex);
|
|
});
|
|
},
|
|
|
|
//锁屏
|
|
lockScreen: function () {
|
|
let lockScreenStatus = localStorage.getItem("laytpLockScreen");
|
|
$(document).ready(function () {
|
|
if (lockScreenStatus === "locked") {
|
|
layui.facade.popupDiv({
|
|
title: '锁屏',
|
|
path: '/admin/lockScreen.html',
|
|
shade: 0.5
|
|
});
|
|
}
|
|
});
|
|
|
|
$(document).on('click', '#lockScreen', function () {
|
|
layui.layer.confirm('锁屏后,需要使用登录密码解锁,确定锁屏么?', { title: "锁屏确认继续", skin: "laytp" }, function (index) {
|
|
layui.layer.close(index);
|
|
localStorage.setItem("laytpLockScreen", "locked");
|
|
layui.facade.popupDiv({
|
|
title: '锁屏',
|
|
path: '/admin/lockScreen.html',
|
|
shade: 0.5
|
|
});
|
|
});
|
|
});
|
|
},
|
|
};
|
|
|
|
layui.each(laytp.init, function (key, item) {
|
|
if (typeof item === "function") {
|
|
item();
|
|
}
|
|
});
|
|
|
|
layui.laytpForm.render();
|
|
|
|
//输出模块
|
|
exports(MOD_NAME, laytp);
|
|
|
|
layui.laytp = laytp;
|
|
window.laytp = laytp;
|
|
window.$ = $;
|
|
}); |