From d012a092e57384872d1abca164c04938122d5ca4 Mon Sep 17 00:00:00 2001 From: Tiago dos Santos Date: Wed, 17 Dec 2025 13:48:19 -0300 Subject: [PATCH] Projeto Completo: GuiaSenior Web App (Docker + Spring Boot) --- .gitignore | 9 + GuiaSeniorWeb/Dockerfile | 11 + GuiaSeniorWeb/README.md | 80 +++++++ GuiaSeniorWeb/docker-compose.yml | 8 + GuiaSeniorWeb/pom.xml | 45 ++++ .../guiasenior/GuiaSeniorApplication.java | 13 ++ .../example/guiasenior/HomeController.java | 199 ++++++++++++++++++ .../src/main/resources/static/css/style.css | 154 ++++++++++++++ .../src/main/resources/templates/dicas.html | 40 ++++ .../src/main/resources/templates/home.html | 44 ++++ .../resources/templates/region_utilities.html | 52 +++++ .../src/main/resources/templates/regions.html | 44 ++++ .../resources/templates/safety_detail.html | 33 +++ .../main/resources/templates/site_detail.html | 38 ++++ .../src/main/resources/templates/sites.html | 54 +++++ 15 files changed, 824 insertions(+) create mode 100644 .gitignore create mode 100644 GuiaSeniorWeb/Dockerfile create mode 100644 GuiaSeniorWeb/README.md create mode 100644 GuiaSeniorWeb/docker-compose.yml create mode 100644 GuiaSeniorWeb/pom.xml create mode 100644 GuiaSeniorWeb/src/main/java/com/example/guiasenior/GuiaSeniorApplication.java create mode 100644 GuiaSeniorWeb/src/main/java/com/example/guiasenior/HomeController.java create mode 100644 GuiaSeniorWeb/src/main/resources/static/css/style.css create mode 100644 GuiaSeniorWeb/src/main/resources/templates/dicas.html create mode 100644 GuiaSeniorWeb/src/main/resources/templates/home.html create mode 100644 GuiaSeniorWeb/src/main/resources/templates/region_utilities.html create mode 100644 GuiaSeniorWeb/src/main/resources/templates/regions.html create mode 100644 GuiaSeniorWeb/src/main/resources/templates/safety_detail.html create mode 100644 GuiaSeniorWeb/src/main/resources/templates/site_detail.html create mode 100644 GuiaSeniorWeb/src/main/resources/templates/sites.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7cfe2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +target/ +*.class +.idea/ +*.iml +.DS_Store +.vscode/ +# Ignore compiled jars if not intentionally part of repo (usually yes) +*.jar +!src/**/lib/*.jar diff --git a/GuiaSeniorWeb/Dockerfile b/GuiaSeniorWeb/Dockerfile new file mode 100644 index 0000000..31edd22 --- /dev/null +++ b/GuiaSeniorWeb/Dockerfile @@ -0,0 +1,11 @@ +FROM maven:3.9.6-eclipse-temurin-17 AS build +WORKDIR /app +COPY pom.xml . +COPY src ./src +RUN mvn clean package -DskipTests + +FROM eclipse-temurin:17-jdk-alpine +WORKDIR /app +COPY --from=build /app/target/*.jar app.jar +EXPOSE 8080 +ENTRYPOINT ["java","-jar","app.jar"] diff --git a/GuiaSeniorWeb/README.md b/GuiaSeniorWeb/README.md new file mode 100644 index 0000000..6bf1ff7 --- /dev/null +++ b/GuiaSeniorWeb/README.md @@ -0,0 +1,80 @@ +# GuiaSenior - Web App para Idosos + +O **GuiaSenior** é uma aplicação web desenvolvida em Java (Spring Boot) com foco em acessibilidade digital para a terceira idade. O objetivo é facilitar o acesso a sites governamentais e serviços de utilidade pública, além de educar sobre segurança digital contra golpes. + +## 📱 Destaques e Funcionalidades + +1. **Acessibilidade**: + * Botões grandes e de alto contraste. + * Textos claros e linguagem direta. + * Animações suaves para guiar o olhar do usuário. + +2. **Sites Governamentais**: + * Acesso facilitado ao **Meu INSS**, **Gov.br**, **Receita Federal** e **Conecte SUS**. + * **Explicação Prévia**: Antes de enviar o idoso para o site oficial, uma tela explica exatamente o que é aquele serviço e como funciona. + +3. **Utilidades (Luz e Água)**: + * Filtro por **Região** (Norte, Sul, Sudeste, etc.). + * Lista das principais concessionárias (Enel, Sabesp, Copel, etc.). + * Instruções de como tirar a 2ª via da conta. + +4. **Segurança Digital**: + * Dicas específicas contra golpes no **WhatsApp**, **SMS** e **E-mail**. + * Orientações sobre senhas e verificação de duas etapas. + +--- + +## 🛠️ Tecnologias Utilizadas + +* **Java 17**: Linguagem principal. +* **Spring Boot 3.x**: Framework para criação da aplicação web. +* **Thymeleaf**: Motor de templates para gerar as páginas HTML no servidor. +* **CSS3**: Estilização com Flexbox/Grid e Animações (Keyframes). +* **Docker & Docker Compose**: Para empacotar e rodar a aplicação em qualquer lugar. + +--- + +## 📂 Estrutura do Código + +A estrutura do projeto segue o padrão MVC (Model-View-Controller) do Spring Boot: + +```text +GuiaSeniorWeb/ +├── src/main/java/com/example/guiasenior/ +│ ├── GuiaSeniorApplication.java # Classe principal que inicia o Spring +│ └── HomeController.java # "Cérebro" do app. Contém os dados dos sites/dicas e as rotas. +│ +├── src/main/resources/templates/ # Telas (HTML) +│ ├── home.html # Tela Inicial (Menu Principal) +│ ├── sites.html # Lista de sites do governo +│ ├── regions.html # Seleção de região (Luz e Água) +│ ├── site_detail.html # Tela de explicação detalhada de um site +│ └── safety_detail.html # Tela com lista de dicas de segurança +│ +├── src/main/resources/static/css/ +│ └── style.css # Cores, tamanhos de fonte e animações +│ +├── Dockerfile # Receita para criar a imagem do sistema +└── docker-compose.yml # Comando único para rodar o sistema +``` + +--- + +## 🚀 Como Rodar o Projeto + +É muito simples rodar o projeto usando Docker. Você não precisa instalar Java no seu computador, apenas o Docker. + +1. Abra o terminal na pasta do projeto: + ```bash + cd GuiaSeniorWeb + ``` + +2. Execute o comando para construir e rodar: + ```bash + docker-compose up --build + ``` + +3. Aguarde aparecer a mensagem de que o aplicativo iniciou. + +4. Abra seu navegador (Chrome, Firefox, etc.) e acesse: + 👉 **http://localhost:8080** diff --git a/GuiaSeniorWeb/docker-compose.yml b/GuiaSeniorWeb/docker-compose.yml new file mode 100644 index 0000000..9b58fbe --- /dev/null +++ b/GuiaSeniorWeb/docker-compose.yml @@ -0,0 +1,8 @@ +version: '3.8' +services: + app: + build: . + ports: + - "8080:8080" + container_name: guiasenior_app + restart: always diff --git a/GuiaSeniorWeb/pom.xml b/GuiaSeniorWeb/pom.xml new file mode 100644 index 0000000..92bb686 --- /dev/null +++ b/GuiaSeniorWeb/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.0 + + + com.example + guiasenior + 0.0.1-SNAPSHOT + GuiaSenior + App para idosos + + 17 + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/GuiaSeniorWeb/src/main/java/com/example/guiasenior/GuiaSeniorApplication.java b/GuiaSeniorWeb/src/main/java/com/example/guiasenior/GuiaSeniorApplication.java new file mode 100644 index 0000000..e18fef4 --- /dev/null +++ b/GuiaSeniorWeb/src/main/java/com/example/guiasenior/GuiaSeniorApplication.java @@ -0,0 +1,13 @@ +package com.example.guiasenior; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GuiaSeniorApplication { + + public static void main(String[] args) { + SpringApplication.run(GuiaSeniorApplication.class, args); + } + +} diff --git a/GuiaSeniorWeb/src/main/java/com/example/guiasenior/HomeController.java b/GuiaSeniorWeb/src/main/java/com/example/guiasenior/HomeController.java new file mode 100644 index 0000000..5614f6c --- /dev/null +++ b/GuiaSeniorWeb/src/main/java/com/example/guiasenior/HomeController.java @@ -0,0 +1,199 @@ +package com.example.guiasenior; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.HashMap; +import java.util.Map; + +@Controller +public class HomeController { + + private final Map> utilities = new HashMap<>(); + private final Map allSitesLookup = new HashMap<>(); + private final Map govSitesDisplay = new HashMap<>(); + private final Map safetyTopics = new HashMap<>(); + + public HomeController() { + // Initialize Utilities (add to lookup only) + initializeUtilities(); + + // Initialize Government Sites (add to both display and lookup) + addGovSite("inss", new SiteInfo("Meu INSS", "Serviços da previdência.", + "O Meu INSS é a ferramenta oficial para pedir aposentadoria, salário-maternidade, ver extratos de pagamento e agendar perícias médicas. Você precisa de uma conta Gov.br para entrar.", + "https://meu.inss.gov.br/")); + + addGovSite("govbr", new SiteInfo("Gov.br", "Documentos digitais.", + "O Gov.br é sua identidade digital. Com ele você acessa o INSS, assina documentos eletronicamente, vê sua carteira de motorista digital e muito mais.", + "https://www.gov.br/")); + + addGovSite("receita", new SiteInfo("Receita Federal", "CPF e Imposto de Renda.", + "Aqui você pode consultar se seu CPF está regular, fazer a declaração do Imposto de Renda e pedir restituição.", + "https://www.gov.br/receitafederal")); + + addGovSite("sus", new SiteInfo("Conecte SUS", "Vacinas e Saúde.", + "Visualize sua carteira de vacinação da COVID-19 e outras vacinas, além de ver histórico de medicamentos retirados na Farmácia Popular.", + "https://conectesus-paciente.saude.gov.br/")); + + // Safety Data + safetyTopics.put("whatsapp", new SafetyInfo("Segurança no WhatsApp", + new String[]{ + "Nunca compartilhe o código de 6 dígitos que chega por SMS.", + "Se um parente pedir dinheiro urgente por mensagem, ligue para ele NO NÚMERO ANTIGO antes de transferir.", + "Ative a 'Confirmação em Duas Etapas' nas configurações do WhatsApp.", + "Desconfie de promoções boas demais para ser verdade.", + "Oculte sua foto de perfil para estranhos nas configurações de Privacidade.", + "Não atenda chamadas de vídeo de números desconhecidos.", + "Se alguém disser que 'trocou de número' e pedir dinheiro, desconfie na hora." + })); + + safetyTopics.put("sms", new SafetyInfo("Segurança no SMS", + new String[]{ + "Bancos nunca mandam link por SMS pedindo para atualizar cadastro.", + "Não clique em links dizendo que sua conta foi bloqueada.", + "Ignore mensagens de prêmios que você não se lembra de ter concorrido.", + "Cuidado com mensagens sobre 'entregas pendentes' que pedem taxas.", + "O governo não manda SMS pedindo dados pessoais.", + "Se receber um código que não pediu, não faça nada e apague a mensagem." + })); + + safetyTopics.put("email", new SafetyInfo("Segurança no E-mail", + new String[]{ + "Verifique sempre o remetente. O governo usa e-mails terminados em .gov.br.", + "Não abra arquivos anexados de pessoas desconhecidas.", + "Nunca digite sua senha após clicar em um link de e-mail suspeito.", + "Fique atento a erros de ortografia ou mensagens muito urgentes.", + "Não clique em 'Cancelar Assinatura' de emails que você não conhece.", + "Se o e-mail diz 'Você tem uma dívida', ligue para a empresa oficial para confirmar." + })); + } + + private void addGovSite(String id, SiteInfo site) { + site.id = id; + govSitesDisplay.put(id, site); + allSitesLookup.put(id, site); + } + + private void initializeUtilities() { + // Sudeste + java.util.List sudeste = new java.util.ArrayList<>(); + sudeste.add(new SiteInfo("Enel SP", "Energia - São Paulo", "2ª via de conta e serviços da Enel SP.", "https://www.enel.com.br/")); + sudeste.add(new SiteInfo("Sabesp", "Água - São Paulo", "2ª via e agência virtual da Sabesp.", "https://agenciavirtual.sabesp.com.br/")); + sudeste.add(new SiteInfo("Light", "Energia - Rio de Janeiro", "Agência virtual Light RJ.", "https://agenciavirtual.light.com.br/")); + sudeste.add(new SiteInfo("Copasa", "Água - Minas Gerais", "Agência virtual Copasa MG.", "https://copasa.com.br/")); + sudeste.add(new SiteInfo("Cemig", "Energia - Minas Gerais", "Cemig Atende.", "https://atende.cemig.com.br/")); + utilities.put("sudeste", sudeste); + + // Sul + java.util.List sul = new java.util.ArrayList<>(); + sul.add(new SiteInfo("Copel", "Energia - Paraná", "Agência virtual Copel.", "https://www.copel.com/")); + sul.add(new SiteInfo("Sanepar", "Água - Paraná", "Serviços Sanepar.", "https://site.sanepar.com.br/")); + sul.add(new SiteInfo("CEEE Equatorial", "Energia - Rio Grande do Sul", "Agência Digital CEEE.", "https://ceee.equatorialenergia.com.br/")); + sul.add(new SiteInfo("Celesc", "Energia - Santa Catarina", "Agência Web Celesc.", "https://www.celesc.com.br/")); + utilities.put("sul", sul); + + // Nordeste + java.util.List nordeste = new java.util.ArrayList<>(); + nordeste.add(new SiteInfo("Coelba", "Energia - Bahia", "Neoenergia Coelba.", "https://servicos.neoenergiacoelba.com.br/")); + nordeste.add(new SiteInfo("Embasa", "Água - Bahia", "Agência Virtual Embasa.", "https://agenciavirtual.embasa.ba.gov.br/")); + nordeste.add(new SiteInfo("Celpe", "Energia - Pernambuco", "Neoenergia Pernambuco.", "https://servicos.neoenergiapernambuco.com.br/")); + nordeste.add(new SiteInfo("Cagece", "Água - Ceará", "Agência Virtual Cagece.", "https://www.cagece.com.br/")); + utilities.put("nordeste", nordeste); + + // Norte + java.util.List norte = new java.util.ArrayList<>(); + norte.add(new SiteInfo("Equatorial Pará", "Energia - Pará", "Agência Web Equatorial.", "https://pa.equatorialenergia.com.br/")); + norte.add(new SiteInfo("Amazonas Energia", "Energia - Amazonas", "Agência Virtual.", "https://www.amazonasenergia.com/")); + utilities.put("norte", norte); + + // Centro-Oeste + java.util.List centro = new java.util.ArrayList<>(); + centro.add(new SiteInfo("Enel GO", "Energia - Goiás", "Agência Virtual Enel Goiás.", "https://www.enel.com.br/")); + centro.add(new SiteInfo("Saneago", "Água - Goiás", "Agência Virtual Saneago.", "https://www.saneago.com.br/")); + centro.add(new SiteInfo("Energisa MS", "Energia - Mato Grosso do Sul", "Agência Virtual Energisa.", "https://www.energisa.com.br/")); + utilities.put("centro_oeste", centro); + + // Add to main lookup map only, NOT to the display map + for (java.util.List list : utilities.values()) { + for (SiteInfo s : list) { + // Generate a simple ID + s.id = s.name.toLowerCase().replace(" ", ""); + allSitesLookup.put(s.id, s); + } + } + } + + // ... existing routes ... + + @GetMapping("/regioes") + public String regions() { + return "regions"; + } + + @GetMapping("/utilidades/{regiao}") + public String utilitiesByRegion(@PathVariable String regiao, Model model) { + java.util.List list = utilities.get(regiao); + if (list == null) return "redirect:/regioes"; + + // Capitalize for display + String regionName = regiao.replace("_", "-").toUpperCase(); + model.addAttribute("regionName", regionName); + model.addAttribute("sites", list); + return "region_utilities"; + } + + @GetMapping("/") + public String home() { + return "home"; + } + + @GetMapping("/sites") + public String sites(Model model) { + model.addAttribute("sites", govSitesDisplay); + return "sites"; + } + + @GetMapping("/site/{id}") + public String siteDetail(@PathVariable String id, Model model) { + SiteInfo site = allSitesLookup.get(id); + if (site == null) return "redirect:/sites"; + model.addAttribute("site", site); + return "site_detail"; + } + + @GetMapping("/seguranca/{tipo}") + public String safetyDetail(@PathVariable String tipo, Model model) { + SafetyInfo info = safetyTopics.get(tipo); + if (info == null) return "redirect:/"; + model.addAttribute("info", info); + return "safety_detail"; + } + + // Inner classes for simple data holding + public static class SiteInfo { + public String name; + public String shortDesc; + public String fullDesc; + public String url; + public String id; // helper + + public SiteInfo(String name, String shortDesc, String fullDesc, String url) { + this.name = name; + this.shortDesc = shortDesc; + this.fullDesc = fullDesc; + this.url = url; + } + } + + public static class SafetyInfo { + public String title; + public String[] tips; + + public SafetyInfo(String title, String[] tips) { + this.title = title; + this.tips = tips; + } + } +} diff --git a/GuiaSeniorWeb/src/main/resources/static/css/style.css b/GuiaSeniorWeb/src/main/resources/static/css/style.css new file mode 100644 index 0000000..66e2ec0 --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/static/css/style.css @@ -0,0 +1,154 @@ +:root { + --primary-blue: #0052CC; + --primary-dark: #003380; + --accent-green: #008037; + --text-color: #212121; + --bg-color: #FAFAFA; +} + +body { + font-family: 'Arial', sans-serif; + /* Simple, readable font */ + background-color: var(--bg-color); + color: var(--text-color); + margin: 0; + padding: 0; + text-align: center; +} + +header { + background-color: var(--primary-blue); + color: white; + padding: 20px; + font-size: 1.5rem; +} + +h1 { + font-size: 2rem; + margin-top: 30px; +} + +.container { + padding: 20px; + max-width: 600px; + /* Mobile width focus */ + margin: 0 auto; +} + +/* Animations */ +@keyframes pulse { + 0% { + transform: scale(1); + } + + 50% { + transform: scale(1.02); + } + + 100% { + transform: scale(1); + } +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.pulse-anim { + animation: pulse 2s infinite ease-in-out; +} + +.fade-in { + animation: fadeIn 0.8s ease-out forwards; +} + +/* Updated Buttons with Animation */ +.big-button { + display: block; + width: 100%; + padding: 30px; + margin: 20px 0; + font-size: 1.5rem; + font-weight: bold; + color: white; + text-decoration: none; + border-radius: 15px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2); + transition: transform 0.1s; + /* Apply pulse by default or via class */ +} + +.big-button:hover { + transform: scale(1.05); + /* Interactive hover */ +} + +.big-button:active { + transform: scale(0.98); +} + +.btn-blue { + background-color: var(--primary-blue); +} + +.btn-green { + background-color: var(--accent-green); +} + +/* Back Button */ +.back-btn { + display: inline-block; + padding: 10px 20px; + background-color: #ddd; + color: black; + text-decoration: none; + border-radius: 5px; + font-size: 1.2rem; + margin-bottom: 20px; +} + +/* Cards */ +.card { + background: white; + border: 1px solid #ddd; + border-radius: 10px; + padding: 20px; + margin-bottom: 20px; + text-align: left; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.card h2 { + margin-top: 0; + color: var(--primary-dark); +} + +.card p { + font-size: 1.2rem; + line-height: 1.6; +} + +.card .link-btn { + display: inline-block; + margin-top: 10px; + padding: 15px 25px; + background-color: var(--primary-blue); + color: white; + text-decoration: none; + font-size: 1.2rem; + border-radius: 8px; +} + +.safety-card { + background-color: #FFF9C4; + /* Yellowish warning color */ + border-left: 10px solid #FBC02D; +} \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/dicas.html b/GuiaSeniorWeb/src/main/resources/templates/dicas.html new file mode 100644 index 0000000..1a9e34d --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/dicas.html @@ -0,0 +1,40 @@ + + + + + + + Dicas de Segurança + + + + + +
+ Segurança Digital +
+ +
+ ⬅ Voltar + +
+

⚠ Nunca forneça senhas, códigos SMS ou números de cartão por telefone ou WhatsApp.

+
+ +
+

✅ Ao entrar em sites do governo, verifique se o endereço termina em .gov.br.

+
+ +
+

⛔ Não clique em links estranhos enviados por SMS prometendo prêmios.

+
+ +
+

🔐 Use senhas diferentes para cada serviço e, se possível, anote longe do celular.

+
+ +
+ + + + \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/home.html b/GuiaSeniorWeb/src/main/resources/templates/home.html new file mode 100644 index 0000000..cf3d62f --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/home.html @@ -0,0 +1,44 @@ + + + + + + + GuiaSenior + + + + + +
+ GuiaSenior +
+ + + + + + \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/region_utilities.html b/GuiaSeniorWeb/src/main/resources/templates/region_utilities.html new file mode 100644 index 0000000..be95d74 --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/region_utilities.html @@ -0,0 +1,52 @@ + + + + + + + Serviços Públicos + + + + + + +
+ Região +
+ +
+ ⬅ Voltar + +

Selecione empresa para detalhes:

+ + +
+

Nome Empresa

+

Descrição

+
+ Ver Detalhes ➡ +
+
+
+ +
+ + + + \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/regions.html b/GuiaSeniorWeb/src/main/resources/templates/regions.html new file mode 100644 index 0000000..a4ec448 --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/regions.html @@ -0,0 +1,44 @@ + + + + + + + Escolha sua Região + + + + + +
+ Onde você mora? +
+ + + + + + \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/safety_detail.html b/GuiaSeniorWeb/src/main/resources/templates/safety_detail.html new file mode 100644 index 0000000..d3aa619 --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/safety_detail.html @@ -0,0 +1,33 @@ + + + + + + + Dicas de Segurança + + + + + +
+ Segurança +
+ +
+ ⬅ Voltar ao Início + +
+

⚠ Atenção:

+

Dica texto...

+
+ +
+

Se tiver dúvida, sempre pergunte a alguém de confiança antes de fazer qualquer coisa!

+
+ +
+ + + + \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/site_detail.html b/GuiaSeniorWeb/src/main/resources/templates/site_detail.html new file mode 100644 index 0000000..07b9855 --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/site_detail.html @@ -0,0 +1,38 @@ + + + + + + + Detalhes do Site + + + + + +
+ Nome Site +
+ +
+ ⬅ Voltar para a lista + +
+

Como funciona?

+

+ Explicação detalhada... +

+
+ +
+

Se você entendeu, clique abaixo para ir ao site oficial:

+ + Ir para o site oficial ➡ + +
+ +
+ + + + \ No newline at end of file diff --git a/GuiaSeniorWeb/src/main/resources/templates/sites.html b/GuiaSeniorWeb/src/main/resources/templates/sites.html new file mode 100644 index 0000000..a4ab19c --- /dev/null +++ b/GuiaSeniorWeb/src/main/resources/templates/sites.html @@ -0,0 +1,54 @@ + + + + + + + Sites do Governo + + + + + + +
+ Sites Úteis +
+ +
+ ⬅ Voltar + +

Toque em um item para ler a explicação.

+ + + +
+

Nome do Site

+

Descrição curta

+
+ Toque para saber mais ➡ +
+
+
+ +
+ + + + \ No newline at end of file