This commit is contained in:
Professional 2025-05-26 19:22:43 +07:00
parent a74cf5cb6c
commit 5b671db612
2 changed files with 80 additions and 1 deletions

View File

@ -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);

View File

@ -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, чтобы очистить всё
}
@ -281,3 +335,6 @@ export function useAuth() {
handleAccountUnblocked // Добавляем функцию обработки разблокировки аккаунта
};
}
// Экспортируем функции напрямую для использования в других частях приложения
export { handleAccountBlocked, handleAccountUnblocked };