first commit

This commit is contained in:
2026-07-23 09:40:36 +08:00
commit 090abf48fa
989 changed files with 145728 additions and 0 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,390 @@
mbui.define(['tool'], function (exports) {
let tool = mbui.tool;
var settings = {
mode: "month",
weekMode: ["一", "二", "三", "四", "五", "六", "日"],
newDate: new Date(),
width: null,
height: null,
shwoLunar: false,
showModeBtn: true,
showEvent: true,
success: function (today) {
console.log(today);
},
mark: function (start_date, end_date) {
console.log(start_date);
console.log(end_date);
}
};
var Calendar = {
init: function () {
var me = this, el = me.el, opts = me.options;
el.addClass("calendar");
opts.width = el.width();
opts.height = el.height();
typeof (opts.newDate) == "string" ? opts.newDate = me._getDateByString(opts.newDate) : "";
me._createCalendar();
//绑定事件
//changeMode
el.on("click", ".calendar-mode-select .btn", function (e) {
e.stopPropagation();
var modeText = $(this).text();
var mode = modeText == "月" ? "month" : "year";
me.changeMode(mode);
})
//calendar-cell日期点击事件
el.on("click", ".calendar-cell", function (e) {
e.stopPropagation();
$(".dropdown-month").removeClass("open");
$(".dropdown-year").removeClass("open");
var cellDate = $(this).attr("title");
var viewData = me.viewData;
var year = parseInt(cellDate.split("年")[0]);
var month = parseInt(cellDate.split("年")[1].split("月")[0]) - 1;
var date = parseInt(cellDate.split("年")[1].split("月")[1].split("日")[0]);
if (opts.mode == "year") {
if (opts.cellClick) opts.cellClick(year + '-' + (month + 1))
}
else if (opts.mode == "month" && month == opts.newDate.getMonth()) {
if (me.options.cellClick) me.options.cellClick(year + '-' + (month + 1) + '-' + date);
}
})
//年份下拉
el.on("click", ".calendar-year-select", function (e) {
e.stopPropagation();
$(".dropdown-month").removeClass("open");
$(".dropdown-year").toggleClass("open");
//创建下拉数据
var yearText = opts.newDate.getFullYear();
var s = '';
for (var i = 0; i < 21; i++) {
if (i == 10) {
s += '<li class="year-item active">'
}
else {
s += '<li class="year-item">'
}
s += '<span class="year-check">' + (yearText - 10 + i) + '</span>'
s += '<span >年</span>'
s += '</li>'
}
me.el.find(".dropdown-year").html(s);
})
//上一月
el.on("click", ".calendar-pre", function (e) {
e.stopPropagation();
var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1;
month--;
if (month < 1) {
year = year - 1;
month = 12;
}
opts.newDate.setFullYear(year);
var beforeDate = opts.newDate.getDate();
opts.newDate.setMonth(month - 1);
var afterDate = opts.newDate.getDate();
//处理日期30号,切换到2月不存在30号
if (beforeDate != afterDate) {
opts.newDate.setDate(opts.newDate.getDate() - 1);
}
opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
$(".calendar-month-text").text(month + "月");
$(".calendar-year-text").text(year + "年");
})
//下一月
el.on("click", ".calendar-next", function (e) {
e.stopPropagation();
var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1;
month++;
if (month > 12) {
year = year + 1;
month = 1;
}
opts.newDate.setFullYear(year);
var beforeDate = opts.newDate.getDate();
opts.newDate.setMonth(month - 1);
var afterDate = opts.newDate.getDate();
//处理日期30号,切换到2月不存在30号
if (beforeDate != afterDate) {
opts.newDate.setDate(opts.newDate.getDate() - 1);
}
opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
$(".calendar-month-text").text(month + "月");
$(".calendar-year-text").text(year + "年");
})
//年份改变
el.on("click", ".year-item", function (e) {
e.stopPropagation();
$(".dropdown-year").removeClass("open");
var yearText = $(this).text();
var yearNum = yearText.split("年")[0];
if (yearNum == opts.newDate.getFullYear()) return;
opts.newDate.setFullYear(yearNum);
opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
$(".calendar-year-text").text(yearText);
})
//月份下拉
el.on("click", ".calendar-month-select", function (e) {
e.stopPropagation();
$(".dropdown-year").removeClass("open");
$(".dropdown-month").toggleClass("open");
})
//月份改变
el.on("click", ".month-item", function (e) {
e.stopPropagation();
$(".dropdown-month").removeClass("open");
var monthText = $(this).text();
var monthNum = monthText.split("月")[0];
if (monthNum == (opts.newDate.getMonth() + 1)) return;
var beforeDate = opts.newDate.getDate();
opts.newDate.setMonth(monthNum - 1);
var afterDate = opts.newDate.getDate();
//处理日期30号,切换到2月不存在30号
if (beforeDate != afterDate) {
opts.newDate.setDate(opts.newDate.getDate() - 1);
}
me._refreshCalendar(opts.newDate);
$(".calendar-month-text").text(monthText);
})
$(document.body).on("click", function (e) {
$(".dropdown-month").removeClass("open");
$(".dropdown-year").removeClass("open");
})
},
//公开方法
changeMode: function (mode) {
var me = this;
if (mode == me.options.mode) return;
me.options.mode = mode;
me._createCalendar();
},
getViewDate: function (viewDate) {
var me = this, opts = me.options, mode = opts.mode, data = opts.data;
if (!data || data.length == 0) return [];
var viewData = {}, modeYear = viewDate.getFullYear(), modeMonth = null;
if (mode == "month") { modeMonth = viewDate.getMonth() };
//筛选视图数据并转化未对象 要不要转化为属性
for (var i = 0; i < data.length; i++) {
var item = data[i];
var start = me._getDateByString(item.startDate);
var year = start.getFullYear();
var month = start.getMonth();
var date = start.getDate();
if (modeMonth && year == modeYear && modeMonth == month) {
if (!viewData[date]) viewData[date] = [];
viewData[date].push(item);
}
else if (!modeMonth && year == modeYear) {
if (!viewData[month]) viewData[month] = [];
viewData[month].push(item);
}
}
return viewData;
},
_getDateByString: function (stringDate) {
var me = this;
var year = stringDate.split("-")[0];
var month = parseInt(stringDate.split("-")[1]) - 1;
var date = stringDate.split("-")[2];
return new Date(year, month, date);
},
//私有方法
_createCalendar: function () {
var me = this;
var dateMode = me.options.mode;
me._createView();
},
_createView: function () {
var me = this, el = me.el, opts = me.options, mode = opts.mode, newDate = opts.newDate, html = '';
html += me._createToolbar();
html += '<div class="calendar-body">';
html += '<table class="calendar-table" cellspacing="0">'
if (mode == "month") {
html += me._createHeader();
}
html += me._createBody();
html += '</table>'
html += '</div>'
el.html(html);
if (mode == "month") {
me._refreshCalendar(newDate);
}
else {
me._refreshYearCalendar(newDate);
}
if (me.options.success) me.options.success(newDate);
},
_createToolbar: function () {
var me = this, newDare = me.options.newDate, mode = me.options.mode, showModeBtn = me.options.showModeBtn, s = '';
var year = newDare.getFullYear();
var month = newDare.getMonth() + 1;
s += '<div class="calendar-header">'
s += '<div class="calendar-select calendar-year-select" >'
s += '<span class="calendar-year-text"> ' + year + '年</span >'
s += '<ul id="dropdown-year" class="dropdown-year">'
s += '</ul>'
s += '</div> '
if (mode == "month") {
s += '<div class="calendar-select calendar-month-select">'
s += '<span class="calendar-month-text"> ' + month + '月</span >'
//创建月份下拉
s += '<ul class="dropdown-month">'
for (var i = 1; i <= 12; i++) {
s += '<li class="month-item">'
s += '<span class="month-check">' + i + '</span>'
s += '<span >月</span>'
s += '</li>'
}
s += '</ul>'
s += '</div > '
}
if (showModeBtn) {
s += '<div class="calendar-select calendar-mode-select">'
s += '<div class="btn-group">'
if (mode == "month") {
s += '<span class="btn calendar-select-active">月</span>'
s += '<span class="btn">年</span>'
}
else {
s += '<span class="btn">月</span>'
s += '<span class="btn calendar-select-active">年</span>'
}
s += '</div>'
s += '</div>'
}
s += '<i class="fa-angle-left calendar-pre"></i><i class="fa-angle-right calendar-next"></i>'
s += '</div>'
return s;
},
_createHeader: function () {
var me = this, opts = me.options, weekMode = opts.weekMode;
var s = '<thead><tr>'
weekMode.forEach(function (item) {
s += ' <th class="calendar-column-header" title="周' + item + '"><span class="calendar-column-header-inner">' + item + '</span></th>'
})
s += '</thead></tr>'
return s;
},
_createBody: function () {
var me = this;
var s = ' <tbody class="calendar-tbody">'
s += '</tbody>'
return s;
},
_refreshYearCalendar: function (newDate) {
var me = this, showEvent = me.options.showEvent, s = '';
//每次都重新获取会不会影响性能
me.viewData = viewData = me.getViewDate(newDate);
var year = newDate.getFullYear(), month = newDate.getMonth();
//四行三列
for (var i = 0; i < 4; i++) {
s += '<tr>'
for (var l = 0; l < 3; l++) {
renderMonth = i * 3 + l;
if (month == renderMonth) {
s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell calendar-thisMonth">';
}
else {
s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell">';
}
s += '<div class="calendar-date">';
s += '<div class="calendar-value">' + (renderMonth + 1) + '月';
if (showEvent && viewData[renderMonth]) {
if (viewData[renderMonth].length > 0) {
s += '<div class="calendar-event"></div>';
}
}
s += '</div>';
s += '</div></td>';
}
s += '</tr>'
}
me.el.find(".calendar-tbody").html(s);
},
_refreshCalendar: function (newDate) {
var me = this, showEvent = me.options.showEvent, s = '';
me.viewData = viewData = me.getViewDate(newDate);
var _newDate = me._cloneDate(newDate);
//当前date
var nowNum = _newDate.getDate();
//第一天周几
_newDate.setDate(1);
var weekDay = _newDate.getDay() == 0 ? 7 : _newDate.getDay();
//视图第一天
var viewDate = me._cloneDate(_newDate);
viewDate.setDate(viewDate.getDate() - weekDay + 1);
//当前第几周/行 (暂不处理)
var spileDate = (newDate.getTime() - viewDate.getTime()) / (1000 * 60 * 60 * 24);
renderDate = me._cloneDate(viewDate);
var start_date, end_date;
//固定六行
for (var i = 0; i < 6; i++) {
s += '<tr>'
for (var l = 0; l < 7; l++) {
var year = renderDate.getFullYear();
var month = renderDate.getMonth() + 1;
var date = renderDate.getDate();
if (i == 0 && l == 0) {
start_date = year + '-' + month + '-' + date;
}
end_date = year + '-' + month + '-' + date;
if (renderDate.getMonth() < newDate.getMonth()) {
s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-last-month-cell">';
}
else if (renderDate.getMonth() > newDate.getMonth()) {
s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-next-month-cell">';
}
else if (date == nowNum) {
s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-today">';
}
else {
s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell">';
}
s += '<div class="calendar-date">';
s += '<div class="calendar-value">' + date;
if (showEvent && viewData[date] && renderDate.getMonth() == newDate.getMonth()) {
if (viewData[date].length > 0) {
s += '<div class="calendar-event"></div>';
}
}
s += '</div>';
s += '</div></td>';
renderDate.setDate(renderDate.getDate() + 1);
}
s += '</tr>'
}
me.el.find(".calendar-tbody").html(s);
if (me.options.mark) me.options.mark(start_date, end_date);
},
_cloneDate: function (date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
}
var calendar = function (element, options) {
Calendar.el = $('#' + element);
Calendar.options = $.extend(true, {}, settings, options);
Calendar.init();
}
// 输出接口
exports('calendar', calendar);
});
@@ -0,0 +1,393 @@
mbui.define(['tool','layer'], function (exports) {
const tool = mbui.tool,layer = mbui.layer;
let searchTimer;
const dataTypes = {
'property':{
title:'选择固定资产',
url:'/adm/api/get_property',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">编号:</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">分类:</span>'+item.cate+'</div>\
</div>\
</label>'
}
},
'car':{
title:'选择车辆信息',
url:'/adm/api/get_car',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">车牌号:</span>'+item.name+'<span class="text-gray" style="margin-left:12px;">座位数:</span>'+item.seats+'</div>\
</div>\
</label>'
}
},
'room':{
title:'选择会议室',
url:'/adm/api/get_meeting_room',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">设备:</span>'+item.device+'<span class="text-gray" style="margin-left:12px;">可容纳人数:</span>'+item.num+'</div>\
</div>\
</label>'
}
},
'loan':{
title:'选择抵消借支',
url:'/finance/api/get_loan',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">状态:</span>'+item.balance_name+'<span class="text-gray" style="margin-left:12px;">可抵消余额:</span>'+item.un_balance_cost+'</div>\
</div>\
</label>'
}
},
'customer':{
title:'选择客户',
url:'/customer/api/get_customer',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.name + '</div>\
<div class="f12"><span class="text-gray">所属员工:</span>'+item.belong_name+'<span class="text-gray" style="margin-left:12px;">所属部门:</span>'+item.belong_department+'</div>\
</div>\
</label>'
}
},
'supplier':{
title:'选择供应商',
url:'/contract/api/get_supplier',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">联系人:</span>'+item.contact_name+'<span class="text-gray" style="margin-left:12px;">联系电话:</span>'+item.contact_mobile+'</div>\
</div>\
</label>'
}
},
'contract':{
title:'选择销售合同',
url:'/contract/api/get_contract',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.name + '</div>\
<div class="f12"><span class="text-gray">合同编号:</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">签订人:</span>'+item.sign_name+'</div>\
</div>\
</label>'
}
},
'product':{
title:'选择产品',
url:'/contract/api/get_product',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">编码:</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">分类:</span>'+item.cate+'</div>\
</div>\
</label>'
}
},
'purchase':{
title:'选择采购合同',
url:'/contract/api/get_purchase',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.name + '</div>\
<div class="f12"><span class="text-gray">合同编号:</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">签订人:</span>'+item.sign_name+'</div>\
</div>\
</label>'
}
},
'purchased':{
title:'选择采购物品',
url:'/contract/api/get_purchased',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">编码:</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">分类:</span>'+item.cate+'</div>\
</div>\
</label>'
}
},
'project':{
title:'选择项目',
url:'/project/api/get_project',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.name + '</div>\
<div class="f12"><span class="text-gray">项目类型:</span>'+item.cate+'<span class="text-gray" style="margin-left:12px;">项目负责人:</span>'+item.director_name+'</div>\
</div>\
</label>'
}
},
'task':{
title:'选择任务',
url:'/project/api/get_task',
searchbar:'<div class="mbui-picker-search"><input type="search" class="search-input" placeholder="输入关键字..."></div>',
template:function (item,types){
return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
<div style="margin-left:8px;">\
<div class="line-limit-1">' + item.title + '</div>\
<div class="f12"><span class="text-gray">负责人:</span>'+item.director_name+'<span class="text-gray" style="margin-left:12px;">任务状态:</span>'+item.status_name+'</div>\
</div>\
</label>'
}
}
};
//html转义,防止XSS
function escapeHtml(text) {
var map = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#039;'
};
return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}
var LoadData= function () {
this.config = {
title: "请选择内容",
url: "",
searchbar:"",
type: "radio",
where: {},
limit: 20,
data:[],
selectData:[],
template: function (data) {
return JSON.parse(data);
},
callback: function(){}
};
this.index = 0;
this.loaded = 0;
this.page = 1;
this.count = 0;
this.total = 0;
};
// 初始化
LoadData.prototype.init = function (options,types) {
var that = this;
let opts={};
if (types != "undefined") {
opts = dataTypes[types];
}
$.extend(true,that.config,opts,options);
//console.log(that.config);
that.index = new Date().getTime();
var $container = $('<div class="mbui-picker-selector"><header class="mbui-bar"><a class="mbui-bar-item left" href="javascript:;"><i class="mbui-bar-arrow-left"></i>关闭</a><a class="mbui-bar-item right text-blue" href="javascript:;">确认</a><h1 class="mbui-bar-title">'+that.config.title+'</h1></header></div>');
$container.append(that.config.searchbar);
$container.append('<div class="load-data-container lists" id="lists_'+that.index+'"><div id="container_'+that.index+'"></div><div class="load-data-none"><i class="iconfont icon-none"></i><br>暂无数据</div><div class="load-data-loading"><span>努力加载中</span></div><div class="load-data-end"><span>—— ● ——</span></div></div>');
$('body').append($container);
$('#root').hide();
$container.find('.left').click(function () {
$container.fadeOut(function () {
$container.remove();
$('#root').show();
});
});
$container.on('input','.search-input',function() {
const key = $(this).val().trim();
// 清除上一次的定时器
clearTimeout(searchTimer);
// 设置新的延迟请求
searchTimer = setTimeout(() => {
that.config.where['keywords']=key;
that.page=1;
that.ajax();
}, 400);
});
$container.on('click','.tags-search',function() {
const key = $(this).data('key');
const val = $(this).data('val');
$(this).addClass('active').siblings().removeClass('active');
// 清除上一次的定时器
clearTimeout(searchTimer);
// 设置新的延迟请求
searchTimer = setTimeout(() => {
that.config.where[key]=val;
that.page=1;
that.ajax();
}, 400);
});
$container.find('.right').click(function () {
let selected = $container.find('input:checked');
if (selected.length == 0) {
layer.msg('请选择数据');
return false;
}
that.config.selectData.length=0;
let ids=[];
for (var m = 0; m < selected.length; m++) {
let selected_item = $(selected[m]).parent();
let id=selected_item.data('id');
ids.push(id);
}
that.config.selectData = that.config.data.filter(item => ids.includes(item.id));
that.config.callback(that.config.selectData);
$container.fadeOut(function () {
$container.remove();
$('#root').show();
});
});
$('#lists_'+that.index).scroll(function(){
if ($(this).scrollTop() + $('body').height() >= $('#container_'+that.index).height()-60) {
console.log($(this).scrollTop());
console.log('<br>');
console.log($('body').height());
console.log('<br>');
console.log($('#container_'+that.index).height());
// 滚动到页面底部时加载更多数据
if (that.total < that.count && that.loaded == 0){
that.ajax();
}
}
});
that.ajax();
};
LoadData.prototype.ajax = function () {
var that = this;
var elem = $('#container_'+that.index);
var container = elem.parent();
//console.log(container.html());
// 发送请求获取数据
$.ajax({
url: that.config.url + '?page=' + that.page + '&limit=' + that.config.limit,
type: 'GET',
data: that.config.where,
beforeSend: function () {
// 显示加载按钮
that.loaded = 1;
container.find('.load-data-loading').show();
container.find('.load-data-end').hide();
},
success: function (res) {
that.count=res.count;
that.total+=res.data.length;
container.find('.load-data-none').attr('class','load-data-none load-data-'+that.count);
if(that.page==1){
that.config.data.length=0;
elem.html('');
}
if (res.count > 0) {
that.page++;
that.config.data.push(...res.data);
$.each(res.data, function (index, item) {
// 转义JSON对象中的字符串值,防止XSS
for (var key in item) {
if (typeof item[key] === 'string') {
item[key] = escapeHtml(item[key]);
}
}
// 创建列表项并添加到列表中
var listItem = that.config.template(item,that.config.type);
elem.append(listItem);
});
container.find('.load-data-end').show();
}
else{
that.config.data.length=0;
that.page=1;
}
},
complete: function () {
that.loaded = 0;
container.find('.load-data-loading').hide();
container.find('.load-data-end').show();
}
});
}
//选择员工弹窗
$('body').on('click','.picker-data',function () {
let that = $(this);
let types = that.data('types');
let type = that.data('type');
let where = that.data('where');
if (typeof(type) == "undefined" || type == '') {
type = 1;
}
type = type == 2 ? 'checkbox' : 'radio';
if (typeof(types) == "undefined" || types == '') {
layer.msg('请设置【picker】的类型');
return false;
}
if (typeof(where) == "undefined" || where == '') {
map = {};
}
else{
map = JSON.parse(where);
}
let picker = new LoadData();
picker.init({
type:type,
where: map,
callback:function(selectData){
let ids=[],titles=[];
for ( var i = 0; i <selectData.length; i++){
ids.push(selectData[i].id);
if(!selectData[i].title){
titles.push(selectData[i].name);
}else{
titles.push(selectData[i].title);
}
}
that.val(titles.join(','));
that.next().val(ids.join(','));
}
},types);
});
// 导出loadData模块
exports('dataPicker', function (options,types) {
var dataPicker = new LoadData();
dataPicker.init(options,types);
});
});
@@ -0,0 +1,199 @@
mbui.define(['layer'], function (exports) {
function bytesToSize(bytes) {
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
if (bytes === 0) return '0 Bytes';
const i = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, i)).toFixed(2) + ' ' + sizes[i];
}
function generateUniqueID(length) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let id = '';
while (id.length < length) {
id += chars.charAt(Math.floor(Math.random() * chars.length));
}
return id;
}
var layer = mbui.layer;
var config = {
uploadBtn: "uploadBtn",
uploadBox: "uploadBox",
url: "/api/index/upload",
accept: "application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf,.csv,image/*,text/plain,video/*,audio/*,application/x-zip-compressed",
onlyImage: false,
more:true,
template:function(data){
let exts = ['jpg', 'png', 'gif', 'jpeg'];
let filesize = bytesToSize(data.filesize);
let fileshow='<div class="mbui-file-icon" data-url="'+data.filepath+'" data-name="'+data.name+'"><i class="iconfont icon-weizhigeshi"></i></div>';
if(exts.includes(data.fileext)){
fileshow='<div class="mbui-file-icon file-img"><img src="'+data.filepath+'" alt="'+data.name+'"></div>';
}
return `<div class="mbui-file-div" data-id="${data.id}">
${fileshow}
<div class="mbui-file-info">
<div class="mbui-file-name line-limit-1">${data.name}</div>
<div class="mbui-file-size">${filesize},刚刚</div>
</div>
<div class="mbui-file-del"><i class="iconfont icon-cuowukongxin"></i></div>
</div>`;
},
ajaxUpload:null,
loaded:0
};
// 初始化
var fileUpload = function (options) {
var timestamp = generateUniqueID(10);
var settings = $.extend({}, config, options);
//$.extend(true, that.config, options);
if(settings.onlyImage){
settings.accept = "image/jpeg,image/png,image/bmp";
}
var uploadBtn = $('#'+settings.uploadBtn),uploadBox = $('#'+settings.uploadBox),fileInput = 'fileInput_'+timestamp;
uploadBox.append('<input id="'+fileInput+'" type="file" multiple="" accept="'+settings.accept+'" style="display:none;">');
//点击上传
uploadBtn.click(function() {
let newtimestamp = Date.now();
$('#'+fileInput).replaceWith($('<input type="file" id="'+fileInput+'" style="display:none;" multiple="" accept="'+settings.accept+'">'));
if(settings.loaded == 0){
$('#'+fileInput).click();
}
});
//赋值到form表单
function fileValue(){
let file_array = [];
uploadBox.find('.mbui-file-div').each(function () {
let $id = $(this).data('id');
file_array.push($id);
});
uploadBox.find('[data-type="file"]').val(file_array.join(','));
}
//删除已上传
uploadBox.on('click','.mbui-file-del',function() {
$(this).parent().remove();
fileValue();
});
//附件上传
uploadBox.on('change','#'+fileInput,function() {
var fileInput = $(this)[0];
var files = fileInput.files;
console.log(files);
//return false;
if (files) {
// 将文件列表转为数组
const filesArray = Array.from(files);
// 使用递归方式逐个上传到服务器
function uploadNextFile(index) {
if (index >= filesArray.length) {
settings.loaded = 0;
layer.closeAll();
return;
}
const file = filesArray[index];
const formData = new FormData();
formData.append('file', file);
$.ajax({
url: settings.url,
type: 'POST',
data: formData,
processData: false,
contentType: false,
beforeSend: function () {
// 显示加载按钮
settings.loaded = 1;
layer.loading('文件上传中...');
},
complete:function(){
uploadNextFile(index + 1); // 成功后上传下一个
},
success: function(res) {
if(res.code==0){
if(typeof(settings.ajaxUpload) == "undefined" || settings.ajaxUpload==null){
var listItem = settings.template(res.data);
console.log(index);
if(settings.more==false){
uploadBox.find('.mbui-file-div').remove();
}
uploadBox.append(listItem);
}
else{
settings.ajaxUpload(res);
}
fileValue();
}
},
error: function(xhr, status, error) {
console.log('文件上传失败');
console.log('错误信息:', error);
}
});
}
// 开始上传第一个文件
uploadNextFile(0);
} else {
console.log('请选择要上传的文件');
}
});
};
function copyCtrl(content) {
var save = function(e){
e.clipboardData.setData('text/plain', content);
e.preventDefault();
}
document.addEventListener('copy', save);
document.execCommand('copy');
document.removeEventListener('copy',save);
if (content != '') {
layer.msg('复制成功');
}
}
function downloadFile(url, fileName) {
let link = document.createElement("a");
link.href = url;
link.download = fileName;
link.click();
layer.loading('文件下载中...');
}
function isWeChat() {
return /micromessenger/i.test(navigator.userAgent);
}
//查看图片
$('body').on('click','.mbui-file-icon',function(e) {
e.preventDefault();
let img = $(this).find('img');
let href = img.attr('src');
if (href!=undefined && href!='') {
layer.photo(href);
}
else {
let url=window.location.origin + $(this).data('url');
let name=$(this).data('name');
if(isWeChat()){
layer.open({
type: 1,
title: '温馨提示',
content: '微信或企业微信不支持下载文件附件<br>请复制链接到手机浏览器下载查看',
btn: ['复制链接'],
yes:function(index){
copyCtrl(url);
layer.close(index);
}
});
}
else{
downloadFile(url,name);
}
}
});
// 导出fileUpload模块
exports('fileupload', function (options) {
return new fileUpload(options);
});
});
@@ -0,0 +1,56 @@
mbui.define([], function (exports) {
$('body').append('<div class="mbui-fixed-bar">\
<div class="fixed-bar-box">\
<button class="fixed-bar-btn"><span class="menutoggle"><span></span></span></button>\
</div>\
<div class="fixed-bar-item">\
<a href="/qiye/index/index">工作台</a>\
<a href="/qiye/customer/index">客户<br>管理</a>\
<a href="/qiye/contract/index">合同<br>管理</a>\
<a href="/qiye/project/index">项目<br>管理</a>\
<a href="/qiye/msg/index">消息<br>通知</a>\
</div>\
</div>');
$('.fixed-bar-btn').click(function () {
$(this).toggleClass('active');
return $('.fixed-bar-item').toggleClass('open');
});
$('.fixed-bar-item').on('click','a',function(e){
e.preventDefault();
let href=$(this).attr('href');
location.replace(href);
})
var startX, startY, moveX, moveY;
var browserWidth = $(window).width();
var browserHeight = $(window).height();
var $button = $('.mbui-fixed-bar');
$button.on('touchstart', function(e){
startX = e.touches[0].pageX - parseInt($button.css('left'));
startY = e.touches[0].pageY - parseInt($button.css('top'));
$button.on('touchmove', function(e){
e.preventDefault();
moveX = e.touches[0].pageX - startX;
moveY = e.touches[0].pageY - startY;
if(moveY>100 && moveY<browserHeight-206){
$button.css({
top: moveY + 'px'
});
}
if(moveX>8 && moveX<browserWidth-166){
$button.css({
left: moveX + 'px'
});
}
});
$button.on('touchend', function(){
$button.off('touchmove').off('touchend');
});
});
// 导出Tab模块
exports('fixedbar', function () {
});
});
+163
View File
@@ -0,0 +1,163 @@
mbui.define(['layer'], function (exports) {
let layer = mbui.layer;
var form = function (options) {
// 默认配置选项
var settings = $.extend({
target: '#formBox',
verify: {
required: function (value) {
if (!/[\S]+/.test(value)) {
return '必填项不能为空';
}
},
phone: function (value) {
var EXP = /^1\d{10}$/;
if (value && !EXP.test(value)) {
return '手机号格式不正确';
}
},
email: function (value) {
var EXP = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (value && !EXP.test(value)) {
return '邮箱格式不正确';
}
},
url: function (value) {
var EXP = /^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/;
if (value && !EXP.test(value)) {
return '链接格式不正确';
}
},
number: function (value) {
if (value && isNaN(value)) {
return '只能填写数字';
}
},
date: function (value) {
var EXP = /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;
if (value && !EXP.test(value)) {
return '日期格式不正确';
}
},
identity: function (value) {
//var EXP = /(^\d{15}$)|(^\d{17}(x|X|\d)$)/;
var EXP = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$/;
if (value && !EXP.test(value)) {
return '身份证号格式不正确';
}
}
},
errorClass: 'mbui-form-danger',
successClass: 'mbui-form-success',
errorMessageContainer: null, // 可以指定错误信息容器,例如:'div#error-message'
submit: function (data) {
console.log(data);
}
}, options);
var formBox = $(settings.target);
formBox.on('submit', function (event) {
event.preventDefault();
var isValid = true; //校验判断标识
var field = {}; // 字段集合
formBox.find('input,select,textarea').each(function () {
if (isValid == false) {
return false;
}
var $this = $(this),
val = $this.val(),
rule = $this.data('verify') || '',
rules = rule.split('|'),
errMsg = '';
$this.removeClass(settings.errorClass); // 移除警示样式
for (var i = 0; i < rules.length; i++) {
var ruleName = rules[i],
ruleFunc = settings.verify[ruleName];
if (ruleFunc) {
errMsg = ruleFunc(val);
if (errMsg) {
// 获取自定义必填项提示文本
if (ruleName === 'required') {
errMsg = $this.data('errortips') || errMsg;
}
isValid = false;
break;
}
}
}
if (!isValid) {
layer.error(errMsg);
$this.removeClass(settings.successClass).addClass(settings.errorClass).focus();
if (settings.errorMessageContainer) {
$(settings.errorMessageContainer).text(errors.join('<br/>'));
}
} else {
$this.removeClass(settings.errorClass).addClass(settings.successClass);
}
});
//校验radio是否选中
formBox.find('[data-verify="radio"]').each(function () {
if (isValid == false) {
return false;
}
var $this = $(this),errMsg = '至少要有一个单选按钮被选中';
if ($this.find('[type="radio"]').is(':checked')) {
console.log(errMsg);
} else {
errMsg = $this.data('errortips') || errMsg;
isValid = false;
}
if (!isValid) {
layer.error(errMsg);
}
});
formBox.find('[data-verify="checkbox"]').each(function () {
if (isValid == false) {
return false;
}
var $this = $(this),errMsg = '至少要有一个多选按钮被选中';
if ($this.find('[type="checkbox"]').is(':checked')) {
console.log(errMsg);
} else {
errMsg = $this.data('errortips') || errMsg;
isValid = false;
}
if (!isValid) {
layer.error(errMsg);
}
});
if (isValid) {
// 如果所有验证都通过,则提交表单
settings.submit(form.getValue(settings.target));
}
});
};
// 取值
form.getValue = function (itemForm) {
var nameIndex = {} // 数组 name 索引
, field = {}
, fieldElem = $(itemForm).find('input,select,textarea') // 获取所有表单域
$.each(fieldElem, function (_, item) {
var othis = $(this), init_name; // 初始 name
item.name = (item.name || '').replace(/^\s*|\s*&/, '');
if (!item.name) return;
// 用于支持数组 name
if (/^.*\[\]$/.test(item.name)) {
var key = item.name.match(/^(.*)\[\]$/g)[0];
nameIndex[key] = nameIndex[key] | 0;
init_name = item.name.replace(/^(.*)\[\]$/, '$1[' + (nameIndex[key]++) + ']');
}
// 复选框和单选框未选中,不记录字段
if (/^(checkbox|radio)$/.test(item.type) && !item.checked) return;
field[init_name || item.name] = item.value;
});
return field;
};
// 输出接口
exports('form', form);
});
+331
View File
@@ -0,0 +1,331 @@
mbui.define([], function (exports) {
var doc = document, query = 'querySelectorAll', claname = 'getElementsByClassName', S = function (s) {
return doc[query](s);
};
var template = {
warning: function (text) {
//警告提示
return `<div class="mbui-toptips mbui-toptips-warning fixed" id="${classs}${index}">
<i class="mbui-toptips-warning-icon"></i><span>${text}</span>
</div>`;
},
error: function (text) {
//失败提示
return `<div class="mbui-toptips mbui-toptips-error fixed" id="${classs}${index}">
<i class="mbui-toptips-error-icon"></i><span>${text}</span>
</div>`;
},
toast: function (text) {
//轻提示
return `<div class="mbui-toast" id="${classs}${index}">
<div class="mbui-toast-backdrop"></div>
<div class="mbui-toast-dialog">
<div class="mbui-toast-content">
<span>${text}</span>
</div>
</div>
</div>`;
},
loading: function (text) {
//轻提示
return `<div class="mbui-toast mbui-toast-loading" id="${classs}${index}">
<div class="mbui-toast-backdrop"></div>
<div class="mbui-toast-dialog">
<div class="mbui-toast-content">
<span>
<div class="mbui-toast-loading_icon">
<div class="loading-icon-leaf loading-icon-leaf_0"></div>
<div class="loading-icon-leaf loading-icon-leaf_1"></div>
<div class="loading-icon-leaf loading-icon-leaf_2"></div>
<div class="loading-icon-leaf loading-icon-leaf_3"></div>
<div class="loading-icon-leaf loading-icon-leaf_4"></div>
<div class="loading-icon-leaf loading-icon-leaf_5"></div>
<div class="loading-icon-leaf loading-icon-leaf_6"></div>
<div class="loading-icon-leaf loading-icon-leaf_7"></div>
<div class="loading-icon-leaf loading-icon-leaf_8"></div>
<div class="loading-icon-leaf loading-icon-leaf_9"></div>
<div class="loading-icon-leaf loading-icon-leaf_10"></div>
<div class="loading-icon-leaf loading-icon-leaf_11"></div>
</div>
${text}
</span>
</div>
</div>
</div>`;
},
success: function (text) {
//轻提示
return `<div class="mbui-toast mbui-toast-success" id="${classs}${index}">
<div class="mbui-toast-backdrop"></div>
<div class="mbui-toast-dialog">
<div class="mbui-toast-content">
<span><i class="mbui-toast-success-icon"></i>${text}</span>
</div>
</div>
</div>`;
}
}
//默认配置
var config = {
type: 1,
shade: true,
shadeClose: false,
fixed: true
};
var ready = {
extend: function (obj) {
var newobj = JSON.parse(JSON.stringify(config));
for (var i in obj) {
newobj[i] = obj[i];
}
return newobj;
},
timer: {}, end: {}
};
//点触事件
ready.touch = function (elem, fn) {
elem.addEventListener('click', function (e) {
fn.call(this, e);
}, false);
};
var index = 0, classs = ['mbui-layer'], Layer = function (options) {
var that = this;
that.config = ready.extend(options);
that.view();
};
Layer.prototype.view = function () {
var that = this, config = that.config, layerbox = doc.createElement('div');
that.id = layerbox.id = classs[0] + index;
layerbox.setAttribute('class', classs[0] + ' ' + classs[0] + (config.type || 0));
layerbox.setAttribute('index', index);
//标题区域
var title = (function () {
var titype = typeof config.title === 'object';
return config.title
? '<div class="modal-header" style="' + (titype ? config.title[1] : '') + '">' + (titype ? config.title[0] : config.title) + '</div>' : '';
}());
//按钮区域
var button = (function () {
typeof config.btn === 'string' && (config.btn = [config.btn]);
var btns = (config.btn || []).length, btndom;
if (btns === 0 || !config.btn) {
return '';
}
btndom = '<button type="button" types="1" class="btn btn-block active">' + config.btn[0] + '</button>'
if (btns === 2) {
btndom = '<a href="javascript:void(0);" types="0" class="btn">' + config.btn[1] + '</a><button type="button" types="1" class="btn active">' + config.btn[0] + '</button>';
}
return '<div class="modal-footer clearfix">' + btndom + '</div>';
}());
if (!config.fixed) {
config.top = config.hasOwnProperty('top') ? config.top : 100;
config.style = config.style || '';
config.style += ' top:' + (doc.body.scrollTop + config.top) + 'px';
}
if (config.type === 0) {
config.shade = false;
let content = template[config.template];
layerbox.innerHTML = content(config.content);
}
if (config.type === 2) {
config.content = '<div class="form-hairlines"><input type="text" id="prompt' + index + '" class="mbui-input" placeholder="请输入内容"></div>';
}
if (config.type === 3) {
config.className = 'modal-view top';
config.content = '<div style="padding:0 16px 16px;"><textarea rows="5" id="textarea' + index + '" class="mbui-textarea" placeholder="请输入内容"></textarea></div>';
}
if (config.type === 4) {
config.className = 'modal-actionsheet bottom';
}
if (config.type === 5) {
config.className = 'modal-view top';
}
if (config.type > 0) {
layerbox.innerHTML = (config.shade ? '<div ' + (typeof config.shade === 'string' ? 'style="' + config.shade + '"' : '') + ' class="mbui-layershade"></div>' : '')
+ '<div class="mbui-layermain" ' + (!config.fixed ? 'style="position:static;"' : '') + '>'
+ '<div class="modal-dialog">'
+ '<div class="modal-content ' + (config.className ? config.className : '') + '" ' + (config.style ? 'style="' + config.style + '"' : '') + '>'
+ title
+ '<div class="modal-body">' + config.content + '</div>'
+ button
+ '</div>'
+ '</div>'
+ '</div>';
}
document.body.appendChild(layerbox);
var elem = that.elem = S('#' + that.id)[0];
config.success && config.success(elem,index);
that.index = index++;
that.action(config, elem);
};
Layer.prototype.action = function (config, elem) {
var that = this;
//自动关闭
if (config.time && config.time > 0) {
ready.timer[that.index] = setTimeout(function () {
layer.close(that.index);
}, config.time * 1000);
}
//确认取消
var btn = function () {
var type = this.getAttribute('types');
if (type == 0) {
config.no && config.no();
layer.close(that.index);
} else {
config.yes ? config.yes(that.index) : layer.close(that.index);
}
};
if (config.btn) {
var btns = elem[claname]('modal-footer')[0].children, btnlen = btns.length;
for (var ii = 0; ii < btnlen; ii++) {
ready.touch(btns[ii], btn);
}
}
//点遮罩关闭
if (config.shade && config.shadeClose) {
var shade = elem[claname]('mbui-layershade')[0];
ready.touch(shade, function () {
layer.close(that.index, config.end);
});
}
config.end && (ready.end[that.index] = config.end);
};
var layer = {
v: '1.0',
index: index,
//核心方法
open: function (options) {
var o = new Layer(options || {});
return o.index;
},
alert: function (txt) {
layer.open({
type: 1,
title: '提示',
content: txt,
btn: ['确定']
});
},
confirm: function (txt, fun) {
layer.open({
type: 1,
title: '温馨提示',
content: txt,
btn: ['确定', '取消'],
yes: function (index) {
fun ? fun(index) : layer.close(index);
}
});
},
prompt: function (title,fun,txt) {
layer.open({
type: 2,
title: title,
content: txt,
btn: ['确定', '取消'],
yes: function (index) {
let val = $('#prompt' + index).val();
fun ? fun(val,index) : layer.close(index);
}
});
},
textarea: function (title,fun,txt) {
layer.open({
type: 3,
title: title,
content: txt,
btn: ['确定', '取消'],
yes: function (index) {
let val = $('#textarea' + index).val();
fun ? fun(val,index) : layer.close(index);
}
});
},
msg: function (txt = '', time = 3, template = 'toast') {
let msg = layer.open({
type: 0,
content: txt,
template: template,
time: time
});
return msg;
},
success: function (txt) {
layer.msg(txt, 3, 'success');
},
warning: function (txt) {
layer.msg(txt, 3, 'warning');
},
error: function (txt) {
layer.msg(txt, 3, 'error');
},
loading: function (txt) {
let loading = layer.msg(txt, 3, 'loading');
return loading;
},
photo: function (url) {
var $image = $('<div class="layer-image-photo"><img src="' + url + '"></div>');
$('body').append($image);
$image.fadeIn();
$image.click(function () {
$(this).fadeOut(function () {
$(this).remove();
});
});
},
close: function (index) {
var ibox = S('#' + classs[0] + index)[0];
if (!ibox) return;
ibox.innerHTML = '';
doc.body.removeChild(ibox);
clearTimeout(ready.timer[index]);
delete ready.timer[index];
typeof ready.end[index] === 'function' && ready.end[index]();
delete ready.end[index];
},
//关闭所有layer层
closeAll: function () {
var boxs = doc[claname](classs[0]);
for (var i = 0, len = boxs.length; i < len; i++) {
layer.close((boxs[0].getAttribute('index') | 0));
}
},
copy:function(content) {
var save = function(e){
e.clipboardData.setData('text/plain', content);
e.preventDefault();
}
document.addEventListener('copy', save);
document.execCommand('copy');
document.removeEventListener('copy',save);
if (content != '') {
layer.msg('复制成功');
}
}
};
// 输出接口
exports('layer', layer);
});
@@ -0,0 +1,161 @@
mbui.define(['tool'], function (exports) {
let tool = mbui.tool;
//html转义,防止XSS
function escapeHtml(text) {
var map = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#039;'
};
return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}
var LoadData = function () {
this.config = {
elem: "#listBox",
seachBar: "#listSearch",
url: "",
where: {},
limit: 10,
scroll: 1,
template: function (data) {
return JSON.parse(data);
}
};
this.loaded = 0;
this.page = 1;
this.count = 0;
this.total = 0;
};
// 初始化
LoadData.prototype.init = function (options) {
var that = this;
$.extend(true, that.config, options);
var elem = $(that.config.elem);
elem.html('<div class="load-data-container"></div><div class="load-data-none"><i class="iconfont icon-none"></i><br>暂无数据</div><div class="load-data-loading"><span>努力加载中</span></div><div class="load-data-end"><span>—————— 底 ● 线 ——————</span></div>');
if(that.config.scroll==2){
//容器监听滚动事件
$('#root').scroll(function(){
if ($(this).scrollTop() + $('#root').height() >= $('#app').height()-10) {
// 滚动到页面底部时加载更多数据
if (that.total < that.count && that.loaded == 0){
that.ajax();
}
}
});
}
else{
// 页面监听滚动事件
$(window).scroll(function () {
if ($(window).scrollTop() + $(window).height() >= $(document).height()-10) {
// 滚动到页面底部时加载更多数据
if (that.total < that.count && that.loaded == 0){
that.ajax();
}
}
});
}
//回车搜索
$(that.config.seachBar).on('keyup','[type="search"]',function(event){
if (event.keyCode === 13) {
$(this).blur();
that.page=1;
that.ajax();
}
})
//清空时
$(that.config.seachBar).on('input','[type="search"]', function() {
var val = $(this).val();
// 如果值为空,说明可能点击了 X 或者手动删除了
if (val === '') {
$(this).blur();
that.page=1;
that.ajax();
}
});
//点击搜索重置按钮
$(that.config.seachBar).on('click','.search-reset',function(){
$(that.config.seachBar).find('input').val('');
that.page=1;
that.ajax();
})
that.ajax();
};
LoadData.prototype.reload = function () {
var that = this;
that.page=1;
that.ajax();
};
LoadData.prototype.ajax = function () {
var that = this;
var elem = $(that.config.elem),seachBar = $(that.config.seachBar),map = {page:that.page,limit:that.config.limit};
var keys = seachBar.find('.search-key');
keys.each(function(){
let key=$(this).attr('name');
let val=$(this).val();
if(val!=''){
map[key]=val;
}
});
var maps = $.extend({}, that.config.where, map);
// 发送请求获取数据
$.ajax({
url: that.config.url,
type: 'GET',
data: maps,
beforeSend: function () {
// 显示加载按钮
that.loaded = 1;
elem.find('.load-data-loading').show();
elem.find('.load-data-end').hide();
},
success: function (res) {
if(res.count === 'undefined'){
that.count=res.data.length;
that.total=res.data.length;
}
else{
that.count=res.count;
that.total+=res.data.length;
}
if(that.page==1){
elem.find('.load-data-container').html('');
}
if(that.count>=that.total && that.count>0){
elem.find('.load-data-end').show();
}
elem.find('.load-data-none').addClass('load-data-'+that.count);
if (res.data.length > 0) {
that.page++;
$.each(res.data, function (index, item) {
// 转义JSON对象中的字符串值,防止XSS
for (var key in item) {
if (typeof item[key] === 'string') {
item[key] = escapeHtml(item[key]);
}
}
// 创建列表项并添加到列表中
var listItem = that.config.template(item);
elem.find('.load-data-container').append(listItem);
});
}
},
complete: function () {
that.loaded = 0;
elem.find('.load-data-loading').hide();
}
});
}
// 导出loadData模块
exports('loadData', function (options) {
var loadData = new LoadData();
loadData.init(options);
return loadData;
});
});
+655
View File
@@ -0,0 +1,655 @@
mbui.define(['form','layer','userPicker','fileupload'], function (exports) {
const layer = mbui.layer;
const form = mbui.form;
const tool = mbui.tool;
const fileupload = mbui.fileupload;
const opts={
"checkBox":"checkBox",//审核容器id
"check_name": "",//审核类型标识
"check_btn":1,//是否显示提交审核按钮
"checking_btn":'',//待审核状态下添加的按钮
"checked_btn":'',//审核通过后添加的按钮
"check_ok":function(){
//审核通过的执行函数
},
"check_no":function(){
//审核拒绝的执行函数
},
"check_back":function(){
//撤回的执行函数
},
"check_reversed":function(){
//反确认的执行函数
}
};
const obj = {
loading:false,
checkStatus: function (status) {
statusArray = ['待提交审批','审批中','审批通过','审批不通过','已撤回'];
return '<span class="check-status-color-'+status+'">'+statusArray[status]+'</span>';
},
statusTemplate: function (status) {
let me = this;
let tem =`
<div class="mbui-list">
<div class="mbui-list-bd">审批状态</div>
<div class="mbui-list-ft">
${me.checkStatus(status)}
</div>
</div>
`;
return tem;
},
uidsTemplate: function () {
let tem =`
<div class="mbui-form-line">
<label class="mbui-form-label">审 批 人</label>
<input type="text" name="check_uames" value="" placeholder="请选择审批人" data-verify="required" data-errortips="请选择审批人" class="mbui-form-input" readonly><input type="text" name="check_uids" value="" readonly style="display:none;">
</div>
`;
return tem;
},
flowTemplate: function (data) {
let flowtype='<option value="" title="">--请选择--</option>';
if(data && data.length>0){
for(let i=0;i<data.length;i++){
flowtype+='<option value="'+data[i].id+'" title="'+data[i].check_type+'">'+data[i].title+'</option>';
}
}
let tem =`
<div class="mbui-form-line">
<label class="mbui-form-label">审批流程</label>
<div class="mbui-form-select">
<select name="flow_id" data-verify="required" data-errortips="请选择审批流程">
${flowtype}
</select>
</div>
</div>
`;
return tem;
},
copyTemplate: function (detail) {
let me = this;
let tem =`
<div class="mbui-form-line" style="${detail.is_copy==0?'display:none':''}">
<label class="mbui-form-label">抄 送 人</label>
<input class="mbui-form-input" name="check_copy_unames" value="" readonly placeholder="请选择" placeholder="请选择审批通过后的抄送人" data-type="2">
<input type="text" name="check_copy_uids" value="" readonly style="display:none;">
</div>
`;
return tem;
},
btnTemplate: function () {
let me = this;
let tem =`
<div class="padding-16 center">
<button class="mbui-btn mbui-btn-normal" data-event="submit">提交审批</button>
<button type="reset" class="mbui-btn mbui-btn-primary">重置</button>
${me.sets.checking_btn}
</div>
`;
if(me.sets.check_btn == 1){
return tem;
}else{
return '';
}
},
recordTemplate: function (record) {
let me = this;
let tem ='';
if(record.length>0){
tem+='<div class="padding-12 border-top">';
tem+='<div class="padding-12-b"><span class="f16 mbui-text-gray">审批记录</span></div>';
tem+='<div class="mbui-steps">';
for(let l=0;l<record.length;l++){
let check_content='';
if(record[l].content!=''){
check_content='审批意见:<span class="text-green">'+record[l].content+'</span>。';
}
tem+='<div class="mbui-steps-item delete-'+record[l].delete_time+'">'+record[l].check_time_str+'<small><span class="text-black">'+record[l].name+'</span><span class="check-status-color-'+(record[l].check_status+1)+'">『'+record[l].status_str+'』</span>了此申请。'+check_content+'</small>';
let file_array= record[l].file_array;
if(file_array.length>0){
tem+='<div style="padding:4px 0; color:#666666">审批附件</div><div class="bg-white"><div class="mbui-file-list" style="padding-bottom:0;">';
for(let f=0;f<file_array.length;f++){
tem+=tool.file_item(file_array[f],1);
}
tem+='</div></div>';
}
tem+='</div>';
}
tem+='</div>';
tem+='</div>';
}
return tem;
},
createTemplate: function (flow) {
let me = this;
let checkHtml = `
<form class="mbui-form" id="formCheckBox">
<div class="mbui-group-title">审批操作</div>
<div class="bg-white">
${me.flowTemplate(flow)}
<div id="checkTR">${me.uidsTemplate()}</div>
${me.copyTemplate(flow[0])}
</div>
</form>
`;
return checkHtml;
},
//审批待提交模版
initTemplate: function (detail) {
let me = this;
let checkHtml = `
<form class="mbui-form" id="formCheckBox">
<div class="mbui-group-title">审批操作</div>
<div class="bg-white">
${me.statusTemplate(detail.check_status)}
${me.recordTemplate(detail.check_record)}
${me.flowTemplate(detail.flow)}
<div id="checkTR">${me.uidsTemplate()}</div>
${me.copyTemplate(detail)}
</div>
${me.btnTemplate()}
</form>
`;
let viewHtml = `
<form class="mbui-form" id="formCheckBox">
<div class="mbui-group-title">审批操作</div>
<div class="bg-white">
${me.statusTemplate(detail.check_status)}
${me.recordTemplate(detail.check_record)}
</div>
</form>
`;
if(detail.is_creater==1){
return checkHtml;
}
else{
return viewHtml;
}
},
//审批中模版
checkTemplate: function (detail) {
let me = this,flowHtml='',list = detail.nodes;
for(var f=0;f<list.length;f++){
//审批流程
let checkUser = '',
iconRight ='<span class="iconfont icon-arrow"></span>',
iconStatus ='<i class="mbui-icon mbui-icon-time"></i>',
strStatus ='<div class="check-item-status">待审批</div>',
check_types= '',
sortClass ='';
if(f == list.length-1){
iconRight ='';
}
if(detail.check_step_sort == list[f].sort){
sortClass ='flow-this';
iconStatus ='<i class="mbui-icon mbui-icon-time"></i>';
strStatus ='<div class="check-item-status">当前审批</div>';
if(list[f].check_uids_info.length>1){
check_types= ' <span class="mbui-badge mbui-bg-blue">会签</span>';
if(list[f].check_types==2){
check_types= ' <span class="mbui-badge mbui-bg-orange">或签</span>';
}
}
}
if(list[f].check_role == 0 || list[f].check_role == 5){
checkUser=list[f].check_uids_info[0].name;
}
if(list[f].check_role == 1 || list[f].check_role == 2 || list[f].check_role == 3 || list[f].check_role == 4){
checkUser=list[f].flow_name;
}
if(list[f].check_list.length>0){
let one=0,two=0,three=0;
for(var m=0;m<list[f].check_uids_info.length;m++){
if(list[f].check_uids_info[m].check_status == 2){
three++
}
if(list[f].check_uids_info[m].check_status == 1){
two++
}
if(list[f].check_uids_info[m].check_status == 0){
one++
}
}
//会签
if(list[f].check_types==1){
if(three > 0){
iconStatus ='<i class="iconfont mbui-icon-close" data-no=""></i>';
strStatus ='<div class="check-item-status">拒绝</div>';
}
else{
if(one > 0){
iconStatus ='<i class="iconfont icon-clock"></i>';
strStatus ='<div class="check-item-status">待审批</div>';
}
else{
iconStatus ='<i class="iconfont icon-kongjian" data-ok=""></i>';
strStatus ='<div class="check-item-status">通过</div>';
}
}
}
//或签
if(list[f].check_types==2){
if(two > 0){
iconStatus ='<i class="iconfont icon-kongjian" data-ok=""></i>';
strStatus ='<div class="check-item-status">通过</div>';
}
else{
iconStatus ='<i class="iconfont mbui-icon-close" data-no=""></i>';
strStatus ='<div class="check-item-status">拒绝</div>';
}
}
}
flowHtml+= '<div class="flow-flexbox check-item flow-flex-row '+sortClass+'" id="flow'+f+'">'+iconStatus+'<div class="check-item-name">'+check_types+checkUser+'</div>'+strStatus+iconRight+'</div>';
}
let checkCopy=`<div class="mbui-list" style="${detail.is_copy==0?'display:none':''}">
<div class="mbui-list-bd">抄 送 人</div>
<div class="mbui-list-ft">
${detail.copy_unames}
</div>
</div>
`;
let checkNode = `
<div class="mbui-form-line">
<label class="mbui-form-label">审批节点</label>
<div class="mbui-form-radio">
<input class="mbui-input-radio" type="radio" name="check_node" id="check_node1" value="1" /><label for="check_node1">审批结束</label>
<input class="mbui-input-radio" type="radio" name="check_node" id="check_node2" value="2" /><label for="check_node2">下一审批人</label>
</div>
</div>
<div class="mbui-form-line next-admin" style="display:none;">
<label class="mbui-form-label">下一审批人</label>
<input class="mbui-form-input picker-admin" type="text" name="check_uname" value="" placeholder="请选择" readonly>
<input type="hidden" name="check_uids" value="">
</div>
`;
let checkContent = `
<div class="mbui-form-line">
<label class="mbui-form-label">审批意见</label>
<textarea rows="3" name="content" class="mbui-form-input" placeholder="请输入审批意见" data-verify="required" data-errortips="请完善审批意见"></textarea>
</div>
<div class="mbui-form-line" ${detail.is_file==0?'style="display:none;"':''}>
<label class="mbui-form-label">审批附件</label>
<div class="mbui-form-uploader">
<div class="mbui-uploader-btn-border" id="uploadBtnCheck"><i class="iconfont icon-shangchuan"></i></div>
</div>
<div id="uploadBoxCheck" class="mbui-file-list" style="padding:0 12px 2px;">
<input data-type="file" name="check_files" type="hidden" value="">
</div>
</div>
`;
let btnCheck='<span class="mbui-btn mbui-btn-normal btn-check" data-status="1"><i class="mbui-icon mbui-icon-ok"></i> 通过</span><span class="mbui-btn mbui-btn-danger btn-check" data-status="2"><i class="mbui-icon mbui-icon-close"></i> 拒绝</span>';
if(detail.step.check_role==5){
btnCheck='<span class="mbui-btn mbui-btn-normal btn-check" data-status="1"><i class="mbui-icon mbui-icon-ok"></i> 通过</span><span class="mbui-btn mbui-btn-danger btn-check" data-status="2"><i class="mbui-icon mbui-icon-close"></i> 退回</span>';
}
let btnBack='<span class="mbui-btn mbui-btn-primary btn-check" data-status="3"><i class="mbui-icon mbui-icon-reduce-circle"></i> 撤回</span>';
let btnCheckBack='<span class="mbui-btn mbui-btn-danger btn-check" data-event="check" data-status="4">反确认审核</span>';
let checkHtml = `
<form class="mbui-form" id="formCheckBox">
<div class="mbui-group-title">审批操作</div>
<div class="mbui-list">
<div class="mbui-list-bd">审批状态</div>
<div class="mbui-list-ft">
${me.checkStatus(detail.check_status)}
</div>
</div>
<div class="mbui-list">
<div class="mbui-list-bd">当前审批人</div>
<div class="mbui-list-ft">
${detail.check_unames}
</div>
</div>
${checkCopy}
<div class="bg-white">
<div class="padding-12 border-top">
<span class="f16 mbui-text-gray">审批流</span>
</div>
<div class="bg-gray radius-4" style="padding:4px 8px; margin:0 12px 12px;">
<div class="flow-flexbox check-items flow-flex-row" id="flowList">
<div class="flow-flexbox check-item flow-flex-row">
<i class="iconfont icon-fangkuai2" data-ok=""></i>
<div class="check-item-name">${detail.admin_name}</div>
<div class="check-item-status">创建</div>
<span class="iconfont icon-arrow"></span>
</div>
${flowHtml}
</div>
</div>
${me.recordTemplate(detail.check_record)}
${detail.is_checker==1 && detail.step.check_role==0?checkNode:''}
${detail.is_checker==1?checkContent:''}
</div>
<div class="padding-16 center">
<input type="hidden" name="check_role" value="${detail.step.check_role}">
${detail.is_checker==1?btnCheck:''}
${detail.is_creater==1 && detail.is_back==1 && (detail.check_status==1 || detail.check_status==3)?btnBack:''}
${detail.is_reversed == 1 && typeof me.sets.check_reversed ==='function' && detail.check_status==2?btnCheckBack:''}
${detail.check_status==2?me.sets.checked_btn:''}
</div>
</form>
`;
return checkHtml;
},
//审批撤回模版
backTemplate: function (detail) {
let me = this;
let btnHtml ='';
if(me.sets.check_btn == 1){
btnHtml ='<div class="padding-16 center"><button class="mbui-btn mbui-btn-normal" data-event="submit">提交审批</button><button type="reset" class="mbui-btn mbui-btn-primary">重置</button></div>';
}
let checkHtml = `
<form class="mbui-form" id="formCheckBox">
<div class="mbui-group-title">审批操作</div>
<div class="bg-white">
${me.statusTemplate(detail.check_status)}
${me.recordTemplate(detail.check_record)}
${me.flowTemplate(detail.flow)}
<div id="checkTR">${me.uidsTemplate()}</div>
${me.copyTemplate(detail)}
</div>
${me.btnTemplate()}
</form>
`;
let viewHtml = `
<form class="mbui-form" id="formCheckBox">
<div class="mbui-group-title">审批操作</div>
<div class="bg-white">
${me.statusTemplate(detail.check_status)}
${me.recordTemplate(detail.check_record)}
</div>
</form>
`;
if(detail.is_creater==1){
return checkHtml;
}
else{
return viewHtml;
}
},
submit:function(data,callback){
tool.post("/api/check/submit_check", data, callback);
},
init: function (options) {
this.sets = $.extend({}, opts, options);
let me = this;
let checkBox = $('#'+me.sets.checkBox);
let action_id = checkBox.data('id');
let check_status = checkBox.data('status');
let check_flow_id = checkBox.data('checkflowid');
if(action_id === undefined || check_status === undefined || check_flow_id === undefined){
return false;
}
//获取审批信息
$.ajax({
url: "/api/check/get_flow_nodes",
type:'get',
data:{check_name:me.sets.check_name,action_id:action_id,flow_id:check_flow_id},
success: function (e) {
if (e.code == 0) {
if(check_status==0){
if(action_id==0){
if(e.data.length>0){
checkBox.append(me.createTemplate(e.data));
}
else{
let none = '<div class="mbui-group-title">审批操作</div><div class="mbui-form-line">\
<label class="mbui-form-label">审批流程</label>\
<input type="text" name="flow_id" value="" placeholder="未设置审批流程,请联系管理员设置" data-verify="required" data-errortips="未设置审批流程,请联系管理员设置" class="mbui-form-input" readonly>\
</div>';
checkBox.append(none);
}
}
else{
checkBox.append(me.initTemplate(e.data));
}
}
else if(check_status==4){
checkBox.append(me.backTemplate(e.data));
}
else{
checkBox.append(me.checkTemplate(e.data));
//附件上传
fileupload({
uploadBtn: "uploadBtnCheck",
uploadBox: "uploadBoxCheck"
});
}
//提交审批
form({
target: '#formCheckBox',
submit:function(data){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.reload(2000);
}
}
data.action_id = action_id;
data.check_name = me.sets.check_name;
tool.post("/api/check/submit_check", data, callback);
return false;
}
});
}
}
})
$('body').on('change','input[name="check_node"]',function() {
var val = this.value;
if(val==2){
$('.next-admin').show();
}
else{
$('.next-admin').hide();
}
});
//选择审批流
$('body').on('change','select[name="flow_id"]', function(data){
var check_type = $('select[name="flow_id"] option:selected').attr('title');
var selectedValue = $(this).val();
if(selectedValue==''){
$('#checkTR').html(me.uidsTemplate());
checkBox.find('[name="check_copy_unames"]').val('');
checkBox.find('[name="check_copy_uids"]').val('');
return false;
}
if(check_type == 1){
$('#checkTR').html(me.uidsTemplate());
checkBox.find('[name="check_uames"]').addClass('picker-admin');
checkBox.find('[name="check_copy_unames"]').addClass('picker-admin');
}
$.ajax({
url: "/api/check/get_flow_users",
type:'get',
data:{id:selectedValue},
success: function (e) {
if (e.code == 0) {
var flow_li='',flow_idx=0;
var flow_data = e.data.flow_data;
checkBox.find('[name="check_copy_unames"]').addClass('picker-admin');
if(e.data.copy_uids && e.data.copy_uids !=''){
checkBox.find('[name="check_copy_unames"]').val(e.data.copy_unames);
checkBox.find('[name="check_copy_uids"]').val(e.data.copy_uids.split(','));
}
if(check_type == 2 || check_type == 3){
for(var a=0;a<flow_data.length;a++){
var check_types = '',check_role = '',user_li='';
if(flow_data[a].check_types==1){
check_types= ' <span class="mbui-badge mbui-bg-blue">会签</span>';
}
if(flow_data[a].check_types==2){
check_types= ' <span class="mbui-badge mbui-bg-orange">或签</span>';
}
if(flow_data[a].check_role==1){
check_role = '当前部门负责人';
}
if(flow_data[a].check_role==2){
check_role = '上级部门负责人';
}
if(flow_data[a].check_role==3){
check_role = '岗位职称:'+flow_data[a].check_position;
}
if(flow_data[a].check_role==4){
check_role = '指定人员';
}
if(flow_data[a].check_role==5){
check_role = flow_data[a].flow_name;
check_types= ' <span class="mbui-badge mbui-bg-text-green">可回退</span>';
}
let check_uids_info=flow_data[a].check_uids_info;
if(check_uids_info.length>0){
flow_idx++;
for(var b=0;b<check_uids_info.length;b++){
user_li+= '<li style="padding:3px 0;line-height:22px"><img src="'+check_uids_info[b].thumb+'" style="width:22px; height:22px; border-radius:50%; vertical-align: bottom; margin-right:8px;" />'+check_uids_info[b].name+'</li>';
}
flow_li+='<div class="mbui-steps-item">第'+flow_idx+'级审批『'+check_role+'』'+check_types+'<small>'+user_li+'</small></div>';
}
}
if(flow_li==''){
flow_li='<span style="color:#999;">审批流程错误,请联系管理员设置</span>';
}
formHtml = '<div class="mbui-form-line">\
<label class="mbui-form-label">审批流</label>\
<ul id="flowList" class="mbui-form-input mbui-steps">'+flow_li+'</ul>\
</div>';
$('#checkTR').html(formHtml);
}
}
}
})
});
//审批操作按钮
checkBox.on('click','.btn-check', function(data){
let content=checkBox.find('[name="content"]').val();
let check_status=$(this).data('status');
let check_role = checkBox.find('input[name="check_role"]').val();
let check_node=0,check_uids='',check_files='';
if(check_role == 0 && check_status==1){
check_node = checkBox.find('input[name="check_node"]:checked').val();
check_uids = checkBox.find('input[name="check_uids"]').val();
if(!check_node){
layer.msg('请选择下一审批节点');
return false;
}
if(check_node == 2 && check_uids==''){
layer.msg('请选择下一审批人');
return false;
}
}
if(check_status ==1 || check_status==2){
check_files = checkBox.find('input[name="check_files"]').val();
let confirmTips='确定通过该审批?';
if(check_status==2){
confirmTips='确定拒绝该审批?';
if(content==''){
layer.msg('请输入审批意见');
return false;
}
}
layer.confirm(confirmTips, function(index){
$.ajax({
url: "/api/check/flow_check",
type:'post',
data:{
action_id:action_id,
check_name:me.sets.check_name,
check_flow_id:check_flow_id,
check_node:check_node,
check_uids:check_uids,
check:check_status,
check_files:check_files,
content:content
},
success: function (e) {
layer.msg(e.msg);
if (e.code == 0) {
if(e.data.check_status==2 && typeof me.sets.check_ok ==='function'){
me.sets.check_ok(e);
}
if(e.data.check_status==3 && typeof me.sets.check_no ==='function'){
me.sets.check_no(e);
}
tool.reload(1000);
}
}
})
layer.close(index);
});
}
else if(check_status ==3){
layer.prompt('请输入撤回理由', function(val, index){
if(val==''){
layer.msg('请输入撤回理由');
return false;
}
$.ajax({
url: "/api/check/flow_check",
type:'post',
data:{
action_id:action_id,
check_name:me.sets.check_name,
check_flow_id:check_flow_id,
check:check_status,
content:val
},
success: function (e) {
layer.msg(e.msg);
if (e.code == 0) {
if(e.data.check_status==4 && typeof me.sets.check_back ==='function'){
me.sets.check_back(e);
}
tool.reload(1000);
}
}
})
layer.close(index);
});
}
else if(check_status ==4){
layer.prompt('请输入反确认理由', function(val, index){
if(val==''){
layer.msg('请输入反确认理由');
return false;
}
$.ajax({
url: "/api/check/flow_check",
type:'post',
data:{
action_id:action_id,
check_name:me.sets.check_name,
check_flow_id:check_flow_id,
check:check_status,
content:val
},
success: function (e) {
layer.msg(e.msg);
if (e.code == 0) {
if(e.data.check_status==0 && typeof me.sets.check_reversed ==='function'){
me.sets.check_reversed(e);
}
tool.reload(1000);
}
}
})
layer.close(index);
});
}
return false;
});
}
};
exports('oaCheck', obj);
});
@@ -0,0 +1,121 @@
mbui.define(['tool','layer','userPicker','loadData'], function (exports) {
const layer = mbui.layer, tool = mbui.tool,userPicker = mbui.userPicker,loadData = mbui.loadData;
const obj = {
comment_box:'comment_box',
module:'module',
topic_id:'topic_id',
load: function (comment_box,module,topic_id) {
let that = this;
that.comment_box=comment_box;
that.module=module;
that.topic_id=topic_id;
loadData({
url:'/api/comment/datalist',
elem:'#'+comment_box,
where: {topic_id: topic_id, module: module},
limit:100,
template:function(data){
let to_names = '', ops = '' ,ptext='';
if (data.to_names !='') {
to_names = `<span class="text-blue">@${data.to_names}</span>`;
}
if (data.admin_id == login_admin) {
ops = `<span class="mbui-btn mbui-btn-primary xs" data-event="edit" data-id="${data.id}">编辑</span><span class="mbui-btn mbui-btn-primary xs" data-event="del" data-id="${data.id}">删除</span>`;
}
else{
ops = `<span class="mbui-btn mbui-btn-primary xs" data-event="replay" data-id="${data.id}" data-uid="${data.admin_id}" data-unames="${data.name}">回复</span>`;
}
if(data.pid>0){
ptext=`<div style="padding-bottom:8px;"><fieldset><legend>回复『${data.padmin}${data.ptimes}的评论</legend>${data.pcontent}</fieldset></div>`;
}
let listItem = `
<div id="comment_${data.id}" class="mbui-comment-box border-bottom" data-content="${data.content}">
<div class="comment-avatar" title="${data.name}">
<img class="comment-image" src="${data.thumb}">
</div>
<div class="comment-body">
<div class="comment-meta">
<span class="comment-name">${data.name}</span><span title="${data.create_time}">${data.create_times}${data.update_times}</span>
</div>
<div class="comment-content">${to_names} ${data.content}</div>
${ptext}
<div class="comment-btn mbui-btn-group">${ops}</div>
</div>
</div>
`;
return listItem;
}
});
},
add: function (topic_id, module,content,to_uids,pid) {
let that = this;
let callback = function (res) {
layer.closeAll();
that.load(that.comment_box,that.module,that.topic_id);
}
if (content == '') {
layer.msg('请完善评论内容');
return false;
}
let postData = { module: module,topic_id: topic_id, content: content, to_uids: to_uids, pid: pid};
tool.post("/api/comment/add", postData, callback);
},
edit: function (id,content) {
let that = this;
let callback = function (res) {
layer.closeAll();
that.load(that.comment_box,that.module,that.topic_id);
}
if (content == '') {
layer.msg('请完善评论内容');
return false;
}
let postData = {id: id, content: content};
tool.post("/api/comment/add", postData, callback);
},
del: function (id) {
let that = this;
layer.confirm('确定删除该评论吗?', function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
that.load(that.comment_box,that.module,that.topic_id);
}
}
tool.delete("/api/comment/del", { id: id }, callback);
layer.close(index);
});
},
//文本
textarea: function (id, topic_id, module, content, to_uids, to_unames, pid) {
let that = this;
let usersInput='';
if(id==0){
usersInput='<div class="mbui-input-wrap" style="margin-bottom:5px;"><div class="mbui-input-prefix"><i class="mbui-icon mbui-icon-at"></i></div><input type="text" placeholder="@ 要提醒的员工" value="'+to_unames+'" readonly class="mbui-input picker-admin" data-type="2" /><input type="hidden" id="to_uids" value="'+to_uids+'" /></div>';
}
layer.open({
type:5,
title: '请输入评论内容',
content: '<div style="padding:0 6px 6px;">'+usersInput+'<textarea class="mbui-textarea" id="editTextarea" style="width: 100%; height: 100px;">'+content+'</textarea></div>',
btn:['确定','取消'],
yes:function(index){
let content = $("#editTextarea").val();
if (content != '') {
if(id>0){
that.edit(id, content);
}
else{
let to_uids = $("#to_uids").val();
that.add(topic_id, module, content, to_uids, pid);
}
} else {
layer.msg('请输入评论内容');
}
}
});
}
};
exports('oaComment', obj);
});
+403
View File
@@ -0,0 +1,403 @@
mbui.define(['tool','layer','picker','userPicker'],function(exports){
let layer = mbui.layer,tool=mbui.tool,picker = mbui.picker,adminpicker = mbui.userPicker;
const opts={
"box":'editBox',//编辑容器id
"id":0,//编辑容器id
"url": '',
"radio":{},
"checbox":{},
"menu":{},
"callback":function(e){
layer.msg(e.msg);
if(e.code==0){
setTimeout(function(){
location.reload();
},1000)
}
}
};
const obj = {
//短文本
text: function (that) {
let me = this;
let field = that.data('field');
let text = that.data('text');
text = typeof(text) == "undefined" ? that.text():text;
layer.open({
type: 1,
title: '请输入内容',
area: ['360px', '158px'],
content: '<div><input class="mbui-input" id="oaEditText" value="' + text + '"/></div>',
btnAlign: 'c',
btn: ['保存','取消'],
yes: function () {
let val = $("#oaEditText").val();
if (val != '') {
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = val;
tool.post(me.sets.url,postData,me.sets.callback);
} else {
layer.msg('请输入内容');
}
}
})
},
//长文本
textarea: function (that) {
let me = this;
let field = that.data('field');
let target = that.data('target');
let textarea='';
if (typeof(target) == "undefined") {
textarea = that.text();
}
else{
textarea = $('#'+target).text();
}
layer.open({
type: 1,
title: '请输入内容',
area: ['600px', '320px'],
content: '<div style="padding:5px;"><textarea class="mbui-textarea" id="oaEditTextarea" style="width: 100%; height: 200px;">' + textarea + '</textarea></div>',
btnAlign: 'c',
btn: ['保存','取消'],
yes: function () {
let val = $("#oaEditTextarea").val();
if (val != '') {
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = val;
tool.post(me.sets.url,postData,me.sets.callback);
} else {
layer.msg('请输入内容');
}
}
})
},
//数字
num: function (that) {
let me = this;
let field = that.data('field');
let text = that.data('text');
text = typeof(text) == "undefined" ? that.text():text;
let min = that.data('min');
min = typeof(min) == "undefined" ? 0:min;
let max = that.data('max');
max = typeof(max) == "undefined" ? 100:max;
layer.open({
type: 1,
title: '请输入数字',
area: ['200px', '158px'],
content: '<div style="padding:5px;"><input class="mbui-input" oninput="this.value = this.value.replace(/[^0-9]/g,\'\')" id="oaEditNum" value="' + text + '"/></div>',
btnAlign: 'c',
btn: ['保存','取消'],
yes: function () {
let val = $("#oaEditNum").val();
if (val != '') {
if(min !='' && val<min){
layer.msg('输入数字不能小于'+min);
return false;
}
if(max !='' && val>max){
layer.msg('输入数字不能大于'+max);
return false;
}
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = val;
tool.post(me.sets.url,postData,me.sets.callback);
} else {
layer.msg('请输入内容');
}
}
})
},
oadate: function (that) {
let me = this;
let type = that.data('type');
let min = that.data('min');
let max = that.data('max');
if (typeof(type) == "undefined" || type === '') {
type = 'date';
}
if (typeof(min) == "undefined" || min === '' || min === 1) {
min = '1970-01-01 00:00:00';
}
if (typeof(max) == "undefined" || max === '' || max === 100) {
max = '2099-12-31 23:59:59';
}
let field = that.data('field');
let text = that.data('text');
text = typeof(text) == "undefined" ? that.text():text;
picker.init({
elem: that, // 绑定元素
options: type, // 设置为日期选择器(日期选择器可设置:year、month、date、time、timesecond、datetime、datetimesecond
onSuccess: function(index, elem){ // 渲染成功回调
picker.show(index);
},
onClear: function(index){ // 停止滚动触发:index是当前对象的标识, i 是当前滑动的对象,result是前面的值集
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = 0;
tool.post(me.sets.url,postData,me.sets.callback);
picker.remove(index);
},
onConfirm: function(index, val, result){ // 点击确认回调
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = val;
tool.post(me.sets.url,postData,me.sets.callback);
picker.remove(index);
},
onCancel: function(index){ // 点击取消回调
picker.remove(index);
},
onShade: function(index){ // 点击遮罩回调
picker.remove(index);
},
minDate:min,
maxDate:max
})
},
adminpicker: function (that){
let me = this;
let field = that.data('field');
let ids = that.data('ids');
let names = that.data('names');
let min = that.data('min');
min = typeof(min) == "undefined" ? 1:min;
adminpicker({
type:min,
callback:function(ids,names,dids,departments){
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = ids.join(',');
tool.post(me.sets.url,postData,me.sets.callback);
}
});
},
picker:function(that){
let me = this;
let field = that.data('field');
let api = that.data('api');
if(typeof(api) == "undefined"){
layer.msg('相关API参数未完善');
return false;
}
let min = that.data('min');
min = typeof(min) == "undefined" ? 1:min;
let loading;
$.ajax({
url: api,
type: 'get',
beforeSend:function(){
loading = layer.loading('加载中...');
},
success: function (e) {
if (e.code == 0) {
data = e.data;
if(min==1){
me.radio(that,data);
}
else{
me.checkbox(that,data);
}
}
},
complete:function(){
layer.close(loading);
}
})
},
radio:function(that,data){
let me = this;
let field = that.data('field');
let text = that.data('text');
text = typeof(text) == "undefined" ? that.text():text;
let arrayidx = that.data('array');
if(typeof(arrayidx) != "undefined" && arrayidx!=''){
data = me.sets.radio[arrayidx];
}
if (data.length == 0) {
layer.msg('无可选择的内容');
return false;
}
let len = data.length;
let editHtml = '<div class="mbui-layer-radio">'
while (len--) {
if (data[len].id == text) {
editHtml+='<div class="mbui-radio-checkbox"><label for="list_radio_'+data[len].id+'">'+data[len].title+'<input class="mbui-radio" type="radio" name="layer_radio" checked value="'+data[len].id+'" id="list_radio_'+data[len].id+'" /></label></div>';
}
else{
editHtml+='<div class="mbui-radio-checkbox"><label for="list_radio_'+data[len].id+'">'+data[len].title+'<input class="mbui-radio" type="radio" name="layer_radio" value="'+data[len].id+'" id="list_radio_'+data[len].id+'" /></label></div>';
}
}
editHtml+='</div>';
layer.open({
type:5,
content:editHtml,
btn:['确定','取消'],
yes:function(index){
let val = $('input[name="layer_radio"]:checked').val();
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = val;
tool.post(me.sets.url,postData,me.sets.callback);
}
});
},
checkbox:function(that){
let me = this;
let field = that.data('field');
let text = that.data('text');
text = typeof(text) == "undefined" ? that.text():text;
let selected_array = text+''.split(',');
let arrayidx = that.data('array');
let data = me.sets.checkbox[arrayidx];
if (data.length == 0) {
layer.msg('无可选择的内容');
return false;
}
let len = data.length;
let editHtml = '<div class="mbui-layer-checkbox">'
while (len--) {
if (selected_array.includes(data[len].id)) {
editHtml+='<div class="mbui-radio-checkbox"><label for="list_checkbox_'+data[len].id+'">'+data[len].title+'<input class="mbui-checkbox" type="checkbox" name="layer_checkbox" checked value="'+data[len].id+'" id="list_radio_'+data[len].id+'" /></label></div>';
}
else{
editHtml+='<div class="mbui-radio-checkbox"><label for="list_checkbox_'+data[len].id+'">'+data[len].title+'<input class="mbui-checkbox" type="checkbox" name="layer_checkbox" value="'+data[len].id+'" id="list_checkbox_'+data[len].id+'" /></label></div>';
}
}
editHtml+='</div>';
layer.open({
type:5,
content:editHtml,
btn:['确定','取消'],
yes:function(index){
let checkedValues = $('input[name="layer_checkbox"]:checked').map(function(){
return $(this).val();
}).get();
let postData = {'id':me.sets.id,'scene':'oaedit'};
postData[field] = checkedValues.join(',');
tool.post(me.sets.url,postData,me.sets.callback);
}
});
},
menu: function (that) {
let me = this;
let arrayidx = that.data('array');
let data = me.sets.menu[arrayidx];
if (data.length == 0) {
layer.msg('无可选择的内容');
return false;
}
let len = data.length;
let editHtml = ''
while (len--) {
let item = $('#edit_'+data[len].field);
let types = item.data('types');
let text = item.data('text');
text = typeof(text) == "undefined" ? item.text():text;
let arrays = item.data('array');
arrays = typeof(arrays) == "undefined" ? '':arrays;
let api = item.data('api');
api = typeof(api) == "undefined" ? '':api;
let min = item.data('min');
min = typeof(min) == "undefined" ? 1:min;
let max = item.data('max');
max = typeof(max) == "undefined" ? 100:max;
editHtml+='<a href="javascript:void(0);" class="actionsheet-btn" data-field="'+data[len].field+'" data-types="'+types+'" data-array="'+arrays+'" data-text="'+text+'" data-min="'+min+'" data-max="'+max+'" data-api="'+api+'">'+data[len].title+'</a>';
}
layer.open({
type:4,
content: editHtml,
btn:['取消'],
success:function(elem,index){
$(elem).on('click','.actionsheet-btn',function(){
let thatmenu = $(this);
let types = thatmenu.data('types');
layer.close(index);
switch (types) {
case "num":
me.num(thatmenu);
break;
case "oadate":
me.oadate(thatmenu);
break;
case "textarea":
me.textarea(thatmenu);
break;
case "adminpicker":
me.adminpicker(thatmenu);
break;
case "picker":
me.picker(thatmenu);
break;
case "radio":
me.radio(thatmenu,[]);
break;
case "checkbox":
me.checkbox(thatmenu,[]);
break;
default:
me.text(thatmenu);
}
})
}
});
},
init: function (options) {
this.sets = $.extend({}, opts, options);
let me = this;
let editBox = $('#'+me.sets.box);
editBox.on('click','.click-edit',function(){
let that = $(this);
let types = that.data('types');
let role = that.data('role');
role = typeof(role) == "undefined" ? 1:role;
if(role==0){
layer.msg('你无权限操作');
return false;
}
switch (types) {
case "num":
me.num(that);
break;
case "oadate":
me.oadate(that);
break;
case "textarea":
me.textarea(that);
break;
case "adminpicker":
me.adminpicker(that);
break;
case "picker":
me.picker(that);
break;
case "radio":
me.radio(that,[]);
break;
case "checkbox":
me.checkbox(that,[]);
break;
case "menu":
me.menu(that);
break;
default:
me.text(that);
}
})
}
}
//输出接口
exports('oaEdit', obj);
});
+47
View File
@@ -0,0 +1,47 @@
layui.define(['tool'], function (exports) {
const tool = layui.tool;
const obj = {
load: function (box,name, action_id) {
let page=1;
let callback = function (res) {
if (res.code == 0 && res.data.length > 0) {
let itemLog = '',log_time='';
$.each(res.data, function (index, item) {
let detail = "";
if(log_time != item.create_time){
if(log_time==''){
itemLog+='<dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
}
else{
itemLog+='</dl><dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
}
log_time = item.create_time;
}
detail= `
<span class="log-content gray">将<strong>${item.field_name}</strong>从 <span class="green">${item.old_content}</span> ${item.action}为 <span class="blue">${item.new_content}</span><span class="ml-4 gray" title="${item.create_time}">${item.times}</span></span>
`;
itemLog+= `
<dd><img src="${item.thumb}" class="log-thumb" /><span class="log-name">${item.admin_name}</span>${detail}</dd>
`;
});
itemLog+='</dl>';
if(res.data.length>19){
itemLog+='<div class="py-3 log-more"><button class="layui-btn layui-btn-normal layui-btn-sm" type="button">查看更多</button></div>';
}
$("#"+box).html(itemLog);
}
else{
if(page ==1){
$("#"+box).html('<div class="layui-data-none">暂无记录</div>');
}
}
}
tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback);
$("#"+box).on('click','.log-more',function(){
page++;
tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback);
});
}
};
exports('oaLog', obj);
});
File diff suppressed because it is too large Load Diff
+37
View File
@@ -0,0 +1,37 @@
mbui.define([], function (exports) {
var Tab = function () {
this.config = {
elem: null,
trigger: 'click',
ontab: null
};
};
// 初始化Tab
Tab.prototype.init = function (options) {
var that = this;
$.extend(true, that.config, options);
var elem = $(that.config.elem);
var tabs = elem.find('.mbui-tab-title li');
var contents = elem.find('.mbui-tab-content .mbui-tab-item');
tabs.on(that.config.trigger, function () {
var index = $(this).index();
tabs.removeClass('active');
contents.removeClass('mbui-tab-show');
$(this).addClass('active');
contents.eq(index).addClass('mbui-tab-show');
// 执行回调函数
if (typeof that.config.ontab === 'function') {
that.config.ontab(index, $(this));
}
});
};
// 导出Tab模块
exports('tab', function (options) {
var tab = new Tab();
tab.init(options);
});
});
+874
View File
@@ -0,0 +1,874 @@
/**
* tool 工具组件
*/
mbui.define([], function (exports) {
"use strict";
var tool = {
ajax: function (options, callback) {
let format = 'json';
if (options.hasOwnProperty('data')) {
format = options.data.hasOwnProperty('format') ? options.data.format : 'json';
}
callback = callback || options.success;
callback && delete options.success;
let optsetting = { timeout: 10000 };
if (format == 'jsonp') {
optsetting = { timeout: 10000, dataType: 'jsonp', jsonp: 'callback' }
}
let opts = $.extend({}, optsetting, {
success: function (res) {
if (callback && typeof callback === 'function') {
callback(res);
}
}
}, options);
$.ajax(opts);
},
get: function (url, data, callback) {
this.ajax({ url: url, type: "GET", data: data }, callback);
},
post: function (url, data, callback) {
this.ajax({ url: url, type: "POST", data: data }, callback);
},
put: function (url, data, callback) {
this.ajax({ url: url, type: "PUT", data: data }, callback);
},
delete: function (url, data, callback) {
this.ajax({ url: url, type: "DELETE", data: data }, callback);
},
reload: function (delay) {
//延迟刷新,一般是在编辑完页面数据后需要自动关闭页面用到
if(delay && delay>0){
setTimeout(function () {
location.reload();
}, delay);
}else{
location.reload();
}
},
replace: function (url,delay) {
//延迟刷新,一般是在编辑完页面数据后需要自动关闭页面用到
if(delay && delay>0){
setTimeout(function () {
window.location.replace(url);
}, delay);
}else{
window.location.replace(url);
}
},
//格式化文件大小
renderSize:function(val){
if(null==val||val==''){
return "0 Bytes";
}
var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
var index=0;
var srcsize = parseFloat(val);
index=Math.floor(Math.log(srcsize)/Math.log(1024));
var size =srcsize/Math.pow(1024,index);
size=size.toFixed(2);//保留的小数位数
return size+unitArr[index];
},
// 格式化文件
file_item:function(file,view=''){
let image=['jpg','jpeg','png','gif'];
let fileshow='<div class="mbui-file-icon"><i class="iconfont icon-weizhigeshi"></i></div>';
if(file['fileext'] == 'pdf'){
}
if(image.includes(file['fileext'])){
fileshow='<div class="mbui-file-icon file-img"><img src="'+file['filepath']+'" alt="'+file['name']+'"></div>';
}
let file_del='';
if(view == ''){
file_del = '<div class="mbui-file-del"><i class="iconfont icon-cuowukongxin"></i></div>';
}
let filesize = this.renderSize(file['filesize']);
let filedate = this.formatDate(file['create_time']);
let item = '<div class="mbui-file-div"data-id="'+file['id']+'">\
'+fileshow+'\
<div class="mbui-file-info">\
<div class="mbui-file-name line-limit-1">'+file['name']+'</div>\
<div class="mbui-file-size">'+filesize+''+filedate+'</div>\
</div>\
'+file_del+'\
</div>';
return item;
},
// 倒计时
countdown: function (options) {
var that = this;
// 默认可选项
options = $.extend(true, {
date: new Date(),
now: new Date()
}, options);
// 兼容旧版参数
var args = arguments;
if (args.length > 1) {
options.date = new Date(args[0]);
options.now = new Date(args[1]);
options.clock = args[2];
}
// 实例对象
var inst = {
options: options,
clear: function () { // 清除计时器
clearTimeout(inst.timer);
},
reload: function (opts) { // 重置倒计时
this.clear();
$.extend(true, this.options, {
now: new Date()
}, opts);
count();
}
};
typeof options.ready === 'function' && options.ready();
// 计算倒计时
var count = (function fn() {
var date = new Date(options.date);
var now = new Date(options.now);
var countTime = function (time) {
return time > 0 ? time : 0;
}(date.getTime() - now.getTime());
var result = {
d: Math.floor(countTime / (1000 * 60 * 60 * 24)), // 天
h: Math.floor(countTime / (1000 * 60 * 60)) % 24, // 时
m: Math.floor(countTime / (1000 * 60)) % 60, // 分
s: Math.floor(countTime / 1000) % 60 // 秒
};
var next = function () {
now.setTime(now.getTime() + 1000);
options.now = now;
count();
};
// 计时 - 以秒间隔
inst.timer = setTimeout(next, 1000);
typeof options.clock === 'function' && options.clock(result, inst);
// 计时完成
if (countTime <= 0) {
clearTimeout(inst.timer);
typeof options.done === 'function' && options.done(result, inst);
}
return fn;
})();
return inst;
},
// 某个时间在当前时间的多久前
timeAgo: function (time, onlyDate) {
var that = this;
var arr = [[], []];
var stamp = new Date().getTime() - new Date(time).getTime();
// 返回具体日期
if (stamp > 1000 * 60 * 60 * 24 * 31) {
stamp = new Date(time);
arr[0][0] = that.digit(stamp.getFullYear(), 4);
arr[0][1] = that.digit(stamp.getMonth() + 1);
arr[0][2] = that.digit(stamp.getDate());
// 是否输出时间
if (!onlyDate) {
arr[1][0] = that.digit(stamp.getHours());
arr[1][1] = that.digit(stamp.getMinutes());
arr[1][2] = that.digit(stamp.getSeconds());
}
return arr[0].join('-') + ' ' + arr[1].join(':');
}
// 30 天以内,返回「多久前」
if (stamp >= 1000 * 60 * 60 * 24) {
return ((stamp / 1000 / 60 / 60 / 24) | 0) + ' 天前';
} else if (stamp >= 1000 * 60 * 60) {
return ((stamp / 1000 / 60 / 60) | 0) + ' 小时前';
} else if (stamp >= 1000 * 60 * 3) { // 3 分钟以内为:刚刚
return ((stamp / 1000 / 60) | 0) + ' 分钟前';
} else if (stamp < 0) {
return '未来';
} else {
return '刚刚';
}
},
/**
* 格式化时间戳为指定格式
* @param {number} timestamp - 时间戳(毫秒或秒)
* @param {string} formatStr - 格式字符串,例如 'YYYY-MM-DD HH:mm:ss'
* @returns {string}
*/
formatDate:function(timestamp, formatStr = 'YYYY-MM-DD HH:mm:ss') {
const date = new Date(timestamp);
// 如果是秒级时间戳,转为毫秒
if (timestamp.toString().length === 10) {
date.setTime(timestamp * 1000);
}
const padZero = (num) => String(num).padStart(2, '0');
const replacements = {
YYYY: date.getFullYear(),
MM: padZero(date.getMonth() + 1), // 月份从 0 开始
DD: padZero(date.getDate()),
HH: padZero(date.getHours()),
mm: padZero(date.getMinutes()),
ss: padZero(date.getSeconds())
};
return Object.entries(replacements).reduce((str, [key, value]) => {
return str.replace(key, value);
}, formatStr);
},
//返回10位时间戳
time: function () {
return Math.floor((new Date).getTime() / 1e3);
},
/**
*
* @param n 格式化样式Y-m-d H:i:s返回带0 Y-n-j不带0 z一年中第几天要+1才正确 w星期0是周日 N 7是周日D三个字母星期 l英语星期 W周 F月份英语 L闰年判断 c带时区日期时间 r英文形式
* @param t 时间戳
* @returns 格式化时间
*/
date: function (n, t) {
var e, r, u = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], o = /\\?(.?)/gi, i = function (n, t) { return r[n] ? r[n]() : t }, c = function (n, t) { for (n = String(n); n.length < t;)n = "0" + n; return n }; r = { d: function () { return c(r.j(), 2) }, D: function () { return r.l().slice(0, 3) }, j: function () { return e.getDate() }, l: function () { return u[r.w()] + "day" }, N: function () { return r.w() || 7 }, S: function () { var n = r.j(), t = n % 10; return t <= 3 && 1 === parseInt(n % 100 / 10, 10) && (t = 0), ["st", "nd", "rd"][t - 1] || "th" }, w: function () { return e.getDay() }, z: function () { var n = new Date(r.Y(), r.n() - 1, r.j()), t = new Date(r.Y(), 0, 1); return Math.round((n - t) / 864e5) }, W: function () { var n = new Date(r.Y(), r.n() - 1, r.j() - r.N() + 3), t = new Date(n.getFullYear(), 0, 4); return c(1 + Math.round((n - t) / 864e5 / 7), 2) }, F: function () { return u[6 + r.n()] }, m: function () { return c(r.n(), 2) }, M: function () { return r.F().slice(0, 3) }, n: function () { return e.getMonth() + 1 }, t: function () { return new Date(r.Y(), r.n(), 0).getDate() }, L: function () { var n = r.Y(); return n % 4 == 0 & n % 100 != 0 | n % 400 == 0 }, o: function () { var n = r.n(), t = r.W(); return r.Y() + (12 === n && t < 9 ? 1 : 1 === n && t > 9 ? -1 : 0) }, Y: function () { return e.getFullYear() }, y: function () { return r.Y().toString().slice(-2) }, a: function () { return e.getHours() > 11 ? "pm" : "am" }, A: function () { return r.a().toUpperCase() }, B: function () { var n = 3600 * e.getUTCHours(), t = 60 * e.getUTCMinutes(), r = e.getUTCSeconds(); return c(Math.floor((n + t + r + 3600) / 86.4) % 1e3, 3) }, g: function () { return r.G() % 12 || 12 }, G: function () { return e.getHours() }, h: function () { return c(r.g(), 2) }, H: function () { return c(r.G(), 2) }, i: function () { return c(e.getMinutes(), 2) }, s: function () { return c(e.getSeconds(), 2) }, u: function () { return c(1e3 * e.getMilliseconds(), 6) }, e: function () { throw new Error("Not supported (see source code of date() for timezone on how to add support)") }, I: function () { return new Date(r.Y(), 0) - Date.UTC(r.Y(), 0) != new Date(r.Y(), 6) - Date.UTC(r.Y(), 6) ? 1 : 0 }, O: function () { var n = e.getTimezoneOffset(), t = Math.abs(n); return (n > 0 ? "-" : "+") + c(100 * Math.floor(t / 60) + t % 60, 4) }, P: function () { var n = r.O(); return n.substr(0, 3) + ":" + n.substr(3, 2) }, T: function () { return "UTC" }, Z: function () { return 60 * -e.getTimezoneOffset() }, c: function () { return "Y-m-d\\TH:i:sP".replace(o, i) }, r: function () { return "D, d M Y H:i:s O".replace(o, i) }, U: function () { return e / 1e3 | 0 } }; return function (n, t) { return e = void 0 === t ? new Date : t instanceof Date ? new Date(t) : new Date(1e3 * t), n.replace(o, i) }(n, t)
},
/**
*
* @param text 转换参数now +-1 day +- 2 days +-1 week
* @param now 默认当前时间戳
* @returns 字符串转换时间戳
*/
strtotime: function (text, now) {
var parsed, match, today, year, date, days, ranges, len, times, regex, i, fail = false; if (!text) { return fail } text = text.replace(/^\s+|\s+$/g, "").replace(/\s{2,}/g, " ").replace(/[\t\r\n]/g, "").toLowerCase(); match = text.match(/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/); if (match && match[2] === match[4]) { if (match[1] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": return fail; case "/": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { if (match[5] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case "/": if (match[1] > 12 || match[3] > 31) { return fail } return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31 || (match[1] < 70 && match[1] > 38)) { return fail } year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1]; return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[5] >= 70) { if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } if (match[5] < 60 && !match[6]) { if (match[1] > 23 || match[3] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000 } return fail; case "/": if (match[1] > 12 || match[3] > 31 || (match[5] < 70 && match[5] > 38)) { return fail } year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5]; return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ":": if (match[1] > 23 || match[3] > 59 || match[5] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000 } } } } if (text === "now") { return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0 } if (!isNaN(parsed = Date.parse(text))) { return parsed / 1000 | 0 } date = now ? new Date(now * 1000) : new Date(); days = { "sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6 }; ranges = { "yea": "FullYear", "mon": "Month", "day": "Date", "hou": "Hours", "min": "Minutes", "sec": "Seconds" }; function lastNext(type, range, modifier) { var diff, day = days[range]; if (typeof day !== "undefined") { diff = day - date.getDay(); if (diff === 0) { diff = 7 * modifier } else { if (diff > 0 && type === "last") { diff -= 7 } else { if (diff < 0 && type === "next") { diff += 7 } } } date.setDate(date.getDate() + diff) } } function process(val) { var splt = val.split(" "), type = splt[0], range = splt[1].substring(0, 3), typeIsNumber = /\d+/.test(type), ago = splt[2] === "ago", num = (type === "last" ? -1 : 1) * (ago ? -1 : 1); if (typeIsNumber) { num *= parseInt(type, 10) } if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) { return date["set" + ranges[range]](date["get" + ranges[range]]() + num) } if (range === "wee") { return date.setDate(date.getDate() + (num * 7)) } if (type === "next" || type === "last") { lastNext(type, range, num) } else { if (!typeIsNumber) { return false } } return true } times = "(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec" + "|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?" + "|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)"; regex = "([+-]?\\d+\\s" + times + "|" + "(last|next)\\s" + times + ")(\\sago)?"; match = text.match(new RegExp(regex, "gi")); if (!match) { return fail } for (i = 0, len = match.length; i < len; i++) { if (!process(match[i])) { return fail } } return (date.getTime() / 1000)
},
/**
* date_eq('2019-10-22','2019-10-21') true
* @param 前日期
* @param 后日期
* @returns 判断日期是否前边大于后边
*/
date_eq: function (strDate1, strDate2) {
var date1 = new Date(strDate1.replace(/\-/g, "\/")); var date2 = new Date(strDate2.replace(/\-/g, "\/")); if ((date1 - date2) >= 0) { return true; } else { return false; }
},
/**
* @param 时间戳10位
* @returns 格式化时间
*/
timeline: function (tt) {
var today = new Date(); var d = new Date(tt * 1000); var m = today.getTime() - d.getTime(); if (m <= 0) { m = 1000 } if (m < 60 * 1000) { return Math.floor(m / 1000) + "秒前" } else { if (m < 60 * 60 * 1000) { return Math.floor(m / (1000 * 60)) + "分钟前" } else { if (m < 60 * 60 * 1000 * 24) { return Math.floor(m / (1000 * 60 * 60)) + "小时前" } else { if (m < 60 * 60 * 1000 * 24 * 7) { return Math.floor(m / (1000 * 60 * 60 * 24)) + "天前" } else { if (m < 60 * 60 * 1000 * 24 * 7 * 56) { return Math.floor(m / (1000 * 60 * 60 * 24 * 7)) + "周前" } else { return Math.floor(m / (1000 * 60 * 60 * 24 * 7 * 52)) + "年前" } } } } }
},
/**
* 获取某个月份的第一天、最后一天
* @param nowDate 时间
* @return {(string|string)[]}
*/
getFirstNowLastDay: function (nowDate) {
var now = nowDate ? new Date(nowDate) : new Date();
var strLink = "-";
var year = now.getFullYear();
var month = now.getMonth() + 1;
var day = now.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (day >= 1 && day <= 9) {
day = "0" + day;
}
var yearMonth = year + strLink + month;
var firstDate = year + strLink + month + strLink + '01';
var sysDate = year + strLink + month + strLink + day;
var lastDay = this.getLastDay(year, month);
var lastDate = year + strLink + month + strLink + lastDay;
//以数组形式返回
return [firstDate, sysDate, lastDate, yearMonth];
},
/**
* 获取当月的最后一天
* @param year 年份
* @param month 月份
**/
getLastDay: function (year, month) {
var new_year = year;
var new_month = month++;//取下一个月的第一天,方便计算(最后一天不固定)
if (month > 12) {//如果当前大于12月,则年份转到下一年
new_month -= 12;//月份减
new_year++;//年份增
}
// 取当年当月对应的下个月的前一天,即当前月的最后一天
return new Date(new_year, new_month, 0).getDate();
},
/**
*array_keys( {firstname: 'Kevin', surname: 'van Zonneveld'} );
* @param 数组
* @returns 返回数组中key
*/
array_keys: function (r, n, a) {
var e = void 0 !== n, o = [], t = !!a, i = !0, y = ""; for (y in r) r.hasOwnProperty(y) && (i = !0, e && (t && r[y] !== n ? i = !1 : r[y] !== n && (i = !1)), i && (o[o.length] = y)); return o
},
/**
* array_values( {firstname: 'Kevin', surname: 'van Zonneveld'} );
* @param 数组
* @returns 返回数组中值
*/
array_values: function (r) {
var n = [], a = ""; for (a in r) n[n.length] = r[a]; return n
},
/**
*array_unique({'a': 'green', 0: 'red', 'b': 'green', 1: 'blue', 2: 'red'})
* @param 数组
* @returns 去除数组重复
*/
array_unique: function (r) {
var n = "", t = {}, u = ""; for (n in r) r.hasOwnProperty(n) && (u = r[n], !1 === function (r, n) { var t = ""; for (t in n) if (n.hasOwnProperty(t) && n[t] + "" == r + "") return t; return !1 }(u, t) && (t[n] = u)); return t
},
/**
* array_slice(["a", "b", "c", "d", "e"], 2, -1, true);
* @param 数组
* @param 开始位置
* @param 取出个数
* @param 是否重排
* @returns 截取数组
*/
array_slice: function (r, i, e, t) {
var o = ""; if ("[object Array]" !== Object.prototype.toString.call(r) || t && 0 !== i) { var a = 0, c = {}; for (o in r) a += 1, c[o] = r[o]; r = c, i = i < 0 ? a + i : i, e = void 0 === e ? a : e < 0 ? a + e - i : e; var n = {}, l = !1, f = -1, s = 0, v = 0; for (o in r) { if (++f, s >= e) break; f === i && (l = !0), l && (++s, is_int(o) && !t ? n[v++] = r[o] : n[o] = r[o]) } return n } return void 0 === e ? r.slice(i) : e >= 0 ? r.slice(i, i + e) : r.slice(i, e)
},
/**
*array_search('e',["a", "b", "c", "d", "e"])
* @param 要查找的值
* @param 数组
* @returns 数组中搜索指定值返回键
*/
array_search: function (r, e, t) {
var n = !!t, i = ""; if ("object" == typeof r && r.exec) { if (!n) { var o = "i" + (r.global ? "g" : "") + (r.multiline ? "m" : "") + (r.sticky ? "y" : ""); r = new RegExp(r.source, o) } for (i in e) if (e.hasOwnProperty(i) && r.test(e[i])) return i; return !1 } for (i in e) if (e.hasOwnProperty(i) && (n && e[i] === r || !n && e[i] == r)) return i; return !1
},
/**
*
* @param 变量
* @returns 是否数组判断
*/
is_array: function (t) {
if (!t || "object" != typeof t) return !1; if (function (t) { if (!t || "object" != typeof t || "number" != typeof t.length) return !1; var e = t.length; return t[t.length] = "bogus", e !== t.length ? (t.length -= 1, !0) : (delete t[t.length], !1) }(t)) return !0; var e = Object.prototype.toString.call(t), n = function (t) { var e = /\W*function\s+([\w$]+)\s*\(/.exec(t); return e ? e[1] : "(Anonymous)" }(t.constructor); return "[object Object]" === e && "Object" === n
},
/**
*
* @param 值
* @param 数组
* @returns 判断元素是否在数组中bool
*/
in_array: function (r, n, i) {
var f = ""; if (!i) { for (f in n) if (n[f] == r) return !0 } else for (f in n) if (n[f] === r) return !0; return !1
},
/**
*sort(["a","b"],"SORT_STRING",true)
* @param 数组
* @param SORT_STRING|SORT_NUMERIC 排序类型
* @param 默认true只排序不输出,false输出
* @returns 数组排序
*/
sort: function (inputArr, sort_flags, strictForIn = true) {
var valArr = [], keyArr = [], k = '', i = 0, sorter = false, populateArr = []; switch (sort_flags) { case 'SORT_STRING': sorter = function (a, b) { return strnatcmp(a, b); }; break; case 'SORT_NUMERIC': sorter = function (a, b) { return (a - b); }; break; default: sorter = function (a, b) { var aFloat = parseFloat(a), bFloat = parseFloat(b), aNumeric = aFloat + '' === a, bNumeric = bFloat + '' === b; if (aNumeric && bNumeric) { return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0; } else if (aNumeric && !bNumeric) { return 1; } else if (!aNumeric && bNumeric) { return -1; } return a > b ? 1 : a < b ? -1 : 0; }; break; }populateArr = strictForIn ? inputArr : populateArr; for (k in inputArr) { if (inputArr.hasOwnProperty(k)) { valArr.push(inputArr[k]); if (strictForIn) { delete inputArr[k]; } } } valArr.sort(sorter); for (i = 0; i < valArr.length; i++) { populateArr[i] = valArr[i]; } return strictForIn || populateArr;
},
/**
*
* @param 字符
* @returns 是否整数判断
*/
is_int: function (i) {
return i === +i && isFinite(i) && !(i % 1)
},
/**
*
* @param 字符
* @returns 是否浮点数判断
*/
is_float: function (i) {
return !(+i !== i || isFinite(i) && !(i % 1))
},
/**
*
* @param 变量
* @returns 是否对象判断
*/
is_object: function (t) {
return "[object Array]" !== Object.prototype.toString.call(t) && (null !== t && "object" == typeof t)
},
/**
* @param 函数名字符串
* @returns 判断函数是否存在
*/
function_exists: function (n) {
var o = "undefined" != typeof window ? window : global; return "string" == typeof n && (n = o[n]), "function" == typeof n
},
/**
*
* @param 数组或对象
* @returns 序列化
*/
serialize: function (r) {
var e, t, a, n = "", o = 0, i = function (r) { var e, t, a, n, o = typeof r; if ("object" === o && !r) return "null"; if ("object" === o) { if (!r.constructor) return "object"; a = r.constructor.toString(), e = a.match(/(\w+)\(/), e && (a = e[1].toLowerCase()), n = ["boolean", "number", "string", "array"]; for (t in n) if (a == n[t]) { o = n[t]; break } } return o }, c = i(r); switch (c) { case "function": e = ""; break; case "boolean": e = "b:" + (r ? "1" : "0"); break; case "number": e = (Math.round(r) == r ? "i" : "d") + ":" + r; break; case "string": e = "s:" + function (r) { var e = 0, t = 0, a = r.length, n = ""; for (t = 0; t < a; t++)n = r.charCodeAt(t), e += n < 128 ? 1 : n < 2048 ? 2 : 3; return e }(r) + ':"' + r + '"'; break; case "array": case "object": e = "a"; for (t in r) if (r.hasOwnProperty(t)) { if ("function" === i(r[t])) continue; a = t.match(/^[0-9]+$/) ? parseInt(t, 10) : t, n += this.serialize(a) + this.serialize(r[t]), o++ } e += ":" + o + ":{" + n + "}"; break; case "undefined": default: e = "N" }return "object" !== c && "array" !== c && (e += ";"), e
},
/**
*
* @param 字符串
* @returns 解码序列化
*/
unserialize: function (r) {
var e = this, n = function (r) { var e = r.charCodeAt(0); return e < 128 ? 0 : e < 2048 ? 1 : 2 }; return error = function (r, n, a, t) { throw new e.window[r](n, a, t) }, read_until = function (r, e, n) { for (var a = 2, t = [], i = r.slice(e, e + 1); i != n;)a + e > r.length && error("Error", "Invalid"), t.push(i), i = r.slice(e + (a - 1), e + a), a += 1; return [t.length, t.join("")] }, read_chrs = function (r, e, a) { var t, i, u; for (u = [], t = 0; t < a; t++)i = r.slice(e + (t - 1), e + t), u.push(i), a -= n(i); return [u.length, u.join("")] }, _unserialize = function (r, e) { var n, a, t, i, u, s, o, l, c, d, f, h, _, p, w, b, k, g, v = 0, I = function (r) { return r }; switch (e || (e = 0), n = r.slice(e, e + 1).toLowerCase(), a = e + 2, n) { case "i": I = function (r) { return parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "b": I = function (r) { return 0 !== parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "d": I = function (r) { return parseFloat(r) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "n": l = null; break; case "s": d = read_until(r, a, ":"), v = d[0], f = d[1], a += v + 2, c = read_chrs(r, a + 1, parseInt(f, 10)), v = c[0], l = c[1], a += v + 2, v != parseInt(f, 10) && v != l.length && error("SyntaxError", "String length mismatch"); break; case "a": for (l = {}, t = read_until(r, a, ":"), v = t[0], i = t[1], a += v + 2, s = parseInt(i, 10), u = !0, h = 0; h < s; h++)p = _unserialize(r, a), w = p[1], _ = p[2], a += w, b = _unserialize(r, a), k = b[1], g = b[2], a += k, _ !== h && (u = !1), l[_] = g; if (u) { for (o = new Array(s), h = 0; h < s; h++)o[h] = l[h]; l = o } a += 1; break; default: error("SyntaxError", "Unknown / Unhandled data type(s): " + n) }return [n, a - e, I(l)] }, _unserialize(r + "", 0)[2]
},
/**
* uniqid('',true)长度23 默认13
* @param 前缀
* @param 是否增加长度
* @returns 生成唯一id
*/
uniqid: function (n, e) {
void 0 === n && (n = ""); var t, i = function (n, e) { return n = parseInt(n, 10).toString(16), e < n.length ? n.slice(n.length - e) : e > n.length ? Array(e - n.length + 1).join("0") + n : n }, o = "undefined" != typeof window ? window : global; o.$locutus = o.$locutus || {}; var d = o.$locutus; return d.php = d.php || {}, d.php.uniqidSeed || (d.php.uniqidSeed = Math.floor(123456789 * Math.random())), d.php.uniqidSeed++, t = n, t += i(parseInt((new Date).getTime() / 1e3, 10), 8), t += i(d.php.uniqidSeed, 5), e && (t += (10 * Math.random()).toFixed(8).toString()), t
},
/**
*
* @param 变量
* @param 进制,默认十进制
* @returns 转换成整型
*/
intval: function (i, t) {
var n, a, e = typeof i; return "boolean" === e ? +i : "string" === e ? (0 === t && (a = i.match(/^\s*0(x?)/i), t = a ? a[1] ? 16 : 8 : 10), n = parseInt(i, t || 10), isNaN(n) || !isFinite(n) ? 0 : n) : "number" === e && isFinite(i) ? i < 0 ? Math.ceil(i) : Math.floor(i) : 0
},
//转换成浮点型
floatval: function (a) {
return parseFloat(a) || 0
},
//打印变量
log: function (arr) {
console.log(arr);
},
/**
*
* @param 字符串
* @param 要去除的字符,默认为空格
* @returns 去除两边空格
*/
trim: function (r, n) {
var t = [" ", "\n", "\r", "\t", "\f", "\v", " ", " ", "", "", "", "", "", "", "", "", "", "", "", "\u2028", "\u2029", " "].join(""), e = 0, i = 0; for (r += "", n && (t = (n + "").replace(/([[\]().?\/*{}+$^:])/g, "$1")), e = r.length, i = 0; i < e; i++)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(i); break } for (e = r.length, i = e - 1; i >= 0; i--)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(0, i + 1); break } return -1 === t.indexOf(r.charAt(0)) ? r : ""
},
/**
*
* @param 字符串
* @param 要去除的字符
* @returns 去除右边空格
*/
rtrim: function (e, r) {
return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "\\$1") : " \\s ", (e + "").replace(new RegExp("[" + r + "]+$", "g"), "")
},
/**
*
* @param 字符串
* @param 要去除的字符
* @returns 去除左边空格
*/
ltrim: function (e, r) {
return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "$1") : " \\s ", (e + "").replace(new RegExp("^[" + r + "]+", "g"), "")
},
//字符串删除多个空格只保留一个
strtrim: function (a) {
return a.replace(/\s+/g, " ");
},
/**
*str_replace("a","我","来自于a")
* @param 要查找的字符
* @param 要替换的字符
* @param 字符串
* @returns 字符串替换
*/
str_replace: function (t, o, e, c) {
var r = 0, l = 0, n = "", a = "", i = 0, p = 0, u = [].concat(t), f = [].concat(o), g = e, y = "[object Array]" === Object.prototype.toString.call(f), b = "[object Array]" === Object.prototype.toString.call(g); g = [].concat(g); var j = "undefined" != typeof window ? window : global; j.$locutus = j.$locutus || {}; var v = j.$locutus; if (v.php = v.php || {}, "object" == typeof t && "string" == typeof o) { for (n = o, o = [], r = 0; r < t.length; r += 1)o[r] = n; n = "", f = [].concat(o), y = "[object Array]" === Object.prototype.toString.call(f) } for (void 0 !== c && (c.value = 0), r = 0, i = g.length; r < i; r++)if ("" !== g[r]) for (l = 0, p = u.length; l < p; l++)n = g[r] + "", a = y ? void 0 !== f[l] ? f[l] : "" : f[0], g[r] = n.split(u[l]).join(a), void 0 !== c && (c.value += n.split(u[l]).length - 1); return b ? g : g[0]
},
/**
*
* @param 字符串
* @param 保留的标签
* @returns 过滤去除html标签
*/
strip_tags: function (input, allowed) {
allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(""); var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; return input.replace(commentsAndPhpTags, "").replace(tags, function ($0, $1) { return allowed.indexOf("<" + $1.toLowerCase() + ">") > -1 ? $0 : "" })
},
//字符串转换首字母大写
ucfirst: function (t) {
return t += "", t.charAt(0).toUpperCase() + t.substr(1)
},
//html转换实体
htmlencode: function (sStr) {
var htmlspecialchars = function (e, E, T, _) { var r = 0, t = 0, a = !1; ("undefined" == typeof E || null === E) && (E = 2), e = e.toString(), _ !== !1 && (e = e.replace(/&/g, "&amp;")), e = e.replace(/</g, "&lt;").replace(/>/g, "&gt;"); var N = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (a = !0), "number" != typeof E) { for (E = [].concat(E), t = 0; t < E.length; t++)0 === N[E[t]] ? a = !0 : N[E[t]] && (r |= N[E[t]]); E = r } return E & N.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/'/g, "&#039;")), a || (e = e.replace(/"/g, "&quot;")), e }; return htmlspecialchars(sStr);
},
//html实体还原
htmldecode: function (sStr) {
var htmlspecialchars_decode = function (e, E) { var T = 0, _ = 0, r = !1; "undefined" == typeof E && (E = 2), e = e.toString().replace(/&lt;/g, "<").replace(/&gt;/g, ">"); var t = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (r = !0), "number" != typeof E) { for (E = [].concat(E), _ = 0; _ < E.length; _++)0 === t[E[_]] ? r = !0 : t[E[_]] && (T |= t[E[_]]); E = T } return E & t.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/&#0*39;/g, "'")), r || (e = e.replace(/&quot;/g, '"')), e = e.replace(/&amp;/g, "&") }; return htmlspecialchars_decode(sStr)
},
// 转义 html
escape: function (html) {
var exp = /[<"'>]|&(?=#[a-zA-Z0-9]+)/g;
if (html === undefined || html === null) return '';
html += '';
if (!exp.test(html)) return html;
return html.replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
.replace(/</g, '&lt;').replace(/>/g, '&gt;')
.replace(/'/g, '&#39;').replace(/"/g, '&quot;');
},
// 还原转义的 html
unescape: function (html) {
if (html === undefined || html === null) html = '';
html += '';
return html.replace(/\&amp;/g, '&')
.replace(/\&lt;/g, '<').replace(/\&gt;/g, '>')
.replace(/\&#39;/g, '\'').replace(/\&quot;/g, '"');
},
//base64还原
base64_decode: function (n) {
var r = function (n) { return decodeURIComponent(n.split("").map(function (n) { return "%" + ("00" + n.charCodeAt(0).toString(16)).slice(-2) }).join("")) }; if ("undefined" == typeof window) return new Buffer(n, "base64").toString("utf-8"); if (void 0 !== window.atob) return r(window.atob(n)); var e, t, o, i, d, f, a, c, u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", h = 0, w = 0, C = "", g = []; if (!n) return n; n += ""; do { i = u.indexOf(n.charAt(h++)), d = u.indexOf(n.charAt(h++)), f = u.indexOf(n.charAt(h++)), a = u.indexOf(n.charAt(h++)), c = i << 18 | d << 12 | f << 6 | a, e = c >> 16 & 255, t = c >> 8 & 255, o = 255 & c, g[w++] = 64 === f ? String.fromCharCode(e) : 64 === a ? String.fromCharCode(e, t) : String.fromCharCode(e, t, o) } while (h < n.length); return C = g.join(""), r(C.replace(/\0+$/, ""))
},
// base64编码
base64_encode: function (e) {
var r = function (e) { return encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, r) { return String.fromCharCode("0x" + r) }) }; if ("undefined" == typeof window) return new Buffer(e).toString("base64"); if (void 0 !== window.btoa) return window.btoa(r(e)); var n, t, o, i, a, c, d, f, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", u = 0, w = 0, A = "", l = []; if (!e) return e; e = r(e); do { n = e.charCodeAt(u++), t = e.charCodeAt(u++), o = e.charCodeAt(u++), f = n << 16 | t << 8 | o, i = f >> 18 & 63, a = f >> 12 & 63, c = f >> 6 & 63, d = 63 & f, l[w++] = h.charAt(i) + h.charAt(a) + h.charAt(c) + h.charAt(d) } while (u < e.length); A = l.join(""); var C = e.length % 3; return (C ? A.slice(0, C - 3) : A) + "===".slice(C || 3)
},
//字符串URL编码
urlencode: function (e) {
return e += "", encodeURIComponent(e).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/~/g, "%7E").replace(/%20/g, "+")
},
//字符串URL解码
urldecode: function (e) {
return decodeURIComponent((e + "").replace(/%(?![\da-f]{2})/gi, function () { return "%25" }).replace(/\+/g, "%20"))
},
//unicode解码表情中文
unicode_decode: function (e) {
return e = e.replace(/\\/g, "%"), unescape(e)
},
/**
* @param 字符串
* @param 是否中文也编码
* @returns unicode编码中文表情
*/
unicode_encode: function (n) {
if (1 == (arguments.length > 1 && void 0 !== arguments[1] && arguments[1])) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") } var e = function (n) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") }, u = /[\ud800-\udbff][\udc00-\udfff]/g; return n = n.replace(u, function (n) { return 2 === n.length ? e(n) : n })
},
//获取url变量值
get_params: function (c) {
var e = c + "=", b = window.location.href, h = b.indexOf("?"), b = b.slice(h + 1), a = b.split("&"), d = 0, f = "", g = a.length; for (d = 0; d < g; d++) { var f = a[d]; if (f.indexOf(e) === 0) { return decodeURIComponent(f.slice(e.length).replace(/\+/g, "%20")) } } return null
},
/**
* 可以不要参数
* @param 最小
* @param 最大
* @returns 生成更好随机数
*/
mt_rand: function (r, e) {
var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else { if (1 === n) throw new Error("Warning: mt_rand() expects exactly 2 parameters, 1 given"); r = parseInt(r, 10), e = parseInt(e, 10) } return Math.floor(Math.random() * (e - r + 1)) + r
},
/**
* 可以不要参数
* @param 最小
* @param 最大
* @returns 生成随机数
*/
rand: function (r, e) {
var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else if (1 === n) throw new Error("Warning: rand() expects exactly 2 parameters, 1 given"); return Math.floor(Math.random() * (e - r + 1)) + r
},
/**
*strcut("我爱中国人",4,"...")
* @param 字符串
* @param 长度中文汉字算两个
* @param 显示符号
* @returns 字符串截取
*/
strcut: function (str, iMaxBytes, sSuffix) {
if (isNaN(iMaxBytes)) { return str } if (strlen(str) <= iMaxBytes) { return str } var i = 0, bytes = 0; for (; i < str.length && bytes < iMaxBytes; ++i, ++bytes) { if (str.charCodeAt(i) > 255) { ++bytes } } sSuffix = sSuffix || ""; return (bytes - iMaxBytes == 1 ? str.substr(0, i - 1) : str.substr(0, i)) + sSuffix
},
/**
* @param 字符串
* @param 子字符串
* @returns 查找字符串
*/
strfind: function (string, find) {
return !(string.indexOf(find) === -1)
},
//判断是否数字
is_num: function (num) {
var reg = new RegExp("^[0-9]*$"); return reg.test(num)
},
//判断是否手机号
is_mobile: function (num) {
var reg = /^1\d{10}$/; return reg.test(num)
},
//判断是否QQ
is_qq: function (num) {
var reg = /^[1-utf8_decode]{1}\d{4,11}$/; return reg.test(num)
},
//判断是否邮箱
is_email: function (str) {
var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; return reg.test(str)
},
//判断是否中文
is_chinese: function (num) {
var reg = /[\u4e00-\u9fa5]/g; return reg.test(num)
},
//判断是否符合注册用户名(数字字母组成,下划钱字母开头)
is_reg: function (num) {
var reg = /^([a-zA-z_]{1})([\w]*)$/g; return reg.test(num)
},
//判断是否电话
is_tel: function (str) {
var reg = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; return reg.test(str)
},
//判断是否是IP
is_ip: function (strIP) {
if (isNull(strIP)) { return false } var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g; if (re.test(strIP)) { if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) { return true } } return false
},
//判断是否邮编
is_zipcode: function (str) {
var reg = /^(\d){6}$/; return reg.test(str)
},
//判断是否英文
is_english: function (str) {
var reg = /^[A-Za-z]+$/; return reg.test(str)
},
//判断是否是URL
is_url: function (url) {
var strRegex = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/; var re = new RegExp(strRegex); return re.test(url);
},
//判断是否http
is_http: function (url) {
if (url.indexOf("http://") === -1 && url.indexOf("https://") === -1) { return false } return true
},
//判断是否金额
is_money: function (n) {
return !!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(n)
},
//是否是银行卡号
is_CardNumber: function (num) {
return num.toString().replace(/\s/g, '').replace(/(.{4})/g, "$1 ");
},
//是否是身份证号
is_IDCard: function (idcode) {
var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2', 'x'];
var code = idcode + "";
var last = idcode[17];//最后一位
var seventeen = code.substring(0, 17);
var arr = seventeen.split("");
var len = arr.length;
var num = 0;
for (var i = 0; i < len; i++) {
num = num + arr[i] * weight_factor[i];
}
var resisue = num % 11;
var last_no = check_code[resisue];
var idcard_patter = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
var format = idcard_patter.test(idcode);
return last === last_no && format;
},
/**
*
* @param 整数
* @param 最小
* @param 最大
* @returns 判断是否在两个整数内
*/
in_int: function (n, iMin, iMax) {
if (!isFinite(n)) { return false } if (!/^[+-]?\d+$/.test(n)) { return false } if (iMin != undefined && parseInt(n) < parseInt(iMin)) { return false } if (iMax != undefined && parseInt(n) > parseInt(iMax)) { return false } return true
},
/**
*
* @param 浮点数
* @param 最小
* @param 最大
* @returns 判断是否在两个浮点数之内
*/
in_float: function (n, fMin, fMax) {
if (!isFinite(n)) { return false } if (fMin != undefined && parseFloat(n) < parseFloat(fMin)) { return false } if (fMax != undefined && parseFloat(n) > parseFloat(fMax)) { return false } return true
},
/**
*number_format('150.456', 2, '.', ',')
* @param 数字
* @param 保留小数位数
* @param 小数点显示符号
* @param 千分位符号
* @returns 格式化数字
*/
number_format: function (e, n, t, i) {
e = (e + "").replace(/[^0-9+\-Ee.]/g, ""); var r = isFinite(+e) ? +e : 0, o = isFinite(+n) ? Math.abs(n) : 0, a = void 0 === i ? "," : i, d = void 0 === t ? "." : t, u = ""; return u = (o ? function (e, n) { if (-1 === ("" + e).indexOf("e")) return +(Math.round(e + "e+" + n) + "e-" + n); var t = ("" + e).split("e"), i = ""; return +t[1] + n > 0 && (i = "+"), (+(Math.round(+t[0] + "e" + i + (+t[1] + n)) + "e-" + n)).toFixed(n) }(r, o).toString() : "" + Math.round(r)).split("."), u[0].length > 3 && (u[0] = u[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, a)), (u[1] || "").length < o && (u[1] = u[1] || "", u[1] += new Array(o - u[1].length + 1).join("0")), u.join(d)
},
// 数字前置补零
digit: function (num, length) {
var str = '';
num = String(num);
length = length || 2;
for (var i = num.length; i < length; i++) {
str += '0';
}
return num < Math.pow(10, length) ? str + (num | 0) : num;
},
/**
* 金额数字转大写
* @param num number
* @return {string}
*/
upDigit: function (num, is_head = false) {
var fraction = ['角', '分', '厘'];
var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
var unit = [
['元', '万', '亿'],
['', '拾', '佰', '仟']
];
var head = num < 0 ? '欠人民币' : '人民币';
num = Math.abs(num);
var s = '', i;
for (i = 0; i < fraction.length; i++) {
s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
num = Math.floor(num);
for (i = 0; i < unit[0].length && num > 0; i++) {
var p = '';
for (var j = 0; j < unit[1].length && num > 0; j++) {
p = digit[num % 10] + unit[1][j] + p;
num = Math.floor(num / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
if (is_head == true) {
return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}
else {
return s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}
},
//隐藏银行号码
hidebank: function (s = "6217995510035399947") {
return s.replace(/^(\d{8})\d+(\d{4})$/, "$1*******$2");
},
// 隐藏手机号中间四位
hidemobile: function (s = "18291447788") {
return s.replace(/^(\d{3})\d+(\d{4})$/, "$1****$2");
},
/**
*
* @param css代码
* @returns 添加css代码
*/
addcss: function (e) {
var t = document.createElement("style"), d = document.head || document.getElementsByTagName("head")[0]; if (t.type = "text/css", t.styleSheet) { var a = function () { try { t.styleSheet.cssText = e } catch (e) { } }; t.styleSheet.disabled ? setTimeout(a, 10) : a() } else { var s = document.createTextNode(e); t.appendChild(s) } d.appendChild(t)
},
/**
* @param js代码
* @returns 添加js代码
*/
addjs: function (t) {
var e = document.createElement("script"); e.type = "text/javascript"; try { e.appendChild(document.createTextNode(t)) } catch (d) { e.text = t } document.head.appendChild(e)
},
/**
*
* @param js文件路径
* @param 回调函数
* @returns 加载js支持回调
*/
loadjs: function (e, a) {
var t = document.createElement("script"); t.src = e, t.onload = function () { var e = t.readyState && "complete" != t.readyState && "loaded" != t.readyState; a && a(!e) }, document.head.appendChild(t)
},
/**
*
* @param css路径
* @param 回调函数
* @returns 加载css支持回调
*/
loadcss: function (e, n) {
var t = document.createElement("link"); t.rel = "stylesheet", t.type = "text/css", t.onerror = function () { n(!1) }, t.onload = function () { n(!0) }, t.href = e, document.head.appendChild(t)
},
//获取当前域名主机
gethost: function () {
return window.location.protocol + "//" + window.location.host;
},
/**
* 由经纬度计算两点之间的距离
* @param latlngFirst
* @param latlngLast
* @return {string}
*/
distance: function (latlngFirst, latlngLast) {
var La1 = latlngFirst.lat * Math.PI / 180.0;
var La2 = latlngLast.lat * Math.PI / 180.0;
var La3 = La1 - La2;
var Lb3 = latlngFirst.lng * Math.PI / 180.0 - latlngLast.lng * Math.PI / 180.0;
var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2)));
dis = dis * 6378.137;
dis = Math.round(dis * 10000) / 10000;
return dis.toFixed(2);
},
/**
* 设置cookie
* @param name
* @param value
* @param iDay
*/
setCookie: function (name, value, iDay) {
var oDate = new Date();
oDate.setDate(oDate.getDate() + iDay);
document.cookie = name + '=' + value + ';expires=' + oDate;
},
/**
* 获取cookie
* @param name
* @return {string}
*/
getCookie: function (name) {
var arr = document.cookie.split('; ');
for (var i = 0; i < arr.length; i++) {
var arr2 = arr[i].split('=');
if (arr2[0] == name) {
return arr2[1];
}
}
return '';
},
/**
* 删除Cookie
* @param name
*/
removeCookie: function (name) {
this.setCookie(name, 1, -1);
},
/**
* 运算百分制
* @param thisNum
* @param totalNum
* @return {number}
*/
computeProgres: function (thisNum, totalNum) {
var num = parseFloat(thisNum) || 0.00, total = parseFloat(totalNum) || 0.00;
return Math.round(num / total * 10000) / 100;
},
/**
* 生成随着大小写token
* @param length 长度,默认32
* @return {string}
*/
token: function (length) {
length = length || 32;
var char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var result = '';
for (var i = 0; i < length; i++) {
result += char.charAt(Math.floor(Math.random() * char.length));
}
return result;
}
};
$('body').on('click', '.link-a', function () {
let url = $(this).data('href');
if (url && url !== '') {
window.location.replace(url);
}
return false;
});
// 输出接口
exports('tool', tool);
});
@@ -0,0 +1,160 @@
mbui.define(['layer'], function (exports) {
var layer = mbui.layer;
var userSelector = function () {
this.config = {
type:1,
url: "/api/index/get_employee",
where: {},
callback: function(){}
};
this.loaded = 0;
};
// 初始化
userSelector.prototype.init = function (options) {
var that = this;
$.extend(true, that.config, options);
that.select();
};
userSelector.prototype.select = function () {
var that = this;
var types = that.config.type == 2 ? 'checkbox' : 'radio';
var users = [];
var alphabet = [];
var userGroups = {};
var selector = $('.user-selector');
if (selector.length > 0) {
return false;
}
let loading;
$.ajax({
url: that.config.url,
type: 'get',
data: { did: 0 },
beforeSend:function(){
loading = layer.loading('加载中...');
},
success: function (e) {
if (e.code == 0) {
users = e.data;
bulidSelector();
}
},
complete:function(){
layer.close(loading);
}
})
function bulidSelector() {
// 将用户账号按照首字母分组
for (var i = 0; i < users.length; i++) {
var user = users[i]['username'];
var firstLetter = user.charAt(0).toUpperCase();
if (!userGroups[firstLetter]) {
userGroups[firstLetter] = [];
alphabet.push(firstLetter);
}
userGroups[firstLetter].push(users[i]);
}
alphabet.sort();
var $container = $('<div class="mbui-picker-selector"><header class="mbui-bar"><a class="mbui-bar-item left" href="javascript:;"><i class="mbui-bar-arrow-left"></i>关闭</a><a class="mbui-bar-item right text-blue" href="javascript:;">确认</a><h1 class="mbui-bar-title">选择员工</h1></header></div>');
var $letters = $('<div class="letters"></div>');
var $userList = $('<div class="contacts mbui-' + types + '"></div>');
var item = '';
for (var j = 0; j < alphabet.length; j++) {
var $letterLink = $('<a href="#' + alphabet[j] + '">' + alphabet[j] + '</a>');
$letters.append($letterLink);
item += '<div class="mbui-contacts-title" id="' + alphabet[j] + '">' + alphabet[j] + '</div>';
var userData = userGroups[alphabet[j]];
for (var k = 0; k < userData.length; k++) {
item += '<label class="mbui-picker-item" data-id="' + userData[k]['id'] + '" data-did="' + userData[k]['did'] + '" data-name="' + userData[k]['name'] + '" data-department="' + userData[k]['department'] + '">\
<input class="mbui-input-'+types+'" name="radio_user[]" type="'+types+'" value="' + userData[k]['id'] + '">\
<i class="mbui-picker-avatar"><img src="' + userData[k]['thumb'] + '" width="32" height="32" align="'+userData[k]['name']+'" style="border-radius:4px;"></i>\
<span class="mbui-picker-name">' + userData[k]['name'] + ' <span class="text-gray f14">『' + userData[k]['department'] + '』</span></span>\
</label>';
}
}
$userList.append(item);
$container.append($letters).append($userList);
$('body').append($container);
// 点击字母滚动到对应的字母开头的用户位置
$letters.on('click', 'a', function (e) {
e.preventDefault();
var letter = $(this).attr('href').substring(1);
var $letterSection = $('#' + letter);
var scrollTop = $letterSection.offset().top - $userList.offset().top + $userList.scrollTop();
$userList.animate({ scrollTop: scrollTop }, 500);
});
$container.find('.left').click(function () {
$container.fadeOut(function () {
$container.remove();
});
});
$container.find('.right').click(function () {
let selected = $container.find('input:checked');
if (selected.length == 0) {
layer.msg('请选择员工');
return false;
}
let ids = [], names = [], dids = [],departments=[];
for (var m = 0; m < selected.length; m++) {
let selected_item = $(selected[m]).parent();
ids.push(selected_item.data('id'));
names.push(selected_item.data('name'));
dids.push(selected_item.data('did'));
departments.push(selected_item.data('department'));
}
that.config.callback(ids,names,dids,departments);
$container.fadeOut(function () {
$container.remove();
});
});
}
};
//选择员工弹窗
$('body').on('click','.picker-admin',function () {
let that = $(this);
let type = that.data('type');
let sub = that.data('sub');
if (typeof(type) == "undefined" || type == '') {
type = 1;
}
if (typeof(sub) == "undefined" || sub == '') {
sub = 0;
}
let ids=that.next().val()+'',names = that.val()+'';
let picker = new userSelector();
if(sub ==1){
picker.init({
type:type,
url:'/api/index/get_employee_sub',
callback:function(ids,names,dids,departments){
that.val(names.join(','));
that.next().val(ids.join(','));
that.next().next().val(dids.join(','));
}
});
}
else{
picker.init({
type:type,
callback:function(ids,names,dids,departments){
that.val(names.join(','));
that.next().val(ids.join(','));
that.next().next().val(dids.join(','));
}
});
}
});
// 导出userPicker模块
exports('userPicker', function (options) {
var userPicker = new userSelector();
userPicker.init(options);
});
});