2024-11-18 19:40:44 +08:00
|
|
|
import type { LoginRequestData } from "@/api/login/types/login"
|
|
|
|
import { getUserInfoApi, loginApi } from "@/api/login"
|
|
|
|
import routeSettings from "@/config/route"
|
|
|
|
import { resetRouter } from "@/router"
|
2024-11-14 17:33:12 +08:00
|
|
|
import { pinia } from "@/store"
|
2024-11-18 19:40:44 +08:00
|
|
|
import { getToken, removeToken, setToken } from "@/utils/cache/cookies"
|
2022-04-22 01:16:02 +08:00
|
|
|
import { defineStore } from "pinia"
|
2024-11-18 19:40:44 +08:00
|
|
|
import { ref } from "vue"
|
2023-06-30 12:50:24 +08:00
|
|
|
import { useSettingsStore } from "./settings"
|
2024-11-18 19:40:44 +08:00
|
|
|
import { useTagsViewStore } from "./tags-view"
|
2022-04-21 18:20:39 +08:00
|
|
|
|
2022-08-24 16:52:01 +08:00
|
|
|
export const useUserStore = defineStore("user", () => {
|
|
|
|
const token = ref<string>(getToken() || "")
|
|
|
|
const roles = ref<string[]>([])
|
2022-11-02 16:57:43 +08:00
|
|
|
const username = ref<string>("")
|
2022-04-21 18:20:39 +08:00
|
|
|
|
2023-02-22 15:53:04 +08:00
|
|
|
const tagsViewStore = useTagsViewStore()
|
2023-06-30 12:50:24 +08:00
|
|
|
const settingsStore = useSettingsStore()
|
2023-02-22 15:53:04 +08:00
|
|
|
|
2022-08-24 16:52:01 +08:00
|
|
|
/** 登录 */
|
2023-05-31 18:23:47 +08:00
|
|
|
const login = async ({ username, password, code }: LoginRequestData) => {
|
|
|
|
const { data } = await loginApi({ username, password, code })
|
|
|
|
setToken(data.token)
|
|
|
|
token.value = data.token
|
2022-04-21 18:20:39 +08:00
|
|
|
}
|
2022-08-24 16:52:01 +08:00
|
|
|
/** 获取用户详情 */
|
2023-05-31 18:23:47 +08:00
|
|
|
const getInfo = async () => {
|
|
|
|
const { data } = await getUserInfoApi()
|
|
|
|
username.value = data.username
|
|
|
|
// 验证返回的 roles 是否为一个非空数组,否则塞入一个没有任何作用的默认角色,防止路由守卫逻辑进入无限循环
|
2023-08-07 15:14:15 +08:00
|
|
|
roles.value = data.roles?.length > 0 ? data.roles : routeSettings.defaultRoles
|
2022-08-24 16:52:01 +08:00
|
|
|
}
|
2024-02-06 20:22:07 +08:00
|
|
|
/** 模拟角色变化 */
|
2022-08-24 16:52:01 +08:00
|
|
|
const changeRoles = async (role: string) => {
|
2024-11-18 19:40:44 +08:00
|
|
|
const newToken = `token-${role}`
|
2022-08-24 16:52:01 +08:00
|
|
|
token.value = newToken
|
|
|
|
setToken(newToken)
|
2024-02-07 19:04:55 +08:00
|
|
|
// 用刷新页面代替重新登录
|
2024-02-06 20:22:07 +08:00
|
|
|
window.location.reload()
|
2022-08-24 16:52:01 +08:00
|
|
|
}
|
|
|
|
/** 登出 */
|
|
|
|
const logout = () => {
|
|
|
|
removeToken()
|
|
|
|
token.value = ""
|
|
|
|
roles.value = []
|
|
|
|
resetRouter()
|
2023-02-22 15:53:04 +08:00
|
|
|
_resetTagsView()
|
2022-08-24 16:52:01 +08:00
|
|
|
}
|
|
|
|
/** 重置 Token */
|
|
|
|
const resetToken = () => {
|
|
|
|
removeToken()
|
|
|
|
token.value = ""
|
|
|
|
roles.value = []
|
|
|
|
}
|
2023-05-31 18:23:47 +08:00
|
|
|
/** 重置 Visited Views 和 Cached Views */
|
2023-02-22 15:53:04 +08:00
|
|
|
const _resetTagsView = () => {
|
2023-06-30 12:50:24 +08:00
|
|
|
if (!settingsStore.cacheTagsView) {
|
|
|
|
tagsViewStore.delAllVisitedViews()
|
|
|
|
tagsViewStore.delAllCachedViews()
|
|
|
|
}
|
2023-02-22 15:53:04 +08:00
|
|
|
}
|
2022-08-24 16:52:01 +08:00
|
|
|
|
2024-02-06 17:21:16 +08:00
|
|
|
return { token, roles, username, login, getInfo, changeRoles, logout, resetToken }
|
2022-04-21 18:20:39 +08:00
|
|
|
})
|
|
|
|
|
2024-11-14 17:33:12 +08:00
|
|
|
/**
|
|
|
|
* 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
|
|
|
|
* 在 SSR 应用中可用于在 setup 外使用 store
|
|
|
|
*/
|
2024-11-21 20:41:48 +08:00
|
|
|
export function useUserStoreOutside() {
|
2024-11-14 17:33:12 +08:00
|
|
|
return useUserStore(pinia)
|
2022-04-21 18:20:39 +08:00
|
|
|
}
|