Files
cashier/public/static/plugs/easy-admin/easy-admin.js
你的名字 ac0f12b21a 1
2025-10-15 14:53:54 +08:00

1914 lines
93 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

define(["jquery", "tableSelect", "switchSelect", "miniTheme", "clipboard", "xmSelect", "lazyload"], function ($, tableSelect, switchSelect, miniTheme, ClipboardJS,xmSelect, lazyload) {
//切换日夜模式
window.onInitElemStyle = function () {
try {
miniTheme.renderElemStyle();
$('iframe').each(function (index, iframe) {
if (typeof iframe.contentWindow.onInitElemStyle == "function") {
iframe.contentWindow.onInitElemStyle();
}
});
miniTheme.changeThemeMainColor();
} catch (e) {
}
};
window.onInitElemStyle();
var form = layui.form,
layer = layui.layer,
table = layui.table,
laydate = layui.laydate,
upload = layui.upload,
element = layui.element,
laytpl = layui.laytpl,
tableSelect = layui.tableSelect,
switchSelect = layui.switchSelect,
util = layui.util;
layer.config({
skin: 'layui-layer-easy'
});
var init = {
table_elem: '#currentTable',
table_render_id: 'currentTableRenderId',
upload_url: 'ajax/upload',
upload_exts: 'doc|gif|ico|icon|jpg|mp3|mp4|p12|pem|png|rar',
csrf_token: window.CONFIG.CSRF_TOKEN,
wait_submit: false,
xmSelectList: {},
xmSelectModel: {},
};
var admin = {
config: {
shade: [0.02, '#000'],
},
url: function (url) {
return '/' + CONFIG.ADMIN + '/' + url;
},
headers: function () {
return {'X-CSRF-TOKEN': init.csrf_token};
},
//js版empty判断变量是否为空
empty: function (r) {
var n, t, e, f = [void 0, null, !1, 0, "", "0"];
for (t = 0, e = f.length; t < e; t++) if (r === f[t]) return !0;
if ("object" == typeof r) {
for (n in r) if (r.hasOwnProperty(n)) return !1;
return !0
}
return !1
},
checkAuth: function (node, elem) {
if (CONFIG.IS_SUPER_ADMIN) {
return true;
}
if ($(elem).attr('data-auth-' + node) === '1') {
return true;
} else {
return false;
}
},
parame: function (param, defaultParam) {
return param !== undefined ? param : defaultParam;
},
request: {
post: function (option, ok, no, ex) {
return admin.request.ajax('post', option, ok, no, ex);
},
get: function (option, ok, no, ex) {
return admin.request.ajax('get', option, ok, no, ex);
},
ajax: function (type, option, ok, no, ex) {
type = type || 'get';
option.url = option.url || '';
option.data = option.data || {};
option.prefix = option.prefix || false;
option.statusName = option.statusName || 'code';
option.statusCode = option.statusCode || 1;
ok = ok || function (res) {
};
no = no || function (res) {
var msg = res.msg == undefined ? '返回数据格式有误' : res.msg;
admin.msg.error(msg);
return false;
};
ex = ex || function (res) {
};
if (option.url == '') {
admin.msg.error('请求地址不能为空');
return false;
}
if (option.prefix == true) {
option.url = admin.url(option.url);
}
// var index = admin.msg.loading('加载中');
$.ajax({
url: option.url,
type: type,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
dataType: "json",
headers: admin.headers(),
data: option.data,
timeout: 60000,
success: function (res) {
// admin.msg.close(index);
if (eval('res.' + option.statusName) == option.statusCode) {
return ok(res);
} else {
return no(res);
}
},
error: function (xhr, textstatus, thrown) {
admin.msg.error('Status:' + xhr.status + '' + xhr.statusText + ',请稍后再试!', function () {
ex(this);
});
return false;
},
complete: function (data) {
// @todo 刷新csrf-token
let token = data.responseJSON ? data.responseJSON.__token__ : ''
init.csrf_token = token
init.wait_submit = false
}
});
}
},
common: {
parseNodeStr: function (node) {
var array = node.split('/');
$.each(array, function (key, val) {
if (key === 0) {
val = val.split('.');
$.each(val, function (i, v) {
val[i] = admin.common.humpToLine(v.replace(v[0], v[0].toLowerCase()));
});
val = val.join(".");
array[key] = val;
}
});
node = array.join("/");
return node;
},
lineToHump: function (name) {
return name.replace(/\_(\w)/g, function (all, letter) {
return letter.toUpperCase();
});
},
humpToLine: function (name) {
return name.replace(/([A-Z])/g, "_$1").toLowerCase();
},
},
msg: {
// 成功消息
success: function (msg, callback) {
if (callback === undefined) {
callback = function () {
}
}
var index = layer.msg(msg, {icon: 1, shade: admin.config.shade, scrollbar: false, time: 2000, shadeClose: true}, callback);
return index;
},
// 失败消息
error: function (msg, callback) {
if (callback === undefined) {
callback = function () {
}
}
var index = layer.msg(msg, {icon: 2, shade: admin.config.shade, scrollbar: false, time: 3000, shadeClose: true}, callback);
return index;
},
// 警告消息框
alert: function (msg, callback) {
var index = layer.alert(msg, {end: callback, scrollbar: false});
return index;
},
// 对话框
confirm: function (msg, ok, no) {
var index = layer.confirm(msg, {title: '操作确认', btn: ['确认', '取消']}, function () {
typeof ok === 'function' && ok.call(this);
}, function () {
typeof no === 'function' && no.call(this);
self.close(index);
});
return index;
},
// 消息提示
tips: function (msg, time, callback) {
var index = layer.msg(msg, {time: (time || 3) * 1000, shade: this.shade, end: callback, shadeClose: true});
return index;
},
// 加载中提示
loading: function (msg, callback) {
var index = msg ? layer.msg(msg, {icon: 16, scrollbar: false, shade: this.shade, time: 0, end: callback}) : layer.load(2, {time: 0, scrollbar: false, shade: this.shade, end: callback});
return index;
},
// 关闭消息框
close: function (index) {
return layer.close(index);
}
},
table: {
render: function (options) {
options.init = options.init || init;
options.modifyReload = admin.parame(options.modifyReload, true);
options.elem = options.elem || options.init.table_elem;
options.id = options.id || options.init.table_render_id;
options.layFilter = options.id + '_LayFilter';
options.url = options.url || admin.url(options.init.index_url);
options.headers = admin.headers();
options.page = admin.parame(options.page, true);
options.search = admin.parame(options.search, true);
options.skin = options.skin || 'line';
options.limit = options.limit || 15;
options.limits = options.limits || [10, 15, 20, 25, 50, 100];
options.cols = options.cols || [];
let searchBtn = options.search ? {
title: '搜索',
layEvent: 'TABLE_SEARCH',
icon: 'layui-icon-search',
extend: 'data-table-id="' + options.id + '"'
} : []
options.defaultToolbar = options.defaultToolbar !== false ? (
(options.defaultToolbar === undefined ? ['filter', 'print', 'exports'].concat(searchBtn) : options.defaultToolbar.concat(searchBtn))
) : false;
// 判断是否为移动端
if (admin.checkMobile()) {
options.defaultToolbar = options.defaultToolbar !== false ? (
!options.search ? ['filter'] : ['filter', {
title: '搜索',
layEvent: 'TABLE_SEARCH',
icon: 'layui-icon-search',
extend: 'data-table-id="' + options.id + '"'
}]) : false;
}
// 判断元素对象是否有嵌套的
options.cols = admin.table.formatCols(options.cols, options.init);
// 初始化表格lay-filter
$(options.elem).attr('lay-filter', options.layFilter);
// 初始化表格搜索
if (options.search === true) {
admin.table.renderSearch(options.cols, options.elem, options.id);
}
// 初始化表格左上方工具栏
options.toolbar = options.toolbar || ['refresh', 'add', 'delete', 'export', 'recycle'];
options.toolbar = admin.table.renderToolbar(options.toolbar, options.elem, options.id, options.init);
// 判断是否有操作列表权限
options.cols = admin.table.renderOperat(options.cols, options.elem);
// 判断是否有初始默认搜索条件
options.where = {}
$.each(options.cols, function (_, colsV) {
let formatFilter = {}
let formatOp = {}
$.each(colsV, function (i, v) {
if (v.field) {
if (v.searchValue) {
formatFilter[v.field] = v.searchValue
formatOp[v.field] = v.searchOp || '='
options.where['filter'] = JSON.stringify(formatFilter);
options.where['op'] = JSON.stringify(formatOp);
}
}
})
})
// 初始化表格
var newTable = table.render(options);
// 监听表格搜索开关显示
admin.table.listenToolbar(options.layFilter, options.id);
// 监听表格开关切换
admin.table.renderSwitch(options.cols, options.init, options.id, options.modifyReload);
// 监听表格开关切换
admin.table.listenEdit(options.init, options.layFilter, options.id, options.modifyReload);
// 监听表格排序
admin.table.listenSort(options);
return newTable;
},
renderToolbar: function (data, elem, tableId, init) {
data = data || [];
if (typeof data == "object") {
var toolbarHtml = '';
$.each(data, function (i, v) {
if (v === 'refresh') {
toolbarHtml += ' <button class="layui-btn layui-btn-sm layuimini-btn-primary" data-table-refresh="' + tableId + '"><i class="fa fa-refresh"></i> </button>\n';
} else if (v === 'add') {
if (admin.checkAuth('add', elem)) {
toolbarHtml += '<button class="layui-btn layui-btn-normal layui-btn-sm" data-open="' + init.add_url + '" data-title="添加"><i class="fa fa-plus"></i> 添加</button>\n';
}
} else if (v === 'delete') {
if (admin.checkAuth('delete', elem)) {
toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-danger" data-url="' + init.delete_url + '" data-table-delete="' + tableId + '"><i class="fa fa-trash"></i> 删除</button>\n';
}
} else if (v === 'export') {
if (admin.checkAuth('export', elem)) {
toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-success easyadmin-export-btn" data-url="' + init.export_url + '" data-table-export="' + tableId + '"><i class="fa fa-file-excel"></i> 导出</button>\n';
}
} else if (v === 'recycle') {
if (init.recycle_url === undefined) {
console.warn('未定义回收站地址 init.recycle_url')
return false
}
if (admin.checkAuth('recycle', elem)) {
toolbarHtml += '<button class="layui-btn layui-btn-sm layui-bg-orange" data-open="' + init.recycle_url + '" data-title="回收站"><i class="fa fa-recycle"></i> 回收站</button>\n';
}
} else if (typeof v === "object") {
$.each(v, function (ii, vv) {
vv.class = vv.class || '';
vv.icon = vv.icon || '';
vv.auth = vv.auth || '';
vv.url = vv.url || '';
vv.method = vv.method || 'open';
vv.title = vv.title || vv.text;
vv.text = vv.text || vv.title;
vv.extend = vv.extend || '';
vv.checkbox = vv.checkbox || false;
if (admin.checkAuth(vv.auth, elem)) {
toolbarHtml += admin.table.buildToolbarHtml(vv, tableId);
}
});
}
});
return '<div>' + toolbarHtml + '</div>';
}
return data
},
renderSearch: function (cols, elem, tableId) {
// TODO 只初始化第一个table搜索字段如果存在多个(绝少数需求),得自己去扩展
cols = cols[0] || {};
var newCols = [];
var formHtml = '';
$.each(cols, function (i, d) {
d.field = d.field || false;
d.fieldAlias = admin.parame(d.fieldAlias, d.field);
d.title = d.title || d.field || '';
d.selectList = d.selectList || {};
d.search = admin.parame(d.search, true);
d.searchTip = d.searchTip || '请输入' + d.title || '';
d.searchValue = d.searchValue || '';
d.laySearch = d.laySearch || false;
d.searchOp = d.searchOp || '%*%';
d.timeType = d.timeType || 'datetime';
if (d.field !== false && d.search !== false) {
switch (d.search) {
case true:
formHtml += '\t<div class="layui-form-item layui-inline">\n' +
'<label class="layui-form-label">' + d.title + '</label>\n' +
'<div class="layui-input-inline">\n' +
'<input id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
'</div>\n' +
'</div>';
break;
case 'select':
d.searchOp = '=';
var selectHtml = '';
$.each(d.selectList, function (sI, sV) {
var selected = '';
if (sI == d.searchValue) {
selected = 'selected=""';
}
selectHtml += '<option value="' + sI + '" ' + selected + '>' + sV + '</option>/n';
});
var laySearch = ''
if (true === d.laySearch) {
laySearch = 'lay-search'
}
formHtml += '\t<div class="layui-form-item layui-inline">\n' +
'<label class="layui-form-label">' + d.title + '</label>\n' +
'<div class="layui-input-inline">\n' +
'<select class="layui-select" id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" ' + laySearch + '>\n' +
'<option value="">- 全部 -</option> \n' +
selectHtml +
'</select>\n' +
'</div>\n' +
'</div>';
break;
case 'xmSelect':
formHtml += '\t<div class="layui-form-item layui-inline">\n' +
'<label class="layui-form-label">' + d.title + '</label>\n' +
'<div class="layui-input-inline">\n' +
'<div id="c-' + d.fieldAlias + '" class="tableSearch-xmSelect xmSelect-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" data-search-value="' + d.searchValue + '"></div>\n' +
'</div>\n' +
'</div>';
init.xmSelectList[d.fieldAlias] = d.selectList
break;
case 'range':
d.searchOp = 'range';
formHtml += '\t<div class="layui-form-item layui-inline">\n' +
'<label class="layui-form-label">' + d.title + '</label>\n' +
'<div class="layui-input-inline">\n' +
'<input style="width: 275px;font-size: 0.82rem" id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
'</div>\n' +
'</div>';
break;
case 'time':
d.searchOp = '=';
formHtml += '\t<div class="layui-form-item layui-inline">\n' +
'<label class="layui-form-label">' + d.title + '</label>\n' +
'<div class="layui-input-inline">\n' +
'<input id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
'</div>\n' +
'</div>';
break;
case 'date':
d.searchOp = '=';
formHtml += `<div class="layui-form-item layui-inline">
<label class="layui-form-label">${d.title}</label>
<div class="layui-input-inline">
<input data-date data-date-type="date" id="c-${d.fieldAlias}" name="${d.fieldAlias}" data-search-op="${d.searchOp}" value="${d.searchValue}" placeholder="${d.searchTip}" class="layui-input">
</div>
</div>`
break;
case 'datetime':
// 适用于日期格式yyyy-MM-dd HH:mm:ss
d.searchOp = 'datetime';
formHtml += '<div class="layui-form-item layui-inline">\n' +
'<label class="layui-form-label">' + d.title + '</label>\n' +
'<div class="layui-input-inline">\n' +
'<input style="width: 275px;font-size: 0.82rem" id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
'</div>\n' +
'</div>';
break;
}
newCols.push(d);
}
});
if (formHtml !== '') {
// 默认显示搜索表单
let searchTableShow = $(elem).attr('searchTableShow') || 'true'
// 默认关闭搜索表单自动补全功能
let searchTableAutocomplete = $(elem).attr('searchTableAutocomplete') || 'false'
let tableSearchClass = searchTableShow === 'false' ? 'table-search-fieldset layui-hide' : 'table-search-fieldset'
$(elem).before('<fieldset id="searchFieldset_' + tableId + '" class="' + tableSearchClass + '">\n' +
'<legend>条件搜索</legend>\n' +
'<form class="layui-form layui-form-pane form-search">\n' +
formHtml +
'<div class="layui-form-item layui-inline" style="margin-left: 115px">\n' +
'<button type="submit" class="layui-btn layui-btn-normal" data-type="tableSearch" data-table="' + tableId + '" lay-submit lay-filter="' + tableId + '_filter"> 搜 索</button>\n' +
'<button type="reset" class="layui-btn layui-btn-primary" data-table-reset="' + tableId + '"> 重 置 </button>\n' +
' </div>' +
'</form>' +
'</fieldset>');
admin.table.listenTableSearch(tableId);
// 初始化form表单
form.set({
// 是否阻止 input 框默认的自动输入完成功能
autocomplete: searchTableAutocomplete == 'false' ? 'off' : 'on'
})
form.render();
$.each(newCols, function (ncI, ncV) {
if (ncV.search === 'range' || ncV.search === 'datetime') {
laydate.render({
range: true, type: ncV.timeType, elem: '[name="' + ncV.fieldAlias + '"]', rangeLinked: true,
shortcuts: getRangeShortcuts()
});
}
if (ncV.search === 'time') {
laydate.render({type: ncV.timeType, elem: '[name="' + ncV.fieldAlias + '"]'});
}
});
}
},
renderSwitch: function (cols, tableInit, tableId, modifyReload) {
tableInit.modify_url = tableInit.modify_url || false;
cols = cols[0] || {};
tableId = tableId || init.table_render_id;
if (cols.length > 0) {
$.each(cols, function (i, v) {
v.filter = v.filter || false;
if (v.filter !== false && tableInit.modify_url !== false) {
admin.table.listenSwitch({filter: v.filter, url: tableInit.modify_url, tableId: tableId, modifyReload: modifyReload});
}
});
}
},
renderOperat(data, elem) {
for (dk in data) {
var col = data[dk];
var operat = col[col.length - 1].operat;
if (operat !== undefined) {
var check = false;
for (key in operat) {
var item = operat[key];
if (typeof item === 'string') {
if (admin.checkAuth(item, elem)) {
check = true;
break;
}
} else {
for (k in item) {
var v = item[k];
if (v.auth !== undefined && admin.checkAuth(v.auth, elem)) {
check = true;
break;
}
}
}
}
if (!check) {
data[dk].pop()
}
}
}
return data;
},
buildToolbarHtml: function (toolbar, tableId) {
var html = '';
toolbar.class = toolbar.class || '';
toolbar.icon = toolbar.icon || '';
toolbar.auth = toolbar.auth || '';
toolbar.url = toolbar.url || '';
toolbar.extend = toolbar.extend || '';
toolbar.method = toolbar.method || 'open';
toolbar.field = toolbar.field || 'id';
toolbar.title = toolbar.title || toolbar.text;
toolbar.text = toolbar.text || toolbar.title;
toolbar.checkbox = toolbar.checkbox || false;
var formatToolbar = toolbar;
formatToolbar.icon = formatToolbar.icon !== '' ? '<i class="' + formatToolbar.icon + '"></i> ' : '';
formatToolbar.class = formatToolbar.class !== '' ? 'class="' + formatToolbar.class + '" ' : '';
if (toolbar.method === 'open') {
formatToolbar.method = formatToolbar.method !== '' ? 'data-open="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : '';
} else if (toolbar.method === 'none') { // 常用于与extend配合自定义监听按钮
formatToolbar.method = '';
} else {
formatToolbar.method = formatToolbar.method !== '' ? 'data-request="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : '';
}
formatToolbar.checkbox = toolbar.checkbox ? ' data-checkbox="true" ' : '';
formatToolbar.tableId = tableId !== undefined ? ' data-table="' + tableId + '" ' : '';
html = '<button ' + formatToolbar.class + formatToolbar.method + formatToolbar.extend + formatToolbar.checkbox + formatToolbar.tableId + '>' + formatToolbar.icon + formatToolbar.text + '</button>';
return html;
},
buildOperatHtml: function (operat, data) {
var html = '';
operat.class = operat.class || '';
operat.icon = operat.icon || '';
operat.auth = operat.auth || '';
operat.url = operat.url || '';
operat.extend = operat.extend || '';
operat.method = operat.method || 'open';
operat.field = operat.field || 'id';
operat.title = operat.title || operat.text;
operat.text = operat.text || operat.title;
operat.visible = typeof operat.visible !== 'undefined' ? operat.visible : true;
var formatOperat = operat;
formatOperat.icon = formatOperat.icon !== '' ? '<i class="' + formatOperat.icon + '"></i> ' : '';
formatOperat.class = formatOperat.class !== '' ? 'class="' + formatOperat.class + '" ' : '';
if (operat.method === 'open') {
formatOperat.method = formatOperat.method !== '' ? 'data-open="' + formatOperat.url + '" data-title="' + formatOperat.title + '" ' : '';
} else if (operat.method === 'none') { // 常用于与extend配合自定义监听按钮
formatOperat.method = '';
} else {
formatOperat.method = formatOperat.method !== '' ? 'data-request="' + formatOperat.url + '" data-title="' + formatOperat.title + '" ' : '';
}
html = '<a ' + formatOperat.class + formatOperat.method + formatOperat.extend + '>' + formatOperat.icon + formatOperat.text + '</a>';
if ('function' === typeof formatOperat.visible) {
let visible = formatOperat.visible(data);
if (typeof visible === 'boolean') {
if (!visible) html = ''
}
} else {
if (typeof formatOperat.visible === 'boolean') {
if (!formatOperat.visible) html = ''
}
}
return html;
},
toolSpliceUrl(url, field, data) {
url = url.indexOf("?") !== -1 ? url + '&' + field + '=' + data[field] : url + '?' + field + '=' + data[field];
return url;
},
formatCols: function (cols, init) {
for (i in cols) {
var col = cols[i];
for (index in col) {
var val = col[index];
// 判断是否包含初始化数据
if (val.init === undefined) {
cols[i][index]['init'] = init;
}
// 格式化列操作栏
if (val.templet === admin.table.tool && val.operat === undefined) {
cols[i][index]['operat'] = ['edit', 'delete'];
}
// 判断是否包含开关组件
if (val.templet === admin.table.switch && val.filter === undefined) {
cols[i][index]['filter'] = val.field;
}
// 判断是否含有搜索下拉列表
if (val.selectList !== undefined && val.search === undefined) {
cols[i][index]['search'] = 'select';
}
// 判断是否初始化对齐方式
if (val.align === undefined) {
cols[i][index]['align'] = 'center';
}
// 部分字段开启排序
var sortDefaultFields = ['id', 'sort'];
if (val.sort === undefined && sortDefaultFields.indexOf(val.field) >= 0) {
cols[i][index]['sort'] = true;
}
// 初始化图片高度
if (val.templet === admin.table.image && val.imageHeight === undefined) {
cols[i][index]['imageHeight'] = 40;
}
// 判断是否多层对象
if (val.field !== undefined && val.field.split(".").length > 1) {
if (val.templet === undefined) {
cols[i][index]['templet'] = admin.table.value;
}
}
// 判断是否列表数据转换
if (val.selectList !== undefined && val.templet === undefined) {
cols[i][index]['templet'] = admin.table.list;
}
}
}
return cols;
},
tool: function (data, option) {
var option = data.LAY_COL || {};
option.operat = option.operat || ['edit', 'delete'];
var elem = option.init.table_elem || init.table_elem;
var html = '';
$.each(option.operat, function (i, item) {
if (typeof item === 'string') {
switch (item) {
case 'edit':
var operat = {
class: 'layui-btn layui-btn-success layui-btn-xs',
method: 'open',
field: 'id',
icon: '',
text: '编辑',
title: '编辑信息',
auth: 'edit',
url: option.init.edit_url,
extend: ""
};
operat.url = admin.table.toolSpliceUrl(operat.url, operat.field, data);
if (admin.checkAuth(operat.auth, elem)) {
html += admin.table.buildOperatHtml(operat, data);
}
break;
case 'delete':
var operat = {
class: 'layui-btn layui-btn-danger layui-btn-xs',
method: 'get',
field: 'id',
icon: '',
text: '删除',
title: '确定删除?',
auth: 'delete',
url: option.init.delete_url,
extend: ""
};
operat.url = admin.table.toolSpliceUrl(operat.url, operat.field, data);
if (admin.checkAuth(operat.auth, elem)) {
html += admin.table.buildOperatHtml(operat, data);
}
break;
}
} else if (typeof item === 'object') {
$.each(item, function (i, operat) {
if (typeof operat !== 'object') return
if ('function' === typeof operat.templet) {
html += operat.templet(data);
return true;
}
operat.class = operat.class || '';
operat.icon = operat.icon || '';
operat.auth = operat.auth || '';
operat.url = operat.url || '';
operat.method = operat.method || 'open';
operat.field = operat.field || 'id';
operat.title = operat.title || operat.text;
operat.text = operat.text || operat.title;
operat.extend = operat.extend || '';
// 自定义表格opreat按钮的弹窗标题风格extra是表格里的欲加入标题中的字段
operat.extra = operat.extra || '';
if (data[operat.extra] !== undefined) {
operat.title = data[operat.extra] + ' - ' + operat.title;
}
operat.url = admin.table.toolSpliceUrl(operat.url, operat.field, data);
if (admin.checkAuth(operat.auth, elem)) {
html += admin.table.buildOperatHtml(operat, data);
}
});
}
});
return html;
},
list: function (data, option) {
var option = data.LAY_COL || {};
option.selectList = option.selectList || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
if (option.selectList[value] === undefined || option.selectList[value] === '' || option.selectList[value] === null) {
return value;
} else {
return option.selectList[value];
}
},
image: function (data, option) {
var option = data.LAY_COL || {};
option.imageWidth = option.imageWidth || 200;
option.imageHeight = option.imageHeight || 40;
option.imageSplit = option.imageSplit || '|';
option.imageJoin = option.imageJoin || '<br>';
option.title = option.title || option.field;
var field = option.field,
title = data[option.title];
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
if (value === undefined || value === null) {
return '<img style="max-width: ' + option.imageWidth + 'px; max-height: ' + option.imageHeight + 'px;" src="' + value + '" data-image="' + title + '">';
} else {
var values = value.split(option.imageSplit),
valuesHtml = [];
values.forEach((value, index) => {
valuesHtml.push('<img style="max-width: ' + option.imageWidth + 'px; max-height: ' + option.imageHeight + 'px;" class="lazyload" src="/static/common/images/loading.gif" data-src="' + value + '" data-image="' + title + '">');
});
$(function () {
$("img.lazyload").lazyload({threshold: 1});
})
return valuesHtml.join(option.imageJoin);
}
},
url: function (data, option) {
var option = data.LAY_COL || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
if (option?.copy) {
return '<button class="layui-btn layui-btn-sm layui-btn-danger copy-text" data-clipboard-text="' + value + '"><span>复制</span></button>';
} else {
return '<a class="layuimini-table-url" href="' + value + '" target="_blank" class="label bg-green">' + value + '</a>';
}
},
switch: function (data, option) {
var option = data.LAY_COL || {};
option.filter = option.filter || option.field || null;
option.checked = option.checked || 1;
option.tips = option.tips || '|';
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
var checked = value === option.checked ? 'checked' : '';
return laytpl('<input type="checkbox" name="' + option.field + '" value="' + data.id + '" lay-skin="switch" lay-text="' + option.tips + '" lay-filter="' + option.filter + '" ' + checked + ' >').render(data);
},
price: function (data, option) {
var option = data.LAY_COL || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
return '<span>' + value + '</span>';
},
percent: function (data, option) {
var option = data.LAY_COL || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
return '<span>' + value + '%</span>';
},
icon: function (data, option) {
var option = data.LAY_COL || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
return '<i class="' + value + '"></i>';
},
text: function (data, option) {
var option = data.LAY_COL || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
if (option?.copy) {
return `<span class="line-limit-length copy-text" data-clipboard-text="${value}">${value}</span>`;
}
return '<span class="line-limit-length">' + value + '</span>';
},
value: function (data, option) {
var option = data.LAY_COL || {};
try {
var value = admin.table.defaultValue(data);
} catch (e) {
var value = undefined;
}
return '<span>' + value + '</span>';
},
//时间戳转日期
date: function (data, option) {
var option = data.LAY_COL || {};
var field = option.field, value = '';
try {
value = eval("data." + field);
} catch (e) {
}
if (!admin.empty(value)) {
value = util.toDateString(value * 1000, option.format || 'yyyy-MM-dd HH:mm:ss');
}
return '<span>' + value + '</span>';
},
// 统一列返回数据处理
defaultValue(data, field, _value) {
if (!data.LAY_COL) {
return '';
}
var option = data.LAY_COL || {};
field = field || option.field;
_value = _value || option.defaultValue;
var valueParser = option.valueParser;
var value = _value;
try {
value = eval("data." + field);
} catch (e) {
value = undefined;
}
if (_value != undefined && admin.empty(value)) {
value = defaultValue;
}
if (typeof valueParser == 'function') {
value = valueParser(value, data);
}
return value;
},
listenTableSearch: function (tableId) {
if (Object.keys(init.xmSelectList).length > 0) {
$.each(init.xmSelectList, function (index, value) {
let xmSearchValue = $('#c-' + index).data('search-value') || [];
if (!Array.isArray(xmSearchValue)) xmSearchValue = (xmSearchValue.toString()).split(',')
const keysArray = Object.keys(value).map((key) => {
return {name: value[key], value: key, selected: xmSearchValue.indexOf(key) !== -1}
})
init.xmSelectModel[index] = xmSelect.render({
el: '.xmSelect-' + index, language: 'zn', data: keysArray, name: index,
filterable: true, paging: true, pageSize: 10, toolbar: {show: true},
theme: {color: getComputedStyle(document.documentElement).getPropertyValue('--ea8-theme-main-color') || '#16b777'}
})
})
}
form.on('submit(' + tableId + '_filter)', function (data) {
var dataField = data.field;
var formatFilter = {},
formatOp = {};
$.each(dataField, function (key, val) {
if (val !== '') {
formatFilter[key] = val;
var op = $('#c-' + key).attr('data-search-op');
op = op || '%*%';
formatOp[key] = op;
}
});
table.reload(tableId, {
page: {
curr: 1
}
, where: {
filter: JSON.stringify(formatFilter),
op: JSON.stringify(formatOp)
}
}, 'data');
return false;
});
},
listenSwitch: function (option, ok) {
option.filter = option.filter || '';
option.url = option.url || '';
option.field = option.field || option.filter || '';
option.tableId = option.tableId || init.table_render_id;
option.modifyReload = option.modifyReload || false;
form.on('switch(' + option.filter + ')', function (obj) {
var checked = obj.elem.checked ? 1 : 0;
if (typeof ok === 'function') {
return ok({
id: obj.value,
checked: checked,
});
} else {
var data = {
id: obj.value,
field: option.field,
value: checked,
};
admin.request.post({
url: option.url,
prefix: true,
data: data,
}, function (res) {
if (option.modifyReload) {
table.reload(option.tableId);
}
}, function (res) {
admin.msg.error(res.msg, function () {
table.reload(option.tableId);
});
}, function () {
table.reload(option.tableId);
});
}
});
},
listenToolbar: function (layFilter, tableId) {
table.on('toolbar(' + layFilter + ')', function (obj) {
// 搜索表单的显示
switch (obj.event) {
case 'TABLE_SEARCH':
var searchFieldsetId = 'searchFieldset_' + tableId;
var _that = $("#" + searchFieldsetId);
if (_that.hasClass("layui-hide")) {
_that.removeClass('layui-hide');
} else {
_that.addClass('layui-hide');
}
break;
}
});
},
listenEdit: function (tableInit, layFilter, tableId, modifyReload) {
tableInit.modify_url = tableInit.modify_url || false;
tableId = tableId || init.table_render_id;
if (tableInit.modify_url !== false) {
table.on('edit(' + layFilter + ')', function (obj) {
var value = obj.value,
data = obj.data,
id = data.id,
field = obj.field;
var _data = {
id: id,
field: field,
value: value,
};
admin.request.post({
url: tableInit.modify_url,
prefix: true,
data: _data,
}, function (res) {
if (modifyReload) {
table.reload(tableId);
}
}, function (res) {
admin.msg.error(res.msg, function () {
table.reload(tableId);
});
}, function () {
table.reload(tableId);
});
});
}
},
listenSort: function (options) {
table.on('sort(' + options.layFilter + ')', function (obj) {
let defaultWhere = {}
$.each(options.cols, function (_, colsV) {
let formatFilter = {}
let formatOp = {}
$.each(colsV, function (i, v) {
if (v.field) {
if ($('#c-' + v.field).val()) {
formatFilter[v.field] = $('#c-' + v.field).val()
formatOp[v.field] = v.searchOp || '='
defaultWhere['filter'] = JSON.stringify(formatFilter);
defaultWhere['op'] = JSON.stringify(formatOp);
}
}
})
})
let sortWhere = {tableOrder: obj.field + ' ' + obj.type}
table.reload(options.id, {
where: {...defaultWhere, ...sortWhere}
});
});
}
},
checkMobile: function () {
var userAgentInfo = navigator.userAgent;
var mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
var mobile_flag = false;
//根据userAgent判断是否是手机
for (var v = 0; v < mobileAgents.length; v++) {
if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
mobile_flag = true;
break;
}
}
var screen_width = window.screen.width;
var screen_height = window.screen.height;
//根据屏幕分辨率判断是否是手机
if (screen_width < 600 && screen_height < 800) {
mobile_flag = true;
}
return mobile_flag;
},
open: function (title, url, width, height, isResize, shadeClose = false) {
isResize = isResize === undefined ? true : isResize;
var index = layer.open({
title: title,
type: 2,
area: [width, height],
content: url,
maxmin: true,
anim: 0,
moveOut: true,
shade: 0.3,
shadeClose: shadeClose,
scrollbar: false,
before: function () {
},
success: function (layero, index) {
if (window.CONFIG.IFRAME_OPEN_TOP == '1') {
let iframeUrl = ``
try {
let iframeId = $('iframe:eq(0)').attr('id')
let iframe = document.getElementById(iframeId)
iframeUrl = iframe.contentWindow.location.href
} catch (e) {
iframeUrl = location.href
}
let _winTopBtn = `
<span class="_winTopBtn layui-btn layui-btn-primary layui-btn-xs"
style="position: absolute;top: 14px;right: 120px;color: #fff;border-color: #fff;" onclick="window.open('${iframeUrl}')">
新标签页打开
</span>`
$('.layui-layer-iframe').append(_winTopBtn)
}
},
end: function () {
index = null
}
});
if (admin.checkMobile()) {
layer.full(index);
}
if (isResize) {
$(window).on("resize", function () {
index && layer.full(index);
})
}
},
listen: function (preposeCallback, ok, no, ex) {
// 监听表单是否为必填项
admin.api.formRequired();
// 监听表单提交事件
admin.api.formSubmit(preposeCallback, ok, no, ex);
// 初始化图片显示以及监听上传事件
admin.api.upload();
// 监听富文本初始化
admin.api.editor();
// 监听下拉选择生成
admin.api.select();
// 监听时间控件生成
admin.api.date();
form.render();
// 表格修改
$("body").on("mouseenter", ".table-edit-tips", function () {
var openTips = layer.tips('点击行内容可以进行修改', $(this), {tips: [2, '#e74c3c'], time: 4000});
});
// 监听弹出层的打开
$('body').on('click', '[data-open]', function () {
var clienWidth = $(this).attr('data-width'),
clientHeight = $(this).attr('data-height'),
dataFull = $(this).attr('data-full'),
checkbox = $(this).attr('data-checkbox'),
url = $(this).attr('data-open'),
external = $(this).attr('data-external') || false,
tableId = $(this).attr('data-table');
if (checkbox === 'true') {
tableId = tableId || init.table_render_id;
var checkStatus = table.checkStatus(tableId),
data = checkStatus.data;
if (data.length <= 0) {
admin.msg.error('请勾选需要操作的数据');
return false;
}
var ids = [];
$.each(data, function (i, v) {
ids.push(v.id);
});
if (url.indexOf("?") === -1) {
url += '?id=' + ids.join(',');
} else {
url += '&id=' + ids.join(',');
}
}
if (clienWidth === undefined || clientHeight === undefined) {
clienWidth = '65%';
clientHeight = '85%';
}
if (dataFull === 'true') {
clienWidth = '100%';
clientHeight = '100%';
}
admin.open(
$(this).attr('data-title'),
external ? url : admin.url(url),
clienWidth,
clientHeight,
);
});
// 放大图片
$('body').on('click', '[data-image]', function () {
var title = $(this).attr('data-image'),
src = $(this).attr('src'),
alt = $(this).attr('alt');
var photos = {
"title": title,
"id": Math.random(),
"data": [
{
"alt": alt,
"pid": Math.random(),
"src": src,
"thumb": src
}
]
};
layer.photos({
photos: photos,
anim: 5
});
return false;
});
// 放大一组图片
$('body').on('click', '[data-images]', function () {
var title = $(this).attr('data-images'),
// 从当前元素向上找layuimini-upload-show找到第一个后停止, 再找其所有子元素li
doms = $(this).closest(".layuimini-upload-show").children("li"),
// 被点击的图片地址
now_src = $(this).attr('src'),
alt = $(this).attr('alt'),
data = [];
$.each(doms, function (key, value) {
var src = $(value).find('img').attr('src');
if (src != now_src) {
// 压入其他图片地址
data.push({
"alt": alt,
"pid": Math.random(),
"src": src,
"thumb": src
});
} else {
// 把当前图片插入到头部
data.unshift({
"alt": alt,
"pid": Math.random(),
"src": now_src,
"thumb": now_src
});
}
});
var photos = {
"title": title,
"id": Math.random(),
"data": data,
};
layer.photos({
photos: photos,
anim: 5
});
return false;
});
// 监听动态表格刷新
$('body').on('click', '[data-table-refresh]', function () {
var tableId = $(this).attr('data-table-refresh');
if (tableId === undefined || tableId === '' || tableId == null) {
tableId = init.table_render_id;
}
table.reload(tableId);
});
// 监听搜索表格重置
$('body').on('click', '[data-table-reset]', function () {
var tableId = $(this).attr('data-table-reset');
if (tableId === undefined || tableId === '' || tableId == null) {
tableId = init.table_render_id;
}
if (Object.keys(init.xmSelectModel).length > 0) {
$.each(init.xmSelectModel, function (index, value) {
init.xmSelectModel[index].setValue([])
})
}
table.reload(tableId, {
page: {
curr: 1
}
, where: {
filter: '{}',
op: '{}'
}
}, 'data');
});
// 监听请求
$('body').on('click', '[data-request]', function () {
var title = $(this).attr('data-title'),
url = $(this).attr('data-request'),
tableId = $(this).attr('data-table'),
addons = $(this).attr('data-addons'),
checkbox = $(this).attr('data-checkbox'),
direct = $(this).attr('data-direct'),
field = $(this).attr('data-field') || 'id';
title = title || '确定进行该操作?';
if (direct === 'true') {
admin.msg.confirm(title, function () {
window.location.href = url;
});
return false;
}
var postData = {};
if (checkbox === 'true') {
tableId = tableId || init.table_render_id;
var checkStatus = table.checkStatus(tableId),
data = checkStatus.data;
if (data.length <= 0) {
admin.msg.error('请勾选需要操作的数据');
return false;
}
var ids = [];
$.each(data, function (i, v) {
ids.push(v[field]);
});
postData[field] = ids;
}
if (addons !== true && addons !== 'true') {
url = admin.url(url);
}
tableId = tableId || init.table_render_id;
admin.msg.confirm(title, function () {
admin.request.post({
url: url,
data: postData,
}, function (res) {
admin.msg.success(res.msg, function () {
table.reload(tableId);
$('[data-treetable-refresh]').trigger("click");
});
})
});
return false;
});
// excel导出
$('body').on('click', '[data-table-export]', function () {
var tableId = $(this).attr('data-table-export'),
url = $(this).attr('data-url');
let par = $("#searchFieldset_" + tableId).find('form').serialize();
let parArr = par.split('&')
var formatFilter = {}, formatOp = {};
[formatData] = parArr.map((arr) => {
[key, val] = arr.split('=');
if (val !== '') {
formatFilter[key] = val;
var op = $('#c-' + key).attr('data-search-op');
op = op || '%*%';
formatOp[key] = op;
}
return {formatFilter, formatOp};
})
let schPar = 'filter=' + JSON.stringify(formatData.formatFilter) + '&' + 'op=' + JSON.stringify(formatData.formatOp);
url = (url.includes('?')) ? url + '&' + schPar : url + '?' + schPar;
var index = admin.msg.confirm('根据查询进行导出,确定导出?', function () {
window.location = admin.url(url);
layer.close(index);
});
});
// 数据表格多删除
$('body').on('click', '[data-table-delete]', function () {
var tableId = $(this).attr('data-table-delete'),
url = $(this).attr('data-url');
tableId = tableId || init.table_render_id;
url = url !== undefined ? admin.url(url) : window.location.href;
var checkStatus = table.checkStatus(tableId),
data = checkStatus.data;
if (data.length <= 0) {
admin.msg.error('请勾选需要删除的数据');
return false;
}
var ids = [];
$.each(data, function (i, v) {
ids.push(v.id);
});
admin.msg.confirm('确定删除?', function () {
admin.request.post({
url: url,
data: {
id: ids
},
}, function (res) {
admin.msg.success(res.msg, function () {
table.reload(tableId);
});
});
});
return false;
});
// 复制
$('body').on('click', '.copy-text', function () {
// 初始化 Clipboard.js
var clipboard = new ClipboardJS('.copy-text');
// 监听复制成功的事件
clipboard.on('success', function (e) {
admin.msg.success('复制成功');
});
// 监听复制失败的事件
clipboard.on('error', function (e) {
admin.msg.error('复制失败');
});
});
},
api: {
form: function (url, data, ok, no, ex, refreshTable) {
if (refreshTable === undefined) {
refreshTable = true;
}
ok = ok || function (res) {
res.msg = res.msg || '';
admin.msg.success(res.msg, function () {
admin.api.closeCurrentOpen({
refreshTable: refreshTable
});
});
return false;
};
admin.request.post({
url: url,
data: data,
}, ok, no, ex);
return false;
},
closeCurrentOpen: function (option) {
option = option || {};
option.refreshTable = option.refreshTable || false;
option.refreshFrame = option.refreshFrame || false;
if (option.refreshTable === true) {
option.refreshTable = init.table_render_id;
}
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
if (option.refreshTable !== false) {
parent.layui.table.reload(option.refreshTable);
}
if (option.refreshFrame) {
parent.location.reload();
}
return false;
},
refreshFrame: function () {
parent.location.reload();
return false;
},
refreshTable: function (tableName) {
tableName = tableName || 'currentTable';
table.reload(tableName);
},
formRequired: function () {
var verifyList = document.querySelectorAll("[lay-verify]");
if (verifyList.length > 0) {
$.each(verifyList, function (i, v) {
var verify = $(this).attr('lay-verify');
// todo 必填项处理
if (verify.includes('required')) {
var label = $(this).parent().prev();
if (label.is('label') && !label.hasClass('required')) {
label.addClass('required');
}
if ($(this).attr('lay-reqtext') === undefined && $(this).attr('placeholder') !== undefined) {
$(this).attr('lay-reqtext', $(this).attr('placeholder'));
}
if ($(this).attr('placeholder') === undefined && $(this).attr('lay-reqtext') !== undefined) {
$(this).attr('placeholder', $(this).attr('lay-reqtext'));
}
}
});
}
},
formSubmit: function (preposeCallback, ok, no, ex) {
var formList = document.querySelectorAll("[lay-submit]");
// 表单提交自动处理
if (formList.length > 0) {
$.each(formList, function (i, v) {
var filter = $(this).attr('lay-filter'),
type = $(this).attr('data-type'),
refresh = $(this).attr('data-refresh'),
url = $(this).attr('lay-submit');
// 表格搜索不做自动提交
if (type === 'tableSearch') {
return false;
}
// 判断是否需要刷新表格
if (refresh === 'false') {
refresh = false;
} else {
refresh = true;
}
// 自动添加layui事件过滤器
if (filter === undefined || filter === '') {
filter = 'save_form_' + (i + 1);
$(this).attr('lay-filter', filter)
}
if (url === undefined || url === '' || url === null) {
url = window.location.href;
} else {
url = admin.url(url);
}
form.on('submit(' + filter + ')', function (data) {
if (init.wait_submit) {
layer.msg('你点击太快了', {icon: 16, shade: 0.3, shadeClose: false, time: 1000})
return false
}
var dataField = data.field;
var editorList = document.querySelectorAll(".editor");
// 富文本数据处理
if (editorList.length > 0) {
$.each(editorList, function (i, v) {
switch (window.CONFIG.EDITOR_TYPE) {
case 'ckeditor':
var name = $(this).attr("name");
dataField[name] = CKEDITOR.instances[name].getData();
break;
case 'wangEditor':
var name = $(this).attr("name");
dataField[name] = (window["wangEditor_" + i]).getHtml()
break;
case 'EasyMDE':
var name = $(this).attr("name");
dataField[name] = (window["easyMDE" + i]).value()
break;
default:
var name = $(this).attr("id");
dataField[name] = UE.getEditor(name).getContent();
}
});
}
if (typeof preposeCallback === 'function') {
dataField = preposeCallback(dataField);
}
init.wait_submit = true
admin.api.form(url, dataField, ok, no, ex, refresh);
return false;
});
});
}
},
upload: function () {
var uploadList = document.querySelectorAll("[data-upload]");
var uploadSelectList = document.querySelectorAll("[data-upload-select]");
if (uploadList.length > 0) {
$.each(uploadList, function (i, v) {
var uploadExts = $(this).attr('data-upload-exts') || init.upload_exts,
uploadName = $(this).attr('data-upload'),
uploadNumber = $(this).attr('data-upload-number') || 'one',
uploadSign = $(this).attr('data-upload-sign') || '|',
uploadAccept = $(this).attr('data-upload-accept') || 'file',
uploadAcceptMime = $(this).attr('data-upload-mimetype') || '',
elem = "input[name='" + uploadName + "']",
uploadElem = this;
// 监听上传事件
upload.render({
elem: this,
url: admin.url(init.upload_url),
exts: uploadExts,
accept: uploadAccept,//指定允许上传时校验的文件类型
acceptMime: uploadAcceptMime,//规定打开文件选择框时,筛选出的文件类型
multiple: uploadNumber !== 'one',//是否多文件上传
headers: admin.headers(),
before: function () {
this.headers['X-CSRF-TOKEN'] = init.csrf_token
},
done: function (res) {
if (res.code === 1) {
var url = res.data.url;
if (uploadNumber !== 'one') {
var oldUrl = $(elem).val();
if (oldUrl !== '') {
url = oldUrl + uploadSign + url;
}
}
$(elem).val(url);
$(elem).trigger("input");
admin.msg.success(res.msg);
} else {
admin.msg.error(res.msg);
}
let token = res ? res.__token__ : ''
init.csrf_token = token
return false;
}
});
// 监听上传input值变化
$(elem).bind("input propertychange", function (event) {
var urlString = $(this).val(),
urlArray = urlString.split(uploadSign),
uploadIcon = $(uploadElem).attr('data-upload-icon') || "file";
$('#bing-' + uploadName).remove();
if (urlString.length > 0) {
var parant = $(this).parent('div');
var liHtml = '';
$.each(urlArray, function (i, v) {
liHtml += '<li><a><img src="' + v + '" data-image onerror="this.src=\'' + BASE_URL + 'admin/images/upload-icons/' + uploadIcon + '.png\';this.onerror=null"></a><small class="uploads-delete-tip bg-red badge" data-upload-delete="' + uploadName + '" data-upload-url="' + v + '" data-upload-sign="' + uploadSign + '">×</small></li>\n';
});
parant.after('<ul id="bing-' + uploadName + '" class="layui-input-block layuimini-upload-show">\n' + liHtml + '</ul>');
}
});
// 非空初始化图片显示
if ($(elem).val() !== '') {
$(elem).trigger("input");
}
});
// 监听上传文件的删除事件
$('body').on('click', '[data-upload-delete]', function () {
var uploadName = $(this).attr('data-upload-delete'),
deleteUrl = $(this).attr('data-upload-url'),
sign = $(this).attr('data-upload-sign');
var confirm = admin.msg.confirm('确定删除?', function () {
var elem = "input[name='" + uploadName + "']";
var currentUrl = $(elem).val();
var url = '';
if (currentUrl !== deleteUrl) {
url = currentUrl.search(deleteUrl) === 0 ? currentUrl.replace(deleteUrl + sign, '') : currentUrl.replace(sign + deleteUrl, '');
$(elem).val(url);
$(elem).trigger("input");
} else {
$(elem).val(url);
$('#bing-' + uploadName).remove();
}
admin.msg.close(confirm);
});
return false;
});
}
if (uploadSelectList.length > 0) {
$.each(uploadSelectList, function (i, v) {
var uploadName = $(this).attr('data-upload-select'),
uploadNumber = $(this).attr('data-upload-number') || 'one',
uploadSign = $(this).attr('data-upload-sign') || '|';
var selectCheck = uploadNumber === 'one' ? 'radio' : 'checkbox';
var elem = "input[name='" + uploadName + "']",
uploadElem = $(this).attr('id');
tableSelect.render({
elem: "#" + uploadElem,
checkedKey: 'id',
searchType: 'more',
searchList: [
{searchKey: 'title', searchPlaceholder: '请输入文件名'},
],
table: {
url: admin.url('ajax/getUploadFiles'),
cols: [[
{type: selectCheck},
{field: 'id', title: 'ID'},
{field: 'url', minWidth: 80, search: false, title: '图片信息', imageHeight: 30, align: "center", templet: admin.table.image},
{field: 'original_name', width: 150, title: '文件原名', align: "center"},
{field: 'mime_type', width: 120, title: 'mime类型', align: "center"},
{field: 'create_time', width: 200, title: '创建时间', align: "center", search: 'range'},
]]
},
done: function (e, data) {
var urlArray = [];
$.each(data.data, function (index, val) {
urlArray.push(val.url)
});
var url = urlArray.join(uploadSign);
admin.msg.success('选择成功', function () {
$(elem).val(url);
$(elem).trigger("input");
});
}
})
});
}
},
editor: function () {
let editorList = document.querySelectorAll(".editor");
if (editorList.length > 0) {
let wangEditors = {}
$.each(editorList, function (i, v) {
switch (window.CONFIG.EDITOR_TYPE) {
case 'ckeditor':
CKEDITOR.tools.setCookie('ckCsrfToken', init.csrf_token);
CKEDITOR.replace($(this).attr("name"), {
height: $(this).height(),
filebrowserImageUploadUrl: admin.url('ajax/upload?type=editor'),
});
break;
case 'wangEditor':
var wangEditor = window.wangEditor;
var wangEditorName = "wangEditor_" + i
window[wangEditorName] = wangEditor.createEditor({
selector: '#editor_' + $(this).attr('name'),
html: $(this).text(),
config: {
MENU_CONF: {
// 上传图片
uploadImage: {
server: window.CONFIG.ADMIN_UPLOAD_URL,
fieldName: 'file',
meta: {
editor: 'editor',
},
async customInsert(res, insertFn) {
let code = res.code || 0
if (code != '1') {
layer.msg(res.msg || '上传失败', {icon: 2});
return
}
let url = res.data?.url || ''
let alt = ''
let href = ''
insertFn(url, alt, href)
}
},
// 上传视频
uploadVideo: {
server: window.CONFIG.ADMIN_UPLOAD_URL,
fieldName: 'file',
meta: {editor: 'editor',},
async customInsert(res, insertFn) {
let code = res.code || 0
if (code != '1') {
layer.msg(res.msg || '上传失败', {icon: 2});
return
}
let url = res.data?.url || ''
let alt = ''
let href = ''
insertFn(url, alt, href)
}
}
},
}
})
let editor = window[wangEditorName]
wangEditor.createToolbar({
editor,
selector: '#editor_toolbar_' + $(this).attr("name"),
config: {}
})
break;
case 'EasyMDE':
const easyMDEName = "easyMDE" + i
window[easyMDEName] = new EasyMDE({
element: document.getElementById($(this).attr("name")),
initialValue: $(this).text(),
});
break;
default:
let name = $(this).attr("name");
let content = $(this).data('content')
let editorOption = {
initialFrameWidth: '100%',
initialFrameHeight: 420,
initialContent: content,
toolbars: [['fullscreen', 'source', '|', 'undo', 'redo', '|',
'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
'directionalityltr', 'directionalityrtl', 'indent', '|',
'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',
'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',
'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
'print', 'preview', 'searchreplace', 'help', 'drafts']
],
}
setTimeout(function () {
let _UEditor = new baidu.editor.ui.Editor(editorOption);
_UEditor.render(name);
}, 100)
break;
}
});
}
},
select: function () {
var selectList = document.querySelectorAll("[data-select]");
$.each(selectList, function (i, v) {
var url = $(this).attr('data-select'),
selectFields = $(this).attr('data-fields'),
value = $(this).attr('data-value'),
that = this,
html = '<option value=""></option>';
var fields = selectFields.replace(/\s/g, "").split(',');
if (fields.length !== 2) {
return admin.msg.error('下拉选择字段有误');
}
admin.request.get(
{
url: url,
data: {
selectFields: selectFields
},
}, function (res) {
var list = res.data;
list.forEach(val => {
var key = val[fields[0]];
if (value !== undefined && key.toString() === value) {
html += '<option value="' + key + '" selected="">' + val[fields[1]] + '</option>';
} else {
html += '<option value="' + key + '">' + val[fields[1]] + '</option>';
}
});
$(that).html(html);
form.render();
}
);
});
let switchSelectList = document.querySelectorAll("[data-show]");
$.each(switchSelectList, function (i, v) {
let _show = $(this).attr('data-show');
if (_show === 'switchSelect') {
let _data = $(this).attr('data-list');
let _value = $(this).attr('data-value') || ''
let _target = $(this).attr('data-target') || ''
let _name = $(this).attr('data-name') || ''
try {
new switchSelect({
elem: $(this), data: JSON.parse(_data), default: _value, target: _target, name: _name
});
} catch (e) {
console.error(e)
}
}
});
},
date: function () {
var dateList = document.querySelectorAll("[data-date]");
if (dateList.length > 0) {
$.each(dateList, function (i, v) {
var format = $(this).attr('data-date'),
type = $(this).attr('data-date-type'),
range = $(this).attr('data-date-range');
if (type === undefined || type === '' || type === null) {
type = 'datetime';
}
var options = {
elem: this,
type: type,
};
if (format !== undefined && format !== '' && format !== null) {
options['format'] = format;
}
if (range !== undefined) {
if (range === null || range === '') {
range = '-';
}
options['range'] = range;
}
laydate.render(options);
});
}
},
},
ai: {
chat: function (content, options, cancel) {
let id = 'chat_' + (new Date()).getTime()
layer.open({
'title': options?.title || 'AI建议',
type: 1,
area: options?.area || (admin.checkMobile() ? ['95%', '60%'] : ['50%', '60%']),
shade: options?.shade || 0,
shadeClose: options?.shadeClose || false,
scrollbar: options?.scrollbar || false,
maxmin: options?.maxmin || true,
anim: options?.anim || 0,
content: `<div style="padding: 20px;white-space: pre-wrap;" id="${id}"></div>`,
success: function (layero, index) {
let elem = document.getElementById(id)
if (options?.stream) {
let index = 0;
let lastTime = performance.now();
const interval = options.interval || 100;
function typeCharacter(currentTime) {
if (index < content.length) {
if (currentTime - lastTime >= interval) {
elem.innerHTML += content.charAt(index);
index++;
lastTime = currentTime;
elem.scrollIntoView({behavior: "smooth", block: "end"});
}
requestAnimationFrame(typeCharacter);
}
}
requestAnimationFrame(typeCharacter);
} else {
content = content.replace(/\r\n/g, '<br>').replace(/\n/g, '<br>')
setTimeout(() => {
elem.innerHTML = content
}, 100)
}
},
cancel: function (index, layero) {
cancel()
}
})
},
},
};
return admin;
});