223 lines
5.5 KiB
JavaScript
223 lines
5.5 KiB
JavaScript
import { defineStore } from 'pinia'
|
||
|
||
// 管理员认证状态管理store
|
||
export const useAuthStore = defineStore('auth', {
|
||
state: () => ({
|
||
token: localStorage.getItem('token') || '',
|
||
user: JSON.parse(localStorage.getItem('user') || 'null')
|
||
}),
|
||
|
||
getters: {
|
||
// 判断是否已登录
|
||
isAuthenticated: (state) => !!state.token && !!state.user,
|
||
// 获取用户名
|
||
username: (state) => state.user?.username || '',
|
||
// 获取用户角色
|
||
userRole: (state) => state.user?.role || ''
|
||
},
|
||
|
||
actions: {
|
||
// 登录
|
||
login(loginData,callback) {
|
||
const { accessToken} = loginData
|
||
this.token = accessToken
|
||
this.user = loginData
|
||
// 持久化存储
|
||
localStorage.setItem('token', accessToken)
|
||
localStorage.setItem('user', JSON.stringify(this.user))
|
||
callback&&callback();
|
||
},
|
||
|
||
// 登出
|
||
logout() {
|
||
this.token = ''
|
||
this.user = null
|
||
// 清除持久化存储
|
||
localStorage.removeItem('token')
|
||
localStorage.removeItem('user')
|
||
localStorage.removeItem('admin-remember-me')
|
||
},
|
||
|
||
// 检查认证状态
|
||
checkAuth() {
|
||
const storedToken = localStorage.getItem('token')
|
||
const storedUser = localStorage.getItem('user')
|
||
|
||
if (storedToken && storedUser) {
|
||
this.token = storedToken
|
||
this.user = JSON.parse(storedUser)
|
||
return true
|
||
}
|
||
|
||
return false
|
||
},
|
||
|
||
// 检查权限
|
||
hasPermission(requiredRole) {
|
||
if (!this.user) return false
|
||
|
||
const roleHierarchy = {
|
||
'admin': 3,
|
||
'manager': 2,
|
||
'user': 1
|
||
}
|
||
|
||
const userLevel = roleHierarchy[this.user.role] || 0
|
||
const requiredLevel = roleHierarchy[requiredRole] || 0
|
||
|
||
return userLevel >= requiredLevel
|
||
}
|
||
}
|
||
})
|
||
|
||
// 全局状态管理store
|
||
export const useAppStore = defineStore('app', {
|
||
state: () => ({
|
||
// 应用主题设置
|
||
theme: 'light',
|
||
// 国际化语言设置
|
||
locale: 'zh-CN',
|
||
// 加载状态
|
||
isLoading: false,
|
||
// 侧边栏展开状态(响应式适配用)
|
||
sidebarCollapsed: false,
|
||
// 移动端菜单显示状态
|
||
mobileMenuVisible: false
|
||
}),
|
||
|
||
getters: {
|
||
// 获取当前主题
|
||
currentTheme: (state) => state.theme,
|
||
// 获取当前语言
|
||
currentLocale: (state) => state.locale,
|
||
// 判断是否是深色主题
|
||
isDarkTheme: (state) => state.theme === 'dark',
|
||
// 判断是否是浅色主题
|
||
isLightTheme: (state) => state.theme === 'light',
|
||
// 获取加载状态(兼容性)
|
||
loading: (state) => state.isLoading
|
||
},
|
||
|
||
actions: {
|
||
// 切换主题
|
||
toggleTheme() {
|
||
this.theme = this.theme === 'light' ? 'dark' : 'light'
|
||
// 保存到localStorage
|
||
localStorage.setItem('theme', this.theme)
|
||
// 应用到document
|
||
document.documentElement.setAttribute('data-theme', this.theme)
|
||
},
|
||
|
||
// 设置主题
|
||
setTheme(theme) {
|
||
this.theme = theme
|
||
localStorage.setItem('theme', theme)
|
||
document.documentElement.setAttribute('data-theme', theme)
|
||
},
|
||
|
||
// 切换语言
|
||
toggleLocale() {
|
||
this.locale = this.locale === 'zh-CN' ? 'en-US' : 'zh-CN'
|
||
localStorage.setItem('locale', this.locale)
|
||
// 不再触发事件,由Vue的响应式系统自动通知
|
||
},
|
||
|
||
// 设置语言
|
||
setLocale(locale) {
|
||
this.locale = locale
|
||
localStorage.setItem('locale', locale)
|
||
// 不再触发事件,由Vue的响应式系统自动通知
|
||
},
|
||
|
||
// 设置加载状态
|
||
setLoading(loading) {
|
||
this.isLoading = loading
|
||
},
|
||
|
||
// 切换侧边栏状态
|
||
toggleSidebar() {
|
||
this.sidebarCollapsed = !this.sidebarCollapsed
|
||
},
|
||
|
||
// 设置侧边栏状态
|
||
setSidebarCollapsed(collapsed) {
|
||
this.sidebarCollapsed = collapsed
|
||
},
|
||
|
||
// 切换移动端菜单显示状态
|
||
toggleMobileMenu() {
|
||
this.mobileMenuVisible = !this.mobileMenuVisible
|
||
},
|
||
|
||
// 设置移动端菜单显示状态
|
||
setMobileMenuVisible(visible) {
|
||
this.mobileMenuVisible = visible
|
||
},
|
||
|
||
// 初始化应用状态
|
||
initApp() {
|
||
// 从localStorage读取保存的主题和语言设置
|
||
const savedTheme = localStorage.getItem('theme') || 'light'
|
||
const savedLocale = localStorage.getItem('locale') || 'zh-CN'
|
||
|
||
this.setTheme(savedTheme)
|
||
this.setLocale(savedLocale)
|
||
|
||
// 初始化移动端状态
|
||
const isMobile = window.innerWidth < 768
|
||
this.sidebarCollapsed = isMobile
|
||
this.mobileMenuVisible = false
|
||
}
|
||
}
|
||
})
|
||
|
||
// 用户状态管理store(可根据需要扩展)
|
||
export const useUserStore = defineStore('user', {
|
||
state: () => ({
|
||
userInfo: null,
|
||
isLoggedIn: false,
|
||
token: null
|
||
}),
|
||
|
||
getters: {
|
||
// 获取用户信息
|
||
user: (state) => state.userInfo,
|
||
// 判断是否已登录
|
||
loggedIn: (state) => state.isLoggedIn
|
||
},
|
||
|
||
actions: {
|
||
// 设置用户信息
|
||
setUser(userInfo) {
|
||
this.userInfo = userInfo
|
||
this.isLoggedIn = true
|
||
},
|
||
|
||
// 清除用户信息
|
||
clearUser() {
|
||
this.userInfo = null
|
||
this.isLoggedIn = false
|
||
this.token = null
|
||
localStorage.removeItem('token')
|
||
},
|
||
|
||
// 设置token
|
||
setToken(token) {
|
||
this.token = token
|
||
localStorage.setItem('token', token)
|
||
},
|
||
|
||
// 从localStorage初始化用户状态
|
||
initUser() {
|
||
const token = localStorage.getItem('token')
|
||
if (token) {
|
||
this.token = token
|
||
// 这里可以添加token验证逻辑
|
||
this.isLoggedIn = true
|
||
}
|
||
}
|
||
}
|
||
})
|
||
|
||
// 默认导出,用于兼容 useStore() 调用
|
||
export default useAppStore |