148 lines
3.0 KiB
JavaScript
148 lines
3.0 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import config from '@/config'
|
|
|
|
export const useAppStore = defineStore('app', () => {
|
|
// State
|
|
const sidebarCollapsed = ref(false)
|
|
const device = ref('unknown')
|
|
const language = ref('zh-CN')
|
|
const theme = ref('light')
|
|
const settings = ref(null)
|
|
|
|
// Actions
|
|
|
|
/**
|
|
* 设置侧边栏折叠状态
|
|
* @param {boolean} collapsed
|
|
*/
|
|
function setSidebarCollapsed(collapsed) {
|
|
sidebarCollapsed.value = collapsed
|
|
}
|
|
|
|
/**
|
|
* 切换侧边栏
|
|
*/
|
|
function toggleSidebar() {
|
|
sidebarCollapsed.value = !sidebarCollapsed.value
|
|
}
|
|
|
|
/**
|
|
* 设置设备类型
|
|
* @param {string} type - 'h5' | 'app' | 'mp-weixin' | 'mp-alipay' | 'mp-baidu' | 'mp-toutiao' | 'mp-qq' | 'mp-ks' | 'mp-jd'
|
|
*/
|
|
function setDevice(type) {
|
|
device.value = type
|
|
}
|
|
|
|
/**
|
|
* 设置语言
|
|
* @param {string} lang
|
|
*/
|
|
function setLanguage(lang) {
|
|
language.value = lang
|
|
uni.setStorageSync('app_language', lang)
|
|
}
|
|
|
|
/**
|
|
* 设置主题
|
|
* @param {string} mode - 'light' | 'dark'
|
|
*/
|
|
function setTheme(mode) {
|
|
theme.value = mode
|
|
uni.setStorageSync('app_theme', mode)
|
|
}
|
|
|
|
/**
|
|
* 切换主题
|
|
*/
|
|
function toggleTheme() {
|
|
const newTheme = theme.value === 'light' ? 'dark' : 'light'
|
|
setTheme(newTheme)
|
|
}
|
|
|
|
/**
|
|
* 设置应用配置
|
|
* @param {object} data
|
|
*/
|
|
function setSettings(data) {
|
|
settings.value = data
|
|
uni.setStorageSync(config.storage.settings, JSON.stringify(data))
|
|
}
|
|
|
|
/**
|
|
* 更新设置
|
|
* @param {object} data
|
|
*/
|
|
function updateSettings(data) {
|
|
settings.value = {
|
|
...settings.value,
|
|
...data
|
|
}
|
|
uni.setStorageSync(config.storage.settings, JSON.stringify(settings.value))
|
|
}
|
|
|
|
/**
|
|
* 从本地存储初始化
|
|
*/
|
|
function initFromStorage() {
|
|
// 获取语言设置
|
|
const savedLanguage = uni.getStorageSync('app_language')
|
|
if (savedLanguage) {
|
|
language.value = savedLanguage
|
|
}
|
|
|
|
// 获取主题设置
|
|
const savedTheme = uni.getStorageSync('app_theme')
|
|
if (savedTheme) {
|
|
theme.value = savedTheme
|
|
}
|
|
|
|
// 获取应用设置
|
|
const savedSettings = uni.getStorageSync(config.storage.settings)
|
|
if (savedSettings) {
|
|
try {
|
|
settings.value = JSON.parse(savedSettings)
|
|
} catch (e) {
|
|
console.error('解析应用设置失败:', e)
|
|
settings.value = null
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除设置
|
|
*/
|
|
function clearSettings() {
|
|
language.value = 'zh-CN'
|
|
theme.value = 'light'
|
|
settings.value = null
|
|
|
|
// 清除本地存储
|
|
uni.removeStorageSync('app_language')
|
|
uni.removeStorageSync('app_theme')
|
|
uni.removeStorageSync(config.storage.settings)
|
|
}
|
|
|
|
return {
|
|
// State
|
|
sidebarCollapsed,
|
|
device,
|
|
language,
|
|
theme,
|
|
settings,
|
|
|
|
// Actions
|
|
setSidebarCollapsed,
|
|
toggleSidebar,
|
|
setDevice,
|
|
setLanguage,
|
|
setTheme,
|
|
toggleTheme,
|
|
setSettings,
|
|
updateSettings,
|
|
initFromStorage,
|
|
clearSettings
|
|
}
|
|
})
|