ai-c/utils/assets.js
2026-02-02 18:21:32 +08:00

194 lines
5.5 KiB
JavaScript
Raw Permalink 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.

/**
* 页面素材管理工具类
* 用于小程序获取和缓存后台配置的图片资源
*/
const config = require('../config/index');
const API_BASE_URL = config.API_BASE_URL.replace('/api', ''); // 移除 /api 后缀
const CACHE_KEY = 'pageAssets';
const CACHE_DURATION = 30 * 60 * 1000; // 30分钟缓存
/**
* 获取页面素材配置
* @param {string|null} group - 素材分组名称,不传则获取全部
* @param {boolean} forceRefresh - 是否强制刷新,忽略缓存
* @returns {Promise<Object|null>} 素材配置对象
*/
async function getPageAssets(group = null, forceRefresh = false) {
try {
// 1. 如果不强制刷新,先尝试从缓存读取
if (!forceRefresh) {
const cached = getCachedAssets();
if (cached) {
return group ? cached[group] : cached;
}
}
// 2. 从服务器获取
const url = group
? `${API_BASE_URL}/api/page-assets?group=${group}`
: `${API_BASE_URL}/api/page-assets`;
const res = await wx.request({
url,
method: 'GET',
timeout: 10000
});
if (res.statusCode === 200 && res.data.success) {
// 3. 更新缓存(只有获取全部时才缓存)
if (!group) {
setCachedAssets(res.data.data);
}
return res.data.data;
}
// 4. 请求失败,返回默认配置
console.warn('获取素材配置失败,使用默认配置');
return getDefaultAssets(group);
} catch (error) {
console.error('获取素材配置异常:', error);
return getDefaultAssets(group);
}
}
/**
* 从缓存读取素材配置
*/
function getCachedAssets() {
try {
const cached = wx.getStorageSync(CACHE_KEY);
if (cached && cached.timestamp && cached.data) {
if (Date.now() - cached.timestamp < CACHE_DURATION) {
return cached.data;
}
}
return null;
} catch (error) {
console.error('读取缓存失败:', error);
return null;
}
}
/**
* 保存素材配置到缓存
*/
function setCachedAssets(data) {
try {
wx.setStorageSync(CACHE_KEY, {
data,
timestamp: Date.now()
});
} catch (error) {
console.error('保存缓存失败:', error);
}
}
/**
* 清除素材缓存
*/
function clearAssetsCache() {
try {
wx.removeStorageSync(CACHE_KEY);
console.log('素材缓存已清除');
} catch (error) {
console.error('清除缓存失败:', error);
}
}
/**
* 预加载素材配置(建议在 app.js 的 onLaunch 中调用)
*/
async function preloadAssets() {
try {
await getPageAssets(null, false);
console.log('素材配置预加载完成');
} catch (error) {
console.error('素材配置预加载失败:', error);
}
}
/**
* 获取默认素材配置(降级方案 - 使用CDN URL
*/
function getDefaultAssets(group = null) {
const cdnBase = 'https://ai-c.maimanji.com/images'
const defaults = {
banners: {
companion_banner: `${cdnBase}/Header-banner.png`,
service_banner: `${cdnBase}/service-banner-1.png`,
home_banner: `${cdnBase}/Header-banner.png`,
medical_banner: `${cdnBase}/service-banner-2.png`,
housekeeping_banner: `${cdnBase}/service-banner-3.png`,
eldercare_banner: `${cdnBase}/service-banner-4.png`,
service_banner_5: `${cdnBase}/service-banner-5.png`,
service_banner_6: `${cdnBase}/service-banner-6.png`,
cooperation_banner: `${cdnBase}/Header-banner.png`,
},
entries: {
entry_1: `${cdnBase}/pb01.png`,
entry_2: `${cdnBase}/pb02.png`,
entry_3: `${cdnBase}/pb03.png`,
entry_4: `${cdnBase}/pb04.png`,
},
icons: {
consult_button: `${cdnBase}/btn-text-consult.png`,
gift: `${cdnBase}/icon-gift.png`,
location: `${cdnBase}/icon-location.png`,
},
service_icons: {
medical: `${cdnBase}/icon-medical.png`,
flow: `${cdnBase}/icon-flow.png`,
advantage: `${cdnBase}/icon-advantage.png`,
professional: `${cdnBase}/icon-professional.png`,
safe: `${cdnBase}/icon-safe.png`,
efficient: `${cdnBase}/icon-efficient.png`,
care: `${cdnBase}/icon-care.png`,
},
status_icons: {
pending: `${cdnBase}/icon-pending.png`,
success: `${cdnBase}/icon-success.png`,
rejected: `${cdnBase}/icon-rejected.png`,
},
empty_states: {
orders: `${cdnBase}/empty-orders.png`,
messages: `${cdnBase}/empty-messages.png`,
},
defaults: {
avatar: `${cdnBase}/default-avatar.png`,
placeholder: '/images/placeholder.jpg',
},
tabbar: {
listen: `${cdnBase}/tab-listen.png`,
listen_active: `${cdnBase}/tab-listen-active.png`,
companion: `${cdnBase}/tab-companion.png`,
companion_active: `${cdnBase}/tab-companion-active.png`,
service: `${cdnBase}/tab-service.png`,
service_active: `${cdnBase}/tab-service-active.png`,
message: `${cdnBase}/tab-message.png`,
message_unread: `${cdnBase}/tab-message-nodot.png`,
message_active: `${cdnBase}/tab-message-active.png`,
profile: `${cdnBase}/tab-profile.png`,
profile_active: `${cdnBase}/tab-profile-active.png`,
square: `${cdnBase}/tab-compass.png`,
square_active: `${cdnBase}/tab-compass-active.png`,
},
workbench: {
orders: `${cdnBase}/icon-orders.png`,
customers: `${cdnBase}/icon-customers.png`,
withdraw: `${cdnBase}/icon-withdraw.png`,
commission: `${cdnBase}/icon-commission.png`,
},
};
return group ? defaults[group] : defaults;
}
module.exports = {
getPageAssets,
clearAssetsCache,
preloadAssets
};