Buscar

Aula_21 11 18

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
	
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
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:
\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:
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}";
 }
 }
}
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();
 }
 }
}
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
 {
 }
}
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
 {
 }
}
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
 {
 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..
 }
 }}
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();
 }
 }
 }
}
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);
 //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.";
 }
 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; }
 [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; }
 
 [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
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"
 })
 <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
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 />
 <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();
 }
 [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
Criando uma validação 
customizada em 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;
 }
 }
}
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; }
 }
}
21

Continue navegando

Outros materiais