package com.ruoyi.app.service; import com.ruoyi.app.domain.AppBlogArticle; import com.ruoyi.app.domain.AppResource; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.List; /** * Builds CDN image variants without persisting derived URLs in the database. */ @Component public class ImageUrlService { @Value("${app.image.cdn-domain:https://img.yidaima.cn}") private String cdnDomain; @Value("${app.image.article-card-operation:imageView2/1/w/600/h/375/format/webp/q/75/ignore-error/1}") private String articleCardOperation; @Value("${app.image.resource-card-operation:imageView2/1/w/500/h/400/format/webp/q/75/ignore-error/1}") private String resourceCardOperation; public void decorateArticles(List articles) { if (articles == null) { return; } for (AppBlogArticle article : articles) { decorateArticle(article); } } public AppBlogArticle decorateArticle(AppBlogArticle article) { if (article == null) { return null; } String originalUrl = normalizeOriginalUrl(article.getShowImg()); article.setShowImg(originalUrl); article.setShowImgThumb(buildThumbnailUrl(originalUrl, articleCardOperation)); decorateResource(article.getAppResource()); return article; } public void decorateResources(List resources) { if (resources == null) { return; } for (AppResource resource : resources) { decorateResource(resource); } } public AppResource decorateResource(AppResource resource) { if (resource == null) { return null; } String originalUrl = normalizeOriginalUrl(resource.getShowImg()); resource.setShowImg(originalUrl); resource.setShowImgThumb(buildThumbnailUrl(originalUrl, resourceCardOperation)); return resource; } public String normalizeOriginalUrl(String originalUrl) { if (originalUrl == null) { return null; } String url = originalUrl.trim(); String host = cdnHost(); String httpPrefix = "http://" + host + "/"; if (url.startsWith(httpPrefix)) { return "https://" + url.substring("http://".length()); } String protocolRelativePrefix = "//" + host + "/"; if (url.startsWith(protocolRelativePrefix)) { return "https:" + url; } return url; } private String buildThumbnailUrl(String originalUrl, String operation) { if (originalUrl == null || originalUrl.isEmpty()) { return originalUrl; } String cdnPrefix = "https://" + cdnHost() + "/"; if (!originalUrl.startsWith(cdnPrefix)) { return originalUrl; } // Avoid corrupting signed or already processed URLs. if (originalUrl.indexOf('?') >= 0) { return originalUrl; } return originalUrl + "?" + operation; } private String cdnHost() { String value = cdnDomain == null ? "img.yidaima.cn" : cdnDomain.trim(); if (value.startsWith("https://")) { value = value.substring("https://".length()); } else if (value.startsWith("http://")) { value = value.substring("http://".length()); } while (value.endsWith("/")) { value = value.substring(0, value.length() - 1); } return value; } }