diff --git a/docs/Arquitetura/Arquitetura.md b/docs/Arquitetura/Arquitetura.md index 5193357..e7653f2 100644 --- a/docs/Arquitetura/Arquitetura.md +++ b/docs/Arquitetura/Arquitetura.md @@ -1,42 +1,70 @@ -# Arquitetura -![Arquitetura do Sistema Minas de Cultura](../assets/images/arquitetura_minas_de_cultura.png) +# Arquitetura- Minas de Cultura -### Frontend +
+ Arquitetura do Sistema Minas de Cultura +
-O frontend do projeto foi desenvolvido utilizando **Next.js**, um poderoso framework React que facilita a renderização do lado do servidor e a criação de aplicações web altamente performáticas. A interface do usuário foi construída com **React** e estilizada com **Tailwind CSS**, um framework de CSS utilitário que permite criar componentes personalizados e responsivos com facilidade. +## Visão Geral -O desenvolvimento do frontend seguiu fielmente o protótipo elaborado no **Figma**, garantindo que a experiência do usuário fosse consistente e alinhada com as expectativas de design. +O projeto Minas de Cultura é uma plataforma desenvolvida para aumentar a transparência dos gastos públicos voltados à cultura no estado de Minas Gerais. A arquitetura do sistema foi projetada para ser escalável, eficiente e de fácil manutenção, utilizando tecnologias modernas para assegurar o desempenho e a confiabilidade do sistema. -### Backend +## Frontend -O backend do projeto é uma **API REST** desenvolvida com **Express.js**, um framework minimalista para Node.js. Essa API é responsável por gerenciar as requisições e interagir com o banco de dados **PostgreSQL**, onde os dados são armazenados e consultados. Para facilitar a administração e o gerenciamento do banco de dados, utilizamos o **pgAdmin**, uma ferramenta robusta e eficiente para gerenciar bancos de dados PostgreSQL. +O frontend do projeto foi desenvolvido utilizando **Next.js**, um framework poderoso que facilita a renderização do lado do servidor (SSR) e a criação de aplicações web altamente performáticas. Utilizamos **React** para construir a interface do usuário, garantindo uma experiência dinâmica e interativa. A estilização é feita com **Tailwind CSS**, um framework utilitário de CSS que permite criar componentes personalizados e responsivos com facilidade. -### Coleta de Dados +### Deploy do Frontend + +O deploy do frontend foi realizado na **Vercel**, uma plataforma otimizada para projetos Next.js, que oferece funcionalidades como previews automáticos para cada pull request e suporte integrado para APIs serverless. A escolha da Vercel garante uma entrega contínua e rápida de atualizações, além de um ambiente de desenvolvimento que facilita a colaboração entre as equipes. + +## Backend + +O backend do projeto é uma **API REST** desenvolvida com **Express.js**, um framework minimalista para Node.js. Essa API é responsável por gerenciar as requisições dos usuários e interagir com o banco de dados **PostgreSQL**. Utilizamos **pgAdmin** para facilitar a administração e o gerenciamento do banco de dados. + +### Deploy do Backend + +O deploy da nossa API foi realizado no **Render**, uma plataforma de cloud que oferece deploys automáticos a partir de repositórios Git, suporte a SSL automático e escalabilidade fácil. O Render foi escolhido por sua simplicidade e robustez, permitindo que a API esteja sempre disponível e pronta para responder às requisições com alta performance. + +## Banco de Dados + +O banco de dados **PostgreSQL** é o coração do nosso sistema, onde todos os dados sobre os gastos culturais são armazenados e gerenciados. O banco foi implementado no **Supabase**, uma plataforma que oferece uma alternativa ao Firebase com a robustez do PostgreSQL. Utilizar o Supabase garante não apenas um banco de dados escalável e seguro, mas também uma integração perfeita com o restante da nossa stack tecnológica. + +## Coleta de Dados A coleta de dados para o projeto foi realizada utilizando duas abordagens distintas: -- **Scrapy**: Utilizado para coletar dados da cidade de **Juiz de Fora**. O site dessa cidade era bem organizado, e os dados eram disponibilizados em PDFs que seguiam uma lógica de URL consistente, facilitando a raspagem automatizada de informações. +- **Scrapy e Beautiful Soup**: Utilizados para raspagem de dados de fontes com estrutura de dados acessível. Esses frameworks permitem que o sistema extraia informações relevantes de maneira automatizada e eficiente. +- **Selenium**: Utilizado para coletar dados do estado de Minas Gerais, onde o site, apesar de estruturado, não disponibilizava os dados de forma acessível para raspadores convencionais. O Selenium, em conjunto com um driver de navegador, simula interações humanas para extrair as informações necessárias. + +Os dados coletados são armazenados em arquivos JSON, que posteriormente são consumidos pelo backend e integrados na API para facilitar o acesso e a apresentação das informações ao usuário final. + +## Automação e Workflows -- **Selenium**: Utilizado para coletar dados da cidade de **Montes Claros**. Apesar do site ser estruturado, ele não disponibilizava os dados de forma acessível para raspadores convencionais. Portanto, foi necessário utilizar o **Selenium** junto com um driver de navegador para simular interações humanas e extrair as informações necessárias. +Para garantir a qualidade e a integridade do código, utilizamos **GitHub Actions** para automatizar uma série de processos críticos, incluindo: -Ambos os raspadores armazenam os dados coletados em arquivos JSON. Esses arquivos são posteriormente consultados pelo backend e os dados são armazenados na API para facilitar o acesso e a apresentação das informações ao usuário final. +- **Testes Automatizados**: Configuramos automações para realizar testes unitários, de integração e de componentes tanto para o frontend quanto para o backend. Esses testes são executados automaticamente a cada novo commit ou pull request, garantindo que novas funcionalidades não quebrem o sistema. + +- **Raspagem de Dados Automática**: Implementamos um workflow que dispara mensalmente para realizar a raspagem de dados do estado de Minas Gerais, garantindo que as informações apresentadas na plataforma estejam sempre atualizadas. + +- **Automatização da Documentação**: Criamos uma automação específica para manter a documentação da gitpage sempre atualizada. A documentação é gerada automaticamente e qualquer alteração no código ou na arquitetura do sistema é refletida diretamente na documentação oficial. +## Conclusão das Tecnologias Escolhidas -# Conclusão das Tecnologias Escolhidas +Abaixo estão as principais tecnologias que compõem o projeto: -- **Linguagem de Programação:** [Python](https://docs.python.org/3/), [Javascript](https://www.javascript.com/) e [Typescript.](https://www.typescriptlang.org/) -- **Framework Web:** [Next.js](https://nextjs.org/). -- **Banco de Dados:** [Postgres](https://www.postgresql.org/) -- **Ferramenta de Coleta de Dados:** Framework [Scrapy](https://scrapy.org/) com auxilio das bibliotecas [Beautiful Soup](https://beautiful-soup-4.readthedocs.io/en/latest/) e [Selenium](https://www.selenium.dev/). -- **Tecnologias Adicionais:** [Docker](https://www.docker.com/), [Express](https://expressjs.com/), [React](https://react.dev/) e [Tailwind](https://tailwindcss.com/). +- **Linguagens de Programação**: [Python](https://docs.python.org/3/), [JavaScript](https://www.javascript.com/), [TypeScript](https://www.typescriptlang.org/) +- **Framework Web**: [Next.js](https://nextjs.org/) +- **Banco de Dados**: [PostgreSQL](https://www.postgresql.org/) +- **Ferramentas de Coleta de Dados**: Framework [Scrapy](https://scrapy.org/) com auxílio das bibliotecas [Beautiful Soup](https://beautiful-soup-4.readthedocs.io/en/latest/) e [Selenium](https://www.selenium.dev/) +- **Tecnologias Adicionais**: [Docker](https://www.docker.com/), [Express](https://expressjs.com/), [React](https://react.dev/), [Tailwind CSS](https://tailwindcss.com/) -## 📁 Histórico de versão +## 📁 Histórico de Versão | Versão | Data | Descrição | Autor | | :----: | :--------: | :------------------------------------------------------------------------------: | :-------------: | +| 5.0 | 02/09/2024 | Reestruturação da arquitetura | Gabriel Scheidt| | 4.0 | 16/08/2024 | Reestruturação da arquitetura | Gabriel Scheidt| | 3.0 | 25/04/2024 | Reestruturando Documento de Arquitetura | Rafael Carvalho | -| 2.2 | 25/04/2024 | Adicionando emojis nos tópicos | Isaac Batista | +| 2.2 | 25/04/2024 | Adicionando emojis nos tópicos | Isaac Batista | | 2.1 | 17/04/2024 | Exemplificação de uso da API do Querido Diário e Atualização da issue de suporte | Rafael Carvalho | | 2.0 | 17/04/2024 | Crição do esboço de arquitetura | Gabriel Scheidt | | 1.0 | 14/04/2024 | Crição do esboço de arquitetura | Gabriel Scheidt | diff --git a/docs/assets/images/Home.jpg b/docs/assets/images/Home.jpg index c3e42f8..f82ec70 100644 Binary files a/docs/assets/images/Home.jpg and b/docs/assets/images/Home.jpg differ diff --git a/docs/assets/images/arquitetura_minas.png b/docs/assets/images/arquitetura_minas.png new file mode 100644 index 0000000..92b82a5 Binary files /dev/null and b/docs/assets/images/arquitetura_minas.png differ diff --git a/docs/index.md b/docs/index.md index b10d761..735598c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -84,9 +84,13 @@ cd 2024-1-MinasDeCultura - *Desenvolvimento da Identidade Visual:* Investimos tempo no desenvolvimento de uma identidade visual consistente para o projeto, incluindo seleção de cores, tipografia e uma logo autêntica baseada na bandeira. Essa identidade visual reflete nossa visão e valores, e está integrada em toda a interface do usuário e materiais de design. -- *PHome:* +- *Desenvolvimento do Style-Guide para Padronização:* Criamos um Style-Guide detalhado. Este guia teve como objetivo central facilitar o processo de prototipação, garantindo consistência visual e de estilo em todas as etapas do desenvolvimento. Com elementos como tipografia, ícones, espaçamentos e componentes definidos de antemão, ganhamos eficiência e coesão em nosso trabalho. + +![Style Guide](https://raw.githubusercontent.com/unb-mds/2024-1-MinasDeCultura/main/docs/assets/images/Minas_de_cultura.png) + +- *PHome:* Com as bases sólidas estabelecidas, criamos o modelo final da nossa página principal. - ![Home Page](https://raw.githubusercontent.com/unb-mds/2024-1-MinasDeCultura/main/docs/assets/images/Home.jpg) +![Home Page](https://raw.githubusercontent.com/unb-mds/2024-1-MinasDeCultura/main/docs/assets/images/Home.jpg) ## 👥 Desenvolvedores diff --git a/docs/Arquitetura/Figma.md "b/docs/vis\303\243o geral/Figma.md" similarity index 93% rename from docs/Arquitetura/Figma.md rename to "docs/vis\303\243o geral/Figma.md" index 9f273d6..2a57549 100644 --- a/docs/Arquitetura/Figma.md +++ "b/docs/vis\303\243o geral/Figma.md" @@ -18,9 +18,9 @@ Utilizando a história de usuário elaborada pelo grupo como referência, conceb ![Estrutura Site](https://raw.githubusercontent.com/unb-mds/2024-1-MinasDeCultura/main/docs/assets/images/Estrutura-MinasCult1.png) -### Prototipação da Tela Inicial (em Andamento): +### Prototipação da Tela Inicial: -Com as bases sólidas estabelecidas, iniciamos o processo de prototipagem da tela inicial. +Com as bases sólidas estabelecidas, criamos o modelo final da nossa página principal. ![Home Page](https://raw.githubusercontent.com/unb-mds/2024-1-MinasDeCultura/main/docs/assets/images/Home.jpg) diff --git "a/docs/vis\303\243o geral/modelagem_banco.md" "b/docs/vis\303\243o geral/modelagem_banco.md" new file mode 100644 index 0000000..d87cb26 --- /dev/null +++ "b/docs/vis\303\243o geral/modelagem_banco.md" @@ -0,0 +1 @@ +# Modelagem do banco \ No newline at end of file diff --git "a/docs/vis\303\243o geral/testes.md" "b/docs/vis\303\243o geral/testes.md" new file mode 100644 index 0000000..e2440dd --- /dev/null +++ "b/docs/vis\303\243o geral/testes.md" @@ -0,0 +1 @@ +# Testes frontend \ No newline at end of file diff --git a/front/src/app/favicon.ico b/front/src/app/favicon.ico index 718d6fe..58ef7d6 100644 Binary files a/front/src/app/favicon.ico and b/front/src/app/favicon.ico differ diff --git a/front/src/components/Filtro.tsx b/front/src/components/Filtro.tsx index cff4e22..4617f5a 100644 --- a/front/src/components/Filtro.tsx +++ b/front/src/components/Filtro.tsx @@ -81,7 +81,7 @@ const Dashboard: React.FC = () => { }, }, legend: { - position: 'top', + position: 'bottom', horizontalAlign: 'center', fontSize: '14px', }, diff --git a/front/src/components/Header.tsx b/front/src/components/Header.tsx index 4d9ccd3..6156cc4 100644 --- a/front/src/components/Header.tsx +++ b/front/src/components/Header.tsx @@ -1,6 +1,6 @@ "use client"; -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef } from "react"; import Image from "next/image"; import Logo from '@/assets/logo_vermelha.png'; import Link from 'next/link'; @@ -14,7 +14,8 @@ export function Header() { const [accessibilityMenuOpen, setAccessibilityMenuOpen] = useState(false); const [keepMenuOpen, setKeepMenuOpen] = useState(false); - // Carrega as configurações do localStorage + const accessibilityMenuRef = useRef(null); + useEffect(() => { const savedDarkMode = localStorage.getItem('darkMode') === 'true'; const savedHighContrast = localStorage.getItem('highContrast') === 'true'; @@ -25,19 +26,35 @@ export function Header() { setFontSize(savedFontSize); }, []); - // Atualiza as configurações e aplica as classes useEffect(() => { document.documentElement.classList.toggle('dark', darkMode); document.documentElement.classList.toggle('high-contrast', highContrast); document.documentElement.classList.toggle('font-lg', fontSize === 'text-lg'); document.documentElement.classList.toggle('font-original', fontSize === 'text-base'); - // Salva as configurações no localStorage localStorage.setItem('darkMode', darkMode.toString()); localStorage.setItem('highContrast', highContrast.toString()); localStorage.setItem('fontSize', fontSize); }, [darkMode, highContrast, fontSize]); + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (accessibilityMenuRef.current && !accessibilityMenuRef.current.contains(event.target as Node)) { + setAccessibilityMenuOpen(false); + } + }; + + if (accessibilityMenuOpen) { + document.addEventListener('mousedown', handleClickOutside); + } else { + document.removeEventListener('mousedown', handleClickOutside); + } + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [accessibilityMenuOpen]); + const toggleNavbar = () => setIsOpen(!isOpen); const increaseFontSize = () => setFontSize('text-lg'); @@ -61,44 +78,47 @@ export function Header() { }; return ( -
-
-
- - - Logo -

- MinasdeCultura -

- -
- +
+
+ + + + Logo +

+ MinasdeCultura +

+ + +
+ {/* Menu de navegação para desktop */} + -
{accessibilityMenuOpen && ( -
- + {/* Menu de navegação para mobile */} + {isOpen && ( + + )}
); } diff --git a/front/src/services/api.ts b/front/src/services/api.ts index 3daacfa..d24a0bb 100644 --- a/front/src/services/api.ts +++ b/front/src/services/api.ts @@ -7,26 +7,6 @@ interface SearchParams { endMonth: string; } -export const fetchCities = async () => { - try { - const response = await axios.get('http://localhost:5000/cities'); - return response.data; - } catch (error) { - console.error('Error fetching cities:', error); - throw error; - } -}; - -export const fetchUnits = async () => { - try { - const response = await axios.get('http://localhost:5000/units'); - return response.data; - } catch (error) { - console.error('Error fetching units:', error); - throw error; - } -}; - export const fetchYearlyTendersData = async () => { try { const requests = []; @@ -41,7 +21,6 @@ export const fetchYearlyTendersData = async () => { } }; -/* pra quando a API remota estiver com a lógica certa*/ export const fettchYearAndMonthTender = async (params: SearchParams) => { const { startYear, startMonth, endYear, endMonth } = params;