inicio - FactoriaF5-Asturias/project-p5-digital-academy-team2-restaurant-frontend GitHub Wiki
Inicio — Página principal del restaurante
Vista
La página de Inicio (/) es la primera que ve el visitante. Está formada por cuatro secciones:
- Hero: titular, imagen de ambiente y botón "Ver la carta".
- Especialidades de la casa: los platos destacados de la carta.
- Próximos eventos: los eventos destacados que aún no se han celebrado, con enlace al calendario anual.
- ¿Hablamos?: formulario de contacto.
Responsables y tareas
Responsable: Gema Miguel · Maqueta inicial: Iker · Ajustes del fondo: Ruddi
| Tarea Jira | Descripción | Estado |
|---|---|---|
| GC-78 | [HU-05] Página de inicio con presentación y acceso a la Carta | Historia |
| GC-79 | Sección hero con titular, imagen de ambiente y CTA | Listo |
| GC-82 | Conectar el CTA a la ruta de la Carta | Listo |
| GC-83 | Estilos mobile-first y animación de entrada | Listo |
| GC-261 | Sección "Especialidades de la casa" con tarjetas de producto | Listo |
| GC-262 | Sección "Próximos eventos" con tarjetas de evento | Listo |
| GC-263 | Sección de contacto "¿Hablamos?" con formulario | Listo |
| GC-267 | Conectar "Próximos eventos" al back (solo eventos futuros) | Listo |
| GC-268 | Conectar el formulario "¿Hablamos?" al back | Listo |
Capturas
Entidades involucradas
| Archivo | Tipo | Función |
|---|---|---|
src/Views/Home/HomeView.vue |
Vista | Página de Inicio: carga productos y eventos y reparte los datos a cada sección |
src/components/HeroSection.vue |
Componente | Titular, imagen y botón "Ver la carta" |
src/components/SpecialtiesSection.vue |
Componente | Tarjetas de los platos destacados (recibe dishes por props) |
src/components/EventsSection.vue |
Componente | Tarjetas de los próximos eventos (recibe events por props) |
src/components/ContactForm.vue |
Componente | Formulario "¿Hablamos?" que envía el mensaje al back |
src/composables/useProducts.js |
Composable | Pide los productos al back y los comparte con la Carta |
src/composables/useEvents.js |
Composable | Pide los eventos al back, les da formato y los comparte con el calendario |
Endpoints que consume
| Método | Ruta | Para qué |
|---|---|---|
GET |
/api/products |
Platos de "Especialidades de la casa" (los que tienen featured = true) |
GET |
/api/events |
Eventos de "Próximos eventos" (destacados y con fecha futura) |
POST |
/api/contact-messages |
Envío del formulario "¿Hablamos?" |
La URL base se toma de la variable VITE_API_URL del archivo .env (ver .env.example).
Cómo probarlo
- Arranca el back (Docker Desktop +
GoxuApplication) y el front (npm run dev). - Abre
http://localhost:5173/. - Comprueba que:
- "Ver la carta" lleva a
/carta. - Aparecen los platos destacados y los próximos eventos.
- "Ver calendario anual →" lleva a
/calendario-eventos. - Al enviar el formulario con datos válidos aparece un mensaje de agradecimiento, y con datos incorrectos el navegador avisa del campo que falla.
- "Ver la carta" lleva a
Decisiones
- La vista solo reparte datos.
HomeViewcarga productos y eventos, y pasa a cada sección lo que necesita por props. Las secciones no saben de dónde vienen los datos. - Estado compartido en los composables. Las listas de productos y eventos se declaran fuera de la función del composable, así la Home, la Carta y el calendario usan la misma lista.
- Adaptadores entre back y front.
useEventstraduce cada evento al formato que usan las tarjetas (fecha "28 MARZO · 20:30H", precio o "Entrada gratuita"), sin tener que cambiar los componentes. - Solo eventos futuros. "Próximos eventos" filtra los destacados cuya fecha aún no ha pasado.
- Dos botones, dos preferencias de contacto. "Quiero que me llaméis" envía
CALLy "Enviar email" envíaEMAIL, los dos valores del enum del back. - Validación en los dos lados. El formulario usa las validaciones HTML (
required,type="email",pattern) conreportValidity(), y el back repite las mismas reglas.
Limitaciones
- El filtro de eventos futuros se hace en el front, comparando con la hora del ordenador del usuario.
- El formulario no tiene protección contra spam (por ejemplo, reCAPTCHA).
- El botón de cada evento lleva a la página de Ofertas, no a una reserva concreta de ese evento.