尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Vagou — plataforma inteligente que ajuda motoristas a encontrar estacionamentos com vagas disponíveis perto do seu destino.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Abra a Vagou e descubra onde tem vaga para estacionar. A Vagou é uma plataforma de descoberta e visualização de vagas em estacionamentos de shoppings. O motorista escolhe o shopping (pelo nome, bairro ou localização) e vê quantas vagas ele tem, quantas estão livres agora e a planta do estacionamento, piso por piso e setor por setor. A Vagou não exibe preços. Shoppings digitalizam seus estacionamentos a partir da planta e conectam fontes de ocupação.查看完整 README ↗
Abra a Vagou e descubra onde tem vaga para estacionar.
A Vagou é uma plataforma de descoberta e visualização de vagas em estacionamentos de shoppings. O motorista escolhe o shopping (pelo nome, bairro ou localização) e vê quantas vagas ele tem, quantas estão livres agora e a planta do estacionamento, piso por piso e setor por setor. A Vagou não exibe preços. Shoppings digitalizam seus estacionamentos a partir da planta e conectam fontes de ocupação.
A Vagou não é um marketplace de reservas: não há reserva, checkout ou pagamento pela plataforma.
A definição de produto completa está em docs/PRODUCT.md (fonte da verdade).
Status: V1 — fluxos de motorista, empresa (incluindo Mapa Inteligente, operação e analytics) e admin implementados.
| Camada | Escolha |
|---|---|
| App | Next.js 16 (App Router, Server Components, Server Actions, proxy.ts), React 19, TypeScript |
| UI | Tailwind CSS v4 com tokens próprios, componentes em src/components/ui (padrão shadcn, sem dependência extra), Lucide |
| Mapas | Leaflet + react-leaflet com tiles OpenStreetMap (carregados sob demanda) |
| Gráficos | Recharts |
| Banco | PostgreSQL via Drizzle ORM. Local: PGlite (PostgreSQL embutido, zero instalação). Produção: qualquer PostgreSQL/Supabase via DATABASE_URL |
| Auth | Sessões próprias em cookie httpOnly (token com hash SHA-256 no banco), senhas com scrypt, RBAC no servidor |
| Validação | Zod (cliente e servidor), React Hook Form |
| Testes | Vitest (unitários + integração com banco em memória) |
src/
app/ Rotas (UI). Páginas finas que chamam serviços.
components/ Design system (ui/), layout, gráficos, marca
modules/ Domínios — regras de negócio e acesso a dados
auth/ sessão, RBAC, cadastro, recuperação de senha, privacidade (LGPD)
facilities/ consultas públicas, horários, tarifas, isolamento por empresa, favoritos
occupancy/ OccupancyProvider, simulação, eventos/snapshots, disponibilidade pública
floorplans/ layout padrão, ParkingPlanAnalyzer (mock), rota demonstrativa
search/ parâmetros e componentes da busca (lista + mapa sincronizados)
geo/ distâncias, geocodificação local (gazetteer de SP)
storage/ armazenamento de arquivos com validação por assinatura
server/ db (schema, cliente), logger estruturado, erros, auditoria
scripts/ migrate, seed, gerador da planta de exemplo
drizzle/ migrations SQL
tests/ unit/ e integration/
Camadas: UI → serviços do módulo → regras puras (sem I/O, testadas) → acesso a dados (Drizzle) → banco/serviços externos. Toda autorização sensível é validada no servidor (layouts, server actions e route handlers).
Organization → Facility → Floor → Sector → ParkingSpace, mais FloorPlan, FloorPlanElement,
OccupancyEvent, OccupancySnapshot, ParkingRate, OperatingHours, FacilityEntrance, DataSource,
e de apoio User, Profile, OrganizationMember, Favorite, AuditLog, Notification.
Ver src/server/db/schema.ts (FKs, índices, enums, constraints, timestamps).
OccupancyProvider desacopla a origem dos dados da visualização:
SimulationOccupancyProvider — simulada; usada quando não há fonte real. Sempre sinalizada como “simulado” (também na interface pública).ManualOccupancyProvider — funcional; operador altera o status das vagas.Mudanças de status geram OccupancyEvent; contagens periódicas viram OccupancySnapshot.
Dados antigos (>15 min; >3 h para contagem manual) aparecem como “Sem dados de ocupação”, nunca como atuais.
Pré-requisitos: Node.js 20+ (testado com 24) e npm.
git clone <url-do-repositorio> vagou && cd vagou
npm install
cp .env.example .env.local
npm run db:seed # aplica migrations e cria dados de demonstração
npm run dev # http://localhost:3000
Sem DATABASE_URL, o banco é um PostgreSQL embutido (PGlite) salvo em .data/pglite.
Ele aceita um processo por vez: pare o npm run dev antes de rodar db:seed/db:migrate
(há uma trava que avisa se outro processo estiver usando o banco).
DATABASE_URL=postgres://usuario:senha@host:5432/vagou npm run db:migrate
DATABASE_URL=... npm run db:seed # opcional: dados de demonstração
| Comando | O que faz |
|---|---|
npm run dev | servidor de desenvolvimento |
npm run build / npm start | build e execução de produção |
npm run lint | ESLint |
npm run typecheck | TypeScript (tsc --noEmit) |
npm test | testes (Vitest) |
npm run db:generate | gera migration a partir do schema |
npm run db:migrate | aplica migrations |
npm run db:seed | migrations + dados de demonstração (apaga dados existentes) |
npm run db:reset | apaga o banco embutido e recria com seed |
Ver .env.example. Principais: NEXT_PUBLIC_APP_URL, APP_SECRET, DATABASE_URL,
UPLOADS_DIR, PLAN_ANALYZER, NEXT_PUBLIC_DEMO_MODE. Nenhum segredo é exposto ao frontend.
Criadas pelo seed, senha Vagou@2026 (configurável via DEMO_PASSWORD):
| Perfil | |
|---|---|
| Motorista | [email protected] |
| Empresa (Aurora Shoppings) | [email protected] |
| Empresa (EstaPark) | [email protected] |
| Admin Vagou | [email protected] |
Com NEXT_PUBLIC_DEMO_MODE=true (e fora de produção) a tela de login mostra atalhos para essas contas.
O seed se recusa a rodar com NODE_ENV=production (a menos que ALLOW_DEMO_SEED=true).
Nunca use essas credenciais em produção.
A Vagou roda em hospedagem serverless. Requisitos de produção:
DATABASE_URL automaticamente; Supabase também funciona — POSTGRES_URL é aceito). Conexões via pooler funcionam (prepare: false).engines).stored_files) quando há banco configurado — não há dependência de disco. STORAGE_DRIVER=local|database força um driver.O build da Vercel executa automaticamente npm run vercel-build:
tsx scripts/migrate.ts && tsx scripts/seed.ts --if-empty --demo && next build
DATABASE_URL não existir);A única variável obrigatória é DATABASE_URL (criada pela integração Neon). As demais são opcionais:
| Variável | Valor |
|---|---|
DEMO_PASSWORD | senha das contas demo (mín. 10 caracteres, diferente da senha de desenvolvimento). Sem ela as contas demo são criadas bloqueadas; ao definir e fazer novo deploy, elas são liberadas (e a senha é sincronizada a cada deploy) |
NEXT_PUBLIC_APP_URL | URL pública customizada; se ausente, usa o domínio de produção da Vercel |
NEXT_PUBLIC_DEMO_MODE | deixe ausente ou false em produção |
Para não carregar dados de demonstração num ambiente real, remova --demo do script vercel-build.
| Perfil | Fluxo |
|---|---|
| Motorista | Home → buscar destino (ou "perto de mim") → mapa + lista de estacionamentos → Ver estacionamento → vagas por piso / mapa do piso → Ir até lá · favoritos e perfil em /app |
| Shopping | Login → /company (dashboard) → shopping → Pisos e mapas → importar planta → análise → corrigir no editor → publicar → Operação (mapa ao vivo) → Analytics |
| Admin | Login → /admin → usuários → empresas → estacionamentos → fontes de dados → atividade |
/, /buscar, /estacionamentos/[slug], /estacionamentos/[slug]/pisos/[floorId], /empresas, /entrar, /cadastro, /recuperar-senha/app (favoritos), /app/perfil/company, /company/estacionamentos/novo, /company/estacionamentos/[id] (visão geral, operacao, pisos, pisos/[floorId] = Mapa Inteligente, analytics, cadastro, entradas, dados)/admin, /admin/usuarios, /admin/empresas, /admin/estacionamentos, /admin/fontes, /admin/atividadeFuncional
/public, autorização por organização; plantas só ficam públicas quando publicadas)Simulado (sempre identificado na interface)
SimulationOccupancyProvider (selo "simulado" no público e "Modo demonstração" nos painéis)MockParkingPlanAnalyzer, "análise simulada")Preparado para integração
OccupancyProvider; exibidos como "integração sob demanda")AIParkingPlanAnalyzer via ParkingPlanAnalyzer (PLAN_ANALYZER)setErrorReporter), storage em nuvem (FileStorage)A tabela parking_rates permanece no schema (sem uso desde que a Vagou deixou de exibir preços); pode ser removida numa migration futura.
O banco embutido (PGlite) atende um processo por vez; em produção é obrigatório um PostgreSQL.
Arquivos no PostgreSQL atendem a escala da V1; para grande volume, implemente um driver de object storage (interface FileStorage).
Em desenvolvimento o reactStrictMode está desligado porque o react-leaflet v5 não suporta a dupla execução de efeitos do modo estrito.
npm test
Cobrem: semântica de disponibilidade pública (simulado, desatualizado, lotado), simulação, analytics, horários, tarifas, isolamento entre organizações, autorização do admin, contas suspensas, login sem enumeração de e-mails, o pipeline de ocupação (com PostgreSQL em memória) e um guarda contra colunas não qualificadas em subconsultas SQL.