Files
gym-manage/gym-manage-coach-uniapp/store/brand.js
T
2026-07-23 18:56:35 +08:00

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