Projeto Final do Curso de Angular

Desenvolvimento Frontend

CRUD de Funcionários

1. Criando o Projeto

Primeiro, crie um novo projeto Angular usando o Angular CLI:


ng new projeto-final-angular
cd projeto-final-angular
ng serve
          

2. Serviço HTTP

Vamos criar um serviço para se comunicar com o backend usando HttpClient.


// src/app/services/funcionario.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class FuncionarioService {
  private apiUrl = 'https://node-vercel-app-rho.vercel.app/api/funcionarios';

  constructor(private http: HttpClient) {}

  getFuncionarios(): Observable {
    return this.http.get(this.apiUrl);
  }

  // Faça agora para os métodos PUT, POST e DELETE

}
          

3. Componente Pai e Filho

O componente Pai lista os funcionários, e o Filho mostra detalhes de um funcionário.

Componente Pai

// src/app/components/funcionario-list/funcionario-list.component.ts
import { Component, OnInit } from '@angular/core';
import { FuncionarioService } from '../../services/funcionario.service';

@Component({
  selector: 'app-funcionario-list',
  templateUrl: './funcionario-list.component.html'
})
export class FuncionarioListComponent implements OnInit {
  funcionarios: any[] = [];
  funcionarioSelecionado: any;

  constructor(private service: FuncionarioService) {}

  ngOnInit(): void {
    this.service.getFuncionarios().subscribe(data => this.funcionarios = data);
  }

  selecionarFuncionario(func: any) {
    this.funcionarioSelecionado = func;
  }
}
          
Componente Filho

// src/app/components/funcionario-detail/funcionario-detail.component.ts
import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-funcionario-detail',
  template: `
    

{{ funcionario.funcionario.nome }} {{ funcionario.funcionario.sobrenome }}

Salário: {{ funcionario.funcionario.salarioAtual | salario }}

` }) export class FuncionarioDetailComponent { @Input() funcionario: any; }

4. Roteamento


O roteamento no Angular permite navegar entre diferentes componentes sem recarregar a página. No nosso CRUD, vamos ter:

  • /funcionarios → Lista de funcionários
  • /funcionarios/novo → Formulário de criação
  • /funcionarios/:id → Detalhe/Edição

// src/app/app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { FuncionarioListComponent } from './components/funcionario-list/funcionario-list.component';
import { FuncionarioFormComponent } from './components/funcionario-form/funcionario-form.component';
import { FuncionarioDetailComponent } from './components/funcionario-detail/funcionario-detail.component';

const routes: Routes = [
  //crie as rotas aqui
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}
          

5. Formulários


// src/app/components/funcionario-form-reactive/funcionario-form-reactive.component.ts
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { FuncionarioService } from '../../services/funcionario.service';
import { Router } from '@angular/router';

@Component({
  selector: 'app-funcionario-form-reactive',
  templateUrl: './funcionario-form-reactive.component.html'
})
export class FuncionarioFormReactiveComponent implements OnInit {
  form!: FormGroup;

  constructor(private fb: FormBuilder, private service: FuncionarioService, private router: Router) {}

  ngOnInit(): void {
    this.form = this.fb.group({
      nome: ['', Validators.required],
      sobrenome: ['', Validators.required],
      salarioAtual: [0, [Validators.required, Validators.min(1000)]]
      // faça os outros campos e seus validadores aqui
    });
  }

  salvarFuncionario() {
    if (this.form.valid) {
      this.service.addFuncionario(this.form.value).subscribe(() => {
        this.router.navigate(['/funcionarios']);
      });
    }
  }
}