Svelte Commerce
SvelteKit으로 만든 독립형 오픈소스 스토어프론트, 26개 상거래 백엔드와 헤드리스 연동, MIT 라이선스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Dashboard + mapa de calor da loja + coletor com leitura de código de barras pela câmera. Substitui a planilha Controle_Validade_v12.xlsx, que continua sendo entrada (importação) e saída (exportação).
Node 20 ou mais novo.
npm install
npm run import -- "../Controle_Validade_v12.xlsx" # carga inicial (já feita neste PC)
npm start # http://localhost:3000 (o coletor é a aba "Coletor")
npm test # 23 testes contra Postgres
O banco é PostgreSQL nos dois ambientes, com o mesmo SQL:
| Onde | Banco |
|---|---|
| Seu computador | PGlite (um Postgres que roda dentro do Node, guardado em data/pg; não precisa instalar nada) |
| Vercel | Neon, pela variável DATABASE_URL |
Localmente o login fica desligado (só o localhost acessa). Com npm run lan ou REQUIRE_LOGIN=1 ele passa a ser obrigatório.
validade-app:
git remote add origin https://github.com/SEU-USUARIO/validade-app.git
git push -u origin main
O .gitignore já deixa de fora node_modules, data/ e .env.DATABASE_URL; não precisa copiar a senha.SESSION_SECRET com um texto aleatório de 32+ caracteres:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
DATABASE_URL=... e salve num arquivo chamado .env.local dentro da pasta validade-app. O Git ignora esse arquivo e os scripts o leem sozinhos, então a string nunca vai para o chat nem para o repositório. Depois:
npm run import -- "../Controle_Validade_v12.xlsx" # sobe produtos e estoque
npm run usuario -- MICHEL 123456 admin # troque pelo PIN que quiser (6 a 8 números)
npm run usuario -- JOAO 654321 operador # um por pessoa da loja
Na Vercel o login é sempre obrigatório. Depois, novos usuários e PINs se gerenciam em Configurações → Equipe.
PIN com hash (scrypt) e bloqueio de 10 min após 5 erros · sessão em cookie HttpOnly/Secure/SameSite=Lax assinado · o nome do operador nos lançamentos vem da sessão, não do que o aparelho manda · cabeçalho obrigatório contra CSRF · Content-Security-Policy restritiva · câmera liberada só para o próprio site · operador não altera regras, planta, equipe nem importa dados.
GÔNDOLA-LADO-PRATELEIRA, por exemplo 1-B-3.
| Parte | Valores |
|---|---|
| Gôndola | 1 a 40 (hoje 1 a 19; sacaria e aquarismo entram depois) |
| Lado | A esquerda · B direita · F ponta da frente · C ponta das costas |
| Prateleira | 1 a 5. Ponta pode vir sem prateleira: 1-F, 1-C |
Endereços antigos fora disso (19, 4-E-1) continuam no estoque, aparecem em Qualidade dos dados e no mapa como “sem endereço válido”, e se corrigem na próxima ronda. Endereço novo fora do padrão é recusado.
| Prazo | Desconto |
|---|---|
| até 30 dias | 50% em tudo |
| até 90 dias | ração (seca e úmida) 20% · demais itens 30% |
| vencido | retirar da loja |
“Ração” vem da categoria do produto; sem categoria, do nome. Não existe mais a faixa de 10%. Perda potencial = valor × desconto (vencido = 100%).
/coletor só redireciona para ela; operadores já abrem nela) — Entrada (receber soma / contar define), Ronda por endereço, Baixa, Buscar. Atalhos de lado e prateleira por toque, câmera para o EAN e para a etiqueta do endereço, fila offline com reenvio sem duplicar, desfazer do último lançamento, aviso de FEFO.Usa o leitor nativo do Chrome (BarcodeDetector) e, onde ele não existe, o ZXing (public/vendor/zxing.min.js). Para EAN só aceita leitura com dígito verificador correto. Exige HTTPS (ou localhost).
produtos · lotes (EAN + lote + validade + endereço) · eventos (toda entrada, contagem, ajuste, baixa e transferência, com quem/quando/saldo) · usuarios · config.
npm run import.pg) foi testado por rede contra um servidor Postgres local; a conexão com o Neon de verdade só é exercitada no primeiro deploy.npm audit aponta 2 avisos moderados de uuid dentro do exceljs; o trecho afetado não é usado aqui.Cada filial é um projeto próprio na Vercel com o seu Neon (mesmo código, dados separados).
ADMIN_INICIAL com NOME:PIN (ex.: JOAO:123456, tipo Sensitive) e faça o redeploy. Ela cria o administrador no primeiro acesso, só se o banco não tiver nenhum usuário; depois pode ser apagada.DEMO=1 PGLITE_DIR=memory:// npm start mostra o sistema com produtos e lotes de exemplo, sem tocar no estoque real. Na Vercel, DEMO_INICIAL=1 carrega os dados de exemplo uma única vez (só em banco sem estoque); apague a variável depois e limpe os dados antes do uso real.Na Conferência de Recebimento ou de Contagem, o botão Carregar a lista aceita planilha (.xlsx), CSV, TXT ou o XML da NF-e. O app acha sozinho a linha do cabeçalho (EAN, código de barras, quantidade, lote, validade…); sem cabeçalho, entende EAN;quantidade em cada linha. Mostra o que entendeu e o que ficou de fora, e só então carrega as quantidades como "esperado": laranja até chegar, verde quando bate, vermelho quando passa. Bipar a chave da nota (44 números do DANFE) anota o número da NF.
Conferências, entrada e contagem funcionam sem rede. Antes de ficar offline, no Coletor ou em Conferências toque em Preparar para o modo avião: o aparelho guarda o catálogo de produtos (para mostrar o nome de cada EAN), a lista de endereços e os endereços da ronda de hoje. Sem internet, o que for lançado fica numa fila no aparelho e sobe sozinho quando a rede voltar (cada lançamento tem um identificador, então reenviar nunca soma duas vezes). Uma conferência criada e finalizada offline guarda o horário real de abertura e de fechamento. O app só precisa estar instalado e ter sido aberto uma vez com internet.
Precisa de internet: gerar a ronda do dia, carregar a lista da nota, imprimir ou exportar a conferência (isso acontece depois que ela sobe) e a auditoria.