O Sistema de Gerenciamento de Crises é uma plataforma completa para conectar pessoas em situação de risco durante enchentes e futuramente outras crises com voluntários e abrigos. O sistema permite o gerenciamento eficiente de:
- Resgates de emergência
- Abrigos e locais disponíveis
- Doações de alimentos e mantimentos
- Voluntários dispostos a ajudar
- Visualização em tempo real através de mapas
O sistema possui 3 tipos de acesso distintos: Voluntário, Abrigo e Usuário Final.
Mas vocês devem estar se perguntando oque me motivou, como cheguei a essas conclusões e necessidades.
Eu apenas olhei para fora de casa em um dia de chuva, rua alagada com uma chuva leve e quase sem força, no meio disso me peguei pensando e se acontecesse uma chuva igual a do "Rio Grande do Sul, como poderiamos agir, resolver os problemas e ajudar as pessoas?" nesse pensamento percebi que não existe um app ou site que mostra os abrigos ou voluntários em tempo real, então decidi criar um onde será necessário ter um cadastro bem rápido ( pois estaremos em alerta ou ja no meio da confusão ), onde você vai poder ver locais lotados, meia lotação ou livres para acomodações e voluntários, lugares para doações, tanto recepção de alimentos, quanto a própria doação para quem necessita, logo abaixo neste mesmo README tem toda a descrição do que esse app fará, viabilizará e principalmente MOBILIZARÁ AS PESSOAS, em breve teremos meios de comunicação dentro do próprio app/site que permitira mais dinamismo e urgência nos atendimentos e deslocamentos principalmente, um pouco mais para o final também consta as melhorias futuras pensando não somente nas enchentes, mas em um todo, espero que gostem e obrigado pela preferência e não se preocupem, todos seus dados estão seguros e bem guardados!!!
Facilitar a comunicação e coordenação durante enchentes, conectando:
- Pessoas que precisam de ajuda
- Voluntários dispostos a resgatar, abrigar ou doar
- Abrigos e instituições com disponibilidade de espaço e recursos
- Node.js - Ambiente de execução JavaScript
- Express - Framework web para Node.js
- SQLite3 - Banco de dados relacional leve
- CORS - Habilitação de requisições cross-origin
- Postman - Testes de API
- React - Biblioteca JavaScript para interfaces
- useState - Gerenciamento de estado
- useEffect - Efeitos colaterais e ciclo de vida
- Google Maps API - Visualização de mapas e localização
O sistema integra a Google Maps API para funcionalidades avançadas de localização:
- Geocoding: Conversão de endereços em coordenadas GPS
- Reverse Geocoding: Conversão de coordenadas em endereços
- Places API: Busca de lugares próximos (abrigos, pontos de ajuda)
- Maps Tiles: Servidor proxy para tiles do OpenStreetMap
Configuração:
- Obtenha uma chave da API no Google Cloud Console
- Ative os seguintes serviços:
- Geocoding API
- Places API
- Maps JavaScript API (para frontend)
- Configure a chave no arquivo
backend/.env:GOOGLE_MAPS_API_KEY=sua_chave_aqui
Nota: A chave da API não deve ser commitada no Git. Use o arquivo .env (já incluído no .gitignore).
- CRUD (Create, Read, Update, Delete)
- Consumo de API REST
- Autenticação e controle de acesso
- Verbos HTTP (GET, POST, PUT, DELETE)
- WebSockets (Socket.IO para localização em tempo real)
- Integração com APIs externas (Google Maps)
cd backend
npm installcd frontend
npm installcd backend
npm run devServidor disponível em: http://localhost:3000
cd frontend
npm startAplicação disponível em: http://localhost:3001
- inicio-rapido.md - Guia rápido para começar a usar o sistema
- readme-instalacao.md - Instalação detalhada e configuração
- readme-localizacao-tempo-real.md - Documentação da API de localização em tempo real
- postman-examples.md - Exemplos de requisições no Postman
- FRONTEND_SOCKET_EXAMPLE.js - Exemplo de implementação frontend com Socket.IO
O banco de dados SQLite é criado automaticamente ao iniciar o projeto.
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PRIMARY KEY) |
| tipo_usuario | TEXT | 'voluntario', 'abrigo' ou 'usuario_final' |
| nome | TEXT | Nome completo |
| TEXT | E-mail (UNIQUE) | |
| senha | TEXT | Senha criptografada |
| telefone | TEXT | Telefone para contato |
| endereco | TEXT | Endereço completo |
| latitude | REAL | Latitude da localização |
| longitude | REAL | Longitude da localização |
| data_criacao | TEXT | Data de criação da conta |
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PRIMARY KEY) |
| usuario_id | INTEGER | Referência ao usuário (FOREIGN KEY) |
| tipo_voluntario | TEXT | 'resgate', 'ceder_espaco' ou 'doacao' |
| disponibilidade | TEXT | Status de disponibilidade |
Campos específicos para Resgate:
| Campo | Tipo | Descrição |
|---|---|---|
| tipo_transporte | TEXT | 'carro', 'barco', 'jetski' ou 'a_pe' |
| capacidade_pessoas | INTEGER | Quantas pessoas cabem no transporte |
Campos específicos para Ceder Espaço:
| Campo | Tipo | Descrição |
|---|---|---|
| tipo_espaco | TEXT | 'quarto' ou 'quintal' |
| quantidade_quartos | INTEGER | Número de quartos disponíveis |
| tamanho_quintal | TEXT | Tamanho do quintal (em m²) |
| capacidade_total | INTEGER | Total de pessoas que pode abrigar |
| ocupacao_atual | INTEGER | Pessoas atualmente abrigadas |
| status_lotacao | TEXT | 'verde', 'azul', 'amarelo' ou 'vermelho' |
Campos específicos para Doação:
| Campo | Tipo | Descrição |
|---|---|---|
| itens_disponiveis | TEXT | Descrição dos itens disponíveis |
| quantidade | TEXT | Quantidade de cada item |
| validade | TEXT | Data de validade dos alimentos |
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PRIMARY KEY) |
| usuario_id | INTEGER | Referência ao usuário (FOREIGN KEY) |
| nome_organizacao | TEXT | Nome da organização/instituição |
| recursos_disponiveis | TEXT | Lista de recursos (comida, camas, roupas, etc) |
| capacidade_total | INTEGER | Limite de pessoas comportadas |
| ocupacao_atual | INTEGER | Número de pessoas atualmente no abrigo |
| status_lotacao | TEXT | 'verde', 'azul', 'amarelo' ou 'vermelho' |
| endereco_completo | TEXT | Endereço completo do abrigo |
| latitude | REAL | Latitude para mapa |
| longitude | REAL | Longitude para mapa |
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PRIMARY KEY) |
| usuario_id | INTEGER | ID do usuário que fez a solicitação |
| tipo_solicitacao | TEXT | 'resgate', 'abrigo' ou 'doacao' |
| descricao | TEXT | Descrição da necessidade |
| prioridade | TEXT | 'Baixa', 'Média', 'Alta' ou 'Urgente' |
| status | TEXT | 'Pendente', 'Em andamento' ou 'Concluída' |
| latitude | REAL | Localização da solicitação |
| longitude | REAL | Localização da solicitação |
| data_solicitacao | TEXT | Data e hora da solicitação |
| voluntario_responsavel | INTEGER | ID do voluntário que atendeu (se aplicável) |
| Cor | Status | Condição |
|---|---|---|
| 🟢 Verde | Livre | Ocupação: 0% (completamente disponível) |
| 🔵 Azul | Disponível | Ocupação: 1% a 49% |
| 🟡 Amarelo | Enchendo | Ocupação: 50% a 79% |
| 🔴 Vermelho | Lotado | Ocupação: 80% a 100% |
Aplicável para:
- Abrigos
- Voluntários que cedem espaço
POST /api/auth/registroBody (JSON) - Usuário Final:
{
"tipo_usuario": "usuario_final",
"nome": "Maria Silva",
"email": "maria@email.com",
"senha": "senha123",
"telefone": "21 98765-4321",
"endereco": "Rua das Flores, 123, Centro, Rio de Janeiro - RJ",
"latitude": -22.9068,
"longitude": -43.1729
}Body (JSON) - Voluntário (Resgate):
{
"tipo_usuario": "voluntario",
"nome": "João Resgatista",
"email": "joao@email.com",
"senha": "senha123",
"telefone": "21 91234-5678",
"endereco": "Av. Brasil, 456, Zona Norte, Rio de Janeiro - RJ",
"latitude": -22.8808,
"longitude": -43.3059,
"tipo_voluntario": "resgate",
"tipo_transporte": "barco",
"capacidade_pessoas": 8
}Body (JSON) - Voluntário (Ceder Espaço):
{
"tipo_usuario": "voluntario",
"nome": "Ana Acolhedora",
"email": "ana@email.com",
"senha": "senha123",
"telefone": "21 99999-8888",
"endereco": "Rua Tranquila, 789, Botafogo, Rio de Janeiro - RJ",
"latitude": -22.9519,
"longitude": -43.1838,
"tipo_voluntario": "ceder_espaco",
"tipo_espaco": "quarto",
"quantidade_quartos": 2,
"capacidade_total": 6,
"ocupacao_atual": 0
}Body (JSON) - Voluntário (Doação):
{
"tipo_usuario": "voluntario",
"nome": "Carlos Doador",
"email": "carlos@email.com",
"senha": "senha123",
"telefone": "21 97777-6666",
"endereco": "Rua Generosa, 321, Copacabana, Rio de Janeiro - RJ",
"tipo_voluntario": "doacao",
"itens_disponiveis": "Arroz, feijão, água mineral, roupas",
"quantidade": "50kg arroz, 30kg feijão, 100 garrafas água, 200 peças roupas",
"validade": "31/12/2026"
}Body (JSON) - Abrigo:
{
"tipo_usuario": "abrigo",
"nome": "Responsável Abrigo",
"email": "abrigo@email.com",
"senha": "senha123",
"telefone": "21 95555-4444",
"nome_organizacao": "Abrigo São José",
"recursos_disponiveis": "100 camas, cozinha completa, banheiros, roupas, cobertores, alimentos básicos",
"capacidade_total": 100,
"ocupacao_atual": 25,
"endereco_completo": "Rua do Abrigo, 999, Tijuca, Rio de Janeiro - RJ",
"latitude": -22.9249,
"longitude": -43.2300
}POST /api/auth/loginBody (JSON):
{
"email": "usuario@email.com",
"senha": "senha123"
}Response:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"usuario": {
"id": 1,
"tipo_usuario": "voluntario",
"nome": "João Resgatista",
"email": "joao@email.com"
}
}GET /api/usuariosGET /api/usuarios/:idPUT /api/usuarios/:idDELETE /api/usuarios/:idPOST /api/solicitacoesBody (JSON) - Solicitação de Resgate:
{
"tipo_solicitacao": "resgate",
"descricao": "Casa alagada, família de 4 pessoas no segundo andar",
"prioridade": "Urgente",
"latitude": -22.9068,
"longitude": -43.1729
}Body (JSON) - Solicitação de Abrigo:
{
"tipo_solicitacao": "abrigo",
"descricao": "Família de 5 pessoas precisa de abrigo temporário",
"prioridade": "Alta",
"latitude": -22.9068,
"longitude": -43.1729
}Body (JSON) - Solicitação de Doação:
{
"tipo_solicitacao": "doacao",
"descricao": "Precisando de alimentos básicos e roupas para 3 pessoas",
"prioridade": "Média",
"latitude": -22.9068,
"longitude": -43.1729
}GET /api/solicitacoesQuery Parameters:
?status=Pendente- Filtrar por status?tipo=resgate- Filtrar por tipo?prioridade=Urgente- Filtrar por prioridade
GET /api/solicitacoes/:idPUT /api/solicitacoes/:idBody (JSON):
{
"status": "Em andamento",
"voluntario_responsavel": 5
}DELETE /api/solicitacoes/:idGET /api/voluntariosQuery Parameters:
?tipo=resgate- Filtrar por tipo de voluntário?disponivel=true- Apenas disponíveis
GET /api/voluntarios/:idPUT /api/voluntarios/:idBody (JSON) - Atualizar ocupação (ceder espaço):
{
"ocupacao_atual": 4,
"status_lotacao": "azul"
}GET /api/abrigosQuery Parameters:
?status=verde- Filtrar por status de lotação
GET /api/abrigos/:idPUT /api/abrigos/:idBody (JSON):
{
"ocupacao_atual": 75,
"status_lotacao": "amarelo",
"recursos_disponiveis": "50 camas, cozinha completa, alimentos para 3 dias"
}GET /api/mapaResponse:
{
"abrigos": [
{
"id": 1,
"nome": "Abrigo São José",
"latitude": -22.9249,
"longitude": -43.2300,
"status_lotacao": "azul",
"capacidade_total": 100,
"ocupacao_atual": 25
}
],
"voluntarios_espaco": [
{
"id": 2,
"nome": "Ana Acolhedora",
"latitude": -22.9519,
"longitude": -43.1838,
"status_lotacao": "verde",
"capacidade_total": 6,
"ocupacao_atual": 0
}
],
"solicitacoes_pendentes": [
{
"id": 3,
"tipo": "resgate",
"latitude": -22.9068,
"longitude": -43.1729,
"prioridade": "Urgente"
}
]
}Todas as queries utilizam prepared statements com ?:
SELECT * FROM usuarios WHERE id = ?- Senhas criptografadas com bcrypt
- Tokens JWT para sessões
- Middleware de verificação de autenticação
Configurado para permitir requisições do frontend:
app.use(cors({
origin: 'http://localhost:3001'
}));- CRUD Completo - Create, Read, Update, Delete
- REST API - Arquitetura de API RESTful
- Verbos HTTP:
GET- Buscar dadosPOST- Criar novos registrosPUT- Atualizar registros existentesDELETE- Remover registros
- Middleware - Autenticação e validação
- Relacionamento de Tabelas - Foreign Keys
- React Hooks:
useState- Gerenciamento de estado localuseEffect- Requisições à API e efeitos colaterais
- Consumo de API - Fetch/Axios para requisições HTTP
- Renderização Dinâmica -
map()para listas - Google Maps Integration - Visualização de localizações
- Formulários Controlados - Inputs com estado
- Criar solicitações de resgate
- Buscar abrigos disponíveis no mapa
- Solicitar doações
- Acompanhar status das solicitações
- Resgate: Aceitar solicitações de resgate
- Ceder Espaço: Registrar disponibilidade e ocupação
- Doação: Listar itens disponíveis para doação
- Registrar capacidade e recursos
- Atualizar ocupação em tempo real
- Visualização no mapa com status de lotação
- Visualização de todos os abrigos
- Marcadores coloridos por status de lotação
- Localização de solicitações pendentes
- Filtros por tipo e disponibilidade
- Landing Page - Apresentação do sistema
- Login/Cadastro - Autenticação de usuários
- Dashboard - Visão geral personalizada por tipo de usuário
- Mapa Interativo - Visualização de abrigos e solicitações
- Gerenciamento de Solicitações - CRUD de solicitações
- Perfil - Atualização de dados do usuário
- Notificações em tempo real (WebSocket)
- Chat entre voluntários e solicitantes
- Sistema de avaliação de voluntários
- Geração de relatórios e estatísticas
- Aplicativo mobile nativo (React Native)
- Sistema de rotas otimizadas para resgate
- Integração com redes sociais
- Multilíngue (i18n)
- O banco de dados é criado automaticamente na primeira execução
- Dados de exemplo são inseridos apenas se o banco estiver vazio
- É necessária uma chave de API do Google Maps válida
- Recomenda-se uso de HTTPS em produção
- Backup regular do banco de dados é essencial
- ✅ Desktop (navegadores modernos)
- ✅ Tablet (responsivo)
- ✅ Mobile (responsivo)
Este projeto foi desenvolvido para fins educacionais, demonstrando:
- Desenvolvimento Full Stack (Node.js + React)
- Integração com APIs externas (Google Maps)
- Banco de dados relacional
- Autenticação e autorização
- Boas práticas de desenvolvimento
- Sistema CRUD completo
Contribuições são bem-vindas! Sinta-se à vontade para:
- Fazer um fork do projeto
- Criar uma branch para sua feature (
git checkout -b feature/NovaFuncionalidade) - Commit suas mudanças (
git commit -m 'Adiciona nova funcionalidade') - Push para a branch (
git push origin feature/NovaFuncionalidade) - Abrir um Pull Request
Jefferson David Linkedin: [https://www.linkedin.com/in/jeffersonsilvadev/] Github: [https://github.com/jeffersondavidsds] Site: [www.jotadev.pro]
🤝 Juntos somos mais fortes! 🆘