Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
FieldService — aplicação real (Next.js + Supabase) Esqueleto funcional multi-empresa (SaaS), com autenticação real e permissões aplicadas na base de dados, não só na interface. O que já está feito e a funcionar檢視完整 README ↗
Esqueleto funcional multi-empresa (SaaS), com autenticação real e permissões aplicadas na base de dados, não só na interface.
requireRole() nos
layouts + RLS): SUPER_ADMIN, ADMIN, TECHNICIAN, FINANCE./super-admin): criar empresas novas e o primeiro Admin
de cada uma./admin/*): dashboard com números reais, e módulo de
Clientes completo (listar, criar, ver detalhe com histórico) — este é
o padrão de referência para os restantes módulos./tecnico/*): agenda com os serviços atribuídos, iniciar
serviço, e terminar com "Concluído" / "Precisa de nova visita" / "Não foi
possível realizar" — tudo através de funções seguras (RPC) que nunca dão
ao técnico acesso de escrita direto às tabelas administrativas.supabase/schema.sql: esquema completo (todas as tabelas do briefing:
clientes, pedidos, orçamentos, serviços, visitas, materiais, compras,
faturação) com RLS multi-tenant e a view segura para técnicos.Pedidos, Agenda (vista de calendário), Serviços (detalhe admin com
agendamento e faturação), Orçamentos (com itens e cálculo de IVA),
Materiais, Compras, Faturação, Relatórios, Utilizadores, Configurações —
todos seguem exactamente o padrão do módulo Clientes: uma page.tsx como
Server Component a fazer supabase.from(...).select(...), e um
actions.ts com Server Actions para escrita. Como o schema e a RLS já
existem para todas estas tabelas, portar cada módulo é sobretudo repetir
este padrão.
supabase/schema.sql para lá e corre (Run).Authentication → Users → Add user — cria o teu login (email + password).
Copia o User UID que aparece.
Volta ao SQL Editor e corre (substitui os valores):
insert into profiles (id, organization_id, role, nome, email)
values ('COLA-AQUI-O-UUID', null, 'SUPER_ADMIN', 'O Teu Nome', '[email protected]');
.env.local.example para .env.local.Project URL → NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (esta é secreta —
nunca a exponhas no código do browser nem a partilhes)npm install
npm run dev
Abre http://localhost:3000 → entra com o teu login de Super Admin →
/super-admin → cria a primeira empresa → cria o Admin dessa empresa →
sai (Sair) → entra com esse login de Admin para testares o fluxo normal.
.env.local nas
definições do projeto Vercel (Settings → Environment Variables).middleware.ts): corre no servidor antes de qualquer
página, mas só verifica se existe sessão (cookie) — redireciona para
/login quem não tem sessão nenhuma. A validação real da role de cada
utilizador é feita por requireRole() (lib/auth.ts), chamada nos
layout.tsx de /admin, /tecnico, /super-admin e /financeiro, que
correm em Node.js normal e confirmam a role em profiles antes de
deixar passar.schema.sql): mesmo que o middleware falhasse, a
própria base de dados recusa devolver ou aceitar dados fora do que cada
papel pode ver. É a barreira que conta a sério.services_technician_view e afins): o técnico
nunca lê a tabela services diretamente — só uma vista com as colunas
necessárias para o trabalho no terreno (sem valor, sem faturação, sem
margens).tech_start_service,
tech_finish_visit): o técnico não tem UPDATE na tabela services —
só estas duas funções, muito específicas, com as suas próprias validações,
conseguem mudar o estado de um serviço, e só do serviço que lhe está
atribuído.