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>({}) const searchHistory = ref([]) 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'] } } )