添加登录

This commit is contained in:
浅念
2025-07-11 18:37:16 +08:00
parent 719911918f
commit 713d43f7b4
34 changed files with 1281 additions and 180 deletions
+55 -3
View File
@@ -8,6 +8,8 @@ import { AppRouteRecord } from '@/types/router'
import { setPageTitle } from '@/router/utils/utils'
import { resetRouterState } from '@/router/guards/beforeEach'
import { RoutesAlias } from '@/router/routesAlias'
import { UserService } from '@/api/usersApi' // 新增导入
let refreshTimeout: ReturnType<typeof setTimeout> | null = null // 定时器变量
// 用户
export const useUserStore = defineStore(
@@ -21,6 +23,10 @@ export const useUserStore = defineStore(
const searchHistory = ref<AppRouteRecord[]>([])
const accessToken = ref('')
const refreshToken = ref('')
const companyid = ref('')
const companyabbr = ref('')
const loginType = ref<'feishu' | 'upwd'>('upwd')
const tokenExpireAt = ref<number>(0)
const getUserInfo = computed(() => info.value)
const getSettingState = computed(() => useSettingStore().$state)
@@ -38,7 +44,9 @@ export const useUserStore = defineStore(
setPageTitle(router.currentRoute.value)
language.value = lang
}
const setLoginType = (type: 'feishu' | 'upwd') => {
loginType.value = type
}
const setSearchHistory = (list: AppRouteRecord[]) => {
searchHistory.value = list
}
@@ -51,11 +59,47 @@ export const useUserStore = defineStore(
lockPassword.value = password
}
const setToken = (newAccessToken: string, newRefreshToken?: string) => {
const setToken = (newAccessToken: string, newRefreshToken?: string, expiresIn?: number) => {
accessToken.value = newAccessToken
if (newRefreshToken) {
refreshToken.value = newRefreshToken
}
if (expiresIn) {
// 记录绝对过期时间
const expireAt = Date.now() + expiresIn * 1000
tokenExpireAt.value = expireAt
localStorage.setItem('token_expire_at', String(expireAt))
scheduleTokenRefresh(expiresIn)
}
}
const setCompany= (id: string, abbr: string) => {
companyid.value = id
companyabbr.value = abbr
}
function restoreTokenTimer() {
const expireAt = Number(localStorage.getItem('token_expire_at') || '0')
if (accessToken.value && expireAt > Date.now()) {
const leftSeconds = Math.floor((expireAt - Date.now()) / 1000)
scheduleTokenRefresh(leftSeconds)
}
}
function scheduleTokenRefresh(expiresIn: number) {
if (refreshTimeout) clearTimeout(refreshTimeout)
// 提前1分钟刷新
const refreshTime = (expiresIn - 60) * 1000
if (refreshTime > 0) {
refreshTimeout = setTimeout(refreshTokenAction, refreshTime)
}
}
async function refreshTokenAction() {
try {
const { data } = await UserService.refreshToken({ refresh_token: refreshToken.value })
setToken(data.access_token, data.refresh_token, data.expires_in)
} catch (e) {
logOut()
}
}
const logOut = () => {
@@ -65,6 +109,7 @@ export const useUserStore = defineStore(
lockPassword.value = ''
accessToken.value = ''
refreshToken.value = ''
if (refreshTimeout) clearTimeout(refreshTimeout) // 清理定时器
useWorktabStore().opened = []
sessionStorage.removeItem('iframeRoutes')
resetRouterState(router)
@@ -77,9 +122,13 @@ export const useUserStore = defineStore(
isLock,
lockPassword,
info,
companyid,
companyabbr,
searchHistory,
loginType,
accessToken,
refreshToken,
tokenExpireAt,
getUserInfo,
getSettingState,
getWorktabState,
@@ -90,7 +139,10 @@ export const useUserStore = defineStore(
setLockStatus,
setLockPassword,
setToken,
logOut
setCompany,
setLoginType,
logOut,
restoreTokenTimer
}
},
{