78 lines
2.3 KiB
TypeScript

import type { LoginRequestData } from "@/http/apis/login/type"
import { routeSettings } from "@/config/route"
import { getUserInfoApi, loginApi } from "@/http/apis/login"
import { pinia } from "@/pinia"
import { resetRouter } from "@/router"
import { getToken, removeToken, setToken } from "@/utils/cache/cookies"
import { defineStore } from "pinia"
import { ref } from "vue"
import { useSettingsStore } from "./settings"
import { useTagsViewStore } from "./tags-view"
export const useUserStore = defineStore("user", () => {
const token = ref<string>(getToken() || "")
const roles = ref<string[]>([])
const username = ref<string>("")
const tagsViewStore = useTagsViewStore()
const settingsStore = useSettingsStore()
// 登录
const login = async ({ username, password, code }: LoginRequestData) => {
const { data } = await loginApi({ username, password, code })
setToken(data.token)
token.value = data.token
}
// 获取用户详情
const getInfo = async () => {
const { data } = await getUserInfoApi()
username.value = data.username
// 验证返回的 roles 是否为一个非空数组,否则塞入一个没有任何作用的默认角色,防止路由守卫逻辑进入无限循环
roles.value = data.roles?.length > 0 ? data.roles : routeSettings.defaultRoles
}
// 模拟角色变化
const changeRoles = async (role: string) => {
const newToken = `token-${role}`
token.value = newToken
setToken(newToken)
// 用刷新页面代替重新登录
window.location.reload()
}
// 登出
const logout = () => {
removeToken()
token.value = ""
roles.value = []
resetRouter()
resetTagsView()
}
// 重置 Token
const resetToken = () => {
removeToken()
token.value = ""
roles.value = []
}
// 重置 Visited Views 和 Cached Views
const resetTagsView = () => {
if (!settingsStore.cacheTagsView) {
tagsViewStore.delAllVisitedViews()
tagsViewStore.delAllCachedViews()
}
}
return { token, roles, username, login, getInfo, changeRoles, logout, resetToken }
})
/**
* @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
* @description 在 SSR 应用中可用于在 setup 外使用 store
*/
export function useUserStoreOutside() {
return useUserStore(pinia)
}