wangyunpeng 3 روز پیش
والد
کامیت
729aef1462

+ 64 - 7
long-article-server/src/main/java/com/tzld/piaoquan/longarticle/service/local/impl/VideoMultiServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.util.List;
 import java.util.Objects;
@@ -36,9 +37,6 @@ public class VideoMultiServiceImpl implements VideoMultiService {
 
     @Override
     public String setVideoMultiTitleCoverPagePath(Long videoId, String pageUrl, String title, String coverUrl) {
-        if (pageUrl.contains("growthExtData")) {
-            return pageUrl;
-        }
         List<VideoGrowthMultiTitle> multiTitleList = getMultiTitleByVideoId(videoId);
         List<VideoGrowthMultiCover> multiCoverList = getMultiCoverByVideoId(videoId);
         PageUrlExtData extData = new PageUrlExtData();
@@ -59,7 +57,7 @@ public class VideoMultiServiceImpl implements VideoMultiService {
                     extData.setGrowthTitleSource(titleSource);
                 }
             } catch (Exception e) {
-                log.error("VideoMultiService VideoMultiService Error,data: {}", e.getMessage());
+                log.error("VideoMultiService VideoMultiService Error,data:", e);
             }
         }
         if (Objects.isNull(extData.getGrowthTitleId())) {
@@ -99,7 +97,7 @@ public class VideoMultiServiceImpl implements VideoMultiService {
                     extData.setGrowthCoverSource(coverSource);
                 }
             } catch (Exception e) {
-                log.error("VideoMultiService VideoMultiService Error,data: {}", e.getMessage());
+                log.error("VideoMultiService VideoMultiService Error,data:", e);
             }
         }
         if (Objects.isNull(extData.getGrowthCoverId())) {
@@ -123,14 +121,73 @@ public class VideoMultiServiceImpl implements VideoMultiService {
         }
         if (Objects.nonNull(extData.getGrowthTitleId()) || Objects.nonNull(extData.getGrowthCoverId())) {
             try {
-                pageUrl += URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
+                pageUrl = mergeOrAppendGrowthExtData(pageUrl, extData);
             } catch (Exception e) {
-                log.error("VideoMultiService VideoMultiService Error,data: {}", e.getMessage());
+                log.error("VideoMultiService VideoMultiService Error,data:", e);
             }
         }
         return pageUrl;
     }
 
+    /**
+     * 将 extData 中的字段合并到 pageUrl 的 growthExtData 中:
+     * - pageUrl 不含 growthExtData:在末尾拼接 URL 编码后的 &growthExtData={...}
+     * - pageUrl 已含 growthExtData:解析出已有 JSON 对象,将新字段合并进去后再替换回原位置
+     */
+    private String mergeOrAppendGrowthExtData(String pageUrl, PageUrlExtData extData) throws Exception {
+        int valueStart = -1;
+        int valueEnd = -1;
+        int gIdx = pageUrl.indexOf("growthExtData");
+        if (gIdx >= 0) {
+            int afterKey = gIdx + "growthExtData".length();
+            if (pageUrl.length() > afterKey && pageUrl.charAt(afterKey) == '=') {
+                valueStart = afterKey + 1;
+            } else if (pageUrl.length() >= afterKey + 3
+                    && pageUrl.substring(afterKey, afterKey + 3).equalsIgnoreCase("%3D")) {
+                valueStart = afterKey + 3;
+            }
+            if (valueStart > 0) {
+                valueEnd = pageUrl.length();
+                int ampIdx = pageUrl.indexOf("&", valueStart);
+                if (ampIdx >= 0 && ampIdx < valueEnd) {
+                    valueEnd = ampIdx;
+                }
+                int encAmpIdx = pageUrl.indexOf("%26", valueStart);
+                if (encAmpIdx >= 0 && encAmpIdx < valueEnd) {
+                    valueEnd = encAmpIdx;
+                }
+            }
+        }
+
+        if (valueStart > 0) {
+            // 已存在 growthExtData:解析出对象,将新字段合并进去
+            String encodedJson = pageUrl.substring(valueStart, valueEnd);
+            JSONObject existing = null;
+            try {
+                String jsonStr = URLDecoder.decode(encodedJson, "UTF-8");
+                existing = JSONObject.parseObject(jsonStr);
+            } catch (Exception e) {
+                log.error("VideoMultiService parse existing growthExtData error", e);
+            }
+            if (existing == null) {
+                existing = new JSONObject();
+            }
+            if (Objects.nonNull(extData.getGrowthTitleId())) {
+                existing.put("growthTitleId", extData.getGrowthTitleId());
+                existing.put("growthTitleSource", extData.getGrowthTitleSource());
+            }
+            if (Objects.nonNull(extData.getGrowthCoverId())) {
+                existing.put("growthCoverId", extData.getGrowthCoverId());
+                existing.put("growthCoverSource", extData.getGrowthCoverSource());
+            }
+            String newEncodedJson = URLEncoder.encode(JSONObject.toJSONString(existing), "UTF-8");
+            return pageUrl.substring(0, valueStart) + newEncodedJson + pageUrl.substring(valueEnd);
+        }
+
+        // pageUrl 中不存在 growthExtData:直接在末尾拼接
+        return pageUrl + URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
+    }
+
     @Override
     public Long saveMultiTitle(Long videoId, String source, String title) {
         VideoGrowthMultiTitle multiTitle = new VideoGrowthMultiTitle();