diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..7245885 --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,7 @@ +import type { RegisterRequest } from "@/types"; // Мы создадим этот тип +import apiClient from "./axios"; + +export const registerUser = (userData: RegisterRequest) => { + // apiClient уже настроен на /api, поэтому путь относительный + return apiClient.post("/register", userData); +}; diff --git a/src/stores/auth.ts b/src/stores/auth.ts new file mode 100644 index 0000000..4bab45f --- /dev/null +++ b/src/stores/auth.ts @@ -0,0 +1,39 @@ +import { defineStore } from "pinia"; +import { ref } from "vue"; +import { registerUser as apiRegisterUser } from "@/api/auth"; +import type { RegisterRequest } from "@/types"; +import router from "@/router"; + +export const useAuthStore = defineStore("auth", () => { + // State + const isLoading = ref(false); + const error = ref(null); + + // Actions + async function handleRegister(userData: RegisterRequest) { + isLoading.value = true; + error.value = null; + try { + await apiRegisterUser(userData); + // После успешной регистрации перенаправляем на страницу входа + await router.push({ name: "login" }); + // Можно добавить сообщение об успехе ("тост") + // alert('Регистрация прошла успешно! Теперь вы можете войти.'); + } catch (e: any) { + // Обрабатываем ошибки от Axios + if (e.response && e.response.data) { + error.value = e.response.data; + } else { + error.value = "Произошла неизвестная ошибка"; + } + } finally { + isLoading.value = false; + } + } + + return { + isLoading, + error, + handleRegister, + }; +}); diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..3f1907c --- /dev/null +++ b/src/types.ts @@ -0,0 +1,6 @@ +// Тип для запроса на регистрацию, должен совпадать с бэкендом +export interface RegisterRequest { + username: string; + email: string; + password: string; +} diff --git a/src/views/RegisterView.vue b/src/views/RegisterView.vue index 46c44c4..a4ef632 100644 --- a/src/views/RegisterView.vue +++ b/src/views/RegisterView.vue @@ -1,3 +1,136 @@ + + + + diff --git a/tsconfig.app.json b/tsconfig.app.json index 3dbbc45..41c9227 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -9,7 +9,13 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + "noUncheckedSideEffectImports": true, + + /* Path Aliases */ + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } }, "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] } diff --git a/vite.config.ts b/vite.config.ts index 0a4e9b9..5b45a85 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,15 +1,19 @@ import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; +import path from "path"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, server: { - // <-- ДОБАВЬТЕ ЭТОТ БЛОК proxy: { - // Проксируем все запросы, начинающиеся с /api, /authserver, /sessionserver "^/api|/authserver|/sessionserver": { - target: "http://localhost:8080", // Адрес вашего локального бэкенда + target: "http://localhost:8080", changeOrigin: true, }, },