Baixe o app para aproveitar ainda mais
Prévia do material em texto
Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 1 Criando a base de dados: Relacionamento de cardinalidade "Muitos para muitos" Criando as tabelas: Usuario IdUsuario Login Senha 1 smendes 123 2 anapaula 456 UsuarioPerfil IdUsuario IdPerfil Perfil 1 1 IdPerfil Nome 1 2 1 Administrador 2 1 2 Cliente ** Entidade Associativa Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 2 create table Perfil( IdPerfil integer identity(1,1), Nome nvarchar(25) not null, primary key(IdPerfil)) go create table Usuario( IdUsuario integer identity(1,1), Nome nvarchar(50) not null, Login nvarchar(25) not null unique, Senha nvarchar(100) not null, Foto nvarchar(50) not null unique, DataCadastro datetime not null, primary key(IdUsuario)) go create table UsuarioPerfil( IdUsuario integer not null, IdPerfil integer not null, primary key(IdUsuario, IdPerfil), foreign key(IdUsuario) references Usuario(IdUsuario), foreign key(IdPerfil) references Perfil(IdPerfil)) go Tabelas criadas: Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 3 \Web.config.xml Mapeamento da connectionstring do banco de dados: <connectionStrings> <add name="aula10" connectionString="Data Source=(LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\COTI\Desktop\Aula_21.11.18\Aula10\ Projeto.Presentation\App_Data\Banco.mdf;Integrated Security=True" /> </connectionStrings> ----------------------- Adicionando referencia de System.Configuration no projeto Repository: Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 4 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projeto.Repository.Entities { public class Perfil { //propriedades [prop] + 2x[tab] public int IdPerfil { get; set; } public string Nome { get; set; } //Relacionamento de Associação (TER->MUITOS) public List<Usuario> Usuarios { get; set; } //sobrescrita do método ToString() public override string ToString() { return $"Id: {IdPerfil}, Nome: {Nome}"; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projeto.Repository.Entities { public class Usuario { //propriedades [prop] + 2x[tab] public int IdUsuario { get; set; } public string Nome { get; set; } public string Login { get; set; } public string Senha { get; set; } public string Foto { get; set; } public DateTime DataCadastro { get; set; } //Relacionamento de Associação (TER->MUITOS) public List<Perfil> Perfis { get; set; } //sobrescrita do método ToString() public override string ToString() { return $"Id: {IdUsuario}, Nome: {Nome}, Login: {Login}"; } } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 5 Criando a classe para conexão com o banco de dados: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Configuration; namespace Projeto.Repository.Repositories { public class Conexao { //propriedades [prop] + 2x[tab] public SqlConnection Connection { get; set; } public SqlCommand Command { get; set; } public SqlDataReader DataReader { get; set; } public SqlTransaction Transaction { get; set; } //métodos.. public void AbrirConexao() { Connection = new SqlConnection(ConfigurationManager .ConnectionStrings["aula10"].ConnectionString); Connection.Open(); } public void FecharConexao() { Connection.Close(); } } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 6 Criando interfaces para contratos de repositório: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Projeto.Repository.Entities; //importando.. namespace Projeto.Repository.Contracts { public interface IUsuarioRepository { //método abstrato.. void Inserir(Usuario usuario); //método abstrato.. Usuario Consultar(string login, string senha); //método abstrato.. bool LoginExistente(string login); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projeto.Repository.Contracts { public interface IPerfilRepository { } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 7 Implementando as interfaces: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Projeto.Repository.Entities; using Projeto.Repository.Contracts; namespace Projeto.Repository.Repositories { public class PerfilRepository : Conexao, IPerfilRepository { } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 8 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; //importando.. using Projeto.Repository.Entities; //importando.. using Projeto.Repository.Contracts; //importando.. namespace Projeto.Repository.Repositories { public class UsuarioRepository : Conexao, IUsuarioRepository { } } Implementando a interface: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; //importando.. using Projeto.Repository.Entities; //importando.. using Projeto.Repository.Contracts; //importando.. namespace Projeto.Repository.Repositories { public class UsuarioRepository : Conexao, IUsuarioRepository { Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 9 public void Inserir(Usuario usuario) { string query = "insert into Usuario(Nome, Login, Senha, Foto, DataCadastro) " + "values(@Nome, @Login, @Senha, @Foto, @DataCadastro)"; Command = new SqlCommand(query, Connection); Command.Parameters.AddWithValue("@Nome", usuario.Nome); Command.Parameters.AddWithValue("@Login", usuario.Login); Command.Parameters.AddWithValue("@Senha", usuario.Senha); Command.Parameters.AddWithValue("@Foto", usuario.Foto); Command.Parameters.AddWithValue("@DataCadastro", usuario.DataCadastro); Command.ExecuteNonQuery(); } public Usuario Consultar(string login, string senha) { string query = "select* from Usuario where Login = @Login and Senha = @Senha"; Command = new SqlCommand(query, Connection); Command.Parameters.AddWithValue("@Login", login); Command.Parameters.AddWithValue("@Senha", senha); DataReader = Command.ExecuteReader(); //verificar se o usuario foi encontrado.. if(DataReader.Read()) { Usuario usuario = new Usuario(); usuario.IdUsuario = Convert.ToInt32(DataReader["IdUsuario"]); usuario.Nome = Convert.ToString(DataReader["Nome"]); usuario.Login = Convert.ToString(DataReader["Login"]); usuario.Senha = Convert.ToString(DataReader["Senha"]); usuario.Foto = Convert.ToString(DataReader["Foto"]); usuario.DataCadastro = Convert.ToDateTime (DataReader["DataCadastro"]); return usuario; //retornando o objeto.. } else { return null; //sem espaço de memória.. } } public bool LoginExistente(string login) { string query = "select count(Login) from Usuario " + "where Login = @Login"; Command = new SqlCommand(query, Connection); Command.Parameters.AddWithValue("@Login", login); int count = Convert.ToInt32(Command.ExecuteScalar()); return count > 0; //true, false.. } } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 10 Camada de Regras de Negócio: RN01 - Criar conta de usuário Sistema deverá permitir que o usuário crie uma conta de acesso, informando seu nome, login, senha e foto. O sistema deverá criptografar a senha informada utilizando HASH MD5 O sistema não deverá permitir que um usuário crie uma conta de acesso com o mesmo login de outro usuário já cadastrado O sistema deverá gravar no banco de dados a data e hora em que o cadastro do usuário foi realizado. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Projeto.Repository.Entities; //importando using Projeto.Repository.Repositories; //importando using System.Diagnostics; //log no visualstudio namespace Projeto.Business { public class UsuarioBusiness { public string CriarConta(Usuario usuario) { UsuarioRepository repository = new UsuarioRepository(); try { repository.AbrirConexao(); //verificando se o login do usuario ja existe no banco de dados.. if( ! repository.LoginExistente(usuario.Login)) { repository.Inserir(usuario); return $"Usuário {usuario.Nome}, cadastrado com sucesso."; } else { return $"Este login {usuario.Login} já encontra-se cadastrado. Tente outro."; } } catch(Exception e) { Debug.WriteLine(e.Message); return "Erro ao criar conta de usuário."; } finally { repository.FecharConexao(); } } } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 11 MD5 (Message Digest 5) Algoritmo de encriptação baseado em HASH de 128bits. Qualquer valor criptografado em MD5 retorna um HASH com 32 caracteres formados de 16 algarismos hexadecimais. Exemplo: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Security.Cryptography; //importando.. namespace Projeto.Business.Utils { public class CriptografiaUtil { //algoritmo de criptografia baseado em HASH public static string GetMD5(string valor) { MD5 md5 = new MD5CryptoServiceProvider(); //converter o valor recebido para bytes.. byte[] valorEmBytes = Encoding.UTF8.GetBytes(valor); //realizando a encriptação.. byte[] resultadoEmBytes = md5.ComputeHash(valorEmBytes); Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 12 //retornando o resultado como string.. string saida = string.Empty; //percorrendo o resultado da criptografia.. foreach(byte item in resultadoEmBytes) { saida += item.ToString("X2"); //X2 -> HEXADECIMAL } return saida; //16 algarismos hexadecimais } } } Voltando para classe de negócio: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Projeto.Repository.Entities; //importando using Projeto.Repository.Repositories; //importando using System.Diagnostics; //log no visualstudio using Projeto.Business.Utils; //importando namespace Projeto.Business { public class UsuarioBusiness { public string CriarConta(Usuario usuario) { UsuarioRepository repository = new UsuarioRepository(); try { repository.AbrirConexao(); //verificando se o login do usuario ja existe no banco de dados.. if( ! repository.LoginExistente(usuario.Login)) { //criptografar a senha.. usuario.Senha = CriptografiaUtil.GetMD5(usuario.Senha); repository.Inserir(usuario); return $"Usuário {usuario.Nome}, cadastrado com sucesso."; } else { return $"Este login {usuario.Login} já encontra-se cadastrado. Tente outro."; } } catch(Exception e) { Debug.WriteLine(e.Message); return "Erro ao criar conta de usuário."; } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 13 finally { repository.FecharConexao(); } } } } --------------------------------------------- Criando uma classe de Modelo (Model) no projeto Presentation para realizar o cadastro do usuario: HttpPostedFileBase Utilizado em Asp.Net MVC para definição de campos de upload de arquivos. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; //validações.. namespace Projeto.Presentation.Models { public class UsuarioCadastroModel { [MinLength(6, ErrorMessage = "Por favor, informe no mínimo {1} caracteres.")] [MaxLength(50, ErrorMessage = "Por favor, informe no máximo {1} caracteres.")] [Required(ErrorMessage = "Por favor, informe o nome do usuário.")] public string Nome { get; set; } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 14 [MinLength(6, ErrorMessage = "Por favor, informe no mínimo {1} caracteres.")] [MaxLength(20, ErrorMessage = "Por favor, informe no máximo {1} caracteres.")] [Required(ErrorMessage = "Por favor, informe o login do usuário.")] public stringLogin { get; set; } [MinLength(8, ErrorMessage = "Por favor, informe no mínimo {1} caracteres.")] [MaxLength(30, ErrorMessage = "Por favor, informe no máximo {1} caracteres.")] [Required(ErrorMessage = "Por favor, informe a senha do usuário.")] public string Senha { get; set; } [Compare("Senha", ErrorMessage = "Senhas não conferem.")] [Required(ErrorMessage = "Por favor, confirme sua senha.")] public string SenhaConfirmacao { get; set; } [Required(ErrorMessage = "Por favor, envie a foto do usuário.")] public HttpPostedFileBase Foto { get; set; } } } Criando a página de cadastro de usuário: /Usuario/Cadastro Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 15 Criando o formulário: @model Projeto.Presentation.Models.UsuarioCadastroModel @{ ViewBag.Title = "Cadastro"; Layout = "~/Views/Shared/Layout.cshtml"; } <h4>Criar Conta de Usuário</h4> <a href="/Home/Index">Voltar para a página inicial</a> <br /> <br /> <!-- INICIO DO FORMULARIO --> @using (Html.BeginForm("CadastrarUsuario", "Usuario", FormMethod.Post)) { <label>Informe seu Nome:</label> @Html.TextBoxFor(model => model.Nome, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.Nome) </span> <br /> <label>Informe seu Login:</label> @Html.TextBoxFor(model => model.Login, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.Login) </span> <br /> <label>Informe sua Senha:</label> @Html.PasswordFor(model => model.Senha, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.Senha) </span> <br /> <label>Confirme sua Senha:</label> @Html.PasswordFor(model => model.SenhaConfirmacao, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 16 <span class="text-danger"> @Html.ValidationMessageFor(model => model.SenhaConfirmacao) </span> <br /> <label>Envie sua Foto:</label> <input type="file" name="Foto" class="form-control col-md-3"/> <span class="text-danger"> @Html.ValidationMessageFor(model => model.Foto) </span> <br/> <input type="submit" class="btn btn-success" value="Cadastrar Usuário" /> <br /> <br /> <h5>@ViewBag.Resultado</h5> } <!-- FIM DO FORMULARIO --> Resultado: Todo formulário criado em HTML que contem campos de upload (type="file") precisam de uma configuração no cabeçalho do formulario chamada: enctype="multipart/form-data" https://www.w3schools.com/tags/att_form_enctype.asp Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 17 Configurando o formulário para upload de arquivos: @model Projeto.Presentation.Models.UsuarioCadastroModel @{ ViewBag.Title = "Cadastro"; Layout = "~/Views/Shared/Layout.cshtml"; } <h4>Criar Conta de Usuário</h4> <a href="/Home/Index">Voltar para a página inicial</a> <br /> <br /> <!-- INICIO DO FORMULARIO --> @using (Html.BeginForm("CadastrarUsuario", "Usuario", FormMethod.Post, new { @enctype = "multipart/form-data" })) { <label>Informe seu Nome:</label> @Html.TextBoxFor(model => model.Nome, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.Nome) </span> <br /> <label>Informe seu Login:</label> @Html.TextBoxFor(model => model.Login, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.Login) </span> <br /> <label>Informe sua Senha:</label> @Html.PasswordFor(model => model.Senha, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.Senha) </span> <br /> Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 18 <label>Confirme sua Senha:</label> @Html.PasswordFor(model => model.SenhaConfirmacao, new { @class = "form-control col-md-3", @placeholder = "Digite aqui" }) <span class="text-danger"> @Html.ValidationMessageFor(model => model.SenhaConfirmacao) </span> <br /> <label>Envie sua Foto:</label> <input type="file" name="Foto" class="form-control col-md-3"/> <span class="text-danger"> @Html.ValidationMessageFor(model => model.Foto) </span> <br/> <input type="submit" class="btn btn-success" value="Cadastrar Usuário" /> <br /> <br /> <h5>@ViewBag.Resultado</h5> } <!-- FIM DO FORMULARIO --> Criando o método "CadastrarUsuario" na classe /UsuarioController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Projeto.Presentation.Models; namespace Projeto.Presentation.Controllers { public class UsuarioController : Controller { // GET: Usuario/Autenticacao public ActionResult Autenticacao() { return View(); } // GET: Usuario/Cadastro public ActionResult Cadastro() { return View(); } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 19 [HttpPost] public ActionResult AutenticarUsuario(UsuarioAutenticacaoModel model) { //verificar se os campos da model passaram nas validações.. if(ModelState.IsValid) { //teste nos valores do login e da senha if(model.Login.Equals("admin") && model.Senha.Equals("admin")) { ViewBag.Resultado = "Usuário Autenticado!"; } else { ViewBag.Resultado = "Acesso Negado. Usuário inválido."; } } return View("Autenticacao"); } [HttpPost] public ActionResult CadastrarUsuario(UsuarioCadastroModel model) { //verificando se os campos passaram nas regras de validação.. if(ModelState.IsValid) { } //retornar para a página de cadastro.. return View("Cadastro"); //nome da view.. } } } Executando: Visualizando as mensagens de erro de validação para cada campo Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 20 Criando uma validação customizadaem Asp.Net MVC using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace Projeto.Presentation.Validations { public class ConterCaracterEspecial : ValidationAttribute { //sobrescrever o método public override bool IsValid(object value) { //transformar o valor recebido para string.. if(value != null) { string valor = value.ToString(); return valor.Contains("@") || valor.Contains("$") || valor.Contains("&"); } return false; } } } Treinamento em C# WebDeveloper Aula 10 Segunda-feira, 19 de Novembro de 2018 Desenvolvimento Web com Asp.Net MVC 21 Aplicando o validador: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; //validações.. using Projeto.Presentation.Validations; //importando.. namespace Projeto.Presentation.Models { public class UsuarioCadastroModel { [MinLength(6, ErrorMessage = "Por favor, informe no mínimo {1} caracteres.")] [MaxLength(50, ErrorMessage = "Por favor, informe no máximo {1} caracteres.")] [Required(ErrorMessage = "Por favor, informe o nome do usuário.")] public string Nome { get; set; } [MinLength(6, ErrorMessage = "Por favor, informe no mínimo {1} caracteres.")] [MaxLength(20, ErrorMessage = "Por favor, informe no máximo {1} caracteres.")] [Required(ErrorMessage = "Por favor, informe o login do usuário.")] public string Login { get; set; } [ConterCaracterEspecial(ErrorMessage = "Por favor, informe pelo menos 1 caracter especial.")] [MinLength(8, ErrorMessage = "Por favor, informe no mínimo {1} caracteres.")] [MaxLength(30, ErrorMessage = "Por favor, informe no máximo {1} caracteres.")] [Required(ErrorMessage = "Por favor, informe a senha do usuário.")] public string Senha { get; set; } [Compare("Senha", ErrorMessage = "Senhas não conferem.")] [Required(ErrorMessage = "Por favor, confirme sua senha.")] public string SenhaConfirmacao { get; set; } [Required(ErrorMessage = "Por favor, envie a foto do usuário.")] public HttpPostedFileBase Foto { get; set; } } }
Compartilhar