| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- {extend name="base"/}
- {block name="resources"}
- <link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css" />
- <link rel="stylesheet" href="SHOP_CSS/goods_service.css" />
- {/block}
- {block name="main"}
- <!-- 搜索框 -->
- <div class="single-filter-box">
- <button class="layui-btn" onclick="addService()">添加商品服务</button>
- <div class="layui-form">
- <div class="layui-input-inline">
- <input type="text" name="search_keys" placeholder="请输入商品服务名称" autocomplete="off" class="layui-input">
- <button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
- <i class="layui-icon"></i>
- </button>
- </div>
- </div>
- </div>
- <div id="table_app">
- <!-- 列表 -->
- <table id="attr_class_list" lay-filter="attr_class_list"></table>
- </div>
- <!-- 操作 -->
- <script type="text/html" id="operation">
- <div class="table-btn">
- <a class="layui-btn" lay-event="edit">编辑</a>
- <a class="layui-btn" lay-event="delete">删除</a>
- </div>
- </script>
- <script type="text/html" id="addService">
- <div class="layui-form" id="app">
- <div class="layui-form-item">
- <label class="layui-form-label mid"><span class="required">*</span>商品服务:</label>
- <div class="layui-input-block">
- <input name="service_name" type="text" placeholder="请输入商品服务名称" lay-verify="required" class="layui-input len-mid" maxlength="20">
- </div>
- </div>
- <div class="layui-form-item">
- <label class="layui-form-label mid">描述:</label>
- <div class="layui-input-block">
- <textarea name="desc" class="layui-textarea len-mid" maxlength="150"></textarea>
- </div>
- </div>
- <div class="layui-form-item">
- <label class="layui-form-label mid">图标:</label>
- <div class="layui-input-block img-upload">
- <div class="img-icon-box">
- <img-icon-upload :data="{data:myData}"></img-icon-upload>
- <div class="action-box">
- <div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="风格" @click="iconStyle($event)"><i class="iconfont iconpifu"></i></div>
- <div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="背景" @click="selectColor('icon-color-' +id)" :id="'icon-color-' +id"><i class="iconfont iconyanse"></i></div>
- </div>
- </div>
- </div>
- </div>
- <div class="form-row mid">
- <button class="layui-btn" lay-submit lay-filter="save">保存</button>
- <button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
- </div>
- </div>
- </script>
- <script type="text/html" id="editService">
- <div class="layui-form" id="app">
- <div class="layui-form-item">
- <label class="layui-form-label mid"><span class="required">*</span>商品服务:</label>
- <div class="layui-input-block">
- <input name="service_name" type="text" value="{{ d.service_name }}" placeholder="请输入商品服务名称" lay-verify="required" class="layui-input len-mid" maxlength="20">
- </div>
- </div>
- <div class="layui-form-item">
- <label class="layui-form-label mid">描述:</label>
- <div class="layui-input-block">
- <textarea name="desc" class="layui-textarea len-mid" maxlength="150">{{ d.desc }}</textarea>
- </div>
- </div>
- <div class="layui-form-item">
- <label class="layui-form-label mid">图标:</label>
- <div class="layui-input-block img-upload">
- <div class="img-icon-box">
- <img-icon-upload :data="{data:myData}"></img-icon-upload>
- <div class="action-box">
- <div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="风格" @click="iconStyle($event)"><i class="iconfont iconpifu"></i></div>
- <div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="背景" @click="selectColor('icon-color-' +id)" :id="'icon-color-' +id"><i class="iconfont iconyanse"></i></div>
- </div>
- </div>
- </div>
- </div>
- <input type="hidden" name="id" value="{{ d.id }}">
- <div class="form-row mid">
- <button class="layui-btn" lay-submit lay-filter="edit_save">保存</button>
- <button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
- </div>
- </div>
- </script>
- {/block}
- {block name="script"}
- <script src="STATIC_JS/vue.js"></script>
- {include file="diy/iconfont_component"/}
- <script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
- <script src="STATIC_EXT/diyview/js/components.js"></script>
- <script>
- var laytpl, add_attr_index = -1,
- form, table,vue;
- layui.use(['form', 'laytpl'], function() {
- var repeat_flag = false; //防重复标识
- laytpl = layui.laytpl;
- form = layui.form;
- form.render();
- table = new Table({
- elem: '#attr_class_list',
- url: ns.url("shop/goodsservice/lists"),
- cols: [
- [ {
- field: 'service_name',
- title: '商品服务',
- unresize: 'false',
- width: '15%'
- },{
- title: '图标',
- unresize: 'false',
- width: '15%',
- align: 'center',
- templet: function (data) {
- return iconHtml(data);
- },
- }, {
- field:'desc',
- unresize: 'false',
- title: '描述',
- width: '55%',
- templet:'<div><span title="{{d.desc}}">{{d.desc}}</span></div>'
- }, {
- title: '操作',
- toolbar: '#operation',
- unresize: 'false',
- align : 'right'
- }]
- ],
- callback: function (){
- }
- });
- /**
- * 监听工具栏操作
- */
- table.tool(function(obj) {
- var data = obj.data;
- switch (obj.event) {
- case 'edit':
- editService(data);
- break;
- case 'delete':
- deleteService(data.id);
- break;
- }
- });
- /**
- * 删除
- */
- function deleteService(id) {
- layer.confirm('确认删除该服务吗?', function() {
- $.ajax({
- url: ns.url("shop/goodsservice/delete"),
- data: {
- id:id
- },
- dataType: 'JSON',
- type: 'POST',
- success: function(res) {
- layer.msg(res.message);
- if (res.code == 0) {
- table.reload();
- }
- }
- });
- });
- }
- /**
- * 搜索功能
- */
- form.on('submit(search)', function(data) {
- table.reload({
- page: {
- curr: 1
- },
- where: data.field
- });
- });
- form.on('submit(save)', function(data) {
- if (repeat_flag) return false;
- repeat_flag = true;
- data.field.icon = JSON.stringify(vue.myData)
- $.ajax({
- url: '{:addon_url("shop/goodsservice/add")}',
- data: data.field,
- dataType: 'JSON',
- type: 'POST',
- success: function(data) {
- layer.msg(data.message);
- if (data.code == 0) {
- table.reload();
- layer.close(add_attr_index);
- }
- repeat_flag = false;
- }
- });
- return false;
- });
- form.on('submit(edit_save)', function(data) {
- if (repeat_flag) return false;
- repeat_flag = true;
- data.field.icon = JSON.stringify(vue.myData)
- $.ajax({
- url: '{:addon_url("shop/goodsservice/edit")}',
- data: data.field,
- dataType: 'JSON',
- type: 'POST',
- success: function(data) {
- layer.msg(data.message);
- if (data.code == 0) {
- table.reload();
- layer.close(add_attr_index);
- }
- repeat_flag = false;
- }
- });
- return false;
- });
- /**
- * 表单验证
- */
- form.verify({
- num: function(value) {
- if (value == '') {
- return;
- }
- if (value % 1 != 0) {
- return '排序数值必须为整数';
- }
- if (value < 0) {
- return '排序数值必须为大于0';
- }
- }
- });
- });
- function iconHtml(data){
- var id = ns.gen_non_duplicate(10);
- let iconData = JSON.parse(data.icon);
- var html = '';
- if(iconData.iconType == 'img'){
- html += `
- <div class="td-box">
- <div class="icon-img-box">
- <img src="${ns.img(iconData.imageUrl)}" alt="">
- </div>
- </div>
- `;
- }else if(iconData.iconType == 'icon') {
- let iconBgStyle = '';
- let iconStyle = '';
- if(iconData.style) {
- var style = {
- 'border-radius': iconData.style.bgRadius + '%',
- 'background': ''
- };
- if (iconData.style.iconBgImg) style['background'] += 'url(' + ns.img(iconData.style.iconBgImg) + ') no-repeat bottom / contain'
- if (iconData.style.iconBgColor.length) {
- if (style.background) style.background += ',';
- if (iconData.style.iconBgColor.length == 1) {
- style.background += iconData.style.iconBgColor[0];
- } else {
- style['background'] += 'linear-gradient(' + iconData.style.iconBgColorDeg + 'deg, ' + iconData.style.iconBgColor.join(',') + ')';
- }
- }
- for (let i in style){
- iconBgStyle += i+':'+style[i]+';';
- }
- var style = {
- 'font-size': iconData.style.fontSize + '%'
- }
- if (iconData.style.iconColor.length == 1) {
- style.color = iconData.style.iconColor[0];
- } else {
- style['background'] = 'linear-gradient('+ iconData.style.iconColorDeg +'deg, '+ iconData.style.iconColor.join(',') +')';
- }
- for (let i in style){
- iconStyle += i+':'+style[i]+';';
- }
- }
- let iconClass = iconData.icon;
- if (iconData.style && iconData.style.iconColor.length > 1) iconClass += ' gradient';
- html += `
- <div class="td-box">
- <div class="icon-img-box">
- <div class="icon-wrap" style="${iconBgStyle}">
- <i class="js-icon ${iconClass}" style="${iconStyle}"></i>
- </div>
- </div>
- </div>
- `;
- }
- return html;
- }
- function addService() {
- var add_attr = $("#addService").html();
- laytpl(add_attr).render({}, function(html) {
- add_attr_index = layer.open({
- title: '添加商品服务',
- skin: 'layer-tips-class',
- type: 1,
- area: ['500px', '500px'],
- content: html,
- success: function(){
- init({
- "imageUrl": "",
- "icon" : "",
- "iconType": "icon",
- "style": '',
- });
- }
- });
- });
- }
- function editService(data) {
- var add_attr = $("#editService").html();
- laytpl(add_attr).render(data, function(html) {
- add_attr_index = layer.open({
- title: '编辑商品服务',
- skin: 'layer-tips-class',
- type: 1,
- area: ['500px', '500px'],
- content: html,
- success: function(){
- if(data.icon){
- if(isJSON(data.icon)){
- init(JSON.parse(data.icon));
- }else{
- init({
- "imageUrl": data.icon,
- "icon" : "",
- "iconType": "img",
- "style": '',
- });
- }
- }else{
- init({
- "imageUrl": "",
- "icon" : "",
- "iconType": "icon",
- "style": '',
- });
- }
- }
- });
- });
- }
- function isJSON(str) {
- if (typeof str == 'string') {
- try {
- var obj = JSON.parse(str);
- if (typeof obj == 'object' && obj) {
- return true;
- } else {
- return false;
- }
- } catch (e) {
- return false;
- }
- }
- }
- function closeAttrLayer() {
- layer.close(add_attr_index);
- }
- function init(data){
- vue = new Vue({
- el: "#app",
- data: {
- myData: {},
- id : '',
- colorPicker:{}
- },
- created: function (){
- this.id = ns.gen_non_duplicate(10);
- this.myData = data;
- loadImgMagnify();
- },
- methods: {
- // 选择图标风格
- iconStyle(event) {
- var self = this;
- selectIconStyle({
- elem: event.currentTarget,
- icon: self.myData.icon,
- callback: function (data) {
- if (data) {
- self.myData.style = data;
- } else {
- iconStyleSet({
- style: JSON.stringify(self.myData.style),
- query: {
- icon: self.myData.icon
- }
- }, function (style) {
- self.myData.style = style;
- })
- }
- }
- })
- },
- /**
- * 渲染颜色组件
- * @param id
- * @param color
- * @param callback
- */
- colorRender(id, color, callback) {
- var self = this;
- if (this.colorPicker[id]) return;
- setTimeout(function () {
- self.colorPicker[id] = Colorpicker.create({
- el: id,
- color: color,
- change: function (elem, hex) {
- callback(elem, hex)
- }
- });
- $('#' + id).click();
- }, 10)
- },
- selectColor(id) {
- let self = this;
- this.colorRender(id, '', function (elem, color) {
- if (self.myData.style['iconBgImg'] || self.myData.style['iconBgColor'].length) {
- self.myData.style['iconBgColor'] = [color];
- } else {
- self.myData.style['iconColor'] = [color];
- }
- self.$forceUpdate();
- })
- },
- previewImg(id){
- $('#'+id).find('div>img').click();
- },
- },
- mounted(){
- },
- computed: {
- }
- })
- }
- </script>
- {/block}
|