Исправления фронта
Множество оптимизаций по фронту
This commit is contained in:
@@ -5,16 +5,48 @@ import TeamPage from './views/TeamPage.vue'
|
||||
import ArchivePage from './views/ArchivePage.vue'
|
||||
import { authApi } from './api'
|
||||
|
||||
// Проверка авторизации
|
||||
const checkAuth = async () => {
|
||||
// Кэш авторизации (чтобы не делать запрос при каждой навигации)
|
||||
let authCache = {
|
||||
isAuthenticated: null, // null = не проверяли, true/false = результат
|
||||
lastCheck: 0
|
||||
}
|
||||
|
||||
// Время жизни кэша авторизации (5 минут)
|
||||
const AUTH_CACHE_TTL = 5 * 60 * 1000
|
||||
|
||||
// Проверка авторизации (с кэшированием)
|
||||
const checkAuth = async (forceCheck = false) => {
|
||||
const now = Date.now()
|
||||
|
||||
// Используем кэш если он валиден и не форсируем проверку
|
||||
if (!forceCheck && authCache.isAuthenticated !== null && (now - authCache.lastCheck) < AUTH_CACHE_TTL) {
|
||||
return authCache.isAuthenticated
|
||||
}
|
||||
|
||||
try {
|
||||
const data = await authApi.check()
|
||||
return data.success === true
|
||||
authCache.isAuthenticated = data.success === true
|
||||
authCache.lastCheck = now
|
||||
return authCache.isAuthenticated
|
||||
} catch {
|
||||
// При ошибке сети — используем кэш если есть, иначе false
|
||||
if (authCache.isAuthenticated !== null) {
|
||||
return authCache.isAuthenticated
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Сброс кэша (вызывать при logout)
|
||||
export const clearAuthCache = () => {
|
||||
authCache = { isAuthenticated: null, lastCheck: 0 }
|
||||
}
|
||||
|
||||
// Установка кэша (вызывать при успешном login)
|
||||
export const setAuthCache = (isAuth) => {
|
||||
authCache = { isAuthenticated: isAuth, lastCheck: Date.now() }
|
||||
}
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: '/',
|
||||
@@ -48,9 +80,17 @@ const router = createRouter({
|
||||
|
||||
// Navigation guard — проверка авторизации
|
||||
router.beforeEach(async (to, from, next) => {
|
||||
const isAuth = await checkAuth()
|
||||
// Если переходим между защищёнными страницами и кэш валиден — не проверяем сеть
|
||||
const needsAuth = to.meta.requiresAuth
|
||||
const fromProtected = from.meta?.requiresAuth
|
||||
|
||||
if (to.meta.requiresAuth && !isAuth) {
|
||||
// Форсируем проверку только при переходе на защищённую страницу извне
|
||||
// или при переходе на /login (чтобы редиректнуть если уже авторизован)
|
||||
const forceCheck = (needsAuth && !fromProtected) || to.path === '/login'
|
||||
|
||||
const isAuth = await checkAuth(forceCheck)
|
||||
|
||||
if (needsAuth && !isAuth) {
|
||||
// Не авторизован — на логин
|
||||
next('/login')
|
||||
} else if (to.path === '/login' && isAuth) {
|
||||
|
||||
Reference in New Issue
Block a user