|
|
@@ -316,21 +316,87 @@ export const clearBackgroundImage = (): void => {
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
- * 背景图片 URL 映射
|
|
|
+ * 背景图片配置缓存(从数据库获取)
|
|
|
*/
|
|
|
-export const BACKGROUND_IMAGE_URL_MAP: Record<string, string> = {
|
|
|
- default: 'https://lyrria-pro.oss-cn-beijing.aliyuncs.com/init.svg',
|
|
|
- happynewyear: 'https://lyrria-pro.oss-cn-beijing.aliyuncs.com/happynewyear.jpg',
|
|
|
+let backgroundImageConfigCache: Record<string, { image_url: string; [key: string]: any }> | null = null;
|
|
|
+let backgroundImageConfigLoading: Promise<void> | null = null;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 从 API 获取并缓存背景图片配置
|
|
|
+ */
|
|
|
+export const loadBackgroundImageConfig = async (): Promise<void> => {
|
|
|
+ // 如果正在加载,等待加载完成
|
|
|
+ if (backgroundImageConfigLoading) {
|
|
|
+ return backgroundImageConfigLoading;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果已有缓存,直接返回
|
|
|
+ if (backgroundImageConfigCache !== null) {
|
|
|
+ return Promise.resolve();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 开始加载
|
|
|
+ backgroundImageConfigLoading = (async () => {
|
|
|
+ try {
|
|
|
+ const { getBackgroundImages } = await import('./api');
|
|
|
+ const response = await getBackgroundImages();
|
|
|
+
|
|
|
+ if (response.success && response.data) {
|
|
|
+ // 构建映射表:image_id -> { image_url, ... }
|
|
|
+ backgroundImageConfigCache = {};
|
|
|
+ for (const config of response.data) {
|
|
|
+ if (config.image_id && config.image_url) {
|
|
|
+ backgroundImageConfigCache[config.image_id] = {
|
|
|
+ image_url: config.image_url,
|
|
|
+ ...config,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ console.log('[storage] 背景图片配置加载成功:', Object.keys(backgroundImageConfigCache));
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('[storage] 加载背景图片配置失败:', error);
|
|
|
+ // 加载失败时使用默认值,避免阻塞应用
|
|
|
+ backgroundImageConfigCache = {
|
|
|
+ default: {
|
|
|
+ image_url: 'https://lyrria-pro.oss-cn-beijing.aliyuncs.com/init.svg',
|
|
|
+ },
|
|
|
+ };
|
|
|
+ } finally {
|
|
|
+ backgroundImageConfigLoading = null;
|
|
|
+ }
|
|
|
+ })();
|
|
|
+
|
|
|
+ return backgroundImageConfigLoading;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 根据背景图片ID获取URL
|
|
|
*/
|
|
|
-export const getBackgroundImageUrlById = (image_id: string | null | undefined): string | null => {
|
|
|
+export const getBackgroundImageUrlById = async (image_id: string | null | undefined): Promise<string | null> => {
|
|
|
if (!image_id) {
|
|
|
return null;
|
|
|
}
|
|
|
- return BACKGROUND_IMAGE_URL_MAP[image_id] || null;
|
|
|
+
|
|
|
+ // 如果缓存未加载,先加载
|
|
|
+ if (backgroundImageConfigCache === null) {
|
|
|
+ await loadBackgroundImageConfig();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从缓存中获取
|
|
|
+ const config = backgroundImageConfigCache?.[image_id];
|
|
|
+ return config?.image_url || null;
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 同步版本:根据背景图片ID获取URL(使用缓存,如果缓存未加载则返回 null)
|
|
|
+ * 注意:此函数不会触发 API 请求,仅从缓存读取
|
|
|
+ */
|
|
|
+export const getBackgroundImageUrlByIdSync = (image_id: string | null | undefined): string | null => {
|
|
|
+ if (!image_id || backgroundImageConfigCache === null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return backgroundImageConfigCache[image_id]?.image_url || null;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -376,7 +442,7 @@ export const syncBackgroundImageToStorage = (
|
|
|
if (!image_id) {
|
|
|
// 如果没有 image_id,使用默认值
|
|
|
const defaultId = 'default';
|
|
|
- const defaultUrl = getBackgroundImageUrlById(defaultId);
|
|
|
+ const defaultUrl = getBackgroundImageUrlByIdSync(defaultId);
|
|
|
if (defaultUrl) {
|
|
|
setBackgroundImage(defaultId, defaultUrl);
|
|
|
}
|
|
|
@@ -385,13 +451,23 @@ export const syncBackgroundImageToStorage = (
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const image_url = getBackgroundImageUrlById(image_id);
|
|
|
+ const image_url = getBackgroundImageUrlByIdSync(image_id);
|
|
|
if (image_url) {
|
|
|
setBackgroundImage(image_id, image_url);
|
|
|
} else {
|
|
|
// 如果找不到对应的 URL,只存储 ID
|
|
|
setCurrentBackgroundImageId(image_id);
|
|
|
- console.warn(`[storage] 未找到背景图片URL映射: image_id=${image_id}`);
|
|
|
+ // 如果缓存未加载,尝试异步加载
|
|
|
+ if (backgroundImageConfigCache === null) {
|
|
|
+ loadBackgroundImageConfig().then(() => {
|
|
|
+ const url = getBackgroundImageUrlByIdSync(image_id);
|
|
|
+ if (url) {
|
|
|
+ setBackgroundImage(image_id, url);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ console.warn(`[storage] 未找到背景图片URL映射: image_id=${image_id}`);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 如果提供了metadata,提取并存储透明度配置
|