Nos últimos dias de artigos, aprendemos muito sobre angular
. Desta vez, apresentaremos um pequeno produto.
angualr
é combinado com ng-zorro
para desenvolver um sistema backend de forma rápida e padronizada. [Recomendação do tutorial relacionado: "Tutorial Angular"]
As funções do sistema incluem o seguinte:
todos os serviços usar dados simulados.
Vamos fazê-lo.
As angular
ui
mais populares
combinadas com o ng-zorro
angular incluem:Ant Design
que aqueles que fazem desenvolvimento front-end. estão familiarizados com isso. Então aqui combinamos com a estrutura NG-ZORRO
. Se você estiver familiarizado com a versão Vue
ou React
do Ant Design
, acredito que você pode se conectar perfeitamente ~
Reutilizamos angular-cli
para gerar um projeto ng-zorro
.
Adicionar ng-zorro
é muito simples: entre ng-zorro
e execute ng add ng-zorro-antd
.
Claro, você também pode executar
npm install ng-zorro-antd
para adicioná-lo, mas isso não é recomendado.
Após combinar ng-zorro
, executamos o projeto npm run start
, e você verá a seguinte imagem na página http://localhost:4200
.
Nada mal, mano.
Mudamoso roteamento de configuração
para roteamento hash
e adicionamos o roteamento de usuário. Só precisamos fazer algumas pequenas modificações.
Idéia:
primeiro adicione a página de lista user
da página, use table
no ng-zorro
para adicionar e alterar a página do usuário para compartilhar a mesma página, form
ng-zorro
função de exclusão de página do componente de formulário no ng-zorro para usar diretamente o prompt pop-up , use ng-zorro
introduz ng-zorro
conforme necessário para
ajustar o arquivo de roteamento
De acordo com a ideia, temos que introduzi-lo em ng-zorro
:
// app.module.ts. importar {ReactiveFormsModule} de '@angular/forms'; importar { NzTableModule } de 'ng-zorro-antd/table'; importar { NzModalModule } de 'ng-zorro-antd/modal'; importar { NzButtonModule } de 'ng-zorro-antd/button'; importar { NzFormModule } de 'ng-zorro-antd/form'; importar { NzInputModule } de 'ng-zorro-antd/input'; // ... imports: [ // Adicione-o nas importações em vez de declarar NzTableModule nas declarações, Módulo NzModal, Módulo NzButton, NzFormModule, Módulo Formulários Reativos, Módulo NzInput ],
princípio simples e fácil de entender, não usamos children
para aninhar roteamento:
// app.routing.module.ts importar { NgModule } de '@angular/core'; importar {Rotas, RouterModule, PreloadAllModules} de '@angular/router'; importar { WelcomeComponent } de './pages/welcome/welcome.component'; importar {UserComponent} de './pages/user/user.component'; importar {UserInfoComponent} de './pages/user/user-info/user-info.component'; //Rotas relacionadas const rotas: Rotas = [ { caminho: '', pathMatch: 'completo', redirecionarPara: '/bem-vindo' }, { caminho: 'bem-vindo', componente: WelcomeComponent }, { caminho: 'usuário', componente: UserComponent }, { caminho: 'usuário/adicionar', componente: UserInfoComponent }, { caminho: 'usuário/editar/:uuid', componente: UserInfoComponent } ]; @NgModule({ importações: [RouterModule.forRoot( rotas, { useHash: true, //Usar pré-carregamento no modo hashStrategy: PreloadAllModules } )], exportações: [RouterModule] }) export class AppRoutingModule { }
Alterar menu
O menu gerado usando scaffolding não corresponde às funções que precisamos desenvolver.
//app.component.html <nz-layout class="app-layout"> <nz-sider class="barra lateral do menu" nzCollapsível nzWidth="256px" nzBreakpoint="md" [(nzCollapsed)]="isCollapsed" [nzTrigger]="nulo"> <div class="logotipo da barra lateral"> <!-- Por padrão, clique no logotipo para ir para a página inicial --> <a roteadorLink="/bem-vindo"> <img src="https://ng.ant.design/assets/img/logo.svg" alt="logo"> <h1>Ng-Zorro</h1> </a> </div> <ul nz-menu nzTheme="dark" nzMode="inline" [nzInlineCollapsed]="isCollapsed"> <li nz-submenu nzOpen nzTitle="Gerenciamento de usuários" nzIcon="painel"> <ul> <li nz-menu-item nzMatchRouter> <a routerLink="/user">Lista de usuários</a> </li> </ul> </li> </ul> </nz-sider> <nz-layout> <nz-cabeçalho> <div class="app-header"> <span class="header-trigger" (click)="isCollapsed = !isCollapsed"> <i class="gatilho" ícone nz [nzType]="isCollapsed? 'menu-unfold': 'menu-fold'" </i> </span> </div> </nz-header> <nz-conteúdo> <div class="inner-content"> <router-outlet></router-outlet> </div> </nz-content> </nz-layout> </nz-layout>
Exibição do menu, se precisarmos fazer o gerenciamento de permissões, precisamos que o backend coopere com a transferência de valor. Em seguida, renderizamos o menu de permissão relevante para a página
e o substituímos pelo esqueleto básico obtido. é o seguinte:
Complete a lista de usuários.
Em seguida, complete o esqueleto da lista de usuários. Como usamos a estrutura UI
, é extremamente conveniente escrever:
Obtenha a lista de usuários
// user.component.html. <nz-table #basicTable [nzData]="lista"> <thead> <tr> <th>Nome</th> <th>Posição</th> <th>Ação</th> </tr> </thead> <corpo> <!-- Percorra os dados obtidos --> <tr *ngFor="deixar dados de basicTable.data"> <td>{{data.name}}</td> <td>{{data.position}}</td> <td> <a style="color: #f00;">Excluir</a> </td> </tr> </tbody> </nz-table>
Simulamos alguns dados na pasta assets
user.json
:
{ "Usuários": [ { "uuid": 1, "nome": "Jimmy", "posição": "Front-end" }, { "uuid": 2, "nome": "Jim", "posição": "Back-end" } ], "meio ambiente": "desenvolvimento" }
Depois de escrever o serviço, chamamos para obter os dados do usuário:
//user.component.ts importar { Componente, OnInit } de '@angular/core'; importar {UserService} de 'src/app/services/user.service'; @Componente({ seletor: 'usuário do aplicativo', templateUrl: './user.component.html', styleUrls: ['./user.component.scss'] }) classe de exportação UserComponent implementa OnInit { lista pública: qualquer = [] construtor( userService somente leitura privado: UserService ) { } ngOnInit(): void { if(localStorage.getItem('usuários')) { deixe obj = localStorage.getItem('usuários') || esta.lista = JSON.parse(obj) } outro { this.getList() } } // Obtém a lista de usuários getList() { this.userService.getUserList().subscribe({ próximo: (dados: qualquer) => { localStorage.setItem('usuários', JSON.stringify(data.usuários)) esta.lista=dados.usuários }, erro: (erro: qualquer) => { console.log(erro) } }) } }
Como nenhum serviço de back-end é introduzido, aqui usamos localstorage
para registrar o status.
Depois de completar o acima, obtemos as informações da lista da seguinte forma:
Para adicionar usuários e editar usuários,
simplesmente criamos um formulário, que contém apenas dois campos, nomeadamente name
e position
. Essas duas funções compartilham um formulário ~
nós o adicionamos em html
:
//user-info.component.html <formulário nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()"> <nz-form-item> <nz-form-control nzErrorTip="Por favor, digite o nome de usuário!"> <input type="text" nz-input formControlName="nome de usuário" placeholder="Digite o nome de usuário" style="largura: 160px;" </nz-form-control> </nz-form-item> <nz-form-item> <nz-form-control nzErrorTip="Por favor, insira uma posição!"> <input type="text" nz-input formControlName="position" placeholder="Por favor, insira a posição" style="width: 160px;"/> </nz-form-control> </nz-form-item> <button nz-button class="login-form-button login-form-margin" [nzType]="'primary'">Confirmar</button> </form>
A página fica assim:
Depois, há o julgamento lógico para adicionar ou modificar. Se a conexão estiver marcada com uuid
, significa editar, show you the codes
.
//user-info.component.ts importar { Componente, OnInit } de '@angular/core'; importar {FormBuilder, FormGroup, Validators} de '@angular/forms'; importar { ActivatedRoute, ParamMap } de '@angular/router'; @Componente({ seletor: 'app-user-info', templateUrl: './user-info.component.html', styleUrls: ['./user-info.component.scss'] }) classe de exportação UserInfoComponent implementa OnInit { public isAdd: booleano = verdadeiro; informações públicas do usuário: qualquer = [] uuid público: número = 0; validarForm!: FormGroup; construtor( Facebook privado: FormBuilder, rota privada: ActivatedRoute, ) { } ngOnInit(): void { this.userInfo = JSON.parse(localStorage.getItem('usuários') || '[]') this.route.paramMap.subscribe((params: ParamMap)=>{ this.uuid = parseInt(params.get('uuid') || '0') }) // É o estado de edição, defina o identificador if(this.uuid) { this.isAdd = falso } if(this.isAdd) { this.validateForm = this.fb.group({ nome de usuário: [nulo, [Validators.required]], posição: [nulo, [Validators.required]] }); } outro { deixe atual = (this.userInfo.filter((item: any) => item.uuid === this.uuid))[0] || // Preenchimento de informações this.validateForm = this.fb.group({ nome de usuário: [nome atual, [Validadores.required]], posição: [posição.atual, [Validadores.requerido]] }) } } enviarFormulário() { // Caso não esteja de acordo com o envio, será reportado um erro if(!this.validateForm.valid) { Object.values(this.validateForm.controls).forEach((control: any) => { if(controle?.inválido) { control?.markAsDirty(); control?.updateValueAndValidity({ onlySelf: true }); } }) retornar } // Obtém os dados do formulário const data = this.validateForm.value //Adicionar novo usuário if(this.isAdd) { deixe lastOne = (this.userInfo.length > 0? this.userInfo[this.userInfo.length-1]: {}); this.userInfo.push({ uuid: (lastOne.uuid? (lastOne.uuid + 1): 1), nome: dados.nomedeusuário, posição: dados.posição }) localStorage.setItem('usuários', JSON.stringify(this.userInfo)) } else { //Editar usuário, atualizar informações let mapList = this.userInfo.map((item: any) => { if(item.uuid === this.uuid) { retornar { uuid: este.uuid, nome: dados.nomedeusuário, posição: dados.posição } } item de devolução }) localStorage.setItem('usuários', JSON.stringify(mapList)) } } }
Primeiro definimos um identificador isAdd
, cujo padrão é um novo usuário quando uuid
existe, definimos-o com um valor false
, indicando que ele está em um estado de edição e preenchemos o formulário com o conteúdo. A operação de envio de um formulário também é julgada de acordo com este identificador. Alteramos diretamente as informações localStorage
para garantir a sincronização das informações da lista.
Para a função de exclusão,
introduzimos uma caixa de diálogo modal para perguntar se deseja excluir.
//usuário.component.ts // Excluir delete(dados: qualquer) { this.modal.confirm({ nzTitle: '<i>Deseja excluir este usuário?</i>', nzOnOk: () => { deixe usuários = JSON.parse(localStorage.getItem('users') || '[]'); deixe filterList = users.filter((item: any) => item.uuid !== data.uuid); localStorage.setItem('usuários', JSON.stringify(filterList)); this.list=filtroLista } }); }
Encontramos os dados excluídos, os removemos, armazenamos novamente em cache os novos dados do usuário e atualizamos table
.
Até agora, concluímos com sucesso um projeto simples. Vamos dar uma olhada nisso como um todo usando Gif
.
【sobre】