Aplicação web com CRUD desenvolvida com python, flask, sqlalchemy e mongodb:
- Sistema de controle de estoque e gerenciamento de usuários da aplicação com controle de acesso e funcionalidades diferentes dependendo do nível do usuário.
O controle de acesso é verificado em toda chamada GET ou POST nas rotas para verificar se o usuário tem o nível preciso para realizar a operação, se o usuário está logado em uma sessão e se o usuário está tentando acessar a sessão de outra pessoa.
Todo o código está extensamente comentado, possui templates html com estilizações em css. Por preferência, os comentários do código foram feitos em inglês.
| Nível do Usuário | Atualizar sua Própria Conta | Visualizar os Produtos | Adicionar um Produto | Editar um Produto | Deletar um Produto | Visualizar os Usuários | Adicionar um Usuário | Editar um Usuário | Deletar um Usuário |
|---|---|---|---|---|---|---|---|---|---|
| User | ☑ |
☑ |
☐ |
☐ |
☐ |
☐ |
☐ |
☐ |
☐ |
| Admin | ☑ |
☑ |
☑ |
☑ |
☑ |
☑ |
☑ |
☑ |
☑ |
Novas contas criadas na aplicação terão o nível de usuário 'user' por padrão, a única maneira de elevar o nível para 'admin' é editando a conta do usuário pelo gerenciamento de usuários, funcionalidade que só é disponibilizada para usuários administradores.
- Usuário comum padrão: login: user, senha: user.
- Usuário administrador padrão: login: admin, senha: admin.
A demonstração geral foi limitada a duas funcionalidades, a visão do controle de inventário por um usuário comum, e a visão do administrador, incluindo o controle dos usuários da aplicação.
Visão geral usuário comum:
user_demo.mp4
Visão geral administrador:
admin_demo.mp4
sign_up_errors.mp4
log_in_errors.mp4
sign_up_and_log_in_sucess.mp4
update_account_errors.mp4
update_account_sucess.mp4
- User:
user_inventory.mp4
-
Admin:
- Add - Erros:
inventory_add_errors.mp4
- Add - Sucesso:
inventory_add.mp4
- Edit - Erros:
inventory_edit_errors.mp4
- Edit - Sucesso:
inventory_edit.mp4
- Delete:
inventory_delete.mp4
- Add - Erros:
admin_create_user_errors.mp4
- Add - Sucesso:
admin_create_user.mp4
- Edit - Erros:
admin_edit_account_errors.mp4
- Edit - Sucesso:
admin_edit_account.mp4
- Delete:
admin_delete_account.mp4
Existem dois bancos de dados na aplicação, o primeiro é o SQLAlchemy (ORM) que comporta os usuários (todas as senhas são submetidas a uma criptografia md5 para serem armazenadas no banco) da aplicação e o segundo o MongoDB que comporta os produtos da aplicação. Cada banco possui sua classe de utilidades, referentes a select, insert, update e delete, sendo o SqlUtils referente ao SQLAlchemy e o MongoUtils referente ao MongoDB, para um detalhamento maior de suas funcionalidades, verificar os comentários no código.
Funcionalidade para um usuário comum criar sua conta na aplicação, possui três tipos de travas diferentes:
-
- Login(username) já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "Username already exists."
-
- E-mail já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "E-mail already exists."
-
- As senhas inseridas não coincidem. (Senha e confirmação de senha) // Retorno: "Password don't match."
Funcionalidade para um usuário logar na aplicação, possui dois tipos de travas diferentes:
-
- O login inserido não existe. // Retorno: "User not found."
-
- A senha inserida está incorreta. // Retorno: "Incorrect Password."
Funcionalidade para um usuário deslogar da aplicação, (por padrão, a sessão dura no máximo 30m, após isso o usuário será deslogado automaticamente).
Funcionalidade para um usuário visualizar informações sobre sua conta, retorna as seguintes informações:
-
- Login
-
- Name
-
Funcionalidade para um usuário atualizar os dados da sua conta, permite modificar qualquer informação, mas necessita da senha atual para que a modificação seja feita. Possui quatro tipos de travas diferentes:
-
- Login(username) já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "Username already exists."
-
- E-mail já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "E-mail already exists."
-
- As senhas inseridas não coincidem. (Senha e confirmação de senha) // Retorno: "Password don't match."
-
- A senha inserida está incorreta. (Senha atual) // Retorno: "Incorrect Password."
Funcionalidade para um usuário visualizar os produtos e seus estoques respectivos, caso o usuário seja administrador ele terá acesso a criação, edição e deleção de produtos. A tela possui a funcionalidade de pesquisa por um produto, sendo de match parcial, funcionando como uma consulta 'LIKE', caso o produto não seja encontrado, será retornado a mensagem "Product not found".
Funcionalidade para um usuário admistrador adicionar um novo produto, o id do usuário será armazenado no registro do produto, possui apenas uma única trava, relacionada a unicidade do registro, constraint unique composta -> [nome do produto, código do produto, endereço do inventário]
-
- O produto já existe no inventário(nome, código, endereço do inventário). (unique constraint composta) // Retorno: "Product already exists in this stock."
Funcionalidade para um usuário admistrador editar um produto, o id do usuário será atualizado para o id de quem está atualizando no registro do produto, possui apenas uma única trava, relacionada a unicidade do registro, constraint unique composta -> [nome do produto, código do produto, endereço do inventário]
-
- O produto já existe no inventário(nome, código, endereço do inventário). (unique constraint composta) // Retorno: "Product already exists in this stock."
Funcionalidade para um usuário admistrador deletar um produto.
Funcionalidade para um usuário administrador visualizar, criar, editar e deletar os usuários da aplicação. A tela possui a funcionalidade de pesquisa por um usuário, sendo de match parcial, funcionando como uma consulta 'LIKE', caso o usuário não seja encontrado, será retornado a mensagem "User not found".
Funcionalidade para um usuário admistrador adicionar um novo usuário, possibilitando a escolha do nível do usuário, possui as mesmas travas que a criação de uma conta possuem:
-
- Login(username) já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "Username already exists."
-
- E-mail já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "E-mail already exists."
-
- As senhas inseridas não coincidem. (Senha e confirmação de senha) // Retorno: "Password don't match."
Funcionalidade para um usuário admistrador editar as informações de um usuário, possui as mesmas travas que a criação de uma conta possuem:
-
- Login(username) já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "Username already exists."
-
- E-mail já existente na aplicação. (Login e e-mail são unique constraints no banco) // Retorno: "E-mail already exists."
-
- As senhas inseridas não coincidem. (Senha e confirmação de senha) // Retorno: "Password don't match."
Funcionalidade para um usuário admistrador deletar um usuário.
Para rodar o código em sua máquina será necessário criar uma conta no site MongoDB Atlas, realize a conexão com seu cluster substituindo o código de conexão na linha 9 do arquivo 'mongodb.py' pelo seu.
dial_web_development_flask:
- static -> arquivos css referentes aos templates html.
- templates -> templates html.
- app.py -> arquivo principal, adiciona todas as rotas ao app, executar para ligar o app.
- config.py -> arquivo de configurações do servidor.
- diAL_users.db -> banco de dados gerado pelo arquivo 'models.py', contém os usuários da aplicação.
- models.py -> arquivo de criação do banco de dados, contém o modelo da tabela de usuários.
- mongodb.py -> arquivo de instanciação e conexão com o MongoDB Atlas, também contém operações de utilidade (CRUD).
- sql_utils.py -> arquivo de utilidade para manipular o banco de dados, contém operações de CRUD.
- routes.py -> contém todas as rotas da aplicação com suas respectivas regras de negócio.
| Tecnologia | Versão |
|---|---|
| Python | 3.10.4 |
| Flask | 2.2.2 |
| Flask-RESTful | 0.3.9 |
| pymongo | 4.3.3 |
| SQLAlchemy | 1.4.42 |