Crie o aplicativo Windows Form para o sistema de academia, que será feito no nosso projeto.
Para adicionar o pacote SQLite no projeto, vá em Gerenciador de Soluções, Gerenciar Pacotes do Nuget, caso não esteja instalado, procure pelo pacote System.Data.SQLite e instale no nosso projeto.
Crie um banco de dados com o nome academia.db3 e coloque ele na pasta "bancos" dentro do projeto, e coloque esse código:
create table if not exists usuario (
id integer not null primary key autoincrement,
nome varchar(30) not null,
username varchar(20) not null unique,
senha varchar(40) not null,
status char(1) not null,
nivel integer not null
);
Coloque na pasta de projetos a pasta imgs e as imagens de led verde e vermelho. Na tela principal (primeiro form), coloque um container panel e coloque ele na parte inferior (em Dock coloque a opção bottom) e deixe ele com um cinza um pouco mais escuro. Coloque um Picture Box com o name imgLed e do lado dele quatro labels, um escrito acesso, um numérico com o name lblAcs, um escrito usuário e o último com o nome de usuário e name lblUser.
Vá em Gerenciador de Soluções, no Nome do Projeto e em Propriedades (no mesmo local onde alteramos o ícone do programa), clique duas vezes em Resources e adicione os arquivos de imagem nele. Vá em Adicionar Recurso e Adicionar Arquivo Existente. Em Image coloque o Led Image, para ajustar ela vá em SizeMode e coloque a opção StrechImage.
Crie a classe Banco com esse código:
// Inclua System.Data e System.Data.SQLite
class Banco {
private static SQLiteConnection conexao;
private static string dirAtual = Directory.GetCurrentDirectory(); // Inclua System.IO
private static SQLiteConnection conexaoBanco() {
conexao = new SQLiteConnection($"Data Source={dirAtual}\\bancos\\academia.db3"); // Duas barras sempre, colocar a pasta do banco no local onde está o binário
conexao.Open();
return conexao;
}
}
Crie na classe Banco esse método:
public static DataTable obterTodosUsuarios() {
SQLiteDataAdapter dataAp = null;
DataTable dataTab = new DataTable();
try {
using(SQLiteCommand comando = conexaoBanco().CreateCommand()) {
comando.CommandText = "select * from usuario"; // Comando SQL
dataAp = new SQLiteDataAdapter(comando.CommandText, conexaoBanco());
dataAp.Fill(dataTab);
conexaoBanco().Close();
return dataTab;
}
}
catch(Exception ex) {
MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
conexaoBanco().Close();
return null;
}
}
Crie um formulário pra login e nele coloque os labels e textBox para login e senha e os botões de enviar e cancelar, e mude os names deles (o campo de senha deve ser colocado o asterisco no passwordChar, pode ser a bolinha ● também).
Na classe do Form1, coloque isso no construtor:
public Form1() {
InitializeComponent();
FormLogin fLogin = new FormLogin(this);
}
Na classe do FormLogin, faça assim:
public partial class FormLogin : Form {
Form1 form;
DataTable dataTab = new DataTable();
public FormLogin(Form1 f) {
InitializeComponent();
form = f;
}
}
No form principal, coloque o picture box e os labels com os modificadores public, em propriedades, já que vamos manipular eles pelo outro formulário.
No formLogin, adicione os eventos de clicar dos botões enviar e cancelar.
Crie a classe Global com esse código:
class Global {
public static string versao = "1.0";
public static bool logado = false;
public static int nivel = 0;
}
Nos eventos do botão de login e cancelar, coloque esse código:
private void btnEnv_Click(object sender, EventArgs e) {
string user = txtLogin.Text.Trim();
string senha = txtSenha.Text.Trim();
if(user.Equals("") || senha.Equals("")) {
MessageBox.Show("Preencha Todos os Campos!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtLogin.Focus();
return;
}
string sql = "select * from usuario where username = @user and senha = @senha";
Dictionary<string, string> parametros = new Dictionary<string, string>();
parametros.Add("@user", user);
parametros.Add("@senha", senha);
dataTab = Banco.consultaBanco(sql, parametros);
if(dataTab.Rows.Count == 1) {
// Duas formas de fazer:
form.lblAcs.Text = dataTab.Rows[0].ItemArray[5].ToString(); // O número do segundo array é o número da coluna a partir do 0
form.lblUser.Text = dataTab.Rows[0].Field<string>("username"); // Nome do campo desejado do SQL
form.imgLed.Image = Properties.Resources.led_green;
Global.nivel = int.Parse(dataTab.Rows[0].Field<Int64>("nivel").ToString());
Global.logado = true;
this.Close();
}
else {
MessageBox.Show("Usuário e/ou Senha Incorretos!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnCanc_Click(object sender, EventArgs e) {
this.Close();
}
Os campos com arroba, são consultas preparadas para evitar SQL Injection.
Na classe Banco, crie esses métodos genéricos para consulta:
public static DataTable consultaBanco(string sql) {
SQLiteDataAdapter dataAp = null;
DataTable dataTab = new DataTable();
try {
using(SQLiteCommand comando = conexaoBanco().CreateCommand()) {
comando.CommandText = sql; // Comando SQL
dataAp = new SQLiteDataAdapter(comando.CommandText, conexaoBanco());
dataAp.Fill(dataTab);
conexaoBanco().Close();
return dataTab;
}
}
catch(Exception ex) {
MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
conexaoBanco().Close();
return null;
}
}
public static DataTable consultaBanco(string sql, Dictionary<string, string> dados) {
SQLiteDataAdapter dataAp = null;
DataTable dataTab = new DataTable();
try {
using(SQLiteCommand comando = conexaoBanco().CreateCommand()) {
comando.CommandText = sql;
if(dados.Count > 0) {
foreach(KeyValuePair<string, string> d in dados) {
comando.Parameters.AddWithValue(d.Key, d.Value);
}
}
comando.CommandType = CommandType.Text;
dataAp = new SQLiteDataAdapter(comando.CommandText, conexaoBanco());
dataAp.SelectCommand = comando;
dataAp.Fill(dataTab);
conexaoBanco().Close();
return dataTab;
}
}
catch(Exception ex) {
MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
conexaoBanco().Close();
return null;
}
Coloque um cadastro no SQLite, por exemplo:
insert into usuario (nome, username, senha, status, nivel) values ('Andressa', 'dessa80', '123', 'A', '7');
Coloque no form principal um menu com login e os itens entrar e sair, com esse código:
private void itEntr_Click(object sender, EventArgs e) { // O código desse evento pode ser colocado também no evento load do form principal.
FormLogin form = new FormLogin(this);
form.ShowDialog();
}
private void itSair_Click(object sender, EventArgs e) {
this.lblAcs.Text = "0";
this.lblUser.Text = "---";
this.imgLed.Image = Properties.Resources.led_red;
Global.nivel = 0;
Global.logado = false;
}
PS: Para criptografar senhas, use essa classe:
class CriptSenha {
// Inclua System.Text e System.Security.Cryptography
public static string encripta(string valor, string tipo) {
string hash;
if(tipo.Equals("SHA-1")) {
SHA1 dados = new SHA1CryptoServiceProvider();
hash = BitConverter.ToString(dados.ComputeHash(Encoding.UTF8.GetBytes(valor))).Replace("-", string.Empty).ToLower();
}
else if(tipo.Equals("SHA-256")) {
SHA256 dados = new SHA256CryptoServiceProvider();
hash = BitConverter.ToString(dados.ComputeHash(Encoding.UTF8.GetBytes(valor))).Replace("-", string.Empty).ToLower();
}
else {
MD5 dados = new MD5CryptoServiceProvider();
hash = BitConverter.ToString(dados.ComputeHash(Encoding.UTF8.GetBytes(valor))).Replace("-", string.Empty).ToLower();
}
return hash;
}
}
E aonde usar ela, coloque assim:
parametros.Add("@senha", CriptSenha.encripta(senha, "SHA-1"));
PS: A senha deverá estar guardada no banco no mesmo formato do método.