From 5b671db612f1c1cacd99ed5f7068af1057af505c Mon Sep 17 00:00:00 2001 From: Professional Date: Mon, 26 May 2025 19:22:43 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 22 ++++++++++++++++++++ src/auth.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/App.vue b/src/App.vue index 4a91d97..5c501b7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -86,6 +86,7 @@ import api from '@/services/api'; import { getSocket, connectSocket } from '@/services/socketService'; import Toast from '@/components/Toast.vue'; import toastService from '@/services/toastService'; +import { handleAccountBlocked, handleAccountUnblocked } from '@/auth'; const { user, isAuthenticated, logout, fetchUser } = useAuth(); const route = useRoute(); @@ -162,6 +163,8 @@ watch(() => isAuthenticated.value, (newAuthStatus, oldAuthStatus) => { if (socket) { socket.off('getMessage', handleNewMessage); socket.off('messagesRead', handleMessagesRead); + socket.off('accountBlocked'); + socket.off('accountUnblocked'); // Use userData.value for _id as user.value is null on logout // userData.value holds the *previous* user data here if (userData.value?._id && !(userData.value?.isAdmin)) { @@ -200,10 +203,27 @@ const setupSocketConnection = () => { socket = connectSocket(); } if (socket) { + // Отключаем старые обработчики socket.off('getMessage', handleNewMessage); socket.off('messagesRead', handleMessagesRead); + socket.off('accountBlocked'); + socket.off('accountUnblocked'); + + // Подключаем обработчики сообщений socket.on('getMessage', handleNewMessage); socket.on('messagesRead', handleMessagesRead); + + // Подключаем обработчики блокировки/разблокировки аккаунта + socket.on('accountBlocked', (data) => { + console.log('[App.vue] Получено событие блокировки аккаунта:', data); + handleAccountBlocked(data); + }); + + socket.on('accountUnblocked', (data) => { + console.log('[App.vue] Получено событие разблокировки аккаунта:', data); + handleAccountUnblocked(data); + }); + socket.emit('joinNotificationRoom', user.value._id); console.log('[App.vue setupSocketConnection] Socket connection configured for user:', user.value._id); } @@ -255,6 +275,8 @@ onUnmounted(() => { if (socket) { socket.off('getMessage', handleNewMessage); socket.off('messagesRead', handleMessagesRead); + socket.off('accountBlocked'); + socket.off('accountUnblocked'); if (user.value?._id && !currentUserIsAdmin.value) { socket.emit('leaveNotificationRoom', user.value._id); console.log('[App.vue onUnmounted] Left notification room for user:', user.value._id); diff --git a/src/auth.js b/src/auth.js index 82df3b3..04ec376 100644 --- a/src/auth.js +++ b/src/auth.js @@ -38,6 +38,45 @@ async function fetchUser() { console.log('Получены данные пользователя:', response.data); console.log('Значение isAdmin в ответе:', response.data.isAdmin); + // Проверяем, не заблокирован ли пользователь + if (response.data.blocked) { + console.log('[Auth] Пользователь заблокирован, выполняем принудительный выход'); + + // Сохраняем информацию о блокировке + const blockedInfo = { + blocked: true, + message: 'Ваш аккаунт заблокирован администратором.', + reason: response.data.blockReason || 'Нарушение правил сервиса', + timestamp: new Date().toISOString() + }; + localStorage.setItem('accountBlockedInfo', JSON.stringify(blockedInfo)); + + // Выходим из системы + await logout(); + return; + } + + // Проверяем, была ли разблокировка (если есть информация о предыдущей блокировке) + const blockedInfoStr = localStorage.getItem('accountBlockedInfo'); + if (blockedInfoStr) { + console.log('[Auth] Обнаружена предыдущая блокировка, пользователь теперь разблокирован'); + + // Удаляем информацию о блокировке + localStorage.removeItem('accountBlockedInfo'); + + // Показываем уведомление о разблокировке + setTimeout(() => { + const notificationEvent = new CustomEvent('show-toast', { + detail: { + message: 'Ваш аккаунт был разблокирован. Добро пожаловать обратно!', + type: 'success', + duration: 5000 + } + }); + window.dispatchEvent(notificationEvent); + }, 1000); + } + // Сохраняем данные пользователя user.value = response.data; console.log('Пользователь успешно загружен:', user.value); @@ -45,6 +84,21 @@ async function fetchUser() { console.log('Пользователь является администратором:', user.value.isAdmin ? 'Да' : 'Нет'); } catch (error) { console.error('Не удалось загрузить пользователя по токену:', error.response ? error.response.data : error.message); + + // Проверяем, не связана ли ошибка с блокировкой + if (error.response && error.response.status === 403 && error.response.data.message && error.response.data.message.includes('заблокирован')) { + console.log('[Auth] Пользователь заблокирован согласно ответу сервера'); + + // Сохраняем информацию о блокировке + const blockedInfo = { + blocked: true, + message: error.response.data.message || 'Ваш аккаунт заблокирован администратором.', + reason: error.response.data.reason || 'Нарушение правил сервиса', + timestamp: new Date().toISOString() + }; + localStorage.setItem('accountBlockedInfo', JSON.stringify(blockedInfo)); + } + // Если токен невалиден, очищаем его и данные пользователя await logout(); // Вызываем logout, чтобы очистить всё } @@ -280,4 +334,7 @@ export function useAuth() { handleAccountBlocked, // Добавляем функцию обработки блокировки аккаунта handleAccountUnblocked // Добавляем функцию обработки разблокировки аккаунта }; -} \ No newline at end of file +} + +// Экспортируем функции напрямую для использования в других частях приложения +export { handleAccountBlocked, handleAccountUnblocked }; \ No newline at end of file