Browse Source

feat(homepage): 添加首页功能模块和相关接口

- 新增IndexSystemController控制器,提供轮播广告、平台公告、楼层广告等首页接口
- 在IndexProductController中新增商品分类树查询和行家精选商品列表接口
- 添加PcProductVo数据传输对象用于PC端商品展示
- 扩展IProductBaseService和ISysAnnouncementService服务接口
- 实现getExpertSelectionList方法返回行家精选商品列表
- 重构ProductCategoryServiceImpl中的额外信息处理逻辑
- 添加多个产品相关的服务注入,包括品牌、主题页面、福利分类等功能模块
肖路 2 tháng trước cách đây
mục cha
commit
1281ccc59a

+ 53 - 6
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/IndexProductController.java

@@ -3,7 +3,10 @@ package org.dromara.product.controller.pc;
 import cn.hutool.core.lang.tree.Tree;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
-import org.dromara.product.service.IProductCategoryService;
+import org.dromara.product.domain.bo.ProductCategoryBo;
+import org.dromara.product.domain.vo.PcProductVo;
+import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.service.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -13,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
 
 /**
+ * 首页
  * @author
  * @date 2026/1/26 下午6:41
  */
@@ -21,15 +25,58 @@ import java.util.List;
 @RestController
 @RequestMapping("/indexProduct")
 public class IndexProductController {
-
+    //商品
+    private final IProductBaseService productBaseService;
+    //商品分类
     private final IProductCategoryService productCategoryService;
+    //商品品牌
+    private final IProductBrandService productBrandService;
+    //主题页面
+    private final IProductThemeService productThemeService;
+    //产品解决方案
+    private final IProductProgramService productProgramService;
+    //福利分类
+    private final IProductGiftCategoryService productGiftCategoryService;
+    //福利分类下的商品
+    private final IProductGiftCategoryLinkService productGiftCategoryLinkService;
+    //福利楼层广告
+    private final IProductGiftFloorService productGiftFloorService;
+    //福利楼层广告下的商品
+    private final IProductGiftFloorLinkService productGiftFloorLinkService;
+    //福利公告管理
+    private final IProductGiftNoticeService productGiftNoticeService;
+    //推荐商品
+    private final IProductRecommendService productRecommendService;
+    //工业品牌楼层
+    private final IProductIndustrialFloorService productIndustrialFloorService;
+    //分类楼层商品
+    private final IProductDecorationFloorLinkService productDecorationFloorLinkService;
 
     /**
-     * 查询产品分类树(排除节点)
+     * 查询产品分类树
      * */
-    @GetMapping("getProductCategoryTree/{excludeIds}")
-    public R<List<Tree<Long>>> getProductCategoryTree(@PathVariable("excludeIds") String excludeIds) {
-        return R.ok(productCategoryService.queryPageListExclude(excludeIds));
+    @GetMapping("getProductCategoryTree")
+    public R<List<Tree<Long>>> getProductCategoryTree() {
+        ProductCategoryBo bo = new ProductCategoryBo();
+        bo.setDataSource("youyi");
+        return R.ok(productCategoryService.selectCategoryTreeList(bo));
+    }
+
+    /**
+    * 查询行家精选商品列表(平台装修-特价管理)
+    * */
+    @GetMapping("getExpertSelectionList")
+    public R<List<ProductBaseVo>> getExpertSelectionList() {
+        return R.ok(productBaseService.getExpertSelectionList());
+    }
+
+    /**
+    * 分类楼层详情(平台装修-分类楼层-详情)
+    * */
+    @GetMapping("getClassificationFloorDetail/{floorNo}")
+    public R<List<PcProductVo>> getClassificationFloorDetail(@PathVariable Long floorNo) {
+//        productBaseService.getClassificationFloorDetail(floorNo);
+        return R.ok();
     }
 
 

+ 57 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/PcProductVo.java

@@ -0,0 +1,57 @@
+package org.dromara.product.domain.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author
+ * @date 2026/1/30 上午9:49
+ */
+@Data
+public class PcProductVo {
+    /**
+     * 商品ID
+     */
+    private Long id;
+    /**
+     * 产品名称
+     */
+    private String itemName;
+    /**
+     * 产品编号
+     */
+    private String productNo;
+    /**
+     * 商品图片
+     */
+    private String productImage;
+    /**
+     * 商品价格
+     */
+    private String price;
+    /**
+     * 单位名称(如:件、箱、千克等)
+     */
+    private String unitName;
+    /**
+     * 市场价
+     * */
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 最低起订量
+     */
+    private Long minOrderQuantity;
+}

+ 7 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBaseService.java

@@ -137,4 +137,11 @@ public interface IProductBaseService extends IService<ProductBase>{
     * 商品类型改变
     * */
     void changeProductType(ProductBaseBo bo);
+
+    /**
+    * 行家精选商品列表
+    * */
+    List<ProductBaseVo> getExpertSelectionList();
+
+
 }

+ 8 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -1137,5 +1137,13 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
         Page<ProductBaseSimpleVo> page = baseMapper.selectSimplePage(pageQuery.build(), bo);
         return TableDataInfo.build(page);
     }
+
+    /**
+     * 行家精选商品列表
+     */
+    @Override
+    public List<ProductBaseVo> getExpertSelectionList() {
+        return List.of();
+    }
 }
 

+ 28 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryServiceImpl.java

@@ -182,6 +182,7 @@ public class ProductCategoryServiceImpl  extends ServiceImpl<ProductCategoryMapp
         if (CollUtil.isEmpty(productCategorys)) {
             return CollUtil.newArrayList();
         }
+
         return TreeBuildUtils.buildMultiRoot(
             productCategorys,
             ProductCategoryVo::getId,
@@ -191,10 +192,36 @@ public class ProductCategoryServiceImpl  extends ServiceImpl<ProductCategoryMapp
                 .setParentId(node.getParentId())
                 .setName(node.getCategoryName())
                 .setWeight(node.getSort())
-                .putExtra("isShow", node.getIsShow())
+                .putExtra("extra", createExtraMap(node))
         );
     }
 
+    /**
+     * 创建额外信息Map,避免null值导致的异常
+     *
+     * @param node 产品分类节点
+     * @return 额外信息Map
+     */
+    private java.util.Map<String, Object> createExtraMap(ProductCategoryVo node) {
+        java.util.Map<String, Object> extraMap = new java.util.HashMap<>();
+        if (node.getOneLable1() != null) {
+            extraMap.put("oneLable1", node.getOneLable1());
+        }
+        if (node.getOneLable2() != null) {
+            extraMap.put("oneLable2", node.getOneLable2());
+        }
+        if (node.getOneLink1() != null) {
+            extraMap.put("oneLink1", node.getOneLink1());
+        }
+        if (node.getOneLink2() != null) {
+            extraMap.put("oneLink2", node.getOneLink2());
+        }
+        if (node.getIsShow() != null) {
+            extraMap.put("isShow", node.getIsShow());
+        }
+        return extraMap;
+    }
+
     /**
      * 设置审核人员
      *

+ 207 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/IndexSystemController.java

@@ -0,0 +1,207 @@
+package org.dromara.system.controller.pc;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.*;
+import org.dromara.system.domain.bo.SysAnnouncementBo;
+import org.dromara.system.domain.vo.SysAnnouncementVo;
+import org.dromara.system.service.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 首页
+ * @author
+ * @date 2026/1/29 下午3:31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/indexSystem")
+public class IndexSystemController {
+    //平台公告
+    private final ISysAnnouncementService sysAnnouncementService;
+    //自定义海报
+    private final ISysCustomPosterService sysCustomPosterService;
+    //轮播广告
+    private final ISysAdContentService sysAdContentService;
+    //楼层标题配置
+    private final ISysFloorTitleService sysFloorTitleService;
+    //楼层广告管理
+    private final ISysFloorAdvertManageService sysFloorAdvertManageService;
+    //分类楼层
+    private final ISysFloorService sysFloorService;
+    //分类楼层详情
+    private final ISysFloorAdvertiseService sysFloorAdvertiseService;
+
+    /**
+    * 轮播广告(平台装修-轮播广告)
+    * */
+    @RequestMapping("/getHomeAdList")
+    public R<List<SysAdContent>> getHomeAdList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "decoration_banner")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+
+    /**
+    * 优易咨迅(平台公告)
+    * */
+    @RequestMapping("/getYouYiZiXunPage")
+    public TableDataInfo<SysAnnouncementVo> getYouYiZiXunPage(PageQuery pageQuery) {
+        return sysAnnouncementService.getYouYiZiXunPage(pageQuery);
+    }
+
+    /**
+    * 企业会员权益(平台装修-楼层广告-首页图标广告)
+    * */
+    @RequestMapping("/getEnterpriseMemberEquityList")
+    public R<List<SysAdContent>> getEnterpriseMemberEquityList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "decoration_ad_icon")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+    /**
+     * 首页三联广告(平台装修-楼层广告-首页三联广告)
+     * */
+    @RequestMapping("/getHomeThreeAdList")
+    public R<List<SysAdContent>> getHomeThreeAdList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "decoration_ad_triple")
+            .eq(SysAdContent::getStatus, 1)
+        );
+
+        return R.ok(list);
+    }
+
+    /**
+     * 热门方案标题(平台装修-方案管理)
+     * */
+    @RequestMapping("/getHotSchemeTitle")
+    public R<SysFloorTitle> getHotSchemeTitle() {
+        SysFloorTitle sysFloorTitle = sysFloorTitleService.getById(1);
+        return R.ok(sysFloorTitle);
+    }
+    /**
+    * 热门方案列表(平台装修-方案管理)
+    * */
+    @RequestMapping("/getHotSchemeList")
+    public R<List<SysFloorAdvertManage>> getHotSchemeList() {
+        List<SysFloorAdvertManage> list = sysFloorAdvertManageService.list(Wrappers.lambdaQuery(SysFloorAdvertManage.class)
+            .eq(SysFloorAdvertManage::getAdvertPosition, 3)
+        );
+        return R.ok(list);
+    }
+    /**
+     * 场景采购标题(平台装修-产品推荐)
+     * */
+    @RequestMapping("/getScenePurchaseTitle")
+    public R<SysFloorTitle> getScenePurchaseTitle() {
+        SysFloorTitle sysFloorTitle = sysFloorTitleService.getById(7);
+        return R.ok(sysFloorTitle);
+    }
+    /**
+     * 场景采购列表(平台装修-产品推荐)
+     * */
+    @RequestMapping("/getScenePurchaseList")
+    public R<List<SysFloorAdvertManage>> getScenePurchaseList() {
+        List<SysFloorAdvertManage> list = sysFloorAdvertManageService.list(Wrappers.lambdaQuery(SysFloorAdvertManage.class)
+            .eq(SysFloorAdvertManage::getAdvertPosition, 5)
+        );
+        return R.ok(list);
+    }
+    /**
+     * 平台闪购标题(平台装修-平台闪购)
+     * */
+    @RequestMapping("/getPlatformFlashSaleTitle")
+    public R<SysFloorTitle> getPlatformFlashSaleTitle() {
+        SysFloorTitle sysFloorTitle = sysFloorTitleService.getById(4);
+        return R.ok(sysFloorTitle);
+    }
+    /**
+     * 平台闪购列表(平台装修-平台闪购)
+     * */
+    @RequestMapping("/getPlatformFlashSaleList")
+    public R<List<SysFloorAdvertManage>> getPlatformFlashSaleList() {
+        List<SysFloorAdvertManage> list = sysFloorAdvertManageService.list(Wrappers.lambdaQuery(SysFloorAdvertManage.class)
+            .eq(SysFloorAdvertManage::getAdvertPosition, 4)
+        );
+        return R.ok(list);
+    }
+
+    /**
+     * 行家精选标题(平台装修-特价管理)
+     * */
+    @RequestMapping("/getExpertSelectionTitle")
+    public R<SysFloorTitle> getExpertSelectionTitle() {
+        SysFloorTitle sysFloorTitle = sysFloorTitleService.getById(5);
+        return R.ok(sysFloorTitle);
+    }
+
+    /**
+     * 采购指南标题(平台装修-采购指南)
+     * */
+    @RequestMapping("/getPurchaseGuideTitle")
+    public R<SysFloorTitle> getPurchaseGuideTitle() {
+        SysFloorTitle sysFloorTitle = sysFloorTitleService.getById(6);
+        return R.ok(sysFloorTitle);
+    }
+
+    /**
+    * 首页横幅广告(平台装修-楼层广告-首页横幅广告)
+    * */
+    @RequestMapping("/getHomeBannerAd")
+    public R<List<SysAdContent>> getHomeBannerAd() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "decoration_ad_banner")
+        );
+        return R.ok(list);
+    }
+
+    /**
+    * 分类楼层列表(平台装修-分类楼层)
+    * */
+    @RequestMapping("/getClassificationFloorList")
+    public R<List<SysFloor>> getClassificationFloorList() {
+        List<SysFloor> list = sysFloorService.list(Wrappers.<SysFloor>lambdaQuery(SysFloor.class)
+            .eq(SysFloor::getIsShow, 1)
+        );
+        return R.ok(list);
+    }
+
+    /**
+    * 分类楼层详情(平台装修-分类楼层-详情)
+    * */
+    @RequestMapping("/getClassificationFloorDetail/{floorNo}")
+    public R<List<SysFloorAdvertise>> getClassificationFloorDetail(Long floorNo) {
+        List<SysFloorAdvertise> list = sysFloorAdvertiseService.list(Wrappers.lambdaQuery(SysFloorAdvertise.class)
+            .eq(SysFloorAdvertise::getFloorNo, floorNo)
+        );
+        return R.ok(list);
+    }
+
+    /**
+     * 项目案例标题(平台装修-项目案例)
+     * */
+    @RequestMapping("/getProjectCaseTitle")
+    public R<SysFloorTitle> getProjectCaseTitle() {
+        SysFloorTitle sysFloorTitle = sysFloorTitleService.getById(8);
+        return R.ok(sysFloorTitle);
+    }
+
+
+
+
+
+}

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAnnouncementService.java

@@ -67,4 +67,12 @@ public interface ISysAnnouncementService extends IService<SysAnnouncement>{
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 获取优易咨讯(平台公告)
+     *
+     * @param pageQuery 分页参数
+     * @return 优易咨讯(平台公告)
+     */
+    TableDataInfo<SysAnnouncementVo> getYouYiZiXunPage(PageQuery pageQuery);
 }

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAnnouncementServiceImpl.java

@@ -138,4 +138,15 @@ public class SysAnnouncementServiceImpl  extends ServiceImpl<SysAnnouncementMapp
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 获取优易咨讯(平台公告)
+     *
+     * @param pageQuery 分页参数
+     * @return 优易咨讯(平台公告)
+     */
+    @Override
+    public TableDataInfo<SysAnnouncementVo> getYouYiZiXunPage(PageQuery pageQuery) {
+        return null;
+    }
 }