diff --git a/app-frontend/src/api/auth.js b/app-frontend/src/api/auth.js new file mode 100644 index 0000000..cfbbfbb --- /dev/null +++ b/app-frontend/src/api/auth.js @@ -0,0 +1,41 @@ +import { publicApi } from './http' + +export async function fetchEmailVerifyStatus() { + const { data } = await publicApi.get('/email/verify-status') + return data +} + +export async function generateCaptcha() { + const { data } = await publicApi.post('/generate_captcha', {}) + return data +} + +export async function login(payload) { + const { data } = await publicApi.post('/login', payload) + return data +} + +export async function register(payload) { + const { data } = await publicApi.post('/register', payload) + return data +} + +export async function resendVerifyEmail(payload) { + const { data } = await publicApi.post('/resend-verify-email', payload) + return data +} + +export async function forgotPassword(payload) { + const { data } = await publicApi.post('/forgot-password', payload) + return data +} + +export async function requestPasswordReset(payload) { + const { data } = await publicApi.post('/reset_password_request', payload) + return data +} + +export async function confirmPasswordReset(payload) { + const { data } = await publicApi.post('/reset-password-confirm', payload) + return data +} diff --git a/app-frontend/src/api/http.js b/app-frontend/src/api/http.js new file mode 100644 index 0000000..2ecab0a --- /dev/null +++ b/app-frontend/src/api/http.js @@ -0,0 +1,8 @@ +import axios from 'axios' + +export const publicApi = axios.create({ + baseURL: '/api', + timeout: 30_000, + withCredentials: true, +}) + diff --git a/app-frontend/src/pages/LoginPage.vue b/app-frontend/src/pages/LoginPage.vue index 3687fcb..6ba625f 100644 --- a/app-frontend/src/pages/LoginPage.vue +++ b/app-frontend/src/pages/LoginPage.vue @@ -1,11 +1,270 @@ @@ -61,8 +430,49 @@ function goRegister() { font-size: 12px; } -.actions { - margin-top: 16px; +.links { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin: 2px 0 10px; + flex-wrap: wrap; +} + +.submit-btn { + width: 100%; +} + +.foot { + margin-top: 14px; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; +} + +.dialog-form { + margin-top: 10px; +} + +.captcha-row { + display: flex; + align-items: center; + gap: 10px; + width: 100%; +} + +.captcha-img { + height: 40px; + border: 1px solid var(--app-border); + border-radius: 8px; + cursor: pointer; + user-select: none; +} + +@media (max-width: 480px) { + .captcha-img { + height: 38px; + } } - diff --git a/app-frontend/src/pages/RegisterPage.vue b/app-frontend/src/pages/RegisterPage.vue index 99b0a01..275ed36 100644 --- a/app-frontend/src/pages/RegisterPage.vue +++ b/app-frontend/src/pages/RegisterPage.vue @@ -1,11 +1,140 @@