0e067c7477
modified: begushiybashkir/bbvue/package.json modified: begushiybashkir/bbvue/src/main.js modified: begushiybashkir/bbvue/src/router/index.js new file: begushiybashkir/bbvue/src/stores/auth.js new file: begushiybashkir/bbvue/src/stores/user.js modified: begushiybashkir/bbvue/src/views/Login.vue modified: begushiybashkir/bbvue/src/views/Profile.vue new file: begushiybashkir/bbvue/src/views/ProfileEdit.vue modified: begushiybashkir/bbvue/src/views/Register.vue modified: serv_nginx/api_bb/bin/bb_api modified: serv_nginx/api_bb/internal/handlers/auth.go add axios, pinia store for user, auth, editProfile page
161 lines
4.3 KiB
JavaScript
161 lines
4.3 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
import axios from 'axios'
|
|
|
|
const API_BASE_URL = 'https://begushiybashkir.ru/api/v1/auth'
|
|
|
|
export const useAuthStore = defineStore('auth', () => {
|
|
const user = ref(null)
|
|
const token = ref(localStorage.getItem('auth_token') || '')
|
|
const loading = ref(false)
|
|
const error = ref('')
|
|
|
|
// Computed свойства
|
|
const isAuthenticated = computed(() => !!token.value && !!user.value)
|
|
const userFullName = computed(() => {
|
|
if (!user.value) return ''
|
|
return `${user.value.firstName} ${user.value.lastName}`
|
|
})
|
|
|
|
// Установка токена
|
|
const setToken = (newToken) => {
|
|
token.value = newToken
|
|
localStorage.setItem('auth_token', newToken)
|
|
// Устанавливаем токен в заголовки axios по умолчанию
|
|
axios.defaults.headers.common['Authorization'] = `Bearer ${newToken}`
|
|
}
|
|
|
|
// Очистка токена
|
|
const clearToken = () => {
|
|
token.value = ''
|
|
localStorage.removeItem('auth_token')
|
|
delete axios.defaults.headers.common['Authorization']
|
|
}
|
|
|
|
// Установка пользователя
|
|
const setUser = (userData) => {
|
|
user.value = userData
|
|
}
|
|
|
|
// Очистка пользователя
|
|
const clearUser = () => {
|
|
user.value = null
|
|
}
|
|
|
|
// Регистрация
|
|
const register = async (userData) => {
|
|
loading.value = true
|
|
error.value = ''
|
|
|
|
try {
|
|
const response = await axios.post(`${API_BASE_URL}/register`, userData)
|
|
|
|
// После успешной регистрации автоматически логинимся
|
|
const loginResponse = await axios.post(`${API_BASE_URL}/login`, {
|
|
email: userData.email,
|
|
password: userData.password
|
|
})
|
|
|
|
const { token: authToken, user: userInfo } = loginResponse.data
|
|
setToken(authToken)
|
|
setUser(userInfo)
|
|
|
|
return { success: true, data: response.data }
|
|
} catch (err) {
|
|
error.value = err.response?.data?.message || 'Ошибка регистрации'
|
|
return { success: false, error: error.value }
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// Логин
|
|
const login = async (credentials) => {
|
|
loading.value = true
|
|
error.value = ''
|
|
|
|
try {
|
|
const response = await axios.post(`${API_BASE_URL}/login`, credentials)
|
|
const { token: authToken, user: userInfo } = response.data
|
|
|
|
setToken(authToken)
|
|
setUser(userInfo)
|
|
|
|
return { success: true, data: response.data }
|
|
} catch (err) {
|
|
error.value = err.response?.data?.message || 'Ошибка входа'
|
|
return { success: false, error: error.value }
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// Выход
|
|
const logout = async () => {
|
|
loading.value = true
|
|
|
|
try {
|
|
await axios.post(`${API_BASE_URL}/logout`, {}, {
|
|
headers: {
|
|
'Authorization': `Bearer ${token.value}`
|
|
}
|
|
})
|
|
} catch (err) {
|
|
console.error('Ошибка при выходе:', err)
|
|
} finally {
|
|
clearToken()
|
|
clearUser()
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// Получение профиля
|
|
const fetchProfile = async () => {
|
|
loading.value = true
|
|
error.value = ''
|
|
|
|
try {
|
|
const response = await axios.get(`${API_BASE_URL}/profile`)
|
|
setUser(response.data)
|
|
return { success: true, data: response.data }
|
|
} catch (err) {
|
|
error.value = err.response?.data?.message || 'Ошибка загрузки профиля'
|
|
clearToken()
|
|
clearUser()
|
|
return { success: false, error: error.value }
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// Инициализация при загрузке приложения
|
|
const initializeAuth = async () => {
|
|
if (token.value) {
|
|
// Восстанавливаем заголовок авторизации
|
|
axios.defaults.headers.common['Authorization'] = `Bearer ${token.value}`
|
|
// Загружаем данные пользователя
|
|
await fetchProfile()
|
|
}
|
|
}
|
|
|
|
return {
|
|
// State
|
|
user,
|
|
token,
|
|
loading,
|
|
error,
|
|
|
|
// Getters
|
|
isAuthenticated,
|
|
userFullName,
|
|
|
|
// Actions
|
|
register,
|
|
login,
|
|
logout,
|
|
fetchProfile,
|
|
initializeAuth,
|
|
setToken,
|
|
clearToken
|
|
}
|
|
}) |