2022-08-24 16:52:01 +08:00
|
|
|
import { ref } from "vue"
|
2022-04-22 01:16:02 +08:00
|
|
|
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"
|
2022-08-19 21:13:41 +08:00
|
|
|
import { getToken, removeToken, setToken } from "@/utils/cache/cookies"
|
2022-04-22 01:16:02 +08:00
|
|
|
import router, { resetRouter } from "@/router"
|
2023-02-15 14:23:30 +08:00
|
|
|
import { loginApi, getUserInfoApi } from "@/api/login"
|
2023-05-21 09:51:41 +08:00
|
|
|
import { type LoginRequestData } from "@/api/login/types/login"
|
2022-10-18 15:07:42 +08:00
|
|
|
import { type RouteRecordRaw } from "vue-router"
|
2023-03-01 10:23:51 +08:00
|
|
|
import asyncRouteSettings from "@/config/async-route"
|
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 permissionStore = usePermissionStore()
|
|
|
|
const tagsViewStore = useTagsViewStore()
|
|
|
|
|
2022-08-24 16:52:01 +08:00
|
|
|
/** 设置角色数组 */
|
|
|
|
const setRoles = (value: string[]) => {
|
|
|
|
roles.value = value
|
|
|
|
}
|
|
|
|
/** 登录 */
|
2023-05-21 09:51:41 +08:00
|
|
|
const login = (loginData: LoginRequestData) => {
|
2022-08-24 16:52:01 +08:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
loginApi({
|
2022-09-14 18:44:32 +08:00
|
|
|
username: loginData.username,
|
|
|
|
password: loginData.password,
|
|
|
|
code: loginData.code
|
2022-04-21 18:20:39 +08:00
|
|
|
})
|
2023-02-02 11:31:17 +08:00
|
|
|
.then((res) => {
|
2022-09-14 18:44:32 +08:00
|
|
|
setToken(res.data.token)
|
|
|
|
token.value = res.data.token
|
2022-08-24 16:52:01 +08:00
|
|
|
resolve(true)
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
reject(error)
|
|
|
|
})
|
|
|
|
})
|
2022-04-21 18:20:39 +08:00
|
|
|
}
|
2022-08-24 16:52:01 +08:00
|
|
|
/** 获取用户详情 */
|
|
|
|
const getInfo = () => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
getUserInfoApi()
|
2023-02-02 11:31:17 +08:00
|
|
|
.then((res) => {
|
2023-03-01 10:23:51 +08:00
|
|
|
const data = res.data
|
|
|
|
username.value = data.username
|
|
|
|
// 验证返回的 roles 是否是一个非空数组
|
|
|
|
if (data.roles && data.roles.length > 0) {
|
|
|
|
roles.value = data.roles
|
|
|
|
} else {
|
|
|
|
// 塞入一个没有任何作用的默认角色,不然路由守卫逻辑会无限循环
|
|
|
|
roles.value = asyncRouteSettings.defaultRoles
|
|
|
|
}
|
2022-08-24 16:52:01 +08:00
|
|
|
resolve(res)
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
reject(error)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
/** 切换角色 */
|
|
|
|
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-02-22 15:53:04 +08:00
|
|
|
/** 重置 visited views 和 cached views */
|
|
|
|
const _resetTagsView = () => {
|
|
|
|
tagsViewStore.delAllVisitedViews()
|
|
|
|
tagsViewStore.delAllCachedViews()
|
|
|
|
}
|
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 }
|
2022-04-21 18:20:39 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
/** 在 setup 外使用 */
|
|
|
|
export function useUserStoreHook() {
|
|
|
|
return useUserStore(store)
|
|
|
|
}
|