import store from '@/store' import Config from '@/core/config' import storage from '@/utils/storage' import * as SettingApi from '@/api/setting' import SettingKeyEnum from '@/common/enum/setting/Key' import platform from '@/core/platform' const CACHE_KEY = 'Setting' const OTHER = '_other' // 写入缓存, 到期时间10分钟 const setStorage = (data) => { const expireTime = 10 * 60 storage.set(CACHE_KEY, data, expireTime) } // 获取缓存中的数据 const getStorage = () => { return storage.get(CACHE_KEY) } // 获取后端接口商城设置 (最新) const getApiData = () => { return new Promise((resolve, reject) => { SettingApi.data() .then(result => { resolve(result.data.setting) }) }) } /** * 获取商城设置 * 有缓存的情况下返回缓存, 没有缓存从后端api获取 * @param {bool} isCache 是否从缓存中获取 [优点不用每次请求后端api 缺点后台更新设置后需等待时效性] */ const data = isCache => { if (isCache == undefined) { isCache = Config.get('enabledSettingCache') } return new Promise((resolve, reject) => { const cacheData = getStorage() if (isCache && cacheData) { resolve(cacheData) } else { getApiData() .then(data => { setStorage(data) resolve(data) }) } }) } // 获取商城设置(指定项) const item = (key, isCache) => { return new Promise((resolve, reject) => { data(isCache).then(setting => resolve(setting[key])) }) } // 获取H5端访问地址 const h5Url = (isCache = false) => { return new Promise((resolve, reject) => { data(isCache) .then(setting => { try { // 检查设置数据是否存在 if (!setting || typeof setting !== 'object') { throw new Error('设置数据无效') } // 检查 _other 字段是否存在 if (!setting[OTHER] || typeof setting[OTHER] !== 'object') { throw new Error('_other 设置字段不存在') } // 检查 h5Url 字段是否存在 const h5UrlValue = setting[OTHER]['h5Url'] if (!h5UrlValue || typeof h5UrlValue !== 'string' || h5UrlValue.trim() === '') { throw new Error('H5地址未配置或无效') } resolve(h5UrlValue.trim()) } catch (error) { console.error('获取H5地址失败:', error) reject(error) } }) .catch(err => { console.error('获取设置数据失败:', err) reject(err) }) }) } // 设置全局自定义主题 const setAppTheme = () => { return new Promise((resolve, reject) => { item(SettingKeyEnum.APP_THEME.value, false) .then(appTheme => { store.dispatch('SetAppTheme', appTheme) resolve() }) }) } // 是否显示客服按钮 (微信小程序客服只有在微信小程序端显示) const isShowCustomerBtn = async () => { const setting = await item(SettingKeyEnum.CUSTOMER.value, true) if (!setting.enabled) { return false } return setting.provider === 'wxqykf' || (setting.provider === 'mpwxkf' && platform === 'MP-WEIXIN') } export default { data, item, h5Url, setAppTheme, isShowCustomerBtn }