UEA-PRODEM

This commit is contained in:
2026-06-10 12:09:52 -03:00
parent 17c278c624
commit a4002cb9c0
5 changed files with 298 additions and 73 deletions
+235
View File
@@ -0,0 +1,235 @@
# ============================================================================
# GUIA - Como Subir o ZIP em Desenvolvimento (Dev)
# ============================================================================
## 1. DESCOMPACTAR O ZIP
```bash
# No Mac/Linux:
cd ~/Documentos # ou onde voce guarda os projetos
unzip avanzato-site-v1.5.0-FINAL.zip -d avanzato-site
# No Windows (PowerShell):
Expand-Archive -Path "avanzato-site-v1.5.0-FINAL.zip" -DestinationPath "avanzato-site"
```
---
## 2. ENTRAR NA PASTA
```bash
cd avanzato-site
```
Estrutura que voce vera:
```
avanzato-site/
src/ ← Codigo fonte React
api/ ← Backend tRPC + Hono
db/ ← Schema do banco
dist/ ← Build pronto (frontend)
public/ ← Imagens, logos, favicon
package.json ← Dependencias
...
```
---
## 3. INSTALAR DEPENDENCIAS
```bash
npm install
```
Se der erro de esbuild:
```bash
npm config set allow-scripts true
npm rebuild esbuild --foreground-scripts
```
---
## 4. CONFIGURAR O BANCO DE DADOS (MySQL)
O projeto precisa de MySQL rodando. Voce tem 2 opcoes:
### OPCAO A - MySQL Local (se ja tem instalado)
```bash
# Verificar se MySQL esta rodando
mysql -u root -p
# Criar banco de dados
CREATE DATABASE avanzato CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
Editar o arquivo `.env`:
```bash
# Abrir .env e verificar DATABASE_URL
DATABASE_URL="mysql://root:SUA_SENHA@localhost:3306/avanzato"
```
### OPCAO B - Docker (mais facil)
```bash
# Rodar MySQL em Docker
docker run -d \
--name mysql-avanzato \
-e MYSQL_ROOT_PASSWORD=senha123 \
-e MYSQL_DATABASE=avanzato \
-p 3306:3306 \
mysql:8
# Esperar 30 segundos e verificar
docker logs mysql-avanzato
```
Editar `.env`:
```
DATABASE_URL="mysql://root:senha123@localhost:3306/avanzato"
```
### OPCAO C - Sem banco (frontend apenas)
Se quiser ver so o frontend, pule para o passo 6 e use:
```bash
npm run build
npx serve dist/
```
---
## 5. SINCRONIZAR O BANCO
```bash
npm run db:push
```
Isso cria todas as tabelas automaticamente.
Para popular com dados iniciais (formulario UEA):
```bash
npx tsx db/seed.ts
```
---
## 6. INICIAR O SERVIDOR
```bash
npm run dev
```
Acesse: **http://localhost:3000**
---
## 7. COMANDOS UTEIS
| Comando | O que faz |
|---------|-----------|
| `npm run dev` | Inicia servidor dev (porta 3000) |
| `npm run build` | Build para producao (gera dist/) |
| `npm run check` | Verifica erros de TypeScript |
| `npm run db:push` | Sincroniza schema com o banco |
| `npm start` | Inicia servidor de producao |
---
## 8. PROBLEMAS COMUNS
### "Cannot find module"
```bash
rm -rf node_modules package-lock.json
npm install
```
### "esbuild permission denied"
```bash
npm config set allow-scripts true
npm rebuild esbuild --foreground-scripts
```
### "Database connection refused"
```bash
# Verificar se MySQL esta rodando
mysql -u root -p -e "SHOW DATABASES;"
# Ou com Docker
docker ps | grep mysql
```
### Tela branca no navegador
```bash
# Verificar console do navegador (F12)
# Verificar se o backend esta rodando
curl http://localhost:3000/api/trpc/ping
```
### Porta 3000 ocupada
```bash
# Mac/Linux
lsof -ti:3000 | xargs kill -9
# Windows
netstat -ano | findstr :3000
taskkill /PID <NUMERO> /F
```
---
## 9. ESTRUTURA DAS ROTAS
```
http://localhost:3000/
/ ← Site principal (Home)
/sobre ← Sobre nos
/servicos/* ← 10 paginas de servicos
/tecnologias ← Tecnologias
/ferramentas ← 7 ferramentas gratuitas
/avaliacao ← Avaliador de TI
/cases ← Cases de sucesso
/blog ← Blog
/contato ← Contato
/area-do-cliente ← Painel admin
/formulario/:codigo ← Formulario publico
/uea-prodem-angola ← Ambiente UEA-PRODEM
/status ← Pagina de status/versao
```
---
## 10. PARA PRODUCAO
```bash
# 1. Build
npm run build
# 2. O conteudo fica em dist/
# 3. Copiar tudo de dist/ para o servidor
# 4. Configurar Nginx (ver nginx/avanzato.conf)
```
---
## RESUMO RAPIDO
```bash
# 1x - Setup inicial
cd avanzato-site
npm install
npm config set allow-scripts true
npm rebuild esbuild --foreground-scripts
# 1x - Banco (se usar MySQL)
npm run db:push
npx tsx db/seed.ts
# Sempre que quiser rodar
npm run dev
# Acesse: http://localhost:3000
```
---
Duvidas? Verifique o arquivo `.env` e confirme que DATABASE_URL esta correto.
-45
View File
@@ -1,45 +0,0 @@
# Release HML
Data: qua 10 jun 2026 11:39:21 -03
Ambiente:
HML
Descrição:
UEA-PRODEM
Branch:
develop
Arquivos alterados antes do commit:
D infra/releases/2026-06-08_23-50-57_HML.md
M src/App.tsx
M src/config/site.ts
M src/pages/Home.tsx
M src/sections/Navigation.tsx
?? infra/releases/2026-06-10_11-39-21_HML.md
?? public/uea-logo-1.jpg
?? public/uea-logo-2.jpg
?? src/pages/Status.tsx
?? src/pages/area-cliente/UeaProdem.tsx
Status:
Preparado para publicação
Commit:
d420d334
Arquivos no commit:
infra/releases/2026-06-08_23-50-57_HML.md
infra/releases/2026-06-10_11-39-21_HML.md
public/uea-logo-1.jpg
public/uea-logo-2.jpg
src/App.tsx
src/config/site.ts
src/pages/Home.tsx
src/pages/Status.tsx
src/pages/area-cliente/UeaProdem.tsx
src/sections/Navigation.tsx
Status final:
Publicado no Gitea / aguardando pipeline HML
+22
View File
@@ -0,0 +1,22 @@
# Release HML
Data: qua 10 jun 2026 12:09:52 -03
Ambiente:
HML
Descrição:
UEA-PRODEM
Branch:
develop
Arquivos alterados antes do commit:
D infra/releases/2026-06-10_11-39-21_HML.md
M src/App.tsx
M src/pages/Contato.tsx
?? GUIA-DEV.md
?? infra/releases/2026-06-10_12-09-52_HML.md
Status:
Preparado para publicação
+1
View File
@@ -220,6 +220,7 @@ function App() {
{/* UEA-PRODEM Ambiente Personalizado */} {/* UEA-PRODEM Ambiente Personalizado */}
<Route path="/uea-prodem-angola" element={<UeaProdem />} /> <Route path="/uea-prodem-angola" element={<UeaProdem />} />
<Route path="/uea-prodem" element={<UeaProdem />} />
{/* Contato */} {/* Contato */}
<Route path="/contato" element={<Contato />} /> <Route path="/contato" element={<Contato />} />
+39 -27
View File
@@ -93,42 +93,54 @@ const Contato = () => {
return () => ctx.revert(); return () => ctx.revert();
}, []); }, []);
const handleSubmit = (e: React.FormEvent) => { const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();
setIsSubmitting(true); setIsSubmitting(true);
// Enviar ao Mautic (Form ID 4) - sincrono via iframe // Enviar ao Formspree
const mauticSuccess = sendLeadToMautic('contato', { try {
nome: formData.nome, const response = await fetch('https://formspree.io/f/xwvjqyrr', {
email: formData.email, method: 'POST',
empresa: formData.empresa, headers: {
telefone: formData.telefone, 'Content-Type': 'application/json',
servico_interesse: formData.servico, 'Accept': 'application/json',
mensagem: formData.mensagem, },
origem_lead: 'contato_site', body: JSON.stringify({
}); nome: formData.nome,
email: formData.email,
empresa: formData.empresa,
telefone: formData.telefone,
servico: formData.servico,
mensagem: formData.mensagem,
}),
});
if (!mauticSuccess) { if (response.ok) {
setIsSubmitted(true);
setFormData({ nome: '', email: '', empresa: '', telefone: '', servico: '', mensagem: '' });
// Google Ads conversion tracking
trackConversion();
// Facebook Pixel - Lead
trackFacebookPixel('Lead', {
content_name: 'Formulario Contato',
content_category: 'lead_contato',
});
setTimeout(() => setIsSubmitted(false), 5000);
} else {
alert('Erro ao enviar. Tente novamente ou use o WhatsApp.');
}
} catch {
// Fallback: enviar via mailto se Formspree falhar
sendLeadViaMailto({ sendLeadViaMailto({
nome: formData.nome, nome: formData.nome,
email: formData.email, email: formData.email,
}); });
} finally {
setIsSubmitting(false);
} }
// Google Ads conversion tracking
trackConversion();
// Facebook Pixel - Lead
trackFacebookPixel('Lead', {
content_name: 'Formulario Contato',
content_category: 'lead_contato',
});
setIsSubmitting(false);
setIsSubmitted(true);
setFormData({ nome: '', email: '', empresa: '', telefone: '', servico: '', mensagem: '' });
setTimeout(() => setIsSubmitted(false), 5000);
}; };
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => { const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {