132 lines
3.7 KiB
Java
132 lines
3.7 KiB
Java
|
|
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<AppBlogArticle> 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<AppResource> 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;
|
||
|
|
}
|
||
|
|
}
|