Sobes.tech
Middle+

¿Cómo diseñarías una aplicación para estacionamiento de automóviles en Vue.js?

sobes.tech AI

Respuesta de la IA

Utilizaría un enfoque basado en componentes en Vue.js.

Arquitectura:

  • App.vue: Componente raíz. Contiene el enrutador y los diseños principales.
  • Vistas: Componentes de página (ParkingLotsPage.vue, ParkingLotDetailsPage.vue).
  • Componentes: Componentes reutilizables (ParkingLotCard.vue, SlotStatus.vue, VehicleForm.vue).
  • Stores: Pinia para gestionar el estado (lista de parkings, ocupación de lugares).
  • Servicios: Módulos para trabajar con API (obtener datos de parkings, registrar/liberar lugares).

Estado (Pinia):

  • parkingLots: Array de objetos de parkings.
  • selectedParkingLot: Parking seleccionado actual.
  • loading: Estado de carga de datos.
// stores/parking.js
import { defineStore } from 'pinia';

export const useParkingStore = defineStore('parking', {
  state: () => ({
    parkingLots: [],
    selectedParkingLot: null,
    loading: false,
  }),
  actions: {
    async fetchParkingLots() {
      this.loading = true;
      // Simulación de solicitud a API
      await new Promise(resolve => setTimeout(resolve, 1000));
      this.parkingLots = [
        { id: 1, name: 'Estacionamiento 1', capacity: 100, occupied: 50 },
        { id: 2, name: 'Estacionamiento 2', capacity: 200, occupied: 120 },
      ];
      this.loading = false;
    },
    selectParkingLot(lotId) {
      this.selectedParkingLot = this.parkingLots.find(lot => lot.id === lotId);
    },
    // Acciones adicionales para registrar/liberar lugares
  },
});

Enrutamiento (Vue Router):

  • /parking-lots: Lista de parkings.
  • /parking-lots/:id: Detalles de un parking específico.
// 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, // Pasar parámetros de ruta como props
  },
];

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

export default router;

Componentes:

  • ParkingLotsPage.vue:
    • Obtiene la lista de parkings desde Pinia.
    • Muestra ParkingLotCard para cada parking.
  • ParkingLotCard.vue:
    • Recibe un objeto de parking como prop.
    • Muestra el nombre, capacidad y ocupación.
    • Botón para navegar a detalles del parking.
  • ParkingLotDetailsPage.vue:
    • Obtiene el id del parking desde los parámetros de ruta.
    • Lo usa para seleccionar el parking desde Pinia (o cargar detalles si no existen).
    • Muestra el esquema del parking (puede implementarse con múltiples componentes SlotStatus).
    • Formulario para registrar/liberar vehículo (VehicleForm.vue).
  • SlotStatus.vue:
    • Recibe el estado del slot (libre/ocupado).
    • Muestra el color/icono correspondiente.
  • VehicleForm.vue:
    • Formulario para ingresar el número de vehículo y seleccionar acción (entrada/salida).
    • Envía datos a Pinia/Servicio.

Estilizado:

  • Usar SCSS o módulos CSS para estilizado basado en componentes.
  • Aplicar Flexbox o Grid para disposición de elementos.

Funciones adicionales:

  • Interacción real con backend vía API.
  • Registro de usuarios y sus vehículos.
  • Historial de estacionamiento.
  • Sistema de notificaciones.
  • Sistema de pagos.

Esta es la estructura básica. Los detalles de implementación dependen de requisitos específicos y escala de la aplicación.