Files
schoolNews/schoolNewsWeb/src/utils/defaultCover.ts

83 lines
2.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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);
}