Files
ZangShiQi/public/static/js/common.js
2026-04-04 17:27:12 +08:00

1689 lines
45 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
var ns = window.ns_url;
/**
* 解析URL
* @param {string} url 被解析的URL
* @return {object} 解析后的数据
*/
ns.parse_url = function (url) {
var parse = url.match(/^(?:([0-9a-zA-Z]+):\/\/)?([\w-]+(?:\.[\w-]+)+)?(?::(\d+))?([\w-\/]+)?(?:\?((?:\w+=[^#&=\/]*)?(?:&\w+=[^#&=\/]*)*))?(?:#([\w-]+))?$/i);
parse || $.error("url格式不正确");
return {
"scheme": parse[1],
"host": parse[2],
"port": parse[3],
"path": parse[4],
"query": parse[5],
"fragment": parse[6]
};
};
ns.parse_str = function (str) {
var value = str.split("&"), vars = {}, param;
for (var i = 0; i < value.length; i++) {
param = value[i].split("=");
vars[param[0]] = param[1];
}
return vars;
};
ns.parse_name = function (name, type) {
if (type) {
/* 下划线转驼峰 */
name = name.replace(/_([a-z])/g, function ($0, $1) {
return $1.toUpperCase();
});
/* 首字母大写 */
name = name.replace(/[a-z]/, function ($0) {
return $0.toUpperCase();
});
} else {
/* 大写字母转小写 */
name = name.replace(/[A-Z]/g, function ($0) {
return "_" + $0.toLowerCase();
});
/* 去掉首字符的下划线 */
if (0 === name.indexOf("_")) {
name = name.substr(1);
}
}
return name;
};
//scheme://host:port/path?query#fragment
ns.url = function (url, vars, suffix) {
if (url.indexOf('http://') != -1 || url.indexOf('https://') != -1) {
return url;
}
var info = this.parse_url(url), path = [], param = {}, reg;
/* 验证info */
info.path || alert("url格式错误");
url = info.path;
/* 解析URL */
path = url.split("/");
path = [path.pop(), path.pop(), path.pop()].reverse();
path[1] = path[1] || this.route[1];
path[0] = path[0] || this.route[0];
param[this.route[1]] = path[0];
param[this.route[2]] = path[1];
param[this.route[3]] = path[2].toLowerCase();
url = param[this.route[1]] + '/' + param[this.route[2]] + '/' + param[this.route[3]];
/* 解析参数 */
if (typeof vars === "string") {
vars = this.parse_str(vars);
} else if (!$.isPlainObject(vars)) {
vars = {};
}
/* 添加伪静态后缀 */
if (false !== suffix) {
suffix = suffix || 'html';
if (suffix) {
url += "." + suffix;
}
}
/* 解析URL自带的参数 */
info.query && $.extend(vars, this.parse_str(info.query));
var addon = '';
if (info.scheme != '' && info.scheme != undefined) {
addon = info.scheme + '/';
}
url = addon + url;
if (vars) {
var param_str = $.param(vars);
if ('' !== param_str) {
url += ((this.baseUrl + url).indexOf('?') !== -1 ? '&' : '?') + param_str;
}
}
url = this.baseUrl + url;
return url;
};
// 哈希模式路由
ns.hash = function (url, vars) {
if (url.indexOf('http://') != -1 || url.indexOf('https://') != -1) {
return url;
}
var info = this.parse_url(url), path = [], param = {}, reg;
info.path || alert("url格式错误");
url = url.split('?')[0];
if (typeof vars === "string") {
vars = this.parse_str(vars);
} else if (!$.isPlainObject(vars)) {
vars = {};
}
/* 解析URL自带的参数 */
info.query && $.extend(vars, this.parse_str(info.query));
var query = [];
for (var key in vars){
query.push(`${key}=${vars[key]}`)
}
var hash = `url=${url}`;
if(query.length){
hash += `&${query.join('&')}`
}
return hash
};
// 链接跳转
ns.href = function(url,vars) {
if (url) url = ns.hash(url, vars);
var res = ns_url.baseUrl + 'shop.html';
if (url) {
res += '#' + url;
}
return res;
}
// 打开新窗口
ns.windowOpen = function(url){
if (url.indexOf('url=') == -1) {
url = ns.hash(url);
}
window.open(ns_url.baseUrl + 'shop.html#' + url);
}
/**
* 验证手机号
* @param {string} mobile 被验证的mobile
* @return {object} 验证后的结果
**/
ns.parse_mobile = function (mobile) {
// var parse = /^1(3|4|5|6|7|8|9)\d{9}$/.test(mobile);
var parse = /^\d{11}$/.test(mobile);
return parse;
};
/**
* 验证固定电话
* @param {string} phone 被验证的mobile
* @return {object} 验证后的结果
**/
ns.parse_telephone = function (phone) {
var parse = /^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/.test(phone);
return parse;
};
/**
* 处理图片路径
* path 路径地址
* type 类型 big、mid、small
*/
ns.img = function (path, type = '') {
if(typeof path !== 'string') return '';
if (path.indexOf(",") != -1) {
path = path.split(',')[0];
}
var start = path.lastIndexOf('.');
type = type ? '_' + type.toUpperCase() : '';
var suffix = path.substring(start);
path = path.substring(0, start);
var first = path.split("/");
path += type + suffix;
if (path.indexOf("http://") == -1 && path.indexOf("https://") == -1) {
var base_url = this.baseUrl.replace('/?s=', '');
var base_url = base_url.replace('/index.php', '');
if (isNaN(first[0])) {
var true_path = base_url + path;
} else {
var true_path = base_url + 'attachment/' + path;
}
} else {
var true_path = path;
}
return true_path;
};
/**
* 时间戳转时间
*/
ns.time_to_date = function (timeStamp, time_format = 'Y-m-d H:i:s') {
if (timeStamp > 0) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute = date.getMinutes();
var second = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
time_format = time_format.replace('Y', y);
time_format = time_format.replace('m', m);
time_format = time_format.replace('d', d);
time_format = time_format.replace('H', h);
time_format = time_format.replace('i', minute);
time_format = time_format.replace('s', second);
return time_format;
} else {
return "";
}
};
/**
* 时间戳转时间(毫秒)
*/
ns.millisecond_to_date = function (timeStamp) {
if (timeStamp > 0) {
var date = new Date();
date.setTime(timeStamp);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute = date.getMinutes();
var second = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
} else {
return "";
}
};
/**
* 日期 转换为 Unix时间戳
* @return <int> unix时间戳(秒)
*/
ns.date_to_time = function (string) {
var f = string.split(' ', 2);
var d = (f[0] ? f[0] : '').split('-', 3);
var t = (f[1] ? f[1] : '').split(':', 3);
return (new Date(
parseInt(d[0], 10) || null,
(parseInt(d[1], 10) || 1) - 1,
parseInt(d[2], 10) || null,
parseInt(t[0], 10) || null,
parseInt(t[1], 10) || null,
parseInt(t[2], 10) || null
)).getTime() / 1000;
};
/**
* url 反转义
* @param url
*/
ns.urlReplace = function (url) {
url = decodeURIComponent(url);
var new_url = url.replace(/%2B/g, "+");//"+"转义
new_url = new_url.replace(/%26/g, "&");//"&"
new_url = new_url.replace(/%23/g, "#");//"#"
new_url = new_url.replace(/%20/g, " ");//" "
new_url = new_url.replace(/%3F/g, "?");//"#"
new_url = new_url.replace(/%25/g, "%");//"#"
new_url = new_url.replace(/&3D/g, "=");//"#"
new_url = new_url.replace(/%2F/g, "/");//"#"
return new_url;
};
/**
* 需要定义APP_KEY,API_URL
* method 插件名.控制器.方法
* data json对象
* async 是否异步默认true 异步false 同步
*/
ns.api = function (method, param, callback, async) {
// async true为异步请求 false为同步请求
async = async != undefined ? async : true;
param = param || {};
param.port = 'platform';
$.ajax({
type: 'get',
url: ns_url.baseUrl + '' + method + '?site_id=' + ns_url.siteId,
data: param,
dataType: "JSON",
async: async,
success: function (res) {
if (callback) callback(eval("(" + res + ")"));
}
});
};
/**
* url 反转义
* @param url
*/
ns.append_url_params = function (url, params) {
if (params != undefined) {
var url_params = '';
for (var k in params) {
url_params += "&" + k + "=" + params[k];
}
url += url_params;
}
return url;
};
/**
* 生成随机不重复字符串
* @param len
* @returns {string}
*/
ns.gen_non_duplicate = function (len) {
return Number(Math.random().toString().substr(3, len) + Date.now()).toString(36);
};
/**
* 获取分页参数
* @param param 参数
* @returns {{layout: string[]}}
*/
ns.get_page_param = function (param) {
var obj = {
layout: ['count', 'limit', 'prev', 'page', 'next']
};
if (param != undefined) {
if (param.limit != undefined) {
obj.limit = param.limit;
}
}
return obj;
};
/**
* 弹出框,暂时没有使用
* @param options 参数参考layuihttps://www.layui.com/doc/modules/layer.html
*/
ns.open = function (options) {
if (!options) options = {};
options.type = options.type || 1;
//宽高,小、中、大
// options.size
options.area = options.area || ['500px'];
layer.open(options);
};
/**
* 上传
* @param id
* @param method
* @param param
* @param callback
* @param async
*/
ns.upload_api = function (id, method, param, callback, async) {
// async true为异步请求 false为同步请求
async = async != undefined ? async : true;
param.app_key = APP_KEY;
var file = document.getElementById(id).files[0];
var formData = new FormData();
formData.append("file", file);
formData.append("method", method);
formData.append("param", JSON.stringify(param));
$.ajax({
url: API_URL + '?s=/api/index/get/method/' + method + '/version/1.0',
type: "post",
data: formData,
dataType: "JSON",
contentType: false,
processData: false,
async: async,
mimeType: "multipart/form-data",
success: function (res) {
if (callback) callback(eval("(" + res + ")"));
},
// error: function (data) {
// console.log(data);
// }
});
};
/**
* 复制
* @param dom
* @param callback
*/
ns.copy = function JScopy(dom, callback) {
var url = document.getElementById(dom);
var o = {
url: url.value
};
var inputText = document.createElement('input');
inputText.value = o.url;
document.body.appendChild(inputText);
inputText.select();
document.execCommand("Copy");
if (callback) callback.call(this, o);
inputText.type = 'hidden';
layer.msg('复制成功');
};
ns.int_to_float = function (val) {
return new Number(val).toFixed(2);
};
var show_link_box_flag = true;
/**
* 弹出框-->选择链接
* @param link
* @param callback
*/
ns.select_link = function (link, callback) {
if (show_link_box_flag) {
show_link_box_flag = false;
$.post(ns.url("shop/diy/link"), {
link: JSON.stringify(link),
site_id: ns_url.siteId,
app_module: ns_url.appModule,
}, function (str) {
window.linkIndex = layer.open({
type: 1,
title: "选择链接",
content: str,
btn: [],
area: ['850px'], //宽高
maxWidth: 1920,
cancel: function (index, layero) {
show_link_box_flag = true;
},
end: function () {
if (window.linkData) {
if (callback) callback(window.linkData);
delete window.linkData;// 清空本次选择
}
show_link_box_flag = true;
}
});
});
}
};
/**
* 打开iframe弹框
* @param param
*/
ns.compare = function (property) {
return function (a, b) {
var value1 = a[property];
var value2 = b[property];
return value1 - value2;
}
};
//存储单元单位转换
ns.sizeformat = function (limit) {
if (limit == null || limit == "") {
return "0KB"
}
var index = 0;
var limit = limit.toUpperCase();//转换为小写
if (limit.indexOf('B') == -1) { //如果无单位,加单位递归转换
limit = limit + "B";
//unitConver(limit);
}
var reCat = /[0-9]*[A-Z]B/;
if (!reCat.test(limit) && limit.indexOf('B') != -1) { //如果单位是b,转换为kb加单位递归
limit = limit.substring(0, limit.indexOf('B')); //去除单位,转换为数字格式
limit = (limit / 1024) + 'KB'; //换算舍入加单位
//unitConver(limit);
}
var array = new Array('KB', 'MB', 'GB', 'TB', 'PT');
for (var i = 0; i < array.length; i++) { //记录所在的位置
if (limit.indexOf(array[i]) != -1) {
index = i;
break;
}
}
var limit = parseFloat(limit.substring(0, (limit.length - 2))); //得到纯数字
while (limit >= 1024) {//数字部分1到1024之间
limit /= 1024;
index += 1;
}
limit = limit.toFixed(2) + array[index];
return limit;
};
/**
* 对象深度拷贝
* @param options
* @constructor
*/
ns.deepclone = function (obj) {
var isObject = function (obj) {
return typeof obj == 'object';
}
if (!isObject(obj)) {
throw new Error('obj 不是一个对象!')
}
//判断传进来的是对象还是数组
var isArray = Array.isArray(obj)
var cloneObj = isArray ? [] : {}
//通过for...in来拷贝
for (var key in obj) {
cloneObj[key] = isObject(obj[key]) ? ns.deepclone(obj[key]) : obj[key]
}
return cloneObj
}
/**
* 检测输入
* @param dom
* @param type
*/
ns.checkInput = function (dom) {
var new_val = $(dom).val();
var reg = /^(0|[1-9][0-9]*)(.\d{0,2})?$/;
var old_val = $(dom).attr('data-value');
if (new_val === '' || reg.test(new_val)) {
$(dom).attr('data-value', new_val);
} else {
$(dom).val(old_val);
}
}
/**
* 获取正则
* @param rule_name
* @returns {null}
*/
ns.getRegexp = function(rule_name){
let rule = null;
if(regexp_config.hasOwnProperty(rule_name)){
rule = regexp_config[rule_name];
rule = rule.replace(/^\//, '');
rule = rule.replace(/\/$/, '');
rule = new RegExp(rule);
}
return rule;
}
//打开操作弹窗
ns.openOperateIframe = function(param){
var url = param.url || '';
var success = param.success || null;
var title = param.title || '弹框';
var area = param.area || ['80%', '80%'];
var getResFunc = param.getResFunc || 'getOperateRes';
url += (url.indexOf('?') > -1 ? '&' : '?') + 'request_mode=iframe';
//iframe层-父子操作
layer.open({
title: title,
type: 2,
area: area,
fixed: false, //不固定
btn: ['确定', '取消'],
content: url,
yes: function (index, layero) {
var iframeWin = document.getElementById(layero.find('iframe')[0]['name']).contentWindow;//得到iframe页的窗口对象执行iframe页的方法
iframeWin[getResFunc](function (obj) {
if (typeof success == "string") {
try {
eval(success + '(obj)');
layer.close(index);
} catch (e) {
console.error('回调函数' + success + '未定义');
}
} else if (typeof success == "function") {
success(obj);
layer.close(index);
}
});
}
});
}
/**
* 选择优惠券
* @param param
*/
ns.selectCoupon = function (param = {}){
let select_id = param.select_id || '';
let max_num = param.max_num || 0;
let min_num = param.min_num || 0;
let success = param.success || null;
ns.openOperateIframe({
url:ns.url("coupon://shop/coupon/couponselect", {select_id: select_id, max_num:max_num, min_num:min_num}),
title: "选择优惠券",
area: ['1000px', '600px'],
getResFunc:'selectCouponListener',
success:function (res){
typeof success == 'function' && success(res);
}
})
}
/**
* 数据表格
* layui官方文档https://www.layui.com/doc/modules/table.html
* @param options
* @constructor
*/
function Table(options) {
if (!options) return;
var _self = this;
var fields = [];
for (var i = 0; i < options.cols[0].length; i++) {
if (options.cols[0][i].sort == true) {
fields.push(options.cols[0][i].field);
}
}
options.parseData = options.parseData || function (data) {
//解析数据之前的操作
if(options.beforeParseData) data = options.beforeParseData(data) || data;
$.each(data.data.list, function (index, item) {
$.each(item, function (key, value) {
if ($.inArray(key, fields) >= 0) {
data.data.list[index][key] = Number(value);
}
});
});
return {
"code": data.code,
"msg": data.message,
"count": data.data.count,
"data": data.data.list
};
};
options.request = options.request || {
limitName: 'page_size' //每页数据量的参数名默认limit
};
options.StoreAgekey = options.url +JSON.stringify(options.where);
var curr = 1;
var limit = 10;
if(getLocalStorage('tablePageLocalStoreAge')){
var obj = getLocalStorage('tablePageLocalStoreAge')[options.StoreAgekey];
if(obj) {
curr = obj.curr;
limit = obj.limit;
}
}
if (options.page == undefined) {
options.page = {
layout: ['count', 'limit', 'prev', 'page', 'next'],
curr: curr,
limit: limit
};
}
options.defaultToolbar = options.defaultToolbar || [];//'filter', 'print', 'exports'
options.toolbar = options.toolbar || "";//头工具栏事件
options.skin = options.skin || 'line';
options.size = options.size || 'lg';
options.async = (options.async != undefined) ? options.async : true;
options.done = function (res, curr, count) {
//加载图片放大
loadImgMagnify();
var tablePageLocalStoreAge = getLocalStorage('tablePageLocalStoreAge');
if (!tablePageLocalStoreAge) {
tablePageLocalStoreAge = {};
}
tablePageLocalStoreAge[options.StoreAgekey] = {
curr: curr,
limit: $('.layui-laypage-limits select[lay-ignore]').val(),
count: count,
};
tablePageLocalStoreAge[options.StoreAgekey].page = Math.ceil(count / limit);
var MAX_COUNT = 10; // 最多存储 10 个页面的分页缓存,超出则删除最开始的第一个页面
if (Object.keys(tablePageLocalStoreAge).length > MAX_COUNT) {
delete tablePageLocalStoreAge[Object.keys(tablePageLocalStoreAge)[0]];
}
setLocalStorage('tablePageLocalStoreAge', tablePageLocalStoreAge);
if (options.callback) options.callback(res, curr, count);
};
layui.use('table', function () {
_self._table = layui.table;
_self._table.render(options);
});
this.filter = options.filter || options.elem.replace(/#/g, "");
this.elem = options.elem;
this.options = options;
//获取当前选中的数据
this.checkStatus = function () {
return this._table.checkStatus(_self.elem.replace(/#/g, ""));
};
}
/**
* 监听头工具栏事件
* @param callback 回调
*/
Table.prototype.toolbar = function (callback) {
var _self = this;
var interval = setInterval(function () {
if (_self._table) {
_self._table.on('toolbar(' + _self.filter + ')', function (obj) {
var checkStatus = _self._table.checkStatus(obj.config.id);
obj.data = checkStatus.data;
obj.isAll = checkStatus.isAll;
if (callback) callback.call(this, obj);
});
clearInterval(interval);
}
}, 50);
};
/**
* 监听底部工具栏事件
* @param callback 回调
*/
Table.prototype.bottomToolbar = function (callback) {
var _self = this;
var interval = setInterval(function () {
if (_self._table) {
_self._table.on('bottomToolbar(' + _self.filter + ')', function (obj) {
var checkStatus = _self._table.checkStatus(obj.config.id);
obj.data = checkStatus.data;
obj.isAll = checkStatus.isAll;
if (callback) callback.call(this, obj);
});
clearInterval(interval);
}
}, 50);
};
/**
* 绑定layui的on事件
* @param name
* @param callback
*/
Table.prototype.on = function (name, callback) {
var _self = this;
var interval = setInterval(function () {
if (_self._table) {
_self._table.on(name + '(' + _self.filter + ')', function (obj) {
if (callback) callback.call(this, obj);
});
clearInterval(interval);
}
}, 50);
};
/**
* 表格重绘事件
* @param {Object} callback
*/
Table.prototype.resize = function (callback) {
var _self = this;
if (_self._table) {
_self._table.resize(_self.filter);
}
};
/**
* //监听行工具事件
* @param callback 回调
*/
Table.prototype.tool = function (callback) {
var _self = this;
var interval = setInterval(function () {
if (_self._table) {
_self._table.on('tool(' + _self.filter + ')', function (obj) {
if (callback) callback.call(this, obj);
});
clearInterval(interval);
}
}, 50);
};
/**
* 刷新数据
* @param options 参数参考layui数据表格参数
* @param callback 回调
*/
Table.prototype.reload = function (options, callback) {
var page = 1;
var _self = this;
if (options && options.page) {
page = options.page.curr || 1;
}
if (_self.options.StoreAgekey && getLocalStorage('tablePageLocalStoreAge')[_self.options.StoreAgekey]) {
page = getLocalStorage('tablePageLocalStoreAge')[_self.options.StoreAgekey].curr
}
options = options || {
page: {
curr: page
}
};
var interval = setInterval(function () {
if (_self._table) {
_self._table.reload(_self.elem.replace(/#/g, ""), options);
clearInterval(interval);
}
}, 50);
if (callback) setTimeout(function () {
callback()
}, 500)
};
var layedit;
/**
* 富文本编辑器
* https://www.layui.com/v1/doc/modules/layedit.html
* @param id
* @param options 参数参考layui
* @param callback 监听输入回调
* @constructor
*/
function Editor(id, options, callback) {
options = options || {};
this.id = id;
var _self = this;
layui.use(['layedit'], function () {
layedit = layui.layedit;
layedit.set({
uploadImage: {
url: ns.url("file://common/File/image")
},
callback: callback
});
_self.index = layedit.build(id, options);
});
}
/**
* 设置内容
* @param content 内容
* @param append 是否追加
*/
Editor.prototype.setContent = function (content, append) {
var _self = this;
var time = setInterval(function () {
layedit.setContent(_self.index, content, append);
clearInterval(time);
}, 150);
};
Editor.prototype.getContent = function () {
return layedit.getContent(this.index);
};
Editor.prototype.getText = function () {
return layedit.getText(this.index);
};
$(function () {
loadImgMagnify();
/* 处理日历图片点击问题 */
$(function () {
$(".calendar").parents(".layui-form-item").find("input").css({
"background": 'transparent',
'z-index': 2,
'position': 'relative'
});
});
});
//图片最大递归次数
var IMG_MAX_RECURSIVE_COUNT = 3;
var count = 0;
/**
* 加载图片放大
*/
function loadImgMagnify(container) {
if(!container) container = 'body';
setTimeout(function () {
try {
if (layer) {
$(container).find("img[src!=''][layer-src]").each(function () {
var id = getId($(this).parent());
layer.photos({
photos: "#" + id,
anim: 5
});
count = 0;
});
}
} catch (e) {
console.log(e);
}
}, 200);
}
function getId(o) {
count++;
var id = o.attr("id");
// console.log("递归次数:", count,id);
if (id == undefined && count < IMG_MAX_RECURSIVE_COUNT) {
id = getId(o.parent());
}
if (id == undefined) {
id = ns.gen_non_duplicate(10);
o.attr("id", id);
}
return id;
}
// 返回(关闭弹窗)
function back() {
layer.closeAll('page');
}
/**
* 自定义分页
* @param options
* @constructor
*/
function Page(options) {
if (!options) return;
var _self = this;
var page = 1;
var hash_arr = getHashArr();
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
switch(item_arr[0]){
case "page":
page = item_arr[1];
break;
}
}
});
options.elem = options.elem.replace(/#/g, "");// 注意:这里不能加 # 号
options.count = options.count || 0;// 数据总数。一般通过服务端得到
options.limit = options.limit || 10;// 每页显示的条数。laypage将会借助 count 和 limit 计算出分页数。
options.limits = options.limits || [10, 20, 30, 40, 50, 60, 70, 80, 90];// 每页条数的选择项。如果 layout 参数开启了 limit则会出现每页条数的select选择框
options.curr = options.curr || page;// 起始页。一般用于刷新类型的跳页以及HASH跳页
// options.hash = options.hash || 'page';// 【目前禁止使用2023-11-06-15】开启location.hash并自定义 hash 值。如果开启在触发分页时会自动对url追加#!hash值={curr} 利用这个,可以在页面载入时就定位到指定页
options.groups = options.groups || 5;// 连续出现的页码个数
options.prev = options.prev || '<i class="layui-icon layui-icon-left"></i>';// 自定义“上一页”的内容支持传入普通文本和HTML
options.next = options.next || '<i class="layui-icon layui-icon-right"></i>';// 自定义“下一页”的内容,同上
options.first = options.first || 1;// 自定义“首页”的内容,同上
options.request = options.request || {
limitName: 'page_size' //每页数据量的参数名默认limit
};
// 自定义排版。可选值有count总条目输区域、prev上一页区域、page分页区域、next下一页区域、limit条目选项区域、refresh页面刷新区域。注意layui 2.3.0 新增) 、skip快捷跳页区域
options.layout = options.layout || ['count', 'limit', 'prev', 'page', 'next'];
options.jump = function (obj, first) {
//首次不执行,一定要加此判断,否则初始时会无限刷新
if (!first) {
obj.page = obj.curr;
if (options.callback) options.callback.call(this, obj);
}
};
layui.use('laypage', function () {
_self._page = layui.laypage;
_self._page.render(options);
});
}
/**
* 表单验证
* @value options
* @item
*/
layui.use('form', function () {
var form = layui.form;
$(".layui-input").blur(function () {
var val = $(this).val().trim();
$(this).val(val);
})
$(".layui-textarea").blur(function () {
var val = $(this).val().trim();
$(this).val(val);
})
form.verify({
required: function (value, item) {
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
str = str.substring(0, str.length - 1);
if (value == null || value.trim() == "" || value == undefined || value == null) return str + "不能为空";
}
});
});
/**
* 面板折叠
* @value options
* @item
*/
layui.use('element', function () {
var element = layui.element;
element.on('collapse(selection_panel)', function (data) {
if (data.show) {
$(data.title).find("i").removeClass("layui-icon-up").addClass("layui-icon-down");
} else {
$(data.title).find("i").removeClass("layui-icon-down").addClass("layui-icon-up");
}
$(data.title).find("i").text('');
});
});
/**
* 上传
* layui官方文档https://www.layui.com/doc/modules/upload.html
* @param options
* @constructor
*/
function Upload(options) {
if (!options) return;
if(options.container){
this.options = options;
this.renderContainer();
}
if (!options.size) {
options.size = ns.uploadMaxFileSize;
}
var elemChildImg = $(options.elem).children('.preview_img')
var _self = this;
var $parent = $(options.elem).parent();
options.post = options.post || "shop";
if (options.post == 'store') options.post += '://store';
this.post = options.post;
options.url = options.url || ns.url(options.post + "/upload/image");
options.accept = options.accept || "images";
options.before = function (obj) {
// console.log("before", obj)
};
//预览
if (options.auto === false && options.bindAction) {
options.choose = function (res) {
var elemChildImg = $(options.elem).children('.preview_img');
var $parent = $(options.elem).parent();
res.preview(function (index, file, result) {
$parent.find("input[type='hidden']").val(result);
$parent.find(".del").addClass("show");
$parent.addClass('hover');
if (elemChildImg.length) {
var tempId = $(options.elem).children('.preview_img').attr('id');
var tempHtml = "<div id='" + tempId + "' class='preview_img'><img layer-src title='点击放大图片' src=" + result + " class='img_prev' data-prev='1' data-action-id='" + options.bindAction + "'></div>";
$parent.children('.upload-default').html(tempHtml);
} else {
var tempId = $(options.elem).attr('id');
var tempHtml = "<div id='preview_" + tempId + "' class='preview_img'><img layer-src title='点击放大图片' src=" + result + " class='img_prev' data-prev='1' data-action-id='" + options.bindAction + "'></div>";
$parent.children('.upload-default').html(tempHtml);
}
});
}
}
options.done = function (res, index, upload) {
try {
if (res.code >= 0) {
$parent.find("input[type='hidden']").val(res.data.pic_path);
$parent.find(".del").addClass("show");
$parent.addClass('hover');
if (res.data.pic_info) {
res.data.pic_path = res.data.pic_info.pic_path;
}
if (options.accept == 'images') {
if (elemChildImg.length) {
var tempId = $(options.elem).children('.preview_img').attr('id');
var tempHtml = "<div id='" + tempId + "' class='preview_img'><img layer-src title='点击放大图片' src=" + ns.img(res.data.pic_path) + " class='img_prev'></div>";
$parent.children('.upload-default').html(tempHtml);
} else {
var tempId = $(options.elem).attr('id');
var tempHtml = "<div id='preview_" + tempId + "' class='preview_img'><img layer-src title='点击放大图片' src=" + ns.img(res.data.pic_path) + " class='img_prev'></div>";
$parent.children('.upload-default').html(tempHtml);
}
// var tempHtml = "<div id='imgId' class='preview_img'><img layer-src title='点击放大图片' src=" + ns.img(res.data.pic_path) + " class='img_prev'></div>";
// $parent.children('.upload-default').html(tempHtml);
}
// $(options.elem).addClass("replace").removeClass("no-replace");
typeof options.callback == "function" ? options.callback(res) : "";
}else{
ns.uploadImageError(res);
}
} catch (e) {
} finally {
//加载图片放大
if (options.accept == 'images') loadImgMagnify();
// if (options.callback) options.callback(res, index, upload);
}
if (!options.callback) {
return layer.msg(res.message);
}
};
layui.use('upload', function () {
_self._upload = layui.upload;
_self._upload.render(options);
});
// this.elem = options.elem;
this.parent = $parent;
$parent.find(".js-delete").click(function () {
var path = $parent.children('.operation').siblings("input[type='hidden']").val();
if (!path) return;
_self.path = path;
$parent.children('.operation').siblings("input[type='hidden']").val("");
$parent.removeClass("hover");
$parent.find(".upload-default").html(`
<div class="upload"><i class="iconfont iconshangchuan"></i>
<p>点击上传</p></div>
`);
if (options.deleteCallback) options.deleteCallback();
$(options.elem).removeClass("hover");
});
// 预览
$parent.find(".js-preview").click(function (e) {
var id = $parent.find('.preview_img').attr('id');
$parent.find('.img_prev').click()
return false;
});
// 替换
$parent.find(".js-replace").click(function (e) {
var id = $parent.find('.upload-default').attr('id')
$parent.find('#' + id).click()
});
}
// 删除物理文件
Upload.prototype.delete = function () {
var _self = this;
$.ajax({
url: ns.url(_self.post + "/upload/deleteFile"),
data: {path: _self.path},
dataType: 'JSON',
type: 'POST',
success: function (res) {
$(_self).removeClass("show");
}
});
};
Upload.prototype.renderContainer = function (){
let that = this;
let id = $(that.options.container).attr('id');
let elem_id = id+'_upload';
let preview_id = id+'_preview';
var container_html = `
<div class="upload-img-block icon">
<div class="upload-img-box ${that.options.value ? 'hover' : ''}" >
<div class="upload-default" id="${elem_id}">
<div class="preview_img ${that.options.value ? '' : 'layui-hide'}" id="${preview_id}" >
<img layer-src src="${ns.img(that.options.value)}" class="img_prev"/>
</div>
<div class="upload ${that.options.value ? 'layui-hide' : ''}">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="${that.options.name}" lay-verify="${that.options.name}" value="${that.options.value || ''}" />
</div>
</div>
`;
$(that.options.container).html(container_html);
that.options.elem = '#'+elem_id;
}
/**
* 多图上传
* @param options
* container 容器
* max 最大数量
* data 数据
* source 数据来源 direct 直接选择 album 相册选择
* @constructor
*/
function MultiUpload(options) {
if (!options) return;
let that = this;
that.options = options;
that.data = ns.deepclone(options.data || []);
that.max = options.max || 5;
that.source = options.source;
if(['direct','album'].indexOf(that.source) === -1) that.source = 'direct';
that.layui = null;
layui.use(['laytpl', 'form', 'upload'], function () {
that.layui = layui;
that.render();
})
}
MultiUpload.prototype.template = `
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i])}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item upload_img_square add">+</div>
{{# } }}
`;
MultiUpload.prototype.getData = function (){
return this.data;
}
MultiUpload.prototype.render = function (){
let that = this;
that.layui.laytpl(that.template).render({list:that.data,max:that.max}, function (html){
$(that.options.container).html(html);
loadImgMagnify();
that.uploadEvent();
that.replaceEvent();
that.previewEvent();
that.deleteEvent();
that.dragEvent();
})
}
MultiUpload.prototype.directUpload = function(param){
let that = this;
let tempData = [];
that.layui.upload.render({
elem: param.elem,
url: ns.url('shop/upload/image'), // 实际使用时改成您自己的上传接口即可。
accept: 'image',
multiple: true,
number: param.num,
before:function (){
layer_index = layer.load();
},
done: function(res, index, upload){ // 成功的回调
index = index.split('-')[1];
tempData.push({
index : index,
path : res.data.pic_path,
});
},
allDone: function(obj){ // 多文件上传完毕后的状态回调
layer.close(layer_index);
tempData.sort((prev,next)=>{
return prev.index - next.index;
})
let list = [];
tempData.forEach((item,index)=>{
list.push(item.path);
})
typeof param.callback == 'function' && param.callback(list);
},
});
}
MultiUpload.prototype.albumUpload = function (param){
param.elem.on("click", function(){
openAlbum(function (data) {
let list = [];
for (let i = 0; i < data.length; i++) {
list.push(data[i].pic_path);
}
typeof param.callback == 'function' && param.callback(list);
}, param.num);
});
}
MultiUpload.prototype.uploadEvent = function () {
let that = this;
let uploadMethod = that.source + 'Upload';
if(typeof that[uploadMethod] == 'function'){
that[uploadMethod]({
elem : $(that.options.container).find('.upload_img_square.add'),
num : that.max - that.data.length,
callback : (res)=>{
that.data = that.data.concat(res);
if(that.data.length > that.max) that.data = that.data.slice(0, that.max - 1);
that.render();
}
});
}
}
MultiUpload.prototype.replaceEvent = function () {
let that = this;
let uploadMethod = that.source + 'Upload';
if(typeof that[uploadMethod] == 'function'){
$(that.options.container).find('.replace_img').each(function (){
let elem = this;
that[uploadMethod]({
elem : elem,
num : 1,
callback : (res)=>{
let index = $(elem).attr("data-index");
that.data[index] = res[0];
$(elem).parent().prev().find('img').attr('src', res[0]);
}
});
})
}
}
MultiUpload.prototype.previewEvent = function (){
let that = this;
$(that.options.container).find(".js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
}
MultiUpload.prototype.deleteEvent = function (){
let that = this;
$(that.options.container).find(".js-delete").click(function () {
let index = $(this).attr("data-index");
that.data.splice(index, 1);
that.render();
});
}
MultiUpload.prototype.dragEvent = function (){
let that = this;
/*$(that.options.container).find('.upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = that.data[indexBefore];
that.data[indexBefore] = that.data[indexAfter];
that.data[indexAfter] = temp;
that.render();
}
});*/
}
// 关闭组件编辑模块内容
function closeBox(obj) {
var elem = $(obj).parents(".template-edit-title").next();
if ($(elem).hasClass("layui-hide")) {
$(elem).removeClass("layui-hide");
$(obj).removeClass("closed-right");
} else {
$(elem).addClass("layui-hide");
$(obj).addClass("closed-right");
}
}
/**
* 日期时间选择
* @param options
* @constructor
*/
function LayDate(options, judge) {
// judge 判断是默认时间是否是当前~下月当天,还是上月上天~当前{nextmonth 下月 ;beformonth 上月}
if (!options) return;
var _self = this;
options.type = options.type || 'datetime';
if (options.type == "datetime") {
options.range = options.range == false ? false : true;
options.format = options.format || "yyyy-MM-dd HH:mm:ss";
if (options.range) {
var myDate = new Date();
var startData = myDate.getFullYear() + "-" + (myDate.getMonth() + 1) + "-" + myDate.getDate() + " 00:00:00",
endData = myDate.getFullYear() + "-" + (myDate.getMonth() + 1) + "-" + myDate.getDate() + " 23:59:59",
time = startData + " - " + endData;
options.value = options.value || time;
}
} else {
options.format = options.format || "yyyy-MM-dd";
}
//获取当前时间 yy-MM-dd HH:mm:ss格式
var myDate = new Date();
var currentDate = myDate.toLocaleString('chinese', {hour12: false}).split('/').join('-');
var nextmonth = '';//获取下月当天时间
var beformonth = ''; //获取下月当天时间
var defaultTime = '';//默认时间
var dateTime = [];
currentDate.split(' ')[0].split('-').forEach((item, index) => {
if (item < 10) {
dateTime.push('0' + item)
} else {
dateTime.push(item)
}
})
//当天时间
currentDate = dateTime.join('-') + ' ' + currentDate.split(' ')[1]
// 下月当天时间
nextmonth = nextmonthTime() + ' ' + '23:59:59'
// 上月当天时间
beformonth = beformonthTime() + ' ' + '00:00:00'
if (judge == 'nextmonth') {
defaultTime = currentDate + ' - ' + nextmonth
} else if (judge == 'beformonth') {
defaultTime = beformonth + ' - ' + currentDate
} else {
defaultTime = options.value
}
options.min = options.min || '1900-1-1';
options.max = options.max || options.max == 0 ? options.max : '2099-12-31';
options.trigger = options.trigger || 'focus';
options.position = options.position || "absolute";
options.zIndex = options.zIndex || 66666666;
options.value = defaultTime;
layui.use('laydate', function () {
_self._laydate = layui.laydate;
_self._laydate.render(options);
});
}
// 获取下月时间
function nextmonthTime() {
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth() + 1;
var day = now.getDate();
if (parseInt(month) < 10) {
month = "0" + month;
}
if (parseInt(day) < 10) {
day = "0" + day;
}
now = year + '-' + month + '-' + day;
// // 下月信息
var lastMonth = parseInt(month) + 1
if (parseInt(lastMonth) > 12) {
lastMonth = '01'
}
var lastSize = new Date(year, parseInt(lastMonth), 0).getDate();//下月总天数
// //十二月份取下年一月份
if (parseInt(month) == 12) {
return (parseInt(year) + 1) + '-01-' + day;
}
if (parseInt(lastSize) < parseInt(day)) {
return year + '-' + lastMonth + '-' + lastSize;
} else {
return year + '-' + lastMonth + '-' + day;
}
}
// 获取上月时间
function beformonthTime() {
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth() + 1;
var day = now.getDate();
if (parseInt(month) < 10) {
month = "0" + month;
}
if (parseInt(day) < 10) {
day = "0" + day;
}
var preMonth = parseInt(month) - 1
if (parseInt(preMonth) < 1) {
preMonth = '12'
}
var preSize = new Date(year, parseInt(preMonth), 0).getDate();//上月总天数
// 1月份取上一年的12月,年份退一年
if (parseInt(month) == 1) {
return (parseInt(year) - 1) + '-12-' + day;
}
// 获取上月天数
if (parseInt(preSize) < parseInt(day)) {
return year + '-' + preMonth + '-' + preSize;
} else {
//没有特殊情况的话,就选择个
return year + '-' + preMonth + '-' + day;
}
}
/**
* 金额格式化输入
* @param money
*/
function moneyFormat(money) {
if (isNaN(money)) return money;
return parseFloat(money).toFixed(2);
}
/**
* 颜色混合
* @param c1
* @param c2
* @param ratio
* @returns {string}
*/
function colourBlend(c1, c2, ratio) {
ratio = Math.max(Math.min(Number(ratio), 1), 0)
var r1 = parseInt(c1.substring(1, 3), 16)
var g1 = parseInt(c1.substring(3, 5), 16)
var b1 = parseInt(c1.substring(5, 7), 16)
var r2 = parseInt(c2.substring(1, 3), 16)
var g2 = parseInt(c2.substring(3, 5), 16)
var b2 = parseInt(c2.substring(5, 7), 16)
var r = Math.round(r1 * (1 - ratio) + r2 * ratio)
var g = Math.round(g1 * (1 - ratio) + g2 * ratio)
var b = Math.round(b1 * (1 - ratio) + b2 * ratio)
r = ('0' + (r || 0).toString(16)).slice(-2)
g = ('0' + (g || 0).toString(16)).slice(-2)
b = ('0' + (b || 0).toString(16)).slice(-2)
return '#' + r + g + b
}
//判空函数
ns.checkIsNotNull = function (param) {
if (param) {
if (typeof (param) == 'object') {
if (Array.isArray(param)) {
if (param.length > 0) return true
} else {
if (JSON.stringify(param) != '{}') return true
}
} else {
return true;
}
}
return false;
}
//*******本地存储*******
//设置本地存储
function setLocalStorage(key, data) {
localStorage.setItem(key, JSON.stringify(data));
}
//获取本地存储
function getLocalStorage(key) {
var data = localStorage.getItem(key);
return JSON.parse(data)
}
//删除本地存储
function removeLocalStorage(key) {
localStorage.removeItem(key)
}
// 获取当前路由url以及参数
function getRoute() {
var url = '';
var query = {};
if(location.hash){
var arr = getHashArr();
arr.forEach(function (str) {
var [key, value] = str.split('=');
if (key == 'url') {
url = value;
} else {
query[key] = value;
}
});
}else{
var path = location.href.replace(ns.baseUrl, '');
var path_info = path.split('?');
var url_info = path_info[0].replace('.html', '').split('/');
var addon = '';
if(url_info.length > 3){
addon = url_info[0];
url_info.shift();
}else if(url_info.length < 3){
for(let i = url_info.length; i < 3; i++){
url_info.push('index');
}
}
url = url_info.join('/');
if(addon) url = addon+'://'+url;
if(path_info[1]){
var params = path_info[1].split('&');
params.forEach((param)=>{
var param_info = param.split('=');
if(param_info.length === 2){
query[param_info[0]] = param_info[1];
}
})
}
}
return {
url,
query
};
}
//上传图片gd库无法处理时的提示
var uploadImageErrorExist = false;
ns.uploadImageError = function (res){
if(res.data && res.data.error_code === 'UPLOAD_IMAGE_SIZE_EXCEED_FOR_GD_DRIVER'){
if(uploadImageErrorExist) return;
uploadImageErrorExist = true;
layer.confirm('图片像素太大无法上传,像素不要超过'+res.data.max_size+'建议增加php的脚本内存限制memory_limit或将图片上传扩展由gd改为imagick。', {
title: '操作提示',
btn: ['查看文档', '我知道了'],
cancel:function (){
uploadImageErrorExist = false;
},
yes: function(index, layero) {
window.open('https://www.kancloud.cn/niucloud/niushop_b2c_v5/3065121');
},
btn2: function(index, layero) {
layer.close(index);
uploadImageErrorExist = false;
}
});
}else{
layer.msg(res.message);
}
}