From bca9161416653179e1dbf4c26567628c02bacf79 Mon Sep 17 00:00:00 2001 From: valitovgaziz Date: Mon, 6 Oct 2025 04:44:30 +0500 Subject: [PATCH] yalarba.ru front set new auth.store and auth.service --- .../spa/vue/src/auth/services/auth.service.js | 79 +++++++++++++---- .../spa/vue/src/auth/services/authService.js | 20 ----- .../spa/vue/src/auth/stores/auth.store.js | 85 +++++++++++++++++-- .../vue/src/components/inout/registration.vue | 71 ++++++++-------- 4 files changed, 175 insertions(+), 80 deletions(-) delete mode 100644 yalarba/serv_spa/spa/vue/src/auth/services/authService.js diff --git a/yalarba/serv_spa/spa/vue/src/auth/services/auth.service.js b/yalarba/serv_spa/spa/vue/src/auth/services/auth.service.js index 0524160..69516c9 100644 --- a/yalarba/serv_spa/spa/vue/src/auth/services/auth.service.js +++ b/yalarba/serv_spa/spa/vue/src/auth/services/auth.service.js @@ -1,20 +1,69 @@ // src/auth/services/auth.service.js -import axios from 'axios'; +const API_URL = 'https://yalarba.ru/api/v1/auth'; -const API_URL = 'https://yalarba.ru/api'; +class AuthService { + static async register(userData) { + try { + const response = await fetch(`${API_URL}/register`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(userData) + }); -const login = async (credentials) => { - const response = await axios.post(`${API_URL}/auth/login`, credentials, { - 'Content-Type': 'application/json' - }); - return response.data; -}; + if (!response.ok) { + throw new Error('Registration failed'); + } -const checkAuth = async (token) => { - const response = await axios.get(`${API_URL}/auth/check`, { - headers: { Authorization: `Bearer ${token}` }, - }); - return response.data; -}; + return await response.json(); + } catch (error) { + console.error('Registration error:', error); + throw error; + } + } -export default { login, checkAuth }; \ No newline at end of file + static async login(credentials) { + try { + const response = await fetch(`${API_URL}/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(credentials) + }); + + if (!response.ok) { + throw new Error('Login failed'); + } + + return await response.json(); + } catch (error) { + console.error('Login error:', error); + throw error; + } + } + + static async checkAuth(token) { + try { + const response = await fetch(`${API_URL}/validate`, { + method: 'GET', + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json', + } + }); + + if (!response.ok) { + throw new Error('Token validation failed'); + } + + return await response.json(); + } catch (error) { + console.error('Check auth error:', error); + throw error; + } + } +} + +export default AuthService; \ No newline at end of file diff --git a/yalarba/serv_spa/spa/vue/src/auth/services/authService.js b/yalarba/serv_spa/spa/vue/src/auth/services/authService.js deleted file mode 100644 index 0524160..0000000 --- a/yalarba/serv_spa/spa/vue/src/auth/services/authService.js +++ /dev/null @@ -1,20 +0,0 @@ -// src/auth/services/auth.service.js -import axios from 'axios'; - -const API_URL = 'https://yalarba.ru/api'; - -const login = async (credentials) => { - const response = await axios.post(`${API_URL}/auth/login`, credentials, { - 'Content-Type': 'application/json' - }); - return response.data; -}; - -const checkAuth = async (token) => { - const response = await axios.get(`${API_URL}/auth/check`, { - headers: { Authorization: `Bearer ${token}` }, - }); - return response.data; -}; - -export default { login, checkAuth }; \ No newline at end of file diff --git a/yalarba/serv_spa/spa/vue/src/auth/stores/auth.store.js b/yalarba/serv_spa/spa/vue/src/auth/stores/auth.store.js index a9679e2..7a91262 100644 --- a/yalarba/serv_spa/spa/vue/src/auth/stores/auth.store.js +++ b/yalarba/serv_spa/spa/vue/src/auth/stores/auth.store.js @@ -8,16 +8,77 @@ export const useAuthStore = defineStore('auth', () => { const user = reactive({username: '', email: '', id: 0, token: ''}); const isAuthenticated = ref(false); + // Восстановление из localStorage при инициализации + const initFromStorage = () => { + const storedToken = localStorage.getItem('token'); + const storedUser = localStorage.getItem('user'); + + if (storedToken && storedUser) { + try { + user.token = storedToken; + const userData = JSON.parse(storedUser); + user.username = userData.username; + user.email = userData.email; + user.id = userData.id; + isAuthenticated.value = true; + } catch (error) { + console.error('Error restoring from storage:', error); + logout(); + } + } + }; + + // Вызываем при создании store + initFromStorage(); + + // ДОБАВЬТЕ ЭТОТ МЕТОД - регистрация + const register = async (userData) => { + try { + const response = await AuthService.register(userData); + + // Если сервер возвращает токен при регистрации + if (response.token) { + const decodedToken = jwtDecode(response.token); + user.username = decodedToken.user?.username || userData.name; + user.id = decodedToken.user?.id || 0; + user.email = decodedToken.user?.email || userData.email; + isAuthenticated.value = true; + user.token = response.token; + + // Сохраняем в localStorage + localStorage.setItem('token', response.token); + localStorage.setItem('user', JSON.stringify({ + username: user.username, + email: user.email, + id: user.id + })); + } + + return response; + } catch (error) { + console.error('Registration failed', error); + throw error; + } + }; + const login = async (credentials) => { try { const response = await AuthService.login(credentials); const decodedToken = jwtDecode(response.token); - user.name = decodedToken.user.username; - user.id = decodedToken.user.id; - user.email = decodedToken.user.email; + user.username = decodedToken.user?.username || ''; + user.id = decodedToken.user?.id || 0; + user.email = decodedToken.user?.email || credentials.email; isAuthenticated.value = true; user.token = response.token; + // Сохраняем в localStorage + localStorage.setItem('token', response.token); + localStorage.setItem('user', JSON.stringify({ + username: user.username, + email: user.email, + id: user.id + })); + } catch (error) { console.error('Login failed', error); throw error; @@ -26,30 +87,38 @@ export const useAuthStore = defineStore('auth', () => { const logout = () => { isAuthenticated.value = false; - user.name = ''; + user.username = ''; user.token = ''; user.email = ''; user.id = 0; + + // Удаляем из localStorage + localStorage.removeItem('token'); + localStorage.removeItem('user'); }; const checkAuth = async () => { try { - const token = user.token; + const token = user.token || localStorage.getItem('token'); if (token) { try { const response = await AuthService.checkAuth(token); - user.value = response.user; + // Обновляем данные пользователя + user.username = response.user?.username || user.username; + user.id = response.user?.id || user.id; + user.email = response.user?.email || user.email; isAuthenticated.value = true; } catch (error) { + console.error('Token validation failed:', error); logout(); } } } catch (error) { console.error('Check auth failed', error); throw error; - } }; - return { user, isAuthenticated, login, logout, checkAuth }; + // ВАЖНО: добавьте register в return + return { user, isAuthenticated, register, login, logout, checkAuth }; }); \ No newline at end of file diff --git a/yalarba/serv_spa/spa/vue/src/components/inout/registration.vue b/yalarba/serv_spa/spa/vue/src/components/inout/registration.vue index ca9b5c7..ff44a0c 100644 --- a/yalarba/serv_spa/spa/vue/src/components/inout/registration.vue +++ b/yalarba/serv_spa/spa/vue/src/components/inout/registration.vue @@ -8,7 +8,7 @@ - +
@@ -34,40 +34,55 @@