diff --git a/main_dc/yalarba/easySite/easySite/app/components/forms/LoginForm.vue b/main_dc/yalarba/easySite/easySite/app/components/forms/LoginForm.vue index e69de29..f574184 100644 --- a/main_dc/yalarba/easySite/easySite/app/components/forms/LoginForm.vue +++ b/main_dc/yalarba/easySite/easySite/app/components/forms/LoginForm.vue @@ -0,0 +1,72 @@ + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/components/forms/ObjectForm.vue b/main_dc/yalarba/easySite/easySite/app/components/forms/ObjectForm.vue index e69de29..0c90044 100644 --- a/main_dc/yalarba/easySite/easySite/app/components/forms/ObjectForm.vue +++ b/main_dc/yalarba/easySite/easySite/app/components/forms/ObjectForm.vue @@ -0,0 +1,234 @@ + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/components/layout/Header.vue b/main_dc/yalarba/easySite/easySite/app/components/layout/Header.vue index e69de29..ab137f9 100644 --- a/main_dc/yalarba/easySite/easySite/app/components/layout/Header.vue +++ b/main_dc/yalarba/easySite/easySite/app/components/layout/Header.vue @@ -0,0 +1,64 @@ + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/components/objects/ObjectCard.vue b/main_dc/yalarba/easySite/easySite/app/components/objects/ObjectCard.vue index e69de29..cf02463 100644 --- a/main_dc/yalarba/easySite/easySite/app/components/objects/ObjectCard.vue +++ b/main_dc/yalarba/easySite/easySite/app/components/objects/ObjectCard.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/composables/objects/TourCard.vue b/main_dc/yalarba/easySite/easySite/app/composables/objects/TourCard.vue new file mode 100644 index 0000000..4fbe6e3 --- /dev/null +++ b/main_dc/yalarba/easySite/easySite/app/composables/objects/TourCard.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts b/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts index e69de29..19507a2 100644 --- a/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts +++ b/main_dc/yalarba/easySite/easySite/app/composables/useAuth.ts @@ -0,0 +1,94 @@ +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 +} + +export const useAuth = () => { + const user = ref(null) + const isAuthenticated = 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: 'Иван Иванов' + } + user.value = mockUser + isAuthenticated.value = true + localStorage.setItem('user', JSON.stringify(mockUser)) + resolve(mockUser) + } else { + reject(new Error('Неверные учетные данные')) + } + }, 1000) + }) + } + + // Мок-функция регистрации + const register = async (data: RegisterData): Promise => { + return new Promise((resolve) => { + setTimeout(() => { + const mockUser: User = { + id: Date.now(), + email: data.email, + name: data.name + } + 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 + } + } + + return { + user, + isAuthenticated, + login, + register, + logout, + checkAuth + } +} \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/composables/useObjects.ts b/main_dc/yalarba/easySite/easySite/app/composables/useObjects.ts index e69de29..8c595fd 100644 --- a/main_dc/yalarba/easySite/easySite/app/composables/useObjects.ts +++ b/main_dc/yalarba/easySite/easySite/app/composables/useObjects.ts @@ -0,0 +1,225 @@ +import { ref } from 'vue' + +export interface ObjectItem { + id: number + title: string + description: string + type: 'hotel' | 'apartment' | 'villa' | 'camping' | 'restaurant' | 'attraction' + category: string + address: string + city: string + country: string + price: number + priceUnit: 'per_night' | 'per_person' | 'fixed' + amenities: string[] + images: string[] + contactEmail: string + contactPhone: string + website?: string + coordinates?: { + lat: number + lng: number + } + isActive: boolean + createdAt: string + updatedAt: string + userId: number + rating?: number + reviewCount?: number +} + +export const useObjects = () => { + const objects = ref([]) + const loading = ref(false) + const error = ref(null) + + // Мок-данные объектов + const mockObjects: ObjectItem[] = [ + { + id: 1, + title: 'Отель "Морской бриз"', + description: 'Комфортабельный отель с видом на море. Идеальное место для отдыха всей семьей.', + type: 'hotel', + category: 'accommodation', + address: 'ул. Приморская, 15', + city: 'Сочи', + country: 'Россия', + price: 5000, + priceUnit: 'per_night', + amenities: ['wifi', 'parking', 'breakfast', 'pool', 'spa'], + images: ['/images/hotel1.jpg', '/images/hotel2.jpg'], + contactEmail: 'hotel@example.com', + contactPhone: '+7 999 123-45-67', + website: 'https://hotel-example.com', + coordinates: { lat: 43.5855, lng: 39.7231 }, + isActive: true, + createdAt: '2024-01-15T10:00:00Z', + updatedAt: '2024-01-15T10:00:00Z', + userId: 1, + rating: 4.5, + reviewCount: 23 + }, + { + id: 2, + title: 'Апартаменты в центре', + description: 'Современные апартаменты в историческом центре города.', + type: 'apartment', + category: 'accommodation', + address: 'ул. Центральная, 25', + city: 'Москва', + country: 'Россия', + price: 3500, + priceUnit: 'per_night', + amenities: ['wifi', 'kitchen', 'washing_machine'], + images: ['/images/apartment1.jpg'], + contactEmail: 'apart@example.com', + contactPhone: '+7 999 765-43-21', + isActive: true, + createdAt: '2024-01-10T14:30:00Z', + updatedAt: '2024-01-12T09:15:00Z', + userId: 2, + rating: 4.2, + reviewCount: 15 + } + ] + + // Получить все объекты + const fetchObjects = async (filters?: any): Promise => { + loading.value = true + error.value = null + + return new Promise((resolve) => { + setTimeout(() => { + let filteredObjects = [...mockObjects] + + // Применяем фильтры + if (filters) { + if (filters.type) { + filteredObjects = filteredObjects.filter(obj => obj.type === filters.type) + } + if (filters.city) { + filteredObjects = filteredObjects.filter(obj => + obj.city.toLowerCase().includes(filters.city.toLowerCase()) + ) + } + if (filters.userId) { + filteredObjects = filteredObjects.filter(obj => obj.userId === filters.userId) + } + } + + objects.value = filteredObjects + loading.value = false + resolve(filteredObjects) + }, 500) + }) + } + + // Получить объект по ID + const fetchObjectById = async (id: number): Promise => { + loading.value = true + + return new Promise((resolve) => { + setTimeout(() => { + const object = mockObjects.find(obj => obj.id === id) || null + loading.value = false + resolve(object) + }, 300) + }) + } + + // Создать новый объект + const createObject = async (objectData: Omit): Promise => { + loading.value = true + error.value = null + + return new Promise((resolve, reject) => { + setTimeout(() => { + try { + const newObject: ObjectItem = { + ...objectData, + id: Date.now(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + } + + mockObjects.push(newObject) + objects.value.push(newObject) + loading.value = false + resolve(newObject) + } catch (err) { + error.value = 'Ошибка при создании объекта' + loading.value = false + reject(err) + } + }, 1000) + }) + } + + // Обновить объект + const updateObject = async (id: number, objectData: Partial): Promise => { + loading.value = true + error.value = null + + return new Promise((resolve, reject) => { + setTimeout(() => { + try { + const index = mockObjects.findIndex(obj => obj.id === id) + if (index === -1) { + throw new Error('Объект не найден') + } + + const updatedObject: ObjectItem = { + ...mockObjects[index], + ...objectData, + updatedAt: new Date().toISOString() + } + + mockObjects[index] = updatedObject + objects.value[index] = updatedObject + loading.value = false + resolve(updatedObject) + } catch (err) { + error.value = 'Ошибка при обновлении объекта' + loading.value = false + reject(err) + } + }, 800) + }) + } + + // Удалить объект + const deleteObject = async (id: number): Promise => { + loading.value = true + + return new Promise((resolve) => { + setTimeout(() => { + const index = mockObjects.findIndex(obj => obj.id === id) + if (index !== -1) { + mockObjects.splice(index, 1) + objects.value.splice(index, 1) + } + loading.value = false + resolve() + }, 500) + }) + } + + // Получить объекты текущего пользователя + const fetchMyObjects = async (): Promise => { + // В реальном приложении здесь будет userId из авторизации + const currentUserId = 1 + return fetchObjects({ userId: currentUserId }) + } + + return { + objects, + loading, + error, + fetchObjects, + fetchObjectById, + createObject, + updateObject, + deleteObject, + fetchMyObjects + } +} \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/layouts/auth.vue b/main_dc/yalarba/easySite/easySite/app/layouts/auth.vue index 4fdb822..d4e48e1 100644 --- a/main_dc/yalarba/easySite/easySite/app/layouts/auth.vue +++ b/main_dc/yalarba/easySite/easySite/app/layouts/auth.vue @@ -1,6 +1,27 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/layouts/default.vue b/main_dc/yalarba/easySite/easySite/app/layouts/default.vue index f8c4b4f..bff28f7 100644 --- a/main_dc/yalarba/easySite/easySite/app/layouts/default.vue +++ b/main_dc/yalarba/easySite/easySite/app/layouts/default.vue @@ -1,54 +1,15 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts b/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts index e69de29..10ae0db 100644 --- a/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts +++ b/main_dc/yalarba/easySite/easySite/app/middleware/auth.ts @@ -0,0 +1,8 @@ +export default defineNuxtRouteMiddleware((to) => { + console.log(to) + const { isAuthenticated } = useAuth() + + if (!isAuthenticated) { + return navigateTo('/auth/login') + } +}) \ 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 1150aad..a280646 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue @@ -1,66 +1,31 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/index.vue b/main_dc/yalarba/easySite/easySite/app/pages/index.vue index 2a8d945..607df4c 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/index.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/index.vue @@ -1,34 +1,93 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/edit.vue b/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/edit.vue index 4fdb822..9b4e137 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/edit.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/edit.vue @@ -1,6 +1,83 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/index.vue b/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/index.vue index 4fdb822..e68f33f 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/index.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/index.vue @@ -1,6 +1,290 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/objects/create.vue b/main_dc/yalarba/easySite/easySite/app/pages/objects/create.vue index 4fdb822..252b467 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/objects/create.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/objects/create.vue @@ -1,6 +1,52 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/objects/index.vue b/main_dc/yalarba/easySite/easySite/app/pages/objects/index.vue index 4fdb822..a582ce1 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/objects/index.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/objects/index.vue @@ -1,6 +1,104 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/main_dc/yalarba/easySite/easySite/app/pages/objects/my-objects.vue b/main_dc/yalarba/easySite/easySite/app/pages/objects/my-objects.vue index 4fdb822..6bb8982 100644 --- a/main_dc/yalarba/easySite/easySite/app/pages/objects/my-objects.vue +++ b/main_dc/yalarba/easySite/easySite/app/pages/objects/my-objects.vue @@ -1,6 +1,182 @@ \ No newline at end of file + + + \ No newline at end of file