82 lines
2.5 KiB
TypeScript
Raw Normal View History

2022-08-24 16:52:01 +08:00
import { ref } from "vue"
import store from "@/store"
import { defineStore } from "pinia"
import { usePermissionStore } from "./permission"
2023-02-22 15:53:04 +08:00
import { useTagsViewStore } from "./tags-view"
2023-06-30 12:50:24 +08:00
import { useSettingsStore } from "./settings"
2022-08-19 21:13:41 +08:00
import { getToken, removeToken, setToken } from "@/utils/cache/cookies"
import router, { resetRouter } from "@/router"
import { loginApi, getUserInfoApi } from "@/api/login"
import { type LoginRequestData } from "@/api/login/types/login"
2022-10-18 15:07:42 +08:00
import { type RouteRecordRaw } from "vue-router"
import routeSettings from "@/config/route"
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>("")
2023-02-22 15:53:04 +08:00
const permissionStore = usePermissionStore()
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
/** 设置角色数组 */
const setRoles = (value: string[]) => {
roles.value = value
}
/** 登录 */
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-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 是否为一个非空数组,否则塞入一个没有任何作用的默认角色,防止路由守卫逻辑进入无限循环
roles.value = data.roles?.length > 0 ? data.roles : routeSettings.defaultRoles
2022-08-24 16:52:01 +08:00
}
/** 切换角色 */
const changeRoles = async (role: string) => {
2022-09-14 18:44:32 +08:00
const newToken = "token-" + role
2022-08-24 16:52:01 +08:00
token.value = newToken
setToken(newToken)
await getInfo()
permissionStore.setRoutes(roles.value)
resetRouter()
permissionStore.dynamicRoutes.forEach((item: RouteRecordRaw) => {
router.addRoute(item)
})
2023-02-22 15:53:04 +08:00
_resetTagsView()
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
2022-11-02 16:57:43 +08:00
return { token, roles, username, setRoles, login, getInfo, changeRoles, logout, resetToken }
})
/** 在 setup 外使用 */
export function useUserStoreHook() {
return useUserStore(store)
}