完整的管理系统,包含账户管理、卡片管理、套餐管理、财务管理等功能模块。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
115 lines
3.1 KiB
TypeScript
115 lines
3.1 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
import { LanguageEnum } from '@/enums/appEnum'
|
|
import { router } from '@/router'
|
|
import { UserInfo } from '@/types/store'
|
|
import { useSettingStore } from './setting'
|
|
import { useWorktabStore } from './worktab'
|
|
import { AppRouteRecord } from '@/types/router'
|
|
import { setPageTitle } from '@/router/utils/utils'
|
|
import { resetRouterState } from '@/router/guards/beforeEach'
|
|
import { RoutesAlias } from '@/router/routesAlias'
|
|
import { AuthService } from '@/api/modules/auth'
|
|
|
|
// 用户
|
|
export const useUserStore = defineStore(
|
|
'userStore',
|
|
() => {
|
|
const language = ref(LanguageEnum.ZH)
|
|
const isLogin = ref(false)
|
|
const isLock = ref(false)
|
|
const lockPassword = ref('')
|
|
const info = ref<Partial<UserInfo>>({})
|
|
const searchHistory = ref<AppRouteRecord[]>([])
|
|
const accessToken = ref('')
|
|
const refreshToken = ref('')
|
|
|
|
const getUserInfo = computed(() => info.value)
|
|
const getSettingState = computed(() => useSettingStore().$state)
|
|
const getWorktabState = computed(() => useWorktabStore().$state)
|
|
|
|
const setUserInfo = (newInfo: UserInfo) => {
|
|
info.value = newInfo
|
|
}
|
|
|
|
const setLoginStatus = (status: boolean) => {
|
|
isLogin.value = status
|
|
}
|
|
|
|
const setLanguage = (lang: LanguageEnum) => {
|
|
setPageTitle(router.currentRoute.value)
|
|
language.value = lang
|
|
}
|
|
|
|
const setSearchHistory = (list: AppRouteRecord[]) => {
|
|
searchHistory.value = list
|
|
}
|
|
|
|
const setLockStatus = (status: boolean) => {
|
|
isLock.value = status
|
|
}
|
|
|
|
const setLockPassword = (password: string) => {
|
|
lockPassword.value = password
|
|
}
|
|
|
|
const setToken = (newAccessToken: string, newRefreshToken?: string) => {
|
|
accessToken.value = newAccessToken
|
|
if (newRefreshToken) {
|
|
refreshToken.value = newRefreshToken
|
|
}
|
|
}
|
|
|
|
const logOut = async () => {
|
|
try {
|
|
// 调用退出登录接口
|
|
await AuthService.logout()
|
|
} catch (error) {
|
|
console.error('退出登录接口调用失败:', error)
|
|
} finally {
|
|
// 无论接口成功与否,都清理本地状态
|
|
info.value = {}
|
|
isLogin.value = false
|
|
isLock.value = false
|
|
lockPassword.value = ''
|
|
accessToken.value = ''
|
|
refreshToken.value = ''
|
|
useWorktabStore().opened = []
|
|
sessionStorage.removeItem('iframeRoutes')
|
|
resetRouterState(router)
|
|
router.push(RoutesAlias.Login)
|
|
}
|
|
}
|
|
|
|
return {
|
|
language,
|
|
isLogin,
|
|
isLock,
|
|
lockPassword,
|
|
info,
|
|
searchHistory,
|
|
accessToken,
|
|
refreshToken,
|
|
getUserInfo,
|
|
getSettingState,
|
|
getWorktabState,
|
|
setUserInfo,
|
|
setLoginStatus,
|
|
setLanguage,
|
|
setSearchHistory,
|
|
setLockStatus,
|
|
setLockPassword,
|
|
setToken,
|
|
logOut
|
|
}
|
|
},
|
|
{
|
|
persist: {
|
|
key: 'user',
|
|
storage: localStorage,
|
|
// 只持久化 token 和登录状态,用户信息每次刷新都从接口获取
|
|
paths: ['accessToken', 'refreshToken', 'isLogin', 'language', 'isLock', 'lockPassword']
|
|
}
|
|
}
|
|
)
|