144 lines
3.4 KiB
JavaScript
144 lines
3.4 KiB
JavaScript
import { login, getUserInfo } from '@/api/user'
|
||
import { jsonInBlacklist } from '@/api/jwt'
|
||
import router from '@/router/index'
|
||
import { ElLoading, ElMessage } from 'element-plus'
|
||
import { defineStore } from 'pinia'
|
||
import { ref, watch } from 'vue'
|
||
import { useRouterStore } from './router'
|
||
import cookie from 'js-cookie'
|
||
|
||
import {useAppStore} from "@/pinia";
|
||
|
||
export const useUserStore = defineStore('user', () => {
|
||
const appStore = useAppStore()
|
||
const loadingInstance = ref(null)
|
||
|
||
const userInfo = ref({
|
||
uuid: '',
|
||
nickName: '',
|
||
headerImg: '',
|
||
authority: {},
|
||
})
|
||
const token = ref(window.localStorage.getItem('token') || cookie.get('x-token') || '')
|
||
const setUserInfo = (val) => {
|
||
userInfo.value = val
|
||
if(val.originSetting){
|
||
Object.keys(appStore.config).forEach(key => {
|
||
appStore.config[key] = val.originSetting[key]
|
||
})
|
||
}
|
||
}
|
||
|
||
const setToken = (val) => {
|
||
token.value = val
|
||
}
|
||
|
||
const NeedInit = async () => {
|
||
token.value = ''
|
||
window.localStorage.removeItem('token')
|
||
await router.push({name: 'Init', replace: true})
|
||
}
|
||
|
||
const ResetUserInfo = (value = {}) => {
|
||
userInfo.value = {
|
||
...userInfo.value,
|
||
...value
|
||
}
|
||
}
|
||
/* 获取用户信息*/
|
||
const GetUserInfo = async() => {
|
||
const res = await getUserInfo()
|
||
if (res.code === 0) {
|
||
setUserInfo(res.data.userInfo)
|
||
}
|
||
return res
|
||
}
|
||
/* 登录*/
|
||
const LoginIn = async(loginInfo) => {
|
||
loadingInstance.value = ElLoading.service({
|
||
fullscreen: true,
|
||
text: '登录中,请稍候...',
|
||
})
|
||
|
||
const res = await login(loginInfo)
|
||
|
||
// 登陆失败,直接返回
|
||
if (res.code !== 0) {
|
||
loadingInstance.value.close()
|
||
return false
|
||
}
|
||
|
||
// 登陆成功,设置用户信息和权限相关信息
|
||
setUserInfo(res.data.user)
|
||
setToken(res.data.token)
|
||
|
||
// 初始化路由信息
|
||
const routerStore = useRouterStore()
|
||
await routerStore.SetAsyncRouter()
|
||
const asyncRouters = routerStore.asyncRouters
|
||
|
||
// 注册到路由表里
|
||
asyncRouters.forEach(asyncRouter => {
|
||
router.addRoute(asyncRouter)
|
||
})
|
||
|
||
if (!router.hasRoute(userInfo.value.authority.defaultRouter)) {
|
||
ElMessage.error('请联系管理员进行授权')
|
||
} else {
|
||
await router.replace({ name: userInfo.value.authority.defaultRouter })
|
||
}
|
||
|
||
const isWin = ref(/windows/i.test(navigator.userAgent))
|
||
if (isWin.value) {
|
||
window.localStorage.setItem('osType', 'WIN')
|
||
} else {
|
||
window.localStorage.setItem('osType', 'MAC')
|
||
}
|
||
|
||
|
||
// 全部操作均结束,关闭loading并返回
|
||
loadingInstance.value.close()
|
||
return true
|
||
}
|
||
/* 登出*/
|
||
const LoginOut = async() => {
|
||
const res = await jsonInBlacklist()
|
||
|
||
// 登出失败
|
||
if (res.code !== 0) {
|
||
return
|
||
}
|
||
|
||
await ClearStorage()
|
||
|
||
// 把路由定向到登录页,无需等待直接reload
|
||
router.push({ name: 'Login', replace: true })
|
||
window.location.reload()
|
||
}
|
||
/* 清理数据 */
|
||
const ClearStorage = async() => {
|
||
token.value = ''
|
||
sessionStorage.clear()
|
||
window.localStorage.removeItem('token')
|
||
cookie.remove('x-token')
|
||
localStorage.removeItem('originSetting')
|
||
}
|
||
|
||
watch(() => token.value, () => {
|
||
window.localStorage.setItem('token', token.value)
|
||
})
|
||
|
||
return {
|
||
userInfo,
|
||
token,
|
||
NeedInit,
|
||
ResetUserInfo,
|
||
GetUserInfo,
|
||
LoginIn,
|
||
LoginOut,
|
||
setToken,
|
||
loadingInstance,
|
||
ClearStorage
|
||
}
|
||
})
|