From 8fee46ce5c64d2da9d20a23500bc0b447e842b97 Mon Sep 17 00:00:00 2001 From: valitovgaziz Date: Fri, 14 Nov 2025 23:55:02 +0500 Subject: [PATCH] modified: main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts modified: main_dc/yalarba/easySite/easySite/app/middleware/auth.ts modified: main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue modified: main_dc/yalarba/easySite/easySite/app/pages/auth/register.vue new file: main_dc/yalarba/easySite/easySite/app/pages/plugins/auth.client.ts modified: main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue new file: main_dc/yalarba/easySite/easySite/app/schemas/auth.ts modified: main_dc/yalarba/easySite/easySite/app/types/auth.ts modified: main_dc/yalarba/easySite/easySite/package-lock.json modified: main_dc/yalarba/easySite/easySite/package.json update login register with use vee and firebase --- .../easySite/app/composables/useAuth.ts | 158 +++++----- .../easySite/easySite/app/middleware/auth.ts | 18 +- .../easySite/app/pages/auth/login.vue | 195 ++++++++++-- .../easySite/app/pages/auth/register.vue | 298 +++++++++++------- .../easySite/app/pages/plugins/auth.client.ts | 5 + .../easySite/app/pages/profile/index.vue | 7 +- .../easySite/easySite/app/schemas/auth.ts | 36 +++ .../easySite/easySite/app/types/auth.ts | 22 ++ .../easySite/easySite/package-lock.json | 94 +++++- .../yalarba/easySite/easySite/package.json | 4 +- 10 files changed, 603 insertions(+), 234 deletions(-) create mode 100644 main_dc/yalarba/easySite/easySite/app/pages/plugins/auth.client.ts create mode 100644 main_dc/yalarba/easySite/easySite/app/schemas/auth.ts diff --git a/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts b/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts index 19507a2..752e748 100644 --- a/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts +++ b/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts @@ -1,91 +1,99 @@ -import { ref } from 'vue' - -interface User { - id: number - email: string - name: string - avatar?: string -} - -interface LoginData { - email: string - password: string -} - -interface RegisterData { - name: string - email: string - password: string - passwordConfirmation: string -} +// composables/useAuth.ts +import type { User, LoginForm, RegisterForm } from '~/types/auth' export const useAuth = () => { - const user = ref(null) - const isAuthenticated = ref(false) + const user = useState('user', () => null) + const isAuthenticated = computed(() => !!user.value) + const loading = ref(false) - // Мок-функция входа - const login = async (credentials: LoginData): Promise => { - // В реальном приложении здесь будет запрос к API - return new Promise((resolve, reject) => { - setTimeout(() => { - if (credentials.email === 'user@example.com' && credentials.password === 'password') { - const mockUser: User = { - id: 1, - email: credentials.email, - name: 'Иван Иванов' + const login = async (credentials: LoginForm) => { + loading.value = true + try { + const response = await $fetch<{ user: User; token: string }>( + 'https://easysite102.ru/api/auth/login', + { + method: 'POST', + body: credentials + } + ) + + user.value = response.user + // Сохраняем токен в localStorage или cookies + localStorage.setItem('auth_token', response.token) + + return response + // eslint-disable-next-line no-useless-catch + } catch (error) { + throw error + } finally { + loading.value = false + } + } + + const register = async (userData: RegisterForm) => { + loading.value = true + try { + const { passwordConfirm, ...registerData } = userData + const full_name = `${userData.first_name} ${userData.last_name}` + + const response = await $fetch<{ user: User }>( + 'https://easysite102.ru/api/auth/register', + { + method: 'POST', + body: { + ...registerData, + full_name } - user.value = mockUser - isAuthenticated.value = true - localStorage.setItem('user', JSON.stringify(mockUser)) - resolve(mockUser) - } else { - reject(new Error('Неверные учетные данные')) } - }, 1000) - }) + ) + + return response + // eslint-disable-next-line no-useless-catch + } catch (error) { + throw error + } finally { + loading.value = false + } } - // Мок-функция регистрации - const register = async (data: RegisterData): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - const mockUser: User = { - id: Date.now(), - email: data.email, - name: data.name + const logout = async () => { + try { + await $fetch('https://easysite102.ru/api/auth/logout', { + method: 'POST' + }) + } catch (error) { + console.error('Logout error:', error) + } finally { + user.value = null + localStorage.removeItem('auth_token') + await navigateTo('/auth/login') + } + } + + const checkAuth = async () => { + const token = localStorage.getItem('auth_token') + if (!token) return + + try { + const response = await $fetch<{ user: User }>( + 'https://easysite102.ru/api/auth/me', + { + headers: { + Authorization: `Bearer ${token}` + } } - user.value = mockUser - isAuthenticated.value = true - localStorage.setItem('user', JSON.stringify(mockUser)) - resolve(mockUser) - }, 1000) - }) - } - - // Выход - const logout = async (): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - user.value = null - isAuthenticated.value = false - localStorage.removeItem('user') - resolve() - }, 500) - }) - } - - // Проверка авторизации при загрузке - const checkAuth = () => { - const storedUser = localStorage.getItem('user') - if (storedUser) { - user.value = JSON.parse(storedUser) - isAuthenticated.value = true + ) + user.value = response.user + } catch (error) { + console.error('Auth check failed:', error) + localStorage.removeItem('auth_token') } } return { - user, + user: readonly(user), isAuthenticated, + loading: readonly(loading), login, register, logout, diff --git a/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts b/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts index 10ae0db..7d25256 100644 --- a/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts +++ b/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts @@ -1,8 +1,14 @@ +// middleware/auth.ts export default defineNuxtRouteMiddleware((to) => { - console.log(to) - const { isAuthenticated } = useAuth() - - if (!isAuthenticated) { - return navigateTo('/auth/login') - } + const { isAuthenticated } = useAuth() + + // Если маршрут требует аутентификации и пользователь не авторизован + if (to.meta.requiresAuth && !isAuthenticated.value) { + return navigateTo('/auth/login') + } + + // Если пользователь авторизован и пытается получить доступ к страницам аутентификации + if (to.path.startsWith('/auth') && isAuthenticated.value) { + return navigateTo('/profile') + } }) \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue b/main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue index 31e7e26..d212e27 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue @@ -6,40 +6,37 @@

Вход в систему

- +
-
+
- + + + {{ errors.email }} +
- +
- + + + {{ errors.password }} +
- -
- +
-
- -
- - -
+ +
+ +
+ + + + {{ errors.first_name }} + +
- -
- - + +
+ + + + {{ errors.last_name }} + +
- + + + {{ errors.email }} +
- -
- - +
+ +
+ + + + {{ errors.password }} + +
+ + +
+ + + + {{ errors.passwordConfirm }} + +
- -
- - -
- - @@ -66,83 +88,44 @@ - \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/plugins/auth.client.ts b/main_dc/yalarba/easySite/easySite/app/pages/plugins/auth.client.ts new file mode 100644 index 0000000..43c3c3f --- /dev/null +++ b/main_dc/yalarba/easySite/easySite/app/pages/plugins/auth.client.ts @@ -0,0 +1,5 @@ +// plugins/auth.client.ts +export default defineNuxtPlugin(async () => { + const auth = useAuth() + await auth.checkAuth() +}) \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue b/main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue index 5067940..e85626a 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue @@ -195,7 +195,12 @@