fengxiang
2018-02-27 b4f60bc9c5f2f74eee61c2fc2a639618aaf52c2b
更新主题系统版本
1 files added
13 files modified
356 ■■■■■ changed files
.angular-cli.json 3 ●●●●● patch | view | raw | blame | history
.travis.yml 2 ●●● patch | view | raw | blame | history
package.json 28 ●●●● patch | view | raw | blame | history
src/app/app.component.ts 12 ●●●●● patch | view | raw | blame | history
src/app/core/i18n/i18n.service.ts 4 ●●●● patch | view | raw | blame | history
src/app/core/net/default.interceptor.ts 78 ●●●●● patch | view | raw | blame | history
src/app/delon.module.ts 41 ●●●● patch | view | raw | blame | history
src/app/layout/default/header/components/i18n.component.ts 40 ●●●●● patch | view | raw | blame | history
src/app/layout/default/header/header.component.html 2 ●●● patch | view | raw | blame | history
src/app/layout/layout.module.ts 4 ●●●● patch | view | raw | blame | history
src/app/layout/passport/passport.component.html 8 ●●●● patch | view | raw | blame | history
src/app/layout/passport/passport.component.less 2 ●●● patch | view | raw | blame | history
src/app/routes/passport/login/login.component.ts 6 ●●●● patch | view | raw | blame | history
yarn.lock 126 ●●●● patch | view | raw | blame | history
.angular-cli.json
@@ -57,6 +57,9 @@
        }
    },
    "defaults": {
        "schematics": {
          "collection": "@delon/cli"
        },
        "styleExt": "less",
        "class": {
            "spec": false
.travis.yml
@@ -1,4 +1,4 @@
sudo: false
sudo: required
language: node_js
node_js:
  - "8.5.0"
package.json
@@ -1,6 +1,6 @@
{
  "name": "ng-alain",
  "version": "0.6.0-rc.2",
  "version": "0.6.6",
  "description": "ng-zorro-antd admin panel front-end framework",
  "author": "cipchk",
  "homepage": "https://cipchk.github.io/ng-alain/",
@@ -41,14 +41,14 @@
    "@angular/platform-browser": "^5.0.0",
    "@angular/platform-browser-dynamic": "^5.0.0",
    "@angular/router": "^5.0.0",
    "@antv/data-set": "^0.8.3",
    "@antv/g2": "^3.0.1",
    "@antv/g2-plugin-slider": "^2.0.0",
    "@delon/abc": "0.6.1",
    "@delon/acl": "0.6.1",
    "@delon/auth": "0.6.1",
    "@delon/cache": "0.6.1",
    "@delon/theme": "0.6.1",
    "@antv/data-set": "^0.8.5",
    "@antv/g2": "^3.0.5-beta.3",
    "@antv/g2-plugin-slider": "^2.0.1",
    "@delon/abc": "0.6.6",
    "@delon/acl": "0.6.6",
    "@delon/auth": "0.6.6",
    "@delon/cache": "0.6.6",
    "@delon/theme": "0.6.6",
    "@ngx-translate/core": "^9.0.0",
    "@ngx-translate/http-loader": "^2.0.0",
    "@types/jquery": "^3.3.0",
@@ -63,11 +63,10 @@
    "jquery": "^3.3.1",
    "moment": "^2.19.3",
    "ng-clipboard-antd": "^2.0.1",
    "ng-tree-antd": "^2.0.0",
    "ng-zorro-antd": "^0.6.5",
    "ng-zorro-antd-extra": "^1.1.6",
    "ng-tree-antd": "^2.2.2",
    "ng-zorro-antd": "^0.6.15",
    "ng-zorro-antd-extra": "^1.1.7",
    "ng2-dnd": "^5.0.0",
    "ng2-file-upload": "^1.2.1",
    "ng2-img-cropper": "^0.9.0",
    "ngx-color-picker": "^5.0.0",
    "ngx-countdown": "^2.0.0",
@@ -86,6 +85,7 @@
    "@angular/language-service": "^5.0.0",
    "@angularclass/hmr": "^2.1.3",
    "@angularclass/hmr-loader": "^3.0.4",
    "@delon/cli": "^0.6.6",
    "@types/jasmine": "~2.6.0",
    "@types/jasminewd2": "~2.0.3",
    "@types/jszip": "^3.1.2",
@@ -112,7 +112,7 @@
    "stylelint-config-standard": "^17.0.0",
    "ts-node": "~3.2.0",
    "tslint": "~5.7.0",
    "typescript": "~2.5.0",
    "typescript": "~2.5.3",
    "webpack-bundle-analyzer": "^2.9.0",
    "xlsx": "^0.11.16"
  },
src/app/app.component.ts
@@ -3,7 +3,7 @@
import { Component, HostBinding, OnInit } from '@angular/core';
import { Router, NavigationEnd, NavigationStart } from '@angular/router';
import { ThemesService, SettingsService, TitleService } from '@delon/theme';
import { filter, map } from 'rxjs/operators';
import { filter } from 'rxjs/operators';
import * as $ from 'jquery';
@Component({
  selector: 'app-root',
@@ -24,13 +24,9 @@
  }
  ngOnInit() {
    this.router.events.pipe(
            filter(evt => evt instanceof NavigationEnd),
            map(() => this.router.url)
        )
        .subscribe(url => {
            this.titleSrv.setTitleByUrl(url);
        });
    this.router.events
        .pipe(filter(evt => evt instanceof NavigationEnd))
        .subscribe(() => this.titleSrv.setTitle());
      this.router.events.pipe(
          filter(evt => evt instanceof NavigationStart)
      )
src/app/core/i18n/i18n.service.ts
@@ -11,8 +11,8 @@
    private _default = 'zh-CN';
    private _langs = [
        { code: 'zh-CN', text: '中文' },
        { code: 'en', text: 'English' }
        { code: 'en', text: 'English' },
        { code: 'zh-CN', text: '中文' }
    ];
    constructor(
src/app/core/net/default.interceptor.ts
@@ -1,12 +1,14 @@
import { Injectable, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { HttpInterceptor, HttpRequest, HttpHandler,
import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse,
         HttpSentEvent, HttpHeaderResponse, HttpProgressEvent, HttpResponse, HttpUserEvent,
       } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
import { catchError } from 'rxjs/operators';
import { map, mergeMap } from 'rxjs/operators';
import { mergeMap, catchError } from 'rxjs/operators';
import { NzMessageService } from 'ng-zorro-antd';
import { _HttpClient } from '@delon/theme';
import { environment } from '@env/environment';
/**
@@ -16,54 +18,64 @@
export class DefaultInterceptor implements HttpInterceptor {
    constructor(private injector: Injector) {}
    private goLogin() {
        const router = this.injector.get(Router);
        router.navigate([ '/login' ]);
        // window.location.reload();
    get msg(): NzMessageService {
        return this.injector.get(NzMessageService);
    }
    private goTo(url: string) {
        setTimeout(() => this.injector.get(Router).navigateByUrl(url));
    }
    private handleData(event: HttpResponse<any> | HttpErrorResponse): Observable<any> {
        // 可能会因为 `throw` 导出无法执行 `_HttpClient` 的 `end()` 操作
        this.injector.get(_HttpClient).end();
        // 业务处理:一些通用操作
        switch (event.status) {
            case 200:
                // 业务层级错误处理,以下假如响应体的 `status` 若不为 `0` 表示业务级异常
                // 并显示 `error_message` 内容
                // const body: any = event instanceof HttpResponse && event.body;
                // if (body && body.status !== 0) {
                //     this.msg.error(body.error_message);
                //     // 继续抛出错误中断后续所有 Pipe、subscribe 操作,因此:
                //     // this.http.get('/').subscribe() 并不会触发
                //     return ErrorObservable.throw(event);
                // }
                break;
            case 401: // 未登录状态码
                this.goTo('/passport/login');
                break;
            case 403:
            case 404:
            case 500:
                this.goTo(`/${event.status}`);
                break;
        }
        return of(event);
    }
    intercept(req: HttpRequest<any>, next: HttpHandler):
        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
        // TIPS:原TOKEN信息已交由 `@delon/auth` 处理
        // Document: http://ng-alain.com/docs/auth
        // 统一加上服务端前缀
        let url = req.url;
        if (!url.startsWith('https://') && !url.startsWith('http://')) {
            url = environment.SERVER_URL + url;
        }
        const newReq = req.clone({
            url: url
        });
        return next.handle(newReq).pipe(
                    mergeMap((event: any) => {
                        // 允许统一对请求错误处理,这是因为一个请求若是业务上错误的情况下其HTTP请求的状态是200的情况下需要
                        if (event instanceof HttpResponse && event.status !== 200) {
                            // 业务处理:observer.error 会跳转至后面的 `catch`
                            // return ErrorObservable.create(event);
                        }
                        if (event instanceof HttpResponse && event.status === 200)
                            return this.handleData(event);
                        // 若一切都正常,则后续操作
                        return Observable.create(observer => observer.next(event));
                        return of(event);
                    }),
                    catchError((res: HttpResponse<any>) => {
                        // 业务处理:一些通用操作
                        switch (res.status) {
                            case 401: // 未登录状态码
                                this.goLogin();
                                break;
                            case 200:
                                // 业务层级错误处理
                                console.log('业务错误');
                                break;
                            case 404:
                                // 404
                                break;
                        }
                        // 以错误的形式结束本次请求
                        return ErrorObservable.create(event);
                    })
                    catchError((err: HttpErrorResponse) => this.handleData(err))
                );
    }
}
src/app/delon.module.ts
@@ -2,7 +2,7 @@
 * 进一步对基础模块的导入提炼
 * 有关模块注册指导原则请参考:https://github.com/cipchk/ng-alain/issues/180
 */
import { NgModule, Optional, SkipSelf } from '@angular/core';
import { NgModule, Optional, SkipSelf, ModuleWithProviders } from '@angular/core';
import { throwIfAlreadyLoaded } from '@core/module-import-guard';
// region: zorro modules
@@ -54,6 +54,7 @@
    // NzAffixModule,
    // NzAnchorModule,
    NzAvatarModule,
    NzUploadModule,
    // SERVICES
    NzNotificationService,
    NzMessageService
@@ -104,7 +105,8 @@
    // NzBackTopModule,
    // NzAffixModule,
    // NzAnchorModule,
    NzAvatarModule
    NzAvatarModule,
    NzUploadModule
];
// endregion
@@ -172,8 +174,21 @@
import { AlainAuthModule } from '@delon/auth';
import { AlainACLModule } from '@delon/acl';
import { DelonCacheModule } from '@delon/cache';
import { environment } from '@env/environment';
// mock
// import { DelonMockModule } from '@delon/mock';
// import * as MOCKDATA from '../../_mock';
// import { environment } from '@env/environment';
// const MOCKMODULE = !environment.production || environment.chore === true ?
//                     [ DelonMockModule.forRoot({ data: MOCKDATA }) ] : [];
// region: global config functions
// import { SimpleTableConfig } from '@delon/abc';
// export function simpleTableConfig(): SimpleTableConfig {
//     return { ps: 20 };
// }
// endregion
@NgModule({
    imports: [
@@ -182,7 +197,11 @@
        // theme
        AlainThemeModule.forRoot(),
        // abc
        AlainABCModule.forRoot(),
        AdErrorCollectModule.forRoot(), AdFooterToolbarModule.forRoot(), AdSidebarNavModule.forRoot(), AdDownFileModule.forRoot(), AdImageModule.forRoot(),
        AdAvatarListModule.forRoot(), AdDescListModule.forRoot(), AdEllipsisModule.forRoot(), AdExceptionModule.forRoot(), AdExceptionModule.forRoot(),
        AdNoticeIconModule.forRoot(), AdNumberInfoModule.forRoot(), AdProHeaderModule.forRoot(), AdResultModule.forRoot(), AdStandardFormRowModule.forRoot(),
        AdTagSelectModule.forRoot(), AdTrendModule.forRoot(), AdUtilsModule.forRoot(), AdChartsModule.forRoot(), AdCountDownModule.forRoot(), AdSimpleTableModule.forRoot(),
        AdReuseTabModule.forRoot(), AdFullContentModule.forRoot(), AdXlsxModule.forRoot(), AdZipModule.forRoot(),
        // auth
        AlainAuthModule.forRoot({
            // ignores: [ `\\/login`, `assets\\/` ],
@@ -195,11 +214,23 @@
        // acl
        AlainACLModule.forRoot(),
        // cache
        DelonCacheModule.forRoot()
        DelonCacheModule.forRoot(),
        // mock
        // ...MOCKMODULE
    ]
})
export class DelonModule {
  constructor( @Optional() @SkipSelf() parentModule: DelonModule) {
    throwIfAlreadyLoaded(parentModule, 'DelonModule');
  }
  static forRoot(): ModuleWithProviders {
      return {
          ngModule: DelonModule,
          providers: [
              // TIPS:@delon/abc 有大量的全局配置信息,例如设置所有 `simple-table` 的页码默认为 `20` 行
              // { provide: SimpleTableConfig, useFactory: simpleTableConfig }
          ]
      };
  }
}
src/app/layout/default/header/components/i18n.component.ts
New file
@@ -0,0 +1,40 @@
import { Component } from '@angular/core';
import { SettingsService, MenuService } from '@delon/theme';
import { I18NService } from '@core/i18n/i18n.service';
@Component({
    selector: 'header-i18n',
    template: `
    <nz-dropdown>
        <div nz-dropdown>
            <i class="anticon anticon-edit"></i>
            {{ 'language' | translate}}
            <i class="anticon anticon-down"></i>
        </div>
        <ul nz-menu>
            <li nz-menu-item *ngFor="let item of langs"
            [nzSelected]="item.code === settings.layout.lang"
                (click)="change(item.code)">{{item.text}}</li>
        </ul>
    </nz-dropdown>
    `
})
export class HeaderI18nComponent {
    langs: any[];
    constructor(
        private menuService: MenuService,
        public settings: SettingsService,
        public tsServ: I18NService
    ) {
        this.langs = this.tsServ.getLangs();
    }
    change(lang: string) {
        this.tsServ.use(lang, false).subscribe(() => {
            this.menuService.resume();
        });
        this.settings.setLayout('lang', lang);
    }
}
src/app/layout/default/header/header.component.html
@@ -62,7 +62,7 @@
                        <header-storage></header-storage>
                    </div>
                    <div nz-menu-item>
                        <header-langs></header-langs>
                        <header-i18n></header-i18n>
                    </div>
                </div>
            </nz-dropdown>
src/app/layout/layout.module.ts
@@ -11,7 +11,7 @@
import { HeaderTaskComponent } from './default/header/components/task.component';
import { HeaderIconComponent } from './default/header/components/icon.component';
import { HeaderFullScreenComponent } from './default/header/components/fullscreen.component';
import { HeaderLangsComponent } from './default/header/components/langs.component';
import { HeaderI18nComponent } from './default/header/components/i18n.component';
import { HeaderStorageComponent } from './default/header/components/storage.component';
import { HeaderUserComponent } from './default/header/components/user.component';
@@ -29,7 +29,7 @@
    HeaderIconComponent,
    HeaderFullScreenComponent,
    HeaderThemeComponent,
    HeaderLangsComponent,
    HeaderI18nComponent,
    HeaderStorageComponent,
    HeaderUserComponent
];
src/app/layout/passport/passport.component.html
@@ -3,15 +3,15 @@
        <div class="head">
            <a [routerLink]="['/']">
                <img class="logo" src="./assets/img/logo-color.svg">
                <span class="title">大气监测系统管理后台</span>
                <span class="title">ng-alain</span>
            </a>
        </div>
        <p class="desc"></p>
        <p class="desc">武林中最有影响力的《葵花宝典》;欲练神功,挥刀自宫</p>
    </div>
    <router-outlet></router-outlet>
    <global-footer>
    <global-footer [links]="links">
        <ng-template #copyright>
            Copyright <nz-icon nzType="copyright"></nz-icon> 2018 <a href="http://www.7drlb.com/" target="_blank">七星瓢虫环境科技</a>
            Copyright <nz-icon nzType="copyright"></nz-icon> 2017 <a href="//github.com/cipchk" target="_blank">卡色</a>出品
        </ng-template>
    </global-footer>
</div>
src/app/layout/passport/passport.component.less
@@ -34,7 +34,7 @@
        }
        .title {
            font-size: 28px;
            font-size: 33px;
            color: @heading-color;
            font-family: "Myriad Pro", "Helvetica Neue", Arial, Helvetica, sans-serif;
            font-weight: 600;
src/app/routes/passport/login/login.component.ts
@@ -1,11 +1,12 @@
import { Authorization } from '@business/entity/token';
import { LoginService } from '@business/services/http/login.service';
import { SettingsService } from '@delon/theme';
import { Component, OnDestroy, Inject } from '@angular/core';
import { Component, OnDestroy, Inject, Optional } from '@angular/core';
import { Router } from '@angular/router';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { NzMessageService } from 'ng-zorro-antd';
import { SocialService, SocialOpenType, ITokenService, DA_SERVICE_TOKEN } from '@delon/auth';
import { ReuseTabService } from '@delon/abc';
import { environment } from '@env/environment';
import { CookieService } from 'angular2-cookie/services/cookies.service';
@Component({
@@ -27,6 +28,7 @@
        public msg: NzMessageService,
        private settingsService: SettingsService,
        private socialService: SocialService,
        @Optional() @Inject(ReuseTabService) private reuseTabService: ReuseTabService,
        private loginService:LoginService,
        @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {
        this.form = fb.group({
@@ -84,6 +86,8 @@
            this.loginService.validate(this.userName.value,this.password.value).subscribe(
                (res:Authorization) => {
                   if(res.token!=null){
                        // 清空路由复用信息
                       this.reuseTabService.clear();
                       this.tokenService.set({
                           token: res.token,
                           name: this.userName.value,
yarn.lock
@@ -175,9 +175,9 @@
  version "2.1.3"
  resolved "http://registry.npm.taobao.org/@angularclass/hmr/download/@angularclass/hmr-2.1.3.tgz#34e658ed3da37f23b0a200e2da5a89be92bb209f"
"@antv/data-set@^0.8.3":
  version "0.8.3"
  resolved "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.8.3.tgz#7f58207532a9de5d174b52676b876247b2acab02"
"@antv/data-set@^0.8.5":
  version "0.8.5"
  resolved "https://registry.yarnpkg.com/@antv/data-set/-/data-set-0.8.5.tgz#9ab5f53b7ac078f52211db6cefd0c6a42822bd0e"
  dependencies:
    d3-array "~1.2.0"
    d3-composite-projections "~1.2.0"
@@ -195,50 +195,54 @@
    topojson-client "~3.0.0"
    wolfy87-eventemitter "~5.1.0"
"@antv/g2-plugin-slider@^2.0.0":
"@antv/g2-plugin-slider@^2.0.1":
  version "2.0.1"
  resolved "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.1.tgz#45cf6da6f2050fabe64166a213674422afe4eebf"
  resolved "https://registry.yarnpkg.com/@antv/g2-plugin-slider/-/g2-plugin-slider-2.0.1.tgz#45cf6da6f2050fabe64166a213674422afe4eebf"
"@antv/g2@^3.0.1":
  version "3.0.3"
  resolved "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.3.tgz#ee59e1ded71b065d1e9ef3fe6d572fe5de07c069"
"@antv/g2@^3.0.5-beta.3":
  version "3.0.5-beta.3"
  resolved "https://registry.yarnpkg.com/@antv/g2/-/g2-3.0.5-beta.3.tgz#1cbdf3a6fbf1bcbccf848fb3efd3ab7c5c70c9a0"
  dependencies:
    "@antv/g" "~2.0.4"
    "@antv/g" "~2.0.5"
    fecha "~2.3.2"
    gl-matrix "~2.4.0"
    lodash "~4.17.4"
    wolfy87-eventemitter "~5.2.4"
"@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"
"@antv/g@~2.0.5":
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/@antv/g/-/g-2.0.6.tgz#88a85b5899eae6f3d51f016894b51e39356e56b1"
  dependencies:
    d3-ease "^1.0.3"
    d3-interpolate "^1.1.5"
    d3-timer "^1.0.6"
    gl-matrix "^2.3.2"
    lodash "^4.17.4"
    wolfy87-eventemitter "^5.1.0"
    d3-ease "~1.0.3"
    d3-interpolate "~1.1.5"
    d3-timer "~1.0.6"
    gl-matrix "~2.3.2"
    lodash "~4.17.4"
    wolfy87-eventemitter "~5.1.0"
"@delon/abc@0.6.1":
  version "0.6.1"
  resolved "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.6.1.tgz#161ab09848715700fd00d073c55ac0a51268195d"
"@delon/abc@0.6.6":
  version "0.6.6"
  resolved "https://registry.yarnpkg.com/@delon/abc/-/abc-0.6.6.tgz#9749082a2fbc64096d6df9de4efc730bc54a3473"
"@delon/acl@0.6.1":
  version "0.6.1"
  resolved "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.6.1.tgz#2728f2c24684640caff36db98c0777589b59f747"
"@delon/acl@0.6.6":
  version "0.6.6"
  resolved "https://registry.yarnpkg.com/@delon/acl/-/acl-0.6.6.tgz#c7181ce8b691ff404c28dd4578bfb71a30d88dfe"
"@delon/auth@0.6.1":
  version "0.6.1"
  resolved "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.6.1.tgz#26b0945008663b7126ea30aca6372a6bc5d6a9cb"
"@delon/auth@0.6.6":
  version "0.6.6"
  resolved "https://registry.yarnpkg.com/@delon/auth/-/auth-0.6.6.tgz#0ad68abb18ae215c9bf5a409d3f7e8826227326f"
"@delon/cache@0.6.1":
  version "0.6.1"
  resolved "http://registry.npm.taobao.org/@delon/cache/download/@delon/cache-0.6.1.tgz#13b412897743dc2ad612c4c4fca280c3dc044825"
"@delon/cache@0.6.6":
  version "0.6.6"
  resolved "https://registry.yarnpkg.com/@delon/cache/-/cache-0.6.6.tgz#7249ab3611ecf0b785932008540b3149c8e725f2"
"@delon/theme@0.6.1":
  version "0.6.1"
  resolved "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.6.1.tgz#4e98b1dc565c2f0684717c44ed73509cd866f120"
"@delon/cli@^0.6.6":
  version "0.6.6"
  resolved "https://registry.yarnpkg.com/@delon/cli/-/cli-0.6.6.tgz#0e17ac163c12a2f6c73ac32f5bf919624b31b33f"
"@delon/theme@0.6.6":
  version "0.6.6"
  resolved "https://registry.yarnpkg.com/@delon/theme/-/theme-0.6.6.tgz#de3439d709bdc3bac312f3f21b4a09d9ccc25467"
"@ngtools/json-schema@1.2.0":
  version "1.2.0"
@@ -1859,9 +1863,9 @@
    iconv-lite "0.4"
    rw "1"
d3-ease@^1.0.3:
d3-ease@~1.0.3:
  version "1.0.3"
  resolved "http://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
  resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
d3-geo-projection@~2.1.2:
  version "2.1.2"
@@ -1899,9 +1903,9 @@
  version "1.1.5"
  resolved "http://registry.npm.taobao.org/d3-hierarchy/download/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26"
d3-interpolate@^1.1.5:
d3-interpolate@~1.1.5:
  version "1.1.6"
  resolved "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
  resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
  dependencies:
    d3-color "1"
@@ -1923,9 +1927,9 @@
  dependencies:
    d3-path "1"
d3-timer@^1.0.6:
d3-timer@~1.0.6:
  version "1.0.7"
  resolved "http://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
  resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
d3-voronoi@~1.1.2:
  version "1.1.2"
@@ -3067,7 +3071,11 @@
  dependencies:
    assert-plus "^1.0.0"
gl-matrix@^2.3.2, gl-matrix@~2.4.0:
gl-matrix@~2.3.2:
  version "2.3.2"
  resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-2.3.2.tgz#aac808c74af7d5db05fe04cb60ca1a0fcb174d74"
gl-matrix@~2.4.0:
  version "2.4.0"
  resolved "http://registry.npm.taobao.org/gl-matrix/download/gl-matrix-2.4.0.tgz#2089b13301a29eec822d9d99dffc1f78ee9a3c50"
@@ -5047,9 +5055,9 @@
    rxjs "^5.5.2"
    zone.js "^0.8.14"
ng-tree-antd@^2.0.0:
  version "2.1.0"
  resolved "http://registry.npm.taobao.org/ng-tree-antd/download/ng-tree-antd-2.1.0.tgz#4cbb93ad3c7a2bddc6c329d788e767777481dcbb"
ng-tree-antd@^2.2.2:
  version "2.2.2"
  resolved "https://registry.yarnpkg.com/ng-tree-antd/-/ng-tree-antd-2.2.2.tgz#a28ee1adaa194c3429e49999daaab32f97124175"
  dependencies:
    "@angular/animations" "^5.0.0"
    "@angular/common" "^5.0.0"
@@ -5065,11 +5073,19 @@
    rxjs "^5.5.2"
    zone.js "^0.8.14"
ng-zorro-antd-extra@^1.1.6:
  version "1.1.6"
  resolved "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.6.tgz#b69ba30603843ffd6ded09a46dd2038542251e40"
ng-zorro-antd-extra@^1.1.7:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/ng-zorro-antd-extra/-/ng-zorro-antd-extra-1.1.7.tgz#0e0579cac2c8dc3ac566e1f49a4b0ca7f0186b50"
ng-zorro-antd@^0.6.5, ng-zorro-antd@^0.6.7:
ng-zorro-antd@^0.6.15:
  version "0.6.15"
  resolved "https://registry.yarnpkg.com/ng-zorro-antd/-/ng-zorro-antd-0.6.15.tgz#acef41a30febce835b871d52cd47d042ac2ed443"
  dependencies:
    "@angular/cdk" "^5.0.0"
    moment "^2.18.1"
    tslib "^1.7.1"
ng-zorro-antd@^0.6.7:
  version "0.6.10"
  resolved "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.10.tgz#0cf5ec5cb94e10226a2b2becff67debf0c8ad860"
  dependencies:
@@ -5080,10 +5096,6 @@
ng2-dnd@^5.0.0:
  version "5.0.2"
  resolved "http://registry.npm.taobao.org/ng2-dnd/download/ng2-dnd-5.0.2.tgz#862278ac7dedfa14f5783bbf34014d5d73dfefb4"
ng2-file-upload@^1.2.1:
  version "1.3.0"
  resolved "http://registry.npm.taobao.org/ng2-file-upload/download/ng2-file-upload-1.3.0.tgz#d90f8f568f62383462175f8bdfa0096b131f277a"
ng2-img-cropper@^0.9.0:
  version "0.9.0"
@@ -7657,9 +7669,9 @@
  version "0.0.6"
  resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
typescript@~2.5.0:
typescript@~2.5.3:
  version "2.5.3"
  resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
typescript@~2.6.2:
  version "2.6.2"
@@ -8196,14 +8208,14 @@
  version "0.1.0"
  resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
wolfy87-eventemitter@^5.1.0, wolfy87-eventemitter@~5.2.4:
  version "5.2.4"
  resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.4.tgz#5021d2952d3611cbcd195149711d9b595cd11d48"
wolfy87-eventemitter@~5.1.0:
  version "5.1.0"
  resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz#35c1ac0dd1ac0c15e35d981508fc22084a13a011"
wolfy87-eventemitter@~5.2.4:
  version "5.2.4"
  resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.4.tgz#5021d2952d3611cbcd195149711d9b595cd11d48"
wordwrap@0.0.2:
  version "0.0.2"
  resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"