Переглянути джерело

feat(mall): 重构分类项保存逻辑并新增主题色配置字段

- 在EpCategoryMainServiceImpl中新增ObjectMapper用于JSON解析
- 实现saveCategoryItems方法,支持从remark字段的JSON数据解析标签、笔记、分组信息
- 重构分类项保存逻辑,统一通过saveCategoryItems方法处理分类项数据
- 在EpSearchConfig相关类中新增categoryThemeColor和headerThemeColor字段
- 更新数据权限拦截器,将ep_表前缀加入到忽略范围配置中
hurx 1 тиждень тому
батько
коміт
6acd83201d

+ 3 - 1
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java

@@ -125,7 +125,8 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "sys_user_wechat",
         "mini_page_set",
         "maintain_info",
-        "maintenance_server_item"
+        "maintenance_server_item",
+        "ep_"
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));
 
@@ -248,6 +249,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
             || tableName.startsWith("external_")
             || tableName.startsWith("protocol_")
             || tableName.startsWith("ns_diy_")
+            || tableName.startsWith("ep_")
             ;
     }
 

+ 7 - 0
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/domain/EpSearchConfig.java

@@ -86,4 +86,11 @@ public class EpSearchConfig extends TenantEntity {
     private String remark;
 
 
+    /*分类主题色*/
+    private String categoryThemeColor;
+
+    /*头部主题色*/
+    private String headerThemeColor;
+
+
 }

+ 6 - 0
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/domain/bo/EpSearchConfigBo.java

@@ -82,6 +82,12 @@ public class EpSearchConfigBo extends BaseEntity {
      */
     private String remark;
 
+    /*分类主题色*/
+    private String categoryThemeColor;
+
+    /*头部主题色*/
+    private String headerThemeColor;
+
     /**
      * 热词列表
      */

+ 6 - 0
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/domain/vo/EpSearchConfigVo.java

@@ -101,6 +101,12 @@ public class EpSearchConfigVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    /*分类主题色*/
+    private String categoryThemeColor;
+
+    /*头部主题色*/
+    private String headerThemeColor;
+
     /**
      * 热词列表
      */

+ 87 - 17
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/EpCategoryMainServiceImpl.java

@@ -25,6 +25,8 @@ import org.dromara.mall.service.IEpCategoryMainService;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 /**
  * 分类设置主Service业务层处理
@@ -41,6 +43,8 @@ public class EpCategoryMainServiceImpl  extends ServiceImpl<EpCategoryMainMapper
 
     private final EpCategoryItemMapper categoryItemMapper;
 
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
     /**
      * 查询分类设置主
      *
@@ -164,15 +168,9 @@ public class EpCategoryMainServiceImpl  extends ServiceImpl<EpCategoryMainMapper
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
-            List<EpCategoryItemBo> categoryItemList = bo.getCategoryItemList();
-            if (categoryItemList != null && !categoryItemList.isEmpty()) {
-                for (EpCategoryItemBo categoryItem : categoryItemList) {
-                    categoryItem.setCategoryId(add.getId());
-                }
-                // 将BO转换为实体并批量插入
-                List<EpCategoryItem> items = MapstructUtils.convert(categoryItemList, EpCategoryItem.class);
-                categoryItemMapper.insertBatch(items);
-            }
+            
+            // 保存分类项列表
+            saveCategoryItems(add.getId(), bo);
         }
         return flag;
     }
@@ -193,17 +191,89 @@ public class EpCategoryMainServiceImpl  extends ServiceImpl<EpCategoryMainMapper
             categoryItemMapper.delete(Wrappers.<EpCategoryItem>lambdaQuery().eq(EpCategoryItem::getCategoryId, update.getId()));
 
             // 再重新添加新的子项
-            List<EpCategoryItemBo> categoryItemList = bo.getCategoryItemList();
-            if (categoryItemList != null && !categoryItemList.isEmpty()) {
-                for (EpCategoryItemBo categoryItem : categoryItemList) {
-                    categoryItem.setCategoryId(update.getId());
+            saveCategoryItems(update.getId(), bo);
+        }
+        return flag;
+    }
+
+    /**
+     * 保存分类项(从 remark 和 categoryItemList 中解析)
+     *
+     * @param categoryId 分类ID
+     * @param bo 业务对象
+     */
+    private void saveCategoryItems(Long categoryId, EpCategoryMainBo bo) {
+        List<EpCategoryItem> items = new java.util.ArrayList<>();
+        
+        // 1. 处理 remark 中的 JSON 数据
+        String remark = bo.getRemark();
+        if (StringUtils.isNotBlank(remark)) {
+            try {
+                JsonNode rootNode = objectMapper.readTree(remark);
+                
+                // 处理 tags
+                JsonNode tagsNode = rootNode.get("tags");
+                if (tagsNode != null && tagsNode.isArray()) {
+                    int sortOrder = 0;
+                    for (JsonNode tagNode : tagsNode) {
+                        EpCategoryItem item = new EpCategoryItem();
+                        item.setCategoryId(categoryId);
+                        item.setItemType("tag");
+                        item.setName(tagNode.has("name") ? tagNode.get("name").asText() : null);
+                        item.setLink(tagNode.has("link") ? tagNode.get("link").asText() : null);
+                        item.setSortOrder((long) sortOrder++);
+                        items.add(item);
+                    }
+                }
+                
+                // 处理 notes
+                JsonNode notesNode = rootNode.get("notes");
+                if (notesNode != null && notesNode.isArray()) {
+                    int sortOrder = items.size();
+                    for (JsonNode noteNode : notesNode) {
+                        EpCategoryItem item = new EpCategoryItem();
+                        item.setCategoryId(categoryId);
+                        item.setItemType("note");
+                        item.setName(noteNode.has("name") ? noteNode.get("name").asText() : null);
+                        item.setLink(noteNode.has("link") ? noteNode.get("link").asText() : null);
+                        item.setSortOrder((long) sortOrder++);
+                        items.add(item);
+                    }
+                }
+                
+                // 处理 groups(如果需要)
+                JsonNode groupsNode = rootNode.get("groups");
+                if (groupsNode != null && groupsNode.isArray()) {
+                    int sortOrder = items.size();
+                    for (JsonNode groupNode : groupsNode) {
+                        EpCategoryItem item = new EpCategoryItem();
+                        item.setCategoryId(categoryId);
+                        item.setItemType("group");
+                        item.setName(groupNode.has("name") ? groupNode.get("name").asText() : null);
+                        item.setLink(groupNode.has("link") ? groupNode.get("link").asText() : null);
+                        item.setSortOrder((long) sortOrder++);
+                        items.add(item);
+                    }
                 }
-                // 将BO转换为实体并批量插入
-                List<EpCategoryItem> items = MapstructUtils.convert(categoryItemList, EpCategoryItem.class);
-                categoryItemMapper.insertBatch(items);
+            } catch (Exception e) {
+                log.error("解析 remark JSON 数据失败", e);
             }
         }
-        return flag;
+        
+        // 2. 处理 categoryItemList(如果存在,优先级更高)
+        List<EpCategoryItemBo> categoryItemList = bo.getCategoryItemList();
+        if (categoryItemList != null && !categoryItemList.isEmpty()) {
+            for (EpCategoryItemBo categoryItemBo : categoryItemList) {
+                categoryItemBo.setCategoryId(categoryId);
+                EpCategoryItem item = MapstructUtils.convert(categoryItemBo, EpCategoryItem.class);
+                items.add(item);
+            }
+        }
+        
+        // 3. 批量插入
+        if (!items.isEmpty()) {
+            categoryItemMapper.insertBatch(items);
+        }
     }
 
     /**