From 2812309093cc6fd31a75d10f62bc52abb7588f56 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Mon, 06 Jan 2025 17:16:57 +0800
Subject: [PATCH] feat(mall): 后台活动列表添加分页和搜索功能 - 在 ActivityServiceImpl 中实现 getAdminListInPage 方法,支持分页和搜索 - 在 AdminActivityController 中添加 list 接口,返回分页数据 - 在 IActivityService 中定义 getAdminListInPage 接口 - 更新前端模板,根据活动状态控制按钮显示

---
 src/main/java/cc/mrbird/febs/mall/controller/ViewActivityController.java     |   29 +++
 src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java                   |    8 
 src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java      |   10 +
 src/main/resources/templates/febs/views/modules/activity/discountUpdate.html |  152 +++++++++++++++++++
 src/main/resources/templates/febs/views/modules/activity/list.html           |    2 
 src/main/resources/templates/febs/views/modules/activity/add.html            |  210 ++++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java    |   15 +
 src/main/java/cc/mrbird/febs/mall/service/IActivityService.java              |    2 
 8 files changed, 420 insertions(+), 8 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java
index e6adbd2..9db62f5 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.mall.controller;
 
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
 import cc.mrbird.febs.common.controller.BaseController;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.entity.QueryRequest;
@@ -8,10 +9,9 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.Map;
 
 @Slf4j
@@ -29,4 +29,13 @@
         Map<String, Object> data = getDataTable(iActivityService.getAdminListInPage(mallActivity, request));
         return new FebsResponse().success().data(data);
     }
+
+    /**
+     * 活动-新增
+     */
+    @PostMapping("add")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "新增失败")
+    public FebsResponse addActivity(@RequestBody @Valid MallActivity mallActivity) {
+        return iActivityService.addActivity(mallActivity);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewActivityController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewActivityController.java
index 0a3f20c..cc7f772 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewActivityController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewActivityController.java
@@ -3,11 +3,14 @@
 import cc.mrbird.febs.common.controller.BaseController;
 import cc.mrbird.febs.common.entity.FebsConstant;
 import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.mall.entity.MallActivity;
 import cc.mrbird.febs.mall.service.IActivityService;
 import lombok.RequiredArgsConstructor;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 @Controller("activityView")
@@ -26,4 +29,30 @@
     public String activityList() {
         return FebsUtil.view("modules/activity/list");
     }
+
+    /**
+     * 新增
+     */
+    @GetMapping("activityAdd")
+    @RequiresPermissions("activityAdd:add")
+    public String activityAdd() {
+        return FebsUtil.view("modules/activity/add");
+    }
+
+    /**
+     * 修改
+     */
+    @GetMapping("activityUpdate/{id}")
+    @RequiresPermissions("activityUpdate:update")
+    public String activityUpdate(@PathVariable long id, Model model) {
+        MallActivity mallActivity = iActivityService.getBaseMapper().selectById(id);
+        model.addAttribute("activity", mallActivity);
+        if(mallActivity.getType() == 1){//折扣页面
+            return FebsUtil.view("modules/activity/discountUpdate");
+        }else if(mallActivity.getType() == 2){//优惠卷页面
+            return FebsUtil.view("modules/activity/couponUpdate");
+        }else{
+            return FebsUtil.view("error/404");
+        }
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java b/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java
index 3c4df30..61db229 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java
@@ -14,16 +14,16 @@
     private String name;
     //活动编码
     private String code;
-    //活动大图
-    private String maxImage;
-    //活动小图
-    private String minImage;
     //开始时间
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date startTime;
     //结束时间
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date endTime;
+    //活动大图
+    private String maxImage;
+    //活动小图
+    private String minImage;
     //活动状态 1-开启 0-关闭
     private Integer state;
     //活动说明
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java b/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java
index 64cc497..3c4eb88 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.mall.service;
 
+import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.mall.entity.MallActivity;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,4 +10,5 @@
 
     IPage<MallActivity> getAdminListInPage(MallActivity mallActivity, QueryRequest request);
 
+    FebsResponse addActivity(MallActivity mallActivity);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java
index 5e5db7e..8f32a07 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java
@@ -1,6 +1,8 @@
 package cc.mrbird.febs.mall.service.impl;
 
+import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.common.utils.MallUtils;
 import cc.mrbird.febs.mall.entity.MallActivity;
 import cc.mrbird.febs.mall.mapper.MallActivityMapper;
 import cc.mrbird.febs.mall.service.IActivityService;
@@ -35,4 +37,12 @@
         Page<MallActivity> mallActivityPage = this.baseMapper.selectPage(page, mallActivityLambdaQueryWrapper);
         return mallActivityPage;
     }
+
+    @Override
+    public FebsResponse addActivity(MallActivity mallActivity) {
+        String hd = MallUtils.getOrderNum("HD");
+        mallActivity.setCode(hd);
+        this.baseMapper.insert(mallActivity);
+        return null;
+    }
 }
diff --git a/src/main/resources/templates/febs/views/modules/activity/add.html b/src/main/resources/templates/febs/views/modules/activity/add.html
new file mode 100644
index 0000000..99ecea9
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/activity/add.html
@@ -0,0 +1,210 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-activity-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="activity-add">
+                <form class="layui-form" action="" lay-filter="activity-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+
+                                <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="actName" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <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">
+                                            <select name="type" class="award-type" lay-filter="award-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">
+                                            <input type="text" name="actStartTime" id="febs-form-group-date-start" lay-verify="date"
+                                                   placeholder="yyyy-MM-dd" 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="text" name="actEndTime" id="febs-form-group-date-end" lay-verify="date"
+                                                   placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">大图:</label>
+                                    <div class="layui-input-block">
+                                        <div class="layui-upload">
+                                            <button type="button" class="layui-btn layui-btn-normal layui-btn" id="testMax">上传</button>
+                                            <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                <div class="layui-upload-list">
+                                                    <img class="layui-upload-img" id="demoMax" 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="maxImage" lay-verify="required" name="maxImage" autocomplete="off" class="layui-input" readonly>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">小图:</label>
+                                    <div class="layui-input-block">
+                                        <div class="layui-upload">
+                                            <button type="button" class="layui-btn layui-btn-normal layui-btn" id="testMin">上传</button>
+                                            <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                <div class="layui-upload-list">
+                                                    <img class="layui-upload-img" id="demoMin" 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="minImage" lay-verify="required" name="minImage" 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="actRemark" rows="5" autocomplete="off" class="layui-textarea" ></textarea>
+                                        </label>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="activity-add-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.awardImage}}" >
+        <input type="text" id="awardImage{{d.index}}" name="awardImage{{d.index}}" autocomplete="off" value="{{d.awardImage}}" class="layui-input febs-hide">
+    </div>
+</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 = $('#activity-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        laydate.render({
+            elem: '#febs-form-group-date-start'
+        });
+
+        laydate.render({
+            elem: '#febs-form-group-date-end'
+        });
+
+        formSelects.render();
+
+        //图片上传
+        upload.render({
+            elem: '#testMax'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,done: function(res){
+                $('#demoMax').attr('src', res.data.src);
+                $("#maxImage").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#testMin'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,done: function(res){
+                $('#demoMin').attr('src', res.data.src);
+                $("#minImage").val(res.data.src);
+            }
+        });
+
+        form.on('submit(activity-add-form-submit)', function (data) {
+            $.ajax({
+                'url':ctx + 'admin/activity/add',
+                '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-activity').find('#reset').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/activity/discountUpdate.html b/src/main/resources/templates/febs/views/modules/activity/discountUpdate.html
new file mode 100644
index 0000000..50ff7aa
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/activity/discountUpdate.html
@@ -0,0 +1,152 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-activity-discount" lay-title="折扣活动">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="activity-discount-update">
+                <form class="layui-form" action="" lay-filter="activity-discount-update-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">折扣活动</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+
+                                <input type="text" name="id" placeholder="" autoComplete="off" class="layui-input febs-hide">
+
+                                <blockquote class="layui-elem-quote blue-border">折扣</blockquote>
+
+                                <blockquote class="layui-elem-quote blue-border">参与商品</blockquote>
+                                <div class="layui-form-item coupon-rule">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">商品:</label>
+                                        <div class="layui-input-block">
+                                            <div id="coupon-rule"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="activity-discount-update-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+</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="delSku">删除</button>
+    </div>
+</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 = $('#activity-discount-update'),
+            layedit = layui.layedit,
+            couponRule = [[${couponRule}]],
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        var couponRuleGoodsIds = xmSelect.render({
+            el: '#coupon-rule',
+            language: 'zn',
+            prop : {
+                value : 'id',
+                children : 'child'
+            },
+            iconfont: {
+                parent: 'hidden',
+            },
+            toolbar: {
+                show: true,
+            },
+            // radio: true,
+            clickClose: true,
+            tree: {
+                show: true,
+                //非严格模式
+                strict: false,
+            },
+            data: []
+        })
+
+        febs.get(ctx + 'admin/goods/goodsTreeSet', null, function(res) {
+            couponRuleGoodsIds.update({
+                data : res.data,
+                autoRow: true,
+            });
+            initValue();
+        })
+
+
+        function initValue() {
+            form.val("activity-discount-update-form", {
+                "id": couponRule.id,
+                "name": couponRule.name,
+                "type": couponRule.type,
+                "expireDay": couponRule.expireDay,
+                "costAmount": couponRule.costAmount,
+                "realAmount": couponRule.realAmount
+            });
+            couponRuleGoodsIds.setValue(couponRule.goodsIds);
+        }
+
+        form.on('submit(activity-discount-update-form-submit)', function (data) {
+            let type = data.field.type;
+            let costAmount = data.field.costAmount;
+            if(type == 2 && costAmount <= 0){
+                febs.alert.warn("累计满减卷,满足金额不能为0");
+                return false;
+            }
+            let couponRuleList = couponRuleGoodsIds.getValue();
+            if (couponRuleList.length > 0) {
+                var couponIds = [];
+                layui.each(couponRuleList, function (key, item) {
+                    couponIds.push(item.id)
+                });
+                data.field.goodsIds=couponIds;
+            }
+            $.ajax({
+                'url':ctx + 'admin/goods/couponUpdate',
+                '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-coupon-rule').find('#reset').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/activity/list.html b/src/main/resources/templates/febs/views/modules/activity/list.html
index 5cff36a..761988c 100644
--- a/src/main/resources/templates/febs/views/modules/activity/list.html
+++ b/src/main/resources/templates/febs/views/modules/activity/list.html
@@ -173,7 +173,7 @@
         });
 
         $add.on('click', function () {
-            febs.modal.open('新增活动', 'modules/act/actAddNew/', {
+            febs.modal.open('新增活动', 'modules/activity/add/', {
                 btn: ['提交', '取消'],
                 area:['100%','100%'],
                 yes: function (index, layero) {

--
Gitblit v1.9.1