Sobes.tech
Middle+

Jak zaprojektowałbyś aplikację do parkowania samochodów na Vue.js?

sobes.tech AI

Odpowiedź od AI

Używałbym podejścia opartego na komponentach w Vue.js.

Architektura:

  • App.vue: Komponent główny. Zawiera router i główne układy.
  • Widoki: Komponenty stron (ParkingLotsPage.vue, ParkingLotDetailsPage.vue).
  • Komponenty: Komponenty wielokrotnego użytku (ParkingLotCard.vue, SlotStatus.vue, VehicleForm.vue).
  • Stores: Pinia do zarządzania stanem (lista parkingów, zajętość miejsc).
  • Serwisy: Moduły do pracy z API (pobieranie danych o parkingach, rejestracja/zwalnianie miejsc).

Stan (Pinia):

  • parkingLots: Tablica obiektów parkingowych.
  • selectedParkingLot: Aktualnie wybrany parking.
  • loading: Stan ładowania danych.
// stores/parking.js
import { defineStore } from 'pinia';

export const useParkingStore = defineStore('parking', {
  state: () => ({
    parkingLots: [],
    selectedParkingLot: null,
    loading: false,
  }),
  actions: {
    async fetchParkingLots() {
      this.loading = true;
      // Symulacja zapytania do API
      await new Promise(resolve => setTimeout(resolve, 1000));
      this.parkingLots = [
        { id: 1, name: 'Parking 1', capacity: 100, occupied: 50 },
        { id: 2, name: 'Parking 2', capacity: 200, occupied: 120 },
      ];
      this.loading = false;
    },
    selectParkingLot(lotId) {
      this.selectedParkingLot = this.parkingLots.find(lot => lot.id === lotId);
    },
    // Dodatkowe akcje do rejestracji/zwalniania miejsc
  },
});

Routing (Vue Router):

  • /parking-lots: Lista parkingów.
  • /parking-lots/:id: Szczegóły konkretnego parkingu.
// 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, // Przekazywanie parametrów trasy jako props
  },
];

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

export default router;

Komponenty:

  • ParkingLotsPage.vue:
    • Pobiera listę parkingów z Pinia.
    • Wyświetla ParkingLotCard dla każdego parkingu.
  • ParkingLotCard.vue:
    • Przyjmuje obiekt parkingu jako prop.
    • Wyświetla nazwę, pojemność i zajętość.
    • Przycisk do przejścia do szczegółów parkingu.
  • ParkingLotDetailsPage.vue:
    • Pobiera id parkingu z parametrów trasy.
    • Używa go do wybrania parkingu z Pinia (lub ładowania szczegółów, jeśli ich nie ma).
    • Wyświetla schemat parkingu (można zaimplementować za pomocą wielu komponentów SlotStatus).
    • Formularz do rejestracji/zwalniania pojazdu (VehicleForm.vue).
  • SlotStatus.vue:
    • Przyjmuje status slotu (wolny/zajęty).
    • Wyświetla odpowiedni kolor/ikonę.
  • VehicleForm.vue:
    • Formularz do wprowadzenia numeru pojazdu i wyboru akcji (wjazd/wyjazd).
    • Wysyła dane do Pinia/Serwisu.

Stylizacja:

  • Używać SCSS lub CSS-modułów do stylizacji komponentowej.
  • Zastosować Flexbox lub Grid do rozmieszczenia elementów.

Dodatkowe funkcje:

  • Rzeczywista interakcja z backendem przez API.
  • Rejestracja użytkowników i ich pojazdów.
  • Historia parkowania.
  • System powiadomień.
  • System płatności.

To jest podstawowa struktura. Szczegóły implementacji zależą od konkretnych wymagań i skali aplikacji.