Este é um projeto extensionista Full Stack (Back-end e Front-end) desenvolvido para as Aulas 7 e 8 da disciplina de Web Mobile do curso de Análise e Desenvolvimento de Sistemas da Universidade Presbiteriana Mackenzie (EAD).
O objetivo é aplicar os conhecimentos da disciplina para criar uma solução prática alinhada a um Objetivo de Desenvolvimento Sustentável (ODS) da ONU.
A aplicação é composta por:
- Back-end (API): Construído com NestJS e MongoDB, responsável por toda a lógica de negócio e persistência dos dados.
- Front-end (Site): Construído com HTML, CSS e JavaScript, que consome a API para fornecer uma interface gráfica ao usuário.
A solução permite registrar e consultar dados sobre o descarte de resíduos, alinhando-se diretamente ao ODS 12: "Consumo e Produção Responsáveis".
- Back-end:
- Front-end:
- HTML5: Para a estrutura do site.
- CSS3: Para a estilização.
- JavaScript (ES6+): Para a lógica do cliente e chamadas de API (via
XMLHttpRequest).
- Teste de API:
- Postman: Utilizado para testar e validar os endpoints do back-end.
A aplicação implementa um CRUD completo e um painel de estatísticas, divididos em 4 telas principais no front-end:
- Permite cadastrar um novo ponto de descarte (nome, bairro, tipo, categorias, geolocalização).
- Lista os pontos já cadastrados na mesma tela.
- API (Back-end):
POST /pontoseGET /pontos.
- Permite registrar um novo descarte (nome do usuário, data, tipo de resíduo).
- Carrega dinamicamente os pontos de descarte cadastrados em um menu suspenso (
<select>). - API (Back-end):
POST /registros(eGET /pontospara preencher o select).
- Permite ao usuário filtrar o histórico de descartes por usuário, tipo de resíduo ou ponto de descarte.
- Exibe os resultados em uma tabela.
- API (Back-end):
GET /registros(utilizando query params para os filtros).
- Exibe um dashboard público com estatísticas geradas pelo back-end.
- API (Back-end):
GET /relatorio, que retorna dados como:- Local de descarte com mais registros.
- Tipo de resíduo mais frequente.
- Média de descartes por dia (últimos 30 dias).
- Total de usuários e pontos cadastrados.
- Percentual de crescimento mensal.
-
Clone o repositório:
git clone https://github.com/yagolima1/ProjetoODS
-
Instale as dependências:
npm install
-
Configure o Banco de Dados:
- Este projeto usa o MongoDB Atlas. Você precisará criar um cluster gratuito e obter sua String de Conexão.
- Configure o Network Access no MongoDB Atlas para
0.0.0.0/0(Permitir acesso de qualquer lugar) para que o servidor local possa se conectar. - Abra o arquivo
src/app.module.ts. - Substitua a string de conexão no
MongooseModule.forRoot(coloca a sua string aqui)pela sua.
-
Inicie o servidor (Back-end e Front-end):
npm run start:dev
-
Acesse a Aplicação:
- Abra seu navegador e acesse:
http://localhost:3000 - O servidor NestJS servirá o
index.htmle você poderá usar o site completo!
- Abra seu navegador e acesse:
Caso queira testar o back-end separadamente:
POST /pontos
Body (raw/JSON):
{
"nomeDoLocal": "Parque Ibirapuera (Portão 10)",
"bairro": "Vila Mariana",
"tipoDeLocal": "público",
"categoriaDosResiduosAceitos": ["orgânico", "plástico", "vidro"],
"geolocalizacao": {
"lat": -23.5882,
"lon": -46.6578
}
}Resposta (201 Created):
{
"nomeDoLocal": "Parque Ibirapuera (Portão 10)",
"bairro": "Vila Mariana",
"tipoDeLocal": "público",
"categoriaDosResiduosAceitos": [
"orgânico",
"plástico",
"vidro"
],
"geolocalizacao": {
"lat": -23.5882,
"lon": -46.6578
},
"_id": "673673e4b7c8e9a2b160c1d1",
"__v": 0
}POST /registros
Body (raw/JSON):
{
"nomeDoUsuario": "Yago Gonçalves",
"idDoPontoDeDescarte": "673673e4b7c8e9a2b160c1d1",
"tipoDeResiduo": "plástico",
"data": "2025-11-13T21:45:00.000Z"
}Resposta (201 Created):
{
"nomeDoUsuario": "Yago Gonçalves",
"idDoPontoDeDescarte": "673673e4b7c8e9a2b160c1d1",
"tipoDeResiduo": "plástico",
"data": "2025-11-13T21:45:00.000Z",
"_id": "673673ffb7c8e9a2b160c1d5",
"__v": 0
}GET /registros?tipoDeResiduo=plástico
Resposta (200 OK):
[
{
"_id": "673673ffb7c8e9a2b160c1d5",
"nomeDoUsuario": "Yago Gonçalves",
"idDoPontoDeDescarte": "673673e4b7c8e9a2b160c1d1",
"tipoDeResiduo": "plástico",
"data": "2025-11-13T21:45:00.000Z",
"__v": 0
}
]GET /relatorio
Resposta (200 OK):
{
"totalPontosDeDescarte": 1,
"totalUsuariosNoSistema": 1,
"localComMaiorNumeroDeRegistros": "Parque Ibirapuera (Portão 10)",
"tipoDeResiduoMaisFrequente": "plástico",
"mediaDescartesPorDiaUltimos30Dias": 0.03333333333333333,
"percentualCrescimentoUltimoMes": "Não há dados do mês anterior para comparar"
}Desenvolvido por Yago Gonçalves como atividade acadêmica para a disciplina de Web Mobile (Prof. Alcides Teixeira Barboza Junior), do curso de Tecnologia em Análise e Desenvolvimento de Sistemas da Universidade Presbiteriana Mackenzie.