← Voltar aos projetos Aplicação web · Automóvel

V. Parrot Garage

Um catálogo de veículos com filtros avançados, detalhes do veículo e gestão de imagens.

V. Parrot Garage
PROJETO

O projeto

V. Parrot demonstra uma arquitetura Symfony mais orientada para a aplicação, com catálogo de veículos, filtros avançados, dados estruturados e gestão de imagens.

Arquitetura de Sistema & Plataforma Empresarial

Plataforma web automóvel completa desenvolvida com Symfony 6, Doctrine ORM e EasyAdmin 4. Integra um portal público focado na conversão, um motor de busca de viaturas usadas em AJAX, gestão por perfis de acesso (RBAC) e APIs REST consumidas por aplicações móveis.

┌─────────────────────────────────────────────────────────────────────────────┐
│               Garage Vincent Parrot — Architecture Dual-Tier                │
└──────────────────────────────────────┬──────────────────────────────────────┘
                                       │
           ┌───────────────────────────┼───────────────────────────┐
           ▼                           ▼                           ▼
  🚗 Moteur Véhicules & AJAX     👥 Back-Office RBAC          📡 API REST Headless
  • noUiSlider (Prix, Km, Année) • EasyAdmin 4 Dashboard      • Serializer JMS Groups
  • Dropdowns dépendants BDD    • Isolation ROLE_ADMIN/EMP   • Endpoints paginés (/api)
  • Rendu partiel JSON/Twig     • Modération avis clients    • Support Mobile & Cross-App
  • VichUploader multi-photos   • Gestion horaires & services • Sécurité CORS & CSRF
            

Motor de Busca AJAX

Pesquisa dinâmica multicritério de viaturas com noUiSlider sem necessidade de recarregar a página.

Controlo de Acessos por Perfis (RBAC)

Separação estrita de privilégios entre o proprietário da oficina e os colaboradores.

API REST Desacoplada

Endpoints JSON seguros que alimentam a aplicação móvel em Flutter e integrações externas.

1. Funcionalidades do Portal Público

Concebido para apresentar as competências da oficina e converter visitantes em contactos comerciais qualificados:

CMS de Serviços de Oficina

Apresentação detalhada de reparações (mecânica, chapa e pintura, manutenção periódica, ar condicionado) com gestão de imagens via VichUploader.

Catálogo de Viaturas Usadas

Fichas detalhadas (/occasions/vehicule/{id}) com carrossel de fotografias, especificações completas e formulário de contacto associado à viatura.

Avaliações de Clientes & Moderação

Sistema de classificação de 5 estrelas com proteção antispam e validação prévia pela equipa antes da publicação.

Horários de Funcionamento Dinâmicos

Extensão personalizada do Twig (HoraireExtension) que injeta automaticamente os horários atualizados no rodapé global.

2. Motor de Filtragem Multicritério em AJAX

A pesquisa avançada articula SearchData, SearchForm, VehiculeRepository::findSearch() e um controlador JavaScript assíncrono:

Critério de Pesquisa Componente de Interface Consulta Doctrine DQL
Intervalo de Preços Dual-handle noUiSlider p.prix >= :prixmin AND p.prix <= :prixmax
Quilometragem Dual-handle noUiSlider p.kilometrage >= :kmmin AND p.kilometrage <= :kmmax
Ano de Matrícula Dual-handle noUiSlider (1970 - 2026) p.annee >= :anneemin AND p.annee <= :anneemax
Marca & Modelo Menus suspensos dependentes dinâmicos (/modeles/fetch) m.id IN (:marque) AND d.id IN (:modele)
Carroçaria, Combustível & Categoria Checkboxes (Carrosserie, Énergie) t.id IN (:type), a.id IN (:carburant)
// Rendu partiel asynchrone JSON dans OccasionsController.php
if ($request->get('ajax')) {
    return new JsonResponse([
        'content'    => $this->renderView('occasions/_occasions.html.twig', ['occasions' => $occasions]),
        'sorting'    => $this->renderView('occasions/_sorting.html.twig', ['occasions' => $occasions]),
        'pagination' => $this->renderView('occasions/_pagination.html.twig', ['occasions' => $occasions]),
        'prixmin'    => $prixmin, 'prixmax' => $prixmax,
        'kmmin'      => $kmmin,   'kmmax'   => $kmmax,
        'anneemin'   => $anneemin,'anneemax'=> $anneemax
    ]);
}
            

3. Controlo de Acessos Baseado em Perfis (RBAC)

Gestão de permissões e secções administrativas através do EasyAdmin e firewalls do Symfony Security:

ROLE_ADMIN Administrador (Vincent Parrot)

  • Gestão de contas de funcionários (criação, redefinição de palavras-passe com políticas de complexidade rigorosas).
  • Controlo total do CMS para serviços de oficina, textos e recursos visuais.
  • Configuração dos horários de funcionamento semanais e marcação de períodos de encerramento.
  • Consulta e tratamento das mensagens de contacto recebidas.

ROLE_EMPLOYE Colaboradores da Oficina

  • Gestão do catálogo de viaturas usadas (publicação, carregamento de várias fotos, seleção de equipamento).
  • Atribuição automática do colaborador com sessão iniciada como autor do anúncio ao guardar na base de dados.
  • Moderação de testemunhos (aprovação de avaliações autênticas ou rejeição de spam).
  • Impossibilidade de elevar privilégios para a função de Administrador.

4. Endpoints da API REST Headless

Endpoints JSON seguros para a aplicação móvel e ferramentas externas:

Method Endpoint URL Finalidade Estrutura da Resposta JSON
GET /api/vehicules Obtenção do inventário completo de viaturas disponíveis JSON Array (JMS getVehicules group)
GET /api/vehiculesby?page={n} Coleção paginada de viaturas para carregamento progressivo { data: [...], pagination: { ... } }
GET /api/vehicules/{id} Especificações e galeria de fotos de uma viatura por ID JSON Object (Véhicule, Galerie, Options)
GET /api/marques-modeles Estrutura hierárquica de marcas e modelos disponíveis [{ id, nom, modeles: [{ id, nom }] }]
POST /api/contact Envio de pedidos de contacto com notificação automática por e-mail { status: "success" } (HTTP 201)

5. Modelo de Dados & Relações Doctrine

Esquema relacional normalizado com integridade referencial em MySQL:

Entidade Viatura & Media

Relação OneToMany em cascata com VehiculeImage para suporte multifoto e ManyToMany com Employes.

Taxonomia Automóvel

Entidades normalizadas para Marque, Modele, Carburant (Gasolina, Gasóleo, Híbrido, Elétrico), Categorie e Type.

Operações & Contactos

Entidades para Service, Horaire, Temoignage (com estado de validação) e Contact.

6. Estratégia SEO & Desempenho

SEO Local & Marcação Semântica

Marcação Schema.org para AutoRepair e Product/Car, densidade de palavras-chave direcionada à área de Toulouse e URLs canónicos limpos.

Desempenho & Renderização Parcial

Renderização parcial em AJAX para minimizar o tráfego de dados na filtragem, entrega otimizada de imagens e proteção CSRF.

Visitar a Plataforma em Direto

Consulte o catálogo de viaturas usadas e teste os filtros de pesquisa em tempo real.

Visitar o Website da Oficina ↗