967 lines
41 KiB
JavaScript
Executable File
967 lines
41 KiB
JavaScript
Executable File
const _token = '';
|
||
let insTb;
|
||
let Tools = {
|
||
getInsTb: function () {
|
||
return insTb;
|
||
},
|
||
setInsTb: function (ins) {
|
||
insTb = ins;
|
||
}
|
||
}
|
||
|
||
layui.use(['jquery', 'form', 'layer', 'miniTab', 'laytpl', 'table', 'skuTable'], function () {
|
||
let $ = layui.jquery, form = layui.form, layer = layui.layer,
|
||
miniTab = layui.miniTab,
|
||
skuTable = layui.skuTable,
|
||
table = layui.table;
|
||
|
||
let modifyUrl = $('#row-modify').data('url');
|
||
|
||
miniTab.listen();
|
||
|
||
// tinymce富文本编辑器 版本5.10.3没有使用6.0 因6将部分插件升级为了高级功能(独立出来了)
|
||
let tConfig = function (selector) {
|
||
return {
|
||
selector: selector,
|
||
//skin:'oxide-dark',
|
||
language:'zh_CN',
|
||
plugins: 'importword formatpainter print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave bdmap indent2em autoresize formatpainter axupimgs',
|
||
toolbar: [
|
||
'code undo redo restoredraft |importword formatpainter cut copy paste pastetext | image forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent styleselect formatselect fontselect fontsizeselect',
|
||
'pagebreak insertdatetime print preview | fullscreen | bdmap indent2em lineheight formatpainter axupimgs bullist numlist | blockquote subscript superscript removeformat table media charmap emoticons hr',
|
||
],
|
||
height: 650, //编辑器高度
|
||
min_height: 400,
|
||
convert_urls: false,
|
||
lineheight_formats : '0.1 0.2 0.5 1 1.5 2',
|
||
fontsize_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px 88px',
|
||
font_formats: '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',
|
||
// link_list: [
|
||
// { title: '预置链接1', value: 'http://www.tinymce.com' },
|
||
// { title: '预置链接2', value: 'http://tinymce.ax-z.cn' }
|
||
// ],
|
||
// image_list: [
|
||
// { title: '预置图片1', value: 'https://www.tiny.cloud/images/glyph-tinymce@2x.png' },
|
||
// { title: '预置图片2', value: 'https://www.baidu.com/img/bd_logo1.png' }
|
||
// ],
|
||
// image_class_list: [
|
||
// { title: 'None', value: '' },
|
||
// { title: 'Some class', value: 'class-name' }
|
||
// ],
|
||
images_upload_handler: function (blobInfo, succFun, failFun) {
|
||
// http://tinymce.ax-z.cn/more-plugins/axupimgs.php
|
||
var xhr, formData;
|
||
var file = blobInfo.blob();//转化为易于理解的file对象
|
||
xhr = new XMLHttpRequest();
|
||
xhr.withCredentials = false;
|
||
xhr.open('POST', '/manager/upload/tiny-image');
|
||
xhr.onload = function() {
|
||
var json;
|
||
console.log(xhr,'ss')
|
||
if (xhr.status !== 200) {
|
||
failFun('HTTP Error: ' + xhr.status + ' ' + xhr.statusText);
|
||
return;
|
||
}
|
||
json = JSON.parse(xhr.responseText);
|
||
if (!json || typeof json.location != 'string') {
|
||
failFun('Invalid JSON: ' + xhr.responseText);
|
||
return;
|
||
}
|
||
succFun(json.location);
|
||
};
|
||
formData = new FormData();
|
||
formData.append('file', file, file.name);
|
||
console.log(file, 'file')
|
||
xhr.send(formData);
|
||
},
|
||
importcss_append: true,
|
||
//自定义文件选择器的回调内容
|
||
// file_picker_callback: function (callback, value, meta) {
|
||
// if (meta.filetype === 'file') {
|
||
// callback('https://www.baidu.com/img/bd_logo1.png', { text: 'My text' });
|
||
// }
|
||
// if (meta.filetype === 'image') {
|
||
// callback('https://www.baidu.com/img/bd_logo1.png', { alt: 'My alt text' });
|
||
// }
|
||
// if (meta.filetype === 'media') {
|
||
// callback('movie.mp4', { source2: 'alt.ogg', poster: 'https://www.baidu.com/img/bd_logo1.png' });
|
||
// }
|
||
// },
|
||
toolbar_sticky: true,
|
||
autosave_ask_before_unload: false,
|
||
setup: function(editor){
|
||
editor.on('change',function(){
|
||
// editor.getContent();
|
||
// console.log(editor.getContent(), '当前内容')
|
||
// console.log(editor, 'editor')
|
||
// console.log(editor.id, 'sss')
|
||
// console.log(selector, 'selector')
|
||
// console.log('#'+editor.id, 'id')
|
||
// 内容变更时 更新到textarea
|
||
document.getElementById(editor.id).innerHTML = editor.getContent();
|
||
});
|
||
},
|
||
};
|
||
}
|
||
|
||
tinymce.init(tConfig('.tinymce-editor'));
|
||
|
||
//页面加载时,根据需要加载富文本编辑器
|
||
if ($('.editor').length) {
|
||
editor();
|
||
}
|
||
|
||
//监听配置页面提交
|
||
form.on('submit(saveConfig)', function (data) {
|
||
let url = $(data.elem).data('url');
|
||
$.post(url, data.field, function (res) {
|
||
layer.msg(res.msg);
|
||
if (res.code === 0) {
|
||
setTimeout(function () {
|
||
//关闭当前弹出层
|
||
miniTab.deleteCurrentByIframe();
|
||
}, 1000)
|
||
}
|
||
});
|
||
return false;
|
||
});
|
||
|
||
//监听提交
|
||
form.on('submit(saveBtn)', function (data) {
|
||
let url = $(data.elem).data('url');
|
||
let isTab = $(data.elem).data('tab');
|
||
let index = layer.load(2);
|
||
$.post(url, data.field, function (res) {
|
||
layer.close(index);
|
||
layer.msg(res.msg);
|
||
if (res.code === 0) {
|
||
if (isTab) {
|
||
//关闭tab
|
||
setTimeout(function () {
|
||
miniTab.deleteCurrentByIframe();
|
||
}, 1000)
|
||
} else {
|
||
//刷新父级列表
|
||
parent.layui.$('[data-table-refresh]').trigger("click");
|
||
setTimeout(function () {
|
||
//关闭当前弹出层
|
||
let iframeIndex = parent.layer.getFrameIndex(window.name);
|
||
parent.layer.close(iframeIndex);
|
||
}, 1000)
|
||
}
|
||
|
||
}
|
||
});
|
||
return false;
|
||
});
|
||
|
||
//监听关闭
|
||
form.on('submit(close)', function () {
|
||
let iframeIndex = parent.layer.getFrameIndex(window.name);
|
||
parent.layer.close(iframeIndex);
|
||
return false;
|
||
});
|
||
|
||
//监听单元格编辑
|
||
table.on('edit(table-container-filter)', function (obj) {
|
||
let insTb = Tools.getInsTb();
|
||
$.post(modifyUrl, {id: obj.data.id, field: obj.field, value: obj.value}, function (res) {
|
||
layer.msg(res.msg)
|
||
if (res.code !== 0 || obj.field === 'sort') {
|
||
refreshTab(insTb);
|
||
}
|
||
})
|
||
});
|
||
|
||
//监听状态改变
|
||
form.on('switch(changeStatus)', function (obj) {
|
||
let val = obj.elem.checked ? 1 : 0;
|
||
let insTb = Tools.getInsTb();
|
||
$.post(modifyUrl, {id: this.value, field: this.name, value: val}, function (res) {
|
||
layer.msg(res.msg)
|
||
if (res.code !== 0) {
|
||
setTimeout(function () {
|
||
refreshTab(insTb);
|
||
}, 1000)
|
||
}
|
||
})
|
||
});
|
||
|
||
// 监听搜索操作
|
||
form.on('submit(data-search-btn)', function (data) {
|
||
//执行搜索重载
|
||
table.reload('table-container', {
|
||
page: {curr: 1}
|
||
, where: {searchParams: data.field}
|
||
}, 'data');
|
||
|
||
return false;
|
||
});
|
||
|
||
//监听工具条 注意区别toolbar和tool toolbar是表头上的工具条 tool是行中的工具条
|
||
table.on('toolbar(table-container)', function (obj) {
|
||
let layEvent = obj.event;
|
||
let insTb = Tools.getInsTb();
|
||
let url = $($(this).context).data('href')
|
||
let title = $($(this).context).data('title')
|
||
let width = $($(this).context).data('width') ? $($(this).context).data('width') : '100%';
|
||
let height = $($(this).context).data('height') ? $($(this).context).data('height') : '100%';
|
||
|
||
// debugger;
|
||
switch (layEvent) {
|
||
// toolbar 删除
|
||
case 'del':
|
||
let checkStatus = table.checkStatus('table-container');
|
||
if (checkStatus.data.length <= 0) {
|
||
layer.msg('请先选择数据');
|
||
return false;
|
||
}
|
||
let selected = checkStatus.data;
|
||
let ids = [];
|
||
|
||
$.each(selected, function (index, val) {
|
||
ids.push(val.id);
|
||
})
|
||
delRow(url, ids, insTb);
|
||
return false;
|
||
// toolbar 刷新
|
||
case 'refresh':
|
||
refreshTab(insTb);
|
||
return false;
|
||
// toolbar 搜索
|
||
case 'search':
|
||
let search = $('.table-search-fieldset');
|
||
if (search.hasClass('div-show')) {
|
||
search.css('display', 'none').removeClass('div-show');
|
||
} else {
|
||
search.css('display', 'block').addClass('div-show');
|
||
}
|
||
return false;
|
||
// 其他 默认为打开弹出层
|
||
default:
|
||
if (layEvent !== 'LAYTABLE_COLS' && layEvent !== 'LAYTABLE_EXPORT') {
|
||
openLayer(url, title, width, height);
|
||
return false;
|
||
}
|
||
}
|
||
});
|
||
|
||
//监听行工具条
|
||
table.on('tool(table-container)', function (obj) {
|
||
let data = obj.data;
|
||
let layEvent = obj.event;
|
||
let url = $($(this).context).data('href');
|
||
let title = $($(this).context).data('title');
|
||
let width = $($(this).context).data('width') ? $($(this).context).data('width') : '100%';
|
||
let height = $($(this).context).data('height') ? $($(this).context).data('height') : '100%';
|
||
let insTb = Tools.getInsTb();
|
||
|
||
switch (layEvent) {
|
||
// 行 删除
|
||
case 'del':
|
||
let ids = [data.id];
|
||
delRow(url, ids, insTb);
|
||
return false;
|
||
//其他 默认为打开弹出层
|
||
default:
|
||
openLayer(url, title, width, height);
|
||
return false;
|
||
}
|
||
});
|
||
|
||
/** 图片预览 **/
|
||
$('body').on('click', '.layui-layer-photos', function () {
|
||
layer.photos({
|
||
photos: '.layui-layer-photos' // 指向图片的父容器
|
||
,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(3.0之前的版本用shift参数)
|
||
});
|
||
})
|
||
|
||
});
|
||
|
||
//富文本编辑器,单页面可以添加多个,需要使用不同的ID TODO 使用的原CMS操作
|
||
function editor() {
|
||
layui.use(['jquery', 'wangEditor'], function () {
|
||
let $ = layui.jquery, E = layui.wangEditor;
|
||
if ($('.editor').length) {
|
||
$.each($('.editor'), function (i) {
|
||
var wang = new E(this);
|
||
var $text1 = $(this).parent().find('textarea');
|
||
wang.customConfig.onchange = function (html) {
|
||
// 监控变化,同步更新到 textarea
|
||
$text1.val(html)
|
||
}
|
||
|
||
wang.customConfig.pasteTextHandle = function (content) {
|
||
if (content == '' && !content) return '';//其中content就是你zhantie过来的原始的文本
|
||
return removeFormatWrd(content);
|
||
};
|
||
|
||
function removeFormatWrd(html) {
|
||
// console.log(html)
|
||
// html = html.replace(/<xml>[\s\S]*?<\/xml>/ig, '');
|
||
// html = html.replace(/<style>[\s\S]*?<\/style>/ig, '');
|
||
// html = html.replace(/<\/?[^>]*>/g, '');
|
||
// html = html.replace(/[ | ]*\n/g, '\n');
|
||
// html = html.replace(/ /ig, '');
|
||
//上面代码是不要任何样式,纯文本
|
||
|
||
//下面代码,保留从相关文档中的粘贴过来时的样式
|
||
html = html.replace(/<\/?SPANYES[^>]*>/gi, "");// Remove all SPAN tags
|
||
html = html.replace(/<(\w[^>]*) class=([^|>]*)([^>]*)/gi, "<$1$3"); // Remove Class attributes
|
||
html = html.replace(/<(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3"); // Remove Style attributes
|
||
html = html.replace(/<(\w[^>]*) lang=([^|>]*)([^>]*)/gi, "<$1$3");// Remove Lang attributes
|
||
html = html.replace(/<?xml[^>]*>/gi, "");// Remove XML elements and declarations
|
||
html = html.replace(/<\/?\w+:[^>]*>/gi, "");// Remove Tags with XML namespace declarations: <o:p></o:p>
|
||
html = html.replace(/ /, "");// Replace the
|
||
html = html.replace(/<xml>[\s\S]*?<\/xml>/ig, '');
|
||
html = html.replace(/<html>[\s\S]*?<\/html>/ig, '');
|
||
html = html.replace(/<head>[\s\S]*?<\/head>/ig, '');
|
||
html = html.replace(/<style>[\s\S]*?<\/style>/ig, '');
|
||
html = html.replace(/<html<body/ig, '<html><body');
|
||
html = html.replace(/<\/html<body>/ig, '</body></html>');
|
||
html = html.replace(/\n(\n)*( )*(\n)*\n/gi, '\n');
|
||
return html;
|
||
}
|
||
|
||
wang.customConfig.menus = [
|
||
'head', // 标题
|
||
'bold', // 粗体
|
||
'fontSize', // 字号
|
||
'fontName', // 字体
|
||
'italic', // 斜体
|
||
'underline', // 下划线
|
||
'strikeThrough', // 删除线
|
||
'foreColor', // 文字颜色
|
||
'backColor', // 背景颜色
|
||
'link', // 插入链接
|
||
'list', // 列表
|
||
'justify', // 对齐方式
|
||
'quote', // 引用
|
||
'emoticon', // 表情
|
||
'image', // 插入图片
|
||
'table', // 表格
|
||
'video', // 插入视频
|
||
'code', // 插入代码
|
||
'undo', // 撤销
|
||
'redo', // 重复
|
||
]
|
||
// 隐藏“网络图片”tab
|
||
wang.customConfig.showLinkImg = true
|
||
wang.customConfig.uploadFileName = 'wang_img[]'
|
||
wang.customConfig.showLinkVideo = true
|
||
|
||
wang.customConfig.uploadImgHooks = {
|
||
before: function (xhr, editor, files) {
|
||
// 图片上传之前触发
|
||
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件
|
||
// 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
|
||
},
|
||
success: function (xhr, editor, result) {
|
||
// 图片上传并返回结果,图片插入成功之后触发
|
||
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
|
||
},
|
||
fail: function (xhr, editor, result) {
|
||
// 图片上传并返回结果,但图片插入错误时触发
|
||
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
|
||
},
|
||
error: function (xhr, editor) {
|
||
// 图片上传出错时触发
|
||
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
|
||
},
|
||
timeout: function (xhr, editor) {
|
||
// 图片上传超时时触发
|
||
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
|
||
},
|
||
// 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
|
||
// (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
|
||
customInsert: function (insertImg, result, editor) {
|
||
// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
|
||
// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
|
||
// console.log(result);
|
||
if (result.errno == 0) {
|
||
if (result.data.length > 0) {
|
||
$.each(result.data, function (i, val) {
|
||
insertImg(val);
|
||
})
|
||
}
|
||
} else {
|
||
// 错误提示
|
||
layer.msg(result.data[0])
|
||
}
|
||
}
|
||
}
|
||
wang.customConfig.uploadImgParams = {_token: _token}
|
||
wang.customConfig.uploadVideoParams = {_token: _token}
|
||
|
||
//上传视频
|
||
wang.customConfig.uploadVideoServer = "/manager/upload/video.html"
|
||
|
||
wang.customConfig.uploadVideoHooks = {
|
||
customInsert: function (insertImg, result, editor) {
|
||
var url = result.data.src;//获取后台返回的url
|
||
insertImg(url);
|
||
}
|
||
};
|
||
|
||
wang.customConfig.uploadImgServer = '/manager/upload/wangImage.html'
|
||
wang.customConfig.customAlert = function (info) {
|
||
// info 是需要提示的内容
|
||
layer.msg(info)
|
||
}
|
||
wang.create();
|
||
wang.txt.html($text1.val())
|
||
$text1.val(wang.txt.html())
|
||
|
||
editorSelector = '.editor';
|
||
$(editorSelector + " .w-e-toolbar").eq(i).append('<div class="w-e-menu"><a class="_wangEditor_btn_fullscreen" onclick="window.wangEditor.fullscreen.toggleFullscreen(this)">全屏</a></div>');
|
||
window.wangEditor.fullscreen = {
|
||
// editor create之后调用
|
||
toggleFullscreen: function (editorSelector) {
|
||
$(editorSelector).closest('.editor-text').toggleClass('fullscreen-editor')
|
||
if ($(editorSelector).text() == '全屏') {
|
||
$(editorSelector).text('退出全屏');
|
||
} else {
|
||
$(editorSelector).text('全屏');
|
||
}
|
||
},
|
||
charu: function (obj) {
|
||
insertHtmlAtCaret('<img src="' + $(obj).attr('src') + '">', $(obj).closest('.editor').find('.w-e-text'))
|
||
$(obj).closest('.editor').find('.w-e-panel-container').remove();
|
||
}
|
||
};
|
||
$(editorSelector + " .w-e-toolbar").eq(i).append('<div class="w-e-menu"><a class="_wangEditor_btn_viewsource' + i + '" data-id="' + i + '" onclick="window.wangEditor.viewsource.toggleViewsource(this)">源码</a></div>');
|
||
window.wangEditor.viewsource = {
|
||
toggleViewsource: function (editorSelector) {
|
||
$('.editor').each(function (i) {
|
||
if ($(editorSelector).attr('data-id') == i) {
|
||
if ($(editorSelector).text() == '源码') {
|
||
$(editorSelector).text('返回');
|
||
$(this).addClass('active')
|
||
$(this).parent().find('textarea.layui-textarea').removeClass('layui-hide')
|
||
} else {
|
||
$(editorSelector).text('源码');
|
||
$(this).removeClass('active')
|
||
$(this).parent().find('textarea.layui-textarea').addClass('layui-hide')
|
||
}
|
||
}
|
||
})
|
||
}, recovery: function (editorSelector) {
|
||
$('.editor').each(function (i) {
|
||
if ($(editorSelector).text() == '返回') {
|
||
editorHtml = $(editorSelector).closest('.editor').find('.w-e-text').html().replace(/</ig, "<").replace(/>/ig, ">").replace(/ /ig, " ");
|
||
$(editorSelector).text('源码');
|
||
$(editorSelector).closest('.editor').find('.w-e-text').html(editorHtml);
|
||
$(editorSelector).closest('.editor').parent().find('textarea').val(editorHtml)
|
||
}
|
||
})
|
||
}
|
||
};
|
||
$(editorSelector + " .w-e-toolbar").eq(i).append('<div class="w-e-menu"><a class="_wangEditor_btn_eliminate' + i + '" data-id="' + i + '" onclick="window.wangEditor.eliminate.toggleViewsource(this)">清除格式</a></div>');
|
||
window.wangEditor.eliminate = {
|
||
toggleViewsource: function (editorSelector) {
|
||
$('.editor').each(function (i) {
|
||
if ($(editorSelector).attr('data-id') == i) {
|
||
var str = $(editorSelector).closest('.editor').find('.w-e-text').html();
|
||
str = str.replace(/<xml>[\s\S]*?<\/xml>/ig, '');
|
||
str = str.replace(/<style>[\s\S]*?<\/style>/ig, '');
|
||
str = str.replace(/<\/?[^>]*>/g, '');
|
||
str = str.replace(/[ | ]*\n/g, '\n');
|
||
str = str.replace(/ /ig, '');
|
||
$(editorSelector).closest('.editor').find('.w-e-text').html(str);
|
||
}
|
||
})
|
||
}
|
||
};
|
||
var that = $(this)
|
||
that.removeClass('active');
|
||
that.parent().find('textarea').addClass('layui-hide')
|
||
that.parent().find('textarea').on('input propertychange', function () {
|
||
that.find('.w-e-text').html($(this).val())
|
||
})
|
||
});
|
||
}
|
||
})
|
||
|
||
getblur();
|
||
}
|
||
|
||
let fwqpage = 2;
|
||
|
||
function renderSku(productId, productTypeId, multiSpec, option = []) {
|
||
layui.use(['skuTable'], function () {
|
||
let skuTable = layui.skuTable;
|
||
window.skuTableObj = skuTable.render({
|
||
isAttributeElemId: 'fairy-is-attribute',
|
||
productTypeElemId: 'fairy-product-type',
|
||
attributeTableElemId: 'fairy-attribute-table',
|
||
specTableElemId: 'fairy-spec-table',
|
||
skuTableElemId: 'fairy-sku-table',
|
||
//商品规格模式 0单规格 1多规格
|
||
mode: multiSpec,
|
||
//商品仅允许选择的规格模式 0单规格 1多规格 不填则都可选
|
||
onlyMode: option['onlyMode'],
|
||
//是否开启sku表行合并
|
||
rowspan: true,
|
||
//图片上传接口
|
||
uploadUrl: '/manager/mall/sku/upload',
|
||
//获取商品类型接口
|
||
productTypeUrl: '/manager/mall/sku/spuTypeData',
|
||
//获取商品类型下的规格和属性接口
|
||
attrSpecUrl: '/manager/mall/sku/attrSpecData?product_id='+productId,
|
||
//创建规格接口
|
||
specCreateUrl: '/manager/mall/sku/specCreate?product_id='+productId,
|
||
//删除规格接口 此处添加了product_id
|
||
specDeleteUrl: '/manager/mall/sku/specDelete?product_id='+productId,
|
||
//创建规格值接口
|
||
specValueCreateUrl: '/manager/mall/sku/specValueCreate?product_id='+productId,
|
||
//删除规格值接口 此处添加了product_id
|
||
specValueDeleteUrl: '/manager/mall/sku/specValueDelete?product_id='+productId,
|
||
//单规格SKU表配置
|
||
singleSkuTableConfig: {
|
||
thead: [
|
||
{title: '销售价(元)', icon: 'layui-icon-cols'},
|
||
{title: '原价(元)', icon: 'layui-icon-cols'},
|
||
{title: '库存', icon: 'layui-icon-cols'},
|
||
{title: '默认SKU', icon: ''},
|
||
// {title: '状态', icon: ''},
|
||
],
|
||
tbody: [
|
||
{type: 'input', field: 'skus[price]', value: '0', verify: 'required|number', reqtext: '销售价不能为空'},
|
||
{type: 'input', field: 'skus[original_price]', value: '0', verify: 'required|number', reqtext: '原价不能为空'},
|
||
{type: 'input', field: 'skus[stock]', value: '0', verify: 'required|number', reqtext: '库存不能为空'},
|
||
{type: 'select', field: 'skus[is_default]', option: [{key: '是', value: '1'}, {key: '否', value: '0'}], verify: 'required', reqtext: '默认SKU不能为空'},
|
||
// {type: 'select', field: 'skus[status]', option: [{key: '启用', value: '1'}, {key: '禁用', value: '0'}], verify: 'required', reqtext: '状态不能为空'},
|
||
]
|
||
},
|
||
//多规格SKU表配置
|
||
multipleSkuTableConfig: {
|
||
thead: [
|
||
{title: '图片', icon: ''},
|
||
{title: '销售价(元)', icon: 'layui-icon-cols'},
|
||
{title: '原价(元)', icon: 'layui-icon-cols'},
|
||
{title: '库存', icon: 'layui-icon-cols'},
|
||
{title: '默认SKU', icon: ''},
|
||
// {title: '状态', icon: ''},
|
||
],
|
||
tbody: [
|
||
{type: 'image', field: 'picture', value: '', verify: '', reqtext: ''},
|
||
{type: 'hide', field: 'id', value: '', verify: '', reqtext: ''},
|
||
{type: 'hide', field: 'coding', value: '', verify: '', reqtext: ''},
|
||
{type: 'input', field: 'price', value: '0', verify: 'required|number', reqtext: '销售价不能为空'},
|
||
{type: 'input', field: 'original_price', value: '0', verify: 'required|number', reqtext: '原价不能为空'},
|
||
{type: 'input', field: 'stock', value: '0', verify: 'required|number', reqtext: '库存不能为空'},
|
||
{
|
||
type: 'select',
|
||
field: 'is_default',
|
||
option: [{key: '否', value: '0'}, {key: '是', value: '1'}],
|
||
verify: '',
|
||
reqtext: ''
|
||
},
|
||
// {
|
||
// type: 'select',
|
||
// field: 'status',
|
||
// option: [{key: '启用', value: '1'}, {key: '禁用', value: '0'}],
|
||
// verify: '',
|
||
// reqtext: ''
|
||
// },
|
||
]
|
||
},
|
||
// ========================================== 回显时相关配置参数 ========================================== //
|
||
//商品id
|
||
productId: productId,
|
||
//商品类型id
|
||
productTypeId: productTypeId,
|
||
//sku数据接口
|
||
// skuDataUrl: '/static/manager/js/mall/json/skuData.json',
|
||
skuDataUrl: '/manager/mall/sku/skuData',
|
||
});
|
||
})
|
||
|
||
// return skuTableObj;
|
||
}
|
||
|
||
function getImgList(id) {
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery
|
||
|
||
var html = '';
|
||
var pageBtn = '';
|
||
fwqpage = 1;
|
||
$.ajax('/manager/file/list', {
|
||
data: {
|
||
type: 'img',
|
||
page: fwqpage,
|
||
size: 20
|
||
},
|
||
headers: {
|
||
'X-CSRF-TOKEN': _token
|
||
},
|
||
dataType: 'json',//服务器返回json格式数据
|
||
type: 'post',//HTTP请求类型
|
||
timeout: 10000,//超时时间设置为10秒;
|
||
success: function (data) {
|
||
if (data.code == 0) {
|
||
if (data.data.length > 0) {
|
||
$.each(data.data, function (i, item) {
|
||
html += '<span><img src="' + item.src + '" onclick="window.wangEditor.fullscreen.charu(this)"></span>'
|
||
})
|
||
$('#' + id).closest('.editor').find('.w-e-serverImgs .top-box').append(html)
|
||
if (data.data.length >= 20) {
|
||
pageBtn = '<a href="javascript:;" data-id="' + id + '" onclick="getImgMore(this)">加载更多</a>';
|
||
$('#' + id).closest('.editor').find('.w-e-serverImgs .lower-box').append(pageBtn)
|
||
}
|
||
} else {
|
||
layer.msg(data.msg)
|
||
}
|
||
}
|
||
},
|
||
error: function (xhr, type, errorThrown) {
|
||
|
||
}
|
||
});
|
||
})
|
||
}
|
||
|
||
function getImgMore(obj) {
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery
|
||
|
||
let html = '';
|
||
let pageBtn = '';
|
||
let id = $(obj).attr('data-id');
|
||
$.ajax('/manager/file/list', {
|
||
data: {
|
||
type: 'img',
|
||
page: fwqpage,
|
||
size: 20
|
||
},
|
||
headers: {
|
||
'X-CSRF-TOKEN': _token
|
||
},
|
||
dataType: 'json',//服务器返回json格式数据
|
||
type: 'post',//HTTP请求类型
|
||
timeout: 10000,//超时时间设置为10秒;
|
||
success: function (data) {
|
||
if (data.code == 0) {
|
||
if (data.data.length > 0) {
|
||
$.each(data.data, function (i, item) {
|
||
html += '<span><img src="' + item.src + '" onclick="window.wangEditor.fullscreen.charu(this)"></span>'
|
||
})
|
||
$('#' + id).closest('.editor').find('.w-e-serverImgs .top-box').append(html)
|
||
if (data.data.length < 20) {
|
||
pageBtn = '没有了';
|
||
$('#' + id).closest('.editor').find('.w-e-serverImgs .lower-box').html(pageBtn)
|
||
} else {
|
||
fwqpage++
|
||
}
|
||
} else {
|
||
layer.msg(data.msg)
|
||
}
|
||
}
|
||
},
|
||
error: function (xhr, type, errorThrown) {
|
||
|
||
}
|
||
});
|
||
})
|
||
|
||
}
|
||
|
||
|
||
var sel, range;
|
||
var textContent;
|
||
|
||
function getblur() {
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery
|
||
$('.editor .w-e-text').click(function () {
|
||
sel = window.getSelection();
|
||
range = sel.getRangeAt(0);
|
||
//range.deleteContents();
|
||
})
|
||
})
|
||
}
|
||
|
||
function insertHtmlAtCaret(html, obj) {
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery
|
||
if (window.getSelection) {
|
||
// IE9 and non-IE
|
||
if (sel != undefined) {
|
||
if (sel.getRangeAt && sel.rangeCount) {
|
||
var el = document.createElement("div");
|
||
el.innerHTML = html;
|
||
var frag = document.createDocumentFragment(), node, lastNode;
|
||
while ((node = el.firstChild)) {
|
||
lastNode = frag.appendChild(node);
|
||
}
|
||
range.insertNode(frag);
|
||
// Preserve the selection
|
||
if (lastNode) {
|
||
range = range.cloneRange();
|
||
range.setStartAfter(lastNode);
|
||
range.collapse(true);
|
||
sel.removeAllRanges();
|
||
sel.addRange(range);
|
||
}
|
||
}
|
||
} else {
|
||
$(obj).append(html)
|
||
}
|
||
} else if (document.selection && document.selection.type != "Control") {
|
||
// IE < 9
|
||
document.selection.createRange().pasteHTML(html);
|
||
}
|
||
textContent = $(obj).html();//这个也很重要。因为如果不写可能就会覆盖了原来内容替换成你添加的。或者是干脆不显示了。textContent是全局变量是你输入的内容。
|
||
$(obj).closest('.editor').parent().find('textarea').val(textContent)
|
||
})
|
||
}
|
||
|
||
function limitContentLength(elm, len) {
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery
|
||
var newString = $(elm).val().slice(0, len);
|
||
$(elm).val(newString);
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 弹窗重新渲染的内容
|
||
* @param filter lay-filter
|
||
* @param iconName 图标名称,自动识别fontClass/unicode
|
||
*/
|
||
function alertRender() {
|
||
layui.use(['jquery', 'form', 'iconPickerFa'], function () {
|
||
var form = layui.form, iconPicker = layui.iconPickerFa, $ = layui.jquery
|
||
form.render();
|
||
iconPicker.render({
|
||
// 选择器,推荐使用input
|
||
elem: '#iconPicker',
|
||
// 数据类型:fontClass/unicode,推荐使用fontClass
|
||
type: 'fontClass',
|
||
// 是否开启搜索:true/false
|
||
search: true,
|
||
// 是否开启分页
|
||
page: true,
|
||
// 每页显示数量,默认12
|
||
limit: 12,
|
||
// 点击回调
|
||
click: function (data) {
|
||
},
|
||
// 渲染成功后的回调
|
||
success: function (d) {
|
||
$('#iconPicker').val('iconpicker');
|
||
}
|
||
});
|
||
var iconStr = $('#iconPicker').val();
|
||
if (iconStr) {
|
||
iconPicker.checkIcon('iconPicker', iconStr);
|
||
} else {
|
||
iconPicker.checkIcon('iconPicker', 'layui-icon-star-fill');
|
||
}
|
||
})
|
||
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery
|
||
setTimeout(function () {
|
||
$(window).trigger("resize");
|
||
}, 100)
|
||
})
|
||
}
|
||
|
||
//打开弹出层
|
||
function openLayer(url, title, width = '100%', height = '100%') {
|
||
layui.use(['jquery', 'layer'], function () {
|
||
let $ = layui.jquery, layer = layui.layer;
|
||
|
||
let index = layer.open({
|
||
title: title,
|
||
type: 2,
|
||
shade: 0.2,
|
||
maxmin: true,
|
||
shadeClose: true,
|
||
area: [width, height],
|
||
content: url,
|
||
});
|
||
|
||
$(window).on("resize", function () {
|
||
layer.full(index);
|
||
});
|
||
})
|
||
}
|
||
|
||
//删除行
|
||
function delRow(url, ids, instance, msg) {
|
||
layui.use(['jquery', 'layer'], function () {
|
||
let $ = layui.jquery, layer = layui.layer;
|
||
|
||
msg = (msg === null || msg === undefined) ? '确认删除吗?' : msg;
|
||
let index = layer.confirm(msg, {
|
||
btn: ['确认', '取消'], //按钮
|
||
title: '操作提示',
|
||
}, function () {
|
||
$.post(url, {ids: ids}, function (res) {
|
||
layer.close(index)
|
||
layer.msg(res.msg)
|
||
if (res.code === 0) {
|
||
instance.reload();
|
||
}
|
||
})
|
||
}, function () {
|
||
layer.close(index)
|
||
return false;
|
||
});
|
||
})
|
||
}
|
||
|
||
// 刷新Tab
|
||
function refreshTab(insTb) {
|
||
insTb.reload();
|
||
}
|
||
|
||
// 获取文件访问路径
|
||
function getFileRequestUrl(url) {
|
||
let ele = document.getElementById('fileDomain');
|
||
let fileDomain = '';
|
||
if (ele) {
|
||
fileDomain = ele.getAttribute('data-oss');
|
||
}
|
||
|
||
if (url !== undefined && url.length > 4) {
|
||
let prefix = url.substr(0, 4);
|
||
if (prefix === 'http') {
|
||
return url;
|
||
} else {
|
||
return fileDomain + url;
|
||
}
|
||
} else {
|
||
return url;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 和PHP一样的时间戳格式化函数
|
||
* @param {string} format 格式
|
||
* @param {int} timestamp 要格式化的时间 默认为当前时间 (10位数)
|
||
* @return {string} 格式化的时间字符串
|
||
*/
|
||
function date(format, timestamp){
|
||
var jsdate=((timestamp) ? new Date(timestamp*1000) : new Date());
|
||
var pad = function(n, c){
|
||
if((n = n + "").length < c){
|
||
return new Array(++c - n.length).join("0") + n;
|
||
} else {
|
||
return n;
|
||
}
|
||
};
|
||
var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
||
var txt_ordin = {1:"st", 2:"nd", 3:"rd", 21:"st", 22:"nd", 23:"rd", 31:"st"};
|
||
var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||
var f = {
|
||
// Day
|
||
d: function(){return pad(f.j(), 2)},
|
||
D: function(){return f.l().substr(0,3)},
|
||
j: function(){return jsdate.getDate()},
|
||
l: function(){return txt_weekdays[f.w()]},
|
||
N: function(){return f.w() + 1},
|
||
S: function(){return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th'},
|
||
w: function(){return jsdate.getDay()},
|
||
z: function(){return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0},
|
||
|
||
// Week
|
||
W: function(){
|
||
var a = f.z(), b = 364 + f.L() - a;
|
||
var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
|
||
if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
|
||
return 1;
|
||
} else{
|
||
if(a <= 2 && nd >= 4 && a >= (6 - nd)){
|
||
nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
|
||
return date("W", Math.round(nd2.getTime()/1000));
|
||
} else{
|
||
return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
|
||
}
|
||
}
|
||
},
|
||
|
||
// Month
|
||
F: function(){return txt_months[f.n()]},
|
||
m: function(){return pad(f.n(), 2)},
|
||
M: function(){return f.F().substr(0,3)},
|
||
n: function(){return jsdate.getMonth() + 1},
|
||
t: function(){
|
||
var n;
|
||
if( (n = jsdate.getMonth() + 1) == 2 ){
|
||
return 28 + f.L();
|
||
} else{
|
||
if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
|
||
return 31;
|
||
} else{
|
||
return 30;
|
||
}
|
||
}
|
||
},
|
||
|
||
// Year
|
||
L: function(){var y = f.Y();return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0},
|
||
//o not supported yet
|
||
Y: function(){return jsdate.getFullYear()},
|
||
y: function(){return (jsdate.getFullYear() + "").slice(2)},
|
||
|
||
// Time
|
||
a: function(){return jsdate.getHours() > 11 ? "pm" : "am"},
|
||
A: function(){return f.a().toUpperCase()},
|
||
B: function(){
|
||
// peter paul koch:
|
||
var off = (jsdate.getTimezoneOffset() + 60)*60;
|
||
var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
|
||
var beat = Math.floor(theSeconds/86.4);
|
||
if (beat > 1000) beat -= 1000;
|
||
if (beat < 0) beat += 1000;
|
||
if ((String(beat)).length == 1) beat = "00"+beat;
|
||
if ((String(beat)).length == 2) beat = "0"+beat;
|
||
return beat;
|
||
},
|
||
g: function(){return jsdate.getHours() % 12 || 12},
|
||
G: function(){return jsdate.getHours()},
|
||
h: function(){return pad(f.g(), 2)},
|
||
H: function(){return pad(jsdate.getHours(), 2)},
|
||
i: function(){return pad(jsdate.getMinutes(), 2)},
|
||
s: function(){return pad(jsdate.getSeconds(), 2)},
|
||
//u not supported yet
|
||
|
||
// Timezone
|
||
//e not supported yet
|
||
//I not supported yet
|
||
O: function(){
|
||
var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
|
||
if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
|
||
return t;
|
||
},
|
||
P: function(){var O = f.O();return (O.substr(0, 3) + ":" + O.substr(3, 2))},
|
||
//T not supported yet
|
||
//Z not supported yet
|
||
|
||
// Full Date/Time
|
||
c: function(){return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P()},
|
||
//r not supported yet
|
||
U: function(){return Math.round(jsdate.getTime()/1000)}
|
||
};
|
||
|
||
return format.replace(/[\]?[a-zA-Z]/g, function(t){
|
||
let ret = '';
|
||
if (f[t]) {
|
||
ret = f[t]();
|
||
}
|
||
return ret;
|
||
});
|
||
}
|
||
|
||
function refreshBtn() {
|
||
layui.use(['jquery'], function () {
|
||
let $ = layui.jquery;
|
||
|
||
$('[data-table-refresh]').trigger("click");
|
||
})
|
||
} |