Oi Pessoal!
Nesse post vou mostrar como criar um crud com .net e angular utilizando po-ui, uma biblioteca de componentes para angular de alta produtividade.
Faça o clone ou download do código.
Você precisa ter instalado em sua máquia:
Abra uma pasta de sua preferencia no terminal.
Crie uma pasta chamada src.
Criaremos os projetos dentro desta pasta.
Abra o terminal e navegue até esta pasta e digite o comando abaixo para abrir o vscode.
code .
A partir de agora vamos utilizar o terminal integrado do vscode. Aperte ctrl + ' para abrir o terminal integrado.
BackEnd
WebApi
Crie o projeto com o comando abaixo:
dotnet new webapi -o api
Apague as classes WeatherForecast.cs e Controllers/WeatherForecastController.cs
Navegue até a pasta do projeto
cd api
Crie um arquivo de gitignore
dotnet new gitignore
Crie a pasta Models e crie a classe Pet:
md Models
cd . > Models/Pet.cs
No menu lateral do vscode procure a pasta Models e abra a classe Pet.cs
A classe Pet.cs deve ter o seguinte código:
namespace api.Models
{
public class Pet
{
public int Id { get; set; }
public string Nome { get; set; }
public string Raca { get; set; }
public string Dono { get; set; }
}
}
Instale o pacote Microsoft.EntityFrameworkCore.InMemory
Esse pacote é para utilizarmos um banco de dados em memória, ideal para testes.
dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 5.0.7
Crie a pasta Data e crie a classe DataContext:
md Data
cd . > Data/DataContext.cs
A classe DataContext.cs deve ter o seguinte código:
using api.Models;
using Microsoft.EntityFrameworkCore;
namespace api.Data
{
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options) { }
public DbSet<Pet> Pet { get; set; }
}
}
Adicione as referências abaixo no topo da classe Startup.cs:
using api.Data;
using Microsoft.EntityFrameworkCore;
Adicione o trecho abaixo no método ConfigureServices na classe Startup.cs
public void ConfigureServices(IServiceCollection services)
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "api", Version = "v1" });
})
//adicione este trecho
services.AddDbContext<DataContext>(opt => opt.UseInMemoryDatabase("DataBase"));
}
Instale a ferramenta de geração de código
dotnet tool install -g dotnet-aspnet-codegenerator
ou atualize caso ela já esteja instalada
dotnet tool update -g dotnet-aspnet-codegenerator
Adicione os pacotes abaixo para gerar a nossa api rest automaticamente.
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
Gere o scaffolding do model Pet.cs
dotnet aspnet-codegenerator controller -name PetController -async -api -m Pet -dc DataContext -outDir Controllers
Observe o código criado em Controllers/PetController.cs, foi criada uma operação de crud completo.
Execute o código abaixo para rodar a aplicação.
dotnet run
Instale a extensão do vscode, Thunder Client ou utilize o postman para testar.
Utilize o endpoint https://localhost:5001/api/pet e alterne os métodos GET (obter)/POST (criar)/PUT (atualizar)/DELETE (deletar)
Para encerrar o aplicativo, aperte ctrl + c no terminal.
Para permitir os teste do endpoint no aplicativo angular temos q liberar o cors. Em Startup.cs altere o método Configure:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "api v1"));
}
// Comente esse trecho
// app.UseHttpsRedirection();
app.UseRouting();
// adicione esse trecho
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Refatore o método GetPet em Controllers/PetController.cs para compatibilidade com o contrato de api do po-ui: https://po-ui.io/guides/api#successMessagesForCollections
...
[HttpGet]
public async Task<ActionResult<dynamic>> GetPet()
{
var pets = await _context.Pet.ToListAsync();
return new {
hasNext = false,
items = pets
};
}
...
Nosso back-end está pronto!
Front-End
WebApp
Volte a raiz do projeto, a pasta src.
Esse projeto utiliza a versão Angular CLI: 12.0.1
Crie o projeto com o comando abaixo:
ng new app
Diga sim para a pergunta sobre criação de rota e escolha CSS como linguagem de estilo
Navegue até a pasta do aplicativo.
cd app
Adicione o pacote de ui do Po-UI
ng add @po-ui/ng-components
Diga sim para criação do procedimento e para criação de menu lateral
Adicione o pacote de template do PO-UI
ng add @po-ui/ng-templates
Componentes
crie o componente de leitura de dados
ng generate @po-ui/ng-templates:po-page-dynamic-table
quando perguntado, informe o nome PetTable
crie o componente de edição de dados
ng generate @po-ui/ng-templates:po-page-dynamic-edit
quando perguntado, informe o nome PetEdit
Rotas
Utilize o menu lateral do vscode e encontre o arquivo app/src/app/app-routing.module.ts
adicione os imports no topo do arquivo:
...
import { PetEditComponent } from './pet-edit/pet-edit.component';
import { PetTableComponent } from './pet-table/pet-table.component';
...
No mesmo arquivo adicione as rotas:
...
const routes: Routes = [
{ path: 'new', component: PetEditComponent },
{ path: 'edit/:id', component: PetEditComponent },
{ path: 'table', component: PetTableComponent },
{ path: '', pathMatch: 'full', redirectTo: 'table' },
];
...
altere o código de app/src/app/app.component.html para adicionar elemento router-outlet (para dar suporte as rotas) e o título do aplicativo
<div class="po-wrapper">
<po-toolbar p-title="Pet App"></po-toolbar>
<po-menu [p-menus]="menus"></po-menu>
<router-outlet></router-outlet>
</div>
altere o código de app.component.ts para remover o código desnecessário e acrescentar a rota para tabela de pets no menu.
import { Component } from "@angular/core";
import { PoMenuItem } from "@po-ui/ng-components";
@Component({
selector: "app-root",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"],
})
export class AppComponent {
readonly menus: Array<PoMenuItem> = [{ label: "Pets", link: "/table" }];
}
Services
adicione a propriedade service em app/src/environments/environment.ts
export const environment = {
production: false,
service: 'http://localhost:5000/api/pet'
};
altere o endpoint e as propriedades em app/src/app/pet-table/pet-table.component.ts
...
// adicione esses imports
import { PoPageDynamicTableActions, PoPageDynamicTableField } from '@po-ui/ng-templates';
import { environment } from 'src/environments/environment';
@Component({
selector: 'app-pet-table',
templateUrl: './pet-table.component.html',
styleUrls: ['./pet-table.component.css']
})
export class PetTableComponent implements OnInit {
// Copie os códigos abaixo
readonly apiService = environment.service;
readonly actions: PoPageDynamicTableActions = {
new: "/new",
edit: "/edit/:id",
remove: true,
};
readonly fields: Array<PoPageDynamicTableField> = [
{ property: "id", label: "Id", key: true },
{ property: "nome", label: "Nome" },
{ property: "raca", label: "Raça" },
{ property: "dono", label: "Dono" },
];
...
adicione a propriedade p-fields em app/src/app/pet-table/pet-table.component.html
<po-page-dynamic-table
p-title="PetTable"
[p-actions]="actions"
[p-service-api]="apiService"
[p-fields]="fields">
</po-page-dynamic-table>
e em app/src/app/pet-edit/pet-edit.component.ts
...
// adicione esses imports
import { PoPageDynamicEditActions, PoPageDynamicEditField } from '@po-ui/ng-templates';
import { environment } from 'src/environments/environment';
@Component({
selector: 'app-pet-edit',
templateUrl: './pet-edit.component.html',
styleUrls: ['./pet-edit.component.css']
})
export class PetEditComponent implements OnInit {
// copie os códigos abaixo
readonly apiService = environment.service;
readonly fields: Array<PoPageDynamicEditField> = [
{ property: "id", label: "Id", key: true, visible: false },
{ property: "nome", label: "Nome" },
{ property: "raca", label: "Raça" },
{ property: "dono", label: "Dono" },
];
public readonly actions: PoPageDynamicEditActions = {
save: "/table",
saveNew: "/new",
};
...
adicione a propriedade p-actions em app/src/app/pet-edit/pet-edit.component.html
<po-page-dynamic-edit
p-title="PetEdit"
[p-service-api]="apiService"
[p-fields]="fields"
[p-actions]="actions">
</po-page-dynamic-edit>
Pronto nosso front-end está pronto!
Para executar os dois projeto, crie uma nova aba do terminal e navegue até ..src/api e execute
dotnet run
em outra aba do terminal navegue até ..src/app e execute:
ng s -o
Eu utilizei o próprio terminal integrado com duas instancias:
Agora vamos testar!
Testes
No navegador foi aberto a página: http://localhost:4200/table
Veja toda estrutura que foi criada, isso é incrível!
Clique no botão novo e você será direcionado para a página com o formulário de edição:
Preencha o formulário e clique em salvar.
Você será redirecionado para página de tabela, repare que o dado foi incluído, listado e apareceu uma notificação de sucesso.
Agora vamos atualizar esse dado:
Clique nos 3 pontinho no final da linha e depois em editar:
Altere o nome do dono e clique em salvar:
Você será redirecionado para página de tabela novamente e o dado foi alterado e uma nova notificação foi adicionada.
Agora vamos excluir o dado:
Uma janela de confirmação vai abrir, clique em confirmar:
Veja que o item já não aparece mais e uma notificação foi adicionada.
O Post ficou um pouco grande, mas a replicação desse projeto é rápido.
O PO-UI é uma biblioteca fantástica!!!
Veja que criamos uma estrutura de crud, notificação e navegação de forma muito rápida e com pouco código! Confira todos os componentes no portal deles.
Espero que isso te ajude!
Top comments (0)