From ab3413d4cd840aa9decf370dcac7f1ec42ae0c66 Mon Sep 17 00:00:00 2001 From: Hentua <wangdoubleone@gmail.com> Date: Mon, 22 Jan 2024 22:29:58 +0800 Subject: [PATCH] fix --- src/main/resources/templates/febs/views/modules/vip/vipBenefits-edit.html | 506 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/cc/mrbird/febs/vip/controller/AdminMallVipBenefitsController.java | 8 src/main/java/cc/mrbird/febs/vip/service/IMallVipBenefitsService.java | 4 src/main/java/cc/mrbird/febs/vip/service/impl/MallVipBenefitsServiceImpl.java | 37 +++ src/main/resources/templates/febs/views/modules/vip/vipBenefits-add.html | 6 5 files changed, 559 insertions(+), 2 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/vip/controller/AdminMallVipBenefitsController.java b/src/main/java/cc/mrbird/febs/vip/controller/AdminMallVipBenefitsController.java index dbe476f..066f916 100644 --- a/src/main/java/cc/mrbird/febs/vip/controller/AdminMallVipBenefitsController.java +++ b/src/main/java/cc/mrbird/febs/vip/controller/AdminMallVipBenefitsController.java @@ -38,7 +38,13 @@ @PostMapping("/addBenefits") public FebsResponse addBenefits(@RequestBody MallVipBenefits mallVipBenefits) { - System.out.println(1111); + this.mallVipBenefitsService.addVipBenefits(mallVipBenefits); + return new FebsResponse().success(); + } + + @GetMapping("/delBenefites/{id}") + public FebsResponse delBenefits(@PathVariable("id") Long id) { + this.mallVipBenefitsService.delVipBenefits(id); return new FebsResponse().success(); } } diff --git a/src/main/java/cc/mrbird/febs/vip/service/IMallVipBenefitsService.java b/src/main/java/cc/mrbird/febs/vip/service/IMallVipBenefitsService.java index 1129b68..7b978b7 100644 --- a/src/main/java/cc/mrbird/febs/vip/service/IMallVipBenefitsService.java +++ b/src/main/java/cc/mrbird/febs/vip/service/IMallVipBenefitsService.java @@ -10,4 +10,8 @@ IPage<MallVipBenefits> vipBenefitsListInPage(QueryRequest request); MallVipBenefits findVipBenefitsById(Long id); + + void addVipBenefits(MallVipBenefits mallVipBenefits); + + void delVipBenefits(Long id); } diff --git a/src/main/java/cc/mrbird/febs/vip/service/impl/MallVipBenefitsServiceImpl.java b/src/main/java/cc/mrbird/febs/vip/service/impl/MallVipBenefitsServiceImpl.java index 343c1b7..b6562dc 100644 --- a/src/main/java/cc/mrbird/febs/vip/service/impl/MallVipBenefitsServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/vip/service/impl/MallVipBenefitsServiceImpl.java @@ -1,11 +1,17 @@ package cc.mrbird.febs.vip.service.impl; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.mall.entity.MallNewsInfo; import cc.mrbird.febs.mall.vo.AdminMallNewsInfoVo; import cc.mrbird.febs.vip.entity.MallVipBenefits; +import cc.mrbird.febs.vip.entity.MallVipBenefitsDetails; +import cc.mrbird.febs.vip.mapper.MallVipBenefitsDetailsMapper; import cc.mrbird.febs.vip.mapper.MallVipBenefitsMapper; +import cc.mrbird.febs.vip.service.IMallVipBenefitsDetailsService; import cc.mrbird.febs.vip.service.IMallVipBenefitsService; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -18,6 +24,8 @@ @RequiredArgsConstructor public class MallVipBenefitsServiceImpl extends ServiceImpl<MallVipBenefitsMapper, MallVipBenefits> implements IMallVipBenefitsService { + private final IMallVipBenefitsDetailsService mallVipBenefitsDetailsService; + @Override public IPage<MallVipBenefits> vipBenefitsListInPage(QueryRequest request) { Page<MallVipBenefits> page = new Page<>(request.getPageNum(), request.getPageSize()); @@ -28,4 +36,33 @@ public MallVipBenefits findVipBenefitsById(Long id) { return this.baseMapper.selectVipBenefitsById(id); } + + @Override + public void addVipBenefits(MallVipBenefits mallVipBenefits) { + if (mallVipBenefits == null) { + return; + } + + if (CollUtil.isEmpty(mallVipBenefits.getDetails())) { + throw new FebsException("权益明细不能为空"); + } + + this.baseMapper.insert(mallVipBenefits); + + mallVipBenefits.getDetails().forEach(item -> { + item.setBenefitsId(mallVipBenefits.getId()); + }); + this.mallVipBenefitsDetailsService.saveBatch(mallVipBenefits.getDetails()); + } + + @Override + public void delVipBenefits(Long id) { + this.baseMapper.deleteById(id); + + LambdaQueryWrapper<MallVipBenefitsDetails> delQuery = new LambdaQueryWrapper<>(); + delQuery.eq(MallVipBenefitsDetails::getBenefitsId, id); + this.mallVipBenefitsDetailsService.remove(delQuery); + } + + } diff --git a/src/main/resources/templates/febs/views/modules/vip/vipBenefits-add.html b/src/main/resources/templates/febs/views/modules/vip/vipBenefits-add.html index 79db64e..acbf76e 100644 --- a/src/main/resources/templates/febs/views/modules/vip/vipBenefits-add.html +++ b/src/main/resources/templates/febs/views/modules/vip/vipBenefits-add.html @@ -261,6 +261,10 @@ } // 重新绑定图片上传 bindUpload(i+1); + + listenerLinkContent(); + listenerGoodsSelect(); + listenerCouponSelect(); } } @@ -406,7 +410,7 @@ if(data.code==200){ layer.closeAll(); febs.alert.success(data.message); - $('#febs-act').find('#reset').click(); + $('#febs-vip-benefits').find('#reset').click(); }else{ febs.alert.warn(data.message); } diff --git a/src/main/resources/templates/febs/views/modules/vip/vipBenefits-edit.html b/src/main/resources/templates/febs/views/modules/vip/vipBenefits-edit.html new file mode 100644 index 0000000..2ed2b2e --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/vip/vipBenefits-edit.html @@ -0,0 +1,506 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-vipBenefits-edit" lay-title="编辑会员权益"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="act-add"> + <form class="layui-form" action="" lay-filter="vipBenefits-edit-form"> + <div class="layui-form-item febs-hide"> + <label class="layui-form-label febs-form-item-require">id:</label> + <div class="layui-input-block"> + <input type="text" name="id"> + </div> + </div> + <div class="layui-tab-item layui-show"> + <blockquote class="layui-elem-quote blue-border">基本信息设置</blockquote> + <div class="layui-row layui-col-space10 layui-form-item"> + <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" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="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="gainType" class="gain-type" lay-filter="gain-type-select"> + <option value="1">会员日</option> + <option value="2">会员生日</option> + </select> + </div> + </div> + </div> + + <div class="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="benefits-type" lay-filter="benefits-type-select"> + <option value="1">积分</option> + <option value="2">其他</option> + </select> + </div> + </div> + + <div class="layui-col-lg6" id="scoreMultiple"> + <label class="layui-form-label febs-form-item-require">积分倍数:</label> + <div class="layui-input-block"> + <input type="text" name="scoreMultiple" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">权益ICON</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="test2">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list"> + <img class="layui-upload-img" id="demo2" style="width: 100px" > + </div> + </blockquote> + </div> + </div> + </div> + + <div class="layui-form-item febs-hide"> + <label class="layui-form-label">缩略图链接:</label> + <div class="layui-input-block"> + <input type="text" id="benefitsIcon" lay-verify="required" name="icon" autocomplete="off" class="layui-input" readonly> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label">备注:</label> + <div class="layui-input-block"> + <label> + <textarea name="remark" rows="5" autocomplete="off" class="layui-textarea" ></textarea> + </label> + </div> + </div> + + <blockquote class="layui-elem-quote blue-border">权益详情页面设置</blockquote> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg3"> + <label class="layui-form-label">是否可点击</label> + <div class="layui-input-block"> + <input type="radio" name="isClick" value="1" title="是" lay-filter="isClick"/> + <input type="radio" name="isClick" value="2" title="否" lay-filter="isClick" checked /> + </div> + </div> + <div class="layui-col-lg3 febs-hide" id="linkTypeDiv"> + <label class="layui-form-label febs-form-item-require">点击类型</label> + <div class="layui-input-block"> + <select name="linkType" class="linkType" lay-filter="link-type-select"> + <option value="">请选择</option> + <option value="1">链接</option> + <option value="2">领取商品</option> + <option value="3">优惠券</option> + </select> + </div> + </div> + <div class="layui-col-lg6"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="addBenefits" >添加</button> + </div> + + <div class="layui-form-item"> + <table id="benefitsDetailsItem" lay-filter="benefitsDetailsItem"></table> + </div> + </div> + </div> + + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="vipBenefits-edit-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> +<style> + .blue-border { + border-left-color: #2db7f5; + font-size: 18px; + } + .layui-table-cell { + height:auto; + } +</style> +<script type="text/html" id="toolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delAct">删除</button> + </div> +</script> +<script type="text/html" id="awardtableImgUpload"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="awardImg{{d.index}}">上传</button></br> + <img class="layui-upload-img" id="awardImageUrls{{d.index}}" style="width: 100px; display:none;" src="{{d.image}}" > + <input type="text" id="awardImage{{d.index}}" name="awardImage{{d.index}}" autocomplete="off" value="{{d.image}}" class="layui-input febs-hide"> + </div> +</script> + +<!--<script type="text/html" id="seqInput">--> +<!-- <input type="text" name="seq" autocomplete="off" class="layui-input">--> +<!--</script>--> +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + $view = $('#febs-vip-benefits'), + layedit = layui.layedit, + upload = layui.upload, + validate = layui.validate, + benefitsData = [[${benefitsData}]], + element = layui.element; + + form.render(); + formSelects.render(); + + function initValue() { + form.val("goods-detail-form", { + "id": benefitsData.id, + "goodsNo": mailGoodsDetail.name, + "categoryId": mailGoodsDetail.categoryId, + "mailGoodsSkuDetailVo": mailGoodsDetail.mailGoodsSkuDetailVo, + "unit": mailGoodsDetail.unit, + "originalPrice": mailGoodsDetail.originalPrice, + "presentPrice": mailGoodsDetail.presentPrice, + "goodsIntrodution": mailGoodsDetail.goodsIntrodution, + "thumb": mailGoodsDetail.thumb, + "goodsDetails": mailGoodsDetail.goodsDetails, + "isHot": mailGoodsDetail.isHot, + "goodsName": mailGoodsDetail.goodsName + }); + } + + //图片上传 + upload.render({ + elem: '#test2' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,done: function(res){ + $('#demo2').attr('src', res.data.src); + $("#benefitsIcon").val(res.data.src); + } + }); + + var tableBenefitsItemsData=[]; + var tableIns = table.render({ + elem: '#benefitsDetailsItem' + ,limit:999 + ,toolbar:"#toolbar" + ,defaultToolbar:[] + ,cols: [[ //表头 + {type: 'checkbox'} + ,{field: 'index', title: '序号', width:70} + ,{field: 'isClick', title: '是否可点击', + templet: function (d) { + if (d.isClick == '1') { + return '<span>是</span>' + } else if (d.isClick == '2') { + return '<span>否</span>' + }else{ + return '' + } + }, minWidth: 80,align:'center'} + ,{field: 'seq', title: '排序', edit:'text'} + ,{templet: '#awardtableImgUpload', title: '详情图片', width:150} + ,{templet: '#detailsEvent', title: '操作对应属性'} + ,{field: 'linkType', title: '类型', + templet: function (d) { + if (d.linkType == '1') { + return '<span>链接</span>' + } else if (d.linkType == '2') { + return '<span>指定商品</span>' + }else if (d.linkType == '3') { + return '<span>优惠券</span>' + }else{ + return '' + } + }, minWidth: 80,align:'center'} + ]] + ,data: [] + }); + + table.on('toolbar(benefitsDetailsItem)', function(obj){ + var data = obj.data; + + var hasData = table.cache['benefitsDetailsItem']; + var checkData = table.checkStatus('benefitsDetailsItem').data; + + if (checkData.length <= 0) { + febs.alert.warn('请选择删除数据'); + return; + } + if(obj.event === 'delAct'){ + for (let i = 0; i < checkData.length; i++) { + var delData = checkData[i]; + for (let j = 0; j < hasData.length; j++) { + if (hasData[j].index == delData.index) { + hasData.splice(j, 1); + break; + } + } + } + + for (let i = 0; i < hasData.length; i++) { + hasData[i].index = i + 1; + } + + tableBenefitsItemsData=hasData; + reloadTable(hasData); + } + }); + + function addTableDate(data) { + var hasData = table.cache['benefitsDetailsItem']; + + data.index = hasData.length + 1; + data.contentName = '' + data.content = '' + tableBenefitsItemsData.push(data); + + reloadTable(tableBenefitsItemsData); + return data.index; + } + + function reloadTable(data) { + table.reload('benefitsDetailsItem', { + data : data + }); + + for (let i = 0; i < data.length; i++) { + if (data[i].image) { + $('#awardImageUrls'+ (i+1)).css('display','block'); + } + // 重新绑定图片上传 + bindUpload(i+1); + + listenerLinkContent(); + listenerGoodsSelect(); + listenerCouponSelect(); + } + } + + table.on('edit(benefitsDetailsItem)', function(obj){ + var value = obj.value //得到修改后的值 + ,data = obj.data //得到所在行所有键值 + ,field = obj.field; //得到字段 + + for (let i = 0; i < tableBenefitsItemsData.length; i++) { + if (tableBenefitsItemsData[i].index == data.index) { + tableBenefitsItemsData[i] = data; + } + } + }); + + function listenerLinkContent() { + var hasData = table.cache['benefitsDetailsItem']; + + $(".linkContent").each(function(index, elem) { + var dataIndex = $(this).attr('data-index'); + var $this = $(this); + $(this).on('blur', function() { + var data = $this.val(); + hasData[dataIndex - 1].content = data; + + tableBenefitsItemsData = hasData; + }) + }); + } + + function listenerGoodsSelect() { + var hasData = table.cache['benefitsDetailsItem']; + + $(".goodsSelect").each(function(index, elem) { + var dataIndex = $(this).attr('data-index'); + $(this).on('click', function() { + febs.modal.open('选择商品', 'modules/vip/config/goodsSelect/' + dataIndex, { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#febs-select-goods').find('#goods-select-form-submit').trigger('click'); + layer.close(index); + }, + btn2: function () { + } + }); + }) + }); + } + + function listenerCouponSelect() { + $(".couponSelect").each(function(index, elem) { + var dataIndex = $(this).attr('data-index'); + $(this).on('click', function() { + febs.modal.open('选择优惠券', 'modules/vip/config/couponSelect/' + dataIndex, { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#vip-coupon-select').find('#submit').trigger('click'); + layer.close(index); + }, + btn2: function () { + } + }); + }) + }); + } + + $('#addBenefits').on('click', function (){ + var isClickVal = $("input[name='isClick']:checked").val(); + var linkTypeVal = $("select[name='linkType']").val(); + if(isClickVal == 1 && (linkTypeVal == null || linkTypeVal == "")) { + febs.alert.warn('链接类型不能为空'); + return false; + } + + + var data = {}; + data.linkType = linkTypeVal; + data.isClick = isClickVal; + addTableDate(data); + + if (linkTypeVal == 1) { + listenerLinkContent(); + } + + if (linkTypeVal == 2) { + listenerGoodsSelect(); + } + + if (linkTypeVal == 3) { + listenerCouponSelect(); + } + + }); + + function bindUpload(index) { + // 普通图片上传 + upload.render({ + elem: '#awardImg' + index + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,done: function(res){ + febs.alert.success("上传成功"); + $('#awardImageUrls' + index).attr('src', res.data.src); + $('#awardImageUrls'+ index).css('display','block'); + $('#awardImage'+ index).val(res.data.src); + + for (let i = 0; i < tableBenefitsItemsData.length; i++) { + if(tableBenefitsItemsData[i].index == index) { + tableBenefitsItemsData[i].image = res.data.src; + } + } + + reloadTable(tableBenefitsItemsData); + } + }); + } + + form.on('radio(isClick)', function(data) { + if (data.value == 2) { + $('#linkTypeDiv').hide(); + } else { + $('#linkTypeDiv').show(); + } + }); + + form.on('select(benefits-type-select)', function(data) { + if (data.value == 1) { + $('#scoreMultiple').show(); + } else { + $('#scoreMultiple').hide(); + } + }); + + form.on('submit(vipBenefits-edit-form-submit)', function (data) { + data.field.details = tableBenefitsItemsData; + $.ajax({ + 'url':ctx + 'admin/vip/benefits/addBenefits', + '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-benefits').find('#reset').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + window.setGoodsSelect = function(tableIndex, data) { + var hasData = table.cache['benefitsDetailsItem']; + + for(var i = 0; i<hasData.length; i++) { + if (tableIndex == hasData[i].index) { + hasData[i].content = data.id; + hasData[i].contentName = data.goodsName + } + } + + tableBenefitsItemsData = hasData; + $(".goodsSelect").each(function(index, elem) { + var dataIndex = $(this).attr('data-index'); + if (dataIndex == tableIndex) { + $(this).val(data.goodsName); + $(this).next().val(data.id); + } + }); + } + + window.setCouponSelect = function(tableIndex, data) { + var hasData = table.cache['benefitsDetailsItem']; + + for(var i = 0; i<hasData.length; i++) { + if (tableIndex == hasData[i].index) { + hasData[i].content = data.couponId; + hasData[i].contentName = data.couponName + } + } + + tableBenefitsItemsData = hasData; + console.log(tableBenefitsItemsData) + $(".couponSelect").each(function(index, elem) { + var dataIndex = $(this).attr('data-index'); + if (dataIndex == tableIndex) { + $(this).val(data.couponName); + $(this).next().val(data.couponId); + } + }); + } + + }); +</script> + + +<script type="text/html" id="detailsEvent"> + {{# if(d.isClick == 1 && d.linkType == 1){ }} + <input type="text" name="content" autocomplete="off" data-index="{{d.index}}" value="{{d.content}}" class="layui-input linkContent"> + {{# } }} + {{# if( d.isClick == 1 && d.linkType == 2){ }} + <input type="text" autocomplete="off" name="contentName" data-index="{{d.index}}" value="{{d.contentName}}" class="layui-input goodsSelect" readonly> + <input type="text" name="content" autocomplete="off" value="{{d.content}}" class="layui-input goodsSelectId febs-hide" readonly> + {{# } }} + {{# if(d.isClick == 1 && d.linkType == 3){ }} + <input type="text" name="contentName" autocomplete="off" data-index="{{d.index}}" value="{{d.contentName}}" class="layui-input couponSelect" readonly> + <input type="text" name="content" autocomplete="off" value="{{d.content}}" class="layui-input couponSelectId febs-hide" readonly> + {{# } }} +</script> \ No newline at end of file -- Gitblit v1.9.1