Administrator
2025-05-09 286c0308534688baf50d93c1fc8c2f372912bd40
feat(mall): 重构轮播图模块

- 重新组织轮播图相关的控制器和服务类
- 添加轮播图分类功能和相关枚举类
- 优化轮播图查询和展示逻辑
- 更新轮播图相关的模板和样式
5 files renamed
10 files modified
2 files added
291 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/BannerDictionaryEnum.java 45 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/CommonController.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/banner/AdminBannerController.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/banner/AdminNewsInfoController.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java 9 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/banner/ViewBannerController.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/banner/ViewNewsController.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/PlatformBanner.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminBannerService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallNewsService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminBannerServiceImpl.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallNewsServiceImpl.java 37 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/banner/BannerDictionaryEnumVo.java 11 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/PlatformBannerMapper.xml 15 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/banner/platformBanner.html 63 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/banner/platformBannerAdd.html 32 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/banner/platformBannerDetail.html 37 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/BannerDictionaryEnum.java
New file
@@ -0,0 +1,45 @@
package cc.mrbird.febs.common.enumerates;
import cc.mrbird.febs.mall.vo.banner.BannerDictionaryEnumVo;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@Getter
public enum BannerDictionaryEnum {
    /**
     * 类型 1-轮播图2-开屏页3-商城4-首页社区
     */
    SOCIAL(4, "社区首页"),
    SHOP_STORE(3, "商城首页"),
    OPEN_XCX(2, "开屏页"),
    LUN_BO(1, "小程序首页");
    private int type;
    private String code;
    BannerDictionaryEnum(int type, String code) {
        this.type = type;
        this.code = code;
    }
    public static List<BannerDictionaryEnumVo> getAllType() {
        ArrayList<BannerDictionaryEnumVo> bannerDictionaryEnumVos = new ArrayList<>();
        for (BannerDictionaryEnum bannerDictionaryEnum : values()) {
            BannerDictionaryEnumVo bannerDictionaryEnumVo = new BannerDictionaryEnumVo();
            bannerDictionaryEnumVo.setType(bannerDictionaryEnum.getType());
            bannerDictionaryEnumVo.setCode(bannerDictionaryEnum.getCode());
            bannerDictionaryEnumVos.add(bannerDictionaryEnumVo);
        }
        return bannerDictionaryEnumVos;
    }
    public static void main(String[] args) {
        List<BannerDictionaryEnumVo> allType = BannerDictionaryEnum.getAllType();
        System.out.println(allType);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/CommonController.java
@@ -232,7 +232,7 @@
                CommonDictionaryEnum.TIME_URL_INDEX.getCode()
        );
        if (timeStop == null) {
            timeStop = "0";
            timeStop = "3";
        }
        apiIndexSetVo.setTimeStop(timeStop);
        return new FebsResponse().success().data(apiIndexSetVo);
src/main/java/cc/mrbird/febs/mall/controller/banner/AdminBannerController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/AdminBannerController.java
@@ -1,4 +1,4 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.banner;
import cc.mrbird.febs.common.annotation.ControllerEndpoint;
import cc.mrbird.febs.common.controller.BaseController;
@@ -63,4 +63,15 @@
        iAdminBannerService.platformBannerAdd(platformBannerEntity);
        return new FebsResponse().success();
    }
    /**
     * 轮播图-获取分类
     * @return
     */
    @GetMapping(value = "/typeAll")
    public FebsResponse typeAll() {
        return iAdminBannerService.typeAll();
    }
}
src/main/java/cc/mrbird/febs/mall/controller/banner/AdminNewsInfoController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java
@@ -1,4 +1,4 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.banner;
import cc.mrbird.febs.common.annotation.ControllerEndpoint;
import cc.mrbird.febs.common.controller.BaseController;
src/main/java/cc/mrbird/febs/mall/controller/banner/ApiMallNewsController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ApiMallNewsController.java
@@ -1,4 +1,4 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.banner;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.NewsListDto;
@@ -68,6 +68,13 @@
        return newsService.findAllBanner();
    }
    @ApiOperation(value = "轮播广告根据分类查询", notes = "轮播广告根据分类查询")
    @GetMapping(value = "/bannerByType/{type}")
    public FebsResponse bannerByType(@PathVariable("type") int type) {
        return newsService.bannerByType(type);
    }
    @ApiOperation(value = "首页视频", notes = "首页视频")
    @GetMapping(value = "/indexVideo")
    public FebsResponse indexVideo() {
src/main/java/cc/mrbird/febs/mall/controller/banner/ViewBannerController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ViewBannerController.java
@@ -1,4 +1,4 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.banner;
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.entity.FebsConstant;
src/main/java/cc/mrbird/febs/mall/controller/banner/ViewNewsController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java
@@ -1,4 +1,4 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.banner;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.utils.FebsUtil;
src/main/java/cc/mrbird/febs/mall/entity/PlatformBanner.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@@ -45,9 +46,16 @@
     * 是否置顶 1-是2-否
     */
    private String isTop;
    /**
     * 类型 1-轮播图2-开屏页3-商城4-首页社区
     */
    private int type;
    //商品ID
    @TableField(exist = false)
    private Long goodsId;
    @TableField(exist = false)
    private String timeStop;
}
src/main/java/cc/mrbird/febs/mall/service/IAdminBannerService.java
@@ -19,4 +19,6 @@
    FebsResponse platformBannerDelete(@NotNull(message = "{required}") Long id);
    void platformBannerAdd(@Valid PlatformBanner platformBannerEntity);
    FebsResponse typeAll();
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallNewsService.java
@@ -21,4 +21,6 @@
    FebsResponse findAllBanner();
    FebsResponse indexVideo();
    FebsResponse bannerByType(int type);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminBannerServiceImpl.java
@@ -2,9 +2,11 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.enumerates.BannerDictionaryEnum;
import cc.mrbird.febs.mall.entity.PlatformBanner;
import cc.mrbird.febs.mall.mapper.PlatformBannerMapper;
import cc.mrbird.febs.mall.service.IAdminBannerService;
import cc.mrbird.febs.mall.vo.banner.BannerDictionaryEnumVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -16,6 +18,7 @@
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
@@ -68,4 +71,10 @@
        platformBannerMapper.insert(platformBannerEntityAdd);
    }
    @Override
    public FebsResponse typeAll() {
        List<BannerDictionaryEnumVo> allType = BannerDictionaryEnum.getAllType();
        return new FebsResponse().success().data(allType);
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallNewsServiceImpl.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.BannerDictionaryEnum;
import cc.mrbird.febs.common.enumerates.CommonDictionaryEnum;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.mall.dto.NewsListDto;
import cc.mrbird.febs.mall.entity.*;
@@ -88,4 +90,39 @@
        );
        return new FebsResponse().success().data(dataDictionaryCustom.getValue());
    }
    @Override
    public FebsResponse bannerByType(int type) {
        String timeStop = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                CommonDictionaryEnum.TIME_URL_INDEX.getType(),
                CommonDictionaryEnum.TIME_URL_INDEX.getCode()
        ).getValue();
        if (timeStop == null) {
            timeStop = "3";
        }
        QueryWrapper<PlatformBanner> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("type",type);
        queryWrapper.orderByAsc("sort");
        queryWrapper.orderByAsc("is_top");
        List<PlatformBanner> paymentMethodList = platformBannerMapper.selectList(queryWrapper);
        if(CollUtil.isNotEmpty(paymentMethodList)){
            if(BannerDictionaryEnum.OPEN_XCX.getType() == type)
            for(PlatformBanner platformBanner : paymentMethodList){
                platformBanner.setTimeStop(timeStop);
                if("1".equals(platformBanner.getIsJump()) &&
                        1 == platformBanner.getIsInside()){
                    String jumpUrl = platformBanner.getJumpUrl();
                    QueryWrapper<MallGoods> queryWrapperGoods = new QueryWrapper<>();
                    queryWrapperGoods.eq("goods_no",jumpUrl);
                    List<MallGoods> goodsList = mallGoodsMapper.selectList(queryWrapperGoods);
                    if(CollUtil.isNotEmpty(goodsList)){
                        platformBanner.setGoodsId(goodsList.get(0).getId());
                    }
                }
            }
        }
        return new FebsResponse().success().data(paymentMethodList);
    }
}
src/main/java/cc/mrbird/febs/mall/vo/banner/BannerDictionaryEnumVo.java
New file
@@ -0,0 +1,11 @@
package cc.mrbird.febs.mall.vo.banner;
import lombok.Data;
@Data
public class BannerDictionaryEnumVo {
    private int type;
    private String code;
}
src/main/resources/mapper/modules/PlatformBannerMapper.xml
@@ -2,12 +2,19 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.PlatformBannerMapper">
    <select id="findPlatformBannerInPage" resultType="cc.mrbird.febs.mall.entity.PlatformBanner">
        SELECT
    <select id="findPlatformBannerInPage" resultType="cc.mrbird.febs.mall.entity.PlatformBanner">
        SELECT
            *
        FROM
            platform_banner
            order by created_time desc
    </select>
        <where>
            <if test="record != null" >
                <if test="record.type!=null and record.type!=0">
                    and type = #{record.type}
                </if>
            </if>
        </where>
        order by sort desc
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/banner/platformBanner.html
@@ -3,15 +3,32 @@
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                            <div class="layui-row">
                                <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                    <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                        <i class="layui-icon">&#xe79b;</i>
                                    </div>
                                </div>
                            </div>
                        </form>
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">分类</label>
                                        <div class="layui-input-inline">
                                            <select name="type" class="banner-type">
                                                <option value="0">请选择</option>
                                            </select>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="bannerTable" lay-data="{id: 'bannerTable'}"></table>
                </div>
            </div>
@@ -78,14 +95,28 @@
            table = layui.table,
            dropdown = layui.dropdown,
            $view = $('#febs-banner'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $add = $view.find('#add'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'spread', type: null},
            sortObject = {field: 'sort', type: null},
            tableIns
            ;
        form.render();
        //(下拉框)
        $.get(ctx + 'admin/banner/typeAll', function (res) {
            var data = res.data;
            for (let k in data)
            {
                $(".banner-type").append("<option value='" + data[k].type + "'>" + data[k].code + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
                form.render();
            });
        });
        // 表格初始化
        initTable();
@@ -136,7 +167,13 @@
                $reset.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
         // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
@@ -166,7 +203,9 @@
         // 获取查询参数
        function getQueryParams() {
            return {};
            return {
                type: $searchForm.find("select[name='type']").val(),
            };
        }
        function initTable() {
src/main/resources/templates/febs/views/modules/banner/platformBannerAdd.html
@@ -20,6 +20,26 @@
                                </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">
                                            <input type="text" name="sort" 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="banner-type">
                                                <option value="">请选择</option>
                                            </select>
                                        </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">
                                            <div class="layui-upload">
@@ -122,6 +142,18 @@
            element = layui.element;
        form.render();
        //(下拉框)
        $.get(ctx + 'admin/banner/typeAll', function (res) {
            var data = res.data;
            for (let k in data)
            {
                $(".banner-type").append("<option value='" + data[k].type + "'>" + data[k].code + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
                form.render();
            });
        });
        //图片上传
        upload.render({
src/main/resources/templates/febs/views/modules/banner/platformBannerDetail.html
@@ -22,6 +22,26 @@
                                </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">
                                            <input type="text" name="sort" 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="banner-type" id="type">
                                                <option value="">请选择</option>
                                            </select>
                                        </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">
                                            <div class="layui-upload">
@@ -140,6 +160,19 @@
        });
        form.render();
        //(下拉框)
        $.get(ctx + 'admin/banner/typeAll', function (res) {
            var data = res.data;
            for (let k in data)
            {
                $(".banner-type").append("<option value='" + data[k].type + "'>" + data[k].code + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
                $("#type").val(banner.type)
                form.render();
            });
        });
        initBannerTable();
@@ -153,7 +186,9 @@
                "isInside": banner.isInside,
                "jumpUrl": banner.jumpUrl,
                "isTop": banner.isTop,
                "isJump": banner.isJump
                "sort": banner.sort,
                "isJump": banner.isJump,
                "type": banner.type,
            });
            $('#bannerImgUpload').append('<img src="' + banner.imageUrl + '" alt="" class="layui-upload-img single-image" style="width: 130px">');