This commit is contained in:
2026-02-21 14:57:05 +08:00
parent 6b92ffbfeb
commit 6d118287db
7 changed files with 790 additions and 0 deletions
+147
View File
@@ -0,0 +1,147 @@
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
}
})
+11
View File
@@ -0,0 +1,11 @@
// Store 入口文件
import { createPinia } from 'pinia'
// 导出所有 store
export { useUserStore } from './user'
export { useAppStore } from './app'
// 创建 pinia 实例
const pinia = createPinia()
export default pinia
+142
View File
@@ -0,0 +1,142 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import config from '@/config'
export const useUserStore = defineStore('user', () => {
// State
const token = ref('')
const refreshToken = ref('')
const userInfo = ref(null)
// Getters
const isLoggedIn = computed(() => !!token.value)
const userName = computed(() => userInfo.value?.name || '')
const userAvatar = computed(() => userInfo.value?.avatar || '')
const userId = computed(() => userInfo.value?.id || '')
// Actions
/**
* 设置 Token
* @param {string} newToken
*/
function setToken(newToken) {
token.value = newToken
uni.setStorageSync(config.storage.token, newToken)
}
/**
* 设置刷新 Token
* @param {string} newRefreshToken
*/
function setRefreshToken(newRefreshToken) {
refreshToken.value = newRefreshToken
uni.setStorageSync('app_refresh_token', newRefreshToken)
}
/**
* 设置用户信息
* @param {object} info
*/
function setUserInfo(info) {
userInfo.value = info
uni.setStorageSync(config.storage.userInfo, JSON.stringify(info))
}
/**
* 获取用户信息
* @returns {object|null}
*/
function getUserInfo() {
return userInfo.value
}
/**
* 从本地存储初始化
*/
function initFromStorage() {
// 获取 Token
const savedToken = uni.getStorageSync(config.storage.token)
if (savedToken) {
token.value = savedToken
}
// 获取刷新 Token
const savedRefreshToken = uni.getStorageSync('app_refresh_token')
if (savedRefreshToken) {
refreshToken.value = savedRefreshToken
}
// 获取用户信息
const savedUserInfo = uni.getStorageSync(config.storage.userInfo)
if (savedUserInfo) {
try {
userInfo.value = JSON.parse(savedUserInfo)
} catch (e) {
console.error('解析用户信息失败:', e)
userInfo.value = null
}
}
}
/**
* 清除用户数据
*/
function clearUserData() {
token.value = ''
refreshToken.value = ''
userInfo.value = null
// 清除本地存储
uni.removeStorageSync(config.storage.token)
uni.removeStorageSync('app_refresh_token')
uni.removeStorageSync(config.storage.userInfo)
}
/**
* 登出
*/
function logout() {
clearUserData()
// 跳转到登录页
uni.reLaunch({
url: '/pages/login/index'
})
}
/**
* 更新用户信息
* @param {object} data
*/
function updateUserInfo(data) {
userInfo.value = {
...userInfo.value,
...data
}
uni.setStorageSync(config.storage.userInfo, JSON.stringify(userInfo.value))
}
return {
// State
token,
refreshToken,
userInfo,
// Getters
isLoggedIn,
userName,
userAvatar,
userId,
// Actions
setToken,
setRefreshToken,
setUserInfo,
getUserInfo,
initFromStorage,
clearUserData,
logout,
updateUserInfo
}
})