Browse Source

zl-12-30-后端

林小张 5 months ago
parent
commit
afec496acf
92 changed files with 5564 additions and 11 deletions
  1. 11 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCategoryRecommendedLinkController.java
  2. 11 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductGiftFloorLinkController.java
  3. 13 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductIndustrialFloorLinkController.java
  4. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductThemeController.java
  5. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductThemeGroupController.java
  6. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductThemeGroupLinkController.java
  7. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductCategoryRecommendedLink.java
  8. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductGiftCategoryLink.java
  9. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductGiftFloorLink.java
  10. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductIndustrialFloorLink.java
  11. 151 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductTheme.java
  12. 94 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductThemeGroup.java
  13. 66 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductThemeGroupLink.java
  14. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCategoryRecommendedLinkBo.java
  15. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductGiftCategoryLinkBo.java
  16. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductGiftFloorLinkBo.java
  17. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductIndustrialFloorLinkBo.java
  18. 159 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductThemeBo.java
  19. 94 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductThemeGroupBo.java
  20. 64 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductThemeGroupLinkBo.java
  21. 21 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductCategoryRecommendedLinkVo.java
  22. 6 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductGiftCategoryLinkVo.java
  23. 21 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductGiftFloorLinkVo.java
  24. 21 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductIndustrialFloorLinkVo.java
  25. 128 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductThemeGroupLinkVo.java
  26. 113 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductThemeGroupVo.java
  27. 185 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductThemeVo.java
  28. 8 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductCategoryRecommendedLinkMapper.java
  29. 7 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductGiftFloorLinkMapper.java
  30. 8 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductIndustrialFloorLinkMapper.java
  31. 23 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductThemeGroupLinkMapper.java
  32. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductThemeGroupMapper.java
  33. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductThemeMapper.java
  34. 8 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductCategoryRecommendedLinkService.java
  35. 8 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductGiftFloorLinkService.java
  36. 9 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductIndustrialFloorLinkService.java
  37. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductThemeGroupLinkService.java
  38. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductThemeGroupService.java
  39. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductThemeService.java
  40. 11 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryRecommendedLinkServiceImpl.java
  41. 11 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductGiftFloorLinkServiceImpl.java
  42. 12 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductIndustrialFloorLinkServiceImpl.java
  43. 151 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeGroupLinkServiceImpl.java
  44. 143 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeGroupServiceImpl.java
  45. 154 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeServiceImpl.java
  46. 6 11
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml
  47. 23 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductCategoryRecommendedLinkMapper.xml
  48. 22 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductGiftFloorLinkMapper.xml
  49. 30 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductIndustrialFloorLinkMapper.xml
  50. 49 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductThemeGroupLinkMapper.xml
  51. 7 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductThemeGroupMapper.xml
  52. 7 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductThemeMapper.xml
  53. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAnnouncementController.java
  54. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysCustomPosterController.java
  55. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysHelpCategoryController.java
  56. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysHelpCenterController.java
  57. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUploadImgLibController.java
  58. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAnnouncement.java
  59. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCustomPoster.java
  60. 89 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysHelpCategory.java
  61. 99 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysHelpCenter.java
  62. 62 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUploadImgLib.java
  63. 85 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAnnouncementBo.java
  64. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysCustomPosterBo.java
  65. 90 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysHelpCategoryBo.java
  66. 100 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysHelpCenterBo.java
  67. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUploadImgLibBo.java
  68. 109 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAnnouncementVo.java
  69. 95 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysCustomPosterVo.java
  70. 109 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysHelpCategoryVo.java
  71. 126 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysHelpCenterVo.java
  72. 77 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUploadImgLibVo.java
  73. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAnnouncementMapper.java
  74. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCustomPosterMapper.java
  75. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysHelpCategoryMapper.java
  76. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysHelpCenterMapper.java
  77. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUploadImgLibMapper.java
  78. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAnnouncementService.java
  79. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCustomPosterService.java
  80. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysHelpCategoryService.java
  81. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysHelpCenterService.java
  82. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUploadImgLibService.java
  83. 141 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAnnouncementServiceImpl.java
  84. 140 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCustomPosterServiceImpl.java
  85. 184 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysHelpCategoryServiceImpl.java
  86. 167 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysHelpCenterServiceImpl.java
  87. 137 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUploadImgLibServiceImpl.java
  88. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAnnouncementMapper.xml
  89. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysCustomPosterMapper.xml
  90. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysHelpCategoryMapper.xml
  91. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysHelpCenterMapper.xml
  92. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUploadImgLibMapper.xml

+ 11 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCategoryRecommendedLinkController.java

@@ -103,4 +103,15 @@ public class ProductCategoryRecommendedLinkController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(productCategoryRecommendedLinkService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+     * 联表查询分类下的商品列表(包含商品详情)
+     *
+     * @param categoryId 分类ID
+     */
+    @SaCheckPermission("product:categoryRecommendedLink:list")
+    @GetMapping("/listWithProduct")
+    public R<List<ProductCategoryRecommendedLinkVo>> listWithProduct(@RequestParam("categoryId") Long categoryId) {
+        return R.ok(productCategoryRecommendedLinkService.queryListWithProduct(categoryId));
+    }
 }

+ 11 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductGiftFloorLinkController.java

@@ -103,4 +103,15 @@ public class ProductGiftFloorLinkController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(productGiftFloorLinkService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+     * 联表查询楼层关联商品(包含商品详情)
+     *
+     * @param floorId 楼层ID
+     */
+    @SaCheckPermission("product:giftFloorLink:list")
+    @GetMapping("/listWithProduct")
+    public R<List<ProductGiftFloorLinkVo>> listWithProduct(@RequestParam("floorId") Long floorId) {
+        return R.ok(productGiftFloorLinkService.queryListWithProduct(floorId));
+    }
 }

+ 13 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductIndustrialFloorLinkController.java

@@ -103,4 +103,17 @@ public class ProductIndustrialFloorLinkController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(productIndustrialFloorLinkService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+     * 联表查询楼层关联商品(包含商品详情)
+     *
+     * @param floorId 楼层ID
+     * @param type 类型(1商品 2品牌)
+     */
+    @SaCheckPermission("product:industrialFloorLink:list")
+    @GetMapping("/listWithProduct")
+    public R<List<ProductIndustrialFloorLinkVo>> listWithProduct(@RequestParam("floorId") Long floorId,
+                                                                  @RequestParam(value = "type", required = false) Long type) {
+        return R.ok(productIndustrialFloorLinkService.queryListWithProduct(floorId, type));
+    }
 }

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductThemeController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProductThemeVo;
+import org.dromara.product.domain.bo.ProductThemeBo;
+import org.dromara.product.service.IProductThemeService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 运营管理主题
+ * 前端访问路由地址为:/product/theme
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/theme")
+public class ProductThemeController extends BaseController {
+
+    private final IProductThemeService productThemeService;
+
+    /**
+     * 查询运营管理主题列表
+     */
+    @SaCheckPermission("product:theme:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductThemeVo> list(ProductThemeBo bo, PageQuery pageQuery) {
+        return productThemeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出运营管理主题列表
+     */
+    @SaCheckPermission("product:theme:export")
+    @Log(title = "运营管理主题", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductThemeBo bo, HttpServletResponse response) {
+        List<ProductThemeVo> list = productThemeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "运营管理主题", ProductThemeVo.class, response);
+    }
+
+    /**
+     * 获取运营管理主题详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:theme:query")
+    @GetMapping("/{id}")
+    public R<ProductThemeVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productThemeService.queryById(id));
+    }
+
+    /**
+     * 新增运营管理主题
+     */
+    @SaCheckPermission("product:theme:add")
+    @Log(title = "运营管理主题", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductThemeBo bo) {
+        return toAjax(productThemeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改运营管理主题
+     */
+    @SaCheckPermission("product:theme:edit")
+    @Log(title = "运营管理主题", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductThemeBo bo) {
+        return toAjax(productThemeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除运营管理主题
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("product:theme:remove")
+    @Log(title = "运营管理主题", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productThemeService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductThemeGroupController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProductThemeGroupVo;
+import org.dromara.product.domain.bo.ProductThemeGroupBo;
+import org.dromara.product.service.IProductThemeGroupService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 主题分组
+ * 前端访问路由地址为:/product/themeGroup
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/themeGroup")
+public class ProductThemeGroupController extends BaseController {
+
+    private final IProductThemeGroupService productThemeGroupService;
+
+    /**
+     * 查询主题分组列表
+     */
+    @SaCheckPermission("product:themeGroup:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductThemeGroupVo> list(ProductThemeGroupBo bo, PageQuery pageQuery) {
+        return productThemeGroupService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出主题分组列表
+     */
+    @SaCheckPermission("product:themeGroup:export")
+    @Log(title = "主题分组", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductThemeGroupBo bo, HttpServletResponse response) {
+        List<ProductThemeGroupVo> list = productThemeGroupService.queryList(bo);
+        ExcelUtil.exportExcel(list, "主题分组", ProductThemeGroupVo.class, response);
+    }
+
+    /**
+     * 获取主题分组详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:themeGroup:query")
+    @GetMapping("/{id}")
+    public R<ProductThemeGroupVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productThemeGroupService.queryById(id));
+    }
+
+    /**
+     * 新增主题分组
+     */
+    @SaCheckPermission("product:themeGroup:add")
+    @Log(title = "主题分组", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductThemeGroupBo bo) {
+        return toAjax(productThemeGroupService.insertByBo(bo));
+    }
+
+    /**
+     * 修改主题分组
+     */
+    @SaCheckPermission("product:themeGroup:edit")
+    @Log(title = "主题分组", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductThemeGroupBo bo) {
+        return toAjax(productThemeGroupService.updateByBo(bo));
+    }
+
+    /**
+     * 删除主题分组
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("product:themeGroup:remove")
+    @Log(title = "主题分组", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productThemeGroupService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductThemeGroupLinkController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProductThemeGroupLinkVo;
+import org.dromara.product.domain.bo.ProductThemeGroupLinkBo;
+import org.dromara.product.service.IProductThemeGroupLinkService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 主题分组商品关联
+ * 前端访问路由地址为:/product/themeGroupLink
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/themeGroupLink")
+public class ProductThemeGroupLinkController extends BaseController {
+
+    private final IProductThemeGroupLinkService productThemeGroupLinkService;
+
+    /**
+     * 查询主题分组商品关联列表
+     */
+    @SaCheckPermission("product:themeGroupLink:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductThemeGroupLinkVo> list(ProductThemeGroupLinkBo bo, PageQuery pageQuery) {
+        return productThemeGroupLinkService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出主题分组商品关联列表
+     */
+    @SaCheckPermission("product:themeGroupLink:export")
+    @Log(title = "主题分组商品关联", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductThemeGroupLinkBo bo, HttpServletResponse response) {
+        List<ProductThemeGroupLinkVo> list = productThemeGroupLinkService.queryList(bo);
+        ExcelUtil.exportExcel(list, "主题分组商品关联", ProductThemeGroupLinkVo.class, response);
+    }
+
+    /**
+     * 获取主题分组商品关联详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:themeGroupLink:query")
+    @GetMapping("/{id}")
+    public R<ProductThemeGroupLinkVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productThemeGroupLinkService.queryById(id));
+    }
+
+    /**
+     * 新增主题分组商品关联
+     */
+    @SaCheckPermission("product:themeGroupLink:add")
+    @Log(title = "主题分组商品关联", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductThemeGroupLinkBo bo) {
+        return toAjax(productThemeGroupLinkService.insertByBo(bo));
+    }
+
+    /**
+     * 修改主题分组商品关联
+     */
+    @SaCheckPermission("product:themeGroupLink:edit")
+    @Log(title = "主题分组商品关联", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductThemeGroupLinkBo bo) {
+        return toAjax(productThemeGroupLinkService.updateByBo(bo));
+    }
+
+    /**
+     * 删除主题分组商品关联
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("product:themeGroupLink:remove")
+    @Log(title = "主题分组商品关联", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productThemeGroupLinkService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductCategoryRecommendedLink.java

@@ -29,6 +29,11 @@ public class ProductCategoryRecommendedLink extends BaseEntity {
     @TableId(value = "id")
     private Long id;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 产品编号
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductGiftCategoryLink.java

@@ -54,6 +54,11 @@ public class ProductGiftCategoryLink extends TenantEntity {
      */
     private String productNo;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 商品名称
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductGiftFloorLink.java

@@ -32,6 +32,11 @@ public class ProductGiftFloorLink extends TenantEntity {
      */
     private Long floorId;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 商品编号
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductIndustrialFloorLink.java

@@ -37,6 +37,11 @@ public class ProductIndustrialFloorLink extends TenantEntity {
      */
     private Long type;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 商品编号
      */

+ 151 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductTheme.java

@@ -0,0 +1,151 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 运营管理主题对象 product_theme
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_theme")
+public class ProductTheme extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 主题编号
+     */
+    private String themeNo;
+
+    /**
+     * 主题名称
+     */
+    private String themeName;
+
+    /**
+     * 副标题
+     */
+    private String subtitle;
+
+    /**
+     * 主题描述
+     */
+    private String description;
+
+    /**
+     * 推文类别
+     */
+    private String category;
+
+    /**
+     * 封面图片
+     */
+    private String coverImage;
+
+    /**
+     * 标题页图片
+     */
+    private String titlePage;
+
+    /**
+     * 背景颜色
+     */
+    private String backgroundColor;
+
+    /**
+     * 跳转链接
+     */
+    private String link;
+
+    /**
+     * 上传方案
+     */
+    private String uploadScheme;
+
+    /**
+     * 价格
+     */
+    private String price;
+
+    /**
+     * 标签
+     */
+    private String label;
+
+    /**
+     * 适配编号
+     */
+    private String adaptNo;
+
+    /**
+     * 适配行业
+     */
+    private String adaptIndustry;
+
+    /**
+     * 样式(0默认)
+     */
+    private Long style;
+
+    /**
+     * 显示图片(0否 1是)
+     */
+    private Long showImage;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 94 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductThemeGroup.java

@@ -0,0 +1,94 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 主题分组对象 product_theme_group
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_theme_group")
+public class ProductThemeGroup extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 主题ID(关联product_theme.id)
+     */
+    private Long themeId;
+
+    /**
+     * 分组编号
+     */
+    private String groupNo;
+
+    /**
+     * 分组名称
+     */
+    private String groupName;
+
+    /**
+     * 分组副标题
+     */
+    private String groupSubtitle;
+
+    /**
+     * 封面图片
+     */
+    private String coverImage;
+
+    /**
+     * 详情标题
+     */
+    private String detailTitle;
+
+    /**
+     * 背景颜色
+     */
+    private String backgroundColor;
+
+    /**
+     * 商品数量
+     */
+    private Long productCount;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 66 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductThemeGroupLink.java

@@ -0,0 +1,66 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 主题分组商品关联对象 product_theme_group_link
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_theme_group_link")
+public class ProductThemeGroupLink extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分组ID(关联product_theme_group.id)
+     */
+    private Long groupId;
+
+    /**
+     * 商品ID(关联product_base.id)
+     */
+    private Long productId;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 平台编码
+     */
+    private String platformCode;
+
+}

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCategoryRecommendedLinkBo.java

@@ -27,6 +27,11 @@ public class ProductCategoryRecommendedLinkBo extends BaseEntity {
      */
     private Long id;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 产品编号
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductGiftCategoryLinkBo.java

@@ -53,6 +53,11 @@ public class ProductGiftCategoryLinkBo extends BaseEntity {
      */
     private String productNo;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 商品名称
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductGiftFloorLinkBo.java

@@ -30,6 +30,11 @@ public class ProductGiftFloorLinkBo extends BaseEntity {
      */
     private Long floorId;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 商品编号
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductIndustrialFloorLinkBo.java

@@ -36,6 +36,11 @@ public class ProductIndustrialFloorLinkBo extends BaseEntity {
 //    @NotNull(message = "类型(1商品 2品牌)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long type;
 
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
     /**
      * 商品编号
      */

+ 159 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductThemeBo.java

@@ -0,0 +1,159 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductTheme;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 运营管理主题业务对象 product_theme
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductTheme.class, reverseConvertGenerate = false)
+public class ProductThemeBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 主题编号
+     */
+    private String themeNo;
+
+    /**
+     * 主题名称
+     */
+    private String themeName;
+
+    /**
+     * 副标题
+     */
+//    @NotBlank(message = "副标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String subtitle;
+
+    /**
+     * 主题描述
+     */
+//    @NotBlank(message = "主题描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String description;
+
+    /**
+     * 推文类别
+     */
+    private String category;
+
+    /**
+     * 封面图片
+     */
+    private String coverImage;
+
+    /**
+     * 标题页图片
+     */
+//    @NotBlank(message = "标题页图片不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String titlePage;
+
+    /**
+     * 背景颜色
+     */
+//    @NotBlank(message = "背景颜色不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String backgroundColor;
+
+    /**
+     * 跳转链接
+     */
+//    @NotBlank(message = "跳转链接不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String link;
+
+    /**
+     * 上传方案
+     */
+//    @NotBlank(message = "上传方案不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String uploadScheme;
+
+    /**
+     * 价格
+     */
+//    @NotBlank(message = "价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String price;
+
+    /**
+     * 标签
+     */
+//    @NotBlank(message = "标签不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String label;
+
+    /**
+     * 适配编号
+     */
+//    @NotBlank(message = "适配编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String adaptNo;
+
+    /**
+     * 适配行业
+     */
+//    @NotBlank(message = "适配行业不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String adaptIndustry;
+
+    /**
+     * 样式(0默认)
+     */
+//    @NotNull(message = "样式(0默认)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long style;
+
+    /**
+     * 显示图片(0否 1是)
+     */
+//    @NotNull(message = "显示图片(0否 1是)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long showImage;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+//    @NotNull(message = "是否显示(0否 1是)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long isShow;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 94 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductThemeGroupBo.java

@@ -0,0 +1,94 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductThemeGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 主题分组业务对象 product_theme_group
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductThemeGroup.class, reverseConvertGenerate = false)
+public class ProductThemeGroupBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 主题ID(关联product_theme.id)
+     */
+    private Long themeId;
+
+    /**
+     * 分组编号
+     */
+    private String groupNo;
+
+    /**
+     * 分组名称
+     */
+    private String groupName;
+
+    /**
+     * 分组副标题
+     */
+//    @NotBlank(message = "分组副标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String groupSubtitle;
+
+    /**
+     * 封面图片
+     */
+//    @NotBlank(message = "封面图片不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String coverImage;
+
+    /**
+     * 详情标题
+     */
+//    @NotBlank(message = "详情标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String detailTitle;
+
+    /**
+     * 背景颜色
+     */
+//    @NotBlank(message = "背景颜色不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String backgroundColor;
+
+    /**
+     * 商品数量
+     */
+//    @NotNull(message = "商品数量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productCount;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 64 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductThemeGroupLinkBo.java

@@ -0,0 +1,64 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductThemeGroupLink;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 主题分组商品关联业务对象 product_theme_group_link
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductThemeGroupLink.class, reverseConvertGenerate = false)
+public class ProductThemeGroupLinkBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 分组ID(关联product_theme_group.id)
+     */
+//    @NotNull(message = "分组ID(关联product_theme_group.id)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long groupId;
+
+    /**
+     * 商品ID(关联product_base.id)
+     */
+//    @NotNull(message = "商品ID(关联product_base.id)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+    /**
+     * 平台编码
+     */
+    private String platformCode;
+
+
+}

+ 21 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductCategoryRecommendedLinkVo.java

@@ -36,12 +36,33 @@ public class ProductCategoryRecommendedLinkVo implements Serializable {
     @ExcelProperty(value = "主键")
     private Long id;
 
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
     /**
      * 产品编号
      */
     @ExcelProperty(value = "产品编号")
     private String productNo;
 
+    /**
+     * 商品名称(联表查询)
+     */
+    private String itemName;
+
+    /**
+     * 商品图片(联表查询)
+     */
+    private String productImage;
+
+    /**
+     * 商品价格(联表查询)
+     */
+    private java.math.BigDecimal minSellingPrice;
+
     /**
      * 分类ID
      */

+ 6 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductGiftCategoryLinkVo.java

@@ -67,6 +67,12 @@ public class ProductGiftCategoryLinkVo implements Serializable {
     @ExcelProperty(value = "商品编号")
     private String productNo;
 
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
     /**
      * 商品名称
      */

+ 21 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductGiftFloorLinkVo.java

@@ -40,12 +40,33 @@ public class ProductGiftFloorLinkVo implements Serializable {
     @ExcelProperty(value = "楼层ID")
     private Long floorId;
 
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
     /**
      * 商品编号
      */
     @ExcelProperty(value = "商品编号")
     private String productNo;
 
+    /**
+     * 商品名称(联表查询)
+     */
+    private String itemName;
+
+    /**
+     * 商品图片(联表查询)
+     */
+    private String productImage;
+
+    /**
+     * 最低售价(联表查询)
+     */
+    private java.math.BigDecimal minSellingPrice;
+
     /**
      * 排序
      */

+ 21 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductIndustrialFloorLinkVo.java

@@ -47,12 +47,33 @@ public class ProductIndustrialFloorLinkVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "1=商品,2=品牌")
     private Long type;
 
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
     /**
      * 商品编号
      */
     @ExcelProperty(value = "商品编号")
     private String productNo;
 
+    /**
+     * 商品名称(联表查询)
+     */
+    private String itemName;
+
+    /**
+     * 商品图片(联表查询)
+     */
+    private String productImage;
+
+    /**
+     * 商品价格(联表查询)
+     */
+    private java.math.BigDecimal minSellingPrice;
+
     /**
      * 品牌编号
      */

+ 128 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductThemeGroupLinkVo.java

@@ -0,0 +1,128 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductThemeGroupLink;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+
+/**
+ * 主题分组商品关联视图对象 product_theme_group_link
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductThemeGroupLink.class)
+public class ProductThemeGroupLinkVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 分组ID(关联product_theme_group.id)
+     */
+    @ExcelProperty(value = "分组ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联product_theme_group.id")
+    private Long groupId;
+
+    /**
+     * 商品ID(关联product_base.id)
+     */
+    @ExcelProperty(value = "商品ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联product_base.id")
+    private Long productId;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    // ========== 商品关联字段 ==========
+
+    /**
+     * 商品编号
+     */
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 商品图片
+     */
+    private String productImage;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 类别名称
+     */
+    private String categoryName;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 市场价
+     */
+    private BigDecimal marketPrice;
+
+    /**
+     * 平台售价(会员价)
+     */
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低售价
+     */
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 标准成本(采购价)
+     */
+    private BigDecimal purchasingPrice;
+
+    /**
+     * 起订量
+     */
+    private Integer minOrderQuantity;
+
+}

+ 113 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductThemeGroupVo.java

@@ -0,0 +1,113 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.product.domain.ProductThemeGroup;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 主题分组视图对象 product_theme_group
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductThemeGroup.class)
+public class ProductThemeGroupVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 主题ID(关联product_theme.id)
+     */
+    @ExcelProperty(value = "主题ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联product_theme.id")
+    private Long themeId;
+
+    /**
+     * 分组编号
+     */
+    @ExcelProperty(value = "分组编号")
+    private String groupNo;
+
+    /**
+     * 分组名称
+     */
+    @ExcelProperty(value = "分组名称")
+    private String groupName;
+
+    /**
+     * 分组副标题
+     */
+    @ExcelProperty(value = "分组副标题")
+    private String groupSubtitle;
+
+    /**
+     * 封面图片
+     */
+    @ExcelProperty(value = "封面图片")
+    private String coverImage;
+
+    /**
+     * 封面图片Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "coverImage")
+    private String coverImageUrl;
+    /**
+     * 详情标题
+     */
+    @ExcelProperty(value = "详情标题")
+    private String detailTitle;
+
+    /**
+     * 背景颜色
+     */
+    @ExcelProperty(value = "背景颜色")
+    private String backgroundColor;
+
+    /**
+     * 商品数量
+     */
+    @ExcelProperty(value = "商品数量")
+    private Long productCount;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 185 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductThemeVo.java

@@ -0,0 +1,185 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.product.domain.ProductTheme;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 运营管理主题视图对象 product_theme
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductTheme.class)
+public class ProductThemeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 主题编号
+     */
+    @ExcelProperty(value = "主题编号")
+    private String themeNo;
+
+    /**
+     * 主题名称
+     */
+    @ExcelProperty(value = "主题名称")
+    private String themeName;
+
+    /**
+     * 副标题
+     */
+    @ExcelProperty(value = "副标题")
+    private String subtitle;
+
+    /**
+     * 主题描述
+     */
+    @ExcelProperty(value = "主题描述")
+    private String description;
+
+    /**
+     * 推文类别
+     */
+    @ExcelProperty(value = "推文类别")
+    private String category;
+
+    /**
+     * 封面图片
+     */
+    @ExcelProperty(value = "封面图片")
+    private String coverImage;
+
+    /**
+     * 封面图片Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "coverImage")
+    private String coverImageUrl;
+    /**
+     * 标题页图片
+     */
+    @ExcelProperty(value = "标题页图片")
+    private String titlePage;
+
+    /**
+     * 背景颜色
+     */
+    @ExcelProperty(value = "背景颜色")
+    private String backgroundColor;
+
+    /**
+     * 跳转链接
+     */
+    @ExcelProperty(value = "跳转链接")
+    private String link;
+
+    /**
+     * 上传方案
+     */
+    @ExcelProperty(value = "上传方案")
+    private String uploadScheme;
+
+    /**
+     * 价格
+     */
+    @ExcelProperty(value = "价格")
+    private String price;
+
+    /**
+     * 标签
+     */
+    @ExcelProperty(value = "标签")
+    private String label;
+
+    /**
+     * 适配编号
+     */
+    @ExcelProperty(value = "适配编号")
+    private String adaptNo;
+
+    /**
+     * 适配行业
+     */
+    @ExcelProperty(value = "适配行业")
+    private String adaptIndustry;
+
+    /**
+     * 样式(0默认)
+     */
+    @ExcelProperty(value = "样式(0默认)")
+    private Long style;
+
+    /**
+     * 显示图片(0否 1是)
+     */
+    @ExcelProperty(value = "显示图片(0否 1是)")
+    private Long showImage;
+
+    /**
+     * 显示图片(0否 1是)Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "showImage")
+    private String showImageUrl;
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示(0否 1是)")
+    private Long isShow;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 开始时间
+     */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 8 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductCategoryRecommendedLinkMapper.java

@@ -3,6 +3,9 @@ package org.dromara.product.mapper;
 import org.dromara.product.domain.ProductCategoryRecommendedLink;
 import org.dromara.product.domain.vo.ProductCategoryRecommendedLinkVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 工业推荐分类商品关联Mapper接口
@@ -12,4 +15,9 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface ProductCategoryRecommendedLinkMapper extends BaseMapperPlus<ProductCategoryRecommendedLink, ProductCategoryRecommendedLinkVo> {
 
+    /**
+     * 联表查询商品信息
+     */
+    List<ProductCategoryRecommendedLinkVo> selectLinkWithProduct(@Param("categoryId") Long categoryId);
+
 }

+ 7 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductGiftFloorLinkMapper.java

@@ -3,6 +3,9 @@ package org.dromara.product.mapper;
 import org.dromara.product.domain.ProductGiftFloorLink;
 import org.dromara.product.domain.vo.ProductGiftFloorLinkVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 福礼楼层商品关联Mapper接口
@@ -12,4 +15,8 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface ProductGiftFloorLinkMapper extends BaseMapperPlus<ProductGiftFloorLink, ProductGiftFloorLinkVo> {
 
+    /**
+     * 联表查询关联商品(通过product_id关联product_base.id)
+     */
+    List<ProductGiftFloorLinkVo> selectLinkWithProduct(@Param("floorId") Long floorId);
 }

+ 8 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductIndustrialFloorLinkMapper.java

@@ -3,6 +3,9 @@ package org.dromara.product.mapper;
 import org.dromara.product.domain.ProductIndustrialFloorLink;
 import org.dromara.product.domain.vo.ProductIndustrialFloorLinkVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 工业品牌楼层关联Mapper接口
@@ -12,4 +15,9 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface ProductIndustrialFloorLinkMapper extends BaseMapperPlus<ProductIndustrialFloorLink, ProductIndustrialFloorLinkVo> {
 
+    /**
+     * 联表查询商品信息
+     */
+    List<ProductIndustrialFloorLinkVo> selectLinkWithProduct(@Param("floorId") Long floorId, @Param("type") Long type);
+
 }

+ 23 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductThemeGroupLinkMapper.java

@@ -0,0 +1,23 @@
+package org.dromara.product.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.product.domain.ProductThemeGroupLink;
+import org.dromara.product.domain.bo.ProductThemeGroupLinkBo;
+import org.dromara.product.domain.vo.ProductThemeGroupLinkVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 主题分组商品关联Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ProductThemeGroupLinkMapper extends BaseMapperPlus<ProductThemeGroupLink, ProductThemeGroupLinkVo> {
+
+    /**
+     * 联表查询分组商品列表(分页)
+     */
+    Page<ProductThemeGroupLinkVo> selectLinkPageWithProduct(@Param("page") Page<ProductThemeGroupLinkVo> page, @Param("bo") ProductThemeGroupLinkBo bo);
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductThemeGroupMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductThemeGroup;
+import org.dromara.product.domain.vo.ProductThemeGroupVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 主题分组Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ProductThemeGroupMapper extends BaseMapperPlus<ProductThemeGroup, ProductThemeGroupVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductThemeMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductTheme;
+import org.dromara.product.domain.vo.ProductThemeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 运营管理主题Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ProductThemeMapper extends BaseMapperPlus<ProductTheme, ProductThemeVo> {
+
+}

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

@@ -26,6 +26,14 @@ public interface IProductCategoryRecommendedLinkService extends IService<Product
      */
     ProductCategoryRecommendedLinkVo queryById(Long id);
 
+    /**
+     * 联表查询分类下的商品列表(包含商品详情)
+     *
+     * @param categoryId 分类ID
+     * @return 关联商品列表
+     */
+    List<ProductCategoryRecommendedLinkVo> queryListWithProduct(Long categoryId);
+
     /**
      * 分页查询工业推荐分类商品关联列表
      *

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

@@ -67,4 +67,12 @@ public interface IProductGiftFloorLinkService extends IService<ProductGiftFloorL
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 联表查询楼层关联商品(包含商品详情)
+     *
+     * @param floorId 楼层ID
+     * @return 关联商品列表
+     */
+    List<ProductGiftFloorLinkVo> queryListWithProduct(Long floorId);
 }

+ 9 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductIndustrialFloorLinkService.java

@@ -67,4 +67,13 @@ public interface IProductIndustrialFloorLinkService extends IService<ProductIndu
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 联表查询楼层关联商品(包含商品详情)
+     *
+     * @param floorId 楼层ID
+     * @param type 类型(1商品 2品牌)
+     * @return 关联列表
+     */
+    List<ProductIndustrialFloorLinkVo> queryListWithProduct(Long floorId, Long type);
 }

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductThemeGroupLinkService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProductThemeGroupLink;
+import org.dromara.product.domain.vo.ProductThemeGroupLinkVo;
+import org.dromara.product.domain.bo.ProductThemeGroupLinkBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 主题分组商品关联Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface IProductThemeGroupLinkService extends IService<ProductThemeGroupLink>{
+
+    /**
+     * 查询主题分组商品关联
+     *
+     * @param id 主键
+     * @return 主题分组商品关联
+     */
+    ProductThemeGroupLinkVo queryById(Long id);
+
+    /**
+     * 分页查询主题分组商品关联列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 主题分组商品关联分页列表
+     */
+    TableDataInfo<ProductThemeGroupLinkVo> queryPageList(ProductThemeGroupLinkBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的主题分组商品关联列表
+     *
+     * @param bo 查询条件
+     * @return 主题分组商品关联列表
+     */
+    List<ProductThemeGroupLinkVo> queryList(ProductThemeGroupLinkBo bo);
+
+    /**
+     * 新增主题分组商品关联
+     *
+     * @param bo 主题分组商品关联
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProductThemeGroupLinkBo bo);
+
+    /**
+     * 修改主题分组商品关联
+     *
+     * @param bo 主题分组商品关联
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProductThemeGroupLinkBo bo);
+
+    /**
+     * 校验并批量删除主题分组商品关联信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductThemeGroupService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProductThemeGroup;
+import org.dromara.product.domain.vo.ProductThemeGroupVo;
+import org.dromara.product.domain.bo.ProductThemeGroupBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 主题分组Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface IProductThemeGroupService extends IService<ProductThemeGroup>{
+
+    /**
+     * 查询主题分组
+     *
+     * @param id 主键
+     * @return 主题分组
+     */
+    ProductThemeGroupVo queryById(Long id);
+
+    /**
+     * 分页查询主题分组列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 主题分组分页列表
+     */
+    TableDataInfo<ProductThemeGroupVo> queryPageList(ProductThemeGroupBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的主题分组列表
+     *
+     * @param bo 查询条件
+     * @return 主题分组列表
+     */
+    List<ProductThemeGroupVo> queryList(ProductThemeGroupBo bo);
+
+    /**
+     * 新增主题分组
+     *
+     * @param bo 主题分组
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProductThemeGroupBo bo);
+
+    /**
+     * 修改主题分组
+     *
+     * @param bo 主题分组
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProductThemeGroupBo bo);
+
+    /**
+     * 校验并批量删除主题分组信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductThemeService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProductTheme;
+import org.dromara.product.domain.vo.ProductThemeVo;
+import org.dromara.product.domain.bo.ProductThemeBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 运营管理主题Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface IProductThemeService extends IService<ProductTheme>{
+
+    /**
+     * 查询运营管理主题
+     *
+     * @param id 主键
+     * @return 运营管理主题
+     */
+    ProductThemeVo queryById(Long id);
+
+    /**
+     * 分页查询运营管理主题列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 运营管理主题分页列表
+     */
+    TableDataInfo<ProductThemeVo> queryPageList(ProductThemeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的运营管理主题列表
+     *
+     * @param bo 查询条件
+     * @return 运营管理主题列表
+     */
+    List<ProductThemeVo> queryList(ProductThemeBo bo);
+
+    /**
+     * 新增运营管理主题
+     *
+     * @param bo 运营管理主题
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProductThemeBo bo);
+
+    /**
+     * 修改运营管理主题
+     *
+     * @param bo 运营管理主题
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProductThemeBo bo);
+
+    /**
+     * 校验并批量删除运营管理主题信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 11 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryRecommendedLinkServiceImpl.java

@@ -45,6 +45,17 @@ public class ProductCategoryRecommendedLinkServiceImpl  extends ServiceImpl<Prod
         return baseMapper.selectVoById(id);
     }
 
+    /**
+     * 联表查询分类下的商品列表(包含商品详情)
+     *
+     * @param categoryId 分类ID
+     * @return 关联商品列表
+     */
+    @Override
+    public List<ProductCategoryRecommendedLinkVo> queryListWithProduct(Long categoryId) {
+        return baseMapper.selectLinkWithProduct(categoryId);
+    }
+
     /**
      * 分页查询工业推荐分类商品关联列表
      *

+ 11 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductGiftFloorLinkServiceImpl.java

@@ -134,4 +134,15 @@ public class ProductGiftFloorLinkServiceImpl  extends ServiceImpl<ProductGiftFlo
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 联表查询楼层关联商品(包含商品详情)
+     *
+     * @param floorId 楼层ID
+     * @return 关联商品列表
+     */
+    @Override
+    public List<ProductGiftFloorLinkVo> queryListWithProduct(Long floorId) {
+        return baseMapper.selectLinkWithProduct(floorId);
+    }
 }

+ 12 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductIndustrialFloorLinkServiceImpl.java

@@ -136,4 +136,16 @@ public class ProductIndustrialFloorLinkServiceImpl  extends ServiceImpl<ProductI
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 联表查询楼层关联商品(包含商品详情)
+     *
+     * @param floorId 楼层ID
+     * @param type 类型(1商品 2品牌)
+     * @return 关联列表
+     */
+    @Override
+    public List<ProductIndustrialFloorLinkVo> queryListWithProduct(Long floorId, Long type) {
+        return baseMapper.selectLinkWithProduct(floorId, type);
+    }
 }

+ 151 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeGroupLinkServiceImpl.java

@@ -0,0 +1,151 @@
+package org.dromara.product.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProductThemeGroupLinkBo;
+import org.dromara.product.domain.vo.ProductThemeGroupLinkVo;
+import org.dromara.product.domain.ProductThemeGroupLink;
+import org.dromara.product.mapper.ProductThemeGroupLinkMapper;
+import org.dromara.product.service.IProductThemeGroupLinkService;
+
+import org.dromara.common.core.exception.ServiceException;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 主题分组商品关联Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductThemeGroupLinkServiceImpl  extends ServiceImpl<ProductThemeGroupLinkMapper, ProductThemeGroupLink> implements IProductThemeGroupLinkService {
+
+    private final ProductThemeGroupLinkMapper baseMapper;
+
+    /**
+     * 查询主题分组商品关联
+     *
+     * @param id 主键
+     * @return 主题分组商品关联
+     */
+    @Override
+    public ProductThemeGroupLinkVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询主题分组商品关联列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 主题分组商品关联分页列表
+     */
+    @Override
+    public TableDataInfo<ProductThemeGroupLinkVo> queryPageList(ProductThemeGroupLinkBo bo, PageQuery pageQuery) {
+        // 使用联表查询,关联商品信息
+        Page<ProductThemeGroupLinkVo> result = baseMapper.selectLinkPageWithProduct(pageQuery.build(), bo);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的主题分组商品关联列表
+     *
+     * @param bo 查询条件
+     * @return 主题分组商品关联列表
+     */
+    @Override
+    public List<ProductThemeGroupLinkVo> queryList(ProductThemeGroupLinkBo bo) {
+        LambdaQueryWrapper<ProductThemeGroupLink> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProductThemeGroupLink> buildQueryWrapper(ProductThemeGroupLinkBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProductThemeGroupLink> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProductThemeGroupLink::getId);
+        lqw.eq(bo.getGroupId() != null, ProductThemeGroupLink::getGroupId, bo.getGroupId());
+        lqw.eq(bo.getProductId() != null, ProductThemeGroupLink::getProductId, bo.getProductId());
+        lqw.eq(bo.getSort() != null, ProductThemeGroupLink::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProductThemeGroupLink::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductThemeGroupLink::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增主题分组商品关联
+     *
+     * @param bo 主题分组商品关联
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProductThemeGroupLinkBo bo) {
+        ProductThemeGroupLink add = MapstructUtils.convert(bo, ProductThemeGroupLink.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改主题分组商品关联
+     *
+     * @param bo 主题分组商品关联
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProductThemeGroupLinkBo bo) {
+        ProductThemeGroupLink update = MapstructUtils.convert(bo, ProductThemeGroupLink.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProductThemeGroupLink entity){
+        // 校验同一分组下商品是否已存在
+        if (entity.getGroupId() != null && entity.getProductId() != null) {
+            LambdaQueryWrapper<ProductThemeGroupLink> lqw = Wrappers.lambdaQuery();
+            lqw.eq(ProductThemeGroupLink::getGroupId, entity.getGroupId());
+            lqw.eq(ProductThemeGroupLink::getProductId, entity.getProductId());
+            // 如果是更新操作,排除自身
+            if (entity.getId() != null) {
+                lqw.ne(ProductThemeGroupLink::getId, entity.getId());
+            }
+            if (baseMapper.exists(lqw)) {
+                throw new ServiceException("该商品已存在,请勿重复添加");
+            }
+        }
+    }
+
+    /**
+     * 校验并批量删除主题分组商品关联信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 143 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeGroupServiceImpl.java

@@ -0,0 +1,143 @@
+package org.dromara.product.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProductThemeGroupBo;
+import org.dromara.product.domain.vo.ProductThemeGroupVo;
+import org.dromara.product.domain.ProductThemeGroup;
+import org.dromara.product.mapper.ProductThemeGroupMapper;
+import org.dromara.product.service.IProductThemeGroupService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 主题分组Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductThemeGroupServiceImpl  extends ServiceImpl<ProductThemeGroupMapper, ProductThemeGroup> implements IProductThemeGroupService {
+
+    private final ProductThemeGroupMapper baseMapper;
+
+    /**
+     * 查询主题分组
+     *
+     * @param id 主键
+     * @return 主题分组
+     */
+    @Override
+    public ProductThemeGroupVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询主题分组列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 主题分组分页列表
+     */
+    @Override
+    public TableDataInfo<ProductThemeGroupVo> queryPageList(ProductThemeGroupBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ProductThemeGroup> lqw = buildQueryWrapper(bo);
+        Page<ProductThemeGroupVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的主题分组列表
+     *
+     * @param bo 查询条件
+     * @return 主题分组列表
+     */
+    @Override
+    public List<ProductThemeGroupVo> queryList(ProductThemeGroupBo bo) {
+        LambdaQueryWrapper<ProductThemeGroup> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProductThemeGroup> buildQueryWrapper(ProductThemeGroupBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProductThemeGroup> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProductThemeGroup::getId);
+        lqw.eq(bo.getThemeId() != null, ProductThemeGroup::getThemeId, bo.getThemeId());
+        lqw.eq(StringUtils.isNotBlank(bo.getGroupNo()), ProductThemeGroup::getGroupNo, bo.getGroupNo());
+        lqw.like(StringUtils.isNotBlank(bo.getGroupName()), ProductThemeGroup::getGroupName, bo.getGroupName());
+        lqw.eq(StringUtils.isNotBlank(bo.getGroupSubtitle()), ProductThemeGroup::getGroupSubtitle, bo.getGroupSubtitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getCoverImage()), ProductThemeGroup::getCoverImage, bo.getCoverImage());
+        lqw.eq(StringUtils.isNotBlank(bo.getDetailTitle()), ProductThemeGroup::getDetailTitle, bo.getDetailTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getBackgroundColor()), ProductThemeGroup::getBackgroundColor, bo.getBackgroundColor());
+        lqw.eq(bo.getProductCount() != null, ProductThemeGroup::getProductCount, bo.getProductCount());
+        lqw.eq(bo.getSort() != null, ProductThemeGroup::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProductThemeGroup::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductThemeGroup::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增主题分组
+     *
+     * @param bo 主题分组
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProductThemeGroupBo bo) {
+        ProductThemeGroup add = MapstructUtils.convert(bo, ProductThemeGroup.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改主题分组
+     *
+     * @param bo 主题分组
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProductThemeGroupBo bo) {
+        ProductThemeGroup update = MapstructUtils.convert(bo, ProductThemeGroup.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProductThemeGroup entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除主题分组信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 154 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeServiceImpl.java

@@ -0,0 +1,154 @@
+package org.dromara.product.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProductThemeBo;
+import org.dromara.product.domain.vo.ProductThemeVo;
+import org.dromara.product.domain.ProductTheme;
+import org.dromara.product.mapper.ProductThemeMapper;
+import org.dromara.product.service.IProductThemeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 运营管理主题Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductThemeServiceImpl  extends ServiceImpl<ProductThemeMapper, ProductTheme> implements IProductThemeService {
+
+    private final ProductThemeMapper baseMapper;
+
+    /**
+     * 查询运营管理主题
+     *
+     * @param id 主键
+     * @return 运营管理主题
+     */
+    @Override
+    public ProductThemeVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询运营管理主题列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 运营管理主题分页列表
+     */
+    @Override
+    public TableDataInfo<ProductThemeVo> queryPageList(ProductThemeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ProductTheme> lqw = buildQueryWrapper(bo);
+        Page<ProductThemeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的运营管理主题列表
+     *
+     * @param bo 查询条件
+     * @return 运营管理主题列表
+     */
+    @Override
+    public List<ProductThemeVo> queryList(ProductThemeBo bo) {
+        LambdaQueryWrapper<ProductTheme> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProductTheme> buildQueryWrapper(ProductThemeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProductTheme> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProductTheme::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getThemeNo()), ProductTheme::getThemeNo, bo.getThemeNo());
+        lqw.like(StringUtils.isNotBlank(bo.getThemeName()), ProductTheme::getThemeName, bo.getThemeName());
+        lqw.eq(StringUtils.isNotBlank(bo.getSubtitle()), ProductTheme::getSubtitle, bo.getSubtitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), ProductTheme::getDescription, bo.getDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getCategory()), ProductTheme::getCategory, bo.getCategory());
+        lqw.eq(StringUtils.isNotBlank(bo.getCoverImage()), ProductTheme::getCoverImage, bo.getCoverImage());
+        lqw.eq(StringUtils.isNotBlank(bo.getTitlePage()), ProductTheme::getTitlePage, bo.getTitlePage());
+        lqw.eq(StringUtils.isNotBlank(bo.getBackgroundColor()), ProductTheme::getBackgroundColor, bo.getBackgroundColor());
+        lqw.eq(StringUtils.isNotBlank(bo.getLink()), ProductTheme::getLink, bo.getLink());
+        lqw.eq(StringUtils.isNotBlank(bo.getUploadScheme()), ProductTheme::getUploadScheme, bo.getUploadScheme());
+        lqw.eq(StringUtils.isNotBlank(bo.getPrice()), ProductTheme::getPrice, bo.getPrice());
+        lqw.eq(StringUtils.isNotBlank(bo.getLabel()), ProductTheme::getLabel, bo.getLabel());
+        lqw.eq(StringUtils.isNotBlank(bo.getAdaptNo()), ProductTheme::getAdaptNo, bo.getAdaptNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getAdaptIndustry()), ProductTheme::getAdaptIndustry, bo.getAdaptIndustry());
+        lqw.eq(bo.getStyle() != null, ProductTheme::getStyle, bo.getStyle());
+        lqw.eq(bo.getShowImage() != null, ProductTheme::getShowImage, bo.getShowImage());
+        lqw.eq(bo.getIsShow() != null, ProductTheme::getIsShow, bo.getIsShow());
+        lqw.eq(bo.getSort() != null, ProductTheme::getSort, bo.getSort());
+        lqw.eq(bo.getStartTime() != null, ProductTheme::getStartTime, bo.getStartTime());
+        lqw.eq(bo.getEndTime() != null, ProductTheme::getEndTime, bo.getEndTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProductTheme::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductTheme::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增运营管理主题
+     *
+     * @param bo 运营管理主题
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProductThemeBo bo) {
+        ProductTheme add = MapstructUtils.convert(bo, ProductTheme.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改运营管理主题
+     *
+     * @param bo 运营管理主题
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProductThemeBo bo) {
+        ProductTheme update = MapstructUtils.convert(bo, ProductTheme.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProductTheme entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除运营管理主题信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 6 - 11
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml

@@ -6,7 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 站点产品列表查询(联表查询) -->
     <select id="selectSiteProductPage" resultType="org.dromara.product.domain.vo.SiteProductVo">
-        SELECT
+        SELECT DISTINCT
             b.id,
             b.product_no AS productNo,
             b.item_name AS productName,
@@ -31,15 +31,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             mc.category_name AS mediumCategoryName,
             b.bottom_category_id AS bottomCategoryId,
             bc.category_name AS bottomCategoryName,
-            gcl.category_name AS giftCategoryName,
             b.remark
         FROM product_base b
-        LEFT JOIN product_price_inventory p ON b.id = p.product_id
-        LEFT JOIN product_brand br ON b.brand_id = br.id
-        LEFT JOIN product_category tc ON b.top_category_id = tc.id
-        LEFT JOIN product_category mc ON b.medium_category_id = mc.id
-        LEFT JOIN product_category bc ON b.bottom_category_id = bc.id
-        LEFT JOIN product_gift_category_link gcl ON b.product_no = gcl.product_no AND gcl.del_flag = '0'
+        LEFT JOIN product_price_inventory p ON b.id = p.product_id AND p.del_flag = '0'
+        LEFT JOIN product_brand br ON b.brand_id = br.id AND br.del_flag = '0'
+        LEFT JOIN product_category tc ON b.top_category_id = tc.id AND tc.del_flag = '0'
+        LEFT JOIN product_category mc ON b.medium_category_id = mc.id AND mc.del_flag = '0'
+        LEFT JOIN product_category bc ON b.bottom_category_id = bc.id AND bc.del_flag = '0'
         <where>
             b.del_flag = '0'
             <if test="bo.keyword != null and bo.keyword != ''">
@@ -57,9 +55,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="bo.bottomCategoryId != null">
                 AND b.bottom_category_id = #{bo.bottomCategoryId}
             </if>
-            <if test="bo.giftCategoryNo != null and bo.giftCategoryNo != ''">
-                AND gcl.category_no = #{bo.giftCategoryNo}
-            </if>
             <if test="bo.isSelf != null and bo.isSelf != ''">
                 AND b.is_self = #{bo.isSelf}
             </if>

+ 23 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductCategoryRecommendedLinkMapper.xml

@@ -4,4 +4,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.product.mapper.ProductCategoryRecommendedLinkMapper">
 
+    <!-- 联表查询商品信息 -->
+    <select id="selectLinkWithProduct" resultType="org.dromara.product.domain.vo.ProductCategoryRecommendedLinkVo">
+        SELECT
+            l.id,
+            l.product_id,
+            l.product_no,
+            l.category_id,
+            l.sort,
+            l.created,
+            l.modify,
+            p.item_name,
+            p.product_image,
+            p.min_selling_price
+        FROM product_category_recommended_link l
+        LEFT JOIN product_base p ON l.product_id = p.id
+        <where>
+            <if test="categoryId != null">
+                AND l.category_id = #{categoryId}
+            </if>
+        </where>
+        ORDER BY l.sort ASC
+    </select>
+
 </mapper>

+ 22 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductGiftFloorLinkMapper.xml

@@ -4,4 +4,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.product.mapper.ProductGiftFloorLinkMapper">
 
+    <!-- 联表查询关联商品(通过product_id关联product_base.id) -->
+    <select id="selectLinkWithProduct" resultType="org.dromara.product.domain.vo.ProductGiftFloorLinkVo">
+        SELECT
+            l.id,
+            l.floor_id,
+            l.product_id,
+            l.product_no,
+            l.sort,
+            l.status,
+            l.remark,
+            p.item_name,
+            p.product_image,
+            p.min_selling_price
+        FROM product_gift_floor_link l
+        LEFT JOIN product_base p ON l.product_id = p.id
+        WHERE l.del_flag = '0'
+        <if test="floorId != null">
+            AND l.floor_id = #{floorId}
+        </if>
+        ORDER BY l.sort ASC
+    </select>
+
 </mapper>

+ 30 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductIndustrialFloorLinkMapper.xml

@@ -4,4 +4,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.product.mapper.ProductIndustrialFloorLinkMapper">
 
+    <!-- 联表查询商品信息 -->
+    <select id="selectLinkWithProduct" resultType="org.dromara.product.domain.vo.ProductIndustrialFloorLinkVo">
+        SELECT
+            l.id,
+            l.floor_id,
+            l.type,
+            l.product_id,
+            l.product_no,
+            l.brand_no,
+            l.sort,
+            l.status,
+            l.remark,
+            l.tenant_id,
+            p.item_name,
+            p.product_image,
+            p.min_selling_price
+        FROM product_industrial_floor_link l
+        LEFT JOIN product_base p ON l.product_id = p.id
+        <where>
+            l.del_flag = '0'
+            <if test="floorId != null">
+                AND l.floor_id = #{floorId}
+            </if>
+            <if test="type != null">
+                AND l.type = #{type}
+            </if>
+        </where>
+        ORDER BY l.sort ASC
+    </select>
+
 </mapper>

+ 49 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductThemeGroupLinkMapper.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.product.mapper.ProductThemeGroupLinkMapper">
+
+    <!-- 联表查询分组商品列表 -->
+    <select id="selectLinkPageWithProduct" resultType="org.dromara.product.domain.vo.ProductThemeGroupLinkVo">
+        SELECT
+            l.id,
+            l.group_id AS groupId,
+            l.product_id AS productId,
+            l.sort,
+            l.status,
+            l.remark,
+            b.product_no AS productNo,
+            b.item_name AS productName,
+            b.product_image AS productImage,
+            br.brand_name AS brandName,
+            tc.category_name AS categoryName,
+            p.market_price AS marketPrice,
+            p.member_price AS memberPrice,
+            p.min_selling_price AS minSellingPrice,
+            p.purchasing_price AS purchasingPrice,
+            p.min_order_quantity AS minOrderQuantity
+        FROM product_theme_group_link l
+        LEFT JOIN product_base b ON l.product_id = b.id AND b.del_flag = '0'
+        LEFT JOIN product_price_inventory p ON b.id = p.product_id
+        LEFT JOIN product_brand br ON b.brand_id = br.id
+        LEFT JOIN product_category tc ON b.top_category_id = tc.id
+        <where>
+            l.del_flag = '0'
+            <if test="bo.groupId != null">
+                AND l.group_id = #{bo.groupId}
+            </if>
+            <if test="bo.productId != null">
+                AND l.product_id = #{bo.productId}
+            </if>
+            <if test="bo.status != null and bo.status != ''">
+                AND l.status = #{bo.status}
+            </if>
+            <if test="bo.platformCode != null and bo.platformCode != ''">
+                AND l.platform_code = #{bo.platformCode}
+            </if>
+        </where>
+        ORDER BY l.sort ASC, l.id ASC
+    </select>
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductThemeGroupMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.product.mapper.ProductThemeGroupMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductThemeMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.product.mapper.ProductThemeMapper">
+
+</mapper>

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAnnouncementController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysAnnouncementVo;
+import org.dromara.system.domain.bo.SysAnnouncementBo;
+import org.dromara.system.service.ISysAnnouncementService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 平台公告
+ * 前端访问路由地址为:/system/announcement
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/announcement")
+public class SysAnnouncementController extends BaseController {
+
+    private final ISysAnnouncementService sysAnnouncementService;
+
+    /**
+     * 查询平台公告列表
+     */
+    @SaCheckPermission("system:announcement:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysAnnouncementVo> list(SysAnnouncementBo bo, PageQuery pageQuery) {
+        return sysAnnouncementService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出平台公告列表
+     */
+    @SaCheckPermission("system:announcement:export")
+    @Log(title = "平台公告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysAnnouncementBo bo, HttpServletResponse response) {
+        List<SysAnnouncementVo> list = sysAnnouncementService.queryList(bo);
+        ExcelUtil.exportExcel(list, "平台公告", SysAnnouncementVo.class, response);
+    }
+
+    /**
+     * 获取平台公告详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:announcement:query")
+    @GetMapping("/{id}")
+    public R<SysAnnouncementVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysAnnouncementService.queryById(id));
+    }
+
+    /**
+     * 新增平台公告
+     */
+    @SaCheckPermission("system:announcement:add")
+    @Log(title = "平台公告", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysAnnouncementBo bo) {
+        return toAjax(sysAnnouncementService.insertByBo(bo));
+    }
+
+    /**
+     * 修改平台公告
+     */
+    @SaCheckPermission("system:announcement:edit")
+    @Log(title = "平台公告", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysAnnouncementBo bo) {
+        return toAjax(sysAnnouncementService.updateByBo(bo));
+    }
+
+    /**
+     * 删除平台公告
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:announcement:remove")
+    @Log(title = "平台公告", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysAnnouncementService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysCustomPosterController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysCustomPosterVo;
+import org.dromara.system.domain.bo.SysCustomPosterBo;
+import org.dromara.system.service.ISysCustomPosterService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 自定义海报
+ * 前端访问路由地址为:/system/customPoster
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/customPoster")
+public class SysCustomPosterController extends BaseController {
+
+    private final ISysCustomPosterService sysCustomPosterService;
+
+    /**
+     * 查询自定义海报列表
+     */
+    @SaCheckPermission("system:customPoster:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysCustomPosterVo> list(SysCustomPosterBo bo, PageQuery pageQuery) {
+        return sysCustomPosterService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出自定义海报列表
+     */
+    @SaCheckPermission("system:customPoster:export")
+    @Log(title = "自定义海报", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysCustomPosterBo bo, HttpServletResponse response) {
+        List<SysCustomPosterVo> list = sysCustomPosterService.queryList(bo);
+        ExcelUtil.exportExcel(list, "自定义海报", SysCustomPosterVo.class, response);
+    }
+
+    /**
+     * 获取自定义海报详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:customPoster:query")
+    @GetMapping("/{id}")
+    public R<SysCustomPosterVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysCustomPosterService.queryById(id));
+    }
+
+    /**
+     * 新增自定义海报
+     */
+    @SaCheckPermission("system:customPoster:add")
+    @Log(title = "自定义海报", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysCustomPosterBo bo) {
+        return toAjax(sysCustomPosterService.insertByBo(bo));
+    }
+
+    /**
+     * 修改自定义海报
+     */
+    @SaCheckPermission("system:customPoster:edit")
+    @Log(title = "自定义海报", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysCustomPosterBo bo) {
+        return toAjax(sysCustomPosterService.updateByBo(bo));
+    }
+
+    /**
+     * 删除自定义海报
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:customPoster:remove")
+    @Log(title = "自定义海报", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysCustomPosterService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysHelpCategoryController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysHelpCategoryVo;
+import org.dromara.system.domain.bo.SysHelpCategoryBo;
+import org.dromara.system.service.ISysHelpCategoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 帮助分类
+ * 前端访问路由地址为:/system/helpCategory
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/helpCategory")
+public class SysHelpCategoryController extends BaseController {
+
+    private final ISysHelpCategoryService sysHelpCategoryService;
+
+    /**
+     * 查询帮助分类列表
+     */
+    @SaCheckPermission("system:helpCategory:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysHelpCategoryVo> list(SysHelpCategoryBo bo, PageQuery pageQuery) {
+        return sysHelpCategoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出帮助分类列表
+     */
+    @SaCheckPermission("system:helpCategory:export")
+    @Log(title = "帮助分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysHelpCategoryBo bo, HttpServletResponse response) {
+        List<SysHelpCategoryVo> list = sysHelpCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "帮助分类", SysHelpCategoryVo.class, response);
+    }
+
+    /**
+     * 获取帮助分类详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:helpCategory:query")
+    @GetMapping("/{id}")
+    public R<SysHelpCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysHelpCategoryService.queryById(id));
+    }
+
+    /**
+     * 新增帮助分类
+     */
+    @SaCheckPermission("system:helpCategory:add")
+    @Log(title = "帮助分类", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysHelpCategoryBo bo) {
+        return toAjax(sysHelpCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改帮助分类
+     */
+    @SaCheckPermission("system:helpCategory:edit")
+    @Log(title = "帮助分类", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysHelpCategoryBo bo) {
+        return toAjax(sysHelpCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除帮助分类
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:helpCategory:remove")
+    @Log(title = "帮助分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysHelpCategoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysHelpCenterController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysHelpCenterVo;
+import org.dromara.system.domain.bo.SysHelpCenterBo;
+import org.dromara.system.service.ISysHelpCenterService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 帮助中心
+ * 前端访问路由地址为:/system/helpCenter
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/helpCenter")
+public class SysHelpCenterController extends BaseController {
+
+    private final ISysHelpCenterService sysHelpCenterService;
+
+    /**
+     * 查询帮助中心列表
+     */
+    @SaCheckPermission("system:helpCenter:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysHelpCenterVo> list(SysHelpCenterBo bo, PageQuery pageQuery) {
+        return sysHelpCenterService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出帮助中心列表
+     */
+    @SaCheckPermission("system:helpCenter:export")
+    @Log(title = "帮助中心", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysHelpCenterBo bo, HttpServletResponse response) {
+        List<SysHelpCenterVo> list = sysHelpCenterService.queryList(bo);
+        ExcelUtil.exportExcel(list, "帮助中心", SysHelpCenterVo.class, response);
+    }
+
+    /**
+     * 获取帮助中心详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:helpCenter:query")
+    @GetMapping("/{id}")
+    public R<SysHelpCenterVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysHelpCenterService.queryById(id));
+    }
+
+    /**
+     * 新增帮助中心
+     */
+    @SaCheckPermission("system:helpCenter:add")
+    @Log(title = "帮助中心", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysHelpCenterBo bo) {
+        return toAjax(sysHelpCenterService.insertByBo(bo));
+    }
+
+    /**
+     * 修改帮助中心
+     */
+    @SaCheckPermission("system:helpCenter:edit")
+    @Log(title = "帮助中心", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysHelpCenterBo bo) {
+        return toAjax(sysHelpCenterService.updateByBo(bo));
+    }
+
+    /**
+     * 删除帮助中心
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:helpCenter:remove")
+    @Log(title = "帮助中心", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysHelpCenterService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUploadImgLibController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysUploadImgLibVo;
+import org.dromara.system.domain.bo.SysUploadImgLibBo;
+import org.dromara.system.service.ISysUploadImgLibService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 图片库
+ * 前端访问路由地址为:/system/uploadImgLib
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/uploadImgLib")
+public class SysUploadImgLibController extends BaseController {
+
+    private final ISysUploadImgLibService sysUploadImgLibService;
+
+    /**
+     * 查询图片库列表
+     */
+    @SaCheckPermission("system:uploadImgLib:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysUploadImgLibVo> list(SysUploadImgLibBo bo, PageQuery pageQuery) {
+        return sysUploadImgLibService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出图片库列表
+     */
+    @SaCheckPermission("system:uploadImgLib:export")
+    @Log(title = "图片库", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysUploadImgLibBo bo, HttpServletResponse response) {
+        List<SysUploadImgLibVo> list = sysUploadImgLibService.queryList(bo);
+        ExcelUtil.exportExcel(list, "图片库", SysUploadImgLibVo.class, response);
+    }
+
+    /**
+     * 获取图片库详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:uploadImgLib:query")
+    @GetMapping("/{id}")
+    public R<SysUploadImgLibVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysUploadImgLibService.queryById(id));
+    }
+
+    /**
+     * 新增图片库
+     */
+    @SaCheckPermission("system:uploadImgLib:add")
+    @Log(title = "图片库", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysUploadImgLibBo bo) {
+        return toAjax(sysUploadImgLibService.insertByBo(bo));
+    }
+
+    /**
+     * 修改图片库
+     */
+    @SaCheckPermission("system:uploadImgLib:edit")
+    @Log(title = "图片库", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysUploadImgLibBo bo) {
+        return toAjax(sysUploadImgLibService.updateByBo(bo));
+    }
+
+    /**
+     * 删除图片库
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:uploadImgLib:remove")
+    @Log(title = "图片库", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysUploadImgLibService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAnnouncement.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 平台公告对象 sys_announcement
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_announcement")
+public class SysAnnouncement extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 公告编号
+     */
+    private String announcementNo;
+
+    /**
+     * 公告标题
+     */
+    private String announcementTitle;
+
+    /**
+     * 公告内容(富文本)
+     */
+    private String announcementContent;
+
+    /**
+     * 封面图片(OSS ID)
+     */
+    private Long coverImage;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 浏览人数
+     */
+    private Long viewCount;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCustomPoster.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 自定义海报对象 sys_custom_poster
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_custom_poster")
+public class SysCustomPoster extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 海报编号
+     */
+    private String posterNo;
+
+    /**
+     * 海报标题
+     */
+    private String posterTitle;
+
+    /**
+     * 海报副标题
+     */
+    private String subheading;
+
+    /**
+     * 海报内容(富文本/JSON)
+     */
+    private String posterContent;
+
+    /**
+     * 封面图片
+     */
+    private String coverImage;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 平台编码
+     */
+    private String platformCode;
+
+
+}

+ 89 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysHelpCategory.java

@@ -0,0 +1,89 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 帮助分类对象 sys_help_category
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_help_category")
+public class SysHelpCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    private String categoryNo;
+
+    /**
+     * 分类名称
+     */
+    private String categoryName;
+
+    /**
+     * 父级分类编号(空为顶级分类)
+     */
+    private String parentNo;
+
+    /**
+     * 主题数量
+     */
+    private Long topicNum;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 分类图片(OSS ID)
+     */
+    private Long categoryImage;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 99 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysHelpCenter.java

@@ -0,0 +1,99 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 帮助中心对象 sys_help_center
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_help_center")
+public class SysHelpCenter extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 帮助编号
+     */
+    private String helpCenterNo;
+
+    /**
+     * 帮助标题
+     */
+    private String helpTitle;
+
+    /**
+     * 帮助类型
+     */
+    private String helpType;
+
+    /**
+     * 子类型
+     */
+    private String subType;
+
+    /**
+     * 二级分类
+     */
+    private String subCategory;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 帮助图片(OSS ID)
+     */
+    private Long helpImage;
+
+    /**
+     * 帮助内容(富文本)
+     */
+    private String helpContent;
+
+    /**
+     * 浏览人数
+     */
+    private Long viewCount;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 62 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUploadImgLib.java

@@ -0,0 +1,62 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 图片库对象 sys_upload_img_lib
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_upload_img_lib")
+public class SysUploadImgLib extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 图片名称
+     */
+    private String imageName;
+
+    /**
+     * 图片地址
+     */
+    private String imageUrl;
+
+    /**
+     * OSS对象ID
+     */
+    private Long ossId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 85 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAnnouncementBo.java

@@ -0,0 +1,85 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysAnnouncement;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 平台公告业务对象 sys_announcement
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAnnouncement.class, reverseConvertGenerate = false)
+public class SysAnnouncementBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 公告编号
+     */
+//    @NotBlank(message = "公告编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String announcementNo;
+
+    /**
+     * 公告标题
+     */
+//    @NotBlank(message = "公告标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String announcementTitle;
+
+    /**
+     * 公告内容(富文本)
+     */
+//    @NotBlank(message = "公告内容(富文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String announcementContent;
+
+    /**
+     * 封面图片(OSS ID)
+     */
+//    @NotNull(message = "封面图片(OSS ID)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long coverImage;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+//    @NotNull(message = "是否显示(0否 1是)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long isShow;
+
+    /**
+     * 浏览人数
+     */
+//    @NotNull(message = "浏览人数不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long viewCount;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysCustomPosterBo.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysCustomPoster;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 自定义海报业务对象 sys_custom_poster
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysCustomPoster.class, reverseConvertGenerate = false)
+public class SysCustomPosterBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 海报编号
+     */
+//    @NotBlank(message = "海报编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String posterNo;
+
+    /**
+     * 海报标题
+     */
+//    @NotBlank(message = "海报标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String posterTitle;
+
+    /**
+     * 海报副标题
+     */
+//    @NotBlank(message = "海报副标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String subheading;
+
+    /**
+     * 海报内容(富文本/JSON)
+     */
+//    @NotBlank(message = "海报内容(富文本/JSON)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String posterContent;
+
+    /**
+     * 封面图片
+     */
+//    @NotBlank(message = "封面图片不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String coverImage;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+    /**
+     * 平台编码
+     */
+    private String platformCode;
+
+
+}

+ 90 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysHelpCategoryBo.java

@@ -0,0 +1,90 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysHelpCategory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 帮助分类业务对象 sys_help_category
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysHelpCategory.class, reverseConvertGenerate = false)
+public class SysHelpCategoryBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+//    @NotBlank(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryNo;
+
+    /**
+     * 分类名称
+     */
+//    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryName;
+
+    /**
+     * 父级分类编号(空为顶级分类)
+     */
+//    @NotBlank(message = "父级分类编号(空为顶级分类)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String parentNo;
+
+    /**
+     * 主题数量
+     */
+//    @NotNull(message = "主题数量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long topicNum;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 分类图片(OSS ID)
+     */
+//    @NotNull(message = "分类图片(OSS ID)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long categoryImage;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 描述
+     */
+//    @NotBlank(message = "描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 100 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysHelpCenterBo.java

@@ -0,0 +1,100 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysHelpCenter;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 帮助中心业务对象 sys_help_center
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysHelpCenter.class, reverseConvertGenerate = false)
+public class SysHelpCenterBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 帮助编号
+     */
+//    @NotBlank(message = "帮助编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String helpCenterNo;
+
+    /**
+     * 帮助标题
+     */
+//    @NotBlank(message = "帮助标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String helpTitle;
+
+    /**
+     * 帮助类型
+     */
+//    @NotBlank(message = "帮助类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String helpType;
+
+    /**
+     * 子类型
+     */
+//    @NotBlank(message = "子类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String subType;
+
+    /**
+     * 二级分类
+     */
+    private String subCategory;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 帮助图片(OSS ID)
+     */
+//    @NotNull(message = "帮助图片(OSS ID)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long helpImage;
+
+    /**
+     * 帮助内容(富文本)
+     */
+//    @NotBlank(message = "帮助内容(富文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String helpContent;
+
+    /**
+     * 浏览人数
+     */
+    private Long viewCount;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 59 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUploadImgLibBo.java

@@ -0,0 +1,59 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysUploadImgLib;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 图片库业务对象 sys_upload_img_lib
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysUploadImgLib.class, reverseConvertGenerate = false)
+public class SysUploadImgLibBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 图片名称
+     */
+//    @NotBlank(message = "图片名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String imageName;
+
+    /**
+     * 图片地址
+     */
+//    @NotBlank(message = "图片地址不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String imageUrl;
+
+    /**
+     * OSS对象ID
+     */
+//    @NotNull(message = "OSS对象ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long ossId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAnnouncementVo.java

@@ -0,0 +1,109 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysAnnouncement;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 平台公告视图对象 sys_announcement
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysAnnouncement.class)
+public class SysAnnouncementVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 公告编号
+     */
+    @ExcelProperty(value = "公告编号")
+    private String announcementNo;
+
+    /**
+     * 公告标题
+     */
+    @ExcelProperty(value = "公告标题")
+    private String announcementTitle;
+
+    /**
+     * 公告内容(富文本)
+     */
+    @ExcelProperty(value = "公告内容", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "富=文本")
+    private String announcementContent;
+
+    /**
+     * 封面图片(OSS ID)
+     */
+    @ExcelProperty(value = "封面图片", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "O=SS,I=D")
+    private Long coverImage;
+
+    /**
+     * 封面图片(OSS ID)Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "coverImage")
+    private String coverImageUrl;
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isShow;
+
+    /**
+     * 浏览人数
+     */
+    @ExcelProperty(value = "浏览人数")
+    private Long viewCount;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建时间(发布时间)
+     */
+    @ExcelProperty(value = "发布时间")
+    private Date createTime;
+
+
+}

+ 95 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysCustomPosterVo.java

@@ -0,0 +1,95 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysCustomPoster;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 自定义海报视图对象 sys_custom_poster
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysCustomPoster.class)
+public class SysCustomPosterVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 海报编号
+     */
+    @ExcelProperty(value = "海报编号")
+    private String posterNo;
+
+    /**
+     * 海报标题
+     */
+    @ExcelProperty(value = "海报标题")
+    private String posterTitle;
+
+    /**
+     * 海报副标题
+     */
+    @ExcelProperty(value = "海报副标题")
+    private String subheading;
+
+    /**
+     * 海报内容(富文本/JSON)
+     */
+    @ExcelProperty(value = "海报内容", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "富=文本/JSON")
+    private String posterContent;
+
+    /**
+     * 封面图片
+     */
+    @ExcelProperty(value = "封面图片")
+    private String coverImage;
+
+    /**
+     * 封面图片Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "coverImage")
+    private String coverImageUrl;
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysHelpCategoryVo.java

@@ -0,0 +1,109 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysHelpCategory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 帮助分类视图对象 sys_help_category
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysHelpCategory.class)
+public class SysHelpCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    @ExcelProperty(value = "分类编号")
+    private String categoryNo;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String categoryName;
+
+    /**
+     * 父级分类编号(空为顶级分类)
+     */
+    @ExcelProperty(value = "父级分类编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "空=为顶级分类")
+    private String parentNo;
+
+    /**
+     * 主题数量
+     */
+    @ExcelProperty(value = "主题数量")
+    private Long topicNum;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isShow;
+
+    /**
+     * 分类图片(OSS ID)
+     */
+    @ExcelProperty(value = "分类图片", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "O=SS,I=D")
+    private Long categoryImage;
+
+    /**
+     * 分类图片(OSS ID)Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "categoryImage")
+    private String categoryImageUrl;
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 描述
+     */
+    @ExcelProperty(value = "描述")
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 126 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysHelpCenterVo.java

@@ -0,0 +1,126 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysHelpCenter;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 帮助中心视图对象 sys_help_center
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysHelpCenter.class)
+public class SysHelpCenterVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 帮助编号
+     */
+    @ExcelProperty(value = "帮助编号")
+    private String helpCenterNo;
+
+    /**
+     * 帮助标题
+     */
+    @ExcelProperty(value = "帮助标题")
+    private String helpTitle;
+
+    /**
+     * 帮助类型
+     */
+    @ExcelProperty(value = "帮助类型")
+    private String helpType;
+
+    /**
+     * 子类型
+     */
+    @ExcelProperty(value = "子类型")
+    private String subType;
+
+    /**
+     * 二级分类
+     */
+    @ExcelProperty(value = "二级分类")
+    private String subCategory;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isShow;
+
+    /**
+     * 帮助图片(OSS ID)
+     */
+    @ExcelProperty(value = "帮助图片", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "O=SS,I=D")
+    private Long helpImage;
+
+    /**
+     * 帮助图片(OSS ID)Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "helpImage")
+    private String helpImageUrl;
+    /**
+     * 帮助内容(富文本)
+     */
+    @ExcelProperty(value = "帮助内容", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "富=文本")
+    private String helpContent;
+
+    /**
+     * 浏览人数
+     */
+    @ExcelProperty(value = "浏览人数")
+    private Long viewCount;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建时间(发布时间)
+     */
+    @ExcelProperty(value = "发布时间")
+    private Date createTime;
+
+}

+ 77 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUploadImgLibVo.java

@@ -0,0 +1,77 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysUploadImgLib;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 图片库视图对象 sys_upload_img_lib
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysUploadImgLib.class)
+public class SysUploadImgLibVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 图片名称
+     */
+    @ExcelProperty(value = "图片名称")
+    private String imageName;
+
+    /**
+     * 图片地址
+     */
+    @ExcelProperty(value = "图片地址")
+    private String imageUrl;
+
+    /**
+     * OSS对象ID
+     */
+    @ExcelProperty(value = "OSS对象ID")
+    private Long ossId;
+
+    /**
+     * 图片URL(通过ossId转换)
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "ossId")
+    private String ossUrl;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAnnouncementMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysAnnouncement;
+import org.dromara.system.domain.vo.SysAnnouncementVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 平台公告Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface SysAnnouncementMapper extends BaseMapperPlus<SysAnnouncement, SysAnnouncementVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCustomPosterMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysCustomPoster;
+import org.dromara.system.domain.vo.SysCustomPosterVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 自定义海报Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface SysCustomPosterMapper extends BaseMapperPlus<SysCustomPoster, SysCustomPosterVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysHelpCategoryMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysHelpCategory;
+import org.dromara.system.domain.vo.SysHelpCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 帮助分类Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface SysHelpCategoryMapper extends BaseMapperPlus<SysHelpCategory, SysHelpCategoryVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysHelpCenterMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysHelpCenter;
+import org.dromara.system.domain.vo.SysHelpCenterVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 帮助中心Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface SysHelpCenterMapper extends BaseMapperPlus<SysHelpCenter, SysHelpCenterVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUploadImgLibMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysUploadImgLib;
+import org.dromara.system.domain.vo.SysUploadImgLibVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 图片库Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface SysUploadImgLibMapper extends BaseMapperPlus<SysUploadImgLib, SysUploadImgLibVo> {
+
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysAnnouncement;
+import org.dromara.system.domain.vo.SysAnnouncementVo;
+import org.dromara.system.domain.bo.SysAnnouncementBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 平台公告Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ISysAnnouncementService extends IService<SysAnnouncement>{
+
+    /**
+     * 查询平台公告
+     *
+     * @param id 主键
+     * @return 平台公告
+     */
+    SysAnnouncementVo queryById(Long id);
+
+    /**
+     * 分页查询平台公告列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 平台公告分页列表
+     */
+    TableDataInfo<SysAnnouncementVo> queryPageList(SysAnnouncementBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的平台公告列表
+     *
+     * @param bo 查询条件
+     * @return 平台公告列表
+     */
+    List<SysAnnouncementVo> queryList(SysAnnouncementBo bo);
+
+    /**
+     * 新增平台公告
+     *
+     * @param bo 平台公告
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysAnnouncementBo bo);
+
+    /**
+     * 修改平台公告
+     *
+     * @param bo 平台公告
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysAnnouncementBo bo);
+
+    /**
+     * 校验并批量删除平台公告信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCustomPosterService.java

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysCustomPoster;
+import org.dromara.system.domain.vo.SysCustomPosterVo;
+import org.dromara.system.domain.bo.SysCustomPosterBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 自定义海报Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ISysCustomPosterService extends IService<SysCustomPoster>{
+
+    /**
+     * 查询自定义海报
+     *
+     * @param id 主键
+     * @return 自定义海报
+     */
+    SysCustomPosterVo queryById(Long id);
+
+    /**
+     * 分页查询自定义海报列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 自定义海报分页列表
+     */
+    TableDataInfo<SysCustomPosterVo> queryPageList(SysCustomPosterBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的自定义海报列表
+     *
+     * @param bo 查询条件
+     * @return 自定义海报列表
+     */
+    List<SysCustomPosterVo> queryList(SysCustomPosterBo bo);
+
+    /**
+     * 新增自定义海报
+     *
+     * @param bo 自定义海报
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysCustomPosterBo bo);
+
+    /**
+     * 修改自定义海报
+     *
+     * @param bo 自定义海报
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysCustomPosterBo bo);
+
+    /**
+     * 校验并批量删除自定义海报信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysHelpCategoryService.java

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysHelpCategory;
+import org.dromara.system.domain.vo.SysHelpCategoryVo;
+import org.dromara.system.domain.bo.SysHelpCategoryBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 帮助分类Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ISysHelpCategoryService extends IService<SysHelpCategory>{
+
+    /**
+     * 查询帮助分类
+     *
+     * @param id 主键
+     * @return 帮助分类
+     */
+    SysHelpCategoryVo queryById(Long id);
+
+    /**
+     * 分页查询帮助分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 帮助分类分页列表
+     */
+    TableDataInfo<SysHelpCategoryVo> queryPageList(SysHelpCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的帮助分类列表
+     *
+     * @param bo 查询条件
+     * @return 帮助分类列表
+     */
+    List<SysHelpCategoryVo> queryList(SysHelpCategoryBo bo);
+
+    /**
+     * 新增帮助分类
+     *
+     * @param bo 帮助分类
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysHelpCategoryBo bo);
+
+    /**
+     * 修改帮助分类
+     *
+     * @param bo 帮助分类
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysHelpCategoryBo bo);
+
+    /**
+     * 校验并批量删除帮助分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysHelpCenterService.java

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysHelpCenter;
+import org.dromara.system.domain.vo.SysHelpCenterVo;
+import org.dromara.system.domain.bo.SysHelpCenterBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 帮助中心Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ISysHelpCenterService extends IService<SysHelpCenter>{
+
+    /**
+     * 查询帮助中心
+     *
+     * @param id 主键
+     * @return 帮助中心
+     */
+    SysHelpCenterVo queryById(Long id);
+
+    /**
+     * 分页查询帮助中心列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 帮助中心分页列表
+     */
+    TableDataInfo<SysHelpCenterVo> queryPageList(SysHelpCenterBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的帮助中心列表
+     *
+     * @param bo 查询条件
+     * @return 帮助中心列表
+     */
+    List<SysHelpCenterVo> queryList(SysHelpCenterBo bo);
+
+    /**
+     * 新增帮助中心
+     *
+     * @param bo 帮助中心
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysHelpCenterBo bo);
+
+    /**
+     * 修改帮助中心
+     *
+     * @param bo 帮助中心
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysHelpCenterBo bo);
+
+    /**
+     * 校验并批量删除帮助中心信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUploadImgLibService.java

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysUploadImgLib;
+import org.dromara.system.domain.vo.SysUploadImgLibVo;
+import org.dromara.system.domain.bo.SysUploadImgLibBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 图片库Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ISysUploadImgLibService extends IService<SysUploadImgLib>{
+
+    /**
+     * 查询图片库
+     *
+     * @param id 主键
+     * @return 图片库
+     */
+    SysUploadImgLibVo queryById(Long id);
+
+    /**
+     * 分页查询图片库列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 图片库分页列表
+     */
+    TableDataInfo<SysUploadImgLibVo> queryPageList(SysUploadImgLibBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的图片库列表
+     *
+     * @param bo 查询条件
+     * @return 图片库列表
+     */
+    List<SysUploadImgLibVo> queryList(SysUploadImgLibBo bo);
+
+    /**
+     * 新增图片库
+     *
+     * @param bo 图片库
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysUploadImgLibBo bo);
+
+    /**
+     * 修改图片库
+     *
+     * @param bo 图片库
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysUploadImgLibBo bo);
+
+    /**
+     * 校验并批量删除图片库信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,141 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysAnnouncementBo;
+import org.dromara.system.domain.vo.SysAnnouncementVo;
+import org.dromara.system.domain.SysAnnouncement;
+import org.dromara.system.mapper.SysAnnouncementMapper;
+import org.dromara.system.service.ISysAnnouncementService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 平台公告Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysAnnouncementServiceImpl  extends ServiceImpl<SysAnnouncementMapper, SysAnnouncement> implements ISysAnnouncementService {
+
+    private final SysAnnouncementMapper baseMapper;
+
+    /**
+     * 查询平台公告
+     *
+     * @param id 主键
+     * @return 平台公告
+     */
+    @Override
+    public SysAnnouncementVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询平台公告列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 平台公告分页列表
+     */
+    @Override
+    public TableDataInfo<SysAnnouncementVo> queryPageList(SysAnnouncementBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysAnnouncement> lqw = buildQueryWrapper(bo);
+        Page<SysAnnouncementVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的平台公告列表
+     *
+     * @param bo 查询条件
+     * @return 平台公告列表
+     */
+    @Override
+    public List<SysAnnouncementVo> queryList(SysAnnouncementBo bo) {
+        LambdaQueryWrapper<SysAnnouncement> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysAnnouncement> buildQueryWrapper(SysAnnouncementBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysAnnouncement> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysAnnouncement::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getAnnouncementNo()), SysAnnouncement::getAnnouncementNo, bo.getAnnouncementNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getAnnouncementTitle()), SysAnnouncement::getAnnouncementTitle, bo.getAnnouncementTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getAnnouncementContent()), SysAnnouncement::getAnnouncementContent, bo.getAnnouncementContent());
+        lqw.eq(bo.getCoverImage() != null, SysAnnouncement::getCoverImage, bo.getCoverImage());
+        lqw.eq(bo.getIsShow() != null, SysAnnouncement::getIsShow, bo.getIsShow());
+        lqw.eq(bo.getViewCount() != null, SysAnnouncement::getViewCount, bo.getViewCount());
+        lqw.eq(bo.getSort() != null, SysAnnouncement::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysAnnouncement::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysAnnouncement::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增平台公告
+     *
+     * @param bo 平台公告
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysAnnouncementBo bo) {
+        SysAnnouncement add = MapstructUtils.convert(bo, SysAnnouncement.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改平台公告
+     *
+     * @param bo 平台公告
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysAnnouncementBo bo) {
+        SysAnnouncement update = MapstructUtils.convert(bo, SysAnnouncement.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysAnnouncement entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除平台公告信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 140 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCustomPosterServiceImpl.java

@@ -0,0 +1,140 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysCustomPosterBo;
+import org.dromara.system.domain.vo.SysCustomPosterVo;
+import org.dromara.system.domain.SysCustomPoster;
+import org.dromara.system.mapper.SysCustomPosterMapper;
+import org.dromara.system.service.ISysCustomPosterService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 自定义海报Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysCustomPosterServiceImpl  extends ServiceImpl<SysCustomPosterMapper, SysCustomPoster> implements ISysCustomPosterService {
+
+    private final SysCustomPosterMapper baseMapper;
+
+    /**
+     * 查询自定义海报
+     *
+     * @param id 主键
+     * @return 自定义海报
+     */
+    @Override
+    public SysCustomPosterVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询自定义海报列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 自定义海报分页列表
+     */
+    @Override
+    public TableDataInfo<SysCustomPosterVo> queryPageList(SysCustomPosterBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysCustomPoster> lqw = buildQueryWrapper(bo);
+        Page<SysCustomPosterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的自定义海报列表
+     *
+     * @param bo 查询条件
+     * @return 自定义海报列表
+     */
+    @Override
+    public List<SysCustomPosterVo> queryList(SysCustomPosterBo bo) {
+        LambdaQueryWrapper<SysCustomPoster> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysCustomPoster> buildQueryWrapper(SysCustomPosterBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysCustomPoster> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysCustomPoster::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getPosterNo()), SysCustomPoster::getPosterNo, bo.getPosterNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getPosterTitle()), SysCustomPoster::getPosterTitle, bo.getPosterTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getSubheading()), SysCustomPoster::getSubheading, bo.getSubheading());
+        lqw.eq(StringUtils.isNotBlank(bo.getPosterContent()), SysCustomPoster::getPosterContent, bo.getPosterContent());
+        lqw.eq(StringUtils.isNotBlank(bo.getCoverImage()), SysCustomPoster::getCoverImage, bo.getCoverImage());
+        lqw.eq(bo.getSort() != null, SysCustomPoster::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysCustomPoster::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysCustomPoster::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增自定义海报
+     *
+     * @param bo 自定义海报
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysCustomPosterBo bo) {
+        SysCustomPoster add = MapstructUtils.convert(bo, SysCustomPoster.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改自定义海报
+     *
+     * @param bo 自定义海报
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysCustomPosterBo bo) {
+        SysCustomPoster update = MapstructUtils.convert(bo, SysCustomPoster.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysCustomPoster entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除自定义海报信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 184 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysHelpCategoryServiceImpl.java

@@ -0,0 +1,184 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysHelpCategoryBo;
+import org.dromara.system.domain.vo.SysHelpCategoryVo;
+import org.dromara.system.domain.SysHelpCategory;
+import org.dromara.system.mapper.SysHelpCategoryMapper;
+import org.dromara.system.service.ISysHelpCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 帮助分类Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysHelpCategoryServiceImpl  extends ServiceImpl<SysHelpCategoryMapper, SysHelpCategory> implements ISysHelpCategoryService {
+
+    private final SysHelpCategoryMapper baseMapper;
+
+    /**
+     * 查询帮助分类
+     *
+     * @param id 主键
+     * @return 帮助分类
+     */
+    @Override
+    public SysHelpCategoryVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询帮助分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 帮助分类分页列表
+     */
+    @Override
+    public TableDataInfo<SysHelpCategoryVo> queryPageList(SysHelpCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysHelpCategory> lqw = buildQueryWrapper(bo);
+        Page<SysHelpCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的帮助分类列表
+     *
+     * @param bo 查询条件
+     * @return 帮助分类列表
+     */
+    @Override
+    public List<SysHelpCategoryVo> queryList(SysHelpCategoryBo bo) {
+        LambdaQueryWrapper<SysHelpCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysHelpCategory> buildQueryWrapper(SysHelpCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysHelpCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysHelpCategory::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getCategoryNo()), SysHelpCategory::getCategoryNo, bo.getCategoryNo());
+        lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), SysHelpCategory::getCategoryName, bo.getCategoryName());
+        lqw.eq(StringUtils.isNotBlank(bo.getParentNo()), SysHelpCategory::getParentNo, bo.getParentNo());
+        lqw.eq(bo.getTopicNum() != null, SysHelpCategory::getTopicNum, bo.getTopicNum());
+        lqw.eq(bo.getIsShow() != null, SysHelpCategory::getIsShow, bo.getIsShow());
+        lqw.eq(bo.getCategoryImage() != null, SysHelpCategory::getCategoryImage, bo.getCategoryImage());
+        lqw.eq(bo.getSort() != null, SysHelpCategory::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), SysHelpCategory::getDescription, bo.getDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysHelpCategory::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysHelpCategory::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增帮助分类
+     *
+     * @param bo 帮助分类
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysHelpCategoryBo bo) {
+        SysHelpCategory add = MapstructUtils.convert(bo, SysHelpCategory.class);
+        // 自动生成分类编号
+        add.setCategoryNo(generateCategoryNo(bo.getParentNo(), bo.getPlatformCode()));
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成分类编号
+     * 规则:顶级分类 00001, 00002...
+     *       子分类 00001001, 00001002...
+     */
+    private String generateCategoryNo(String parentNo, String platformCode) {
+        if (StringUtils.isBlank(parentNo)) {
+            // 顶级分类:查找最大的顶级分类编号
+            LambdaQueryWrapper<SysHelpCategory> lqw = Wrappers.lambdaQuery();
+            lqw.eq(StringUtils.isNotBlank(platformCode), SysHelpCategory::getPlatformCode, platformCode);
+            lqw.and(w -> w.isNull(SysHelpCategory::getParentNo).or().eq(SysHelpCategory::getParentNo, ""));
+            lqw.isNotNull(SysHelpCategory::getCategoryNo);
+            lqw.apply("LENGTH(category_no) = 5"); // 只查顶级分类(5位)
+            lqw.orderByDesc(SysHelpCategory::getCategoryNo);
+            lqw.last("LIMIT 1");
+            SysHelpCategory last = baseMapper.selectOne(lqw);
+            if (last == null || StringUtils.isBlank(last.getCategoryNo())) {
+                return "00001";
+            }
+            // 提取编号数字部分并+1
+            int num = Integer.parseInt(last.getCategoryNo()) + 1;
+            return String.format("%05d", num);
+        } else {
+            // 子分类:在父编号基础上追加序号
+            LambdaQueryWrapper<SysHelpCategory> lqw = Wrappers.lambdaQuery();
+            lqw.eq(StringUtils.isNotBlank(platformCode), SysHelpCategory::getPlatformCode, platformCode);
+            lqw.eq(SysHelpCategory::getParentNo, parentNo);
+            lqw.orderByDesc(SysHelpCategory::getCategoryNo);
+            lqw.last("LIMIT 1");
+            SysHelpCategory last = baseMapper.selectOne(lqw);
+            if (last == null || StringUtils.isBlank(last.getCategoryNo())) {
+                return parentNo + "001";
+            }
+            // 提取最后3位数字并+1
+            String lastNo = last.getCategoryNo();
+            int num = Integer.parseInt(lastNo.substring(lastNo.length() - 3)) + 1;
+            return parentNo + String.format("%03d", num);
+        }
+    }
+
+    /**
+     * 修改帮助分类
+     *
+     * @param bo 帮助分类
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysHelpCategoryBo bo) {
+        SysHelpCategory update = MapstructUtils.convert(bo, SysHelpCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysHelpCategory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除帮助分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 167 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysHelpCenterServiceImpl.java

@@ -0,0 +1,167 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysHelpCenterBo;
+import org.dromara.system.domain.vo.SysHelpCenterVo;
+import org.dromara.system.domain.SysHelpCenter;
+import org.dromara.system.mapper.SysHelpCenterMapper;
+import org.dromara.system.service.ISysHelpCenterService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 帮助中心Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysHelpCenterServiceImpl  extends ServiceImpl<SysHelpCenterMapper, SysHelpCenter> implements ISysHelpCenterService {
+
+    private final SysHelpCenterMapper baseMapper;
+
+    /**
+     * 查询帮助中心
+     *
+     * @param id 主键
+     * @return 帮助中心
+     */
+    @Override
+    public SysHelpCenterVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询帮助中心列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 帮助中心分页列表
+     */
+    @Override
+    public TableDataInfo<SysHelpCenterVo> queryPageList(SysHelpCenterBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysHelpCenter> lqw = buildQueryWrapper(bo);
+        Page<SysHelpCenterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的帮助中心列表
+     *
+     * @param bo 查询条件
+     * @return 帮助中心列表
+     */
+    @Override
+    public List<SysHelpCenterVo> queryList(SysHelpCenterBo bo) {
+        LambdaQueryWrapper<SysHelpCenter> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysHelpCenter> buildQueryWrapper(SysHelpCenterBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysHelpCenter> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysHelpCenter::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getHelpCenterNo()), SysHelpCenter::getHelpCenterNo, bo.getHelpCenterNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getHelpTitle()), SysHelpCenter::getHelpTitle, bo.getHelpTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getHelpType()), SysHelpCenter::getHelpType, bo.getHelpType());
+        lqw.eq(StringUtils.isNotBlank(bo.getSubType()), SysHelpCenter::getSubType, bo.getSubType());
+        lqw.eq(bo.getIsShow() != null, SysHelpCenter::getIsShow, bo.getIsShow());
+        lqw.eq(bo.getHelpImage() != null, SysHelpCenter::getHelpImage, bo.getHelpImage());
+        lqw.eq(StringUtils.isNotBlank(bo.getHelpContent()), SysHelpCenter::getHelpContent, bo.getHelpContent());
+        lqw.eq(bo.getViewCount() != null, SysHelpCenter::getViewCount, bo.getViewCount());
+        lqw.eq(bo.getSort() != null, SysHelpCenter::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysHelpCenter::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysHelpCenter::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增帮助中心
+     *
+     * @param bo 帮助中心
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysHelpCenterBo bo) {
+        SysHelpCenter add = MapstructUtils.convert(bo, SysHelpCenter.class);
+        // 自动生成编号
+        add.setHelpCenterNo(generateHelpCenterNo(bo.getPlatformCode()));
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成帮助中心编号
+     * 规则:00001, 00002...
+     */
+    private String generateHelpCenterNo(String platformCode) {
+        LambdaQueryWrapper<SysHelpCenter> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(platformCode), SysHelpCenter::getPlatformCode, platformCode);
+        lqw.isNotNull(SysHelpCenter::getHelpCenterNo);
+        lqw.orderByDesc(SysHelpCenter::getHelpCenterNo);
+        lqw.last("LIMIT 1");
+        SysHelpCenter last = baseMapper.selectOne(lqw);
+        if (last == null || StringUtils.isBlank(last.getHelpCenterNo())) {
+            return "00001";
+        }
+        try {
+            int num = Integer.parseInt(last.getHelpCenterNo()) + 1;
+            return String.format("%05d", num);
+        } catch (NumberFormatException e) {
+            return "00001";
+        }
+    }
+
+    /**
+     * 修改帮助中心
+     *
+     * @param bo 帮助中心
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysHelpCenterBo bo) {
+        SysHelpCenter update = MapstructUtils.convert(bo, SysHelpCenter.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysHelpCenter entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除帮助中心信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 137 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUploadImgLibServiceImpl.java

@@ -0,0 +1,137 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysUploadImgLibBo;
+import org.dromara.system.domain.vo.SysUploadImgLibVo;
+import org.dromara.system.domain.SysUploadImgLib;
+import org.dromara.system.mapper.SysUploadImgLibMapper;
+import org.dromara.system.service.ISysUploadImgLibService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 图片库Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysUploadImgLibServiceImpl  extends ServiceImpl<SysUploadImgLibMapper, SysUploadImgLib> implements ISysUploadImgLibService {
+
+    private final SysUploadImgLibMapper baseMapper;
+
+    /**
+     * 查询图片库
+     *
+     * @param id 主键
+     * @return 图片库
+     */
+    @Override
+    public SysUploadImgLibVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询图片库列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 图片库分页列表
+     */
+    @Override
+    public TableDataInfo<SysUploadImgLibVo> queryPageList(SysUploadImgLibBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysUploadImgLib> lqw = buildQueryWrapper(bo);
+        Page<SysUploadImgLibVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的图片库列表
+     *
+     * @param bo 查询条件
+     * @return 图片库列表
+     */
+    @Override
+    public List<SysUploadImgLibVo> queryList(SysUploadImgLibBo bo) {
+        LambdaQueryWrapper<SysUploadImgLib> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysUploadImgLib> buildQueryWrapper(SysUploadImgLibBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysUploadImgLib> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysUploadImgLib::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getImageName()), SysUploadImgLib::getImageName, bo.getImageName());
+        lqw.eq(StringUtils.isNotBlank(bo.getImageUrl()), SysUploadImgLib::getImageUrl, bo.getImageUrl());
+        lqw.eq(bo.getOssId() != null, SysUploadImgLib::getOssId, bo.getOssId());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysUploadImgLib::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysUploadImgLib::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增图片库
+     *
+     * @param bo 图片库
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysUploadImgLibBo bo) {
+        SysUploadImgLib add = MapstructUtils.convert(bo, SysUploadImgLib.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改图片库
+     *
+     * @param bo 图片库
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysUploadImgLibBo bo) {
+        SysUploadImgLib update = MapstructUtils.convert(bo, SysUploadImgLib.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysUploadImgLib entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除图片库信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAnnouncementMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysAnnouncementMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysCustomPosterMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysCustomPosterMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysHelpCategoryMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysHelpCategoryMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysHelpCenterMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysHelpCenterMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUploadImgLibMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysUploadImgLibMapper">
+
+</mapper>