├── front-end └── seivaVisual │ ├── src │ ├── assets │ │ ├── .gitkeep │ │ └── img │ │ │ ├── del.png │ │ │ ├── no.png │ │ │ ├── yes.png │ │ │ ├── admin.png │ │ │ ├── back.png │ │ │ ├── edit.png │ │ │ ├── feed.png │ │ │ ├── logout.png │ │ │ ├── plus.png │ │ │ ├── post.png │ │ │ ├── search.png │ │ │ ├── favicon.png │ │ │ ├── img-post.png │ │ │ ├── profile.png │ │ │ ├── settings.png │ │ │ ├── final-pag.png │ │ │ └── logo-seiva.png │ ├── app │ │ ├── app.component.css │ │ ├── admin │ │ │ ├── admin.component.css │ │ │ ├── admin.component.html │ │ │ ├── admin.component.ts │ │ │ └── admin.component.spec.ts │ │ ├── alerts │ │ │ ├── alerts.component.css │ │ │ ├── alerts.component.html │ │ │ ├── alerts.component.ts │ │ │ └── alerts.component.spec.ts │ │ ├── footer │ │ │ ├── footer.component.css │ │ │ ├── footer.component.html │ │ │ ├── footer.component.spec.ts │ │ │ └── footer.component.ts │ │ ├── put-tema │ │ │ ├── put-tema.component.css │ │ │ ├── put-tema.component.spec.ts │ │ │ ├── put-tema.component.ts │ │ │ └── put-tema.component.html │ │ ├── delete-tema │ │ │ ├── delete-tema.component.css │ │ │ ├── delete-tema.component.spec.ts │ │ │ ├── delete-tema.component.html │ │ │ └── delete-tema.component.ts │ │ ├── post-tema │ │ │ ├── post-tema.component.css │ │ │ ├── post-tema.component.spec.ts │ │ │ ├── post-tema.component.ts │ │ │ └── post-tema.component.html │ │ ├── postagem-tema │ │ │ ├── postagem-tema.component.css │ │ │ ├── postagem-tema.component.spec.ts │ │ │ ├── postagem-tema.component.ts │ │ │ └── postagem-tema.component.html │ │ ├── put-postagem │ │ │ ├── put-postagem.component.css │ │ │ ├── put-postagem.component.spec.ts │ │ │ ├── put-postagem.component.ts │ │ │ └── put-postagem.component.html │ │ ├── app.component.html │ │ ├── model │ │ │ ├── UserLogin.ts │ │ │ ├── User.ts │ │ │ ├── Tema.ts │ │ │ └── Postagem.ts │ │ ├── botao-subir │ │ │ ├── botao-subir.component.html │ │ │ ├── botao-subir.component.css │ │ │ ├── botao-subir.component.ts │ │ │ └── botao-subir.component.spec.ts │ │ ├── delete-postagem │ │ │ ├── delete-postagem.component.css │ │ │ ├── delete-postagem.component.spec.ts │ │ │ ├── delete-postagem.component.ts │ │ │ └── delete-postagem.component.html │ │ ├── app.component.ts │ │ ├── sobre │ │ │ ├── sobre.component.ts │ │ │ ├── sobre.component.css │ │ │ └── sobre.component.spec.ts │ │ ├── botao-lateral │ │ │ ├── botao-lateral.component.ts │ │ │ ├── botao-lateral.component.css │ │ │ ├── botao-lateral.component.spec.ts │ │ │ └── botao-lateral.component.html │ │ ├── service │ │ │ ├── auth.service.spec.ts │ │ │ ├── tema.service.spec.ts │ │ │ ├── alerts.service.spec.ts │ │ │ ├── postagem.service.spec.ts │ │ │ ├── alerts.service.ts │ │ │ ├── tema.service.ts │ │ │ ├── auth.service.ts │ │ │ └── postagem.service.ts │ │ ├── cadastro │ │ │ ├── cadastro.component.css │ │ │ ├── cadastro.component.spec.ts │ │ │ ├── cadastro.component.ts │ │ │ └── cadastro.component.html │ │ ├── equipe │ │ │ ├── equipe.component.css │ │ │ ├── equipe.component.ts │ │ │ └── equipe.component.spec.ts │ │ ├── navbar │ │ │ ├── navbar.component.css │ │ │ ├── navbar.component.spec.ts │ │ │ ├── navbar.component.ts │ │ │ └── navbar.component.html │ │ ├── home-inicio │ │ │ ├── home-inicio.component.css │ │ │ ├── home-inicio.component.spec.ts │ │ │ ├── home-inicio.component.ts │ │ │ └── home-inicio.component.html │ │ ├── feed │ │ │ ├── feed.component.spec.ts │ │ │ ├── feed.component.css │ │ │ └── feed.component.ts │ │ ├── app.component.spec.ts │ │ ├── app-routing.module.ts │ │ └── app.module.ts │ ├── styles.css │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── test.ts │ └── polyfills.ts │ ├── dist │ └── seivaVisual │ │ ├── favicon.ico │ │ ├── assets │ │ └── img │ │ │ ├── del.png │ │ │ ├── no.png │ │ │ ├── yes.png │ │ │ ├── admin.png │ │ │ ├── back.png │ │ │ ├── edit.png │ │ │ ├── feed.png │ │ │ ├── plus.png │ │ │ ├── post.png │ │ │ ├── favicon.png │ │ │ ├── img-post.png │ │ │ ├── logout.png │ │ │ ├── profile.png │ │ │ ├── search.png │ │ │ ├── settings.png │ │ │ ├── final-pag.png │ │ │ └── logo-seiva.png │ │ ├── index.html │ │ └── runtime.e227d1a0e31cbccbf8ec.js │ ├── .editorconfig │ ├── e2e │ ├── src │ │ ├── app.po.ts │ │ └── app.e2e-spec.ts │ ├── tsconfig.json │ └── protractor.conf.js │ ├── tsconfig.app.json │ ├── tsconfig.spec.json │ ├── tsconfig.json │ ├── tsconfig.base.json │ ├── javaScript.js │ ├── .gitignore │ ├── .browserslistrc │ ├── README.md │ ├── karma.conf.js │ ├── package.json │ └── tslint.json ├── seivadeploy ├── Dockerfile ├── seiva-api │ ├── Dockerfile │ ├── .mvn │ │ └── wrapper │ │ │ ├── maven-wrapper.jar │ │ │ └── maven-wrapper.properties │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── application.properties │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── redeSocial │ │ │ │ └── seiva │ │ │ │ ├── SeivaApplication.java │ │ │ │ ├── repository │ │ │ │ ├── UsuarioRepository.java │ │ │ │ ├── TemaRepository.java │ │ │ │ └── PostagemRepository.java │ │ │ │ ├── model │ │ │ │ ├── UserLoginModel.java │ │ │ │ ├── UsuarioModel.java │ │ │ │ ├── TemaModel.java │ │ │ │ └── PostagemModel.java │ │ │ │ ├── seguranca │ │ │ │ ├── UserDetailsServiceImpl.java │ │ │ │ ├── UserDetailsImpl.java │ │ │ │ └── BasicSecurityConfig.java │ │ │ │ ├── controller │ │ │ │ ├── UsuarioController.java │ │ │ │ ├── TemaController.java │ │ │ │ └── PostagemController.java │ │ │ │ └── service │ │ │ │ └── UsuarioService.java │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── redeSocial │ │ │ └── seiva │ │ │ └── SeivaApplicationTests.java │ ├── .gitignore │ └── pom.xml └── docker-compose.yml ├── DER ├── dbdesigner.pdf └── DescricaoDER.md ├── Entregas ├── Seiva.pdf ├── DescricaoTemaModel.md ├── DescricaoDeployBackEnd.md ├── DescricaoCRUDTema.md ├── DescricaoAngular.md ├── DescricaoCRUDPostagem.md ├── DescricaoSegurança.md ├── DescricaoEstruturaFrontEnd.md └── GuiaEntregas.md ├── docs ├── fonts │ ├── ionicons.eot │ ├── ionicons.ttf │ ├── ionicons.woff │ ├── ionicons.woff2 │ ├── roboto-v15-latin-300.eot │ ├── roboto-v15-latin-300.ttf │ ├── roboto-v15-latin-300.woff │ ├── roboto-v15-latin-300.woff2 │ ├── roboto-v15-latin-700.eot │ ├── roboto-v15-latin-700.ttf │ ├── roboto-v15-latin-700.woff │ ├── roboto-v15-latin-700.woff2 │ ├── roboto-v15-latin-italic.eot │ ├── roboto-v15-latin-italic.ttf │ ├── roboto-v15-latin-italic.woff │ ├── roboto-v15-latin-regular.eot │ ├── roboto-v15-latin-regular.ttf │ ├── roboto-v15-latin-italic.woff2 │ ├── roboto-v15-latin-regular.woff │ └── roboto-v15-latin-regular.woff2 ├── images │ ├── favicon.ico │ ├── compodoc-vectorise.png │ ├── compodoc-vectorise-inverted.png │ └── coverage-badge-documentation.svg ├── styles │ ├── style.css │ ├── tablesort.css │ ├── original.css │ ├── reset.css │ ├── stripe.css │ ├── laravel.css │ ├── vagrant.css │ ├── readthedocs.css │ ├── material.css │ └── postmark.css ├── js │ ├── compodoc.js │ ├── libs │ │ ├── tablesort.number.min.js │ │ ├── EventDispatcher.js │ │ ├── custom-elements-es5-adapter.js │ │ ├── innersvg.js │ │ ├── promise.min.js │ │ └── tablesort.min.js │ ├── tabs.js │ ├── routes │ │ └── routes_index.js │ ├── lazy-load-graphs.js │ ├── search │ │ └── search-lunr.js │ ├── svg-pan-zoom.controls.js │ └── sourceCode.js └── routes.html ├── .project └── README.md /front-end/seivaVisual/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/admin/admin.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/alerts/alerts.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/footer/footer.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /seivadeploy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:8.0.21 2 | EXPOSE 3308 -------------------------------------------------------------------------------- /seivadeploy/seiva-api/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.6.1-jdk-11-slim -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/admin/admin.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /DER/dbdesigner.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/DER/dbdesigner.pdf -------------------------------------------------------------------------------- /Entregas/Seiva.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/Entregas/Seiva.pdf -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-tema/put-tema.component.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 35px; 3 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/styles.css: -------------------------------------------------------------------------------- 1 | .min-vh-footer{ 2 | min-height: calc(100vh - 120px); 3 | } -------------------------------------------------------------------------------- /docs/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/ionicons.eot -------------------------------------------------------------------------------- /docs/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/ionicons.ttf -------------------------------------------------------------------------------- /docs/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/ionicons.woff -------------------------------------------------------------------------------- /docs/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/images/favicon.ico -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-tema/delete-tema.component.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 35px; 3 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/post-tema/post-tema.component.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 25px; 3 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/postagem-tema/postagem-tema.component.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 35px; 3 | } -------------------------------------------------------------------------------- /docs/fonts/ionicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/ionicons.woff2 -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-postagem/put-postagem.component.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 35px; 3 | } 4 | -------------------------------------------------------------------------------- /docs/images/compodoc-vectorise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/images/compodoc-vectorise.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-300.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-300.eot -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-300.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-300.ttf -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-300.woff -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-300.woff2 -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-700.eot -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-700.ttf -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-700.woff -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-700.woff2 -------------------------------------------------------------------------------- /front-end/seivaVisual/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/favicon.ico -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-italic.eot -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-italic.ttf -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-italic.woff -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-regular.eot -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-regular.ttf -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-italic.woff2 -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-regular.woff -------------------------------------------------------------------------------- /docs/fonts/roboto-v15-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/fonts/roboto-v15-latin-regular.woff2 -------------------------------------------------------------------------------- /docs/images/compodoc-vectorise-inverted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/docs/images/compodoc-vectorise-inverted.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/del.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/no.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/yes.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/admin.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/back.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/edit.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/feed.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/logout.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/plus.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/post.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/search.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/favicon.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/img-post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/img-post.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/profile.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/settings.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/favicon.ico -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/final-pag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/final-pag.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/assets/img/logo-seiva.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/src/assets/img/logo-seiva.png -------------------------------------------------------------------------------- /seivadeploy/seiva-api/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/seivadeploy/seiva-api/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/del.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/no.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/yes.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/admin.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/back.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/edit.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/feed.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/plus.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/post.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/model/UserLogin.ts: -------------------------------------------------------------------------------- 1 | export class UserLogin { 2 | public usuario: string; 3 | public senha: string; 4 | public token: string 5 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/favicon.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/img-post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/img-post.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/logout.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/profile.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/search.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/settings.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/final-pag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/final-pag.png -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/assets/img/logo-seiva.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laisbasso/PI-Seiva/HEAD/front-end/seivaVisual/dist/seivaVisual/assets/img/logo-seiva.png -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/model/User.ts: -------------------------------------------------------------------------------- 1 | export class User { 2 | public id: number; 3 | public nome: string; 4 | public usuario: string; 5 | public senha: string 6 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-subir/botao-subir.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /docs/styles/style.css: -------------------------------------------------------------------------------- 1 | @import "./reset.css"; 2 | @import "./bootstrap.min.css"; 3 | @import "./bootstrap-card.css"; 4 | @import "./prism.css"; 5 | @import "./ionicons.min.css"; 6 | @import "./compodoc.css"; 7 | @import "./tablesort.css"; 8 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/footer/footer.component.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-postagem/delete-postagem.component.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 25px; 3 | } 4 | 5 | #settings-post a:hover{ 6 | font-weight: bold; 7 | } 8 | 9 | .dropdown-menu { 10 | min-width: inherit; 11 | } -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | PI-Aorta 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-subir/botao-subir.component.css: -------------------------------------------------------------------------------- 1 | #subir { 2 | position: fixed; 3 | right: 0px; 4 | bottom: 50px; 5 | padding: 10px 10px 10px 10px; 6 | text-align: center; 7 | scroll-behavior: smooth; 8 | transition: 0.4s; 9 | } 10 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/model/Tema.ts: -------------------------------------------------------------------------------- 1 | import { Postagem } from './Postagem'; 2 | 3 | export class Tema { 4 | public id: number; 5 | public descricao: string; 6 | public imagem: string; 7 | public postagem: Postagem []; 8 | public descricaoImagem: string 9 | } -------------------------------------------------------------------------------- /seivadeploy/seiva-api/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.css'] 7 | }) 8 | export class AppComponent { 9 | title = 'seivaVisual'; 10 | } 11 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.jpa.hibernate.ddl-auto=update 2 | spring.datasource.url=jdbc:mysql://db:3306/db_seiva?createDatabaseIfNotExist=true&serverTimezone=UTC&useSSl=false 3 | spring.datasource.username=root 4 | spring.datasource.password=root 5 | spring.jpa.show-sql=true 6 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/model/Postagem.ts: -------------------------------------------------------------------------------- 1 | import { Tema } from './Tema'; 2 | 3 | export class Postagem { 4 | public id: number; 5 | public titulo: string; 6 | public descricao: string; 7 | public data: Date; 8 | public tema: Tema; 9 | public imagem: string; 10 | public descricaoImagem: string 11 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/alerts/alerts.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Entregas/DescricaoTemaModel.md: -------------------------------------------------------------------------------- 1 | 30/07 2 | 3 | # Descrição Tema Model 4 | 5 | | Atributo | Tipo | 6 | |----------|------| 7 | | id | [PK] long 8 | | descricao | String 9 | 10 | A tabela possuirá os atributos **ID** referente ao código de cada tema e **descrição** onde iremos inserir a temática: cursos, projetos, vagas, eventos, etc. 11 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/test/java/com/redeSocial/seiva/SeivaApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class SeivaApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Entregas/DescricaoDeployBackEnd.md: -------------------------------------------------------------------------------- 1 | 13/08 2 | 3 | # Descrição Deploy Back-End 4 | 5 | | Implementações | 6 | |----------| 7 | | docker-compose.yml | 8 | | Dockerfile (na pasta de deploy) | 9 | | Dockerfile (na pasta da api) | 10 | 11 | Realizamos o deploy do back-end da nossa aplicação, inserindo as informações referentes ao banco de dados e o uso da api em outra máquina. 12 | -------------------------------------------------------------------------------- /front-end/seivaVisual/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) as Promise; 6 | } 7 | 8 | getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() as Promise; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /docs/js/compodoc.js: -------------------------------------------------------------------------------- 1 | var compodoc = { 2 | EVENTS: { 3 | READY: 'compodoc.ready', 4 | SEARCH_READY: 'compodoc.search.ready' 5 | } 6 | }; 7 | 8 | Object.assign( compodoc, EventDispatcher.prototype ); 9 | 10 | document.addEventListener('DOMContentLoaded', function() { 11 | compodoc.dispatchEvent({ 12 | type: compodoc.EVENTS.READY 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/admin/admin.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-admin', 5 | templateUrl: './admin.component.html', 6 | styleUrls: ['./admin.component.css'] 7 | }) 8 | export class AdminComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/sobre/sobre.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-sobre', 5 | templateUrl: './sobre.component.html', 6 | styleUrls: ['./sobre.component.css'] 7 | }) 8 | export class SobreComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(){ 13 | 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Seiva 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /front-end/seivaVisual/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.base.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /front-end/seivaVisual/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.base.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-lateral/botao-lateral.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-botao-lateral', 5 | templateUrl: './botao-lateral.component.html', 6 | styleUrls: ['./botao-lateral.component.css'] 7 | }) 8 | export class BotaoLateralComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/SeivaApplication.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SeivaApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SeivaApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /front-end/seivaVisual/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.base.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/repository/UsuarioRepository.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.repository; 2 | 3 | import java.util.Optional; 4 | 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | import com.redeSocial.seiva.model.UsuarioModel; 8 | 9 | public interface UsuarioRepository extends JpaRepository { 10 | 11 | public Optional findByUsuario(String usuario); 12 | } 13 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { AuthService } from './auth.service'; 4 | 5 | describe('AuthService', () => { 6 | let service: AuthService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(AuthService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/tema.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { TemaService } from './tema.service'; 4 | 5 | describe('TemaService', () => { 6 | let service: TemaService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(TemaService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-subir/botao-subir.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-botao-subir', 5 | templateUrl: './botao-subir.component.html', 6 | styleUrls: ['./botao-subir.component.css'] 7 | }) 8 | export class BotaoSubirComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | subir(){ 16 | window.scroll(0,0); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/alerts.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { AlertsService } from './alerts.service'; 4 | 5 | describe('AlertsService', () => { 6 | let service: AlertsService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(AlertsService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-lateral/botao-lateral.component.css: -------------------------------------------------------------------------------- 1 | #feedback { 2 | position: fixed; 3 | right: 0px; 4 | top: 30vh; 5 | bottom: 30vh; 6 | padding: 10px 10px 10px 10px; 7 | text-align: center; 8 | scroll-behavior: smooth; 9 | transition: .4s; 10 | font-size: 7pt; 11 | font-weight: bold; 12 | writing-mode: vertical-lr; 13 | text-transform: uppercase; 14 | text-orientation: upright; 15 | height: 120px; 16 | margin: 0; 17 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/postagem.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { PostagemService } from './postagem.service'; 4 | 5 | describe('PostagemService', () => { 6 | let service: PostagemService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(PostagemService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* 2 | This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. 3 | It is not intended to be used to perform a compilation. 4 | 5 | To learn more about this file see: https://angular.io/config/solution-tsconfig. 6 | */ 7 | { 8 | "files": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.app.json" 12 | }, 13 | { 14 | "path": "./tsconfig.spec.json" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/cadastro/cadastro.component.css: -------------------------------------------------------------------------------- 1 | .container-fluid { 2 | background-image: url("https://i.imgur.com/lSU6dbM.png"); 3 | background-repeat: no-repeat; 4 | background-size: 100%; 5 | 6 | max-width: 100%; 7 | max-height: 100%; 8 | width: auto; 9 | height: auto; 10 | } 11 | 12 | #subir { 13 | position: relative; 14 | right: 10px; 15 | bottom: 50px; 16 | padding: 10px 30px 10px 30px; 17 | text-align: center; 18 | scroll-behavior: smooth; 19 | transition: 0.4s; 20 | cursor: pointer; 21 | } 22 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/repository/TemaRepository.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.repository; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import com.redeSocial.seiva.model.TemaModel; 9 | 10 | @Repository 11 | public interface TemaRepository extends JpaRepository { 12 | 13 | public List findAllByDescricaoContainingIgnoreCase(String descricao); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/repository/PostagemRepository.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.repository; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import com.redeSocial.seiva.model.PostagemModel; 9 | 10 | @Repository 11 | public interface PostagemRepository extends JpaRepository { 12 | 13 | public List findAllByDescricaoContainingIgnoreCase(String descricao); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /docs/js/libs/tablesort.number.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * tablesort v5.1.0 (2018-09-14) 3 | * http://tristen.ca/tablesort/demo/ 4 | * Copyright (c) 2018 ; Licensed MIT 5 | */ 6 | !function(){var a=function(a){return a.replace(/[^\-?0-9.]/g,"")},b=function(a,b){return a=parseFloat(a),b=parseFloat(b),a=isNaN(a)?0:a,b=isNaN(b)?0:b,a-b};Tablesort.extend("number",function(a){return a.match(/^[-+]?[£\x24Û¢´€]?\d+\s*([,\.]\d{0,2})/)||a.match(/^[-+]?\d+\s*([,\.]\d{0,2})?[£\x24Û¢´€]/)||a.match(/^[-+]?(\d)*-?([,\.]){0,1}-?(\d)+([E,e][\-+][\d]+)?%?$/)},function(c,d){return c=a(c),d=a(d),b(d,c)})}(); -------------------------------------------------------------------------------- /seivadeploy/seiva-api/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /front-end/seivaVisual/tsconfig.base.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "sourceMap": true, 8 | "declaration": false, 9 | "downlevelIteration": true, 10 | "experimentalDecorators": true, 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "es2015", 14 | "module": "es2020", 15 | "lib": [ 16 | "es2018", 17 | "dom" 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/alerts/alerts.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { BsModalRef } from 'ngx-bootstrap/modal'; 3 | 4 | @Component({ 5 | selector: 'app-alerts', 6 | templateUrl: './alerts.component.html', 7 | styleUrls: ['./alerts.component.css'] 8 | }) 9 | export class AlertsComponent implements OnInit { 10 | 11 | @Input() message: string 12 | @Input() type: "success" 13 | 14 | constructor(public modal: BsModalRef) { } 15 | 16 | ngOnInit(): void { 17 | } 18 | 19 | onClose(){ 20 | this.modal.hide() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/equipe/equipe.component.css: -------------------------------------------------------------------------------- 1 | ul.social-network { 2 | list-style: none; 3 | display: inline; 4 | 5 | padding: 0; 6 | } 7 | 8 | ul.social-network li { 9 | display: inline; 10 | margin: 0; 11 | padding: 5px; 12 | } 13 | 14 | .faLinkedin, .faGithub{ 15 | color: rgba(172, 172, 172, 0.815); 16 | } 17 | 18 | .faLinkedin:hover{ 19 | color: #0072b1; 20 | } 21 | 22 | .faGithub:hover{ 23 | color: #000000; 24 | } 25 | 26 | img { 27 | opacity: 0.7; 28 | } 29 | 30 | img:hover { 31 | opacity: 1.0; 32 | } 33 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/sobre/sobre.component.css: -------------------------------------------------------------------------------- 1 | .jbsobre { 2 | background-image: url('https://i.imgur.com/MvfUgbf.png'); 3 | 4 | background-position: center; 5 | background-repeat: no-repeat; 6 | background-size: cover; 7 | } 8 | 9 | .jbitens { 10 | background-color: white; 11 | } 12 | 13 | .areia { 14 | background-color: #F2C1AE; 15 | } 16 | 17 | .indigo { 18 | background-color: #260259; 19 | } 20 | 21 | .coral { 22 | background-color: #F25052; 23 | } 24 | 25 | .zuzu { 26 | background-color: #8AD8DC; 27 | } 28 | 29 | .lilas { 30 | background-color: #7241A4; 31 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/javaScript.js: -------------------------------------------------------------------------------- 1 | // Botão subir LOGIN 2 | $(document).ready(function () { 3 | $("#subir").click(function () { 4 | $("html, body").animate({ scrollTop: 0 }, "slow"); 5 | return false; 6 | }); 7 | }); 8 | 9 | // Botão descer pro SOBRE 10 | $(document).ready(function () { 11 | $("#sobre").click(function () { 12 | $("html, body").animate({ scrollTop: 650 }, "slow"); 13 | return false; 14 | }); 15 | }); 16 | 17 | // Botão descer CADASTRO 18 | $(document).ready(function () { 19 | $("#cadastro").click(function () { 20 | $("html, body").animate({ scrollTop: 2890 }, "slow"); 21 | return false; 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/navbar/navbar.component.css: -------------------------------------------------------------------------------- 1 | button:focus { 2 | outline: none !important; 3 | } 4 | 5 | .dropdown-menu img{ 6 | width: 25px; 7 | } 8 | 9 | .dropdown-menu { 10 | min-width:inherit; 11 | } 12 | 13 | .navbar a:hover{ 14 | cursor: pointer; 15 | } 16 | 17 | @media all and (min-width: 992px){ 18 | .navbar .nav-item .dropdown-menu { 19 | display: none; 20 | } 21 | .navbar .nav-item:hover .dropdown-menu { 22 | display: block; 23 | } 24 | .navbar .nav-item .dropdown-menu { 25 | margin-top: 0; 26 | } 27 | } 28 | 29 | @media (max-width: 991px){ 30 | #search{ 31 | display: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Seiva 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/home-inicio/home-inicio.component.css: -------------------------------------------------------------------------------- 1 | html, body{ 2 | margin:0; 3 | padding: 0; 4 | } 5 | 6 | a { 7 | cursor: pointer; 8 | } 9 | 10 | .positionContainer { 11 | bottom: 0; 12 | } 13 | 14 | .position { 15 | position: absolute; 16 | top: 0; 17 | right: 0; 18 | margin-bottom: 50px; 19 | margin-right: 50px; 20 | } 21 | 22 | .form { 23 | border-radius: 20px; 24 | } 25 | 26 | .mt { 27 | margin-top: 100px; 28 | margin-right: 130px; 29 | } 30 | 31 | .bgColor { 32 | background-color: #bd59d4; 33 | overflow: visible; 34 | } 35 | 36 | .btnColor { 37 | background-color: orangered; 38 | } 39 | 40 | .bege { 41 | background-color: #F2C6B6; 42 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/equipe/equipe.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { faGithub } from '@fortawesome/free-brands-svg-icons' 3 | import { faLinkedin } from '@fortawesome/free-brands-svg-icons' 4 | import { Router } from '@angular/router'; 5 | import { AuthService } from "./../service/auth.service"; 6 | 7 | @Component({ 8 | selector: 'app-equipe', 9 | templateUrl: './equipe.component.html', 10 | styleUrls: ['./equipe.component.css'] 11 | }) 12 | export class EquipeComponent implements OnInit { 13 | 14 | faGithub = faGithub 15 | faLinkedin = faLinkedin 16 | 17 | constructor( 18 | private router: Router, 19 | public auth: AuthService 20 | ) { } 21 | 22 | ngOnInit(){ 23 | 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/feed/feed.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FeedComponent } from './feed.component'; 4 | 5 | describe('FeedComponent', () => { 6 | let component: FeedComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ FeedComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(FeedComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | import { browser, logging } from 'protractor'; 3 | 4 | describe('workspace-project App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display welcome message', () => { 12 | page.navigateTo(); 13 | expect(page.getTitleText()).toEqual('seivaVisual app is running!'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER); 19 | expect(logs).not.toContain(jasmine.objectContaining({ 20 | level: logging.Level.SEVERE, 21 | } as logging.Entry)); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/admin/admin.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AdminComponent } from './admin.component'; 4 | 5 | describe('AdminComponent', () => { 6 | let component: AdminComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AdminComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AdminComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/sobre/sobre.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SobreComponent } from './sobre.component'; 4 | 5 | describe('SobreComponent', () => { 6 | let component: SobreComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ SobreComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(SobreComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /docs/js/libs/EventDispatcher.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author mrdoob / http://mrdoob.com/ 3 | */ 4 | 5 | var EventDispatcher=function(){};Object.assign(EventDispatcher.prototype,{addEventListener:function(i,t){void 0===this._listeners&&(this._listeners={});var e=this._listeners;void 0===e[i]&&(e[i]=[]),-1===e[i].indexOf(t)&&e[i].push(t)},hasEventListener:function(i,t){if(void 0===this._listeners)return!1;var e=this._listeners;return void 0!==e[i]&&-1!==e[i].indexOf(t)},removeEventListener:function(i,t){if(void 0!==this._listeners){var e=this._listeners[i];if(void 0!==e){var s=e.indexOf(t);-1!==s&&e.splice(s,1)}}},dispatchEvent:function(i){if(void 0!==this._listeners){var t=this._listeners[i.type];if(void 0!==t){i.target=this;var e=[],s=0,n=t.length;for(s=0;s { 6 | let component: AlertsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AlertsComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AlertsComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/equipe/equipe.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EquipeComponent } from './equipe.component'; 4 | 5 | describe('EquipeComponent', () => { 6 | let component: EquipeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ EquipeComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(EquipeComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/footer/footer.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FooterComponent } from './footer.component'; 4 | 5 | describe('FooterComponent', () => { 6 | let component: FooterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ FooterComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(FooterComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/navbar/navbar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NavbarComponent } from './navbar.component'; 4 | 5 | describe('NavbarComponent', () => { 6 | let component: NavbarComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NavbarComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NavbarComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /docs/styles/tablesort.css: -------------------------------------------------------------------------------- 1 | th[role=columnheader]:not(.no-sort) { 2 | cursor: pointer; 3 | } 4 | 5 | th[role=columnheader]:not(.no-sort):after { 6 | content: ''; 7 | float: right; 8 | margin-top: 7px; 9 | border-width: 0 4px 4px; 10 | border-style: solid; 11 | border-color: #404040 transparent; 12 | visibility: visible; 13 | opacity: 1; 14 | -ms-user-select: none; 15 | -webkit-user-select: none; 16 | -moz-user-select: none; 17 | user-select: none; 18 | } 19 | 20 | th[aria-sort=ascending]:not(.no-sort):after { 21 | border-bottom: none; 22 | border-width: 4px 4px 0; 23 | } 24 | 25 | th[aria-sort]:not(.no-sort):after { 26 | visibility: visible; 27 | opacity: 0.4; 28 | } 29 | 30 | th[role=columnheader]:not(.no-sort):hover:after { 31 | visibility: visible; 32 | opacity: 1; 33 | } 34 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-tema/put-tema.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { PutTemaComponent } from './put-tema.component'; 4 | 5 | describe('PutTemaComponent', () => { 6 | let component: PutTemaComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ PutTemaComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(PutTemaComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/cadastro/cadastro.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CadastroComponent } from './cadastro.component'; 4 | 5 | describe('CadastroComponent', () => { 6 | let component: CadastroComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CadastroComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CadastroComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/post-tema/post-tema.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { PostTemaComponent } from './post-tema.component'; 4 | 5 | describe('PostTemaComponent', () => { 6 | let component: PostTemaComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ PostTemaComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(PostTemaComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-subir/botao-subir.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BotaoSubirComponent } from './botao-subir.component'; 4 | 5 | describe('BotaoSubirComponent', () => { 6 | let component: BotaoSubirComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BotaoSubirComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BotaoSubirComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-tema/delete-tema.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DeleteTemaComponent } from './delete-tema.component'; 4 | 5 | describe('DeleteTemaComponent', () => { 6 | let component: DeleteTemaComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ DeleteTemaComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(DeleteTemaComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/home-inicio/home-inicio.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { HomeInicioComponent } from './home-inicio.component'; 4 | 5 | describe('HomeInicioComponent', () => { 6 | let component: HomeInicioComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ HomeInicioComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HomeInicioComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-postagem/put-postagem.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { PutPostagemComponent } from './put-postagem.component'; 4 | 5 | describe('PutPostagemComponent', () => { 6 | let component: PutPostagemComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ PutPostagemComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(PutPostagemComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-lateral/botao-lateral.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BotaoLateralComponent } from './botao-lateral.component'; 4 | 5 | describe('BotaoLateralComponent', () => { 6 | let component: BotaoLateralComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BotaoLateralComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BotaoLateralComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/postagem-tema/postagem-tema.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { PostagemTemaComponent } from './postagem-tema.component'; 4 | 5 | describe('PostagemTemaComponent', () => { 6 | let component: PostagemTemaComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ PostagemTemaComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(PostagemTemaComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /tmp 5 | /out-tsc 6 | # Only exists if Bazel was run 7 | /bazel-out 8 | 9 | # dependencies 10 | /node_modules 11 | 12 | # profiling files 13 | chrome-profiler-events*.json 14 | speed-measure-plugin*.json 15 | 16 | # IDEs and editors 17 | /.idea 18 | .project 19 | .classpath 20 | .c9/ 21 | *.launch 22 | .settings/ 23 | *.sublime-workspace 24 | 25 | # IDE - VSCode 26 | .vscode/* 27 | !.vscode/settings.json 28 | !.vscode/tasks.json 29 | !.vscode/launch.json 30 | !.vscode/extensions.json 31 | .history/* 32 | 33 | # misc 34 | /.sass-cache 35 | /connect.lock 36 | /coverage 37 | /libpeerconnection.log 38 | npm-debug.log 39 | yarn-error.log 40 | testem.log 41 | /typings 42 | 43 | # System Files 44 | .DS_Store 45 | Thumbs.db 46 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-postagem/delete-postagem.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DeletePostagemComponent } from './delete-postagem.component'; 4 | 5 | describe('DeletePostagemComponent', () => { 6 | let component: DeletePostagemComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ DeletePostagemComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(DeletePostagemComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { faFacebook } from '@fortawesome/free-brands-svg-icons' 3 | import { faInstagram } from '@fortawesome/free-brands-svg-icons' 4 | import { faLinkedin } from '@fortawesome/free-brands-svg-icons' 5 | import { Router } from '@angular/router'; 6 | import { AuthService } from "./../service/auth.service"; 7 | 8 | @Component({ 9 | selector: 'app-footer', 10 | templateUrl: './footer.component.html', 11 | styleUrls: ['./footer.component.css'] 12 | }) 13 | export class FooterComponent implements OnInit { 14 | 15 | faFacebook = faFacebook 16 | faInstagram = faInstagram 17 | faLinkedin = faLinkedin 18 | 19 | constructor( 20 | private router: Router, 21 | public auth: AuthService 22 | ) { } 23 | 24 | ngOnInit(): void { 25 | } 26 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: { 11 | context(path: string, deep?: boolean, filter?: RegExp): { 12 | keys(): string[]; 13 | (id: string): T; 14 | }; 15 | }; 16 | 17 | // First, initialize the Angular testing environment. 18 | getTestBed().initTestEnvironment( 19 | BrowserDynamicTestingModule, 20 | platformBrowserDynamicTesting() 21 | ); 22 | // Then we find all the tests. 23 | const context = require.context('./', true, /\.spec\.ts$/); 24 | // And load the modules. 25 | context.keys().map(context); 26 | -------------------------------------------------------------------------------- /docs/js/tabs.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var tabs = document.getElementsByClassName('nav-tabs'), 3 | updateAddress = function(e) { 4 | if(history.pushState && e.target.dataset.link) { 5 | history.pushState(null, null, '#' + e.target.dataset.link); 6 | } 7 | }; 8 | if (tabs.length > 0) { 9 | tabs = tabs[0].querySelectorAll('li'); 10 | for (var i = 0; i < tabs.length; i++) { 11 | tabs[i].addEventListener('click', updateAddress); 12 | var linkTag = tabs[i].querySelector('a'); 13 | if (location.hash !== '') { 14 | var currentHash = location.hash.substr(1); 15 | if (currentHash === linkTag.dataset.link) { 16 | linkTag.click(); 17 | } 18 | } 19 | } 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/model/UserLoginModel.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.model; 2 | 3 | public class UserLoginModel { 4 | 5 | private String nome; 6 | 7 | private String usuario; 8 | 9 | private String senha; 10 | 11 | private String token; 12 | 13 | public String getNome() { 14 | return nome; 15 | } 16 | 17 | public void setNome(String nome) { 18 | this.nome = nome; 19 | } 20 | 21 | public String getUsuario() { 22 | return usuario; 23 | } 24 | 25 | public void setUsuario(String usuario) { 26 | this.usuario = usuario; 27 | } 28 | 29 | public String getSenha() { 30 | return senha; 31 | } 32 | 33 | public void setSenha(String senha) { 34 | this.senha = senha; 35 | } 36 | 37 | public String getToken() { 38 | return token; 39 | } 40 | 41 | public void setToken(String token) { 42 | this.token = token; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/feed/feed.component.css: -------------------------------------------------------------------------------- 1 | /* CARDS TEMAS */ 2 | 3 | #temas .card { 4 | height: 12rem; 5 | width: 12rem; 6 | } 7 | 8 | .card-title{ 9 | z-index: 1; 10 | text-shadow: 2px 2px 0px rgba(0,0,0,0.2); 11 | } 12 | 13 | .subir-card { 14 | transition: 0.3s; 15 | } 16 | 17 | .subir-card:hover { 18 | transform: scale(1.05); 19 | } 20 | 21 | /* POSTAGENS */ 22 | 23 | .icon { 24 | width: 25px; 25 | } 26 | 27 | #settings-post a:hover{ 28 | font-weight: bold; 29 | } 30 | 31 | .dropdown-menu { 32 | min-width: inherit; 33 | } 34 | 35 | /* CORES */ 36 | 37 | .seiva-pink { 38 | color: #d90b31; 39 | } 40 | 41 | .seiva-vinho { 42 | color: #A8262C; 43 | } 44 | 45 | /* MEDIA QUERIES */ 46 | 47 | @media (max-width: 991px){ 48 | .card-columns { 49 | column-count: 2; 50 | } 51 | } 52 | 53 | @media (max-width: 575px){ 54 | .card-columns { 55 | column-count: 1; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /docs/js/routes/routes_index.js: -------------------------------------------------------------------------------- 1 | var ROUTES_INDEX = {"name":"","kind":"module","className":"AppModule","children":[{"name":"routes","filename":"src/app/app-routing.module.ts","module":"AppRoutingModule","children":[{"path":"","redirectTo":"home-inicio","pathMatch":"full"},{"path":"home-inicio","component":"HomeInicioComponent"},{"path":"equipe","component":"EquipeComponent"},{"path":"sobre","component":"SobreComponent"},{"path":"feed","component":"FeedComponent"},{"path":"feed/:id","component":"FeedComponent"},{"path":"postagem-tema/:id","component":"PostagemTemaComponent"},{"path":"cadastro-tema","component":"PostTemaComponent"},{"path":"admin","component":"AdminComponent"},{"path":"editar-postagem/:id","component":"PutPostagemComponent"},{"path":"deletar-postagem/:id","component":"DeletePostagemComponent"},{"path":"editar-tema/:id","component":"PutTemaComponent"},{"path":"deletar-tema/:id","component":"DeleteTemaComponent"}],"kind":"module"}]} 2 | -------------------------------------------------------------------------------- /docs/images/coverage-badge-documentation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | documentation 7 | 0% 8 | 9 | 10 | -------------------------------------------------------------------------------- /front-end/seivaVisual/.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 1 Chrome version 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line. 18 | not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. 19 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/alerts.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal'; 3 | import { AlertsComponent } from '../alerts/alerts.component'; 4 | 5 | 6 | @Injectable({ 7 | providedIn: 'root' 8 | }) 9 | export class AlertsService { 10 | 11 | constructor( 12 | private bsModalService: BsModalService 13 | ) { } 14 | 15 | private showAlert (message: string, type: string){ 16 | const bsModalRef: BsModalRef = this.bsModalService.show(AlertsComponent) 17 | bsModalRef.content.type = type 18 | bsModalRef.content.message = message 19 | } 20 | 21 | showAlertDanger(message: string){ 22 | this.showAlert(message, "danger") 23 | } 24 | 25 | showAlertSuccess(message: string){ 26 | this.showAlert(message, "success") 27 | } 28 | 29 | showAlertInfo(message: string){ 30 | this.showAlert(message, "info") 31 | } 32 | 33 | } 34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/js/libs/custom-elements-es5-adapter.js: -------------------------------------------------------------------------------- 1 | /** 2 | @license @nocompile 3 | Copyright (c) 2018 The Polymer Project Authors. All rights reserved. 4 | This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | Code distributed by Google as part of the polymer project is also 8 | subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | (function () { 11 | 'use strict'; 12 | 13 | (function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.hasOwnProperty('polyfillWrapFlushCallback'))return;const a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)},HTMLElement.prototype=a.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,a);})(); 14 | 15 | }()); 16 | -------------------------------------------------------------------------------- /front-end/seivaVisual/e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | browserName: 'chrome' 17 | }, 18 | directConnect: true, 19 | baseUrl: 'http://localhost:4200/', 20 | framework: 'jasmine', 21 | jasmineNodeOpts: { 22 | showColors: true, 23 | defaultTimeoutInterval: 30000, 24 | print: function() {} 25 | }, 26 | onPrepare() { 27 | require('ts-node').register({ 28 | project: require('path').join(__dirname, './tsconfig.json') 29 | }); 30 | jasmine.getEnv().addReporter(new SpecReporter({ 31 | spec: { 32 | displayStacktrace: StacktraceOption.PRETTY 33 | } 34 | })); 35 | } 36 | }; -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/navbar/navbar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { UserLogin } from '../model/UserLogin'; 4 | import { AuthService } from '../service/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-navbar', 8 | templateUrl: './navbar.component.html', 9 | styleUrls: ['./navbar.component.css'] 10 | }) 11 | export class NavbarComponent implements OnInit { 12 | 13 | userLogin: UserLogin = new UserLogin() 14 | 15 | constructor( 16 | private router: Router, 17 | public auth: AuthService 18 | ) { } 19 | 20 | ngOnInit(): void { 21 | } 22 | 23 | entrar() { 24 | this.auth.logar(this.userLogin).subscribe((resp: UserLogin) => { 25 | this.userLogin = resp 26 | localStorage.setItem("token", this.userLogin.token) 27 | localStorage.setItem("email", this.userLogin.usuario) 28 | this.router.navigate(["/feed"]) 29 | }) 30 | } 31 | 32 | sair(){ 33 | this.router.navigate(['/home-inicio']) 34 | localStorage.clear() 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /docs/styles/original.css: -------------------------------------------------------------------------------- 1 | .navbar-default .navbar-brand, .menu ul.list li.title { 2 | font-weight: bold; 3 | color: #3c3c3c; 4 | padding-bottom: 5px; 5 | } 6 | 7 | .menu ul.list li a[data-type="chapter-link"], .menu ul.list li.chapter .simple { 8 | font-weight: bold; 9 | border-top: 1px solid #ddd; 10 | border-bottom: 1px solid #ddd; 11 | font-size: 14px; 12 | } 13 | 14 | .menu ul.list li a[href="./routes.html"] { 15 | border-bottom: none; 16 | } 17 | 18 | .menu ul.list > li:nth-child(2) { 19 | display: none; 20 | } 21 | 22 | .menu ul.list li.chapter ul.links { 23 | background: #fff; 24 | padding-left: 0; 25 | } 26 | 27 | .menu ul.list li.chapter ul.links li { 28 | border-bottom: 1px solid #ddd; 29 | padding-left: 20px; 30 | } 31 | 32 | .menu ul.list li.chapter ul.links li:last-child { 33 | border-bottom: none; 34 | } 35 | 36 | .menu ul.list li a.active { 37 | color: inherit; 38 | font-weight: bold; 39 | } 40 | 41 | #book-search-input { 42 | margin-bottom: 0; 43 | border-bottom: none; 44 | } 45 | .menu ul.list li.divider { 46 | margin: 0; 47 | } 48 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/seguranca/UserDetailsServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.seguranca; 2 | 3 | import java.util.Optional; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.core.userdetails.UserDetails; 7 | import org.springframework.security.core.userdetails.UserDetailsService; 8 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 9 | import org.springframework.stereotype.Service; 10 | 11 | import com.redeSocial.seiva.model.UsuarioModel; 12 | import com.redeSocial.seiva.repository.UsuarioRepository; 13 | 14 | @Service 15 | public class UserDetailsServiceImpl implements UserDetailsService{ 16 | 17 | @Autowired 18 | private UsuarioRepository userRepository; 19 | 20 | @Override 21 | public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { 22 | Optional user = userRepository.findByUsuario(userName); 23 | user.orElseThrow(() -> new UsernameNotFoundException(userName + " not found.")); 24 | 25 | return user.map(UserDetailsImpl::new).get(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /front-end/seivaVisual/README.md: -------------------------------------------------------------------------------- 1 | # SeivaVisual 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.7. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 28 | -------------------------------------------------------------------------------- /front-end/seivaVisual/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, './coverage/seivaVisual'), 20 | reports: ['html', 'lcovonly', 'text-summary'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false, 30 | restartOnFileChange: true 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/tema.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpHeaders, HttpClient } from '@angular/common/http'; 3 | import { Tema } from '../model/Tema'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class TemaService { 9 | 10 | constructor(private http: HttpClient) { } 11 | 12 | token = { 13 | headers: new HttpHeaders().set('Authorization', localStorage.getItem('token')) 14 | } 15 | 16 | getAllTemas() { 17 | return this.http.get('http://localhost:9000/tema', this.token) 18 | } 19 | 20 | getByIdTema(id: number) { 21 | return this.http.get(`http://localhost:9000/tema/${id}`, this.token) 22 | } 23 | 24 | getByNomeTema(descricao: string){ 25 | return this.http.get(`http://localhost:9000/tema/descricao/${descricao}`, this.token) 26 | } 27 | 28 | postTema(tema: Tema) { 29 | return this.http.post('http://localhost:9000/tema', tema, this.token) 30 | } 31 | 32 | putTema(tema: Tema) { 33 | return this.http.put('http://localhost:9000/tema', tema, this.token) 34 | } 35 | 36 | deleteTema(id: number){ 37 | return this.http.delete(`http://localhost:9000/tema/${id}`, this.token) 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async(() => { 7 | TestBed.configureTestingModule({ 8 | imports: [ 9 | RouterTestingModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | }).compileComponents(); 15 | })); 16 | 17 | it('should create the app', () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.componentInstance; 20 | expect(app).toBeTruthy(); 21 | }); 22 | 23 | it(`should have as title 'seivaVisual'`, () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | const app = fixture.componentInstance; 26 | expect(app.title).toEqual('seivaVisual'); 27 | }); 28 | 29 | it('should render title', () => { 30 | const fixture = TestBed.createComponent(AppComponent); 31 | fixture.detectChanges(); 32 | const compiled = fixture.nativeElement; 33 | expect(compiled.querySelector('.content span').textContent).toContain('seivaVisual app is running!'); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /seivadeploy/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | services: 3 | db: 4 | command: mysqld --default-authentication-plugin=mysql_native_password 5 | restart: always 6 | build: 7 | context: . 8 | dockerfile: Dockerfile 9 | environment: 10 | TZ: America/Sao_Paulo 11 | MYSQL_ROOT_PASSWORD: root 12 | MYSQL_USER: root 13 | MYSQL_PASSWORD: root 14 | MYSQL_DATABASE: db_seiva 15 | ports: 16 | - "3308:3306" 17 | networks: 18 | - generation-network 19 | seiva-api: 20 | restart: always 21 | build: ./seiva-api 22 | working_dir: /seiva-api 23 | environment: 24 | TZ: America/Sao_Paulo 25 | SPRING_BOOT_ENVIRONMENT: Production 26 | volumes: 27 | - ./seiva-api:/seiva-api 28 | - ~/.m2:/root/.m2 29 | ports: 30 | - "9000:8080" 31 | command: mvn clean spring-boot:run 32 | links: 33 | - db 34 | depends_on: 35 | - db 36 | networks: 37 | - generation-network 38 | seivaVisual: 39 | image: nginx 40 | volumes: 41 | - ../front-end/seivaVisual/dist/seivaVisual:/usr/share/nginx/html/ 42 | ports: 43 | - "4200:80" 44 | networks: 45 | - generation-network 46 | networks: 47 | generation-network: 48 | driver: bridge -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/home-inicio/home-inicio.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { AuthService } from "./../service/auth.service"; 3 | import { Router } from '@angular/router'; 4 | import { UserLogin } from '../model/UserLogin'; 5 | import { AlertsService } from '../service/alerts.service'; 6 | 7 | @Component({ 8 | selector: 'app-home-inicio', 9 | templateUrl: './home-inicio.component.html', 10 | styleUrls: ['./home-inicio.component.css'] 11 | }) 12 | export class HomeInicioComponent implements OnInit { 13 | 14 | userLogin: UserLogin = new UserLogin() 15 | 16 | constructor( 17 | private authService: AuthService, 18 | private router: Router, 19 | private alert: AlertsService 20 | ){} 21 | 22 | ngOnInit() { 23 | window.scroll(0, 0); 24 | } 25 | 26 | entrar() { 27 | this.authService.logar(this.userLogin).subscribe((resp: UserLogin) => { 28 | this.userLogin = resp 29 | localStorage.setItem("token", this.userLogin.token) 30 | localStorage.setItem("email", this.userLogin.usuario) 31 | this.router.navigate(["/feed"]) 32 | }, err => { 33 | if (err.status == '500'){ 34 | this.alert.showAlertDanger('E-mail ou senha inválidos, tente novamente!') 35 | } 36 | }) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /docs/styles/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section { 29 | display: block; 30 | } 31 | body { 32 | line-height: 1; 33 | } 34 | ol, ul { 35 | list-style: none; 36 | } 37 | blockquote, q { 38 | quotes: none; 39 | } 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: ''; 43 | content: none; 44 | } 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-tema/delete-tema.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
Tem certeza que deseja apagar esse tema?
8 | 9 | 10 |
11 | 12 | 13 |
14 | 15 | 16 | 17 |
18 |
19 | 21 | 23 |
24 |
25 | 26 | 27 |
28 | 29 |
30 | 31 |
32 | 33 | -------------------------------------------------------------------------------- /Entregas/DescricaoCRUDTema.md: -------------------------------------------------------------------------------- 1 | 05/08 2 | 3 | # Descrição CRUD Tema 4 | 5 | | Métodos | End-points | Descrição | 6 | |----------|--------------|----------| 7 | | Get | /tema | Listar todos os temas existentes 8 | | Get | /tema/{id} | Listar tema específico pelo ID 9 | | Get | /tema/descricao/{descricao} | Listar um tema específico pela Descricao 10 | | Post | /tema | Inserir os dados 11 | | Put | /tema | Editar algum dado específico 12 | | Delete | /tema/{id} | Excluir algum dado pelo ID 13 | 14 | A tabela possuirá os end-points básicos (get, post, put e delete) e mais dois métodos específicos, que buscam pelo id e pela descrição. 15 | 16 | ## Json 17 | 18 | ```json 19 | { 20 | "id": 1, 21 | "descricao": "Eventos", 22 | "postagem": [ 23 | { 24 | "id": 1, 25 | "titulo": "Teste", 26 | "data": "2020-08-06T14:01:00.943+00:00", 27 | "descricao": "Grupo Giramundo celebra 50 anos com maratona de teatro online", 28 | "usuario": null 29 | }, 30 | { 31 | "id": 2, 32 | "titulo": "Vagas", 33 | "data": "2020-08-06T14:03:09.002+00:00", 34 | "descricao": "teste", 35 | "usuario": null 36 | } 37 | ] 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /docs/js/libs/innersvg.js: -------------------------------------------------------------------------------- 1 | /** 2 | * innerHTML property for SVGElement 3 | * Copyright(c) 2010, Jeff Schiller 4 | * 5 | * Licensed under the Apache License, Version 2 6 | * 7 | * Minor modifications by Chris Price to only polyfill when required. 8 | */ 9 | !function(e){if(e&&!("innerHTML"in e.prototype)){var t=function(e,r){var i=e.nodeType;if(3==i)r.push(e.textContent.replace(/&/,"&").replace(/",">"));else if(1==i){if(r.push("<",e.tagName),e.hasAttributes())for(var n=e.attributes,s=0,o=n.length;s");for(var h=e.childNodes,s=0,o=h.length;s")}else r.push("/>")}else{if(8!=i)throw"Error serializing XML. Unhandled node of type: "+i;r.push("\x3c!--",e.nodeValue,"--\x3e")}};Object.defineProperty(e.prototype,"innerHTML",{get:function(){for(var e=[],r=this.firstChild;r;)t(r,e),r=r.nextSibling;return e.join("")},set:function(e){for(;this.firstChild;)this.removeChild(this.firstChild);try{var t=new DOMParser;t.async=!1,sXML=""+e+"";for(var r=t.parseFromString(sXML,"text/xml").documentElement.firstChild;r;)this.appendChild(this.ownerDocument.importNode(r,!0)),r=r.nextSibling}catch(e){throw new Error("Error parsing XML string")}}})}}((0,eval)("this").SVGElement); -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/cadastro/cadastro.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { User } from '../model/User'; 3 | import { AuthService } from '../service/auth.service'; 4 | import { Router } from '@angular/router'; 5 | import { AlertsService } from '../service/alerts.service'; 6 | 7 | 8 | @Component({ 9 | selector: 'app-cadastro', 10 | templateUrl: './cadastro.component.html', 11 | styleUrls: ['./cadastro.component.css'] 12 | }) 13 | export class CadastroComponent implements OnInit { 14 | 15 | user : User = new User(); 16 | senha: string; 17 | 18 | constructor( 19 | private authService: AuthService, 20 | private router: Router, 21 | private alert: AlertsService 22 | ) { } 23 | 24 | ngOnInit(): void { 25 | } 26 | 27 | conferirSenha(event: any){ 28 | this.senha = event.target.value 29 | } 30 | 31 | cadastrar(){ 32 | if(this.senha === this.user.senha){ 33 | this.authService.cadastrar(this.user).subscribe((resp: User) => { 34 | this.user = resp 35 | this.router.navigate(["/home-inicio"]) 36 | this.alert.showAlertSuccess("Usuário cadastrado com sucesso!") 37 | }) 38 | } else { 39 | this.alert.showAlertDanger("Suas senhas não conferem") 40 | } 41 | } 42 | 43 | subir(){ 44 | window.scroll(0,0); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /docs/styles/stripe.css: -------------------------------------------------------------------------------- 1 | .navbar-default .navbar-brand { 2 | color: #0099e5; 3 | } 4 | 5 | .menu ul.list li a[data-type="chapter-link"], .menu ul.list li.chapter .simple { 6 | color: #939da3; 7 | text-transform: uppercase; 8 | } 9 | 10 | .content h1, .content h2, .content h3, .content h4, .content h5 { 11 | color: #292e31; 12 | font-weight: normal; 13 | } 14 | 15 | .content { 16 | color: #4c555a; 17 | } 18 | 19 | .menu ul.list li.title { 20 | padding: 5px 0; 21 | } 22 | 23 | a { 24 | color: #0099e5; 25 | text-decoration: none; 26 | } 27 | a:hover { 28 | color: #292e31; 29 | text-decoration: none; 30 | } 31 | 32 | .menu ul.list li:nth-child(2) { 33 | margin-top: 0; 34 | } 35 | 36 | .menu ul.list li.title a, .navbar a { 37 | color: #0099e5; 38 | text-decoration: none; 39 | font-size: 16px; 40 | } 41 | 42 | .menu ul.list li a.active { 43 | color: #0099e5; 44 | } 45 | 46 | code { 47 | box-sizing: border-box; 48 | display: inline-block; 49 | padding: 0 5px; 50 | background: #fafcfc; 51 | border-radius: 4px; 52 | color: #b93d6a; 53 | font-size: 13px; 54 | line-height: 20px 55 | } 56 | 57 | pre { 58 | margin: 0; 59 | padding: 12px 12px; 60 | background: #272b2d; 61 | border-radius: 5px; 62 | font-size: 13px; 63 | line-height: 1.5em; 64 | font-weight: 500 65 | } 66 | -------------------------------------------------------------------------------- /Entregas/DescricaoAngular.md: -------------------------------------------------------------------------------- 1 | 30/07 2 | 3 | # SEIVA: Construção do Front-end em Angular 4 | 5 | Aqui está a descrição da construção do nosso front-end da Rede Social Seiva, onde 6 | 7 |
8 | 9 | ## Instalação 10 | 11 | - ng install -g @angular/cli (instalação) 12 | - ng —version (consulta de instalação) 13 | 14 | OBS: É necessária a instalação do node.js na máquina. 15 | 16 |
17 | 18 | ## Configuração 19 | 20 | - ng new (criar novo projeto em Angular) 21 | - ng serve (inicializar o servidor) 22 | - ctrl + c (parar o servidor) 23 | - ng generate component OU ng g c (gerar um componente) 24 | 25 |
26 | 27 | ## Instalações necessárias para o projeto 28 | 29 | - npm install bootstrap@latest --save 30 | - npm install jquery@latest --save 31 | - npm install popper.js --save 32 | - ng add @fortawesome/angular-fontawesome 33 | 34 |
35 | 36 | ## Configurações no arquivo angular.json 37 | 38 | "styles": [ 39 | "src/styles.css", 40 | "./node_modules/bootstrap/dist/css/bootstrap.min.css" 41 | ], 42 | "scripts": [ 43 | "./node_modules/jquery/dist/jquery.js", 44 | "./node_modules/bootstrap/dist/js/bootstrap.js", 45 | "./node_modules/popper.js/dist/umd/popper.min.js" 46 | ] 47 | 48 | 49 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-tema/delete-tema.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Tema } from '../model/Tema'; 3 | import { TemaService } from '../service/tema.service'; 4 | import { Router, ActivatedRoute } from '@angular/router'; 5 | import { AlertsService } from '../service/alerts.service'; 6 | 7 | @Component({ 8 | selector: 'app-delete-tema', 9 | templateUrl: './delete-tema.component.html', 10 | styleUrls: ['./delete-tema.component.css'] 11 | }) 12 | export class DeleteTemaComponent implements OnInit { 13 | 14 | tema: Tema = new Tema() 15 | 16 | constructor( 17 | private temaService: TemaService, 18 | private router: Router, 19 | private route: ActivatedRoute, 20 | private alert: AlertsService 21 | ) { } 22 | 23 | ngOnInit() { 24 | window.scroll(0,0) 25 | let id:number = this.route.snapshot.params["id"]; 26 | this.findByIdTema(id) 27 | 28 | } 29 | 30 | findByIdTema(id:number){ 31 | this.temaService.getByIdTema(id).subscribe((resp: Tema)=>{ 32 | this.tema = resp 33 | }); 34 | } 35 | 36 | btnSim() { 37 | this.temaService.deleteTema(this.tema.id).subscribe(() => { 38 | this.router.navigate(['/feed']) 39 | this.alert.showAlertSuccess('Tema apagado com sucesso!') 40 | }) 41 | } 42 | 43 | btnNao() { 44 | this.router.navigate(['/cadastro-tema']) 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-tema/put-tema.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Tema } from '../model/Tema'; 3 | import { TemaService } from '../service/tema.service'; 4 | import { Router, ActivatedRoute } from '@angular/router'; 5 | import { AlertsService } from '../service/alerts.service'; 6 | 7 | @Component({ 8 | selector: 'app-put-tema', 9 | templateUrl: './put-tema.component.html', 10 | styleUrls: ['./put-tema.component.css'] 11 | }) 12 | export class PutTemaComponent implements OnInit { 13 | 14 | tema: Tema = new Tema() 15 | 16 | constructor( 17 | private temaService: TemaService, 18 | private router: Router, 19 | private route: ActivatedRoute, 20 | private alert: AlertsService 21 | ) { } 22 | 23 | ngOnInit() { 24 | window.scroll(0,0) 25 | let id: number = this.route.snapshot.params["id"]; 26 | this.findByIdTema(id); 27 | } 28 | 29 | findByIdTema(id: number) { 30 | this.temaService.getByIdTema(id).subscribe((resp: Tema) => { 31 | this.tema = resp; 32 | }) 33 | } 34 | 35 | salvar() { 36 | this.temaService.putTema(this.tema).subscribe((resp: Tema) => { 37 | this.tema = resp 38 | this.router.navigate(['/feed']) 39 | this.alert.showAlertSuccess('Tema atualizado com sucesso!') 40 | }) 41 | } 42 | 43 | btnNao() { 44 | this.router.navigate(['/cadastro-tema']) 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { User } from '../model/User'; 4 | import { UserLogin } from '../model/UserLogin'; 5 | 6 | @Injectable({ 7 | providedIn: 'root' 8 | }) 9 | export class AuthService { 10 | 11 | constructor(private http: HttpClient) { } 12 | 13 | logar(userLogin: UserLogin) { 14 | return this.http.post('http://localhost:9000/usuario/logar', userLogin) 15 | } 16 | cadastrar (user: User) { 17 | return this.http.post('http://localhost:9000/usuario/cadastrar', user) 18 | } 19 | 20 | btnSair(){ 21 | let ok = false 22 | let token = localStorage.getItem('token') 23 | 24 | if (token != null) { 25 | ok = true 26 | } 27 | 28 | return ok 29 | } 30 | 31 | admin(){ 32 | let ok = false 33 | let email = localStorage.getItem('email') 34 | 35 | if(email == 'admin@admin.com'){ 36 | ok = true 37 | } 38 | return ok 39 | } 40 | 41 | navbarLogado(){ 42 | let ok = false 43 | let token = localStorage.getItem('token') 44 | 45 | if (token != null){ 46 | ok = true 47 | } 48 | return ok 49 | } 50 | 51 | navbarHome(){ 52 | let ok = false 53 | let token = localStorage.getItem('token') 54 | 55 | if (token == null){ 56 | ok = true 57 | } 58 | return ok 59 | } 60 | 61 | } 62 | 63 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-postagem/delete-postagem.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Postagem } from '../model/Postagem'; 3 | import { PostagemService } from '../service/postagem.service'; 4 | import { Router, ActivatedRoute } from '@angular/router'; 5 | import { AlertsService } from '../service/alerts.service'; 6 | 7 | @Component({ 8 | selector: 'app-delete-postagem', 9 | templateUrl: './delete-postagem.component.html', 10 | styleUrls: ['./delete-postagem.component.css'] 11 | }) 12 | export class DeletePostagemComponent implements OnInit { 13 | 14 | postagem: Postagem = new Postagem() 15 | 16 | 17 | constructor( 18 | private postagemService: PostagemService, 19 | private router: Router, 20 | private route: ActivatedRoute, 21 | private alert: AlertsService 22 | ) { } 23 | 24 | ngOnInit() { 25 | window.scroll(0,0) 26 | let id: number = this.route.snapshot.params['id'] 27 | this.findByIdPostagem(id) 28 | } 29 | 30 | findByIdPostagem(id:number){ 31 | this.postagemService.getByIdPostagem(id).subscribe((resp: Postagem) => { 32 | this.postagem=resp 33 | }) 34 | } 35 | 36 | btnSim() { 37 | this.postagemService.deletePostagem(this.postagem.id).subscribe(() => { 38 | this.router.navigate(['/feed']) 39 | this.alert.showAlertSuccess('Postagem apagada com sucesso!') 40 | }) 41 | } 42 | 43 | btnNao(){ 44 | this.router.navigate(['/feed']) 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /front-end/seivaVisual/dist/seivaVisual/runtime.e227d1a0e31cbccbf8ec.js: -------------------------------------------------------------------------------- 1 | !function(e){function r(r){for(var n,l,f=r[0],i=r[1],p=r[2],c=0,s=[];c Autentication(@RequestBody Optional user){ 28 | return usuarioService.Logar(user).map(resp -> ResponseEntity.ok(resp)) 29 | .orElse(ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()); 30 | 31 | } 32 | 33 | @PostMapping("/cadastrar") 34 | public ResponseEntity Post(@RequestBody UsuarioModel usuario){ 35 | return ResponseEntity.status(HttpStatus.CREATED).body(usuarioService.CadastrarUsuario(usuario)); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/post-tema/post-tema.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Tema } from '../model/Tema'; 3 | import { TemaService } from '../service/tema.service'; 4 | import { Router } from '@angular/router'; 5 | import { AlertsService } from '../service/alerts.service'; 6 | 7 | @Component({ 8 | selector: 'app-post-tema', 9 | templateUrl: './post-tema.component.html', 10 | styleUrls: ['./post-tema.component.css'] 11 | }) 12 | export class PostTemaComponent implements OnInit { 13 | tema: Tema = new Tema() 14 | listaTemas: Tema[] 15 | 16 | constructor( 17 | private temaService: TemaService, 18 | private router: Router, 19 | private alert: AlertsService 20 | ) { } 21 | 22 | ngOnInit() { 23 | this.findAllTemas(); 24 | window.scroll(0, 0); 25 | } 26 | 27 | findAllTemas() { 28 | this.temaService.getAllTemas().subscribe((resp: Tema[]) => { 29 | this.listaTemas = resp 30 | }) 31 | } 32 | 33 | findByIdTema() { 34 | this.temaService.getByIdTema(this.tema.id).subscribe((resp: Tema) => { 35 | this.tema = resp; 36 | }) 37 | } 38 | 39 | cadastrar() { 40 | if (this.tema.descricao == null || this.tema.imagem == null) { 41 | this.alert.showAlertInfo('Por favor, preencha todos os campos!') 42 | } else { 43 | this.temaService.postTema(this.tema).subscribe((resp: Tema) => { 44 | this.tema = resp 45 | this.router.navigate(['/feed']) 46 | this.alert.showAlertSuccess('Tema cadastrado com sucesso!') 47 | }) 48 | 49 | } 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/model/UsuarioModel.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.model; 2 | 3 | import java.util.List; 4 | 5 | import javax.persistence.CascadeType; 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.OneToMany; 11 | import javax.persistence.Table; 12 | import javax.validation.constraints.NotNull; 13 | 14 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 15 | 16 | @Entity 17 | @Table(name = "tb_usuario") 18 | public class UsuarioModel { 19 | 20 | @Id 21 | @GeneratedValue(strategy = GenerationType.IDENTITY) 22 | private long id; 23 | 24 | @NotNull 25 | private String nome; 26 | 27 | @NotNull 28 | private String usuario; 29 | 30 | @NotNull 31 | private String senha; 32 | 33 | @OneToMany(mappedBy = "usuario", cascade = CascadeType.PERSIST) 34 | @JsonIgnoreProperties("usuario") 35 | private List postagem; 36 | 37 | public long getId() { 38 | return id; 39 | } 40 | 41 | public void setId(long id) { 42 | this.id = id; 43 | } 44 | 45 | public String getNome() { 46 | return nome; 47 | } 48 | 49 | public void setNome(String nome) { 50 | this.nome = nome; 51 | } 52 | 53 | public String getUsuario() { 54 | return usuario; 55 | } 56 | 57 | public void setUsuario(String usuario) { 58 | this.usuario = usuario; 59 | } 60 | 61 | public String getSenha() { 62 | return senha; 63 | } 64 | 65 | public void setSenha(String senha) { 66 | this.senha = senha; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /DER/DescricaoDER.md: -------------------------------------------------------------------------------- 1 | 24/07 2 | 3 | # Descrição DER 4 | 5 | ## Relacionamento entre as tabelas 6 | 7 | | CADASTRO | POST 8 | |---:|:---| 9 | | Um login pode fazer vários posts | Um post só pode ter um único login 10 | | 1 | N 11 | 12 | | POST | TEMA 13 | |---:|:---| 14 | | Um post só pode ter um único tema | Um tema pode ter vários posts 15 | | N | 1 16 | 17 | ## Definição das tabelas 18 | 19 | ### Tabela Cadastro 20 | 21 | | Atributo | Tipo | 22 | |--------|--------------| 23 | | id | **[PK]** biginit 24 | | nome_completo | varchar (200) 25 | | email | varchar (200) 26 | | senha | varchar (20) 27 | 28 | Nome completo, email e senha serão pedidos ao usuário para criar um novo cadastro. Será gerada uma id própria automaticamente, que servirá para relacionar as atividades do usuário dentro da plataforma. 29 | 30 | ### Tabela Post 31 | 32 | | Atributo | Tipo | 33 | |--------|----------| 34 | | id | **[PK]** bigint 35 | | titulo | varchar (100) 36 | | data | datatime 37 | | descricao | varchar (500) 38 | | autor_id | **[FK]** biginit 39 | | tema_id | **[FK]** biginit 40 | 41 | O usuário não precisará entrar com a data, pois a rede se encarregará de pegar a hora do sistema. Estará formatado em “dd-MM-yyyy HH:mm:ss”. O usuário digitará o conteúdo do post no campo de descrição que podendo receber mais caracteres do que um varchar. Os demais campos serão essenciais para poder enviar o post, recebendo a id do autor e também do tema relacionado. Será gerada uma id própria do post. 42 | 43 | ### Tabela Tema 44 | 45 | | Atributo | Tipo | 46 | |--------|----------| 47 | | id | **[PK]** biginit 48 | | descricao | varchar (15) 49 | 50 | A tabela de temas possuirá um id representando cada tema e a descrição do tema em si. 51 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/postagem-tema/postagem-tema.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute, Router } from '@angular/router'; 3 | import { Tema } from '../model/Tema'; 4 | import { TemaService } from '../service/tema.service'; 5 | 6 | @Component({ 7 | selector: 'app-postagem-tema', 8 | templateUrl: './postagem-tema.component.html', 9 | styleUrls: ['./postagem-tema.component.css'], 10 | }) 11 | export class PostagemTemaComponent implements OnInit { 12 | key = 'data' 13 | reverse = true 14 | 15 | idTema: number; 16 | tema: Tema; 17 | listaTemas: Tema[]; 18 | nomeTema: string; 19 | descricao: string 20 | 21 | constructor( 22 | private router: Router, 23 | private route: ActivatedRoute, 24 | private temaService: TemaService 25 | ) {} 26 | 27 | ngOnInit() { 28 | this.idTema = this.route.snapshot.params['id']; 29 | this.findByIdTema(); 30 | window.scroll(0, 0); 31 | } 32 | 33 | findByIdTema() { 34 | this.temaService.getByIdTema(this.idTema).subscribe((resp: Tema) => { 35 | this.tema = resp; 36 | this.findByNomeTema(); 37 | }); 38 | } 39 | 40 | findByNomeTema() { 41 | this.temaService.getByNomeTema(this.tema.descricao).subscribe((resp: Tema[]) => { 42 | this.listaTemas = resp; 43 | // console.log(JSON.stringify(this.listaTemas)); 44 | }); 45 | } 46 | 47 | findByInput(){ 48 | this.temaService.getByNomeTema(this.nomeTema).subscribe((resp: Tema[]) => { 49 | this.listaTemas = resp; 50 | this.tema.descricao = this.nomeTema; 51 | window.scroll(0, 0) 52 | }) 53 | } 54 | 55 | voltar() { 56 | this.router.navigate(['/feed']); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/seguranca/UserDetailsImpl.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.seguranca; 2 | 3 | import java.util.Collection; 4 | 5 | import org.springframework.security.core.GrantedAuthority; 6 | import org.springframework.security.core.userdetails.UserDetails; 7 | 8 | import com.redeSocial.seiva.model.UsuarioModel; 9 | 10 | public class UserDetailsImpl implements UserDetails { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private String userName; 15 | 16 | private String password; 17 | 18 | public UserDetailsImpl(UsuarioModel user) { 19 | super(); 20 | this.userName = user.getUsuario(); 21 | this.password = user.getSenha(); 22 | } 23 | 24 | public UserDetailsImpl() { 25 | 26 | } 27 | 28 | @Override 29 | public Collection getAuthorities() { 30 | // TODO Auto-generated method stub 31 | return null; 32 | } 33 | 34 | @Override 35 | public String getPassword() { 36 | // TODO Auto-generated method stub 37 | return password; 38 | } 39 | 40 | @Override 41 | public String getUsername() { 42 | // TODO Auto-generated method stub 43 | return userName; 44 | } 45 | 46 | @Override 47 | public boolean isAccountNonExpired() { 48 | // TODO Auto-generated method stub 49 | return true; 50 | } 51 | 52 | @Override 53 | public boolean isAccountNonLocked() { 54 | // TODO Auto-generated method stub 55 | return true; 56 | } 57 | 58 | @Override 59 | public boolean isCredentialsNonExpired() { 60 | // TODO Auto-generated method stub 61 | return true; 62 | } 63 | 64 | @Override 65 | public boolean isEnabled() { 66 | // TODO Auto-generated method stub 67 | return true; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/model/TemaModel.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.model; 2 | 3 | import java.util.List; 4 | 5 | import javax.persistence.CascadeType; 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.OneToMany; 11 | import javax.persistence.Table; 12 | import javax.validation.constraints.NotNull; 13 | import javax.validation.constraints.Size; 14 | 15 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 16 | 17 | @Entity 18 | @Table(name = "tb_tema") 19 | public class TemaModel { 20 | 21 | @Id 22 | @GeneratedValue(strategy = GenerationType.IDENTITY) 23 | private long id; 24 | 25 | @NotNull 26 | @Size(min = 3, max = 15) 27 | private String descricao; 28 | 29 | private String imagem; 30 | 31 | private String descricaoImagem; 32 | 33 | @OneToMany(mappedBy = "tema", cascade = CascadeType.PERSIST) 34 | @JsonIgnoreProperties("tema") 35 | private List postagem; 36 | 37 | public long getId() { 38 | return id; 39 | } 40 | 41 | public void setId(long id) { 42 | this.id = id; 43 | } 44 | 45 | public String getDescricao() { 46 | return descricao; 47 | } 48 | 49 | public void setDescricao(String descricao) { 50 | this.descricao = descricao; 51 | } 52 | 53 | public String getImagem() { 54 | return imagem; 55 | } 56 | 57 | public void setImagem(String imagem) { 58 | this.imagem = imagem; 59 | } 60 | 61 | public List getPostagem() { 62 | return postagem; 63 | } 64 | 65 | public void setPostagem(List postagem) { 66 | this.postagem = postagem; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /docs/js/lazy-load-graphs.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var lazyGraphs = [].slice.call(document.querySelectorAll('[lazy]')); 3 | var active = false; 4 | 5 | var lazyLoad = function() { 6 | if (active === false) { 7 | active = true; 8 | 9 | setTimeout(function() { 10 | lazyGraphs.forEach(function(lazyGraph) { 11 | if ( 12 | lazyGraph.getBoundingClientRect().top <= window.innerHeight && 13 | lazyGraph.getBoundingClientRect().bottom >= 0 && 14 | getComputedStyle(lazyGraph).display !== 'none' 15 | ) { 16 | lazyGraph.data = lazyGraph.getAttribute('lazy'); 17 | lazyGraph.removeAttribute('lazy'); 18 | 19 | lazyGraphs = lazyGraphs.filter(function(image) { return image !== lazyGraph}); 20 | 21 | if (lazyGraphs.length === 0) { 22 | document.removeEventListener('scroll', lazyLoad); 23 | window.removeEventListener('resize', lazyLoad); 24 | window.removeEventListener('orientationchange', lazyLoad); 25 | } 26 | } 27 | }); 28 | 29 | active = false; 30 | }, 200); 31 | } 32 | }; 33 | 34 | // initial load 35 | lazyLoad(); 36 | 37 | var container = document.querySelector('.container-fluid.modules'); 38 | if (container) { 39 | container.addEventListener('scroll', lazyLoad); 40 | window.addEventListener('resize', lazyLoad); 41 | window.addEventListener('orientationchange', lazyLoad); 42 | } 43 | 44 | }); 45 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/service/UsuarioService.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.service; 2 | 3 | import java.nio.charset.Charset; 4 | import java.util.Optional; 5 | import org.apache.commons.codec.binary.Base64; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 9 | import org.springframework.stereotype.Service; 10 | 11 | import com.redeSocial.seiva.model.UserLoginModel; 12 | import com.redeSocial.seiva.model.UsuarioModel; 13 | import com.redeSocial.seiva.repository.UsuarioRepository; 14 | 15 | @Service 16 | public class UsuarioService { 17 | 18 | @Autowired 19 | private UsuarioRepository repository; 20 | 21 | public UsuarioModel CadastrarUsuario(UsuarioModel usuario) { 22 | BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 23 | 24 | String senhaEncoder = encoder.encode(usuario.getSenha()); 25 | usuario.setSenha(senhaEncoder); 26 | 27 | return repository.save(usuario); 28 | } 29 | 30 | public Optional Logar(Optional user){ 31 | BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 32 | Optional usuario = repository.findByUsuario(user.get().getUsuario()); 33 | 34 | if(usuario.isPresent()) { 35 | if(encoder.matches(user.get().getSenha(), usuario.get().getSenha())) { 36 | 37 | String auth = user.get().getUsuario() + ":" + user.get().getSenha(); 38 | byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII"))); 39 | String authHeader = "Basic " + new String(encodedAuth); 40 | 41 | user.get().setToken(authHeader); 42 | user.get().setNome(usuario.get().getNome()); 43 | 44 | return user; 45 | } 46 | } 47 | return null; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Entregas/DescricaoCRUDPostagem.md: -------------------------------------------------------------------------------- 1 | 06/08 2 | # Postagem 3 | 4 | ## Model 5 | 6 | | Atributo | Tipo | Qtd. Caracteres | 7 | |----------|------|-----| 8 | | id | [PK] bigint | 9 | | titulo | String | min = 5, max = 100 10 | | data | Date | 11 | | descricao | String | min = 5, max = 500 12 | | usuario_id | [FK] bigint 13 | | tema_id | [FK] bigint 14 | 15 | A tabela possuirá os atributos **ID**, **titulo**, **data** e **descrição** referente a cada postagem, mais as chaves estrangeiras **usuario** e **tema** onde irão fazer o link com esses. 16 | 17 | ## CRUD 18 | 19 | | Métodos | End-points | Descrição | 20 | |----------|--------------|----------| 21 | | Get | /postagem | Listar todas as postagens existentes 22 | | Get | /postagem/{id} | Listar postagem específica pelo ID 23 | | Get | /postagem/descricao/{descricao} | Listar uma postagem específica pela Descricao 24 | | Post | /postagem | Inserir os dados 25 | | Put | /postagem | Editar algum dado específico 26 | | Delete | /postagem/{id} | Excluir algum dado pelo ID 27 | 28 | A tabela possuirá os end-points básicos (get, post, put e delete) e mais dois métodos específicos, que buscam pelo id e pela descrição. 29 | 30 | ## Json 31 | 32 | ```json 33 | { 34 | "id": 1, 35 | "titulo": "Teste", 36 | "data": "2020-08-06T14:01:00.943+00:00", 37 | "descricao": "Grupo Giramundo celebra 50 anos com maratona de teatro online", 38 | "usuario": null, 39 | "tema": { 40 | "id": 1, 41 | "descricao": "Eventos" 42 | } 43 | }, 44 | { 45 | "id": 2, 46 | "titulo": "Vagas", 47 | "data": "2020-08-06T14:03:09.002+00:00", 48 | "descricao": "teste", 49 | "usuario": null, 50 | "tema": { 51 | "id": 1, 52 | "descricao": "Eventos" 53 | } 54 | } 55 | ``` 56 | 57 | -------------------------------------------------------------------------------- /Entregas/DescricaoSegurança.md: -------------------------------------------------------------------------------- 1 | 11/08 2 | 3 | # Descrição Usuário Model 4 | 5 | | Atributo | Tipo | Qtd. Caracteres | 6 | |----------|------|-----------------| 7 | | id | [PK] long 8 | | nome | String | min = 8, max = 200 9 | | usuario | String | min = 8, max = 200 10 | | senha | String | min = 6, max = 20 11 | 12 | A tabela possuirá os atributos **ID** referente ao código de cada usuário, **nome**, **usuario** e **senha**. 13 | 14 | ## CRUD 15 | 16 | | Métodos | End-points | Descrição | 17 | |----------|--------------|----------| 18 | | Post | /usuario/cadastrar | Cadastrar um novo usuário 19 | | Post | /usuario/logar | Logar um usuário existente 20 | 21 | Os caminhos para cadastrar e logar não precisam de autenticação por token. 22 | 23 | # Descrição da Camada de Segurança Basic 24 | 25 | Criada a model ```UserLoginModel```, que devolve os dados do usuário logado com o token de autenticação. 26 | 27 | ```UsuarioRepository``` com busca específica para determinado usuário. 28 | 29 | Criada a package ```Segurança``` com as classes ```BasicSecurityConfig```, ```UserDetailsImpl``` e ```UserDetailsServiceImpl```, aplicando as regras de negócio que foram determinadas na interface e restringindo a interação sem autenticação para os caminhos ```"/usuario/cadastrar"``` e ```"/usuario/logar"```. 30 | 31 | Criada a package ```Service``` com a classe ```UsuarioService``` que encripta a senha escolhida pelo usuário e guarda no banco de dados. 32 | 33 | ## Json 34 | 35 | ### Enviando dados para cadastrar 36 | 37 | ```json 38 | { 39 | "nome": "Flamingo", 40 | "usuario": "flamingo123", 41 | "senha": "flamingo123" 42 | } 43 | ``` 44 | 45 | ### Recebendo dados para logar 46 | 47 | ```json 48 | { 49 | "nome": "Flamingo", 50 | "usuario": "flamingo123", 51 | "senha": "flamingo123", 52 | "token": "Basic ZmxhbWluZ28xMjM6ZmxhbWluZ28xMjM=" 53 | } 54 | ``` -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/seguranca/BasicSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.seguranca; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 6 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 7 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 8 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 9 | import org.springframework.security.config.http.SessionCreationPolicy; 10 | import org.springframework.security.core.userdetails.UserDetailsService; 11 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 12 | import org.springframework.security.crypto.password.PasswordEncoder; 13 | 14 | @EnableWebSecurity 15 | public class BasicSecurityConfig extends WebSecurityConfigurerAdapter { 16 | 17 | @Autowired 18 | private UserDetailsService userDetailsService; 19 | 20 | @Override 21 | protected void configure(AuthenticationManagerBuilder auth) throws Exception { 22 | auth.userDetailsService(userDetailsService); 23 | } 24 | 25 | @Bean 26 | public PasswordEncoder passwordEncoder() { 27 | return new BCryptPasswordEncoder(); 28 | } 29 | 30 | @Override 31 | protected void configure(HttpSecurity http) throws Exception { 32 | http.authorizeRequests() 33 | .antMatchers("/usuario/logar").permitAll() 34 | .antMatchers("/usuario/cadastrar").permitAll() 35 | .anyRequest().authenticated() 36 | .and().httpBasic() 37 | .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 38 | .and().cors() 39 | .and().csrf().disable(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/delete-postagem/delete-postagem.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
Tem certeza que deseja apagar essa postagem?
8 | 9 | 10 |
11 | Imagem sobre {{postagem.tema.descricao}} 12 |
13 | 14 |
{{postagem.tema.descricao}}
15 |

{{postagem.titulo}}

16 | 17 |

{{postagem.descricao}}

18 | 19 | Postado em {{postagem.data | date:'dd/MM/yyyy'}} às 20 | {{postagem.data | date:'HH:mm'}} 21 |
22 |
23 | 24 | 25 | 26 |
27 |
28 | 30 | 31 | 33 |
34 |
35 | 36 | 37 |
38 |
39 |
40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | import { HomeInicioComponent } from './home-inicio/home-inicio.component'; 4 | import { EquipeComponent } from './equipe/equipe.component'; 5 | import { SobreComponent } from './sobre/sobre.component'; 6 | import { FeedComponent } from './feed/feed.component'; 7 | import { PostTemaComponent } from './post-tema/post-tema.component'; 8 | import { AdminComponent } from './admin/admin.component'; 9 | import { PutPostagemComponent } from './put-postagem/put-postagem.component'; 10 | import { DeletePostagemComponent } from './delete-postagem/delete-postagem.component'; 11 | import { PutTemaComponent } from './put-tema/put-tema.component'; 12 | import { DeleteTemaComponent } from './delete-tema/delete-tema.component'; 13 | import { PostagemTemaComponent } from './postagem-tema/postagem-tema.component'; 14 | 15 | const routes: Routes = [ 16 | { path: '', redirectTo: 'home-inicio', pathMatch: 'full' }, 17 | { path: 'home-inicio', component: HomeInicioComponent }, 18 | { path: 'equipe', component: EquipeComponent }, 19 | { path: 'sobre', component: SobreComponent }, 20 | { path: 'feed', component: FeedComponent }, 21 | { path: 'feed/:id', component: FeedComponent }, 22 | { path: 'postagem-tema/:id', component: PostagemTemaComponent }, 23 | { path: 'cadastro-tema', component: PostTemaComponent }, 24 | { path: 'admin', component: AdminComponent }, 25 | { path: 'editar-postagem/:id', component: PutPostagemComponent }, 26 | { path: 'deletar-postagem/:id', component: DeletePostagemComponent }, 27 | { path: 'editar-tema/:id', component: PutTemaComponent }, 28 | { path: 'deletar-tema/:id', component: DeleteTemaComponent } 29 | ]; 30 | 31 | @NgModule({ 32 | imports: [RouterModule.forRoot(routes)], 33 | exports: [RouterModule] 34 | }) 35 | export class AppRoutingModule { } 36 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-tema/put-tema.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
Tem certeza que deseja editar esse tema?
8 | 9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 19 |
20 | 21 |
22 | 23 | 25 |
26 | 27 | 28 | 29 |
30 |
31 | 33 | 35 |
36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/botao-lateral/botao-lateral.component.html: -------------------------------------------------------------------------------- 1 |
2 | clique 3 | 4 | 5 | 27 |
-------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/service/postagem.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders } from '@angular/common/http'; 3 | import { UserLogin } from '../model/UserLogin'; 4 | import { User } from '../model/User'; 5 | import { Postagem } from '../model/Postagem'; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class PostagemService { 11 | 12 | constructor(private http: HttpClient) { } 13 | 14 | logar(userLogin: UserLogin){ 15 | return this.http.post('http://localhost:9000/usuario/logar', userLogin) 16 | } 17 | 18 | cadastrar(user: User){ 19 | return this.http.post('http://localhost:9000/usuario/cadastrar', user) 20 | } 21 | 22 | token = { 23 | headers: new HttpHeaders().set('Authorization', localStorage.getItem('token')) 24 | } 25 | 26 | getAllPostagens() { 27 | return this.http.get('http://localhost:9000/postagem', this.token) 28 | } 29 | 30 | getByIdPostagem(id: number) { 31 | return this.http.get(`http://localhost:9000/postagem/${id}`, this.token) 32 | } 33 | 34 | postPostagem(postagem: Postagem) { 35 | return this.http.post('http://localhost:9000/postagem', postagem, this.token) 36 | } 37 | 38 | putPostagem(postagem: Postagem) { 39 | return this.http.put('http://localhost:9000/postagem', postagem, this.token) 40 | } 41 | 42 | deletePostagem(id: number){ 43 | return this.http.delete(`http://localhost:9000/postagem/${id}`, this.token) 44 | } 45 | 46 | getByTituloPostagem(descricao: string){ 47 | return this.http.get(`http://localhost:9000/postagem/descricao/${descricao}`, this.token) 48 | } 49 | 50 | btnSair(){ 51 | let ok = false 52 | let token = localStorage.getItem('token') 53 | 54 | if (token != null){ 55 | ok = true 56 | } 57 | 58 | return ok 59 | } 60 | 61 | btnLogin(){ 62 | let ok = false 63 | let token = localStorage.getItem('token') 64 | 65 | if (token == null){ 66 | ok = true 67 | } 68 | 69 | return ok 70 | } 71 | } -------------------------------------------------------------------------------- /docs/styles/vagrant.css: -------------------------------------------------------------------------------- 1 | .navbar-default .navbar-brand { 2 | background: white; 3 | color: #8d9ba8; 4 | } 5 | 6 | .menu .list { 7 | background: #0c5593; 8 | } 9 | 10 | .menu .chapter { 11 | padding: 0 20px; 12 | } 13 | 14 | .menu ul.list li a[data-type="chapter-link"], .menu ul.list li.chapter .simple { 15 | color: white; 16 | text-transform: uppercase; 17 | border-bottom: 1px solid rgba(255,255,255,0.4); 18 | } 19 | 20 | .content h1, .content h2, .content h3, .content h4, .content h5 { 21 | color: #292e31; 22 | font-weight: normal; 23 | } 24 | 25 | .content { 26 | color: #4c555a; 27 | } 28 | 29 | a { 30 | color: #0094bf; 31 | text-decoration: underline; 32 | } 33 | a:hover { 34 | color: #f1362f; 35 | } 36 | 37 | .menu ul.list li.title { 38 | background: white; 39 | padding-bottom: 5px; 40 | } 41 | 42 | .menu ul.list li:nth-child(2) { 43 | margin-top: 0; 44 | } 45 | 46 | .menu ul.list li:nth-last-child(2) { 47 | background: none; 48 | } 49 | 50 | .menu ul.list li.title a { 51 | padding: 10px 15px; 52 | } 53 | 54 | .menu ul.list li.title a, .navbar a { 55 | color: #8d9ba8; 56 | text-decoration: none; 57 | font-size: 16px; 58 | font-weight: 300; 59 | } 60 | 61 | .menu ul.list li a { 62 | color: white; 63 | padding: 10px; 64 | font-weight: 300; 65 | text-decoration: none; 66 | } 67 | .menu ul.list li a.active { 68 | color: white; 69 | font-weight: bold; 70 | } 71 | 72 | .copyright { 73 | color: white; 74 | background: #000; 75 | } 76 | 77 | code { 78 | box-sizing: border-box; 79 | display: inline-block; 80 | padding: 0 5px; 81 | background: rgba(0,148,191,0.1); 82 | border-radius: 3px; 83 | color: #0094bf; 84 | font-size: 13px; 85 | line-height: 20px; 86 | } 87 | 88 | pre { 89 | margin: 0; 90 | padding: 12px 12px; 91 | background: rgba(238,238,238,.35); 92 | border-radius: 3px; 93 | font-size: 13px; 94 | line-height: 1.5em; 95 | font-weight: 500; 96 | } 97 | -------------------------------------------------------------------------------- /front-end/seivaVisual/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "seiva-visual", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "test": "ng test", 9 | "lint": "ng lint", 10 | "e2e": "ng e2e", 11 | "compodoc": "npx compodoc -p tsconfig.base.json", 12 | "serve-compodoc": "npx compodoc -s tsconfig.json" 13 | }, 14 | "private": true, 15 | "dependencies": { 16 | "@angular/animations": "~10.0.11", 17 | "@angular/common": "~10.0.11", 18 | "@angular/compiler": "~10.0.11", 19 | "@angular/core": "~10.0.11", 20 | "@angular/forms": "~10.0.11", 21 | "@angular/platform-browser": "~10.0.11", 22 | "@angular/platform-browser-dynamic": "~10.0.11", 23 | "@angular/router": "~10.0.11", 24 | "@fortawesome/angular-fontawesome": "^0.7.0", 25 | "@fortawesome/fontawesome-svg-core": "^1.2.28", 26 | "@fortawesome/free-brands-svg-icons": "^5.13.0", 27 | "@fortawesome/free-regular-svg-icons": "^5.13.0", 28 | "@fortawesome/free-solid-svg-icons": "^5.13.0", 29 | "bootstrap": "^4.5.2", 30 | "jquery": "^3.5.1", 31 | "ngx-bootstrap": "^6.1.0", 32 | "ngx-order-pipe": "^2.1.0", 33 | "popper.js": "^1.16.1", 34 | "rxjs": "~6.5.5", 35 | "tslib": "^2.0.0", 36 | "zone.js": "~0.10.3" 37 | }, 38 | "devDependencies": { 39 | "@angular-devkit/build-angular": "~0.1000.7", 40 | "@angular/cli": "~10.0.7", 41 | "@angular/compiler-cli": "~10.0.11", 42 | "@types/node": "^12.11.1", 43 | "@types/jasmine": "~3.5.0", 44 | "@types/jasminewd2": "~2.0.3", 45 | "codelyzer": "^6.0.0", 46 | "jasmine-core": "~3.5.0", 47 | "jasmine-spec-reporter": "~5.0.0", 48 | "karma": "~5.0.0", 49 | "karma-chrome-launcher": "~3.1.0", 50 | "karma-coverage-istanbul-reporter": "~3.0.2", 51 | "karma-jasmine": "~3.3.0", 52 | "karma-jasmine-html-reporter": "^1.5.0", 53 | "protractor": "~7.0.0", 54 | "ts-node": "~8.3.0", 55 | "tslint": "~6.1.0", 56 | "typescript": "~3.9.5" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /docs/js/search/search-lunr.js: -------------------------------------------------------------------------------- 1 | (function(compodoc) { 2 | 3 | function LunrSearchEngine() { 4 | this.index = undefined; 5 | this.store = {}; 6 | this.name = 'LunrSearchEngine'; 7 | } 8 | 9 | LunrSearchEngine.prototype.init = function() { 10 | var that = this, 11 | d = new promise.Promise(); 12 | 13 | that.index = lunr.Index.load(COMPODOC_SEARCH_INDEX.index); 14 | that.store = COMPODOC_SEARCH_INDEX.store; 15 | d.done(); 16 | 17 | return d; 18 | }; 19 | 20 | LunrSearchEngine.prototype.search = function(q, offset, length) { 21 | var that = this, 22 | results = [], 23 | d = new promise.Promise(); 24 | 25 | if (this.index) { 26 | results = $.map(this.index.search('*' + q + '*'), function(result) { 27 | var doc = that.store[result.ref]; 28 | 29 | return { 30 | title: doc.title, 31 | url: doc.url, 32 | body: doc.summary || doc.body 33 | }; 34 | }); 35 | } 36 | 37 | d.done({ 38 | query: q, 39 | results: length === 0 ? results : results.slice(0, length), 40 | count: results.length 41 | }); 42 | 43 | return d; 44 | }; 45 | 46 | compodoc.addEventListener(compodoc.EVENTS.READY, function(event) { 47 | var engine = new LunrSearchEngine(), 48 | initialized = false; 49 | 50 | function query(q, offset, length) { 51 | if (!initialized) throw new Error('Search has not been initialized'); 52 | return engine.search(q, offset, length); 53 | } 54 | 55 | compodoc.search = { 56 | query: query 57 | }; 58 | 59 | engine.init() 60 | .then(function() { 61 | initialized = true; 62 | compodoc.dispatchEvent({ 63 | type: compodoc.EVENTS.SEARCH_READY 64 | }); 65 | }); 66 | }); 67 | })(compodoc); 68 | -------------------------------------------------------------------------------- /docs/styles/readthedocs.css: -------------------------------------------------------------------------------- 1 | .navbar-default { 2 | background: #2980B9; 3 | border: none; 4 | } 5 | 6 | .navbar-default .navbar-brand { 7 | color: #fcfcfc; 8 | } 9 | 10 | .menu { 11 | background: #343131; 12 | color: #fcfcfc; 13 | } 14 | 15 | .menu ul.list li a { 16 | color: #fcfcfc; 17 | } 18 | 19 | .menu ul.list li a.active { 20 | color: #0099e5; 21 | } 22 | 23 | .menu ul.list li.title { 24 | background: #2980B9; 25 | padding-bottom: 5px; 26 | } 27 | 28 | .menu ul.list li:nth-child(2) { 29 | margin-top: 0; 30 | } 31 | 32 | .menu ul.list li.chapter a, 33 | .menu ul.list li.chapter .simple { 34 | color: #555; 35 | text-transform: uppercase; 36 | text-decoration: none; 37 | } 38 | 39 | .menu ul.list li.chapter ul.links a { 40 | color: #b3b3b3; 41 | text-transform: none; 42 | padding-left: 35px; 43 | } 44 | 45 | .menu ul.list li.chapter ul.links a:hover { 46 | background: #4E4A4A; 47 | } 48 | 49 | .menu ul.list li.chapter ul.links { 50 | padding-left: 0; 51 | } 52 | 53 | .menu ul.list li.divider { 54 | background: rgba(255, 255, 255, 0.07); 55 | } 56 | 57 | #book-search-input input, 58 | #book-search-input input:focus, 59 | #book-search-input input:hover { 60 | color: #949494; 61 | } 62 | 63 | .copyright { 64 | color: #b3b3b3; 65 | background: #272525; 66 | } 67 | 68 | .content { 69 | background: #fcfcfc; 70 | } 71 | 72 | .content a { 73 | color: #2980B9; 74 | } 75 | 76 | .content a:hover { 77 | color: #3091d1; 78 | } 79 | 80 | .content a:visited { 81 | color: #9B59B6; 82 | } 83 | 84 | .menu ul.list li:nth-last-child(2) { 85 | background: none; 86 | } 87 | 88 | code { 89 | white-space: nowrap; 90 | max-width: 100%; 91 | background: #fff; 92 | padding: 2px 5px; 93 | color: #E74C3C; 94 | overflow-x: auto; 95 | border-radius: 0; 96 | } 97 | 98 | pre { 99 | white-space: pre; 100 | margin: 0; 101 | padding: 12px 12px; 102 | font-size: 12px; 103 | line-height: 1.5; 104 | display: block; 105 | overflow: auto; 106 | color: #404040; 107 | background: rgba(238, 238, 238, .35); 108 | } 109 | -------------------------------------------------------------------------------- /docs/js/libs/promise.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2013 (c) Pierre Duquesne 3 | * Licensed under the New BSD License. 4 | * https://github.com/stackp/promisejs 5 | */ 6 | (function(a){function b(){this._callbacks=[];}b.prototype.then=function(a,c){var d;if(this._isdone)d=a.apply(c,this.result);else{d=new b();this._callbacks.push(function(){var b=a.apply(c,arguments);if(b&&typeof b.then==='function')b.then(d.done,d);});}return d;};b.prototype.done=function(){this.result=arguments;this._isdone=true;for(var a=0;a=300)&&j.status!==304);h.done(a,j.responseText,j);}};j.send(k);return h;}function h(a){return function(b,c,d){return g(a,b,c,d);};}var i={Promise:b,join:c,chain:d,ajax:g,get:h('GET'),post:h('POST'),put:h('PUT'),del:h('DELETE'),ENOXHR:1,ETIMEOUT:2,ajaxTimeout:0};if(typeof define==='function'&&define.amd)define(function(){return i;});else a.promise=i;})(this); -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/controller/TemaController.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.http.HttpStatus; 5 | import org.springframework.http.ResponseEntity; 6 | import org.springframework.web.bind.annotation.CrossOrigin; 7 | import org.springframework.web.bind.annotation.DeleteMapping; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.PostMapping; 11 | import org.springframework.web.bind.annotation.PutMapping; 12 | import org.springframework.web.bind.annotation.RequestBody; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RestController; 15 | import com.redeSocial.seiva.model.TemaModel; 16 | import java.util.List; 17 | import com.redeSocial.seiva.repository.TemaRepository; 18 | 19 | @RestController 20 | @RequestMapping("/tema") 21 | @CrossOrigin(origins = "*", allowedHeaders = "*") 22 | 23 | public class TemaController { 24 | 25 | @Autowired 26 | private TemaRepository repository; 27 | 28 | @GetMapping 29 | public ResponseEntity> GetAll() { 30 | return ResponseEntity.ok(repository.findAll()); 31 | } 32 | 33 | @GetMapping("/{id}") 34 | public ResponseEntity GetById(@PathVariable long id) { 35 | return repository.findById(id).map(resp -> ResponseEntity.ok(resp)).orElse(ResponseEntity.badRequest().build()); 36 | } 37 | 38 | @GetMapping("/descricao/{descricao}") 39 | public ResponseEntity> GetByDescricao(@PathVariable String descricao) { 40 | return ResponseEntity.ok(repository.findAllByDescricaoContainingIgnoreCase(descricao)); 41 | } 42 | 43 | @PostMapping 44 | public ResponseEntity Post(@RequestBody TemaModel tema) { 45 | return ResponseEntity.status(HttpStatus.CREATED).body(repository.save(tema)); 46 | } 47 | 48 | @PutMapping 49 | public ResponseEntity Put(@RequestBody TemaModel tema) { 50 | return ResponseEntity.status(HttpStatus.OK).body(repository.save(tema)); 51 | } 52 | 53 | @DeleteMapping("/{id}") 54 | public void Delete(@PathVariable long id) { 55 | repository.deleteById(id); 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-postagem/put-postagem.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Postagem } from '../model/Postagem'; 3 | import { Tema } from '../model/Tema'; 4 | import { TemaService } from '../service/tema.service'; 5 | import { PostagemService } from '../service/postagem.service'; 6 | import { Router, ActivatedRoute } from '@angular/router'; 7 | import { AlertsService } from '../service/alerts.service'; 8 | 9 | @Component({ 10 | selector: 'app-put-postagem', 11 | templateUrl: './put-postagem.component.html', 12 | styleUrls: ['./put-postagem.component.css'] 13 | }) 14 | export class PutPostagemComponent implements OnInit { 15 | 16 | postagem: Postagem = new Postagem() 17 | idPost: number 18 | 19 | tema: Tema = new Tema() 20 | listaTemas: Tema[] 21 | idTema: number 22 | 23 | constructor( 24 | private temaService: TemaService, 25 | private postagemService: PostagemService, 26 | private router: Router, 27 | private route: ActivatedRoute, 28 | private alert: AlertsService 29 | ) { } 30 | 31 | ngOnInit() { 32 | window.scroll(0, 0) 33 | this.idPost = this.route.snapshot.params["id"] 34 | this.findByIdPostagem(this.idPost) 35 | 36 | this.findAllTemas() 37 | } 38 | 39 | findByIdPostagem(id: number){ 40 | this.postagemService.getByIdPostagem(id).subscribe((resp: Postagem) => { 41 | this.postagem = resp 42 | }) 43 | } 44 | 45 | salvar(){ 46 | this.tema.id = this.idTema 47 | this.postagem.tema = this.tema 48 | 49 | this.postagemService.putPostagem(this.postagem).subscribe((resp: Postagem) => { 50 | this.postagem = resp 51 | this.router.navigate(['/feed']) 52 | this.alert.showAlertSuccess('Postagem Alterada com Sucesso!') 53 | }, err => { 54 | if (err.status == '500'){ 55 | this.alert.showAlertDanger('Preencha todos os campos corretamente antes de enviar!') 56 | } 57 | }) 58 | 59 | } 60 | 61 | findAllTemas(){ 62 | this.temaService.getAllTemas().subscribe((resp: Tema[]) => { 63 | this.listaTemas = resp 64 | }) 65 | } 66 | 67 | findByIdTema(){ 68 | this.temaService.getByIdTema(this.idTema).subscribe((resp: Tema) => { 69 | this.tema = resp; 70 | }) 71 | } 72 | 73 | btnNao() { 74 | this.router.navigate(['/feed']) 75 | } 76 | 77 | } -------------------------------------------------------------------------------- /docs/js/svg-pan-zoom.controls.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | if (document.getElementById('module-graph-svg')) { 3 | panZoom = svgPanZoom(document.getElementById('module-graph-svg').querySelector('svg'), { 4 | zoomEnabled: true, 5 | minZoom: 1, 6 | maxZoom: 5 7 | }); 8 | 9 | document.getElementById('zoom-in').addEventListener('click', function(ev) { 10 | ev.preventDefault(); 11 | panZoom.zoomIn(); 12 | }); 13 | 14 | document.getElementById('zoom-out').addEventListener('click', function(ev) { 15 | ev.preventDefault(); 16 | panZoom.zoomOut(); 17 | }); 18 | 19 | document.getElementById('reset').addEventListener('click', function(ev) { 20 | ev.preventDefault(); 21 | panZoom.resetZoom(); 22 | panZoom.resetPan(); 23 | }); 24 | 25 | var overviewFullscreen = false, 26 | originalOverviewHeight; 27 | 28 | document.getElementById('fullscreen').addEventListener('click', function(ev) { 29 | if (overviewFullscreen) { 30 | document.getElementById('module-graph-svg').style.height = originalOverviewHeight; 31 | overviewFullscreen = false; 32 | if (ev.target) { 33 | ev.target.classList.remove('ion-md-close'); 34 | ev.target.classList.add('ion-ios-resize'); 35 | } 36 | } else { 37 | originalOverviewHeight = document.getElementById('module-graph-svg').style.height; 38 | document.getElementById('module-graph-svg').style.height = '85vh'; 39 | overviewFullscreen = true; 40 | if (ev.target) { 41 | ev.target.classList.remove('ion-ios-resize'); 42 | ev.target.classList.add('ion-md-close'); 43 | } 44 | } 45 | document.getElementById('module-graph-svg').querySelector('svg').style.height = document.getElementById('module-graph-svg').clientHeight; 46 | setTimeout(function() { 47 | panZoom.resize(); 48 | panZoom.fit(); 49 | panZoom.center(); 50 | }, 0) 51 | }); 52 | } 53 | }); 54 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/controller/PostagemController.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.controller; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.CrossOrigin; 9 | import org.springframework.web.bind.annotation.DeleteMapping; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.PathVariable; 12 | import org.springframework.web.bind.annotation.PostMapping; 13 | import org.springframework.web.bind.annotation.PutMapping; 14 | import org.springframework.web.bind.annotation.RequestBody; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.RestController; 17 | 18 | import com.redeSocial.seiva.model.PostagemModel; 19 | import com.redeSocial.seiva.repository.PostagemRepository; 20 | 21 | @RestController 22 | @RequestMapping("/postagem") 23 | @CrossOrigin(origins = "*", allowedHeaders = "*") 24 | 25 | public class PostagemController { 26 | 27 | @Autowired 28 | private PostagemRepository repository; 29 | 30 | @GetMapping 31 | public ResponseEntity> GetAll() { 32 | return ResponseEntity.ok(repository.findAll()); 33 | } 34 | 35 | @GetMapping("/{id}") 36 | public ResponseEntity GetById(@PathVariable long id) { 37 | return repository.findById(id).map(resp -> ResponseEntity.ok(resp)).orElse(ResponseEntity.badRequest().build()); 38 | } 39 | 40 | @GetMapping("/descricao/{descricao}") 41 | public ResponseEntity> GetByDescricao(@PathVariable String descricao) { 42 | return ResponseEntity.ok(repository.findAllByDescricaoContainingIgnoreCase(descricao)); 43 | } 44 | 45 | @PostMapping 46 | public ResponseEntity Post(@RequestBody PostagemModel postagem) { 47 | return ResponseEntity.status(HttpStatus.CREATED).body(repository.save(postagem)); 48 | } 49 | 50 | @PutMapping 51 | public ResponseEntity Put(@RequestBody PostagemModel postagem) { 52 | return ResponseEntity.status(HttpStatus.OK).body(repository.save(postagem)); 53 | } 54 | 55 | @DeleteMapping("/{id}") 56 | public void Delete(@PathVariable long id) { 57 | repository.deleteById(id); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /docs/js/sourceCode.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var $tabSource = document.querySelector('#source-tab'), 3 | $tabInfo = document.querySelector('#info-tab'), 4 | $tabReadme = document.querySelector('#readme-tab'), 5 | $tabTemplate = document.querySelector('#templateData-tab'), 6 | $tabTree = document.querySelector('#tree-tab'), 7 | $tabExample = document.querySelector('#example-tab'), 8 | $prismPre = document.querySelector('pre.compodoc-sourcecode'); 9 | if ($tabSource && $prismPre) { 10 | $prismCode = $prismPre.querySelector('code'), 11 | $content = document.querySelector('.content'), 12 | prismLinks = document.querySelectorAll('.link-to-prism') 13 | 14 | for (var i = 0; i < prismLinks.length; i++) { 15 | prismLinks[i].addEventListener('click', linkToPrism, false); 16 | } 17 | 18 | function linkToPrism(event) { 19 | var targetLine = event.target.getAttribute('data-line'); 20 | event.preventDefault(); 21 | 22 | $prismPre.setAttribute('data-line', targetLine); 23 | Prism.highlightElement($prismCode, function() {}); 24 | 25 | $tabSource.click(); 26 | 27 | setTimeout(function() { 28 | var $prismHighlightLine = document.querySelector('.line-highlight'), 29 | top = parseInt(getComputedStyle($prismHighlightLine)['top']); 30 | $content.scrollTop = top; 31 | }, 500); 32 | }; 33 | 34 | window.onhashchange = function(event) { 35 | switch (window.location.hash) { 36 | case '': 37 | case '#info': 38 | $tabInfo.click(); 39 | break; 40 | case '#readme': 41 | $tabReadme.click(); 42 | break; 43 | case '#source': 44 | $tabSource.click(); 45 | break; 46 | case '#template': 47 | $tabTemplate.click(); 48 | break; 49 | case '#dom-tree': 50 | $tabTree.click(); 51 | break; 52 | case '#example': 53 | $tabExample.click(); 54 | break; 55 | } 56 | } 57 | } 58 | }); 59 | -------------------------------------------------------------------------------- /docs/styles/material.css: -------------------------------------------------------------------------------- 1 | .menu { 2 | background: none; 3 | } 4 | 5 | a:hover { 6 | text-decoration: none; 7 | } 8 | 9 | /** LINK **/ 10 | 11 | .menu ul.list li a { 12 | text-decoration: none; 13 | } 14 | 15 | .menu ul.list li a:hover, .menu ul.list li.chapter .simple:hover { 16 | background-color: #f8f9fa; 17 | text-decoration: none; 18 | } 19 | 20 | #book-search-input { 21 | margin-bottom: 0; 22 | } 23 | 24 | .menu ul.list li.divider { 25 | margin-top: 0; 26 | background: #e9ecef; 27 | } 28 | 29 | .menu .title:hover { 30 | background-color: #f8f9fa; 31 | } 32 | 33 | /** CARD **/ 34 | 35 | .card { 36 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); 37 | border-radius: 0.125rem; 38 | border: 0; 39 | margin-top: 1px; 40 | } 41 | 42 | .card-header { 43 | background: none; 44 | } 45 | 46 | /** BUTTON **/ 47 | 48 | .btn { 49 | border-radius: 0.125rem; 50 | } 51 | 52 | /** NAV BAR **/ 53 | 54 | .nav { 55 | border: 0; 56 | } 57 | .nav-tabs > li > a { 58 | border: 0; 59 | border-bottom: 0.214rem solid transparent; 60 | color: rgba(0, 0, 0, 0.54); 61 | margin-right: 0; 62 | } 63 | .nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover { 64 | color: rgba(0, 0, 0, 0.87); 65 | border-top: 0; 66 | border-left: 0; 67 | border-right: 0; 68 | border-bottom: 0.214rem solid transparent; 69 | border-color: #008cff; 70 | font-weight: bold; 71 | } 72 | .nav>li>a:focus, .nav>li>a:hover { 73 | background: none; 74 | } 75 | 76 | /** LIST **/ 77 | 78 | .list-group-item:first-child { 79 | border-top-left-radius: 0.125rem; 80 | border-top-right-radius: 0.125rem; 81 | } 82 | .list-group-item:last-child { 83 | border-bottom-left-radius: 0.125rem; 84 | border-bottom-right-radius: 0.125rem; 85 | } 86 | 87 | /** MISC **/ 88 | 89 | .modifier { 90 | border-radius: 0.125rem; 91 | } 92 | 93 | pre[class*="language-"] { 94 | border-radius: 0.125rem; 95 | } 96 | 97 | /** TABLE **/ 98 | 99 | .table-hover>tbody>tr:hover { 100 | background: rgba(0, 0, 0, 0.075); 101 | } 102 | 103 | table.params thead { 104 | background: none; 105 | } 106 | table.params thead td { 107 | color: rgba(0, 0, 0, 0.54); 108 | font-weight: bold; 109 | } -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/cadastro/cadastro.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 |
7 |
8 |
Vem com a gente!
9 |
Cadastre-se aqui!
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 29 |
30 | 31 |
32 | 33 | 34 |
35 | 36 |
37 | 38 |
39 | 42 |
43 |
44 |
45 |
46 |
47 | 48 |
-------------------------------------------------------------------------------- /seivadeploy/seiva-api/src/main/java/com/redeSocial/seiva/model/PostagemModel.java: -------------------------------------------------------------------------------- 1 | package com.redeSocial.seiva.model; 2 | 3 | import java.util.Date; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.GenerationType; 8 | import javax.persistence.Id; 9 | import javax.persistence.ManyToOne; 10 | import javax.persistence.Table; 11 | import javax.persistence.Temporal; 12 | import javax.persistence.TemporalType; 13 | import javax.validation.constraints.NotNull; 14 | import javax.validation.constraints.Size; 15 | 16 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 17 | 18 | @Entity 19 | @Table(name = "tb_postagem") 20 | public class PostagemModel { 21 | 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.IDENTITY) 24 | private long id; 25 | 26 | @NotNull 27 | @Size(min = 5, max = 100) 28 | private String titulo; 29 | 30 | @Temporal(TemporalType.TIMESTAMP) 31 | private Date data = new java.sql.Date(System.currentTimeMillis()); 32 | 33 | @NotNull 34 | @Size(min = 5, max = 500) 35 | private String descricao; 36 | 37 | private String imagem; 38 | 39 | @ManyToOne 40 | @JsonIgnoreProperties("postagem") 41 | private UsuarioModel usuario; 42 | 43 | @ManyToOne 44 | @JsonIgnoreProperties("postagem") 45 | private TemaModel tema; 46 | 47 | public long getId() { 48 | return id; 49 | } 50 | 51 | public void setId(long id) { 52 | this.id = id; 53 | } 54 | 55 | public String getTitulo() { 56 | return titulo; 57 | } 58 | 59 | public void setTitulo(String titulo) { 60 | this.titulo = titulo; 61 | } 62 | 63 | public Date getData() { 64 | return data; 65 | } 66 | 67 | public void setData(Date data) { 68 | this.data = data; 69 | } 70 | 71 | public String getDescricao() { 72 | return descricao; 73 | } 74 | 75 | public void setDescricao(String descricao) { 76 | this.descricao = descricao; 77 | } 78 | 79 | public String getImagem() { 80 | return imagem; 81 | } 82 | 83 | public void setImagem(String imagem) { 84 | this.imagem = imagem; 85 | } 86 | 87 | public UsuarioModel getUsuario() { 88 | return usuario; 89 | } 90 | 91 | public void setUsuario(UsuarioModel usuario) { 92 | this.usuario = usuario; 93 | } 94 | 95 | public TemaModel getTema() { 96 | return tema; 97 | } 98 | 99 | public void setTema(TemaModel tema) { 100 | this.tema = tema; 101 | } 102 | 103 | } 104 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { HttpClientModule } from '@angular/common/http'; 4 | import { FormsModule } from '@angular/forms'; 5 | import { OrderModule } from 'ngx-order-pipe'; 6 | import { ModalModule } from 'ngx-bootstrap/modal'; 7 | 8 | import { AppRoutingModule } from './app-routing.module'; 9 | import { AppComponent } from './app.component'; 10 | import { FooterComponent } from './footer/footer.component'; 11 | import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; 12 | import { FeedComponent } from './feed/feed.component'; 13 | import { PostTemaComponent } from './post-tema/post-tema.component'; 14 | import { SobreComponent } from './sobre/sobre.component'; 15 | import { EquipeComponent } from './equipe/equipe.component'; 16 | import { HomeInicioComponent } from './home-inicio/home-inicio.component'; 17 | import { AdminComponent } from './admin/admin.component'; 18 | import { DeleteTemaComponent } from './delete-tema/delete-tema.component'; 19 | import { DeletePostagemComponent } from './delete-postagem/delete-postagem.component'; 20 | import { PutTemaComponent } from './put-tema/put-tema.component'; 21 | import { PutPostagemComponent } from './put-postagem/put-postagem.component'; 22 | import { NavbarComponent } from './navbar/navbar.component'; 23 | import { CadastroComponent } from './cadastro/cadastro.component'; 24 | import { AlertsComponent } from './alerts/alerts.component'; 25 | import { BotaoLateralComponent } from './botao-lateral/botao-lateral.component'; 26 | import { PostagemTemaComponent } from './postagem-tema/postagem-tema.component'; 27 | import { BotaoSubirComponent } from './botao-subir/botao-subir.component'; 28 | 29 | @NgModule({ 30 | declarations: [ 31 | AppComponent, 32 | HomeInicioComponent, 33 | FooterComponent, 34 | EquipeComponent, 35 | SobreComponent, 36 | PostTemaComponent, 37 | FeedComponent, 38 | AdminComponent, 39 | DeleteTemaComponent, 40 | DeletePostagemComponent, 41 | PutTemaComponent, 42 | PutPostagemComponent, 43 | NavbarComponent, 44 | CadastroComponent, 45 | AlertsComponent, 46 | BotaoLateralComponent, 47 | PostagemTemaComponent, 48 | BotaoSubirComponent 49 | ], 50 | imports: [ 51 | BrowserModule, 52 | AppRoutingModule, 53 | FontAwesomeModule, 54 | HttpClientModule, 55 | FormsModule, 56 | OrderModule, 57 | ModalModule.forRoot() 58 | ], 59 | providers: [], 60 | bootstrap: [AppComponent] 61 | }) 62 | export class AppModule { } 63 | -------------------------------------------------------------------------------- /seivadeploy/seiva-api/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.3.2.RELEASE 9 | 10 | 11 | com.redeSocial 12 | seiva 13 | 0.0.1-SNAPSHOT 14 | seiva 15 | Projeto integrador do grupo ZeroUm, rede social - Seiva 16 | 17 | 18 | 1.8 19 | 20 | 21 | 22 | 23 | org.springframework.boot 24 | spring-boot-starter-security 25 | 26 | 27 | commons-codec 28 | commons-codec 29 | 1.10 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-data-jpa 34 | 35 | 36 | org.springframework.boot 37 | spring-boot-starter-validation 38 | 39 | 40 | org.springframework.boot 41 | spring-boot-starter-web 42 | 43 | 44 | 45 | org.springframework.boot 46 | spring-boot-devtools 47 | runtime 48 | true 49 | 50 | 51 | mysql 52 | mysql-connector-java 53 | runtime 54 | 55 | 56 | org.springframework.boot 57 | spring-boot-starter-test 58 | test 59 | 60 | 61 | org.junit.vintage 62 | junit-vintage-engine 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | org.springframework.boot 72 | spring-boot-maven-plugin 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /Entregas/DescricaoEstruturaFrontEnd.md: -------------------------------------------------------------------------------- 1 | 11/08 2 | 3 | # Estrutura de páginas (Rede Social Seiva) 4 | 5 |
6 | 7 | ## Descrição de itens nas páginas 8 | 9 | - Itens da Navbar Principal (quando o usuário estiver logado no feed): [logo] [pesquisa] [eventos] [cursos] [projetos] [vagas] [perfil] 10 | 11 | - Itens da Navbar Dropdown (passando o mouse em qualquer dos temas principais): Navegação por temas [eventos, cursos, projetos, vagas] e subtemas [ONGS, Psicologia, Alimentação, Tecnologia, Família, Esportes, Aprendizagem, DIY, Fotografia, Escrita, Música, Games, Crenças, Cinema, Humor, Carreira, Animações, Artes Plásticas], como a navegação do Magazine Luiza. 12 | 13 | - Footer: onde ficarão os redirecionamentos das páginas Junte-se a nós, Redes Sociais (Instagram/Facebook/LinkedIn) e Equipe/Contato 14 | 15 | - Pop-up lateral: botão com redirecionamento ao Centro de Valorização a Vida e Disque Denúncia/Violência contra a mulher 16 | 17 | - Botão de "Voltar ao Topo": scroll-top com smooth behaviour 18 | 19 | 20 | - 1ª Página (Home Estática): Apresentação do Projeto (página com carrossel de imagens e cards, junto com login/cadastro) 21 | 22 | - 2ª Página (Equipe/Contato Estática): sobre nós geral, cards do grupo com as redes sociais individuais) 23 | 24 | - 3ª Página (Junte-se a Nós Estática): página semelhante ao "Trabalhe Conosco" de algumas organizações, mas adaptadas ao nosso contexto de projeto social/sem fins lucrativos. 25 | 26 | - 4ª Página Feed: barra lateral exibindo perfil de usuário logado, com navegação dentre os temas subtemas - filtrados ou não - das publicações (isso quando os usuários já postaram, mostrando a visualização, tags, temas, etc.) 27 | 28 | - 5ª Página (Perfil Pessoal e/ou Organizacional): feed contendo somente os posts de determinado usuário. 29 | 30 | 31 |
32 | 33 | 34 | ## Componentes Angular do projeto 35 | 36 | - ng g c home-inicio: :white_check_mark: 37 | - ng g c footer: :white_check_mark: 38 | - ng g c equipe: :white_check_mark: 39 | - ng g c sobre: :white_check_mark: 40 | - ng g c feed: :white_check_mark: 41 | - ng g c perfil: :arrows_counterclockwise: 42 | - ng g c navbar :arrows_counterclockwise: 43 | - ng g c junte-se: :arrows_counterclockwise: 44 | 45 |
46 | 47 | ## Considerações para uma versão 2.0 48 | 49 | - Integração com Hand Talk (acessibilidade em Libras para a Página) 50 | - Implantação de E-commerce (recurso para ONGs e pequenos produtores venderem seus produtos, semelhante a Loja do Instagram) 51 | - Habilitação de Dark mode 52 | - Possibilidade de cadastro e login integrado à conta do Facebook ou Google 53 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/home-inicio/home-inicio.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 44 |
45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
54 |
55 | 56 |
57 |
58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/put-postagem/put-postagem.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
Editando uma postagem
8 | 9 | 10 |
11 | 12 | 14 |
15 | 16 |
17 | 18 | 20 |
21 | 22 |
23 | 24 | 26 |
27 | 28 |
29 | 30 | 32 |
33 | 34 |
35 | 36 | 41 |
42 | 43 | 44 | 45 |
46 |
47 | 49 | 51 |
52 |
53 | 54 |
55 | 56 |
57 | 58 |
59 | -------------------------------------------------------------------------------- /docs/js/libs/tablesort.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * tablesort v5.1.0 (2018-09-14) 3 | * http://tristen.ca/tablesort/demo/ 4 | * Copyright (c) 2018 ; Licensed MIT 5 | */ 6 | !function(){function a(b,c){if(!(this instanceof a))return new a(b,c);if(!b||"TABLE"!==b.tagName)throw new Error("Element must be a table");this.init(b,c||{})}var b=[],c=function(a){var b;return window.CustomEvent&&"function"==typeof window.CustomEvent?b=new CustomEvent(a):(b=document.createEvent("CustomEvent"),b.initCustomEvent(a,!1,!1,void 0)),b},d=function(a){return a.getAttribute("data-sort")||a.textContent||a.innerText||""},e=function(a,b){return a=a.trim().toLowerCase(),b=b.trim().toLowerCase(),a===b?0:a0)if(a.tHead&&a.tHead.rows.length>0){for(e=0;e0&&l.push(k),m++;if(!l)return}for(m=0;m= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 22 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 23 | 24 | /** 25 | * Web Animations `@angular/platform-browser/animations` 26 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. 27 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). 28 | */ 29 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 30 | 31 | /** 32 | * By default, zone.js will patch all possible macroTask and DomEvents 33 | * user can disable parts of macroTask/DomEvents patch by setting following flags 34 | * because those flags need to be set before `zone.js` being loaded, and webpack 35 | * will put import in the top of bundle, so user need to create a separate file 36 | * in this directory (for example: zone-flags.ts), and put the following flags 37 | * into that file, and then add the following code before importing zone.js. 38 | * import './zone-flags'; 39 | * 40 | * The flags allowed in zone-flags.ts are listed here. 41 | * 42 | * The following flags will work for all browsers. 43 | * 44 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 45 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 46 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 47 | * 48 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 49 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 50 | * 51 | * (window as any).__Zone_enable_cross_context_check = true; 52 | * 53 | */ 54 | 55 | /*************************************************************************************************** 56 | * Zone JS is required by default for Angular itself. 57 | */ 58 | import 'zone.js/dist/zone'; // Included with Angular CLI. 59 | 60 | 61 | /*************************************************************************************************** 62 | * APPLICATION IMPORTS 63 | */ 64 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/postagem-tema/postagem-tema.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
Postagens sobre {{tema.descricao}}
8 |
9 | 10 | 11 |
12 |
13 |
14 | Imagem sobre {{post.titulo}} 15 |
16 | 17 |

{{post.titulo}}

18 | 19 |

{{post.descricao}}

20 | 21 | Postado em {{post.data | date:'dd/MM/yyyy'}} às 22 | {{post.data | date:'HH:mm'}} 23 |
24 |
25 |
26 |
27 |
28 | 29 | 30 |
31 |
32 |
33 | 34 | 35 |
Ver mais posts sobre:
36 |
37 |
38 | 40 |
41 |
42 | 45 |
46 |
47 | 48 | 49 | 50 |
51 |
52 | 53 | 55 |
56 |
57 | 58 | 59 | Ilustração de folhagens em tons terrosos 60 |
61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/feed/feed.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { TemaService } from './../service/tema.service'; 3 | import { PostagemService } from '../service/postagem.service'; 4 | import { Postagem } from './../model/Postagem'; 5 | import { Tema } from '../model/Tema'; 6 | import { AlertsService } from '../service/alerts.service'; 7 | import { ActivatedRoute, Router } from '@angular/router'; 8 | 9 | @Component({ 10 | selector: 'app-feed', 11 | templateUrl: './feed.component.html', 12 | styleUrls: ['./feed.component.css'], 13 | }) 14 | export class FeedComponent implements OnInit { 15 | key = 'data'; 16 | reverse = true; 17 | 18 | postagem: Postagem = new Postagem(); 19 | listaPostagens: Postagem[]; 20 | titulo: string; 21 | 22 | tema: Tema = new Tema(); 23 | listaTemas: Tema[]; 24 | 25 | idTema: number; 26 | nomeTema: string; 27 | descricao: string; 28 | descricaoImagem: string; 29 | 30 | constructor( 31 | private postagemService: PostagemService, 32 | private temaService: TemaService, 33 | private alert: AlertsService, 34 | private router: Router, 35 | private route: ActivatedRoute 36 | ) {} 37 | 38 | ngOnInit() { 39 | this.idTema = this.route.snapshot.params['id']; 40 | window.scroll(0, 0); 41 | this.findByIdTema(); 42 | this.findAllPostagens(); 43 | this.findAllTemas(); 44 | } 45 | 46 | publicar() { 47 | this.tema.id = this.idTema; 48 | this.postagem.tema = this.tema; 49 | 50 | if ( 51 | this.postagem.titulo == null || 52 | this.postagem.descricao == null || 53 | this.postagem.tema == null 54 | ) { 55 | this.alert.showAlertInfo('Preencha todos os campos antes de publicar!'); 56 | } else { 57 | this.postagemService 58 | .postPostagem(this.postagem) 59 | .subscribe((resp: Postagem) => { 60 | this.postagem = resp; 61 | this.postagem = new Postagem(); 62 | this.alert.showAlertSuccess('Postagem realizada com sucesso!'); 63 | this.findAllPostagens(); 64 | }); 65 | } 66 | } 67 | 68 | findAllPostagens() { 69 | this.postagemService.getAllPostagens().subscribe((resp: Postagem[]) => { 70 | this.listaPostagens = resp; 71 | }); 72 | } 73 | 74 | findByTituloPostagem() { 75 | if (this.titulo === '') { 76 | this.findAllPostagens(); 77 | } else { 78 | this.postagemService 79 | .getByTituloPostagem(this.titulo) 80 | .subscribe((resp: Postagem[]) => { 81 | this.listaPostagens = resp; 82 | }); 83 | } 84 | } 85 | 86 | findAllTemas() { 87 | this.temaService.getAllTemas().subscribe((resp: Tema[]) => { 88 | this.listaTemas = resp; 89 | }); 90 | } 91 | 92 | findByIdTema() { 93 | this.temaService.getByIdTema(this.idTema).subscribe((resp: Tema) => { 94 | this.tema = resp; 95 | }); 96 | } 97 | 98 | findByNomeTema() { 99 | this.temaService.getByNomeTema(this.nomeTema).subscribe((resp: Tema[]) => { 100 | this.listaTemas = resp; 101 | 102 | console.log(resp); 103 | }); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Integrantes GrupoZeroUm :sparkles: 2 | :octocat: [Lais Basso](https://github.com/laisbasso "GitHub") 3 | :four_leaf_clover: [Mayara Dotta](https://github.com/DottaMP "GitHub") 4 | :princess: [Matheus Müller](https://github.com/matheuxmuller "GitHub") 5 | :bear: [Victor Hugo Ulloa](https://github.com/Victorhup "GitHub") 6 | :alien: [Letícia Sena](https://github.com/leticia-sena "GitHub") 7 | 8 | # Seiva :seedling: :leaves: :herb: 9 | Projeto Integrador do *Grupo ZeroUm* desenvolvida durante o *Bootcamp Generation*. 10 | 11 | Cada um de nós pensou em algumas formas de contemplar o décimo objetivo do desenvolvimento sustentável, no caso a **Redução das Desigualdades**, que contempla os objetivos de **Igualdade de Gênero**, **Trabalho Decente e Crescimento Econômico** e **Educação de Qualidade** em um só. Pensamos em maximizar e englobar causas importantes que se encontram invisibilizadas ou não-categorizadas de uma maneira simples e fácil, partindo também de pautas identitárias que cada um trás consigo, como questões de gênero, de orientação sexual, econômicas e socioculturais. 12 | 13 | Chegamos em uma solução pautada em acesso à informação e compartilhamento, como uma **plataforma agregadora entre causas**, organizações e pessoas interessadas em relacionar-se, divididas por categorias e localidades. A proposta unirá eventos, formações, produtos, projetos e vagas de trabalhos alocados a organizações e/ou freelance, sempre voltados a pessoas socialmente marginalizadas, como mulheres, pessoas com deficiência, pretes, LGBTQIAP+, etc. 14 | 15 | **Seiva**, segundo a botânica, é um líquido que realiza o transporte da água, nutrientes, hormônios, oxigênio e gás carbônico pelo interior das plantas vasculares. Corresponde ao sangue dos seres humanos. Tanto a seiva quanto o sangue são substâncias vitais, que percorrem o interior e nos fornecem energia e vigor, mas, para além de características biológicas, nós seres humanos, precisamos de fatores socioculturais para sobrevivência. **E como diriam os Titãs**, “a gente não quer só comida, a gente quer comida, diversão e arte”, e é pensando nisso que nasce a rede social Seiva, considerando as formas de ver e viver a arte como um combustível. 16 | 17 | Nossa ideia foi pensada para ser uma rede social, porque ideologia se vive, não se consome e, dentro disso, que fosse possível a interação social entre pessoas que produzem e pessoas que se movimentam por determinadas causas ou interesses em comum. 18 | 19 | [![!](https://i.imgur.com/22albep.png)](https://youtu.be/5GNl6nAOhiA "Assista ao vídeo") 20 | 21 | ## Documentação completa 22 | 23 | * [Back-end](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DocumentacaoCompletaBackEnd.md) 24 | * [Front-end](https://laisbasso.github.io/PI-Seiva/) 25 | 26 | ## Screenshots 27 | 28 | ### Home 29 | ![Página da home](https://i.imgur.com/303SbGV.png "Home") 30 | 31 | ### Feed 32 | ![Página do feed](https://i.imgur.com/81LCvwC.png "Feed") 33 | 34 | ### Permissões do admin 35 | ![Página do admin](https://imgur.com/wunK3Of.png "Admin") 36 | 37 | ### Exclusão da postagem 38 | ![Página da exclusão da postagem](https://imgur.com/qDZ1vhJ.png "Post") 39 | 40 | ### Postagens do tema específico 41 | ![Página das postagens do tema](https://imgur.com/eeEWGn6.png "Postagens do tema") 42 | -------------------------------------------------------------------------------- /Entregas/GuiaEntregas.md: -------------------------------------------------------------------------------- 1 | ### Entregas :heavy_check_mark: 2 | 3 | | Data | Tipo de Entrega | Documentação | 4 | |------|-----------------|--------------| 5 | |03/09| [EndPoint PUT e DELETE de Postagem e Tema](https://github.com/laisbasso/PI-Seiva/commit/315bc50d178a3cbe723b55d6376bf363033bc0c3 "EndPoint PUT e DELETE de Postagem e Tema") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoRotas-ConsumoAPI-Service.md "Descrição") 6 | |02/09| [EndPoint POST de Postagem e Tema / Criação do componente Admin](https://github.com/laisbasso/PI-Seiva/commit/14678f63f7b57dea97dd9947fea7d8aec932c781 "EndPoint POST de Postagem e Tema / Criação do componente Admin") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoRotas-ConsumoAPI-Service.md "Descrição") 7 | |01/09| [Criação do Componente Feed / EndPoint GET](https://github.com/laisbasso/PI-Seiva/commit/0ba92b766694fd007f0de0d72491f10702f0f42a "Criação do Componente Feed / End-point GET") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoRotas-ConsumoAPI-Service.md "Descrição") 8 | |31/08| [Implementação de Rotas / Consumo da API](https://github.com/laisbasso/PI-Seiva/commit/3b56569de2e4f439ad135d178d0b0e493fc8d83a "Implementação de Rotas / Consumo da API") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoRotas-ConsumoAPI-Service.md "Descrição") 9 | |27/08| [Descrição do Projeto Angular](https://github.com/laisbasso/PI-Seiva/commit/598ed60888be9fa485e8461f8cf4ea36e0059549 "Descrição do Projeto Angular") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoAngular.md "Descrição") 10 | |27/08| [Descrição da Estrutura Front-end](https://github.com/laisbasso/PI-Seiva/commit/598ed60888be9fa485e8461f8cf4ea36e0059549 "Descrição da Estrutura Front-end") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoEstruturaFrontEnd.md "Descrição") 11 | |13/08| [Deploy Back-end](https://github.com/laisbasso/PI-Seiva/commit/95772d9143bbe80acaf4295117ffb299fa0a9046 "Deploy Back-end") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoDeployBackEnd.md "Descrição do Deploy") 12 | |11/08| [Usuário Model e Segurança](https://github.com/laisbasso/PI-Seiva/commit/f87a90ea09a6c4ae479a77fcdb4b3f5ed700e3ed "Usuário Model e Camada de Segurança Basic") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoSeguran%C3%A7a.md "Descrição Camada de Segurança Basic") 13 | |06/08| [CRUD Postagem](https://github.com/laisbasso/PI-Seiva/commit/64494d1105a38bdad728af1b76d1a39d6b37092c "CRUD Postagem") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoCRUDPostagem.md "Descrição CRUD Postagem") 14 | |05/08| [CRUD Tema](https://github.com/laisbasso/PI-RedeSocial/commit/e1518cc2e0fae6a28ce606ae6e4493f2b973fea8 "CRUD Tema") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoCRUDTema.md "Descrição CRUD Tema") 15 | |30/07| [Código Tema Model](https://github.com/laisbasso/PI-Seiva/commit/9a89780208e8b5489b298a70b97e5beb989c3f3e "Código Tema Model") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/Entregas/DescricaoTemaModel.md "Descrição Tema Model") 16 | |24/07| [Diagrama Entidade Relacionamento](https://github.com/laisbasso/PI-Seiva/blob/master/DER/dbdesigner.pdf "DER") | [Descrição](https://github.com/laisbasso/PI-Seiva/blob/master/DER/DescricaoDER.md "Descrição DER") 17 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/navbar/navbar.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /front-end/seivaVisual/src/app/post-tema/post-tema.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
Cadastro de um novo tema
8 | 9 | 10 |
11 | 12 | 14 |
15 | 16 |
17 | 18 | 20 |
21 | 22 |
23 | 24 | 26 |
27 | 28 | 29 | 30 |
31 |
32 | 33 | 36 |
37 |
38 | 39 | 40 |
41 | 42 |
43 |
44 |
Lista de temas
45 |
46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 69 | 70 | 71 |
#DescriçãoModificações
{{item.id}}{{item.descricao}} 62 | Caneta azul sobre papel em branco 65 | Lixeira 68 |
72 | 73 | 74 |
75 |
76 | Ilustração de folhagens em tons terrosos 77 |
78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /front-end/seivaVisual/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "align": { 5 | "options": [ 6 | "parameters", 7 | "statements" 8 | ] 9 | }, 10 | "array-type": false, 11 | "arrow-return-shorthand": true, 12 | "curly": true, 13 | "deprecation": { 14 | "severity": "warning" 15 | }, 16 | "component-class-suffix": true, 17 | "contextual-lifecycle": true, 18 | "directive-class-suffix": true, 19 | "directive-selector": [ 20 | true, 21 | "attribute", 22 | "app", 23 | "camelCase" 24 | ], 25 | "component-selector": [ 26 | true, 27 | "element", 28 | "app", 29 | "kebab-case" 30 | ], 31 | "eofline": true, 32 | "import-blacklist": [ 33 | true, 34 | "rxjs/Rx" 35 | ], 36 | "import-spacing": true, 37 | "indent": { 38 | "options": [ 39 | "spaces" 40 | ] 41 | }, 42 | "max-classes-per-file": false, 43 | "max-line-length": [ 44 | true, 45 | 140 46 | ], 47 | "member-ordering": [ 48 | true, 49 | { 50 | "order": [ 51 | "static-field", 52 | "instance-field", 53 | "static-method", 54 | "instance-method" 55 | ] 56 | } 57 | ], 58 | "no-console": [ 59 | true, 60 | "debug", 61 | "info", 62 | "time", 63 | "timeEnd", 64 | "trace" 65 | ], 66 | "no-empty": false, 67 | "no-inferrable-types": [ 68 | true, 69 | "ignore-params" 70 | ], 71 | "no-non-null-assertion": true, 72 | "no-redundant-jsdoc": true, 73 | "no-switch-case-fall-through": true, 74 | "no-var-requires": false, 75 | "object-literal-key-quotes": [ 76 | true, 77 | "as-needed" 78 | ], 79 | "quotemark": [ 80 | true, 81 | "single" 82 | ], 83 | "semicolon": { 84 | "options": [ 85 | "always" 86 | ] 87 | }, 88 | "space-before-function-paren": { 89 | "options": { 90 | "anonymous": "never", 91 | "asyncArrow": "always", 92 | "constructor": "never", 93 | "method": "never", 94 | "named": "never" 95 | } 96 | }, 97 | "typedef": [ 98 | true, 99 | "call-signature" 100 | ], 101 | "typedef-whitespace": { 102 | "options": [ 103 | { 104 | "call-signature": "nospace", 105 | "index-signature": "nospace", 106 | "parameter": "nospace", 107 | "property-declaration": "nospace", 108 | "variable-declaration": "nospace" 109 | }, 110 | { 111 | "call-signature": "onespace", 112 | "index-signature": "onespace", 113 | "parameter": "onespace", 114 | "property-declaration": "onespace", 115 | "variable-declaration": "onespace" 116 | } 117 | ] 118 | }, 119 | "variable-name": { 120 | "options": [ 121 | "ban-keywords", 122 | "check-format", 123 | "allow-pascal-case" 124 | ] 125 | }, 126 | "whitespace": { 127 | "options": [ 128 | "check-branch", 129 | "check-decl", 130 | "check-operator", 131 | "check-separator", 132 | "check-type", 133 | "check-typecast" 134 | ] 135 | }, 136 | "no-conflicting-lifecycle": true, 137 | "no-host-metadata-property": true, 138 | "no-input-rename": true, 139 | "no-inputs-metadata-property": true, 140 | "no-output-native": true, 141 | "no-output-on-prefix": true, 142 | "no-output-rename": true, 143 | "no-outputs-metadata-property": true, 144 | "template-banana-in-box": true, 145 | "template-no-negated-async": true, 146 | "use-lifecycle-interface": true, 147 | "use-pipe-transform-interface": true 148 | }, 149 | "rulesDirectory": [ 150 | "codelyzer" 151 | ] 152 | } -------------------------------------------------------------------------------- /docs/routes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | seiva-visual documentation 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 23 | 24 |
25 |
26 | 29 | 30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
62 |
63 |

result-matching ""

64 |
    65 |
    66 |
    67 |

    No results matching ""

    68 |
    69 |
    70 |
    71 | 72 |
    73 |
    74 | 75 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /docs/styles/postmark.css: -------------------------------------------------------------------------------- 1 | .navbar-default { 2 | background: #FFDE00; 3 | border: none; 4 | } 5 | 6 | .navbar-default .navbar-brand { 7 | color: #333; 8 | font-weight: bold; 9 | } 10 | 11 | .menu { 12 | background: #333; 13 | color: #fcfcfc; 14 | } 15 | 16 | .menu ul.list li a { 17 | color: #333; 18 | } 19 | 20 | .menu ul.list li.title { 21 | background: #FFDE00; 22 | color: #333; 23 | padding-bottom: 5px; 24 | } 25 | 26 | .menu ul.list li:nth-child(2) { 27 | margin-top: 0; 28 | } 29 | 30 | .menu ul.list li.chapter a, 31 | .menu ul.list li.chapter .simple { 32 | color: white; 33 | text-decoration: none; 34 | } 35 | 36 | .menu ul.list li.chapter ul.links a { 37 | color: #949494; 38 | text-transform: none; 39 | padding-left: 35px; 40 | } 41 | 42 | .menu ul.list li.chapter ul.links a:hover, 43 | .menu ul.list li.chapter ul.links a.active { 44 | color: #FFDE00; 45 | } 46 | 47 | .menu ul.list li.chapter ul.links { 48 | padding-left: 0; 49 | } 50 | 51 | .menu ul.list li.divider { 52 | background: rgba(255, 255, 255, 0.07); 53 | } 54 | 55 | #book-search-input input, 56 | #book-search-input input:focus, 57 | #book-search-input input:hover { 58 | color: #949494; 59 | } 60 | 61 | .copyright { 62 | color: #b3b3b3; 63 | background: #272525; 64 | } 65 | 66 | .content { 67 | background: #fcfcfc; 68 | } 69 | 70 | .content a { 71 | color: #007DCC; 72 | } 73 | 74 | .content a:visited { 75 | color: #0165a5; 76 | } 77 | 78 | .menu ul.list li:nth-last-child(2) { 79 | background: none; 80 | } 81 | 82 | .list-group-item:first-child, 83 | .list-group-item:last-child { 84 | border-radius: 0; 85 | } 86 | 87 | .menu ul.list li.title a { 88 | text-decoration: none; 89 | font-weight: bold; 90 | } 91 | 92 | .menu ul.list li.title a:hover { 93 | background: rgba(255, 255, 255, 0.1); 94 | } 95 | 96 | .breadcrumb>li+li:before { 97 | content: "»\00a0" 98 | } 99 | 100 | .breadcrumb { 101 | padding-bottom: 15px; 102 | border-bottom: 1px solid #e1e4e5; 103 | } 104 | 105 | code { 106 | white-space: nowrap; 107 | max-width: 100%; 108 | background: #F5F5F5; 109 | padding: 2px 5px; 110 | color: #666666; 111 | overflow-x: auto; 112 | border-radius: 0; 113 | } 114 | 115 | pre { 116 | white-space: pre; 117 | margin: 0; 118 | padding: 12px 12px; 119 | font-size: 12px; 120 | line-height: 1.5; 121 | display: block; 122 | overflow: auto; 123 | color: #404040; 124 | background: #f3f3f3; 125 | } 126 | 127 | pre code.hljs { 128 | border: none; 129 | background: inherit; 130 | } 131 | 132 | /* 133 | Atom One Light by Daniel Gamage 134 | Original One Light Syntax theme from https://github.com/atom/one-light-syntax 135 | base: #fafafa 136 | mono-1: #383a42 137 | mono-2: #686b77 138 | mono-3: #a0a1a7 139 | hue-1: #0184bb 140 | hue-2: #4078f2 141 | hue-3: #a626a4 142 | hue-4: #50a14f 143 | hue-5: #e45649 144 | hue-5-2: #c91243 145 | hue-6: #986801 146 | hue-6-2: #c18401 147 | */ 148 | 149 | .hljs { 150 | display: block; 151 | overflow-x: auto; 152 | padding: 0.5em; 153 | color: #383a42; 154 | background: #fafafa; 155 | } 156 | 157 | .hljs-comment, 158 | .hljs-quote { 159 | color: #a0a1a7; 160 | font-style: italic; 161 | } 162 | 163 | .hljs-doctag, 164 | .hljs-keyword, 165 | .hljs-formula { 166 | color: #a626a4; 167 | } 168 | 169 | .hljs-section, 170 | .hljs-name, 171 | .hljs-selector-tag, 172 | .hljs-deletion, 173 | .hljs-subst { 174 | color: #e45649; 175 | } 176 | 177 | .hljs-literal { 178 | color: #0184bb; 179 | } 180 | 181 | .hljs-string, 182 | .hljs-regexp, 183 | .hljs-addition, 184 | .hljs-attribute, 185 | .hljs-meta-string { 186 | color: #50a14f; 187 | } 188 | 189 | .hljs-built_in, 190 | .hljs-class .hljs-title { 191 | color: #c18401; 192 | } 193 | 194 | .hljs-attr, 195 | .hljs-variable, 196 | .hljs-template-variable, 197 | .hljs-type, 198 | .hljs-selector-class, 199 | .hljs-selector-attr, 200 | .hljs-selector-pseudo, 201 | .hljs-number { 202 | color: #986801; 203 | } 204 | 205 | .hljs-symbol, 206 | .hljs-bullet, 207 | .hljs-link, 208 | .hljs-meta, 209 | .hljs-selector-id, 210 | .hljs-title { 211 | color: #4078f2; 212 | } 213 | 214 | .hljs-emphasis { 215 | font-style: italic; 216 | } 217 | 218 | .hljs-strong { 219 | font-weight: bold; 220 | } 221 | 222 | .hljs-link { 223 | text-decoration: underline; 224 | } 225 | --------------------------------------------------------------------------------