Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d64f40d
challenge accepted
DrielisonLopes Oct 2, 2021
51424f1
usando hooks e favicon
DrielisonLopes Oct 2, 2021
ac8c0e0
hierarquia de components
DrielisonLopes Oct 2, 2021
54b3885
usando diretivas
DrielisonLopes Oct 2, 2021
9f2dcf3
utilizando methods
DrielisonLopes Oct 4, 2021
43b5f29
Múltiplos eventos
DrielisonLopes Oct 4, 2021
1ec099a
reutilizacao e uso de props
DrielisonLopes Oct 4, 2021
4f457d6
emit com pictures
DrielisonLopes Oct 5, 2021
35b2b02
install sweet alert
DrielisonLopes Oct 5, 2021
930da1a
install sweet alert
DrielisonLopes Oct 5, 2021
293235e
challenge accepted
DrielisonLopes Oct 5, 2021
b925304
separando e organizando o frontend
DrielisonLopes Oct 5, 2021
26dc4f2
inicio do backend
DrielisonLopes Oct 5, 2021
275a1b8
Home page c/ footer
DrielisonLopes Oct 5, 2021
55c7532
instalações e ajustes iniciais
DrielisonLopes Oct 6, 2021
9a3e6ff
base backend c/ MySQL
DrielisonLopes Oct 6, 2021
96a1a8e
})
DrielisonLopes Oct 7, 2021
ba8ae99
Conectando a API ao banco de dados MySQL
DrielisonLopes Oct 7, 2021
6858e22
tornando a API publica
DrielisonLopes Oct 7, 2021
13ad407
atualizando alunos.js para MySQL
DrielisonLopes Oct 7, 2021
f3723d8
Cadastro de usuário
DrielisonLopes Oct 8, 2021
4839400
adicionando JWT token
DrielisonLopes Oct 8, 2021
65b1431
rotas com login.obrigatorio
DrielisonLopes Oct 8, 2021
3e8898b
organizando rotas c controllers
DrielisonLopes Oct 8, 2021
3c8aa51
debugandoBackEnd | axios | tabelaDoFront
DrielisonLopes Oct 9, 2021
4f17a53
aprender <- executar/ Front + Back
DrielisonLopes Oct 9, 2021
7053b83
tela Login e Consulta alunos
DrielisonLopes Oct 9, 2021
caaa016
ajustes: Consulta e Cadastro de alunos
DrielisonLopes Oct 10, 2021
f9b3ee7
excluindo arquivos em desuso
DrielisonLopes Oct 10, 2021
27bad32
Idioma de escrita do código: Inglês
DrielisonLopes Oct 10, 2021
06f0f36
atualização do COMMENTS.md
DrielisonLopes Oct 10, 2021
35fed46
final Challenge
DrielisonLopes Oct 12, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<<<<<<< HEAD
# Logs
logs
*.log
Expand Down Expand Up @@ -102,3 +103,28 @@ dist

# TernJS port file
.tern-port
=======
.DS_Store
node_modules
/dist


# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
>>>>>>> grupoa/main
29 changes: 29 additions & 0 deletions COMMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
- ### Decisão da arquitetura utilizada:
- Descrita em [arquivo no googledrive](https://docs.google.com/document/d/1_UQO5pPM_7_CCcj6QfwDglX736lMLCz9/edit?usp=sharing&ouid=108063721920486550898&rtpof=true&sd=true)

- ### Lista de bibliotecas de terceiros utilizadas:
- Vuetify.

- ### O que você melhoraria se tivesse mais tempo:
- Dividir rotas para página de Login e página de Consulta de Alunos;
- Gostaria de dividir entre login de Aluno onde teria acesso somente para ver
o cadastro, acessar cursos e trocar a senha e o login administrativo com acesso geral;
Por isso na tela inicial coloquei "Faça o login e comece seus estudos", só os com senha
adm que teriam a opção de cadastrar alunos.
- Criaria a lista do aluno detalhada, onde teria opções de data de matrícula, aulas
assistidas, cursos concluídos, exercícios feitos, entre outros.
- Colocar a opção de não aceitar campos vazios para o cadastro;
- ### Quais requisitos obrigatórios que não foram entregues:
#### Critério de aceite
- Os alunos criados, editados e exluídos irem para o banco de dados. Inicialmente consegui e
coloquei na branch 'consumirAPI', mas como começou a dar erro, retornei para a branch
'finalChallenge' e concluir sem a integração do backend com frontend, apesar de ambos estarem
funcionando individualmente.
- Quando clico em Salvar ... E retorna message de sucesso;
- Abre Cadastro do Aluno E exibe somente alteração dos campos editáveis (nome e email).

#### Desejável
- Testes unitários.

- ### Bônus 👨‍💻
- Vídeo com resumo de apresentação do projeto [aqui](https://watch.screencastify.com/v/7CAdV9MG1yW8RcHuAV2G)
24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<<<<<<< HEAD
GrupoA Educação - Full Stack Web Developer
===================

Expand Down Expand Up @@ -45,7 +46,7 @@ Abaixo alguns mockoups de interface como um guia para a criação do front-end.
- **Dado** que inseri dados válidos nos campos
- **Quando** clico em Salvar
- **Então** cria o novo aluno na base
- **E** retorna mensagem de sucesso
- **E** retorna message de sucesso
####
- **Dado** que inseri dados válidos nos campos
- **Quando** clico em Cancelar
Expand Down Expand Up @@ -118,3 +119,24 @@ Abaixo alguns mockoups de interface como um guia para a criação do front-end.
- Quais requisitos obrigatórios que não foram entregues
4. Informe ao recrutador quando concluir o desafio junto com o link do repositório
5. Após revisão do projeto junto com a equipe de desevolvimento deixe seu repositório privado
=======
# grupoa

## Project setup
```
npm install
```

### Compiles and hot-reloads for development
```
npm run serve
```

### Compiles and minifies for production
```
npm run build
```

### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
>>>>>>> grupoa/main
49 changes: 49 additions & 0 deletions backend/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const express = require('express')
const app = express()
const morgan = require('morgan')

const registeredsnRoute = require('./routes/registered')
const studentsRoute = require('./routes/students')
const usersRoute = require('./routes/users')

// o morgan executa um callback para dar proseguimento ao projeto
app.use(morgan('dev'));

// definindo cabeçario
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header(
'Access-Control-Allow-Header',
'Origin, X-Requested-With, Content-Type, Accept, Authorization'
)

// o OPTIONS é muito usado quando implementar frontend para consumir a API
if (req.method === 'OPTIONS') {
req.header('Access-Control-Allow-Methods', 'GET, PUT, POST, PATCH, DELETE');
return res.status(200).send({});
}

next();
})

app.use('/registered', registeredsnRoute)
app.use('/alunos', studentsRoute)
app.use('/usuarios', usersRoute)

// tratamento de erro se não econtrar nenhuma rota
app.use((req, res, next) => {
const erro = new Error('Rota não encontrada!')
erro.status = 404;
next(erro)
})

app.use((error, req, res, next) => {
res.status(error.status || 500)
return res.send({
erro: {
message: error.message
}
})
})

module.exports = app;
167 changes: 167 additions & 0 deletions backend/controllers/registered-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
const mysql = require('../mysql').pool

exports.getCadastros = (req, res, next) =>{

mysql.getConnection((error, conn) => {
if (error) { return res.status(500).send({ error: error }) }
conn.query (
'SELECT * FROM cadastros;',
(error, result, fields) => {
if (error) { return res.status(500).send({ error: error }) }
const response = {
quantidade: result.length,
cadastros: result.map(cad => {
return {
id_cadastro: cad.id_cadastro,
nome: cad.nome,
email: cad.email,
ra: cad.ra,
cpf: cad.cpf,
request: {
tipo: 'GET',
descricao: 'Retorna um cadastrado específico',
url: 'http//localhost:3000/cadastros/' + cad.id_cadastro
}
}
})
}
return res.status(200).send(response)
}
)
})
}

exports.postCadastro = (req, res, next) =>{
mysql.getConnection((error, conn) => {
if (error) { return res.status(500).send({ error: error }) }
conn.query(
'INSERT INTO cadastros (nome, email, ra, cpf) VALUES (?,?,?,?)',
[req.body.nome, req.body.email, req.body.ra, req.body.cpf],
(error, result, field) => {
// release para liberar a conexão do callback
conn.release()
if (error) { return res.status(500).send({ error: error }) }
const response = {
message: 'Cadastro realizado com sucesso',
cadastroCriado : {
id_cadastro: result.id_cadastro,
nome: req.body.nome,
email: req.body.email,
ra: req.body.ra,
cpf: req.body.cpf,
request: {
tipo: 'GET',
descricao: 'Retorna todos os cadastros',
url: 'http//localhost:3000/cadastros'
}
}
}

return res.status(201).send(response)
}
)
})
}

exports.getUmCadastro = (req, res, next) =>{
mysql.getConnection((error, conn) => {
if (error) { return res.status(500).send({ error: error }) }
conn.query (
'SELECT * FROM cadastros WHERE id_cadastro = ?;',
[req.params.id_cadastro],
(error, result, fields) => {
if (error) { return res.status(500).send({ error: error }) }

if (result.length == 0) {
return res.status(404).send({
message: 'Não foi encontrado cadastro com este ID'
})
}
const response = {
cadastro : {
id_cadastro: result[0].id_cadastro,
nome: result[0].nome,
email: result[0].email,
ra: result[0].ra,
cpf: result[0].cpf,
request: {
tipo: 'GET',
descricao: 'Retorna todos os cadastros',
url: 'http//localhost:3000/cadastros'
}
}
}
return res.status(200).send({ response: result })
}
)
})
}

exports.updateCadastro = (req, res, next) =>{
mysql.getConnection((error, conn) => {
if (error) { return res.status(500).send({ error: error }) }
conn.query(
`UPDATE cadastros
SET nome = ?,
email = ?,
ra = ?,
cpf = ?
WHERE id_cadastro = ?`,
[
req.body.nome,
req.body.email,
req.body.ra,
req.body.cpf,
req.body.id_cadastro
],
(error, result, field) => {
conn.release()
if (error) { return res.status(500).send({ error: error }) }
const response = {
message: 'Cadastro atualizado com sucesso',
cadastroAtualizado : {
id_cadastro: req.body.id_cadastro,
nome: req.body.nome,
email: req.body.email,
ra: req.body.ra,
cpf: req.body.cpf,
request: {
tipo: 'GET',
descricao: 'Retorna detalhes de um cadastro específico',
url: 'http//localhost:3000/cadastros' + req.body.id_cadastro
}
}
}
return res.status(202).send(response)
}
)
})
}

exports.deleteCadastro = (req, res, next) =>{
mysql.getConnection((error, conn) => {
if (error) { return res.status(500).send({ error: error }) }
conn.query(
`DELETE FROM cadastros WHERE id_cadastro = ?`, [req.body.id_cadastro],
(error, result, field) => {
conn.release()
if (error) { return res.status(500).send({ error: error }) }
const response = {
message: 'Cadastro excluido com sucesso!',
request: {
tipo: 'POST',
descricao: 'Insere um cadastro',
url: 'http://localhost:3000/cadastros',
body: {
nome: 'String',
email: 'String',
ra: 'Number',
cpf: 'Number'
}
}
}
return res.status(202).send(response)
}
)
})
}
Loading