Files
aishangjia-uniapp/common/model/Setting.js

124 lines
3.2 KiB
JavaScript
Executable File

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
}