Files
App-Estoque-LiberiKids/INTEGRACAO-SITE-CATALOGO.md
2025-11-29 21:31:52 -03:00

483 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🌐 Integração Site / Catálogo com Sistema de Estoque
## 📋 Visão Geral
O site de catálogo (`/site/`) foi completamente integrado com o sistema de estoque, permitindo:
-**Sincronização automática** com produtos do painel admin
-**Controle de visibilidade** através do campo `visivel_catalogo`
-**Galeria de fotos** com bucket `catalogo` do Supabase
-**Configurações centralizadas** no painel admin
-**Upload de múltiplas fotos** por produto
## 🔧 Modificações Realizadas
### 1. Site (`/site/`)
#### `script.js` - Alterações Principais
**Adicionado carregamento de configurações:**
```javascript
let catalogoConfig = {
catalogoAtivo: false,
exibirPrecos: true,
exibirEstoque: false
};
async function carregarConfiguracoesCatalogo() {
// Busca configurações do painel admin
// Aplica classes CSS baseado nas configurações
}
```
**Filtro por visibilidade:**
```javascript
.eq('ativo', true)
.eq('visivel_catalogo', true) // ← NOVO
```
**Carregamento de fotos do bucket `catalogo`:**
```javascript
// Para cada produto, busca fotos adicionais
const { data: fotosAdicionais } = await supabaseClient
.storage
.from('catalogo')
.list(`produto_${produto.id}`);
```
**Galeria de fotos no modal:**
```javascript
// Construir galeria: foto principal + variações + bucket
const galeriaFotos = [
produto.foto_principal,
...fotosDasVariacoes,
...fotosAdicionais
].filter(Boolean);
```
#### `styles.css` - Novos Estilos
**Galeria de miniaturas:**
```css
.produto-modal-galeria {
display: flex;
gap: 8px;
overflow-x: auto;
}
.galeria-miniatura {
width: 60px;
height: 60px;
border: 2px solid transparent;
}
.galeria-miniatura.active {
border-color: var(--color-primary);
}
```
**Ocultar preços (configurável):**
```css
.hide-prices .produto-preco-minimal,
.hide-prices .produto-modal-preco {
display: none !important;
}
```
### 2. Painel Admin
#### `SiteCatalogo.js` - Novo Componente
**Gerenciamento de fotos adicionais:**
```jsx
// Modal para upload de fotos no bucket 'catalogo'
const handleUploadFoto = async (event) => {
const formData = new FormData();
formData.append('foto', file);
await fetch(`/api/produtos/${produto.id}/fotos-catalogo`, {
method: 'POST',
body: formData
});
};
```
**Listagem e exclusão:**
```jsx
// Listar fotos do bucket
await fetch(`/api/produtos/${produtoId}/fotos-catalogo`);
// Deletar foto específica
await fetch(`/api/produtos/${produto.id}/fotos-catalogo/${fileName}`, {
method: 'DELETE'
});
```
#### `site-catalogo.css` - Estilos do Modal
- Modal responsivo com overlay
- Grid de fotos com hover effects
- Botão de upload estilizado
- Animações suaves
### 3. Backend (`server-supabase.js`)
#### Novos Endpoints
**1. Listar fotos do produto**
```javascript
GET /api/produtos/:id/fotos-catalogo
Response: {
success: true,
fotos: [
{
name: "foto.jpg",
url: "https://...",
created_at: "...",
size: 12345
}
]
}
```
**2. Upload de foto adicional**
```javascript
POST /api/produtos/:id/fotos-catalogo
Content-Type: multipart/form-data
Body: {
foto: <file>
}
Response: {
success: true,
message: "Foto adicional enviada com sucesso!",
foto: {
path: "produto_123/foto.jpg",
url: "https://..."
}
}
```
**3. Deletar foto**
```javascript
DELETE /api/produtos/:id/fotos-catalogo/:fileName
Response: {
success: true,
message: "Foto removida com sucesso!"
}
```
## 📁 Estrutura do Bucket `catalogo`
```
catalogo/
├── produto_1/
│ ├── 1234567890-foto1.jpg
│ ├── 1234567891-foto2.jpg
│ └── 1234567892-foto3.jpg
├── produto_2/
│ ├── 1234567893-foto1.jpg
│ └── 1234567894-foto2.jpg
└── produto_3/
└── 1234567895-foto1.jpg
```
**Organização:**
- Pasta por produto: `produto_{id}`
- Nome único: `timestamp-nome_original.jpg`
- Acesso público para visualização
- Upload apenas autenticado
## 🎯 Fluxo de Uso
### Para o Administrador
1. **Gerenciar Visibilidade**
- Acesse **Site / Catalogo** no painel admin
- Clique em "Visível" / "Oculto" para cada produto
- Apenas produtos visíveis aparecem no site público
2. **Adicionar Fotos Extras**
- Clique no botão "Fotos" de um produto
- Clique em "Adicionar Nova Foto"
- Selecione a imagem (máx 5MB)
- Foto aparece automaticamente no catálogo
3. **Remover Fotos**
- Abra o gerenciador de fotos
- Passe o mouse sobre a foto
- Clique no botão "×" vermelho
4. **Configurar Catálogo**
- Defina URL do site
- Ative/Desative o catálogo
- Configure exibição de preços
- Configure exibição de estoque
### Para o Cliente (Site Público)
1. **Visualizar Produtos**
- Apenas produtos com `visivel_catalogo = true`
- Ordenados por data de cadastro (mais recentes primeiro)
2. **Ver Fotos**
- Foto principal aparece no card
- Clique para ver todas as fotos
- Galeria com miniaturas
- Clique para trocar foto principal
3. **Informações**
- Preços: conforme configuração admin
- Estoque: conforme configuração admin
- Variações: sempre visível
## 🔄 Sincronização
### Automática
- ✅ Produtos novos aparecem automaticamente (se `visivel_catalogo = true`)
- ✅ Alterações de preço refletem imediatamente
- ✅ Alterações de estoque em tempo real
- ✅ Fotos novas aparecem na galeria
### Manual
- ⚙️ Toggle de visibilidade no painel admin
- 📸 Upload de fotos adicionais
- 🗑️ Remoção de fotos
## 🎨 Galeria de Fotos - Ordem de Prioridade
1. **Foto Principal** (`foto_principal` da tabela `produtos`)
2. **Fotos das Variações** (array `fotos` em `produto_variacoes`)
3. **Fotos Adicionais** (bucket `catalogo`)
**Resultado:** Todas as fotos disponíveis em uma única galeria, sem duplicatas.
## 🔐 Segurança
### Bucket `catalogo`
**Políticas RLS:**
```sql
-- Leitura pública
CREATE POLICY "Permitir leitura pública"
ON storage.objects FOR SELECT
USING (bucket_id = 'catalogo');
-- Upload apenas autenticado
CREATE POLICY "Permitir upload autenticado"
ON storage.objects FOR INSERT
WITH CHECK (
bucket_id = 'catalogo' AND
auth.role() = 'authenticated'
);
-- Delete apenas autenticado
CREATE POLICY "Permitir delete autenticado"
ON storage.objects FOR DELETE
USING (
bucket_id = 'catalogo' AND
auth.role() = 'authenticated'
);
```
### Validações
- ✅ Apenas imagens (jpeg, png, gif, webp)
- ✅ Máximo 5MB por foto
- ✅ Validação de tipo MIME no backend
- ✅ Sanitização de nomes de arquivo
## 🚀 Deploy e Configuração
### 1. Criar Bucket no Supabase
```sql
-- Executar no SQL Editor
INSERT INTO storage.buckets (id, name, public)
VALUES ('catalogo', 'catalogo', true);
```
### 2. Configurar Políticas
Execute as políticas RLS acima no SQL Editor.
### 3. Testar Upload
```bash
# Via painel admin
1. Acesse Site / Catalogo
2. Clique em "Fotos" em qualquer produto
3. Faça upload de uma imagem de teste
4. Verifique no Supabase Storage se apareceu
```
### 4. Verificar Site Público
```bash
# Abra o site de catálogo
open http://localhost:5000/site/
# Verifique se:
# - Produtos aparecem corretamente
# - Fotos carregam
# - Galeria funciona
```
## 📊 Monitoramento
### Verificar Produtos Visíveis
```sql
SELECT
id,
nome,
visivel_catalogo,
ativo
FROM produtos
WHERE visivel_catalogo = true
ORDER BY created_at DESC;
```
### Verificar Fotos no Bucket
```sql
SELECT
name,
created_at,
metadata
FROM storage.objects
WHERE bucket_id = 'catalogo'
ORDER BY created_at DESC
LIMIT 20;
```
### Estatísticas
```sql
-- Produtos por status
SELECT
CASE
WHEN visivel_catalogo = true THEN 'Visível'
ELSE 'Oculto'
END as status,
COUNT(*) as total
FROM produtos
WHERE ativo = true
GROUP BY visivel_catalogo;
```
## 🐛 Troubleshooting
### Fotos não aparecem no site
**Verificar:**
1. Bucket `catalogo` existe e é público
2. Políticas RLS configuradas
3. Caminho correto: `produto_{id}/arquivo.jpg`
4. Console do navegador para erros
### Upload falha
**Possíveis causas:**
- Arquivo muito grande (> 5MB)
- Tipo não suportado
- Falta de autenticação
- Políticas RLS incorretas
**Solução:**
```javascript
// Verificar no console do navegador
console.log('Erro de upload:', error);
// Verificar no servidor
tail -f server.log | grep "upload"
```
### Produtos não aparecem
**Verificar:**
```sql
SELECT
nome,
ativo,
visivel_catalogo
FROM produtos
WHERE id = X;
```
Certifique-se que:
- `ativo = true`
- `visivel_catalogo = true`
## 📱 Responsividade
### Desktop (> 768px)
- Grid de produtos: 3-4 colunas
- Galeria: miniaturas horizontais
- Modal: 800px largura
### Mobile (< 768px)
- Grid de produtos: 1 coluna
- Galeria: scroll horizontal
- Modal: 95% altura da tela
## 🎯 Próximas Melhorias
### Curto Prazo
- [ ] Arrastar e soltar fotos para reordenar
- [ ] Crop de imagens no upload
- [ ] Comprimir imagens automaticamente
- [ ] Preview antes do upload
### Médio Prazo
- [ ] Editor de fotos integrado
- [ ] Marcas d'água automáticas
- [ ] Galeria em fullscreen
- [ ] Zoom nas fotos
### Longo Prazo
- [ ] CDN para fotos
- [ ] Lazy loading otimizado
- [ ] WebP conversion automática
- [ ] PWA com cache de imagens
## 📝 Checklist de Implementação
- [x] Script.js atualizado com filtro `visivel_catalogo`
- [x] Carregamento de fotos do bucket `catalogo`
- [x] Galeria de fotos no modal do site
- [x] Configurações integradas do admin
- [x] Componente SiteCatalogo com gerenciador
- [x] Endpoints de upload/delete de fotos
- [x] Estilos CSS para modal de fotos
- [x] Validações de upload
- [x] Tratamento de erros
- [x] Documentação completa
## ✅ Resumo
**Antes:**
- Site e admin separados
- Produtos fixos no código
- Sem sincronização
- Fotos limitadas
**Depois:**
- 🔄 Sincronização automática
- 👁️ Controle de visibilidade
- 📸 Galeria ilimitada de fotos
- ⚙️ Configurações centralizadas
- 🎨 Interface moderna
- 📱 Totalmente responsivo
---
**Data de Integração:** 24 de outubro de 2025
**Versão:** v1.1.0
**Desenvolvido para:** Liberi Kids - Moda Infantil 👶✨