83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
/**
|
||
* @description 默认封面工具函数
|
||
* @filename defaultCover.ts
|
||
* @author system
|
||
* @since 2025-12-24
|
||
*/
|
||
|
||
import { resourceTagApi } from '@/apis/resource/resourceTag';
|
||
import { FILE_DOWNLOAD_URL } from '@/config';
|
||
import defaultArticleImg from '@/assets/imgs/article-default.png';
|
||
|
||
// 缓存标签默认封面,避免重复请求
|
||
const tagCoverCache: Map<string, string[]> = new Map();
|
||
|
||
/**
|
||
* 根据标签ID获取随机默认封面
|
||
* @param tagID 标签ID
|
||
* @returns Promise<string> 封面URL
|
||
*/
|
||
export async function getRandomDefaultCover(tagID: string | undefined): Promise<string> {
|
||
// 如果没有tagID,返回默认封面
|
||
if (!tagID) {
|
||
return defaultArticleImg;
|
||
}
|
||
|
||
try {
|
||
// 检查缓存
|
||
if (tagCoverCache.has(tagID)) {
|
||
const covers = tagCoverCache.get(tagID)!;
|
||
if (covers.length > 0) {
|
||
// 随机选择一个
|
||
const randomIndex = Math.floor(Math.random() * covers.length);
|
||
return covers[randomIndex];
|
||
}
|
||
return defaultArticleImg;
|
||
}
|
||
|
||
// 从后端获取
|
||
const result = await resourceTagApi.getDefaultCovers(tagID);
|
||
|
||
if (result.success && result.dataList && result.dataList.length > 0) {
|
||
// 构建完整的URL列表
|
||
const coverUrls = result.dataList.map((cover: any) =>
|
||
`${FILE_DOWNLOAD_URL}${cover.coverImage}`
|
||
);
|
||
|
||
// 存入缓存
|
||
tagCoverCache.set(tagID, coverUrls);
|
||
|
||
// 随机选择一个
|
||
const randomIndex = Math.floor(Math.random() * coverUrls.length);
|
||
return coverUrls[randomIndex];
|
||
}
|
||
|
||
// 如果没有配置默认封面,返回通用默认封面
|
||
return defaultArticleImg;
|
||
} catch (error) {
|
||
console.error('获取标签默认封面失败:', error);
|
||
return defaultArticleImg;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 清除标签封面缓存
|
||
* @param tagID 可选,指定清除某个标签的缓存,不传则清除所有
|
||
*/
|
||
export function clearTagCoverCache(tagID?: string) {
|
||
if (tagID) {
|
||
tagCoverCache.delete(tagID);
|
||
} else {
|
||
tagCoverCache.clear();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 预加载标签默认封面到缓存
|
||
* @param tagIDs 标签ID列表
|
||
*/
|
||
export async function preloadTagCovers(tagIDs: string[]) {
|
||
const promises = tagIDs.map(tagID => getRandomDefaultCover(tagID));
|
||
await Promise.all(promises);
|
||
}
|