Svelte Commerce
A standalone open-source storefront built with SvelteKit, headless across 26 commerce backends. MIT licensed.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Plataforma SaaS B2B de pedidos à mesa para restaurantes em Portugal, com integração ao POS (ZoneSoft ZS Rest, via adaptador abstrato) e modelo de comissão de 1% sobre o valor faturado.
Estado: Fase 3 em curso — o cliente lê o QR/NFC, escolhe na ementa e envia o pedido; o pedido fica gravado em Postgres e uma fila entrega-o ao POS (MockPOS), com reenvios e rate limit.
Requisitos: Node.js ≥ 20.9. Não é preciso instalar Postgres: sem DATABASE_URL, a app usa PGlite em .data/pglite (apague a pasta para recomeçar).
npm install
npm run check # typecheck + testes + build de produção
npm run dev # http://localhost:3000
npm run demo:urls # URLs das 10 mesas de demonstração
Abra http://localhost:3000 (página comercial da MESVIO) ou http://localhost:3000/demo para escolher uma mesa de demonstração, ou vá diretamente a um URL de mesa (ex.: /m/jG6WQHgwr4fQ5qQEOKtZJw).
/central: todos os restaurantes, pedidos e comissões do mês (estimativa sobre o valor sem IVA dos pedidos confirmados), alertas (pedidos que não chegaram ao POS, POS com falhas ou por configurar, restaurantes sem dono ou sem mesas) e Novo restaurante (empresa, espaço, POS, comissão, mesas e espreguiçadeiras com QR Code, e convite ao dono). Cada restaurante tem a sua ficha, com mais lugares, outros donos e a folha de QR Codes para imprimir.
platform_admins), com 2FA obrigatório (TOTP: Google Authenticator, 1Password…), configurado com um código de ativação de uso único dado pelo script (fora do email). Segredos cifrados com PLATFORM_SECRET_KEY; cada código só serve uma vez; 5 tentativas a cada 5 min; sessão verificada de 8 h. Quem não é administrador vê "não encontrado".npm run admin:criar, admin:repor-2fa, admin:remover (ver docs/14-PUBLICAR.md). Em desenvolvimento entra-se como "Paula (plataforma, demo)".O cliente vê a ementa, o pedido e a conta em português ou inglês: telemóveis em português abrem em português, todos os outros em inglês, e há um seletor na ementa (a escolha fica num cookie). Botões, avisos, alergénios e etiquetas estão em src/lib/i18n/; pratos e categorias vêm da tabela menu_translations (por restaurante, com RLS). A demo tem inglês completo. O POS e o painel continuam em português.
Passo a passo (domínio, Supabase, GitHub, Vercel) em docs/14-PUBLICAR.md.
Identidade, cores, logótipos e regras de uso em docs/13-MARCA.md. Os nomes internos (pasta restaurante-saas, tabelas, chaves de armazenamento mesa-digital:*) mantêm-se para não quebrar dados existentes.
/painel (ou o link em /demo). Com a Supabase configurada, entra-se com um código de 6 dígitos enviado por email (só pessoas convidadas). Sem Supabase (desenvolvimento), escolhe-se um utilizador de demonstração: Ana (dona), Bruno (gerente) ou Carla (staff).
menu_images, RLS) e servida com cache permanente em /api/imagens/<id>. Tem prioridade sobre a foto do POS./painel/qr): imprimir e gerar um QR novo se um for fotografado e usado de fora (o antigo deixa logo de funcionar).Cada lugar tem um modo: as mesas pagam a conta no fim; as espreguiçadeiras (zona "Praia" na demo) pagam cada pedido ao pedir. O botão do carrinho passa a "Pagar e pedir"; o pedido fica "por pagar" e só segue para a cozinha quando o pagamento é confirmado. Sem pagamento em 15 min, é cancelado. No painel, as mesas aparecem agrupadas por zona e os pedidos por pagar num grupo à parte.
/m/[token]/conta (botão "Conta da mesa" no topo da ementa): todos os pedidos da mesa desde que abriu, de todos os telemóveis, com o total. Com pagamentos ligados no painel (separador Mesas), o cliente paga o que falta com Apple Pay, MB WAY ou cartão; a mesa aparece "Paga" no painel. Sem chaves Stripe (desenvolvimento), o pagamento é simulado.
npm run dev -- -H 0.0.0.0 (telemóvel e computador na mesma rede Wi-Fi).http://<IP-do-computador>:3000/qr — os QR Codes passam a apontar para esse endereço.Para NFC: grave o URL da mesa (mostrado por baixo de cada QR) numa etiqueta NTAG213/215 como registo URI (ex.: app NFC Tools).
/m/[token] (ementa + carrinho guardado no telemóvel) → POST /api/orders (cabeçalho Idempotency-Key; rate limit; o servidor recalcula preços e grava pedido + tarefa na mesma transação) → fila outbox (envio ao POS, até 8 tentativas em ~3 min) → /m/[token]/pedido/[id] (estado; "Confirmado" só com aceitação do POS).
docs/ PRD, arquitetura, BD, integração POS, riscos, plano, decisões, deployment
src/app/ Next.js App Router
page.tsx Índice de demonstração (10 mesas)
m/[token]/ Ementa do cliente + carrinho (token seguro da mesa)
m/[token]/pedido/[id]/ Estado do pedido
api/orders/ Criar pedido (POST) e consultar estado (GET)
api/cron/outbox/ Processar a fila a partir de um cron (alojamento serverless)
qr/ Folha imprimível de QR Codes / URLs NFC
painel/ Painel do staff (entrada por email/código) + api/painel/*
api/health/ Health check
src/components/menu/ Componentes da ementa
src/components/order/ Carrinho, detalhe de produto, estado do pedido
src/components/staff/ Painel do staff
src/lib/ Utilitários (dinheiro, IVA, preço de variantes/extras)
src/server/ Domínio (só servidor)
db/ Schema Drizzle (multi-tenant) e cliente
pos/ PosAdapter, MockPOS, esqueleto ZoneSoft
menu/ Serviço de ementa por mesa
orders/ Criação de pedidos, idempotência, fila de envio ao POS (outbox)
security/ Rate limit e pseudonimização de IP
auth/ Supabase Auth, modo dev, convites
staff/ Contexto e permissões do painel, ações do staff, equipa
db/tenant.ts withTenant: cada pedido corre com RLS no restaurante certo
catalog/ Esgotados do painel aplicados ao catálogo do POS
tables/ Tokens de mesa
commissions/ Motor de comissões
scripts/ Utilitários de desenvolvimento