You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
5.1 KiB
197 lines
5.1 KiB
import { defineStore } from 'pinia'
|
|
import { store } from '@/store'
|
|
import { CURRENT_USER, TENANT_ID, TOKEN_EXPIRATION_TIME, USER_ACCESS_TOKEN } from '@/store/mutation-types'
|
|
import { ResultEnum } from '@/enums/httpEnum'
|
|
|
|
import { getCaptchaToken, getInformation, getUserInfo as getUserInfoApi, login_new, refreshToken } from '@/api/system/user'
|
|
import { storage } from '@/utils/Storage'
|
|
import { generateUuid } from '@/utils/uuid'
|
|
|
|
let refreshIntervId: any
|
|
// 后台token有效期为30分钟
|
|
const TOKEN_EXPIRE_SECONDS = 30 * 60
|
|
// token刷新时间设置为20分钟
|
|
const TOKEN_REFRESH_SECONDS = 20 * 60
|
|
|
|
export interface UserInfoType {
|
|
token: string
|
|
tenantList: any[]
|
|
userInfo: any
|
|
}
|
|
|
|
export interface IUserState {
|
|
token: string
|
|
username: string
|
|
welcome: string
|
|
avatar: string
|
|
permissions: any[]
|
|
uniqueKey: string
|
|
info: any
|
|
tenantId: string
|
|
captchaToken: string
|
|
}
|
|
|
|
export const useUserStore = defineStore({
|
|
id: 'app-user',
|
|
state: (): IUserState => ({
|
|
token: storage.get(USER_ACCESS_TOKEN, ''),
|
|
username: '',
|
|
welcome: '',
|
|
avatar: '',
|
|
permissions: [],
|
|
captchaToken: '',
|
|
uniqueKey: generateUuid(),
|
|
info: storage.get(CURRENT_USER, {}),
|
|
tenantId: storage.get(TENANT_ID, ''),
|
|
}),
|
|
getters: {
|
|
getToken(): string {
|
|
return this.token
|
|
},
|
|
getAvatar(): string {
|
|
return this.avatar
|
|
},
|
|
getNickname(): string {
|
|
return this.username
|
|
},
|
|
getPermissions(): [any][] {
|
|
return this.permissions
|
|
},
|
|
getUserInfo(): any {
|
|
return this.info
|
|
},
|
|
getUniqueKey(): string {
|
|
return this.uniqueKey
|
|
},
|
|
// TODO:refactor
|
|
getTenantId(): string {
|
|
return this.tenantId
|
|
},
|
|
getCapToken(): string {
|
|
return this.captchaToken
|
|
},
|
|
},
|
|
actions: {
|
|
setToken(token: string) {
|
|
this.token = token
|
|
},
|
|
setAvatar(avatar: string) {
|
|
this.avatar = avatar
|
|
},
|
|
setPermissions(permissions) {
|
|
this.permissions = permissions
|
|
},
|
|
setUserInfo(info: any) {
|
|
this.info = info
|
|
},
|
|
setCaptchaToken(token: string) {
|
|
this.captchaToken = token
|
|
},
|
|
|
|
setTenantId(id: string) {
|
|
this.tenantId = id
|
|
},
|
|
|
|
updateTenantId(id: string) {
|
|
this.tenantId = id
|
|
storage.set(TENANT_ID, id)
|
|
},
|
|
|
|
// 获取验证码token
|
|
async getCaptchaToken(type: 'math' | 'char') {
|
|
const result = await getCaptchaToken(type)
|
|
const { data: token } = result
|
|
this.setCaptchaToken(token)
|
|
return token
|
|
},
|
|
|
|
// 登录
|
|
async login(params: any) {
|
|
const response = await login_new(params)
|
|
const { data: token, code } = response
|
|
if (code === ResultEnum.SUCCESS)
|
|
this.setStorageToken(token)
|
|
// this.startRefreshToken()
|
|
|
|
return response
|
|
},
|
|
async getInformation() {
|
|
const response = await getInformation()
|
|
const { data, code } = response
|
|
|
|
if (code === ResultEnum.SUCCESS) {
|
|
const ex = 7 * 24 * 60 * 60
|
|
// 默认设置为第一个租户
|
|
const firstTenant = data.tenantList.length > 0 ? data.tenantList[0] : null
|
|
const tenantId = firstTenant ? firstTenant.id : ''
|
|
data.frontmenuTList.forEach((ele) => {
|
|
if (ele.description === 'AI工单')
|
|
ele.description = '图审审批'
|
|
})
|
|
storage.set(CURRENT_USER, data, ex)
|
|
storage.set(TENANT_ID, tenantId)
|
|
this.setUserInfo(data)
|
|
this.setTenantId(tenantId)
|
|
}
|
|
|
|
return response
|
|
},
|
|
// 刷新token
|
|
async startRefreshToken() {
|
|
if (!refreshIntervId)
|
|
clearInterval(refreshIntervId)
|
|
|
|
refreshIntervId = setInterval(async () => {
|
|
const response = await refreshToken()
|
|
const { data: token, code } = response
|
|
if (code === ResultEnum.SUCCESS)
|
|
this.setStorageToken(token)
|
|
}, 25 * 60 * 1000)
|
|
},
|
|
// 刷新token
|
|
async refreshToken() {
|
|
// console.log('refresh token!')
|
|
const response = await refreshToken()
|
|
const { data: token, code } = response
|
|
if (code === ResultEnum.SUCCESS)
|
|
this.setStorageToken(token)
|
|
|
|
return { token }
|
|
},
|
|
// 获取用户信息
|
|
async getInfo() {
|
|
const result = await getUserInfoApi()
|
|
if (result.permissions && result.permissions.length) {
|
|
const permissionsList = result.permissions
|
|
this.setPermissions(permissionsList)
|
|
this.setUserInfo(result)
|
|
}
|
|
else {
|
|
throw new Error('getInfo: permissionsList must be a non-null array !')
|
|
}
|
|
this.setAvatar(result.avatar)
|
|
return result
|
|
},
|
|
// 登出
|
|
async logout() {
|
|
this.setPermissions([])
|
|
this.setUserInfo({ tenantList: [], userInfo: {}, token: '' })
|
|
this.setTenantId('')
|
|
storage.remove(USER_ACCESS_TOKEN)
|
|
storage.remove(CURRENT_USER)
|
|
clearInterval(refreshIntervId)
|
|
refreshIntervId = null
|
|
},
|
|
setStorageToken(token) {
|
|
storage.set(USER_ACCESS_TOKEN, token, TOKEN_EXPIRE_SECONDS)
|
|
storage.set(TOKEN_EXPIRATION_TIME, Date.now() + TOKEN_REFRESH_SECONDS * 1000)
|
|
this.setToken(token)
|
|
},
|
|
},
|
|
})
|
|
|
|
// Need to be used outside the setup
|
|
export function useUser() {
|
|
return useUserStore(store)
|
|
}
|