Назад к вопросам
Middle+
82
questionbank

Как бы вы спроектировали приложение для автомобильного паркинга на Vue.js?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Использовал бы компонентный подход Vue.js.

Архитектура:

  • App.vue: Корневой компонент. Содержит роутер и основные макеты.
  • Views: Компоненты-страницы (ParkingLotsPage.vue, ParkingLotDetailsPage.vue).
  • Components: Переиспользуемые компоненты (ParkingLotCard.vue, SlotStatus.vue, VehicleForm.vue).
  • Stores: Pinia для управления состоянием (список парковок, занятость мест).
  • Services: Модули для работы с API (получение данных о парковках, регистрация/освобождение мест).

Состояние (Pinia):

  • parkingLots: Массив объектов парковок.
  • selectedParkingLot: Текущая выбранная парковка.
  • loading: Состояние загрузки данных.
// stores/parking.js
import { defineStore } from 'pinia';

export const useParkingStore = defineStore('parking', {
  state: () => ({
    parkingLots: [],
    selectedParkingLot: null,
    loading: false,
  }),
  actions: {
    async fetchParkingLots() {
      this.loading = true;
      // Имитация запроса к API
      await new Promise(resolve => setTimeout(resolve, 1000));
      this.parkingLots = [
        { id: 1, name: 'Парковка 1', capacity: 100, occupied: 50 },
        { id: 2, name: 'Парковка 2', capacity: 200, occupied: 120 },
      ];
      this.loading = false;
    },
    selectParkingLot(lotId) {
      this.selectedParkingLot = this.parkingLots.find(lot => lot.id === lotId);
    },
    // Дополнительные экшены для регистрации/освобождения мест
  },
});

Маршрутизация (Vue Router):

  • /parking-lots: Список парковок.
  • /parking-lots/:id: Детали конкретной парковки.
// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import ParkingLotsPage from '@/views/ParkingLotsPage.vue';
import ParkingLotDetailsPage from '@/views/ParkingLotDetailsPage.vue';

const routes = [
  {
    path: '/parking-lots',
    name: 'ParkingLots',
    component: ParkingLotsPage,
  },
  {
    path: '/parking-lots/:id',
    name: 'ParkingLotDetails',
    component: ParkingLotDetailsPage,
    props: true, // Передавать параметры маршрута как props
  },
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes,
});

export default router;

Компоненты:

  • ParkingLotsPage.vue:
    • Получает список парковок из Pinia.
    • Отображает ParkingLotCard для каждой парковки.
  • ParkingLotCard.vue:
    • Принимает объект парковки в качестве prop.
    • Отображает название, вместимость и занятость.
    • Кнопка для перехода к деталям парковки.
  • ParkingLotDetailsPage.vue:
    • Получает id парковки из параметров маршрута.
    • Использует его для выбора парковки из Pinia (или загрузки деталей, если их нет).
    • Отображает схему парковки (можно реализовать с помощью множества SlotStatus компонентов).
    • Форма для регистрации/освобождения автомобиля (VehicleForm.vue).
  • SlotStatus.vue:
    • Принимает статус слота (свободен/занят).
    • Отображает соответствующий цвет/иконку.
  • VehicleForm.vue:
    • Форма для ввода номера автомобиля и выбора действия (въезд/выезд).
    • Отправляет данные в Pinia/Service.

Стилизация:

  • Использовать SCSS или CSS-модули для компонентно-ориентированной стилизации.
  • Применить флексбокс или гриды для размещения элементов.

Дополнительные возможности:

  • Реальное взаимодействие с бэкендом через API.
  • Регистрация пользователей и их автомобилей.
  • История парковки.
  • Система уведомлений.
  • Платежная система.

Это базовая структура. Детали реализации зависят от конкретных требований и масштаба приложения.