Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Painel interno + mostruário da Inphantil. Monólito Next.js 16 (App Router) com duas áreas: • Pública (sem login): landing e mostruário (vitrine, sem venda). • Fechada (login obrigatório): ferramentas internas, catálogo, admin. Ciclo 1 (esta entrega): base + autenticação + upload de imagem + tema/ animações. As funcionalidades de negócio (protetor de parede, tapete, orçamentos, frete, calculadoras, catálogo, mostruário) estão como placeholders "Em breve", com a proteção de rota já correta.檢視完整 README ↗
Painel interno + mostruário da Inphantil. Monólito Next.js 16 (App Router) com duas áreas:
Ciclo 1 (esta entrega): base + autenticação + upload de imagem + tema/ animações. As funcionalidades de negócio (protetor de parede, tapete, orçamentos, frete, calculadoras, catálogo, mostruário) estão como placeholders "Em breve", com a proteção de rota já correta.
Next.js 16 · TypeScript (strict) · Tailwind CSS v4 · shadcn/ui (Radix) · Framer Motion · Prisma + PostgreSQL (Neon) · Auth.js (NextAuth v5, JWT) · React Hook Form + Zod · Cloudflare R2 (via API S3) · next-themes.
Poder: DEV > ADMIN > SELLER.
| Papel | Acesso |
|---|---|
| SELLER | Ferramentas internas (calculadoras, protetor, tapete, orçamentos, frete). |
| ADMIN | Tudo da área fechada, menos gerenciar usuários (+ catálogo). |
| DEV | Tudo, incluindo criar/editar/ativar/desativar usuários. |
A guarda requireRole() (src/lib/rbac.ts) roda no servidor (Server Actions,
Route Handlers e páginas). O middleware.ts separa rotas públicas das fechadas.
Nunca confie apenas no front.
# 1) Instalar dependências
npm install
# 2) Configurar ambiente
cp .env.example .env
# Preencha DATABASE_URL, NEXTAUTH_SECRET (npx auth secret),
# SEED_DEV_* e as credenciais do Cloudflare R2.
# 3) Criar as tabelas (a migration inicial já vem incluída em prisma/migrations)
npm run prisma:migrate # aplica a migration no banco (dev)
# (em produção/CI use: npx prisma migrate deploy)
# 4) Semear o DEV inicial (usa SEED_DEV_EMAIL / SEED_DEV_PASSWORD)
npm run db:seed
# 5) Subir em desenvolvimento
npm run dev # http://localhost:3000
Login inicial: o e-mail/senha definidos em SEED_DEV_EMAIL / SEED_DEV_PASSWORD.
Novos usuários são criados apenas pelo DEV em /admin/usuarios (não há
auto-cadastro).
| Script | O que faz |
|---|---|
npm run dev | Desenvolvimento |
npm run build / start | Build e produção |
npm run typecheck | tsc --noEmit |
npm run lint | ESLint |
npm run prisma:migrate | Migration de desenvolvimento |
npm run db:seed | Semeia o DEV inicial |
npm run prisma:studio | Prisma Studio |
Todo upload/substituição/exclusão passa pelo serviço central
src/lib/storage.ts (R2 via API S3), para nunca deixar arquivo órfão:
createUploadUrl), envia o arquivo direto ao R2 (PUT) e o servidor grava
apenas url + key. Ao persistir, o servidor faz um HEAD no objeto para
validar tamanho/tipo de forma autoritativa.key(s).key vai para a tabela
OrphanImage e a rotina /api/cron/cleanup-images (Vercel Cron diário,
protegida por CRON_SECRET) tenta de novo e varre o bucket removendo o
que não tem mais referência no banco.Cloudflare → R2 → Create bucket (ex.: inphantil).
R2 → Manage R2 API Tokens → Create API token com permissão Object Read &
Write no bucket. Anote Access Key ID, Secret Access Key e o
Account ID → vão no .env (R2_*).
Acesso público: no bucket, ative o subdomínio r2.dev (dá uma URL
https://pub-xxxx.r2.dev) ou conecte um domínio próprio. Essa base vai em
R2_PUBLIC_BASE_URL.
CORS do bucket (para o upload direto do navegador) — em Settings → CORS policy:
[
{
"AllowedOrigins": ["http://localhost:3000", "https://SEU-DOMINIO"],
"AllowedMethods": ["PUT", "GET"],
"AllowedHeaders": ["content-type"],
"MaxAgeSeconds": 3600
}
]
src/
app/
(public)/ # ABERTO: landing (/) e /mostruario
(auth)/login/ # login
(app)/ # FECHADO: shell com sidebar + topbar
dashboard/
calculadoras/ protetor-parede/ tapete/
orcamentos/ frete/ catalogo/ # placeholders
admin/usuarios/ # SÓ DEV — CRUD de usuários
api/auth/[...nextauth]/
api/cron/cleanup-images/
components/ (ui/ = shadcn, app-shell/, upload/, motion/, ...)
lib/ (auth, prisma, rbac, roles, storage, media-cleanup, nav, validators)
prisma/ (schema.prisma, seed.ts)
.env.example). Defina também NEXTAUTH_URL e CRON_SECRET.vercel.json já agenda a limpeza de imagens (cron diário às 04:00 UTC).npx prisma migrate deploy.next.config.ts libera o host público do R2 (**.r2.dev e/ou o domínio de
R2_PUBLIC_BASE_URL) para o next/image.http://localhost:3000 e o domínio de
produção na política de CORS do bucket R2.deepmerge-ts, dependência
transitiva de lint (dev-only), sem impacto em runtime.