Merge branch 'full-page-curd'

This commit is contained in:
augushong
2025-08-21 22:57:00 +08:00
7 changed files with 202 additions and 71 deletions

1
.gitignore vendored
View File

@@ -22,3 +22,4 @@ ul.db
/.VSCodeCounter /.VSCodeCounter
result.txt result.txt
test.php test.php
/.env.prod

View File

@@ -3,6 +3,9 @@
{{formList}} {{formList}}
<div class="hr-line"></div> <div class="hr-line"></div>
<div class="layui-form-item text-center"> <div class="layui-form-item text-center">
{notempty name='$Request.param.backTagId'}
<div class="layui-btn layui-btn-sm page-back-button" layuimini-content-href="{$Request.param.backTagId}" data-back="1">返回</div>
{/notempty}
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button> <button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button> <button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div> </div>

View File

@@ -1,3 +1,4 @@
window.pageType = 'index';
$(function () { $(function () {
var options = { var options = {
iniUrl: ua.url('ajax/initAdmin'), // 初始化接口 iniUrl: ua.url('ajax/initAdmin'), // 初始化接口

View File

@@ -53,6 +53,9 @@
<div class="hr-line"></div> <div class="hr-line"></div>
<div class="layui-form-item text-center"> <div class="layui-form-item text-center">
{notempty name='$Request.param.backTagId'}
<div class="layui-btn layui-btn-sm page-back-button" layuimini-content-href="{$Request.param.backTagId}" data-title="管理员管理" data-back="1">返回</div>
{/notempty}
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button> <button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button> <button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div> </div>

View File

@@ -53,6 +53,9 @@
<div class="hr-line"></div> <div class="hr-line"></div>
<div class="layui-form-item text-center"> <div class="layui-form-item text-center">
{notempty name='$Request.param.backTagId'}
<div class="layui-btn layui-btn-sm page-back-button" layuimini-content-href="{$Request.param.backTagId}" data-title="管理员管理" data-back="1">返回</div>
{/notempty}
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button> <button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button> <button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div> </div>

View File

@@ -2,12 +2,16 @@
var element = layui.element; var element = layui.element;
$ = layui.$; $ = layui.$;
var miniTab = { var miniTab = {
renderOptions: {},
/** /**
* 初始化tab * 初始化tab
* @param options * @param options
*/ */
render: function (options) { render: function (options) {
this.renderOptions = options;
options.filter = options.filter || null; options.filter = options.filter || null;
options.urlHashLocation = options.urlHashLocation || false; options.urlHashLocation = options.urlHashLocation || false;
options.maxTabNum = options.maxTabNum || 20; options.maxTabNum = options.maxTabNum || 20;
@@ -69,14 +73,9 @@
* @param isParent * @param isParent
*/ */
delete: function (tabId, isParent) { delete: function (tabId, isParent) {
// todo 未知BUG不知道是不是layui问题必须先删除元素 ua.findIndexPage(function (window) {
$('.layuimini-tab .layui-tab-title .layui-unselect.layui-tab-bar').remove(); window.layui.element.tabDelete('layuiminiTab', tabId);
});
if (isParent === true) {
parent.layui.element.tabDelete('layuiminiTab', tabId);
} else {
element.tabDelete('layuiminiTab', tabId);
}
}, },
/** /**
@@ -117,21 +116,33 @@
check: function (tabId, isIframe) { check: function (tabId, isIframe) {
// 判断选项卡上是否有 // 判断选项卡上是否有
var checkTab = false; var checkTab = false;
if (isIframe === undefined || isIframe === false) { // if (isIframe === undefined || isIframe === false) {
$('.layui-tab-title li').each(function () { // $('.layui-tab-title li').each(function () {
// var checkTabId = $(this).attr('lay-id');
// if (checkTabId != null && checkTabId === tabId) {
// checkTab = true;
// }
// });
// } else {
// parent.layui.$('.layui-tab-title li').each(function () {
// var checkTabId = $(this).attr('lay-id');
// if (checkTabId != null && checkTabId === tabId) {
// checkTab = true;
// }
// });
// }
ua.findIndexPage(function (window) {
window.layui.$('.layui-tab-title li').each(function () {
var checkTabId = $(this).attr('lay-id'); var checkTabId = $(this).attr('lay-id');
if (checkTabId != null && checkTabId === tabId) { if (checkTabId != null && checkTabId === tabId) {
checkTab = true; checkTab = true;
} }
}); });
} else { });
parent.layui.$('.layui-tab-title li').each(function () {
var checkTabId = $(this).attr('lay-id');
if (checkTabId != null && checkTabId === tabId) {
checkTab = true;
}
});
}
return checkTab; return checkTab;
}, },
@@ -173,6 +184,10 @@
* @param menuList * @param menuList
*/ */
searchMenu: function (href, menuList) { searchMenu: function (href, menuList) {
if (!menuList) {
menuList = this.renderOptions.menuList;
}
var menu; var menu;
for (key in menuList) { for (key in menuList) {
var item = menuList[key]; var item = menuList[key];
@@ -245,15 +260,41 @@
var tabId = $(this).attr('layuimini-content-href'), var tabId = $(this).attr('layuimini-content-href'),
href = $(this).attr('layuimini-content-href'), href = $(this).attr('layuimini-content-href'),
title = $(this).attr('data-title'), title = $(this).attr('data-title'),
back = $(this).attr('data-back') || 0,
external = $(this).attr('data-external') || false,
target = $(this).attr('target'); target = $(this).attr('target');
if (back == 0) {
if (href.indexOf("?") === -1) {
href += '?backTagId=' + ua.getCurrentPageId();
} else {
href += '&backTagId=' + ua.getCurrentPageId();
}
}
href = external ? href : ua.url(href);
tabId = href;
if (target === '_blank') { if (target === '_blank') {
parent.layer.close(loading); parent.layer.close(loading);
window.open(href, '_blank'); window.open(href, '_blank');
return false; return false;
} }
if (tabId === null || tabId === undefined) tabId = new Date().getTime(); if (tabId === null || tabId === undefined) tabId = new Date().getTime();
var checkTab = miniTab.check(tabId, true); var checkTab = miniTab.check(tabId, true);
if (!checkTab) { if (!checkTab) {
if (!title) {
title = tabId;
ua.findIndexPage(function (window) {
var menu = window.miniTab.searchMenu(tabId);
if (menu) {
title = menu.title;
}
});
}
miniTab.create({ miniTab.create({
tabId: tabId, tabId: tabId,
href: href, href: href,
@@ -264,6 +305,11 @@
} }
parent.layui.element.tabChange('layuiminiTab', tabId); parent.layui.element.tabChange('layuiminiTab', tabId);
parent.layer.close(loading); parent.layer.close(loading);
if (back == 1) {
console.log(back);
miniTab.delete(ua.getCurrentPageId());
}
}); });
/** /**
@@ -366,6 +412,7 @@
listenSwitch: function (options) { listenSwitch: function (options) {
options.filter = options.filter || null; options.filter = options.filter || null;
options.urlHashLocation = options.urlHashLocation || false; options.urlHashLocation = options.urlHashLocation || false;
options.listenSwichCallback = options.listenSwichCallback || function () { }; options.listenSwichCallback = options.listenSwichCallback || function () { };
element.on('tab(' + options.filter + ')', function (data) { element.on('tab(' + options.filter + ')', function (data) {
var tabId = $(this).attr('lay-id'); var tabId = $(this).attr('lay-id');
@@ -404,19 +451,19 @@
if (!options.urlHashLocation) return false; if (!options.urlHashLocation) return false;
var tabId = location.hash.replace(/^#/, ''); var tabId = location.hash.replace(/^#/, '');
if (tabId === null || tabId === undefined || tabId === '') return false; if (tabId === null || tabId === undefined || tabId === '') return false;
// 判断是否为首页 // 判断是否为首页
if (tabId === options.homeInfo.href || tabId === options.homeInfo.mb_href) return false; if (tabId === options.homeInfo.href || tabId === options.homeInfo.mb_href) return false;
// 判断tab是否已存在 // 判断tab是否已存在
if($('.layuimini-tab .layui-tab-content [lay-id="'+tabId+'"]').length > 0) { if ($('.layuimini-tab .layui-tab-content [lay-id="' + tabId + '"]').length > 0) {
element.tabChange('layuiminiTab', tabId); element.tabChange('layuiminiTab', tabId);
return false; return false;
} }
// 判断是否为右侧菜单 // 判断是否为右侧菜单
var menu = miniTab.searchMenu(tabId, options.menuList); var menu = miniTab.searchMenu(tabId, options.menuList);
if (menu !== undefined) { if (menu !== undefined) {
miniTab.create({ miniTab.create({
tabId: tabId, tabId: tabId,

View File

@@ -144,28 +144,28 @@
}; };
complete = complete || function () { complete = complete || function () {
}; };
if(no){ if (no) {
var originalNo = no; var originalNo = no;
no = function (res) { no = function (res) {
originalNo(res); originalNo(res);
complete(); complete();
} };
}else{ } else {
no = function (res) { no = function (res) {
var msg = res.msg == undefined ? '返回数据格式有误' : res.msg; var msg = res.msg == undefined ? '返回数据格式有误' : res.msg;
admin.msg.error(msg); admin.msg.error(msg);
complete(); complete();
return false; return false;
} };
} }
if(ex){ if (ex) {
var originalEx = ex; var originalEx = ex;
ex = function (res) { ex = function (res) {
originalEx(res); originalEx(res);
complete(); complete();
} };
}else{ } else {
ex = function (res) { ex = function (res) {
complete(); complete();
}; };
@@ -524,7 +524,8 @@
toolbarHtml += ' <button class="layui-btn layui-btn-sm layuimini-btn-primary" data-table-refresh="' + tableId + '"><i class="fa fa-refresh"></i> </button>\n'; 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') { } else if (v === 'add') {
if (admin.checkAuth('add', elem)) { if (admin.checkAuth('add', elem)) {
toolbarHtml += '<button class="layui-btn layui-btn-normal layui-btn-sm" data-open="' + init.addUrl + '" data-title="添加" data-full="' + init.formFullScreen + '"><i class="fa fa-plus"></i> 添加</button>\n'; toolbarHtml += '<button class="layui-btn layui-btn-normal layui-btn-sm" layuimini-content-href="' + init.addUrl + '" data-title="添加" data-full="' + init.formFullScreen + '"><i class="fa fa-plus"></i> 添加</button>\n';
// toolbarHtml += '<button class="layui-btn layui-btn-normal layui-btn-sm" data-open="' + init.addUrl + '" data-title="添加" data-full="' + init.formFullScreen + '"><i class="fa fa-plus"></i> 添加1</button>\n';
} }
} else if (v === 'delete') { } else if (v === 'delete') {
if (admin.checkAuth('delete', elem)) { if (admin.checkAuth('delete', elem)) {
@@ -1112,7 +1113,8 @@
formatToolbar.method = ''; formatToolbar.method = '';
} else if (toolbar.method === 'blank') { } else if (toolbar.method === 'blank') {
formatToolbar.method = ' href="' + formatToolbar.url + '" target="_blank" '; formatToolbar.method = ' href="' + formatToolbar.url + '" target="_blank" ';
} else if (operat.method === 'tab') {
formatToolbar.method = ' layuimini-content-href="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '"';
} else { } else {
formatToolbar.method = formatToolbar.method !== '' ? 'data-request="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : ''; formatToolbar.method = formatToolbar.method !== '' ? 'data-request="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : '';
} }
@@ -1139,7 +1141,6 @@
var titleEndfix = ''; var titleEndfix = '';
if (typeof operat.titleField == 'function') { if (typeof operat.titleField == 'function') {
console.log(operat.titleField(data, operat));
titleEndfix = operat.titleField(data, operat); titleEndfix = operat.titleField(data, operat);
} else if (data[operat.titleField]) { } else if (data[operat.titleField]) {
@@ -1325,7 +1326,7 @@
case 'edit': case 'edit':
var operat = { var operat = {
class: 'layui-btn layui-btn-success layui-btn-xs', class: 'layui-btn layui-btn-success layui-btn-xs',
method: 'open', method: 'tab',
field: 'id', field: 'id',
icon: '', icon: '',
text: '编辑', text: '编辑',
@@ -2261,54 +2262,50 @@
window.open(admin.url($(this).attr('href'))); window.open(admin.url($(this).attr('href')));
}); });
}, },
form: function (url, data, ok, no, ex, refreshTable, close, complete) {
if (refreshTable === undefined) {
refreshTable = true;
}
if(ok){
var originalOk = ok;
ok = function (res) {
originalOk(res);
complete()
}
}else{
ok = function (res) {
res.msg = res.msg || '';
admin.msg.success(res.msg, function () {
if (close) {
admin.api.closeCurrentOpen({
refreshTable: refreshTable,
onClose: function () {
complete();
}
});
}
});
return false;
};
}
admin.request.post({
url: url,
data: data,
}, ok, no, ex, complete);
return false;
},
closeCurrentOpen: function (option) { closeCurrentOpen: function (option) {
option = option || {}; option = option || {};
option.backHref = option.backHref || '';
option.refreshTable = option.refreshTable || false; option.refreshTable = option.refreshTable || false;
option.refreshFrame = option.refreshFrame || false; option.refreshFrame = option.refreshFrame || false;
option.onClose = option.onClose || function () { }; option.onClose = option.onClose || function () { };
if (option.refreshTable === true) { if (option.refreshTable === true) {
option.refreshTable = init.tableRenderId; option.refreshTable = init.tableRenderId;
} }
var backWindow = window.parent;
if (option.backHref) {
// 标签打开页面,需要返回上一个标签刷新的情况
backWindow = admin.findPageId(option.backHref);
if (backWindow) {
backWindow.layui.table.reloadData(option.refreshTable);
} else {
admin.findIndexPage(function (window) {
var menu = window.miniTab.searchMenu(option.backHref);
var title = option.backHref
if(menu){
title = menu.title;
}
window.miniTab.create({
tabId: option.backHref,
href: option.backHref,
title: title,
});
});
}
admin.findIndexPage(function (window) {
window.layui.element.tabDelete('layuiminiTab', admin.getCurrentPageId());
});
return;
}
// 弹框保存后刷新的情况
var index = parent.layer.getFrameIndex(window.name); var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index, option.onClose); backWindow.layer.close(index, option.onClose);
if (option.refreshTable !== false) { if (option.refreshTable !== false) {
parent.layui.table.reloadData(option.refreshTable); backWindow.layui.table.reloadData(option.refreshTable);
} }
if (option.refreshFrame) { if (option.refreshFrame) {
parent.location.reload(); backWindow.location.reload();
} }
return false; return false;
}, },
@@ -2406,14 +2403,16 @@
// 判断btn是否具备name和value属性如果有则加到表单数据里 // 判断btn是否具备name和value属性如果有则加到表单数据里
var btnName = $(btnElem).attr('name'); var btnName = $(btnElem).attr('name');
var btnValue = $(btnElem).attr('value'); var btnValue = $(btnElem).attr('value');
var backHref = $(btnElem).attr('data-back-href');
if (btnName !== undefined && btnValue !== undefined) { if (btnName !== undefined && btnValue !== undefined) {
data.field[btnName] = btnValue; data.field[btnName] = btnValue;
} }
if (!backHref) {
backHref = admin.getQueryVariable('backTagId');
}
var dataField = data.field; var dataField = data.field;
dataField = admin.api.formSubmitEditor(dataField, v); dataField = admin.api.formSubmitEditor(dataField, v);
dataField = admin.api.formSubmitCity(dataField, v); dataField = admin.api.formSubmitCity(dataField, v);
if (typeof preposeCallback === 'function') { if (typeof preposeCallback === 'function') {
@@ -2422,7 +2421,37 @@
complete = complete || function () { complete = complete || function () {
$(form).removeClass('loading'); $(form).removeClass('loading');
}; };
admin.api.form(url, dataField, ok, no, ex, refresh, close, complete);
if (ok) {
var originalOk = ok;
ok = function (res) {
originalOk(res);
complete();
};
} else {
ok = function (res) {
res.msg = res.msg || '';
admin.msg.success(res.msg, function () {
if (close) {
admin.api.closeCurrentOpen({
refreshTable: refresh,
backHref: backHref,
onClose: function () {
complete();
}
});
}
});
return false;
};
}
admin.request.post({
url: url,
data: dataField,
}, ok, no, ex, complete);
return false; return false;
}); });
@@ -3097,7 +3126,51 @@
} }
return oldValue; return oldValue;
} },
isCurrentIndex() {
if (window.pageType && window.pageType == 'index') {
return true;
}
return false;
},
findIndexPage(findCallback, missCallback) {
if (!findCallback) {
findCallback = function (w) { return w; };
}
if (!missCallback) {
missCallback = function (w) { return w; };
}
if (this.isCurrentIndex()) {
return findCallback(window);
}
var parent = window.parent;
if (parent && parent != window) {
return parent.ua.findIndexPage(findCallback, missCallback);
}
return missCallback(null);
},
getCurrentPageId() {
// pageId就是路径加参数
var path = location.pathname;
var params = location.search;
return path + params;
},
findPageId(tabId) {
var iframeWindow;
this.findIndexPage(function (window) {
// 查找对应的tab内容区域
var tabContent = window.layui.$('.layui-tab-content .layui-tab-item[lay-id="' + tabId + '"]');
if (tabContent.length > 0) {
var iframe = tabContent.find('iframe')[0];
if (iframe) {
iframeWindow = iframe.contentWindow;
}
}
});
return iframeWindow;
},
}; };