首頁  >  文章  >  web前端  >  Angular + NG-ZORRO快速開發一個後台系統

Angular + NG-ZORRO快速開發一個後台系統

青灯夜游
青灯夜游轉載
2022-04-21 10:45:463892瀏覽

這篇文章跟大家分享一個Angular實戰,了解一下angualr 結合 ng-zorro 如何快速開發一個後台系統,希望對大家有所幫助!

Angular + NG-ZORRO快速開發一個後台系統

連更的這幾天的文章,我們已經了解了不少 angular 的知識點了,這次我們來個小成品。

angualr 結合 ng-zorro 快速且規範的開發一個後台系統。 【相關教學推薦:《angular教學》】

系統功能包含以下的內容:

  • 歡迎頁面
  • 使用者清單
  • 用戶新增
  • 用戶修改
  • 用戶刪除

所有的service 使用模擬的資料。

說乾咱就乾。

結合ng-zorro

#angular 比較流行的ui 框架有:

  • Angular Material 官方指定UI 框架
  • NG-ZORRO,又稱為Ant Design of Angular 國內較受歡迎的UI 框架

Ant Design 相信做前端開發的人兒都比較熟悉了。所以這裡我們結合 NG-ZORRO 這個框架來做。如果熟悉VueReact 版本的Ant Design,相信你可以無縫連結啊~

Angular + NG-ZORRO快速開發一個後台系統

# #我們重新使用

angular-cli 產生一個專案ng-zorro

新增

ng-zorro 是很簡單的事情:進入ng-zorro 根目錄,執行ng add ng-zorro-antd 即可。

當然你也可以執行

npm install ng-zorro-antd 添加,不建議。

結合

ng-zorro 完成之後,我們執行專案起來npm run start,你會在http://localhost:4200 的頁面看到下圖內容。

Angular + NG-ZORRO快速開發一個後台系統

Not Bad, Bro.

#設定路由

我們改成

hash 路由,並且加入使用者路由,鷹架都幫我們完事了,我們只要做點小修改。

想法:

  • 先加入頁面

    user 使用者的清單頁面,使用ng-zorrotable 元件

  • 使用者的新增與變更頁面可以共用同一個頁面,使用

    ng-zorroform 元件

  • 頁面刪除功能直接使用彈出式提示,使用

    ng-zorromodal 元件

ng-zorro 元件按需引入

調整路由檔案

依照思路,我們得在

ng-zorro
引入:

// app.module.ts

import { ReactiveFormsModule } from '@angular/forms';
import { NzTableModule } from 'ng-zorro-antd/table';
import { NzModalModule } from 'ng-zorro-antd/modal';
import { NzButtonModule } from 'ng-zorro-antd/button';
import { NzFormModule } from 'ng-zorro-antd/form';
import { NzInputModule } from 'ng-zorro-antd/input';


// ...

imports: [ // 是在 imports 中添加,而不是 declarations 中声明
  NzTableModule,
  NzModalModule,
  NzButtonModule,
  NzFormModule,
  ReactiveFormsModule,
  NzInputModule
],

簡單易理解原則,我們這裡不使用

childrenAngular + NG-ZORRO快速開發一個後台系統 進行路由的嵌套:

// app.routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule, PreloadAllModules } from '@angular/router';
import { WelcomeComponent } from './pages/welcome/welcome.component';
import { UserComponent } from './pages/user/user.component';
import { UserInfoComponent } from './pages/user/user-info/user-info.component';

// 相关的路由
const routes: Routes = [
  { 
    path: '', 
    pathMatch: 'full', 
    redirectTo: '/welcome' 
  },
  {
    path: 'welcome',
    component: WelcomeComponent
  },
  {
    path: 'user',
    component: UserComponent
  },
  {
    path: 'user/add',
    component: UserInfoComponent
  },
  {
    path: 'user/edit/:uuid',
    component: UserInfoComponent
  }
];

@NgModule({
  imports: [RouterModule.forRoot(
    routes,
    {
      useHash: true,// 使用 hash 模式
      preloadingStrategy: PreloadAllModules
    }
  )],
  exports: [RouterModule]
})
export class AppRoutingModule { }

#更改選單

使用腳手架產生的選單與我們需要開發的功能不符合,我們來調整下。 <pre class="brush:js;toolbar:false;">// app.component.html &lt;nz-layout class=&quot;app-layout&quot;&gt; &lt;nz-sider class=&quot;menu-sidebar&quot; nzCollapsible nzWidth=&quot;256px&quot; nzBreakpoint=&quot;md&quot; [(nzCollapsed)]=&quot;isCollapsed&quot; [nzTrigger]=&quot;null&quot;&gt; &lt;div class=&quot;sidebar-logo&quot;&gt; &lt;!-- 默认点击 logo 跳转到首页 --&gt; &lt;a routerLink=&quot;/welcome&quot;&gt; &lt;img src=&quot;https://ng.ant.design/assets/img/logo.svg&quot; alt=&quot;logo&quot;&gt; &lt;h1&gt;Ng-Zorro&lt;/h1&gt; &lt;/a&gt; &lt;/div&gt; &lt;ul nz-menu nzTheme=&quot;dark&quot; nzMode=&quot;inline&quot; [nzInlineCollapsed]=&quot;isCollapsed&quot;&gt; &lt;li nz-submenu nzOpen nzTitle=&quot;用户管理&quot; nzIcon=&quot;dashboard&quot;&gt; &lt;ul&gt; &lt;li nz-menu-item nzMatchRouter&gt; &lt;a routerLink=&quot;/user&quot;&gt;用户列表&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/nz-sider&gt; &lt;nz-layout&gt; &lt;nz-header&gt; &lt;div class=&quot;app-header&quot;&gt; &lt;span class=&quot;header-trigger&quot; (click)=&quot;isCollapsed = !isCollapsed&quot;&gt; &lt;i class=&quot;trigger&quot; nz-icon [nzType]=&quot;isCollapsed ? &amp;#39;menu-unfold&amp;#39; : &amp;#39;menu-fold&amp;#39;&quot; &gt;&lt;/i&gt; &lt;/span&gt; &lt;/div&gt; &lt;/nz-header&gt; &lt;nz-content&gt; &lt;div class=&quot;inner-content&quot;&gt; &lt;router-outlet&gt;&lt;/router-outlet&gt; &lt;/div&gt; &lt;/nz-content&gt; &lt;/nz-layout&gt; &lt;/nz-layout&gt;</pre>

選單展示,如果我們需要做權限管理的話,是需要後端配合進行傳值的,然後我們再把相關的權限選單渲染到頁面

替換成上面的程式碼後,得到的基本骨架如下:

#完成使用者清單

接下來完成使用者清單的骨架,因為使用了UI

框架,我麼寫起來異常的方便:

取得使用者清單Angular + NG-ZORRO快速開發一個後台系統##

// user.component.html

<nz-table #basicTable [nzData]="list">
  <thead>
    <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Action</th>
    </tr>
  </thead>
  <tbody>
    <!-- 对获取到的数据进行遍历 -->
    <tr *ngFor="let data of basicTable.data">
      <td>{{data.name}}</td>
      <td>{{data.position}}</td>
      <td>
        <a style="color: #f00;">Delete</a>
      </td>
    </tr>
  </tbody>
</nz-table>

我們模擬了一些資料在

assets 資料夾中user.json

:

{
  "users": [
    {
      "uuid": 1,
      "name": "Jimmy",
      "position": "Frontend"
    },
    {
      "uuid": 2,
      "name": "Jim",
      "position": "Backend"
    }
  ],
  "environment": "development"
}
編寫好服務之後,我們呼叫取得使用者的資料:
// user.component.ts

import { Component, OnInit } from &#39;@angular/core&#39;;
import { UserService } from &#39;src/app/services/user.service&#39;;

@Component({
  selector: &#39;app-user&#39;,
  templateUrl: &#39;./user.component.html&#39;,
  styleUrls: [&#39;./user.component.scss&#39;]
})
export class UserComponent implements OnInit {

  public list: any = []

  constructor(
    private readonly userService: UserService
  ) { }

  ngOnInit(): void {
    if(localStorage.getItem(&#39;users&#39;)) {
      let obj = localStorage.getItem(&#39;users&#39;) || &#39;{}&#39;
      this.list =  JSON.parse(obj)
    } else {
      this.getList()
    }
  }

  // 获取用户列表
  getList() {
    this.userService.getUserList().subscribe({
      next: (data: any) => {
        localStorage.setItem(&#39;users&#39;, JSON.stringify(data.users))
        this.list = data.users
      },
      error: (error: any) => {
        console.log(error)
      }
    })
  }

}
因為沒有引入後端服務,這裡我們採用localstorage

的方式記錄狀態。

上面完成後,我們得到清單資訊如下:

Angular + NG-ZORRO快速開發一個後台系統#新增使用者和編輯使用者

#####我們簡單建立個表單,裡面含有的欄位就兩個,分別是###name### 和###position###。這兩個功能是公用一個表單的~######我們在###html### 中加入:###
// user-info.component.html

<form nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()">
  <nz-form-item>
    <nz-form-control nzErrorTip="请输入用户名!">
      <input type="text" nz-input formControlName="username" placeholder="请输入用户名" style="width: 160px;" />
    </nz-form-control>
  </nz-form-item>
  <nz-form-item>
    <nz-form-control nzErrorTip="请输入职位!">
      <input type="text" nz-input formControlName="position" placeholder="请输入职位" style="width: 160px;"/>
    </nz-form-control>
  </nz-form-item>
  <button nz-button class="login-form-button login-form-margin" [nzType]="&#39;primary&#39;">确认</button>
</form>
###頁長這樣子:########## ##

然后就是逻辑的判断,进行添加或者是修改。如果是连接带上 uuid 的标识,就表示是编辑,show you the codes

// user-info.component.ts

import { Component, OnInit } from &#39;@angular/core&#39;;
import { FormBuilder, FormGroup, Validators } from &#39;@angular/forms&#39;;
import { ActivatedRoute, ParamMap } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;app-user-info&#39;,
  templateUrl: &#39;./user-info.component.html&#39;,
  styleUrls: [&#39;./user-info.component.scss&#39;]
})
export class UserInfoComponent implements OnInit {

  public isAdd: boolean = true;
  public userInfo: any = []
  public uuid: number = 0;

  validateForm!: FormGroup;

  constructor(
    private fb: FormBuilder,
    private route: ActivatedRoute,
  ) { }

  ngOnInit(): void {
    this.userInfo = JSON.parse(localStorage.getItem(&#39;users&#39;) || &#39;[]&#39;)
    this.route.paramMap.subscribe((params: ParamMap)=>{
      this.uuid = parseInt(params.get(&#39;uuid&#39;) || &#39;0&#39;)
    })
    // 是编辑状态,设置标志符
    if(this.uuid) {
      this.isAdd = false
    }
    
    if(this.isAdd) {
      this.validateForm = this.fb.group({
        username: [null, [Validators.required]],
        position: [null, [Validators.required]]
      });
    } else {
      let current = (this.userInfo.filter((item: any) => item.uuid === this.uuid))[0] || {}
      // 信息回填
      this.validateForm = this.fb.group({
        username: [current.name, [Validators.required]],
        position: [current.position, [Validators.required]]
      })
    }
    
  }

  submitForm() {
    // 如果不符合提交,则报错
    if(!this.validateForm.valid) {
      Object.values(this.validateForm.controls).forEach((control: any) => {
        if(control?.invalid) {
          control?.markAsDirty();
          control?.updateValueAndValidity({ onlySelf: true });
        }
      })
      return
    }

    // 获取到表单的数据
    const data = this.validateForm.value
    // 新增用户
    if(this.isAdd) {
      
      let lastOne = (this.userInfo.length > 0 ? this.userInfo[this.userInfo.length-1] : {});
      this.userInfo.push({
        uuid: (lastOne.uuid ? (lastOne.uuid + 1) : 1),
        name: data.username,
        position: data.position
      })
      localStorage.setItem(&#39;users&#39;, JSON.stringify(this.userInfo))
    } else { // 编辑用户,更新信息
      let mapList = this.userInfo.map((item: any) => {
        if(item.uuid === this.uuid) {
          return {
            uuid: this.uuid,
            name: data.username,
            position: data.position
          }
        }
        return item
      })
      localStorage.setItem(&#39;users&#39;, JSON.stringify(mapList))
    }
  }

}

我们先设定一个标志符 isAdd,默认是新建用户;当 uuid 存在的时候,将其设置为 false 值,表示是编辑的状态,对内容进行表单的回填。提交表单的操作也是按照该标志符进行判断。我们直接对 localStorage 的信息进行变更,以保证同步列表信息。

删除功能

我们引入模态对话框进行询问是否删除。

// user.component.ts

// 删除
delete(data: any) {
  this.modal.confirm({
    nzTitle: &#39;<i>你想删除该用户?</i>&#39;,
    nzOnOk: () => {
      let users = JSON.parse(localStorage.getItem(&#39;users&#39;) || &#39;[]&#39;);
      let filterList = users.filter((item: any) => item.uuid !== data.uuid);
      localStorage.setItem(&#39;users&#39;, JSON.stringify(filterList));
      this.list = filterList
    }
  });
}

Angular + NG-ZORRO快速開發一個後台系統

我们找到删除的数据,将其剔除,重新缓存新的用户数据,并更新 table 的用户列表数据。

So,到此为止,我们顺利完成了一个简单的项目。我们用 Gif 图整体来看看。

Angular + NG-ZORRO快速開發一個後台系統

【完】

更多编程相关知识,请访问:编程入门!!

以上是Angular + NG-ZORRO快速開發一個後台系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除