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
ParkingLotCarddla 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.
- Przyjmuje obiekt parkingu jako
- ParkingLotDetailsPage.vue:
- Pobiera
idparkingu 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).
- Pobiera
- 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.