(function () { // 解决火狐浏览器拖动新增tab document.body.ondrop = function (event) { event.preventDefault(); event.stopPropagation(); }; // 默认数据 var defaultData = {}; // umeditor 实例 var $umeditor = {}; /*** * 前端可视化diy * @constructor */ function diyPhone(initalData, diyData, opts) { defaultData = initalData; this.init(diyData, opts); } diyPhone.prototype = { init: function (data, opts) { // 实例化Vue new Vue({ el: '#app', data: { // diy数据 diyData: data, // 当前选中的元素(下标) selectedIndex: -1, // 当前选中的diy元素 curItem: {}, // 外部数据 opts: opts }, error: '', methods: { /** * 新增Diy组件 * @param key */ onAddItem: function (key) { // 验证新增Diy组件 if (!this.onCheckAddItem(key)) { return false; } // 复制默认diy组件数据 var data = $.extend(true, {}, defaultData[key]); // 新增到diy列表数据 this.diyData.items.push(data); // 编辑当前选中的元素 this.onEditer(this.diyData.items.length - 1); }, /** * 验证新增Diy组件 * @param key */ onCheckAddItem: function (key) { // 验证关注公众号组件只能存在一个 if (key === 'officialAccount') { for (var index in this.diyData.items) { if (this.diyData.items.hasOwnProperty(index)) { var item = this.diyData.items[index]; if (item.type === 'officialAccount') { layer.msg('该组件最多存在一个', {anim: 6}); return false; } } } } return true; }, /** * 拖动diy元素更新当前索引 * @param e */ onDragItemEnd: function (e) { this.onEditer(e.newIndex); }, /** * 编辑当前选中的Diy元素 * @param index */ onEditer: function (index) { // 记录当前选中元素的索引 this.selectedIndex = index; // 当前选中的元素数据 this.curItem = this.selectedIndex === 'page' ? this.diyData.page : this.diyData.items[this.selectedIndex]; // 注册编辑器事件 this.initEditor(); }, /** * 删除diy元素 * @param index */ onDeleleItem: function (index) { var _this = this; layer.confirm('确定要删除吗?', function (layIdx) { _this.diyData.items.splice(index, 1); _this.selectedIndex = -1; layer.close(layIdx); }); }, /** * 编辑器:选择图片 * @param source * @param index */ onEditorSelectImage: function (source, index) { $.fileLibrary({ type: 'image', done: function (images) { source[index] = images[0]['file_path']; } }); }, /** * 编辑器:重置颜色 * @param holder * @param attribute * @param color */ onEditorResetColor: function (holder, attribute, color) { holder[attribute] = color; }, /** * 编辑器:删除data元素 * @param index * @param selectedIndex */ onEditorDeleleData: function (index, selectedIndex) { if (this.diyData.items[selectedIndex].data.length <= 1) { layer.msg('至少保留一个', {anim: 6}); return false; } this.diyData.items[selectedIndex].data.splice(index, 1); }, /** * 编辑器:添加data元素 */ onEditorAddData: function () { // 新增data数据 var newDataItem = $.extend(true, {}, defaultData[this.curItem.type].data[0]); this.curItem.data.push(newDataItem); }, /** * 注册编辑器事件 */ initEditor: function () { // 注册dom事件 this.$nextTick(function () { // 销毁 umeditor 组件 if ($umeditor.hasOwnProperty('key')) { $umeditor.destroy(); } // 注册html组件 this.editorHtmlComponent(); // 富文本事件 if (this.curItem.type === 'richText') { this.onRichText(this.curItem); } }); }, /** * 编辑器事件:html组件 */ editorHtmlComponent: function () { var $editor = $(this.$refs['diy-editor']); // 单/多选框 $editor.find('input[type=checkbox], input[type=radio]').uCheck(); // select组件 // $editor.find('select').selected(); }, /** * 编辑器事件:拼团商品选择 * @param item */ onSelectGoods: function (item) { var uris = { goods: 'goods/lists&status=10', sharingGoods: 'sharing.goods/lists&status=10', bargainGoods: 'bargain.goods/lists&status=10', sharpGoods: 'sharp.goods/lists&status=10' }; $.selectData({ title: '选择商品', uri: uris[item.type], duplicate: false, dataIndex: 'goods_id', done: function (data) { data.forEach(function (itm) { item.data.push(itm) }); }, getExistData: function () { var existData = []; item.data.forEach(function (goods) { if (goods.hasOwnProperty('goods_id')) { existData.push(goods.goods_id); } }); return existData; } }); }, /** * 选择线下门店 * @param item */ onSelectShop: function (item) { $.selectData({ title: '选择门店', uri: 'shop/lists&status=1', duplicate: false, dataIndex: 'shop_id', done: function (data) { data.forEach(function (itm) { item.data.push(itm) }); }, getExistData: function () { var existData = []; item.data.forEach(function (shop) { if (shop.hasOwnProperty('shop_id')) { existData.push(shop.shop_id); } }); return existData; } }); }, /** * 编辑器事件:富文本 */ onRichText: function (item) { $umeditor = UM.getEditor('ume-editor', { initialFrameWidth: 375, initialFrameHeight: 400 }); $umeditor.ready(function () { // 写入编辑器内容 $umeditor.setContent(item.params.content); $umeditor.addListener('contentChange', function () { item.params.content = $umeditor.getContent(); }); }); }, /** * 提交后端保存 * @returns {boolean} */ onSubmit: function () { if (this.diyData.items.length <= 0) { layer.msg('至少存在一个组件', {anim: 6}); return false; } var data = JSON.stringify(this.diyData); var timeStamp = parseInt(new Date().getTime() / 1000); localStorage.setItem("diy_" + timeStamp, data); $.post('', {data: data}, function (result) { result.code === 1 ? $.show_success(result.msg, result.url) : $.show_error(result.msg); }); } } }); } }; window.diyPhone = diyPhone; })(window);