87 lines
2.5 KiB
JavaScript
87 lines
2.5 KiB
JavaScript
const brandApi = require('../api/brand')
|
|
|
|
const BRAND_CACHE_KEY = 'brand_config_cache'
|
|
|
|
const DEFAULT_CONFIG = {
|
|
brandName: 'Novalon教练端',
|
|
slogan: '高效管理 · 轻松授课',
|
|
primaryColor: '#00E676',
|
|
primaryColorRgb: '0,230,118',
|
|
secondaryColor: '#1A1A1A',
|
|
secondaryColorRgb: '26,26,26',
|
|
logoUrl: '',
|
|
backgroundImageUrl: '',
|
|
updatedAt: ''
|
|
}
|
|
|
|
/**
|
|
* 品牌方案 Store
|
|
*
|
|
* 响应式策略:fetchConfig 更新后通过 uni.$emit('brand:updated', config) 广播,
|
|
* 页面通过 uni.$on 监听并在 data 中维护副本,确保 UI 自动刷新。
|
|
*/
|
|
const brandStore = {
|
|
_config: null,
|
|
_loaded: false,
|
|
|
|
/** 获取当前品牌配置(优先内存,其次缓存,最后默认值) */
|
|
get config() {
|
|
if (this._config) return this._config
|
|
try {
|
|
const cached = uni.getStorageSync(BRAND_CACHE_KEY)
|
|
if (cached && cached.primaryColor) {
|
|
this._config = cached
|
|
return cached
|
|
}
|
|
} catch (e) { /* ignore */ }
|
|
return { ...DEFAULT_CONFIG }
|
|
},
|
|
|
|
/** 是否已从后端加载完成 */
|
|
get isLoaded() {
|
|
return this._loaded
|
|
},
|
|
|
|
/**
|
|
* 从后端拉取品牌配置
|
|
* 策略:对比 updatedAt,有变化时更新缓存并广播事件通知全部页面
|
|
* @returns {Promise<boolean>} 是否有变化
|
|
*/
|
|
async fetchConfig() {
|
|
try {
|
|
const res = await brandApi.getBrandConfig()
|
|
if (res) {
|
|
const newConfig = {
|
|
brandName: res.brandName || DEFAULT_CONFIG.brandName,
|
|
slogan: res.slogan || DEFAULT_CONFIG.slogan,
|
|
primaryColor: res.primaryColor || DEFAULT_CONFIG.primaryColor,
|
|
primaryColorRgb: res.primaryColorRgb || DEFAULT_CONFIG.primaryColorRgb,
|
|
secondaryColor: res.secondaryColor || DEFAULT_CONFIG.secondaryColor,
|
|
secondaryColorRgb: res.secondaryColorRgb || DEFAULT_CONFIG.secondaryColorRgb,
|
|
logoUrl: res.logoUrl || '',
|
|
backgroundImageUrl: res.backgroundImageUrl || '',
|
|
updatedAt: res.updatedAt || ''
|
|
}
|
|
|
|
if (!this._config || this._config.updatedAt !== newConfig.updatedAt) {
|
|
this._config = newConfig
|
|
try {
|
|
uni.setStorageSync(BRAND_CACHE_KEY, newConfig)
|
|
} catch (e) { /* ignore */ }
|
|
this._loaded = true
|
|
// 广播事件通知所有页面刷新
|
|
uni.$emit('brand:updated', newConfig)
|
|
return true
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.error('[BrandStore] 获取品牌配置失败:', e)
|
|
}
|
|
|
|
this._loaded = true
|
|
return false
|
|
}
|
|
}
|
|
|
|
module.exports = brandStore
|