fengxiang
2018-01-04 72120bbe920425f80d3beb08c08af24151246006
组织模块
2 files renamed
8 files added
10 files modified
908 ■■■■ changed files
src/app/core/core.module.ts 3 ●●●● patch | view | raw | blame | history
src/app/core/entity/grid.ts 7 ●●●●● patch | view | raw | blame | history
src/app/core/pipe/tyep-handle.pipe.ts 7 ●●●● patch | view | raw | blame | history
src/app/core/services/areacode.service.ts 55 ●●●●● patch | view | raw | blame | history
src/app/routes/devices/devices.module.ts 4 ●●●● patch | view | raw | blame | history
src/app/routes/devices/version/version-edit/version-edit.component.html patch | view | raw | blame | history
src/app/routes/devices/version/version-edit/version-edit.component.ts 18 ●●●●● patch | view | raw | blame | history
src/app/routes/devices/version/version.component.html 2 ●●● patch | view | raw | blame | history
src/app/routes/devices/version/version.component.ts 4 ●●●● patch | view | raw | blame | history
src/app/routes/systems/organization/organization-edit/organization-edit.component.html 90 ●●●●● patch | view | raw | blame | history
src/app/routes/systems/organization/organization-edit/organization-edit.component.ts 116 ●●●●● patch | view | raw | blame | history
src/app/routes/systems/organization/organization.component.html 65 ●●●●● patch | view | raw | blame | history
src/app/routes/systems/organization/organization.component.ts 222 ●●●●● patch | view | raw | blame | history
src/app/routes/systems/organization/organization.service.ts 35 ●●●●● patch | view | raw | blame | history
src/app/routes/systems/systems.module.ts 20 ●●●● patch | view | raw | blame | history
src/app/systems/organization/organization-edit/organization-edit.component.html 3 ●●●●● patch | view | raw | blame | history
src/app/systems/organization/organization-edit/organization-edit.component.ts 15 ●●●●● patch | view | raw | blame | history
src/assets/app-data.json 10 ●●●● patch | view | raw | blame | history
src/environments/environment.prod.ts 2 ●●● patch | view | raw | blame | history
yarn.lock 230 ●●●● patch | view | raw | blame | history
src/app/core/core.module.ts
@@ -3,13 +3,14 @@
import { AlainThemeModule } from '@delon/theme';
import { I18NService } from './i18n/i18n.service';
import { _HttpClient } from '@delon/theme/services/http/http.client';
@NgModule({
    imports: [
       AlainThemeModule.forRoot()
    ],
    providers: [
        I18NService
        I18NService, _HttpClient
    ]
})
export class CoreModule {
src/app/core/entity/grid.ts
@@ -1,5 +1,11 @@
import { Column } from '@core/entity/grid';
import { Types } from '@core/enum/types.enum';
export interface AreaNames {
    provinceName?: string;
    cityName?: string;
    areaName?: string;
}
export interface Column {
   text?: string;
   name?: string;
@@ -7,6 +13,7 @@
   sort?: string;
   isSort?: boolean;
   type?: DataType;
   format?: Function;
}
export interface DataType {
    name: Types;
src/app/core/pipe/tyep-handle.pipe.ts
@@ -16,12 +16,15 @@
  constructor(private dateService: DateService) {
  }
  transform(value: any, col?: Column): any {
  transform(value: any, col?: Column, row?: any ): any {
       const t = Types.Date;
       const type  = col.type;
       if (type != null && type.name != null) {
       if ( value != null && value !== '' && type != null && type.name != null) {
         value = this.transformHandle(value, type.name, type.format);
       }
       if (col.format !== null && col.format instanceof Function ) {
            value = col.format(value, col, row);
       }
       return value;
  }
  private transformHandle(value: any, type: Types, format: any): any{
src/app/core/services/areacode.service.ts
New file
@@ -0,0 +1,55 @@
import { environment } from './../../../environments/environment.prod';
import { Injectable } from '@angular/core';
import { _HttpClient } from '@delon/theme/services/http/http.client';
// Statics
import 'rxjs/add/observable/throw';
// Operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class AreacodeService {
  baseUrl = environment.SERVER_BASH_URL;
  constructor(private http: _HttpClient) { }
   getProvinces(): Observable<{label: string, value: string}[]> {
      return this.http.get( this.baseUrl + '/area/get-provinces' ).map(
         (res: {code: number, data: any}) => {
            let provinces = [];
            if (res !== null && res['code'] === 1 ) {
                 provinces = res['data'].map((item) => {
                   return {label: item.provinceName , value: item.provinceCode };
                 });
            }
            return provinces;
         }
      );
  }
  getCities(provinceCode: string): Observable<{label: string, value: string}[]> {
    return this.http.get( this.baseUrl + '/area/get-cities', {provinceCode: provinceCode}).map(
       (res: {code: number, data: any}) => {
          let cities = [];
          if (res !== null && res['code'] === 1 ) {
            cities = res['data'].map((item) => {
                 return {label: item.cityName , value: item.cityCode };
               });
          }
          return cities;
       }
    );
   }
   getAreas(cityCode: string): Observable<{label: string, value: string}[]> {
    return this.http.get( this.baseUrl + '/area/get-areas', {cityCode: cityCode}).map(
       (res: {code: number, data: any}) => {
          let areas = [];
          if (res !== null && res['code'] === 1 ) {
            areas = res['data'].map((item) => {
                 return {label: item.areaName , value: item.areaCode , isLeaf: true};
               });
          }
          return areas;
       }
    );
   }
}
src/app/routes/devices/devices.module.ts
@@ -10,11 +10,11 @@
import { VersionService } from 'app/routes/devices/version/version.service';
import { Version } from '@angular/compiler/src/util';
import { _HttpClient } from '@delon/theme/services/http/http.client';
import { AddOrEditComponent } from './version/add-or-edit/add-or-edit.component';
import { PipeModule } from '@core/pipe/pipe.module';
import { FormBuilder } from '@angular/forms';
import { VersionEditComponent } from './version/version-edit/version-edit.component';
const COMPONENTS_NOROUNT = [ AddOrEditComponent ];
const COMPONENTS_NOROUNT = [  VersionEditComponent  ];
const routes: Routes = [
  {
src/app/routes/devices/version/version-edit/version-edit.component.html
src/app/routes/devices/version/version-edit/version-edit.component.ts
File was renamed from src/app/routes/devices/version/add-or-edit/add-or-edit.component.ts
@@ -1,16 +1,14 @@
import { DeviceVersion } from './../version.component';
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
import { DateService } from '@core/services/date.service';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { DeviceVersion } from 'app/routes/devices/version/version.component';
@Component({
  selector: 'app-add-or-edit',
  templateUrl: './add-or-edit.component.html',
  selector: 'app-version-edit',
  templateUrl: './version-edit.component.html',
  styles: []
})
export class AddOrEditComponent implements OnInit {
export class VersionEditComponent implements OnInit {
 
  cols: DeviceVersion;
@@ -27,7 +25,7 @@
          name: [this.data.name, [Validators.required] ],
          version: [this.data.version == null ? 1 : this.data.version, [Validators.required] ],
          createTime: [this.data.createTime, [Validators.required] ],
          description: [this.data.description, [Validators.required] ]
          description: [this.data.description]
     };
     this.validateForm = this.formBuilder.group(
      validates
@@ -53,16 +51,14 @@
          return;
        }
        this.isSaving = true;
        Object.keys(this.data).forEach( (key: string) => {
        Object.keys(value).forEach( (key: string) => {
              if ( value[key] != null ) {
                   this.data[key] = value[key];
              }
        } );
        this.subject.next( this );
      }else {
          for (const i in this.validateForm.controls) {
          this.validateForm.controls[ i ].markAsDirty();
         }
        this.validate();
      }
  }
  validate() {
src/app/routes/devices/version/version.component.html
@@ -47,7 +47,7 @@
                    [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
                        <span [ngSwitch]="col.type">
                             <!-- 要使用管道,无法自动生成 -->
                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col }} </span>
                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row}} </span>
                             <!-- 要使用管道,无法自动生成 -->        
                        </span>
                    </td>
src/app/routes/devices/version/version.component.ts
@@ -1,5 +1,4 @@
import { DataType } from './../../../core/entity/grid';
import { AddOrEditComponent } from './add-or-edit/add-or-edit.component';
import { Version } from '@angular/compiler/src/util';
import { Subject } from 'rxjs/Subject';
import { ToolsService } from '@core/services/tools.service';
@@ -13,6 +12,7 @@
import { Types } from '@core/enum/types.enum';
import { Column, Grid, PageBean } from '@core/entity/grid';
import { filter } from 'rxjs/operators/filter';
import { VersionEditComponent } from 'app/routes/devices/version/version-edit/version-edit.component';
export interface DeviceVersion {
  createTime?: Column|any;
@@ -108,7 +108,7 @@
       data = {};
    }
    const cols = this.version;
    this.modalHelper.static(AddOrEditComponent, { cols , data }).subscribe(
    this.modalHelper.static(VersionEditComponent, { cols , data }).subscribe(
      ( ret: { data: any, close: Function} ) => {
      this.versionService.save(ret.data).subscribe(
         ( res: any) => {
src/app/routes/systems/organization/organization-edit/organization-edit.component.html
New file
@@ -0,0 +1,90 @@
<div class="modal-header">
  <div class="modal-title">{{ data.id != null ? '编辑' : '添加'}} - 组织</div>
</div>
<form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
  <div nz-form-item nz-row class="mb-sm">
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label nz-form-item-required>名称</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'组织名称'">
      </nz-input>
    </div>
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label>级别</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="4" nzHasFeedback>
      <nz-select style="width: 120px;" formControlName="rank" [nzPlaceHolder]="'选择 级别'">
        <nz-option *ngFor="let option of rankOptions" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled">
        </nz-option>
      </nz-select>
    </div>
  </div>
  <div nz-form-item nz-row class="mb-sm">
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label nz-form-item-required>省/市/区</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-cascader [class.class123]="true" (nzChange)="setAreaCodes($event)" formControlName="_areas" (nzLoad)="areaLazyLoad($event)"
      [nzPlaceHolder]="'选择 省/市/区'" >
      </nz-cascader>
    </div>
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label>详细地址</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-input formControlName="address" maxlength="20"
      [nzPlaceHolder]="'详细地址(例):人民路120号'">
      </nz-input>
    </div>
  </div>
  <div nz-form-item nz-row class="mb-sm">
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label>电话</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-input formControlName="telephone" maxlength="20"
      [nzPlaceHolder]="'电话(例):0512-12345678'"></nz-input>
    </div>
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label>邮件</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-input formControlName="email" maxlength="20"
      [nzPlaceHolder]="'邮件(例):abc@qq.com'"></nz-input>
    </div>
  </div>
  <div nz-form-item nz-row class="mb-sm">
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label nz-form-item-required>创建时间</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-datepicker nzSize="large"  style="width: 90%;" formControlName="createTime" nzShowTime  [nzPlaceHolder]="'选择时间'"
      [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
    </div>
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label nz-form-item-required>到期时间</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
      <nz-datepicker nzSize="large"  style="width: 90%;" formControlName="expireTime" nzShowTime  [nzPlaceHolder]="'选择时间'"
      [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
    </div>
  </div>
  <div nz-form-item nz-row class="mb-sm">
    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
      <label>备注</label>
    </div>
    <div nz-form-control nz-col [nzSpan]="16" nzHasFeedback>
      <nz-input formControlName="description" maxlength="100"></nz-input>
    </div>
  </div>
  <div class="modal-footer">
    <button nz-button type="button" (click)="close()">关闭</button>
    <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
      <span>
        保存
        <span *ngIf="isSaving">中</span>
      </span>
    </button>
  </div>
</form>
src/app/routes/systems/organization/organization-edit/organization-edit.component.ts
New file
@@ -0,0 +1,116 @@
import { Organization } from './../organization.component';
import { AreacodeService } from './../../../../core/services/areacode.service';
import { Component, OnInit } from '@angular/core';
import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
import { CascaderOption } from 'ng-zorro-antd/src/cascader/nz-cascader.component';
@Component({
  selector: 'app-organization-edit',
  templateUrl: './organization-edit.component.html',
  styles: []
})
export class OrganizationEditComponent implements OnInit {
  rankOptions = [
    { value: 0, label: '企业' },
    { value: 1, label: '乡镇科级' },
    { value: 2, label: '县处级' },
    { value: 3, label: '司厅局级' },
    { value: 4, label: '省部级' },
    { value: 5, label: '国家级' }
  ];
  data: Organization;
  isSaving = false;
  validateForm: FormGroup;
  constructor(
    private subject: NzModalSubject,
    private formBuilder: FormBuilder,
    private areacodeService: AreacodeService
    ) { }
  ngOnInit() {
    const data = this.data;
    const areaNames = data.areaNames;
    let _areas = null;
    if (areaNames != null) {
      _areas = {
       label: Object.values(areaNames).join('/'),
       value: data.areaCode
      };
    }
    if (data.createTime == null) {
      data.createTime = new Date().getTime();
    }
     const validates: Organization|object  = {
          name: [data.name, [Validators.required] ],
          rank: [data.rank],
          telephone: [data.telephone, [ Validators.pattern('^0\\d{2,3}-?\\d{7,8}$') ]],
          email: [data.email, [ Validators.pattern('^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+') ] ],
          address: [data.address ],
          _areas: [_areas,  [Validators.required]],
          createTime: [data.createTime, [Validators.required] ],
          expireTime: [data.expireTime, [Validators.required] ],
          description: [data.description ]
     };
     this.validateForm = this.formBuilder.group(
         validates
     );
  }
  close() {
       this.subject.destroy();
  }
  save($event, value, valid) {
      $event.preventDefault();
      if (valid) {
        for (const i in this.validateForm.controls) {
          this.validateForm.controls[ i ].disable();
        }
        this.isSaving = true;
        Object.keys(value).forEach( (key: string) => {
              // '_'为前缀的为自定义属性
              if (!key.startsWith('_') && value[key] != null) {
                   this.data[key] = value[key];
              }
        } );
        this.subject.next( this );
      }else {
        this.validate();
      }
  }
  validate() {
     for (const i in this.validateForm.controls) {
       this.validateForm.controls[ i ].markAsDirty();
     }
  }
  areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) {
    const index = event['index'];
    const option = event.option;
    switch (index) {
       case -1:
       this.areacodeService.getProvinces().subscribe(
         (res: {label: string, value: string}[]) => {
             event.resolve( res );
         }
       ); break;
       case 0:
       this.areacodeService.getCities(option.value).subscribe(
         (res: {label: string, value: string}[]) => {
             event.resolve( res );
         }
       ); break;
       case 1:
       this.areacodeService.getAreas(option.value).subscribe(
         (res: {label: string, value: string}[]) => {
             event.resolve( res );
         }
       ); break;
    }
  }
  setAreaCodes(codes: string[]) {
      this.data.provinceCode = codes[0];
      this.data.cityCode = codes[1];
      this.data.areaCode = codes[2];
  }
}
src/app/routes/systems/organization/organization.component.html
New file
@@ -0,0 +1,65 @@
<pro-header [title]="grid.title"></pro-header>
<nz-card [nzBordered]="false">
        <div class="mb-md">
                <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'">
                    <i class="anticon anticon-plus"></i><span>新建</span>
                </button>
                <ng-container *ngIf="grid.selectedIndexs.length > 0"> &nbsp;
                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">批量删除</button>
                </ng-container>
                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
        </div>
        <div class="mb-md">
                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true">
                    <span alert-body>
                         已选择<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>项
                    </span>
                </nz-alert>
    </div>
    <nz-table #nzTable
              [nzAjaxData]="grid.data"
              [nzTotal]="grid.total"
              [(nzPageIndex)]="grid.pageIndex"
              [(nzPageSize)]="grid.pageSize"
              [nzLoading]="grid.loading"
              [nzShowTotal]="true"
              (nzPageIndexChange)="load()">
              <thead nz-thead>
                  <tr>
                    <th nz-th [nzCheckbox]="true">
                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></label>
                    </th>
                    <th nz-th *ngFor="let col of grid.columns"
                     [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}" >
                           <span>{{ col.text }}</span>
                           <nz-table-sort *ngIf="col.isSort"   [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
                    </th>
                    <th nz-th><span>操作</span></th>
                  </tr>
              </thead>
              <tbody nz-tbody>
                <tr nz-tbody-tr *ngFor="let row of nzTable.data">
                    <td nz-td [nzCheckbox]="true">
                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
                    </td>
                    <td nz-td *ngFor="let col of grid.columns"
                    [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
                        <span [ngSwitch]="col.type">
                             <!-- 要使用管道,无法自动生成 -->
                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
                             <!-- 要使用管道,无法自动生成 -->
                        </span>
                    </td>
                    <td nz-td>
                            <a (click)="addOrModify(row)">编辑</a>
                            <span nz-table-divider></span>
                              <nz-popconfirm [nzTitle]="'确定要删除该用户吗?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
                                <a nz-popconfirm>删除</a>
                              </nz-popconfirm>
                     </td>
                </tr>
              </tbody>
              </nz-table>
  </nz-card>
src/app/routes/systems/organization/organization.component.ts
New file
@@ -0,0 +1,222 @@
import { DataType, AreaNames } from './../../../core/entity/grid';
import { Version, ValueTransformer } from '@angular/compiler/src/util';
import { Subject } from 'rxjs/Subject';
import { ToolsService } from '@core/services/tools.service';
import { Component, OnInit } from '@angular/core';
import { NzMessageService, NzModalService } from 'ng-zorro-antd';
import { ModalHelper } from '@delon/theme';
import { HttpClient } from '@angular/common/http';
import { environment } from '../../../../environments/environment';
import { DateService } from '@core/services/date.service';
import { VersionService } from 'app/routes/devices/version/version.service';
import { Types } from '@core/enum/types.enum';
import { Column, Grid, PageBean } from '@core/entity/grid';
import { filter } from 'rxjs/operators/filter';
import { OrganizationEditComponent } from './organization-edit/organization-edit.component';
import { OrganizationService } from 'app/routes/systems/organization/organization.service';
export interface Organization {
  address?: Column|any;
  areaCode?: Column|any;
  cityCode?: Column|any;
  createTime?: Column|any;
  description?: Column|any;
  email?: Column|any;
  expireTime?: Column|any;
  id?: Column|any;
  isDelete?: Column|any;
  name?: Column|any;
  provinceCode?: Column|any;
  rank?: Column|any;
  telephone?: Column|any;
  areaNames?: AreaNames|any ;
}
@Component({
  selector: 'app-organization',
  templateUrl: './organization.component.html',
  styles: []
})
export class OrganizationComponent implements OnInit {
  private organization: Organization;
  grid: Grid<Organization> = new Grid(null);
  queryMap = { text: '请输入名称', value: ''};
  queryTextStream: Subject<string> = new Subject<string>();
    private initPage() {
    this.organization =  {
      name: {
        text: '名称',
        width: '120px'
      },
      rank: {
        text: '级别',
        width: '60px'
      },
      telephone: {
        text: '电话',
        width: '180px'
      },
      address: {
        text: '地址',
        width: '300px',
        format: (value: any, col: Column, row: any) => {
              value = value == null ? '' : value ;
              if (row['areaNames'] != null) {
                return row['areaNames']['provinceName'] + row['areaNames']['cityName'] + row['areaNames']['areaName'] + value;
              } else {
                return value;
              }
        }
      },
      createTime: {
        text: '创建时间',
        width: '100px',
        type: {
         name: Types.Date,
         format: 'YYYY-MM-DD HH:mm:ss'
        },
         isSort: true
      },
      expireTime: {
        text: '到期时间',
        width: '100px',
        type: {
         name: Types.Date,
         format: 'YYYY-MM-DD HH:mm:ss'
        },
         isSort: true
      }
    };
    this.grid.title = '设备型号';
    this.grid.setColumns(this.organization);
    this.grid.pageSize = 10;
  }
  constructor(
    private organizationService: OrganizationService,
    private confirmServ: NzModalService,
    public msgSrv: NzMessageService,
    private modalHelper: ModalHelper,
  ) {}
  ngOnInit() {
    this.initPage();
    this.queryTextStream
    .debounceTime(500)
    .distinctUntilChanged()
    .subscribe(queryText => {
        this.load();
    });
  }
  queryTextChanged($event) {
      this.queryTextStream.next(this.queryMap.value);
  }
  load(reload: boolean = false) {
    if (reload) {
      this.grid.pageIndex = 1 ;
    }
    // 延时加载避免ExpressionChangedAfterItHasBeenCheckedError
    setTimeout(() => {
      this.grid.loading = true;
     }, 1);
    this.organizationService.getPagingList(this.grid, this.queryMap.value).subscribe(
       (res: PageBean) => {
            this.grid.loading = true;
            if (res != null && res.data != null) {
              this.grid.initData(res);
              this.grid.refreshStatus();
              setTimeout(() => {
                this.grid.loading = false;
               }, 1);
            }
       }
    );
  }
// rowData为null时,为新增
  addOrModify(d) {
    const data = {};
    if ( d != null) {
      Object.assign(data, d);
    }
    const cols = this.organization;
    this.modalHelper.static(OrganizationEditComponent, { cols , data }).subscribe(
      ( ret: { data: any, close: Function} ) => {
      // 修改状态
      if (ret.data['index'] != null ) {
          const index: number = ret.data['index'] ;
          const origData = this.grid.getData()[index];
          const isModified =  Object.keys(origData).some(
            (key: string) => {
                return ret.data[key] !== origData[key];
            }
          );
          // 未作修改
          if (!isModified) {
            ret.close();
            this.msgSrv.success('组织未作任何修改!');
            return;
          }
      }
      this.organizationService.save(ret.data).subscribe(
         ( res: any) => {
            if (res.code === 1) {
              this.load();
              ret.close();
              this.msgSrv.success('组织保存成功!');
            }
         }
      );
    });
  }
  delete(...id: number[]) {
    this.organizationService.delete( ...id ).subscribe(
      ( res: any) => {
         if (res.code === 1) {
           this.load();
           this.msgSrv.success('设备型号删除成功!');
         }
      }
   );
  }
   deleteSelected() {
    this.confirmServ.confirm({
      title: '批量删除',
      content: '注意:数据一旦删除,将不可恢复!',
      okText: '确定',
      cancelText: '取消'
    }).on('onOk', () => {
       if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
          const ids = this.grid.selectedIndexs.map(
              (index: number) => {
                  const id = this.grid.data[index].id;
                  return Number.parseInt(id);
              }
          );
          this.delete( ...ids );
       }
    });
  }
  sort(field: string, value: string) {
    // 删除当前field
    this.grid.sorts = this.grid.sorts.filter(
       (fn: string) => {
          return fn !== field;
       }
     );
     // 如果value不为null,在排序数组最后加上filed
     if ( value != null ) {
        this.grid.sorts.push(field);
     }
     this.load();
  }
  reset(ls: any[]) {
    for (const item of ls) item.value = false;
    this.load(true);
  }
}
src/app/routes/systems/organization/organization.service.ts
New file
@@ -0,0 +1,35 @@
import { ExampleService } from './../../../core/services/example.service';
import { _HttpClient } from '@delon/theme';
import { environment } from './../../../../environments/environment.prod';
import { RouteConfigLoadStart } from '@angular/router';
import { Injectable } from '@angular/core';
import { equal } from 'assert';
import { Observable } from 'rxjs/Observable';
import {  PageBean } from '@core/entity/grid';
@Injectable()
export class OrganizationService {
  private urls = {
      edit: environment.SERVER_BASH_URL + '/organization/page-list',
      save: environment.SERVER_BASH_URL + '/organization/add-or-modify',
      delete: environment.SERVER_BASH_URL + '/organization/delete-by-ids'
  };
  constructor(private http: _HttpClient) { }
   public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
    const example = new ExampleService();
    if (queryText != null && queryText !== '') {
      example.or().andLike({name: 'name', value: '%' + queryText + '%'});
      example.or().andEqualTo({name: 'version', value: queryText});
    }
    const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex,
        queryParams: example.getSqlParam(), orderByClause: page.getOrderByClause()};
        return this.http.get(this.urls.edit, param);
  }
  public save(data: any): Observable<any> {
        return this.http.post(this.urls.save, data);
  }
  public delete(...ids: number[]): Observable<any> {
        return this.http.post(this.urls.delete, ids);
  }
}
src/app/routes/systems/systems.module.ts
@@ -1,3 +1,5 @@
import { FormBuilder } from '@angular/forms';
import { _HttpClient } from '@delon/theme';
import { Component, OnInit } from '@angular/core';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@@ -6,20 +8,29 @@
import { AccountComponent } from './account/account.component';
import { AccountEditComponent } from './account/account-edit/account-edit.component';
import { OrganizationComponent } from './organization/organization.component';
import { PipeModule } from '@core/pipe/pipe.module';
import { OrganizationEditComponent } from './organization/organization-edit/organization-edit.component';
import { ToolsService } from '@core/services/tools.service';
import { OrganizationService } from 'app/routes/systems/organization/organization.service';
import { AreacodeService } from '@core/services/areacode.service';
const routes: Routes = [
  {
    path: '',
    children: [
      { path: 'account', component: AccountComponent }
      { path: 'account', component: AccountComponent },
      { path: 'organization', component: OrganizationComponent }
    ]
  }
];
const COMPONENTS_NOROUNT = [ AccountEditComponent ];
const COMPONENTS_NOROUNT = [ AccountEditComponent, OrganizationEditComponent ];
@NgModule({
  imports: [
    // 管道模块必须当前模块导入
    PipeModule,
    CommonModule,
    SharedModule,
    RouterModule.forChild(routes)
@@ -27,9 +38,10 @@
  declarations: [
    ...COMPONENTS_NOROUNT,
    AccountComponent,
    AccountEditComponent
    AccountEditComponent,
    OrganizationComponent
  ],
  providers: [ToolsService, OrganizationService, _HttpClient, FormBuilder, AreacodeService],
  entryComponents: COMPONENTS_NOROUNT
})
export class SystemsModule { }
src/app/systems/organization/organization-edit/organization-edit.component.html
New file
@@ -0,0 +1,3 @@
<p>
  organization-edit works!
</p>
src/app/systems/organization/organization-edit/organization-edit.component.ts
New file
@@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
  selector: 'app-organization-edit',
  templateUrl: './organization-edit.component.html',
  styles: []
})
export class OrganizationEditComponent implements OnInit {
  constructor() { }
  ngOnInit() {
  }
}
src/assets/app-data.json
@@ -64,11 +64,17 @@
    "translate": "system_management",
    "link": "/",
    "icon": "icon-note",
    "children": [{
    "children": [
      {
      "text": "账户管理",
      "link": "/systems/account",
      "translate": "system_management_account"
    }]
      },
      {
        "text": "组织管理",
        "link": "/systems/organization"
        }
    ]
  }]
}]
}
src/environments/environment.prod.ts
@@ -3,5 +3,5 @@
    production: true,
    hmr: false,
    useHash: true,
    SERVER_BASH_URL: 'http://localhost:8001'
    SERVER_BASH_URL: 'http://localhost:8080'
};
yarn.lock
@@ -28,8 +28,8 @@
    rxjs "^5.5.2"
"@angular/animations@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/animations/download/@angular/animations-5.1.1.tgz#007621f8bcac15560e160582eb2e91025b6b9106"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/animations/download/@angular/animations-5.1.2.tgz#464df9a9e30c7a8146118fdd9bff82cdfcf97d7e"
  dependencies:
    tslib "^1.7.1"
@@ -39,14 +39,14 @@
  dependencies:
    tslib "^1.7.1"
"@angular/cli@^1.6.1":
  version "1.6.1"
  resolved "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.6.1.tgz#6797995be1965bfc2e26234c728c9968cf7f3bdb"
"@angular/cli@^1.6.3":
  version "1.6.3"
  resolved "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.6.3.tgz#63120b347fc8ee206f773074d25fdd4807c189e3"
  dependencies:
    "@angular-devkit/build-optimizer" "~0.0.36"
    "@angular-devkit/schematics" "~0.0.42"
    "@ngtools/json-schema" "1.1.0"
    "@ngtools/webpack" "1.9.1"
    "@ngtools/webpack" "1.9.3"
    "@schematics/angular" "~0.1.11"
    autoprefixer "^6.5.3"
    chalk "~2.2.0"
@@ -91,7 +91,7 @@
    style-loader "^0.13.1"
    stylus "^0.54.5"
    stylus-loader "^3.0.1"
    uglifyjs-webpack-plugin "~1.1.2"
    uglifyjs-webpack-plugin "^1.1.5"
    url-loader "^0.6.2"
    webpack "~3.10.0"
    webpack-dev-middleware "~1.12.0"
@@ -104,14 +104,14 @@
    node-sass "^4.3.0"
"@angular/common@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/common/download/@angular/common-5.1.1.tgz#b6444cf6508f9b0b5fc4c9b3107b3e37be1336c9"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/common/download/@angular/common-5.1.2.tgz#b2659161575d463bb8b3e30e37434b26d70366b4"
  dependencies:
    tslib "^1.7.1"
"@angular/compiler-cli@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/compiler-cli/download/@angular/compiler-cli-5.1.1.tgz#579e6846ed493e7202e36eb5cea00cb1a61c927c"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/compiler-cli/download/@angular/compiler-cli-5.1.2.tgz#70addc11b6528f087abe809f94acedecdfc9c8f6"
  dependencies:
    chokidar "^1.4.2"
    minimist "^1.2.0"
@@ -119,48 +119,48 @@
    tsickle "^0.25.5"
"@angular/compiler@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/compiler/download/@angular/compiler-5.1.1.tgz#7d7953229739e68de74ea821685e1d5569527ef3"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/compiler/download/@angular/compiler-5.1.2.tgz#4dfd0dd7fab39a14a1a104097c2f6af470ddabdb"
  dependencies:
    tslib "^1.7.1"
"@angular/core@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/core/download/@angular/core-5.1.1.tgz#b6a6e2b2284f86279f096d857253f6643098d908"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/core/download/@angular/core-5.1.2.tgz#751070c0f4e5a8c4e2170204e08eca06391b84b1"
  dependencies:
    tslib "^1.7.1"
"@angular/forms@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/forms/download/@angular/forms-5.1.1.tgz#e38858a44e7b57b61f375087b76a79d6e2679b14"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/forms/download/@angular/forms-5.1.2.tgz#fae4934ccdd41443efdee49b754c8b2a5587b12c"
  dependencies:
    tslib "^1.7.1"
"@angular/http@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/http/download/@angular/http-5.1.1.tgz#45aa61ee61f212a34f958c444c999e8c9352ec23"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/http/download/@angular/http-5.1.2.tgz#38edf3bec056e9c3456868799f4c0f83127c73b9"
  dependencies:
    tslib "^1.7.1"
"@angular/language-service@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/language-service/download/@angular/language-service-5.1.1.tgz#731533a3b6ee4c8facda862a836db1930a011f07"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/language-service/download/@angular/language-service-5.1.2.tgz#0c0579c2feb7dd9afb2576e9b602779d45b30810"
"@angular/platform-browser-dynamic@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/platform-browser-dynamic/download/@angular/platform-browser-dynamic-5.1.1.tgz#4b7bd1cbdb3c93fdeb626b38fbd54286a73a76d0"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/platform-browser-dynamic/download/@angular/platform-browser-dynamic-5.1.2.tgz#120d49ce16bcb91b8ac1c5e5c634fba592359ad7"
  dependencies:
    tslib "^1.7.1"
"@angular/platform-browser@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/platform-browser/download/@angular/platform-browser-5.1.1.tgz#88a05132d822b760c9108a3eaf0da610f39c2ed9"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/platform-browser/download/@angular/platform-browser-5.1.2.tgz#6faf926b9b41b6d54d873f3dcc4f31ad35fd0c38"
  dependencies:
    tslib "^1.7.1"
"@angular/router@^5.0.0":
  version "5.1.1"
  resolved "http://registry.npm.taobao.org/@angular/router/download/@angular/router-5.1.1.tgz#378e69edd28edadaff7b09b6ee407aadf7164220"
  version "5.1.2"
  resolved "http://registry.npm.taobao.org/@angular/router/download/@angular/router-5.1.2.tgz#1da8845478ca340e9c4b3d9da1d1a8ee796fda18"
  dependencies:
    tslib "^1.7.1"
@@ -194,22 +194,22 @@
    wolfy87-eventemitter "^5.1.0"
"@antv/g2-plugin-slider@^2.0.0":
  version "2.0.0"
  resolved "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.0.tgz#398ec3d8b869131041f878faf845e76a84baf954"
  version "2.0.1"
  resolved "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.1.tgz#45cf6da6f2050fabe64166a213674422afe4eebf"
"@antv/g2@^3.0.1":
  version "3.0.2"
  resolved "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.2.tgz#2deac4fa5d48e36838665175166a4812bf674e5e"
  version "3.0.3"
  resolved "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.3.tgz#ee59e1ded71b065d1e9ef3fe6d572fe5de07c069"
  dependencies:
    "@antv/g" "~2.0.2"
    "@antv/g" "~2.0.4"
    fecha "~2.3.2"
    gl-matrix "~2.4.0"
    lodash "~4.17.4"
    wolfy87-eventemitter "~5.2.4"
"@antv/g@~2.0.2":
  version "2.0.3"
  resolved "http://registry.npm.taobao.org/@antv/g/download/@antv/g-2.0.3.tgz#32870c86ddbd7c9cd36a5bcfcde85328915d54bb"
"@antv/g@~2.0.4":
  version "2.0.4"
  resolved "http://registry.npm.taobao.org/@antv/g/download/@antv/g-2.0.4.tgz#b637c641b4dd6092fc4d628aa604424d29faca0d"
  dependencies:
    d3-ease "^1.0.3"
    d3-interpolate "^1.1.5"
@@ -238,9 +238,9 @@
  version "1.1.0"
  resolved "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922"
"@ngtools/webpack@1.9.1":
  version "1.9.1"
  resolved "http://registry.npm.taobao.org/@ngtools/webpack/download/@ngtools/webpack-1.9.1.tgz#c09db646432723f8f912412144313d4830b2eb4d"
"@ngtools/webpack@1.9.3":
  version "1.9.3"
  resolved "http://registry.npm.taobao.org/@ngtools/webpack/download/@ngtools/webpack-1.9.3.tgz#353e27e6f21ab35467d17b67e3096dfc5d9bf80c"
  dependencies:
    chalk "~2.2.0"
    enhanced-resolve "^3.1.0"
@@ -249,6 +249,7 @@
    semver "^5.3.0"
    source-map "^0.5.6"
    tree-kill "^1.0.0"
    webpack-sources "^1.1.0"
"@ngx-translate/core@^9.0.0":
  version "9.0.2"
@@ -269,8 +270,8 @@
  resolved "http://registry.npm.taobao.org/@schematics/schematics/download/@schematics/schematics-0.0.11.tgz#c8f70f270ed38f29b2873248126fd59abd635862"
"@types/jasmine@*":
  version "2.8.2"
  resolved "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.8.2.tgz#6ae4d8740c0da5d5a627df725b4eed71b8e36668"
  version "2.8.3"
  resolved "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.8.3.tgz#f910edc67d69393d562d10f8f3d205ea3f3306bf"
"@types/jasmine@~2.6.0":
  version "2.6.3"
@@ -283,8 +284,8 @@
    "@types/jasmine" "*"
"@types/node@^6.0.46", "@types/node@~6.0.60":
  version "6.0.94"
  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-6.0.94.tgz#70e509b07ed9f961c8f6f4a73a61d922be5029a7"
  version "6.0.95"
  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-6.0.95.tgz#0d027612a77c55b84497ff90a4a7d597e5ac0fab"
"@types/q@^0.0.32":
  version "0.0.32"
@@ -331,8 +332,8 @@
  resolved "http://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
acorn@^5.0.0, acorn@^5.1.1:
  version "5.2.1"
  resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7"
  version "5.3.0"
  resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822"
adm-zip@0.4.4:
  version "0.4.4"
@@ -706,7 +707,7 @@
  dependencies:
    babel-runtime "^6.22.0"
babel-runtime@^6.22.0, babel-runtime@^6.26.0:
babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.6.1:
  version "6.26.0"
  resolved "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
  dependencies:
@@ -828,7 +829,7 @@
  dependencies:
    minimist "^1.2.0"
bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0:
bluebird@^3.3.0, bluebird@^3.4.6, bluebird@^3.4.7, bluebird@^3.5.0:
  version "3.5.1"
  resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
@@ -969,11 +970,11 @@
    electron-to-chromium "^1.2.7"
browserslist@^2.10.0:
  version "2.10.0"
  resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-2.10.0.tgz#bac5ee1cc69ca9d96403ffb8a3abdc5b6aed6346"
  version "2.10.1"
  resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-2.10.1.tgz#f9dc692b79004a78ec9ba0d012c54de44cc6d7e4"
  dependencies:
    caniuse-lite "^1.0.30000780"
    electron-to-chromium "^1.3.28"
    caniuse-lite "^1.0.30000784"
    electron-to-chromium "^1.3.30"
buffer-crc32@^0.2.1:
  version "0.2.13"
@@ -1080,7 +1081,7 @@
  version "1.0.30000784"
  resolved "http://registry.npm.taobao.org/caniuse-db/download/caniuse-db-1.0.30000784.tgz#1be95012d9489c7719074f81aee57dbdffe6361b"
caniuse-lite@^1.0.30000780, caniuse-lite@^1.0.30000783:
caniuse-lite@^1.0.30000783, caniuse-lite@^1.0.30000784:
  version "1.0.30000784"
  resolved "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000784.tgz#129ced74e9a1280a441880b6cd2bce30ef59e6c0"
@@ -1346,8 +1347,8 @@
  resolved "http://registry.npm.taobao.org/commander/download/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
common-tags@^1.3.1:
  version "1.5.1"
  resolved "http://registry.npm.taobao.org/common-tags/download/common-tags-1.5.1.tgz#e2e39931a013cd02253defeed89a1ad615a27f07"
  version "1.6.0"
  resolved "http://registry.npm.taobao.org/common-tags/download/common-tags-1.6.0.tgz#788e4bcc582f16993e5b2c92f76b1ccb80731537"
  dependencies:
    babel-runtime "^6.26.0"
@@ -1469,8 +1470,8 @@
    run-queue "^1.0.0"
copy-webpack-plugin@^4.1.1:
  version "4.3.0"
  resolved "http://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.3.0.tgz#cfdf4d131c78d66917a1bb863f86630497aacf42"
  version "4.3.1"
  resolved "http://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.3.1.tgz#19ba6370bf6f8e263cbd66185a2b79f2321a9302"
  dependencies:
    cacache "^10.0.1"
    find-cache-dir "^1.0.0"
@@ -2110,9 +2111,15 @@
  version "2.5.7"
  resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.28:
  version "1.3.29"
  resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.29.tgz#7a58236b95468c3e7660091348522d65d7736b36"
electron-releases@^2.1.0:
  version "2.1.0"
  resolved "http://registry.npm.taobao.org/electron-releases/download/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e"
electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
  version "1.3.30"
  resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.30.tgz#9666f532a64586651fc56a72513692e820d06a80"
  dependencies:
    electron-releases "^2.1.0"
elegant-spinner@^1.0.1:
  version "1.0.1"
@@ -3184,8 +3191,8 @@
  resolved "http://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
html-minifier@^3.2.3:
  version "3.5.7"
  resolved "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.7.tgz#511e69bb5a8e7677d1012ebe03819aa02ca06208"
  version "3.5.8"
  resolved "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.8.tgz#5ccdb1f73a0d654e6090147511f6e6b2ee312700"
  dependencies:
    camel-case "3.0.x"
    clean-css "4.1.x"
@@ -3194,7 +3201,7 @@
    ncname "1.0.x"
    param-case "2.1.x"
    relateurl "0.2.x"
    uglify-js "3.2.x"
    uglify-js "3.3.x"
html-tags@^2.0.0:
  version "2.0.0"
@@ -3672,7 +3679,7 @@
  version "0.1.2"
  resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
istanbul-api@^1.1.8:
istanbul-api@^1.1.14:
  version "1.2.1"
  resolved "http://registry.npm.taobao.org/istanbul-api/download/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
  dependencies:
@@ -3903,10 +3910,10 @@
    resolve "^1.1.6"
karma-coverage-istanbul-reporter@^1.3.0:
  version "1.3.0"
  resolved "http://registry.npm.taobao.org/karma-coverage-istanbul-reporter/download/karma-coverage-istanbul-reporter-1.3.0.tgz#d142cd9c55731c9e363ef7374e8ef1a31bebfadb"
  version "1.3.3"
  resolved "http://registry.npm.taobao.org/karma-coverage-istanbul-reporter/download/karma-coverage-istanbul-reporter-1.3.3.tgz#daf26051d5a0daa5838a4ce81aa4a41724bdf36b"
  dependencies:
    istanbul-api "^1.1.8"
    istanbul-api "^1.1.14"
    minimatch "^3.0.4"
karma-jasmine-html-reporter@^0.2.2:
@@ -4050,6 +4057,15 @@
  dependencies:
    prelude-ls "~1.1.2"
    type-check "~0.3.2"
libphonenumber-js@^0.4.5:
  version "0.4.48"
  resolved "http://registry.npm.taobao.org/libphonenumber-js/download/libphonenumber-js-0.4.48.tgz#d2064ef7e71f24046abfe1a07351d4affa5c1a4a"
  dependencies:
    babel-runtime "^6.6.1"
    bluebird "^3.4.6"
    minimist "^1.2.0"
    xml2js "^0.4.17"
license-webpack-plugin@^1.0.0:
  version "1.1.1"
@@ -4391,8 +4407,8 @@
    pify "^3.0.0"
make-error@^1.1.1:
  version "1.3.0"
  resolved "http://registry.npm.taobao.org/make-error/download/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96"
  version "1.3.2"
  resolved "http://registry.npm.taobao.org/make-error/download/make-error-1.3.2.tgz#8762ffad2444dd8ff1f7c819629fa28e24fea1c4"
map-obj@^1.0.0, map-obj@^1.0.1:
  version "1.0.1"
@@ -4687,8 +4703,8 @@
  resolved "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.6.tgz#b69ba30603843ffd6ded09a46dd2038542251e40"
ng-zorro-antd@^0.6.5:
  version "0.6.7"
  resolved "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.7.tgz#7cbeab6258edca2c0c67a98eb93a226c41409a5f"
  version "0.6.8"
  resolved "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.8.tgz#68c360710408dca6b097a6b27b22c5061f60fae2"
  dependencies:
    "@angular/cdk" "^5.0.0"
    moment "^2.18.1"
@@ -4706,13 +4722,19 @@
  version "0.9.0"
  resolved "http://registry.npm.taobao.org/ng2-img-cropper/download/ng2-img-cropper-0.9.0.tgz#305337e669c4e5adc876d628dcae0bca4d10d1c3"
ng2-validation@^4.2.0:
  version "4.2.0"
  resolved "http://registry.npm.taobao.org/ng2-validation/download/ng2-validation-4.2.0.tgz#f38d441d3fb7e862155166480045aaff9ad11dbb"
  dependencies:
    libphonenumber-js "^0.4.5"
ngx-color-picker@^5.0.0:
  version "5.2.0"
  resolved "http://registry.npm.taobao.org/ngx-color-picker/download/ngx-color-picker-5.2.0.tgz#8433933ed785e0e5d328555774b20c23e3498606"
  version "5.3.0"
  resolved "http://registry.npm.taobao.org/ngx-color-picker/download/ngx-color-picker-5.3.0.tgz#49d64ecd391e39429b8d1dbc8701f18a4efffd3e"
ngx-countdown@^2.0.0:
  version "2.0.2"
  resolved "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.0.2.tgz#faaf74e5d96709062f7fb035f105b5f8f76be92d"
  version "2.0.4"
  resolved "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.0.4.tgz#b0c0266da4aa24efc057f99f2e19a03142133cc0"
no-case@^2.2.0:
  version "2.3.2"
@@ -5634,12 +5656,12 @@
    supports-color "^3.2.3"
postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13, postcss@^6.0.14, postcss@^6.0.3, postcss@^6.0.6, postcss@^6.0.8:
  version "6.0.14"
  resolved "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885"
  version "6.0.15"
  resolved "http://registry.npm.taobao.org/postcss/download/postcss-6.0.15.tgz#f460cd6269fede0d1bf6defff0b934a9845d974d"
  dependencies:
    chalk "^2.3.0"
    source-map "^0.6.1"
    supports-color "^4.4.0"
    supports-color "^5.1.0"
prelude-ls@~1.1.2:
  version "1.1.2"
@@ -6280,13 +6302,7 @@
  version "1.3.3"
  resolved "http://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
rxjs@^5.4.2, rxjs@^5.5.2:
  version "5.5.5"
  resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.5.tgz#e164f11d38eaf29f56f08c3447f74ff02dd84e97"
  dependencies:
    symbol-observable "1.0.1"
rxjs@^5.5.5:
rxjs@^5.4.2, rxjs@^5.5.2, rxjs@^5.5.5:
  version "5.5.6"
  resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02"
  dependencies:
@@ -7013,9 +7029,15 @@
  dependencies:
    has-flag "^1.0.0"
supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0:
supports-color@^4.0.0, supports-color@^4.2.1:
  version "4.5.0"
  resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
  dependencies:
    has-flag "^2.0.0"
supports-color@^5.1.0:
  version "5.1.0"
  resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5"
  dependencies:
    has-flag "^2.0.0"
@@ -7036,8 +7058,8 @@
    whet.extend "~0.9.9"
sweetalert2@^7.0.0:
  version "7.1.2"
  resolved "http://registry.npm.taobao.org/sweetalert2/download/sweetalert2-7.1.2.tgz#07b4c816e4ca1294f379a45cc810f4c6618e473b"
  version "7.3.1"
  resolved "http://registry.npm.taobao.org/sweetalert2/download/sweetalert2-7.3.1.tgz#ea44f0affdb6e3ee58e649f13e8bbb0604c0bb8f"
symbol-observable@1.0.1:
  version "1.0.1"
@@ -7243,7 +7265,7 @@
    source-map "^0.5.6"
    source-map-support "^0.4.2"
tslib@^1.7.1, tslib@^1.8.0:
tslib@^1.7.1, tslib@^1.8.1:
  version "1.8.1"
  resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac"
@@ -7263,10 +7285,10 @@
    tsutils "^2.8.1"
tsutils@^2.8.1:
  version "2.13.1"
  resolved "http://registry.npm.taobao.org/tsutils/download/tsutils-2.13.1.tgz#d6d1cc0f7c04cf9fb3b28a292973cffb9cfbe09a"
  version "2.15.0"
  resolved "http://registry.npm.taobao.org/tsutils/download/tsutils-2.15.0.tgz#90831e5908cca10b28cdaf83a56dcf8156aed7c6"
  dependencies:
    tslib "^1.8.0"
    tslib "^1.8.1"
tty-browserify@0.0.0:
  version "0.0.0"
@@ -7303,24 +7325,20 @@
  version "0.0.6"
  resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
typescript@~2.5.0:
  version "2.5.3"
  resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
typescript@~2.6.1:
typescript@^2.6.2, typescript@~2.6.1:
  version "2.6.2"
  resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4"
uglify-es@^3.2.1:
uglify-es@3.2.2:
  version "3.2.2"
  resolved "http://registry.npm.taobao.org/uglify-es/download/uglify-es-3.2.2.tgz#15c62b7775002c81b7987a1c49ecd3f126cace73"
  dependencies:
    commander "~2.12.1"
    source-map "~0.6.1"
uglify-js@3.2.x:
  version "3.2.2"
  resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.2.2.tgz#870e4b34ed733d179284f9998efd3293f7fd73f6"
uglify-js@3.3.x:
  version "3.3.4"
  resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.3.4.tgz#d8ebb76f201a3798ac2f0b6519642fcca4a99834"
  dependencies:
    commander "~2.12.1"
    source-map "~0.6.1"
@@ -7346,16 +7364,16 @@
    uglify-js "^2.8.29"
    webpack-sources "^1.0.1"
uglifyjs-webpack-plugin@~1.1.2:
  version "1.1.4"
  resolved "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.1.4.tgz#e43ad6e736c315024eb99481a7cc9362d6a066be"
uglifyjs-webpack-plugin@^1.1.5:
  version "1.1.5"
  resolved "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.1.5.tgz#5ec4a16da0fd10c96538f715caed10dbdb180875"
  dependencies:
    cacache "^10.0.0"
    find-cache-dir "^1.0.0"
    schema-utils "^0.3.0"
    serialize-javascript "^1.4.0"
    source-map "^0.6.1"
    uglify-es "^3.2.1"
    uglify-es "3.2.2"
    webpack-sources "^1.0.1"
    worker-farm "^1.4.1"
@@ -7740,7 +7758,7 @@
  dependencies:
    lodash "^4.17.4"
webpack-sources@^1.0.0, webpack-sources@^1.0.1:
webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0:
  version "1.1.0"
  resolved "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
  dependencies:
@@ -8040,5 +8058,5 @@
    readable-stream "^2.0.0"
zone.js@^0.8.14, zone.js@^0.8.18:
  version "0.8.18"
  resolved "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.18.tgz#8cecb3977fcd1b3090562ff4570e2847e752b48d"
  version "0.8.19"
  resolved "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.19.tgz#a4b522cd9e8b7b616a638c297d720d4c7f292f71"