PHP Classes

How to Create a Multi-User PHP Login System with the Example Application Web App Multi-Perfil: App that uses CRUD to manage multiple users

Recommend this page to a friend!
  Info   Documentation   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2024-03-29 (6 months ago) RSS 2.0 feedNot enough user ratingsTotal: 81 All time: 10,094 This week: 47Up
Version License PHP version Categories
webappmultiperfil 1.0.0MIT/X Consortium ...5PHP 5, Databases, Design Patterns, Ap...
Description 

Author

This package provides an application that uses CRUD to manage multiple users.

It uses the Model-View-Controller (MVC) design pattern and CRUD (Create, Read, Update, and Delete) operation classes to implement an application that allows users to perform several actions with their user profiles.

Currently, it provides controller and CRUD classes that can:

- Manager user profiles

- Manage logged user tokens and access authorization headers

- Manage user permissions

- Manage user addresses

- Manage user attendance at saloons

Picture of Rodrigo Faustino
  Performance   Level  
Name: Rodrigo Faustino <contact>
Classes: 25 packages by
Country: Brazil Brazil
Age: 41
All time rank: 2515174 in Brazil Brazil
Week rank: 7 Up1 in Brazil Brazil Up
Innovation award
Innovation award
Nominee: 17x

Winner: 2x

Documentation

Multi perfil-permissoes

Autenticação e Autorização (somente back via API) Instruções: Clone o repositório e instale as dependências:

git clone https://github.com/faustinopsy/WebAppMultiPerfil.git

composer install

Mini-Documentação do Sistema

  • index.php Serve como o ponto de entrada principal da aplicação. Roteia as requisições para os respectivos controladores.
  • PerfilPermissoes.php Gerencia a relação entre perfis e permissões. Contém lógica para associar ou desassociar permissões de um perfil.
  • Perfis.php Responsável por operações relacionadas a perfis de usuário, como criação, edição e remoção de perfis.
  • Permissoes.php Lida com a gestão de permissões, incluindo a criação e remoção de permissões.
  • Token.php Central para a geração e validação de tokens. Essencial para autenticação e autorização no sistema.
  • Usuarios.php Gerencia operações de usuário, incluindo registro, login e atualização de informações do usuário. Aspectos Importantes

Login e Tokens:

Durante o login, um token é fornecido ao usuário. Este token é crucial para a autenticação subsequente e contém informações importantes, como permissões do usuário e seu ID.

public function login($senha,$lembrar) {
        $condicoes = ['email' => $this->usuarios->getEmail(),'ativo' => 1];
        $resultado = $this->select($this->usuarios, $condicoes);
        $checado=$lembrar? 60*12 : 3;
        $permissoes=[];
        if (!$resultado) {
            return ['status' => false, 'message' => 'Usuário não encontrado ou bloqueado.'];
        }
        if (!password_verify($senha, $resultado[0]['senha'])) {
            return ['status' => false, 'message' => 'Senha incorreta.'];
        }
        $perfper = $this->select($this->PerfilPermissoes,['perfilid'=>$resultado[0]['perfilid']]);
        foreach($perfper as $key => $value){
            $permissoes[] = $this->select($this->permissoes,['id'=>$value['permissao_id']]);
        } 
        foreach ($permissoes as $permissaoArray) {
            foreach ($permissaoArray as $permissao) {
                if (isset($permissao['nome'])) {
                    $permissoesNomes[] = $permissao['nome'];
                }
            }
        }
        $key = TOKEN;
        $local=$_SERVER['HTTP_HOST'];
        $nome=$_SERVER['SERVER_NAME'];
        $algoritimo='HS256';
            $payload = [
                "iss" =>  $local,
                "aud" =>  $nome,
                "iat" => time(),
                "exp" => time() + (60 * $checado),  
                "sub" => $resultado[0]['id'],
                'telas'=>$permissoesNomes
            ];
            
            $jwt = JWT::encode($payload, $key,$algoritimo);
        return ['status' => true, 'message' => 'Login bem-sucedido!','token'=>$jwt,'telas'=>$permissoesNomes];
    }

Permissões no Token:

As permissões incluídas no token determinam o que o usuário pode fazer dentro do sistema. Isso permite um controle de acesso eficaz e seguro.

Uso do ID do Usuário:

Em algumas operações, como inserção de registros ou logs, o ID do usuário é extraído do token. Isso assegura que as ações sejam corretamente atribuídas ao usuário autenticado.

  • TokenController: faz a verificação se o token foi expirado, ou se a origem do dominio é o mesmo que criou o token e recupera o ID do usuário que esta no token
$router->post('/', function () {
        $body = json_decode(file_get_contents('php://input'), true);
        $permitido = new TokenController();
        $permitido->autorizado();
        $iduser= $permitido->verIdUserToken();
        $perfil = new Perfis();
        $perfil->setNome($body['nome']);
        $perfil->setCreate_id($iduser);
        $controller = new PerfilController($perfil);
            $resultado = $controller->adicionarPerfil();
            echo json_encode($resultado);
    });

API Documentation - Detailed

Authorization não é fixa, pois a cada login é gerado novo token para validação subsequente, no projeto login no meu github possui um frontend que contem um javascript que faz uma requisição a cada 3 minutos para validar o login, caso queira saber mais, pois no exemplo abaixo na parte do login estou enviando o lembrar-me como true o que faz o token não expirar, mas se o lembrar-me for false o token é expiravel em alguns minutos.

List_Permissões

Method: GET

URL: http://localhost/backend/Router/Permissoes

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body: N/A

Registrar_Permissões

Method: POST

URL: http://localhost/backend/Router/Permissoes

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body:

{
    "nome":"xxxxxxx"
}

List_Perfil

Method: GET

URL: http://localhost/backend/Router/Perfil

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body: N/A

Registrar_Perfil

Method: POST

URL: http://localhost/backend/Router/Perfil

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body:

{
    "nome":"xxxxx"
}

Login

Method: POST

URL: http://localhost/backend/Router/Usuarios/login

Headers:

Body:

{
    "email":"rfaustino@gmail.com",
    "senha":"123456",
    "lembrar":"true"
}

Usuarios

Method: GET

URL: http://localhost/backend/Router/Usuarios

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body: N/A

Registrar_Usuarios

Method: POST

URL: http://localhost/backend/Router/Usuarios/Registrar

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body:

{
    "nome":"Rodrigo Teste",
    "email":"rfaustino@gmail.com",
    "senha":"123456"
}

Deletar_Usuarios

Method: DELETE

URL: http://localhost/backend/Router/Usuarios

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body:

{
    "email":"rfaustino@gmail.com"
}

Associar_perfil_permissao

Method: POST

URL: http://localhost/backend/Router/Associar

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body:

{
    "perfilId":"2",
    "permissao_id":"1"
}

list_perfil_permissao

Method: GET

URL: http://localhost/backend/Router/Associar/2

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body: N/A

Deletar_Associação

Method: DELETE

URL: http://localhost/backend/Router/Associar/4

Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"

Body:

{
    "permissao_id":"5"
}

Aspectos epeciais

Classe Crud (A classe especial)

Localizada em App\Database\Crud, esta classe é responsável pelas operações básicas de banco de dados em um estilo de programação orientado a objetos. Ela estende a classe Connection, indicando que gerencia a conexão com o banco de dados. A classe Crud segue o padrão de design Active Record, que é um padrão de acesso a dados. Este padrão implica que um objeto de um modelo contém tanto os dados (representados pelos campos do banco de dados) quanto o comportamento que inclui a lógica de acesso a esses dados (as operações CRUD). A classe estende uma Connection, que presumivelmente gerencia a conexão com o banco de dados, seguindo o princípio de herança para reutilizar a lógica de conexão.

Possibilidades e Melhorias

Reflexão para Mapeamento Objeto-Relacional (ORM): Utiliza reflexão para mapear propriedades de objetos para colunas em uma tabela de banco de dados. Isso permite uma abstração significativa, mas tem limitações, como a necessidade de que as propriedades sejam privadas e mapeadas um-a-um com as colunas da tabela.

Abstração e Flexibilidade: Facilita operações com o banco de dados sem escrever SQL diretamente, abstraindo muitos dos detalhes e aumentando a segurança contra injeções de SQL através do uso de prepared statements.

Melhorias:

Validação e Sanitização: Incluir mecanismos de validação e sanitização de dados antes de executar operações no banco de dados para aumentar a segurança. Padronização dos Nomes das Tabelas: A classe assume que o nome da tabela é o nome da classe do objeto passado em minúsculas. Isso pode não ser sempre desejável ou viável, especialmente em bancos de dados com convenções de nomenclatura específicas. Tratamento de Erros: O código atualmente apenas imprime mensagens de erro. Seria mais adequado lançar exceções ou utilizar um sistema de logging para registrar esses erros. Suporte a Relacionamentos: Não há suporte explícito para o mapeamento de relações entre tabelas, como chave estrangeira, o que poderia ser uma adição valiosa.

Funcionalidades da Classe Crud:

  • getLastInsertId: Retorna o ID do último registro inserido.
  • insert: Insere um novo registro no banco de dados baseado no objeto passado. Utiliza reflexão para determinar as propriedades privadas do objeto e seus valores, construindo e executando uma consulta SQL INSERT.
  • select: Realiza uma consulta SELECT no banco de dados. Permite condições de pesquisa flexíveis, incluindo operadores como LIKE e BETWEEN.
  • update: Atualiza registros existentes no banco de dados. Similar ao método insert, utiliza reflexão para construir a consulta UPDATE.
  • delete: Remove registros do banco de dados com base nas condições fornecidas.

Uso de Reflexão:

A classe Crud utiliza reflexão (a classe ReflectionClass do PHP) para manipular propriedades privadas dos objetos passados. Isso permite que a classe opere de maneira genérica com diferentes tipos de objetos, adequando-se às necessidades de várias tabelas e estruturas de dados.

Reflexão em PHP

Reflexão é um recurso de linguagens de programação que permite a um programa inspecionar e modificar sua estrutura e comportamento em tempo de execução. Em PHP, a reflexão é usada principalmente para:

Obter Informações sobre Classes e Objetos: Inspecionar classes, propriedades, métodos e outros aspectos internos de um objeto.

Acessar Propriedades e Métodos:

Manipular propriedades e invocar métodos, independentemente de sua visibilidade (pública, protegida ou privada). Vantagens e Usabilidade no Contexto dos Códigos Nos códigos fornecidos, a reflexão é usada na classe Crud para manipular objetos de diferentes tipos de forma genérica. Vamos detalhar suas vantagens e usabilidade:

Abstração e Reutilização de Código:

A classe Crud é capaz de realizar operações de banco de dados com qualquer tipo de objeto sem necessitar de implementações específicas para cada tipo. Isso é possível porque a reflexão permite inspecionar os objetos em tempo de execução e descobrir suas propriedades. Assim, a mesma lógica de insert, update, select e delete pode ser reutilizada para diferentes tipos de entidades.

Flexibilidade com Propriedades Privadas:

Normalmente, propriedades privadas em uma classe não são acessíveis fora da própria classe. No entanto, com reflexão, a classe Crud pode acessar e modificar essas propriedades. Isso é crucial para operações de banco de dados onde cada propriedade do objeto pode mapear para uma coluna na tabela do banco de dados.

Construção Dinâmica de Consultas SQL:

A reflexão permite que a classe Crud construa consultas SQL dinamicamente baseadas nos objetos passados. Por exemplo, ao inserir um objeto, a classe pode automaticamente gerar uma instrução INSERT INTO com colunas e valores correspondentes às propriedades do objeto. Isso elimina a necessidade de escrever consultas SQL manualmente para cada tipo de objeto, simplificando o código e reduzindo a probabilidade de erros.

Manutenção e Extensibilidade do Código:

A capacidade de tratar diferentes tipos de objetos de maneira genérica facilita a manutenção e extensão do código. Novas entidades podem ser adicionadas ao sistema sem a necessidade de alterar a lógica central de CRUD, desde que sigam a estrutura esperada.

Entendendo a classe CRUD

Na classe que irá usar o CRUD, usa extends para herdar a classe CRUD, e inicia o construtor da classe pai que a classe CRUD dentro do proprio construtor.

1º:

class PerfilController extends Crud{
    private $perfil;
    public function __construct($perfil){
        parent::__construct();
        $this->perfil=$perfil;
    }

Assim a classe filha poderá usar o "$this" como se fosse a própria classe, usando os métodos da classe pai, pois herdou e instanciou-a 2º SELECT $this->select(ARGUMENTO1, ARGUMENTO2) - $this->perfil = ARGUMENTO 1, classe Model que representa a tabela do banco de dados. - ['nome'=> $this->perfil->getNome()) = ARGUMENTO 2, um array nome da coluna do banco e seu valor. se vazio [] trará todos os registros. - uso com betwwen: ['latitude' => ['BETWEEN', [$latMin, $latMax]]] - uso com like: ['bairro' => ['LIKE', $this->enderecos->getBairro()]]

$this->select($this->perfil,['nome'=> $this->perfil->getNome()]);

Uso de um select especial como Inner join: onde precisaria exibir todas as permissoes de um perfil (neste caso há uma associação N:N), primeiro busquei o perfil especifico e com o resultado que é o id das permissões listei em um array todas as permissões.

public function obterPermissoesDoPerfil($permissoes){
         $resultado = $this->select($this->perfilpermissoes,['perfilid'=> $this->perfilpermissoes->getPerfilid()]);
         $dados=[];
         foreach($resultado as $key => $value) {
            $dados[] = $this->select($permissoes,['id'=> $value['permissao_id']]);
         }
         return $dados;
    }

Mas o padrão de uso é enviar a "classe model" que representa a tabela do banco no primeiro argumento do método.

Fluxo de Cadastro e Listagem

  • 1. Ponto de Entrada: index.php Função: index.php atua como o ponto de entrada do aplicativo. Ele direciona as requisições HTTP para os respectivos controladores baseados na URL acessada. Processo: Quando uma requisição é feita, index.php determina qual rota corresponde à URL e passa o controle para o arquivo e função relevantes definidos na rota.
  • 2. Arquivos de Rota: Usuarios.php (Rota) Função: Define as rotas específicas (como /usuarios) e os métodos HTTP (GET, POST, etc.) correspondentes. Processo: Quando uma rota é chamada, ela instanciará o controlador apropriado e chamará o método relevante para lidar com a requisição.
  • 3. Model: Usuarios.php (Model) Função: Representa a estrutura de dados do usuário. Contém definições e regras dos dados que um usuário pode ter. Processo: O Model é usado pelo controlador para criar objetos de usuário com dados que podem ser salvos ou recuperados do banco de dados.
  • 4. UsuarioController Função: Contém a lógica de negócios para operações de usuário. Processo: Para o cadastro, o controlador recebe dados do usuário, cria um objeto de usuário e utiliza a classe Crud para inserir os dados no banco de dados. Para a listagem, o controlador usa a classe Crud para buscar dados dos usuários do banco de dados.
  • 5. Classe Crud Função: Gerencia operações básicas de banco de dados (CRUD - Criar, Ler, Atualizar, Deletar). Processo: Inserir: Recebe um objeto, extrai seus dados (usando reflexão, se necessário), e executa uma instrução SQL INSERT. Selecionar: Executa uma instrução SQL SELECT para ler dados do banco de dados. Pode ser utilizada para listar usuários. Atualizar e Deletar: Similar ao inserir, mas com as respectivas operações SQL. <img src="assets/img/seqex.svg">

  Files folder image Files (95)  
File Role Description
Files folder imageassets (3 directories)
Files folder imagebackend (1 file, 4 directories)
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file composer.lock Data Auxiliary data
Accessible without login Plain text file database.sql Data Auxiliary data
Accessible without login Image file favicon.ico Icon Icon image
Accessible without login Plain text file index.html Data Application page
Accessible without login Plain text file manifest.json Data Auxiliary data
Accessible without login Plain text file readme.md Doc. Documentation
Accessible without login Plain text file saloes.html Data Application page

  Files folder image Files (95)  /  assets  
File Role Description
Files folder imagecss (4 files, 1 directory)
Files folder imageimg (16 files)
Files folder imagejs (6 files, 3 directories)

  Files folder image Files (95)  /  assets  /  css  
File Role Description
Files folder imageimages (5 files)
  Accessible without login Plain text file leaflet.css Data Auxiliary data
  Accessible without login Plain text file styleaTime.css Data Auxiliary data
  Accessible without login Plain text file styles.css Data Auxiliary data
  Accessible without login Plain text file w3.css Data Auxiliary data

  Files folder image Files (95)  /  assets  /  css  /  images  
File Role Description
  Accessible without login Image file layers-2x.png Icon Icon image
  Accessible without login Image file layers.png Icon Icon image
  Accessible without login Image file marker-icon-2x.png Icon Icon image
  Accessible without login Image file marker-icon.png Icon Icon image
  Accessible without login Image file marker-shadow.png Icon Icon image

  Files folder image Files (95)  /  assets  /  img  
File Role Description
  Accessible without login Image file about.png Icon Icon image
  Accessible without login Image file admin.png Data Auxiliary data
  Accessible without login Image file cad.png Icon Icon image
  Accessible without login Image file combina.png Icon Icon image
  Accessible without login Image file conf.png Icon Icon image
  Accessible without login Image file home.png Data Auxiliary data
  Accessible without login Image file img_avatar4.png Data Auxiliary data
  Accessible without login Image file list.png Icon Icon image
  Accessible without login Image file login.png Data Auxiliary data
  Accessible without login Image file logo.jpg Data Auxiliary data
  Accessible without login Image file logo.png Data Auxiliary data
  Accessible without login Image file permiss.png Data Auxiliary data
  Accessible without login Image file salao.png Data Auxiliary data
  Accessible without login Image file salon.png Icon Icon image
  Accessible without login Plain text file seqex.svg Data Auxiliary data
  Accessible without login Image file users.png Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  
File Role Description
Files folder imagecomponents (2 files, 4 directories)
Files folder imagejson (2 files)
Files folder imagelang (2 files)
  Accessible without login Plain text file App.js Data Auxiliary data
  Accessible without login Plain text file heatmap.min.js Data Auxiliary data
  Accessible without login Plain text file leaflet.js Data Auxiliary data
  Accessible without login Plain text file MouseTrackerSDK.js Data Auxiliary data
  Accessible without login Plain text file script.js Data Auxiliary data
  Accessible without login Plain text file sweetalert2.11.js Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  components  
File Role Description
Files folder imagecad (2 files)
Files folder imagelib (5 files)
Files folder imagelist (5 files)
Files folder imagescreen (7 files)
  Accessible without login Plain text file Home.js Data Auxiliary data
  Accessible without login Plain text file Navbar.js Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  components  /  cad  
File Role Description
  Accessible without login Plain text file CadEnderecos.js Data Auxiliary data
  Accessible without login Plain text file CadSaloes.js Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  components  /  lib  
File Role Description
  Accessible without login Plain text file BuscaApiG.js Data Auxiliary data
  Accessible without login Plain text file HeatmapComponent.js Data Auxiliary data
  Accessible without login Plain text file Mensagens.js Data Auxiliary data
  Accessible without login Plain text file MouseMovementTracker.js Data Auxiliary data
  Accessible without login Plain text file ValidadorToken.js Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  components  /  list  
File Role Description
  Accessible without login Plain text file GerenciadorPermissoes.js Data Auxiliary data
  Accessible without login Plain text file GerenciadorSaloes.js Data Auxiliary data
  Accessible without login Plain text file GerenciadorUsuarios.js Data Auxiliary data
  Accessible without login Plain text file ListaSaloes.js Data Auxiliary data
  Accessible without login Plain text file ListaSaloeslivre.js Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  components  /  screen  
File Role Description
  Accessible without login Plain text file About.js Data Auxiliary data
  Accessible without login Plain text file Admin.js Data Auxiliary data
  Accessible without login Plain text file LoginScreen.js Data Auxiliary data
  Accessible without login Plain text file MapaSaloes.js Data Auxiliary data
  Accessible without login Plain text file MinhaArea.js Data Auxiliary data
  Accessible without login Plain text file RecoveryScreen.js Data Auxiliary data
  Accessible without login Plain text file RegistrationScreen.js Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  json  
File Role Description
  Accessible without login Plain text file cards.json Data Auxiliary data
  Accessible without login Plain text file times.json Data Auxiliary data

  Files folder image Files (95)  /  assets  /  js  /  lang  
File Role Description
  Accessible without login Plain text file en.json Data Auxiliary data
  Accessible without login Plain text file pt.json Data Auxiliary data

  Files folder image Files (95)  /  backend  
File Role Description
Files folder imageController (9 files)
Files folder imageDatabase (4 files)
Files folder imageModel (7 files)
Files folder imageRouter (10 files)
  Accessible without login Plain text file .htaccess Data Auxiliary data

  Files folder image Files (95)  /  backend  /  Controller  
File Role Description
  Plain text file AnaliticosController.php Class Class source
  Plain text file EnderecosController.php Class Class source
  Plain text file EnviaEmail.php Class Class source
  Plain text file PerfilController.php Class Class source
  Plain text file PerfilPermissaoController.php Class Class source
  Plain text file PermissaoController.php Class Class source
  Plain text file SaloesController.php Class Class source
  Plain text file TokenController.php Class Class source
  Plain text file UsuarioController.php Class Class source

  Files folder image Files (95)  /  backend  /  Database  
File Role Description
  Accessible without login Plain text file config.php Conf. Configuration script
  Accessible without login Plain text file configEmail.php Conf. Configuration script
  Plain text file Connection.php Class Class source
  Plain text file Crud.php Class Class source

  Files folder image Files (95)  /  backend  /  Model  
File Role Description
  Plain text file Analiticos.php Class Class source
  Plain text file Enderecos.php Class Class source
  Plain text file PerfilPermissoes.php Class Class source
  Plain text file Perfis.php Class Class source
  Plain text file Permissoes.php Class Class source
  Plain text file Saloes.php Class Class source
  Plain text file Usuarios.php Class Class source

  Files folder image Files (95)  /  backend  /  Router  
File Role Description
  Accessible without login Plain text file .htaccess Data Auxiliary data
  Accessible without login Plain text file Analiticos.php Example Example script
  Accessible without login Plain text file Enderecos.php Example Example script
  Accessible without login Plain text file index.php Example Example script
  Accessible without login Plain text file PerfilPermissoes.php Example Example script
  Accessible without login Plain text file Perfis.php Example Example script
  Accessible without login Plain text file Permissoes.php Example Example script
  Accessible without login Plain text file Saloes.php Example Example script
  Accessible without login Plain text file Token.php Example Example script
  Accessible without login Plain text file Usuarios.php Example Example script

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads Download Rankings  
 100%
Total:81
This week:0
All time:10,094
This week:47Up