src/main/java/cc/mrbird/febs/vip/controller/AdminMallVipConfigController.java
@@ -28,9 +28,20 @@ } @PostMapping(value = "/add") public FebsResponse add(@RequestBody MallVipConfig config) { mallVipConfigService.addVipConfig(config); @PostMapping(value = "/addOrEdit") public FebsResponse addOrEdit(@RequestBody MallVipConfig config) { if (config.getType() == 1) { config.setTimes(null); config.setAmount(null); } else { config.setTargetId(null); } if (config.getId() == null) { mallVipConfigService.addVipConfig(config); } else { mallVipConfigService.editVipConfig(config); } return new FebsResponse().success().message("操作成功"); } src/main/java/cc/mrbird/febs/vip/controller/ViewVipConfigController.java
@@ -7,8 +7,13 @@ import cc.mrbird.febs.mall.mapper.MallGoodsCouponMapper; import cc.mrbird.febs.mall.service.IApiMallGoodsService; import cc.mrbird.febs.vip.entity.MallVipBenefits; import cc.mrbird.febs.vip.entity.MallVipConfig; import cc.mrbird.febs.vip.entity.MallVipConfigBenefits; import cc.mrbird.febs.vip.service.IMallVipBenefitsService; import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService; import cc.mrbird.febs.vip.service.IMallVipConfigService; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -29,6 +34,8 @@ private final IMallVipBenefitsService mallVipBenefitsService; private final IApiMallGoodsService apiMallGoodsService; private final MallGoodsCouponMapper mallGoodsCouponMapper; private final IMallVipConfigService mallVipConfigService; private final IMallVipConfigBenefitsService mallVipConfigBenefitsService; @GetMapping(value = "/benefitsList") public String benefitsList() { @@ -120,8 +127,23 @@ return FebsUtil.view("modules/vip/vipConfig-add"); } @GetMapping(value = "/levelEdit") public String levelEdit() { return FebsUtil.view("modules/vip/vipLevel-list"); @GetMapping(value = "/levelEdit/{id}") public String levelEdit(@PathVariable("id") Long id, Model model) { MallVipConfig vipConfig = mallVipConfigService.getById(id); if (vipConfig.getType() == 1) { MallGoods goods = apiMallGoodsService.getById(vipConfig.getTargetId()); vipConfig.setTargetId(goods.getId()); vipConfig.setTargetName(goods.getGoodsName()); } LambdaQueryWrapper<MallVipConfigBenefits> configBenefitsQuery = new LambdaQueryWrapper<>(); configBenefitsQuery.eq(MallVipConfigBenefits::getConfigId, vipConfig.getId()); List<MallVipConfigBenefits> list = mallVipConfigBenefitsService.list(configBenefitsQuery); List<Long> benefitsIds = list.stream().map(MallVipConfigBenefits::getBenefitsId).collect(Collectors.toList()); vipConfig.setBenefitsIdList(benefitsIds); model.addAttribute("configData", vipConfig); return FebsUtil.view("modules/vip/vipConfig-edit"); } } src/main/java/cc/mrbird/febs/vip/entity/MallVipConfig.java
@@ -57,8 +57,14 @@ private Long targetId; @TableField(exist = false) private String targetName; @TableField(exist = false) private List<MallVipBenefits> benefits; @TableField(exist = false) private String benefitsIds; @TableField(exist = false) private List<Long> benefitsIdList; } src/main/java/cc/mrbird/febs/vip/service/IMallVipConfigService.java
@@ -15,5 +15,7 @@ void addVipConfig(MallVipConfig config); void editVipConfig(MallVipConfig config); void delVipConfig(Long id); } src/main/java/cc/mrbird/febs/vip/service/impl/MallVipConfigServiceImpl.java
@@ -57,6 +57,26 @@ } @Override public void editVipConfig(MallVipConfig config) { this.baseMapper.updateById(config); LambdaQueryWrapper<MallVipConfigBenefits> delQuery = new LambdaQueryWrapper<>(); delQuery.eq(MallVipConfigBenefits::getConfigId, config.getId()); mallVipConfigBenefitsService.remove(delQuery); List<MallVipConfigBenefits> configBenefitsList = new ArrayList<>(); List<String> benefitsIds = StrUtil.split(config.getBenefitsIds(), ','); benefitsIds.forEach(item -> { MallVipConfigBenefits configBenefits = new MallVipConfigBenefits(); configBenefits.setConfigId(config.getId()); configBenefits.setBenefitsId(Long.parseLong(item)); configBenefitsList.add(configBenefits); }); mallVipConfigBenefitsService.saveBatch(configBenefitsList); } @Override @Transactional public void delVipConfig(Long id) { this.baseMapper.deleteById(id); src/main/resources/templates/febs/views/modules/vip/goods-select-list.html
@@ -211,7 +211,11 @@ $("#goods-select-form-submit").on('click', function() { var checkData = table.checkStatus(tableSelect).data; if (checkData.length > 0) { parent.setGoodsSelect(tableIndex, checkData[0]); if (tableIndex != -1) { parent.setGoodsSelect(tableIndex, checkData[0]); } else { parent.setConfigGoodsSelect(tableIndex, checkData[0]); } } }) src/main/resources/templates/febs/views/modules/vip/vipConfig-add.html
@@ -83,8 +83,8 @@ <div class="layui-col-lg6" id="targetGoods"> <label class="layui-form-label febs-form-item-require">指定商品:</label> <div class="layui-input-block"> <input type="text" name="targetName" placeholder="点击选择商品" autocomplete="off" class="layui-input" > <input type="text" name="targetId" placeholder="点击选择商品" autocomplete="off" class="layui-input febs-hide" > <input type="text" id="selectGoods" name="targetName" placeholder="点击选择商品" autocomplete="off" class="layui-input" > <input type="text" id="selectGoodsId" name="targetId" placeholder="点击选择商品" autocomplete="off" class="layui-input febs-hide" > </div> </div> @@ -140,15 +140,6 @@ //(下拉框) $.get(ctx + 'admin/vip/benefits/findAllBenefits', function (data) { var arr = data.data; // for (let i = 0; i < arr.length; i++) { // $(".vip-benefits-list").append("<option value='" + arr[i].id + "'>" + arr[i].name + "</option>"); // } // layui.use('form', function () { // var form = layui.form; // form.render(); // }); benefitsList.update({ data : data.data, autoRow: true, @@ -161,7 +152,7 @@ form.on('submit(vipConfig-add-form-submit)', function (data) { data.field.benefitsIds = benefitsList.getValue('valueStr'); $.ajax({ 'url':ctx + 'admin/vip/config/add', 'url':ctx + 'admin/vip/config/addOrEdit', 'type':'post', 'dataType':'json', 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 @@ -235,5 +226,22 @@ } }); } $("#selectGoods").on('click', function() { febs.modal.open('选择商品', 'modules/vip/config/goodsSelect/' + -1, { btn: ['提交', '取消'], yes: function (index, layero) { $('#febs-select-goods').find('#goods-select-form-submit').trigger('click'); layer.close(index); }, btn2: function () { } }); }) window.setConfigGoodsSelect = function(tableIndex, data) { $("#selectGoods").val(data.goodsName); $("#selectGoodsId").val(data.id); } }); </script> src/main/resources/templates/febs/views/modules/vip/vipConfig-edit.html
New file @@ -0,0 +1,280 @@ <style> #vipConfig-edit { padding: 20px 25px 25px 0; } #vipConfig-edit .layui-treeSelect .ztree li a, .ztree li span { margin: 0 0 2px 3px !important; } #vipConfig-edit #data-permission-tree-block { border: 1px solid #eee; border-radius: 2px; padding: 3px 0; } #vipConfig-edit .layui-treeSelect .ztree li span.button.switch { top: 1px; left: 3px; } #vipConfig-edit img{ max-width:100px } </style> <div class="layui-fluid" id="febs-vipConfig-edit"> <form class="layui-form" action="" lay-filter="vipConfig-edit-form"> <div class="layui-form-item"> <input type="text" name="id" lay-verify="required" autocomplete="off" class="layui-input febs-hide" > <div class="layui-col-lg6"> <label class="layui-form-label febs-form-item-require">会员名称:</label> <div class="layui-input-block"> <input type="text" name="name" lay-verify="required" autocomplete="off" class="layui-input" > </div> </div> <div class="layui-col-lg6"> <label class="layui-form-label febs-form-item-require">会员等级:</label> <div class="layui-input-block"> <input type="number" name="level" lay-verify="required" autocomplete="off" class="layui-input" > </div> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">主图:</label> <div class="layui-input-block"> <button type="button" class="layui-btn" id="imageUpload" style="background-color: #009688; margin-bottom: 2px">图片上传</button> <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> <div class=" layui-upload-list view-images" id="thumbImage"> </div> </blockquote> <div class="febs-hide"> <input type="text" id="thumb" name="thumb" autocomplete="off" class="layui-input" readonly> </div> </div> </div> <div class="layui-form-item"> <div class="layui-col-lg4"> <label class="layui-form-label febs-form-item-require">有效期:</label> <div class="layui-input-block"> <input type="number" name="validTime" lay-verify="required" autocomplete="off" class="layui-input" > </div> </div> <div class="layui-col-lg2"> <select name="validType" class="valid-type" lay-filter="valid-type-select"> <option value="day">日</option> <option value="month">月</option> <option value="year">年</option> </select> </div> </div> <div id="layui-form-item"> <div class="layui-col-lg6"> <label class="layui-form-label febs-form-item-require">成为会员条件:</label> <div class="layui-input-block"> <select name="type" class="valid-type" lay-filter="type-select"> <option value="1">指定商品</option> <option value="2">时间区间内消费金额</option> </select> </div> </div> <div class="layui-col-lg6" id="targetGoods"> <label class="layui-form-label febs-form-item-require">指定商品:</label> <div class="layui-input-block"> <input type="text" id="selectGoods" name="targetName" placeholder="点击选择商品" autocomplete="off" class="layui-input" > <input type="text" id="selectGoodsId" name="targetId" placeholder="点击选择商品" autocomplete="off" class="layui-input febs-hide" > </div> </div> <div class="layui-col-lg6 febs-hide" id="targetShopping"> <div class="layui-input-inline layui-col-lg2"> <input type="text" name="times" autocomplete="off" class="layui-input" > </div> <div class="layui-form-mid">月内,消费</div> <div class="layui-input-inline layui-col-lg2"> <input type="text" name="amount" autocomplete="off" class="layui-input" > </div> <div class="layui-form-mid">金额</div> </div> </div> <div class="layui-form-item"> <label class="layui-form-label febs-form-item-require">选择会员权益:</label> <div class="layui-input-block"> <!-- <select name="benefitsIds" class="vip-benefits-list" id="vip-benefits-list">--> <!-- </select>--> <div id="vip-benefits-list"></div> </div> </div> <div class="layui-form-item febs-hide"> <button class="layui-btn" lay-submit="" lay-filter="vipConfig-edit-form-submit" id="submit"></button> </div> </form> </div> <script data-th-inline="javascript"> layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','layedit', 'laydate', 'upload', 'xmSelect'], function () { var $ = layui.$, febs = layui.febs, layer = layui.layer, upload = layui.upload, formSelects = layui.formSelects, form = layui.form, laydate = layui.laydate, layedit = layui.layedit, vipConfigData = [[${configData}]] $view = $('#vipConfig-edit'), validate = layui.validate; var benefitsList = xmSelect.render({ el: '#vip-benefits-list', prop: { name: 'name', value: 'id', }, data: [] }) //(下拉框) $.get(ctx + 'admin/vip/benefits/findAllBenefits', function (data) { benefitsList.update({ data : data.data, autoRow: true, }); initValue(); }); form.render(); formSelects.render(); form.on('submit(vipConfig-edit-form-submit)', function (data) { data.field.benefitsIds = benefitsList.getValue('valueStr'); $.ajax({ 'url':ctx + 'admin/vip/config/addOrEdit', 'type':'post', 'dataType':'json', 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 'traditional': true,//ajax传递数组必须添加属性 'data':JSON.stringify(data.field), 'success':function (data) { if(data.code==200){ layer.closeAll(); febs.alert.success(data.message); $('#febs-vip-level').find('#reset').click(); }else{ febs.alert.warn(data.message); } }, 'error':function () { febs.alert.warn('服务器繁忙'); } }) return false; }); form.on('select(type-select)', function(data) { if (data.value == 1) { $("#targetGoods").show(); $("#targetShopping").hide(); } else { $("#targetGoods").hide(); $("#targetShopping").show(); } }) upload.render({ elem: '#imageUpload' ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 ,multiple: false ,before: function(obj){ //预读本地文件示例,不支持ie8 obj.preview(function(index, file, result){ $('#thumbImage').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">') }); } ,done: function(res){ $("#thumb").val(res.data.src); } }); bindUpload(); function bindUpload() { upload.render({ elem: '.upload' ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 ,accept: 'file' ,before: function(obj){ layer.msg('上传中', {icon: 16, time: 0}); } ,done: function(res){ var item = this.item; //如果上传失败 if(res.code !== 0){ return layer.msg('上传失败'); } // $(item).parent().prev().find('input').val(res.data[0]); $("#videoUrl").val(res.data.src); layer.msg('上传完毕', {icon: 1}); } ,error: function(err){ return layer.msg('上传失败'); } }); } $("#selectGoods").on('click', function() { febs.modal.open('选择商品', 'modules/vip/config/goodsSelect/' + -1, { btn: ['提交', '取消'], yes: function (index, layero) { $('#febs-select-goods').find('#goods-select-form-submit').trigger('click'); layer.close(index); }, btn2: function () { } }); }) window.setConfigGoodsSelect = function(tableIndex, data) { $("#selectGoods").val(data.goodsName); $("#selectGoodsId").val(data.id); } function initValue() { form.val("vipConfig-edit-form", { "id": vipConfigData.id, "name": vipConfigData.name, "level": vipConfigData.level, "type" : vipConfigData.type, "validTime": vipConfigData.validTime, "validType": vipConfigData.validType, "targetName":vipConfigData.targetName, "targetId":vipConfigData.targetId, "times" : vipConfigData.times, "amount" : vipConfigData.amount, }); $('#thumbImage').html('<img src="'+ vipConfigData.thumb +'" class="layui-upload-img" style="width: 100px">') $("#thumb").val(vipConfigData.thumb); if (vipConfigData.type == 1) { $("#targetGoods").show(); $("#targetShopping").hide(); } else { $("#targetGoods").hide(); $("#targetShopping").show(); } var arr = [] arr.push(vipConfigData.benefitsIdList) console.log(vipConfigData.benefitsIdList) benefitsList.setValue(vipConfigData.benefitsIdList); } }); </script> src/main/resources/templates/febs/views/modules/vip/vipConfig-list.html
@@ -50,6 +50,15 @@ <span>年</span> {{# } }} </script> <script type="text/html" id="typeFormat"> {{# if(d.validType == "day") { }} <span>指定商品</span> {{# } else { }} <span>周期内消费指定金额</span> {{# } }} </script> <!-- 表格操作栏 end --> <script data-th-inline="none" type="text/javascript"> // 引入组件并初始化 @@ -76,7 +85,7 @@ var data = obj.data, layEvent = obj.event; if (layEvent === 'benefitsUpdate') { febs.modal.open('编辑', 'modules/vip/config/editBenefits/' + data.id, { febs.modal.open('编辑', 'modules/vip/config/levelEdit/' + data.id, { btn: ['提交', '取消'], yes: function (index, layero) { $('#febs-vipConfig-edit').find('#submit').trigger('click'); @@ -141,7 +150,7 @@ {field: 'level', title: '等级', minWidth: 120, align: 'center'}, {field: 'validTime', title: '有效时长', minWidth: 120, align: 'center'}, {templet:"#validTypeFormat",title: '有效类型', minWidth: 120, align: 'center'}, {field: 'type', title: '成为会员条件', minWidth: 120, align: 'center'}, {templet:"#typeFormat", title: '成为会员条件', minWidth: 120, align: 'center'}, { title: '操作', templet: function (d) {