{"id":19653216,"url":"https://github.com/didifive/desafio-mvc-java","last_synced_at":"2026-04-10T01:58:45.526Z","repository":{"id":153798434,"uuid":"557647477","full_name":"didifive/desafio-mvc-java","owner":"didifive","description":"Desafio MVC (semana 20/06 ~ 01/07/2022) - Projeto Palmirinha Onofre - Programa GFT Start","archived":false,"fork":false,"pushed_at":"2022-12-20T13:16:38.000Z","size":3338,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-10T00:17:20.563Z","etag":null,"topics":["bootstrap","commons-codec","jacoco-plugin","java","javascript","jquery","maven","mvc","mysql","spring-boot","spring-data","spring-mvc","spring-security","spring-web","thymeleaf","thymeleaf-layout","thymeleaf-security5"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/didifive.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-26T03:23:46.000Z","updated_at":"2023-11-17T14:24:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"8f2b8a6a-db7a-4a09-ae66-74169e5280cc","html_url":"https://github.com/didifive/desafio-mvc-java","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didifive%2Fdesafio-mvc-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didifive%2Fdesafio-mvc-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didifive%2Fdesafio-mvc-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didifive%2Fdesafio-mvc-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/didifive","download_url":"https://codeload.github.com/didifive/desafio-mvc-java/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240961570,"owners_count":19885351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bootstrap","commons-codec","jacoco-plugin","java","javascript","jquery","maven","mvc","mysql","spring-boot","spring-data","spring-mvc","spring-security","spring-web","thymeleaf","thymeleaf-layout","thymeleaf-security5"],"created_at":"2024-11-11T15:13:34.415Z","updated_at":"2025-10-18T03:25:06.057Z","avatar_url":"https://github.com/didifive.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DESAFIO MVC - Projeto Palmirinha Onofre - Programa Start\r\n\r\n## Description\r\n\r\nRepositório para entrega do Desafio MVC (semana 20/06 ~ 01/07/2022) - Projeto Palmirinha Onofre - Programa GFT Start  \r\nObjetivo: Aplicar os conceitos MVC aprendidos durante as semanas de estudo;  \r\nEscopo: Criar um sistema no qual simule um site de receitas;  \r\nEntrega básica:\r\n\r\n- CRUD de receitas: Listagem com pesquisa por nome, página de cadastro e atualização e busca por ingrediente,\r\n- CRUD de ingredientes: Listagem com pesquisa por nome e página de cadastro e atualização,\r\n- CRUD de unidades de medidas: Listagem com pesquisa por nome e página de cadastro e atualização,\r\n- Acessos de admin e usuário comum;  \r\n\r\nDesafios bônus (Exceeds):\r\n\r\n- Usar imagens nas receitas,\r\n- Conversor de unidades,\r\n- TDD/testes unitários,\r\n- Histórico de receitas de usuários,\r\n- Envio de email com confirmação de cadastro para o usuário,\r\n- Funcionalidades extras com front-end.\r\n\r\n### Awesome Tasty Recipes\r\n\r\n#### O espetáculo do sabor\r\n\r\nPara o desafio foi criado o sistema **Awesome Tasty Recipes - O espetáculo do sabor** para procurar trazer o projeto o mais para a realidade possível.  \r\nNele foi aplicado o solicitado da entrega básica e exceeds com detalhes abaixo relacionado:\r\n\r\n- A página inicial do site contém a lista de receitas acessível por todos (não necessita autenticação);\r\n- A página de detalhes da receita também é acessível por todos (não necessita autenticação);\r\n- Para cadastrar ou editar receitas, deve possuir no mínimo a permissão de usuário comum, e com essa permissão é possível somente editar a(s) própria(s) receita(s);\r\n- Usuário com perfil administrador possui acesso total ao sistema e pode editar qualquer receita.\r\n- Adição de avaliação para receita, mostrando a média de notas no index e nos detalhes de receitas. Para avaliar deve ser usuário cadastrado com no mínimo permissão de usuário comum, não sendo permitido usuário avaliar a própria receita, se tentar avaliar novamente, irá substituir a nota anterior;\r\n- É possível enviar imagens para os cadastros de Ingredientes e Receitas, podendo ser por upload de imagens com até 512KB e extensões png, jpg e jpeg ou URL de imagem, também com extensão png, jpg ou jpeg, já disponível online na nuvem;\r\n- Página com Conversor de Unidades de Medidas (não necessita autenticação);\r\n- Página 'sobre' com resumo do site;\r\n- Em relação ao envio de email quando é cadastrada uma nova conta, o Google interrompeu a autenticação de contas somente por usuário e senha de vez a partir de 30/05/2022 (\u003chttps://support.google.com/mail/?p=BadCredentials\u003e);\r\n- Para configurar conta de email, basta modificar as opções de `spring.mail` que estão no arquivo `application.properties`, e também alterar com email de remetente na variável `from` que está no médoto `sendEmailConfirmacaoCadastroTo` da classe `com.gft.atr.services.EmailSenderService`;\r\n- Na segurança, a IDE avisou que `WebSecurityConfigurerAdapter` está depreciado, para sanar a situação, deve-se utilizar `org.springframework.security.web.SecurityFilterChain`, será feito em próxima atualização;\r\n- Paginação para as listas de Unidades, Ingredientes e Receitas também poderão ser implementadas em próxima atualização.\r\n\r\n## Configuration\r\n\r\nO projeto foi feito utilizando:\r\n\r\n- [IDE Eclipse] versão 2022-03 (4.23.0).\r\n- Iniciado com [spring initializr], com as configurações e dependências:\r\n  - Project: [Maven] Project\r\n  - Language: Java\r\n  - [Spring Boot] 2.7.0\r\n  - Packaging: Jar\r\n  - [Java 17]\r\n  - Dependencies:\r\n    - Spring Boot DevTools\r\n    - Spring Web\r\n    - Spring Data JPA\r\n    - Validation\r\n    - MySQL Driver\r\n    - Thymeleaf\r\n    - Spring Security\r\n    - Java Mail Sender\r\n- Dependências adicionadas manualmente ao `pom.xml`:\r\n  - `thymeleaf-layout-dialect` para utilizar layout junto com thymeleaf;\r\n  - `jacoco-maven-plugin` para gerar relatório de coverage quando o teste é executado diretamente pelo terminal. _É necessário também inserir plugin específico, verifique o `pom.xml` para checar o plugin `jacoco-maven-plugin` adicionado_;\r\n  - `commons-codec` para encode e decode de imagens em base64;\r\n  - `commons-io` para manipular file to byte[] para teste;\r\n  - `thymeleaf-extras-springsecurity5` para poder utilizar recursos de segurança do spring security no thymeleaf.\r\n- Outros recursos:\r\n  - [Bootstrap] 5.0.2;\r\n  - [JQuery] 3.6.0;\r\n  - [Font Awesome] 3.6.0;\r\n  - [jQuery Raty] para avaliar e mostrar notas das receitas.\r\n- Montagem do diagrama de classes UML utilizando o site [Draw.io]:  \r\n![Diagrama de Classes UML - Entidades](docs/AwesomeTastyUML-Entities.drawio.png?raw=true \"Diagrama de Classes UML - Entidades\")\r\n![Diagrama de Classes UML - Repositórios e Serviços](docs/AwesomeTastyUML-RepositoriesAndServices.drawio.png?raw=true \"Diagrama de Classes UML - Repositórios e Serviços\")  \r\n\r\n## Visuals\r\n\r\nSpring Banner personalizado:  \r\n![Spring Banner - GFT - Awesome Tasty Recipes](docs/spring_banner_gft_atr.png?raw=true \"Spring Banner - GFT - Awesome Tasty Recipes\")  \r\nLogotipo do projeto Awesome Tasty Recipes usando o site [Canva]:  \r\n![Logotipo - Awesome Tasty Recipes](src/main/resources/static/assets/images/logo.png?raw=true \"Logotipo - Awesome Tasty Recipes\")  \r\nPágina de erro personalizada (src/resources/templates/error.html):  \r\n![Error Page](docs/error_page.png?raw=true \"Error Page\")  \r\nNo formulário de usuário, o usuário admin não pode ser desativado:  \r\n![Usuário admin não pode ser desativado](docs/usuario_admin_naodesativa.PNG?raw=true \"Usuário admin não pode ser desativado\")  \r\nEm detalhes de usuário é mostrado as permissões e receitas vinculadas ao usuário detalhado:  \r\n![Permissões e receitas vinculadas ao usuário](docs/usuario_quando_possui_permissao_ou_receita.PNG?raw=true \"Permissões e receitas vinculadas ao usuário\")  \r\nEm detalhes de usuário, quando não existe vínculo de permissão ou receita mostra avisos:  \r\n![Quando não existe vínculo](docs/usuario_quando_nao_possui_permissao_ou_receita.PNG?raw=true \"quando não existe vínculo de permissão ou receita mostra avisos\")  \r\nNavbar pública:  \r\n![Navbar pública](docs/navbar_publica.PNG?raw=true \"Navbar pública\")  \r\nNavbar usuário:  \r\n![Navbar usuário](docs/navbar_usuario.PNG?raw=true \"Navbar usuário\")  \r\nNavbar administrador:  \r\n![Navbar administrador](docs/navbar_admin.PNG?raw=true \"Navbar administrador\")  \r\nFiltro de receita público ou usuário:  \r\n![Filtro de receita público ou usuário](docs/filtro_lista_receita_quando_nao_possui_permissao_administrador.PNG?raw=true \"Filtro de receita público ou usuário\")  \r\nFiltro de receita para administrador, pode pesquisar por usuário:  \r\n![Filtro de receita para administrador](docs/filtro_lista_receita_quando_possui_permissao_administrador.PNG?raw=true \"Filtro de receita para administrador\")\r\nQuando usuário é Usuário padrão, no index (home) habilita somente para editar própria receita:  \r\n![Filtro de receita administrador](docs/index_receitas_editar_somente_proprio_usuario.PNG?raw=true \"Filtro de receita administrador\")  \r\nQuando usuário é Administrador, no index (home) habilita editar para todas receitas:  \r\n![Filtro de receita administrador](docs/index_receitas_editar_administrador.PNG?raw=true \"Filtro de receita administrador\")  \r\nConversor de Unidades de Medidas convertendo unidades de tipos iguais:  \r\n![Conversor de Unidades de Medidas convertendo unidades de tipos iguais](docs/conversor_unidades_medida_mesmo_tipo.PNG?raw=true \"Conversor de Unidades de Medidas convertendo unidades de tipos iguais\")  \r\nConversor de Unidades de Medidas convertendo unidades de tipos iguais:  \r\n![Conversor de Unidades de Medidas convertendo unidades de tipos diferentes](docs/conversor_unidades_medida_tipo_diferente.PNG?raw=true \"Conversor de Unidades de Medidas convertendo unidades de tipos iguais\")  \r\nResultado dos testes utilizando o comando `./mvnw clean test`:  \r\n![Resultado dos testes utilizando o comando mvnw clean test](docs/resultados_testes_utilizando_mvnw_clean_test.PNG?raw=true \"Resultado dos testes utilizando o comando mvnw clean test\")  \r\nResultado do coverage pelo jacoco plugin:  \r\n![Resultado do coverage pelo jacoco plugin](docs/resultados_testes_coverage_jacoco_plugin.PNG?raw=true \"Resultado do coverage pelo jacoco plugin\")  \r\n\r\n## Installation\r\n\r\nPara a abrir o projeto basta clonar o repositório ou realizar o download e após:\r\n\r\n- Importar o projeto, preferencialmente na IDE Eclipse;\r\n- Fazer atualizações das dependências do Maven (Alt+F5 no Eclipse);\r\n- Possuir no mínimo JDK 17 LTS instalado, sugestão de JDK: [OpenJDK Zulu];\r\n- Possuir acesso à internet para atualização de dependências e funcionamento correto de URLs públicas;\r\n- Necessário possuir o banco de dados MySQL Server, caso não possua, pode visitar [MySQL Community Download] para download e instalação;\r\n- Duplicar e renomear o arquivo `application.properties.sample`, localizado em \"src/main/resources/\", para `application.properties` e alterar os parâmetros conforme segue:\r\n  - URL de conexão com o banco, está para conexão local com MySQL: `spring.datasource.url=jdbc:mysql://localhost:3306/atrdb?createDatabaseIfNotExist=True`\r\n  - Usuário root do banco: `spring.datasource.username=dbrootuser` - O usuário root com permissão ao MySQL Server local para criar bancos e tabelas;\r\n  - Senha root do banco: `spring.datasource.password=dbrootpass` - Senha do usuário, alterar para a senha do root utilizado localmente;\r\n  - Instrução para manutenção automática do banco: `spring.jpa.hibernate.ddl-auto=update` - Use `create-drop` para que ao iniciar a aplicação o spring JPA possa faça a criação necessária e faça a limpeza total do banco ao encerrar (sempre iniciando um banco de dados zerado); Use `update` para que o spring JPA apenas atualize as tabelas e atributos sem apagar os dados já existes;\r\n  - Dados de servidor de email, alterar os parâmetros `spring.mail.host`, `spring.mail.username`, `spring.mail.password` para dados com .\r\n\r\n## Tests\r\n\r\nOs testes foram feitos utilizando o [JUnit 5], Mockito e MockMVC.  \r\nPara rodar os testes no terminal (PowerShell ou similiar) basta executar na pasta do projeto o comando abaixo:\r\n\r\n```shell\r\n./mvnw clean test\r\n```\r\n\r\nApós o teste finalizado, é possível verificar relatório de coverage em: target/site/jacoco/index.html\r\n\r\n## Usage\r\n\r\nPara iniciar o projeto, basta utilizar uma das opções abaixo:\r\n\r\n- Utilizando a [IDE Eclipse], basta executar (Run) a classe `AwesomeTastyRecipesApplication` no pacote `com.gft.atr`.  \r\n- Utilizando o terminal (PowerShell ou similiar), basta executar na pasta do projeto o comando abaixo:\r\n\r\n    ```shell\r\n    ./mvnw clean package spring-boot:run\r\n    ```\r\n\r\nQuando o projeto subir, a aplicação estará acessível pelo endereço: \u003chttp://localhost:8080\u003e  \r\nAo acessar a aplicação pela primeira vez, sem possuir dados, será carregada tela para Instalação, que irá popular o banco de dados com **2 usuários padrões** com perfis _Administrador_ e _Usuário_ e alguns cadastros de **Unidades de Medida**, **Ingredientes** e **Receitas**. Abaixo segue lista dos usuários disponíveis após fazer a instalação:\r\n\r\n| Nome de Usuário   | Senha        | Perfil        |\r\n| -------           | -----        | -----         |\r\n| admin@email.com   | admin@1234   | Administrador |\r\n| usuario@email.com | usuario@1234 | Usuário       |\r\n\r\n## Support and Contributing\r\n\r\nDúvidas, problemas ou sugestões: abrir Issue ou Merge Request.\r\n\r\n## Authors and acknowledgment\r\n\r\nFeito por [Luis Carlos Zancanela]  \r\n\r\n## Project status\r\n\r\n_Done_\r\n\r\n[Java 17]: https://docs.oracle.com/en/java/javase/17/docs/api/index.html\r\n[JUnit 5]: https://junit.org/junit5/docs/current/user-guide/index.html\r\n[IDE Eclipse]: https://www.eclipse.org/ide/\r\n[spring initializr]: https://start.spring.io/\r\n[Spring Boot]: https://spring.io/projects/spring-boot\r\n[Maven]: https://maven.apache.org/\r\n[MySQL Community Download]: https://dev.mysql.com/downloads/\r\n[OpenJDK Zulu]: https://www.azul.com/downloads/\r\n[Draw.io]: https://app.diagrams.net/\r\n[Canva]: https://www.canva.com/pt_br/\r\n[Luis Carlos Zancanela]: https://github.com/didifive\r\n\r\n[Bootstrap]: https://getbootstrap.com/docs/5.0\r\n[JQuery]: https://jquery.com/\r\n[Font Awesome]: https://fontawesome.com/\r\n[jQuery Raty]: https://www.wbotelhos.com/raty/","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdidifive%2Fdesafio-mvc-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdidifive%2Fdesafio-mvc-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdidifive%2Fdesafio-mvc-java/lists"}