2025-04-10 23:19:13 +08:00

1248 lines
42 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.

<?php
#
# @Author: fm453
# @Date: 2024/7/17
# @updated: 上午3:31
# @Email: 1280880631@qq.com
use yii\helpers\Url;
use yii\helpers\Html;
$_csrf_backend = Yii::$app->request->csrfToken;
?>
<?=Html::cssFile('@web/js/plugins/jquery-ui/jquery-ui-1.13.3.css?v=1.13.3')?>
<!--基础样式-->
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/bootstrap/bootstrap.min.css?v=5.3.3')?>
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/bootstrap-icons/bootstrap-icons.css?v=1.11.3')?>
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/bootstrap-table.min.css?v=1.23.1')?>
<!--基础样式-->
<!--列宽调整-->
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/jquery-resizable-columns/jquery.resizableColumns.min.css?v=0.2.3')?>
<!--列宽调整-->
<!--列排序-->
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/dragtable/dragtable.css?v=2.0.15')?>
<!--列排序-->
<!--行排序-->
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/reorder-rows/bootstrap-table-reorder-rows.css?v=1.23.1')?>
<!--行排序-->
<!--表头固定-->
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/sticky-header/bootstrap-table-sticky-header.css?v=1.23.1')?>
<!--表头固定-->
<!--树形表-->
<?=Html::cssFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/jquery-treegrid/jquery.treegrid.css?v=0.3.0')?>
<!--树形表-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/jquery/jquery.min.js?v=3.7.1')?>
<?=Html::jsFile('@web/js/plugins/jquery-ui/jquery-ui-1.13.3.js?v=1.13.3')?>
<!--数据导出-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/pdfmake/pdfmake.js?v=0.2.10')?>
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/pdfmake/vfs_fonts.js?v=0.2.10')?>
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/tableExport/tableExport.min.js?v=1.29.0')?>
<!--@web/js/plugins/bootstrap-table-V1.23.1/dependence/tableExport/jspdf.umd.min.js?v=1.29.0-->
<!--数据导出-->
<!--列排序-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/dragtable/dragtable.js?v=2.0.15')?>
<!--列排序-->
<!--行排序-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/jquery/jquery.tablednd.min.js?v=1.0.5')?>
<!--行排序-->
<!--列宽调整-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/jquery-resizable-columns/jquery.resizableColumns.min.js?v=0.1.0')?>
<!--列宽调整-->
<!--树形表-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/jquery-treegrid/jquery.treegrid.min.js?v=0.3.0')?>
<!--树形表-->
<!-- 基础JS-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/dependence/bootstrap/bootstrap.bundle.min.js?v=5.3.3')?>
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/bootstrap-table.min.js?v=1.23.1')?>
<!--cookie缓存数据-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/cookie/bootstrap-table-cookie.min.js?v=1.23.1')?>
<!--cookie缓存数据-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/auto-refresh/bootstrap-table-auto-refresh.min.js?v=1.23.1')?>
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/locale/bootstrap-table-zh-CN.min.js?v=1.23.1')?>
<!-- 基础JS-->
<!--表数据导出-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/export/bootstrap-table-export.min.js?v=1.23.1')?>
<!--表数据导出-->
<!--列筛选过滤-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/filter-control/bootstrap-table-filter-control.min.js?v=1.23.1')?>
<!--列筛选过滤-->
<!--行分组-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/group-by-v2/bootstrap-table-group-by.min.js?v=1.23.1')?>
<!--行分组-->
<!--复合排序-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/multiple-sort/bootstrap-table-multiple-sort.js?v=1.23.1')?>
<!--复合排序-->
<!--表格打印-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/print/bootstrap-table-print.min.js?v=1.23.1')?>
<!--表格打印-->
<!--列排序-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js?v=1.23.1')?>
<!--列排序-->
<!--行排序-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/reorder-rows/bootstrap-table-reorder-rows.min.js?v=1.23.1')?>
<!--行排序-->
<!--列宽调整-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/resizable/bootstrap-table-resizable.min.js?v=1.23.1')?>
<!--列宽调整-->
<!--表头固定-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/sticky-header/bootstrap-table-sticky-header.min.js?v=1.23.1')?>
<!--表头固定-->
<!--高级搜索-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/toolbar/bootstrap-table-toolbar.min.js?v=1.23.1')?>
<!--高级搜索-->
<!--树形表-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/treegrid/bootstrap-table-treegrid.min.js?v=1.23.1')?>
<!--树形表-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/addrbar/bootstrap-table-addrbar.min.js?v=1.23.1')?>
<!--表格可编辑-->
<!--表格编辑需要引入该插件-->
<?=Html::jsFile('@web/js/plugins/jeditable/jquery.jeditable.js')?>
<!--表格编辑需要引入该插件-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/editable/bootstrap-table-editable.js?v=1.23.1')?>
<!--表格可编辑-->
<!--绑定键盘事件监听-->
<?=Html::jsFile('@web/js/plugins/bootstrap-table-V1.23.1/extensions/key-events/bootstrap-table-key-events.min.js?v=1.23.1')?>
<!--绑定键盘事件监听-->
<style>
:root {
--bs-body-font-size: 1.5rem;
}
.btn{
--bs-btn-font-size:1.5rem;
}
.btn.dropdown-toggle>span.caret{
display: none;
}
.select {
width: 100%;
}
a {
text-decoration: none;
color:black;
}
/* 去除类名为no-underline的所有超链接下划线 */
a.no-underline {
text-decoration: none;
}
.operateIcon {
margin-right: 10px;
font-size:25px;
}
.uppercase {
text-transform: uppercase;
}
td.bg-blue {
background: cadetblue;
color: white;
}
td.bg-green {
background: greenyellow;
color: black;
}
td.bg-orange {
background: coral;
color: whitesmoke;
}
td.bg-yellow {
background: yellow;
color: black;
}
td.bg-red {
background: darkred;
color: whitesmoke;
}
#forTable {
width:98%;
padding-left:1%;
}
#table{
th,td {
border:1px solid #0095f6;
}
td.input-group{
display: inline-table;
}
td.input-group>.form-control{
width:100%;
}
}
</style>
<div class="wrapper wrapper-content">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<div class="col-sm-11">
<div class="alert alert-success">
单元格部分内容被管理员设置为不可编辑状态的,已做标红显示。 <a data-toggle="modal" data-href="<?=Url::toRoute('index/welcome')?>" data-backdrop="false" data-title="帮助" data-target="#modal-help">点击查看更多帮助</a>.
</div>
</div>
<div class="col-sm-12" id="forTable">
<div id="toolbar">
<button id="remove" class="btn btn-danger" disabled>
<i class="fa fa-trash"></i>
</button>
<button id="add" class="btn btn-primary">
<i class="fa fa-plus"></i>
</button>
</div>
<table id="table">
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
let $table = $('#table')
let $remove = $('#remove')
let $add = $('#add')
let PageTable
let selections = []
const dataUrl = "<?=Url::toRoute(['json'])?>" //获取数据的链接
const dataSaveUrl = "<?=Url::toRoute(['save'])?>" //保存数据的链接
const dataAjaxUrl = "<?=Url::toRoute(['ajax'])?>" //ajax操作数据的链接软删除、状态切换等
let icons = {
detailOpen:"bi-toggle-on",
detailClose:"bi-toggle-off",
advancedSearchIcon: 'bi-search',
//bi-*或fa-*,取决于图标前缀配置
}
let sortPriority = [{"sortName": "title","sortOrder":"desc"},{"sortName":"des","sortOrder":"desc"}]
let optionCol = {
title: '操作',
field: 'options',
align: 'center',
valign: 'middle',
sortable: false,
// width:80,
// widthUnit:"px",
halign: 'left',
clickToSelect:false,
formatter: operateFormatter,
footerFormatter: TextCountFooter,
events: 'operateEvents',
visible:true,
cellStyle:'cellStyle',
searchable:false
}
let columns = dynamicHeader();
function dynamicHeader(){
var thead = [{
field: 'rowIndexId',
align: 'left',
valign: 'middle',
width:20,
widthUnit:"px",
style:'min-width:15px',
escape:true,
//忽略该列的传值
formatter:indexFormatter,
searchable:false
},
{
field: 'state',
checkbox: true,
align: 'center',
valign: 'middle',
width:20,
widthUnit:"px",
escape:true,
//忽略该列的传值
formatter:stateFormatter,
footerFormatter:CountTitleFooter,
searchable:false
}];
var cs = <?=$columns;?>;
// console.log('自定义列',cs)
for(col in cs){
thead.push(cs[col]);
}
thead.push(optionCol);
return thead;
}
// 定义表格操作
const options = {
locale:"zh-CN",
//中文(直接JS添加了中文引用时可以不用设置
toolbar:"#toolbar",
//指定工具栏
columns:columns,
//定义表列标题
// height:'',
// height参数不允许设定太多BUG影响列宽调整、列排序
showColumns: true,
//列控制-显示或隐藏
showColumnsToggleAll:true,
//一键筛选全部列
showColumnsSearch:true,
//筛选列时可搜索列名
showRefresh: true,
//刷新
autoRefresh:false,
//自动刷新
showToggle: true,
//切换卡片视图
showExport:true,
exportDataType: 'selected',
// basic, all, selected
exportTypes:['json', 'xml', 'csv', 'txt', 'sql', 'excel','pdf'],
//pdf 不支持中文,暂时不搞
exportFooter: true,
exportOptions: OptionsFuncExport,
//导出(TBD PDF导出时中文乱码已部分修正待优化
search: true,
//搜索
showSearchClearButton:true,
//搜索框可清空
showSearchButton:false,
// 显示搜索图标
searchHighlight:true,
//高亮搜索结果,开启高亮后,需要对搜索结果中单元格内容进行重新格式化才能正常被修改,否则乱码
visibleSearch:true,
//只在可视单元格内搜索
advancedSearch:true,
// searchText:"演示预置搜索文字",
// searchAccentNeutralise:true,
// 应该是支持正则表达式,还没测试
// trimOnSearch:true,
idTable:"advancedTable",
//高级搜索,搜索格式化后结果、高亮搜索结果 2个选项都禁用才能正常使用单元格编辑功能
showFullscreen:true,
// 全屏
addrbar: true,
//地址栏 TBD 未调试
// showHeader:false,
//关闭表头列标题
headerStyle:headerStyle,
//表头样式定义函数
stickyHeader: true,
stickyHeaderOffsetLeft: parseInt($('body').css('padding-left'), 10),
stickyHeaderOffsetRight: parseInt($('body').css('padding-right'), 10),
// 固定表头
showFooter:true,
//显示表格底部
footerStyle:footerStyle,
//表格底部风格定义函数
pagination:false,
//分页
showPaginationSwitch:true,
//分页切换
clickToSelect:false,
//行点击即选中
undefinedText: 'N/A',
// 空值默认文本
// url:dataUrl,
//从网络获取数据
ajaxOptions: window.ajaxOptions,
//未生效
responseHandler:resHandler,
//获取数据的后续响应操作
buttonsClass:"secondary",
//按钮样式secondarydefault,primary,warning,danger,success……
buttonsOrder:['refresh', 'paginationSwitch', 'toggle', 'columns', 'advancedSearch','print','export', 'fullscreen'],
buttons:optionsFuncButtons,
// 添加自定义按钮
showButtonText:false,
//显示按钮文字
detailView:true,
detailViewIcon:false,
showDetail:false,
//行首添加显示详情按钮图标必须false,否则会在表首添加1列开启列拖动排序时需要禁用该项
detailFormatter:detailFormatter,
//卡片视图格式化操作
idField: 'id',
//指定ID列
// uniqueId: 'rowIndexId', //TBD该字段未生效
uniqueId: 'id',
//使用哪一列数据 做唯一序号(必须保证该值记录是唯一的 TBD 未生效
// singleSelect:true,
//设置仅单选
theadClasses:"thead-dark",
//表头样式(thead-light,thead-dark) TBD 未调试
sortClass:"table-active",
//排序列的样式
sortReset:true,
// 在第三次点击的时候重置排序
totalField:"total",
dataField:"rows",
//仅在设置了直接从URL取数据时有效总数变量、数据集变量
iconSize:"undefined",
// 图标大小 undefinedlg,sm
icons:icons,
//自定义图标
filterControl:true,
//开启列筛选( TBD 选择式筛选不能正确显示 ,且与搜索功能有些冲突,暂不开启)
groupBy:false,
//分组
groupByField: "des",
// groupByField: ["des","id"],
// 按指定字段分组
showMultiSort:true,
// sortPriority:"sortPriority",
//高级筛选(默认筛选条件设置项有问题,暂不设置)
showPrint:true,
// printStyles:['https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.2/css/all.min.css'],
//打印及配置
reorderableColumns:true,
//列排序
useRowAttrFunc:false,
reorderableRows:true,
//行排序
resizable:false,
// 列宽调整 // TBD 有BUG不好用
rememberOrder:false,
//记住排序 TBD 仅列标题记录了,暂不开启
// treeShowField: 'title',
// parentIdField: 'pcat_id',
//树形表 TBD 未调试完成
editable:true,
//表格可编辑相应地在需要编辑的列使用参数editable传入编辑设定注意列参数的editable是函数不应该是bool值
cookie:false,
cookieIdTable:'NewsListTable',
// COOKIE缓存
keyEvents: false,
//使用键盘响应事件,启用后会屏蔽一些键的系统默认响应
onDblClickCell: dbClickCellFunc,
//单元格双击响应事件
}
// 各种options定义函数 S
//导出功能设定
function OptionsFuncExport(){
return {
fileName: function () {
return '表格数据导出'+time();
},
pdfmake:{
enabled:true,
fonts:{
Roboto: {
normal: 'Alibaba-PuHuiTi-Light.ttf',
bold: 'Alibaba-PuHuiTi-Bold.ttf',
italics: 'Alibaba-PuHuiTi-Regular.ttf',
bolditalics: 'Alibaba-PuHuiTi-Medium.ttf'
}
}
}
}
}
//注入自定义按钮
function optionsFuncButtons () {
return {
btnAdd: {
text: '新增一行',
icon: 'bi-plus',
event: function () {
addNewRow()
},
attributes: {
title: '新增一行数据'
}
}
}
}
window.ajaxOptions = {
beforeSend: function (xhr) {
xhr.setRequestHeader('csrf-param','_csrf-backend')
xhr.setRequestHeader('csrf-token', "<?=$_csrf_backend ;?>")
}
}
// 各种options定义函数 E
// cloumns>>events 各列预定义事件注入 S
window.operateEvents = {
'click .like': function (e, value, row, index) {
console.log(e)
console.log(value)
console.log(row)
console.log(index)
alert('You click like action, row: ' + JSON.stringify(row))
},
'click .remove': function (e, value, row, index) {
confirmRemoveRow(row, index)
},
'click .view': function (e, value, row, index) {
toggleDetail(index);
},
'click .save': function (e, value, row, index) {
var res = mySaveData(dataSaveUrl,row)
// console.log('数据保存结果',res)
},
'click .href':function (e, value, row, index) {
var url = "<?=Url::toRoute('edit');?>"+"?&id="+row.id;
parent.layer.open({
type: 2,
title: '内容编辑',
shadeClose: true,
shade: 0.8,
area: ['90%', '90%'],
content: url //iframe的url
});
},
}
// cloumns>>events 各列预定义事件注入 S
// 获取已选择的ID
function getIdSelections() {
return $.map($table.bootstrapTable('getSelections'), function (row) {
return row.id
})
}
//网络数据加载成功时执行
function resHandler(res) {
$.each(res.rows, function (i, row) {
row.state = $.inArray(row.id, selections) !== -1
})
return res
}
//切换显示详情卡片视图
function toggleDetail(index) {
$table.bootstrapTable('toggleDetailView', index);
}
//单元格编辑操作
//单元格双击时,触发单元格内的单击编辑事件
function dbClickCellFunc(field, value, row, $cell) {
// 双击单元格时的操作
// console.log('双击了单元格,列:', field, ',值:', value, ',行数据:', row);
let $field = $cell.find("a[href=\"javascript:void(0)\"");
if($field.length===1){
return $field.click();
}else{
$cell.attr('contenteditable',"true") //不起作用
// layer.msg(value, {time: 3 * 1000}, function () {});
}
}
//实现单元格编辑操作必须为对应列设置单元格格式函数在cloumns中的formatter参数项设定
function textEditor(index,row,element){
//文本内容编辑
// console.log(index,row,element)
let _this = this;
return {
id:options.idField,
name:_this.field,
//提交到服务端用到的id跟name的表单键名{id:'',title:'XXX'}
type: 'text',
//编辑内容类型 defaults,text,textarea,select,
tooltip:"双击编辑",
placeholder:"请添加数据",
ajaxoptions: {
url:dataSaveUrl,
dataType:'json'
},
// target:dataSaveUrl,
target: function(value){
// console.log('开始保存数据',value,row,element)
var field = element[0].dataset.name;
// console.log('字段',field);
row[field] = value;
var res = mySaveData(dataSaveUrl,row);
res.then(
function(data){
// console.log('得到数据保存结果',data)
var id = data.data.id;
row.id = id;
$table.bootstrapTable('load',row);
})
return value;
},
// target设置为网址刚向网址发送新数据设置则函数则需要自行处理相关的逻辑
// event:'',
// 绑定事件,一旦设置,会中断原本功能;禁止设置
// 数据保存网址
callback: function(res,settings) {
//服务端返回的结果(需要服务端返回完整的一行数据
// console.log('接收到服务端数据',res)
if(res.code==200){
row[_this.field] = res.data[_this.field];
var d = titleFormatter(res.data[_this.field],row,index)
$(this).html(d);
}
},
submitdata: function(value,settings) {
//2个参数 单元格原始数值、editable设置
// 补充提交到服务端的数据
// console.log('保存前数据',value)
var data = {
id: row.id,
"row_id": _this.fieldIndex,
//行号
"column_id": _this.colspanIndex,
//列号
'_csrf-backend':"<?=$_csrf_backend ;?>",
};
// console.log('合并提交的数据',data)
// 返回的数据要合并到提交保存的表单中
return data;
},
noEditFormatter: function(value, row, index, field){
//该函数可以设置禁止编辑参数
if(row['no_edit']){
return '<code>'+value+'</code>';
}
//在服务端数据设置了该项为不可编辑时,禁止编辑
},
data: row[this.field],
// data为进入编辑后的默认内容没必要不设置
//该设置针对做过单元格内容重新格式化显示的,有用,避免编辑时出现其他错误格式
// loadurl:'',
// loadtype:"GET",
// loadurl:"",
// loadtext:"加载中……",
// loaddata: {},
// 从别处加载指定类型及数据
onblur:'cancel',
// 失焦时的动作submit ,cancle, function();启用tab按钮响应时应该禁用
cssclass:"",
//为格式化后的输入表单设置样式类
style:"min-width:200px;",
// style 为格式化后的输入表单设置样式
width: "99%",
height: "100%"
}
}
// 各种格式化操作 S
//搜索匹配项高亮 //TBD,这里提前调整了bootstrap-table的searchHighlightFormatter函数(添加4个参数代码在1808行主程序函数initRow
function customSearchFmt(value, searchText,row,index,field,id){
// console.log('自定义搜索高亮',value, searchText,row,index,field,id)
// 此功能仅普通搜索时有效
if(!row[field]){
return '';
}
if(row['no_edit']===1){
return value.toString().replace(new RegExp('(' + searchText + ')', 'gim'), '<span style="background-color: pink;border: 1px solid red;border-radius:90px;padding:4px">$1</span>');
}else{
var regex = new RegExp('>(.*?)<\/a>','gim'),
str = value,
newValue = value,
res;
var match = regex.exec(value)
if(match !== null){
str = match[1];
console.log('原始值',str)
if(str==='N/A'){
return value;
}
// res = str.toString().replace(new RegExp('(' + searchText + ')', 'gim'), '<span style="background-color: pink;border: 1px solid red;border-radius:90px;padding:4px">$1</span>');
res = str.toString().replace(new RegExp('(' + searchText + ')', 'gim'), '<span style="background-color: pink;border: 1px solid red;border-radius:90px;padding:4px">$1</span>');
console.log('替换值',res)
var arr = newValue.split(new RegExp('(' + str + ')', 'gim'))
console.log('美化值分割数组',arr)
if(arr.length===5){
arr['3'] = res
}else if(arr.length===3){
arr['1'] = res
}
return arr.join('')
}
}
}
// 行内容格式化 卡片视图(仅对当前行生效)
function detailFormatter(index, row) {
var html = []
$.each(row, function (key, value) {
html.push('<p><kbd>' + key + ':</kbd> ' + value + '</p>')
})
return html.join('')
}
// formatter,单元格格式化操作 根据具体业务需要再作更改
function indexFormatter(value, row, index,field) {
// 行首序号标记
return index+1;
}
function stateFormatter(value, row, index,field) {
// 行选中状态预设
var state = {
disabled: false,
//是否可选
checked: false
//是否选中
}
if(row['_isSelected']){
state.checked = true;
}
if(row['_isUnselectable']){
state.disabled = true;
}
return state;
}
let defaultOperater = [
// '<a class="operateIcon editable-click" href="javascript:void(0)" title="Like">',
// '<i class="fa fa-pencil-square"></i>',
// '</a> ',
'<a class="operateIcon view" href="javascript:void(0)" title="查看详情">',
'<i class="fa fa-eye"></i>',
'</a> ',
'<a class="operateIcon save" href="javascript:void(0)" title="保存">',
'<i class="fa fa-save"></i>',
'</a> ',
'<a class="operateIcon remove" href="javascript:void(0)" title="移除">',
'<i class="fa fa-trash"></i>',
'</a>'
];
function operateFormatter(value, row, index) {
if(!row.id) return '';
var ops = <?=$operator;?>;
// console.log('自定义操作项',ops)
if(!ops) return defaultOperater.join('');
var html = '';
for(op in ops){
var _op = ops[op];
var func = _op.func || ' href="javascript:void(0)"';
html += '<a class="operateIcon '+ _op.class +' '+ func +' title="'+ _op.title +'">';
html += '<i class="fa fa-'+ _op.icon +'"></i>';
html += '</a>';
}
return html;
}
function catFormatter(value, row, index,field) {
//指定分类数据的格式化
if(!row.title) return '';
var url = "<?=Url::toRoute(['newscat/select','callback'=>'cid']);?>";
row['cat_title'] = row['cat_title'] || '';
var html = [
'<div class="input-group">',
'<input type="text" class="form-control" name="'+field+'_title" id="'+field+'-'+row.id+'-title" value="'+row['cat_title']+'" placeholder="点击选择" autocomplete="off" href="'+url+'&id='+row.id+'&cid='+value+'" w="80%;" h="90%;" title="选择分类" mini="load">',
'<input type="hidden" class="form-control" name="'+field+'_id" id="'+field+'-'+row.id+'-value" value="'+row[field]+'">',
// '<span class="input-group-btn">',
// '<button type="button" class="btn btn-info" onclick='+clearCat(field,row.id,row)+'>清除</button>',
// '</span>',
// '</div>'
]
return html.join('');
}
function selectCat(title,id,callback,rowId)
{
layer.closeAll();
// layer.msg('已选择');
$('#'+callback+'-value').val(id);
$('#'+callback+'-title').val(title);
var row = $table.bootstrapTable('getRowByUniqueId', rowId);
row.cid = id;
mySaveData(dataSaveUrl,row);
}
function clearCat(callback,rowId)
{
layer.closeAll();
// console.log('#'+field+'-value');
$('#'+callback+'-value').val('');
$('#'+callback+'-title').val('');
var row = $table.bootstrapTable('getRowByUniqueId', rowId);
row.cid = 0;
mySaveData(dataSaveUrl,row);
}
function titleFormatter(value, row, index,field) {
var icon = row.id % 2 === 0 ? 'fa-star' : 'fa-star-and-crescent'
return '<i class="fa ' + icon + '"></i> ' + value
}
function textFormatter(value,row,index){
return value || '';
}
function yesnoFormatter(value,row,index){
if(value>=1){
return "是"
}
if(value<=0){
return "否"
}
}
function numFormatter(value,row,index){
return value ? Number(value) : 0;
}
function timeFormatter(value,row,index){
if(!value) return '';
return formatTime.toStrFull(value*1000);
}
function dateFormatter(value,row,index){
if(!value) return '';
return formatTime.toStrYMD(value*1000);
}
function priceFormatter(value) {
// 16777215 == ffffff in decimal
value = value ? parseFloat(value) : 0;
var color = '#' + Math.floor(Math.random() * 16777215).toString(16);
//随机颜色
return '<div style="color: ' + color + '">' +
'<i class="fa fa-cny"></i>' +
value +
'</div>'
}
//footerFormatter 表格底统计格式化操作
function CountTitleFooter(){
// 统计标题
return '总计';
}
function CountTotalFooter(data){
// 统计总数
return data.length;
}
function TextCountFooter() {
//文本格式统计
return '';
}
function PriceCountFooter(data) {
// 价格格式统计
var field = this.field
return '¥' + data.map(function (row) {
return +row[field].substring(1)
}).reduce(function (sum, i) {
return sum + i
}, 0)
}
function NumCountFooter(data) {
//数值累计格式
var field = this.field;
return data.map(
function (row) {
return row[field] ? Number(row[field]) : 0;
}
).reduce(
function (sum, i) {
return sum + i
},
0
);
}
// 各种格式化操作 E
//表格样式 S
function cellStyle(value, row, index) {
return {}
//暂不设置
var classes = [
'bg-blue',
'bg-green',
'bg-orange',
'bg-yellow',
'bg-red'
]
if (index / 5 < classes.length) {
return {
css:{},
classes: classes[index / 5]
}
}
return {
css: {},
classes:''
}
}
function footerStyle(column) {
return {
id: {
classes: 'uppercase'
},
name: {
css: {'font-weight': 'normal'}
},
price: {
css: {color: 'red'}
}
}[column.field]
}
function headerStyle(column) {
return {
id: {
classes: 'uppercase'
},
title: {
css: {background: 'yellow'}
},
des: {
css: {color: 'red'}
}
}[column.field]
}
//表格样式 E
//toolbar按钮事件 S
// 复合筛选
$('#filterBy').click(function () {
var filterAlgorithm = $('[name="filterAlgorithm"]').val()
$table.bootstrapTable('refreshOptions', {
filterOptions: {
filterAlgorithm: filterAlgorithm
}
})
$table.bootstrapTable('filterBy', {
id: 3,
title: '价格'
})
})
//toolbar按钮事件 E
// 更新表格参数 TBD 未调试
function refreshTable(key,value){
$table.bootstrapTable('refreshOptions', {
key: value
})
}
// 表格初始化
function myInitTable() {
$table.bootstrapTable('destroy').bootstrapTable(options)
}
// 表格之外的方法-自定义的 S
// 网络获取数据
function myGetData(url){
var _data = {
'_csrf-backend': "<?=$_csrf_backend ;?>"
}
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// 'Content-Type': 'application/x-www-form-urlencoded',
'csrf-param': '_csrf-backend',
'csrf-token': "<?=$_csrf_backend ;?>"
},
body: JSON.stringify(_data)
})
.then(
function(res){
if(res.ok) {
return res.json();
}else{
throw new Error('网络连接出现问题.');
}
}
)
.then(
function(data){
return data;
}
)
.catch(error => console.error('Error:', error));
}
//保存数据
function mySaveData(url,data){
data['_csrf-backend'] = "<?=$_csrf_backend ;?>";
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'csrf-param': '_csrf-backend',
'csrf-token': "<?=$_csrf_backend ;?>"
},
body: JSON.stringify(data)
})
.then(
function(res){
if(res.ok) {
return res.json();
}else{
throw new Error('网络连接出现问题.');
}
}
)
.then(
function(data){
return data;
}
)
.catch(error => console.error('Error:', error));
}
//删除数据
function myDelData(url,data){
data['_csrf-backend'] = "<?=$_csrf_backend ;?>";
var url = url +'?op=del';
$.ajax({
type: "POST",
url: url,
data: data,
dataType: "json",
headers:{
'csrf-param': '_csrf-backend',
'csrf-token': "<?=$_csrf_backend ;?>"
},
success: function(res) {
// 处理服务器响应
if(res.code==200){
layer.msg(res.msg)
}
},
error: function(res) {
// 处理错误情况
console.log(res);
}
});
}
//删除行数据
function confirmRemoveRow(row, index){
var str = '您确定要删除该行数据?'
layer.confirm(str, {
btn: ['确定', '取消'] //按钮
}, function () {
// 点击确定执行下一步的动作
layer.closeAll();
//关闭所有的窗口
myDelData(dataAjaxUrl,row);
$table.bootstrapTable('remove', {
field: '$index',
values: [index]
})
},function(){
//点击取消执行的动作
console.log("放弃删除了")
}
);
}
//格式化显示日期
let formatTime = {
UNITS: {
'年': 31557600000,
'月': 2629800000,
'天': 86400000,
'小时': 3600000,
'分钟': 60000,
'秒': 1000
},
//将毫秒时间戳转换成美化时间
beauty: function(milliseconds) {
var beauty = '';
for (var key in this.UNITS) {
if (milliseconds >= this.UNITS[key]) {
beauty = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
break;
}
}
return beauty || '刚刚';
},
//将时间戳转换成格式化时间
toStrFull: function(dateStr,isTimestamp=false) {
var date;
if(isTimestamp){
date = this.toTime(dateStr)
}else{
date = new Date(dateStr)
}
var diff = Date.now() - date.getTime();
if (diff < this.UNITS['天']) {
return this.beauty(diff);
}
var _format = function(number) {
return (number < 10 ? ('0' + number) : number);
};
return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDate()) + '-' +
_format(date.getHours()) + ':' + _format(date.getMinutes());
},
//将时间戳转换成格式化时间
toStrYMD: function(dateStr,isTimestamp=false) {
var date;
if(isTimestamp){
date = this.toTime(dateStr)
}else{
date = new Date(dateStr)
}
var diff = Date.now() - date.getTime();
if (diff < this.UNITS['分']) {
return this.beauty(diff);
}
var _format = function(number) {
return (number < 10 ? ('0' + number) : number);
};
return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDate());
},
toTime: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串转化为一个Date对象
var a = str.split(/[^0-9]/);
return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
}
}
function addNewRow(){
var _emptyRow = {id:''}
$table.bootstrapTable('append',_emptyRow) //添加空白行
}
// 表格之外的方法 E
// 启动时页面加载
$(function() {
myInitTable()
// 绑定事件监听
// 修复官方BUG高级搜索按钮点击时去除模态框的fade类以使其显示
$("button[name='advancedSearch']").on('click',
function(e){
var id = "#avdSearchModal_"+options.idTable;
$(id).removeClass('fade');
}
);
//高级搜索执行后的动作 TBD 计划使之关联到服务端做即时查询
$table.on('column-advanced-search.bs.table',
function(e){
console.log('高级搜索已执行')
}
);
$table.on('check.bs.table uncheck.bs.table ' +
'check-all.bs.table uncheck-all.bs.table',
function () {
$remove.prop('disabled', !$table.bootstrapTable('getSelections').length)
// save your data, here just save the current page
selections = getIdSelections()
// push or splice the selections if you want to save all data selections
}
);
// $table.on('all.bs.table',
// function (e, name, args) {
// // console.log(name, args)
// }
// );
// 监听列移动事件
// $table.on('column-moving.bs.table', function(e, field, from, to) {
// // 列移动后重设表格高度
// let $tableBody = $table.find('tbody');
// let tableHeight = $tableBody.height();
// $tableBody.css('height', tableHeight);
//
// // 或者你可以计算所有行的高度之和,并设置为表格高度
// // var rowHeights = $tableBody.find('tr').map(function() {
// // return $(this).outerHeight();
// // }).get();
// // var totalHeight = rowHeights.length > 0 ? rowHeights.sum() : 0;
// // $tableBody.css('height', totalHeight);
//
// //平滑过渡效果
// let totalHeight = tableHeight;
// $tableBody.animate({
// 'height': totalHeight
// }, 'slow');
// });
$remove.click(function () {
var ids = getIdSelections()
$table.bootstrapTable('remove', {
field: 'id',
values: ids
})
$remove.prop('disabled', true)
lay.msg('所选行已删除,数据仍然存在,下次刷新页面时将重新加载')
})
$add.click(
function(){
addNewRow()
}
)
//初始化可移动列
$('th.resize_able').resizable({
'handles':'e'
//可以控制移动方向的变量w,e,s,n,
//e (east东横向移动
})
//直接引用jquery-ui的大小拖放功能,指定带 class:"resize_able" 类的列表头 th 可拖动
myGetData(dataUrl).then(
function(data){
if(data){
var _rows=[];
if(typeof(data.rows)=='object'){
for(var key in data.rows){
_rows.push(data.rows[key]);
}
}else{
_rows = data.rows
}
$table.bootstrapTable('append',_rows) //向表格追加数据
}
$table.bootstrapTable('scrollTo','bottom') //添加完数据转至表格底
}
)
})
</script>
<div class="modal inmodal" id="modal-help" tabindex="-1" role="dialog" aria-hidden="true" style="height:500px;z-index:999">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<h4 class="modal-title">操作帮助</h4>
<small class="font-bold">请认真阅读操作手册。</small>
</div>
<div class="modal-body">
<p>帮助内容</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-white" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<style>
.modal-backdrop.in {
opacity: .3;
}
</style>
<script>
//模态框
</script>