/
renix
/
TravelGuide
Обзор
Документация
Войти
/
renix
/
TravelGuide
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
front/src/components/AuthForm.vue
439 строк
11 KB
ReniX99
Доступ к админке только определённым пользователям
11 апр 2025, 10:00
11 апр 2025, 10:00
50c80e4
Код
Авторство
О чём код?
<script setup lang="ts"> import { ref, reactive } from 'vue' import usersData from '../assets/users.json' import { useRouter } from 'vue-router' import api from '@/services/axios' import { useAuthStore } from '@/stores/authentication-store' // Состояние для переключения между формами const isLoginForm = ref(true) const router = useRouter() // Данные форм const loginForm = reactive({ email: '', password: '', }) const registerForm = reactive({ email: '', password: '', confirmPassword: '', }) // Хранение пользователей в JSON формате const users = ref(usersData.users) // Сообщения об ошибках и успехе const errorMessage = ref('') const successMessage = ref('') // Переключение между формами const toggleForm = () => { isLoginForm.value = !isLoginForm.value errorMessage.value = '' successMessage.value = '' } // Авторизация const login = async () => { errorMessage.value = '' successMessage.value = '' // Проверка на пустые поля if (!loginForm.email || !loginForm.password) { errorMessage.value = 'Пожалуйста, заполните все поля' return } try { const userInfo = { login: loginForm.email, password: loginForm.password, } const response = await api.get('/auth/login', { params: userInfo }) successMessage.value = 'Вход выполнен успешно!' const authStore = useAuthStore() authStore.authenticate() authStore.checkRole(response.data.id) setTimeout(() => { router.push({ name: 'MainPage' }) }, 1000) } catch (err) { errorMessage.value = 'Неверный email или пароль' console.log(err) } } // Регистрация const register = async () => { errorMessage.value = '' successMessage.value = '' // Проверка на пустые поля if (!registerForm.email || !registerForm.password || !registerForm.confirmPassword) { errorMessage.value = 'Пожалуйста, заполните все поля' return } // Проверка совпадения паролей if (registerForm.password !== registerForm.confirmPassword) { errorMessage.value = 'Пароли не совпадают' return } // Отправка запроса на сервер для регистрации try { const userInfo = { login: registerForm.email, hashPassword: registerForm.password, } await api.post('/auth/register', userInfo) } catch (err) { errorMessage.value = 'Пользователь с таким email уже существует' console.log(err) return } successMessage.value = 'Регистрация успешна! Теперь вы можете войти.' // Очистка формы registerForm.email = '' registerForm.password = '' registerForm.confirmPassword = '' // Переключение на форму входа isLoginForm.value = true } </script> <template> <div class="auth-container"> <div class="auth-form"> <div class="gradient-side"> <img src="../assets/images/reg.jpg" /> </div> <div class="form-content"> <h1>Your Travel Guide</h1> <h2>{{ isLoginForm ? 'Добро пожаловать!' : 'Регистрация' }}</h2> <!-- Сообщения об ошибках и успехе --> <div v-if="errorMessage" class="error-message">{{ errorMessage }}</div> <div v-if="successMessage" class="success-message">{{ successMessage }}</div> <div class="form-wrapper"> <!-- Форма входа --> <form v-if="isLoginForm" @submit.prevent="login"> <div class="form-group"> <label style="color: #f4a261" for="login-email">Email:</label> <input style="border-color: #f4a261" id="login-email" type="email" v-model="loginForm.email" placeholder="Введите email" required /> </div> <div class="form-group"> <label style="color: #e9c46a" for="login-password">Пароль:</label> <input style="border-color: #e9c46a" id="login-password" type="password" v-model="loginForm.password" placeholder="Введите пароль" required /> </div> <button type="submit" class="submit-btn">Войти</button> </form> <!-- Форма регистрации --> <form v-else @submit.prevent="register"> <div class="form-group"> <label style="color: #f4a261" for="register-email">Email:</label> <input style="border-color: #f4a261" id="register-email" type="email" v-model="registerForm.email" placeholder="Введите email" required /> </div> <div class="form-group"> <label style="color: #e9c46a" for="register-password">Пароль:</label> <input style="border-color: #e9c46a" id="register-password" type="password" v-model="registerForm.password" placeholder="Введите пароль" required /> </div> <div class="form-group"> <label style="color: #2a9d8f" for="confirm-password">Подтвердите пароль:</label> <input style="border-color: #2a9d8f" id="confirm-password" type="password" v-model="registerForm.confirmPassword" placeholder="Подтвердите пароль" required /> </div> <button type="submit" class="submit-btn">Зарегистрироваться</button> </form> </div> <!-- Переключение между формами --> <div class="toggle-form"> <button @click="toggleForm" class="toggle-btn"> {{ isLoginForm ? 'Нет аккаунта? Зарегистрироваться' : 'Уже есть аккаунт? Войти' }} </button> </div> <!-- Отладочная информация - список пользователей --> <!-- <div class="debug-info"> <h3>Зарегистрированные пользователи:</h3> <pre>{{ JSON.stringify(users, null, 2) }}</pre> </div>--> </div> </div> </div> </template> <style scoped> h1 { font-family: 'Amatic SC', cursive; text-align: center; font-size: xxx-large; padding: 20px; padding-bottom: 50px; } img { width: 100%; height: auto; object-fit: cover; position: relative; top: -7%; } .auth-container { display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; font-family: 'Roboto', sans-serif; } .auth-form { display: flex; background-color: #fff; border-radius: 8px; width: 100%; max-width: 1100px; height: 700px; } .gradient-side { width: 50%; background: linear-gradient(135deg, #2a9d8f 0%, #264653 100%); border-radius: 8px 0 0 8px; display: flex; align-items: center; justify-content: center; color: white; overflow: hidden; } .form-content { width: 50%; padding: 40px; display: flex; flex-direction: column; } .form-wrapper { flex: 1; display: flex; flex-direction: column; justify-content: center; } h2 { text-align: center; color: #766f6f; font-size: larger; } .form-group { margin-bottom: 16px; } label { display: block; margin-bottom: 6px; font-weight: 500; color: #333; text-align: left; } input { width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 8px; font-size: 16px; transition: border-color 0.3s; } input:focus { border-color: #264653; outline: none; } .submit-btn { width: 100%; padding: 12px; background-color: #264653; color: white; border: none; border-radius: 8px; font-size: 16px; cursor: pointer; transition: background-color 0.3s; margin-top: 10px; } .submit-btn:hover { background-color: #1d3b47; } .toggle-form { margin-top: 20px; text-align: center; } .toggle-btn { background: none; border: none; color: #766f6f; cursor: pointer; font-size: 14px; padding: 0; } .toggle-btn:hover { text-decoration: underline; color: #1d3b47; } .error-message { background-color: #ffebee; color: #d32f2f; padding: 10px; border-radius: 4px; margin-bottom: 16px; text-align: center; } .success-message { background-color: #e8f5e9; color: #2e7d32; padding: 10px; border-radius: 4px; margin-bottom: 16px; text-align: center; } .debug-info { margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee; } .debug-info h3 { font-size: 16px; margin-bottom: 10px; color: #666; } pre { background-color: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; text-align: left; } /*media (prefers-color-scheme: dark) { .auth-form { background-color: #1a1a1a; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .form-content h2, .form-content label { color: #fff; } input { background-color: #2c2c2c; border-color: #444; color: #fff; } .error-message { background-color: rgba(211, 47, 47, 0.2); color: #ff6b6b; } .success-message { background-color: rgba(46, 125, 50, 0.2); color: #81c784; } .debug-info h3 { color: #aaa; } pre { background-color: #2c2c2c; color: #ddd; } }*/ @media (max-width: 768px) { .auth-form { flex-direction: column; max-width: 400px; height: auto; } .gradient-side { width: 100%; border-radius: 8px 8px 0 0; } .form-content { width: 100%; } } </style>