1 files added
	
		
		13 files modified
	
	
 
	
	
	
	
	
	
	
	
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | "defaults": { | 
|---|
|  |  |  | "schematics": { | 
|---|
|  |  |  | "collection": "@delon/cli" | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | "styleExt": "less", | 
|---|
|  |  |  | "class": { | 
|---|
|  |  |  | "spec": false | 
|---|
|  |  |  | 
|---|
|  |  |  | sudo: false | 
|---|
|  |  |  | sudo: required | 
|---|
|  |  |  | language: node_js | 
|---|
|  |  |  | node_js: | 
|---|
|  |  |  | - "8.5.0" | 
|---|
|  |  |  | 
|---|
|  |  |  | { | 
|---|
|  |  |  | "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/", | 
|---|
|  |  |  | 
|---|
|  |  |  | "@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", | 
|---|
|  |  |  | 
|---|
|  |  |  | "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", | 
|---|
|  |  |  | 
|---|
|  |  |  | "@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", | 
|---|
|  |  |  | 
|---|
|  |  |  | "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" | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | 
|---|
|  |  |  | 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', | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  | ) | 
|---|
|  |  |  | 
|---|
|  |  |  | private _default = 'zh-CN'; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private _langs = [ | 
|---|
|  |  |  | { code: 'zh-CN', text: '中文' }, | 
|---|
|  |  |  | { code: 'en', text: 'English' } | 
|---|
|  |  |  | { code: 'en', text: 'English' }, | 
|---|
|  |  |  | { code: 'zh-CN', text: '中文' } | 
|---|
|  |  |  | ]; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | constructor( | 
|---|
|  |  |  | 
|---|
|  |  |  | 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'; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | 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)) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * 进一步对基础模块的导入提炼 | 
|---|
|  |  |  | * 有关模块注册指导原则请参考: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 | 
|---|
|  |  |  | 
|---|
|  |  |  | // NzAffixModule, | 
|---|
|  |  |  | // NzAnchorModule, | 
|---|
|  |  |  | NzAvatarModule, | 
|---|
|  |  |  | NzUploadModule, | 
|---|
|  |  |  | // SERVICES | 
|---|
|  |  |  | NzNotificationService, | 
|---|
|  |  |  | NzMessageService | 
|---|
|  |  |  | 
|---|
|  |  |  | // NzBackTopModule, | 
|---|
|  |  |  | // NzAffixModule, | 
|---|
|  |  |  | // NzAnchorModule, | 
|---|
|  |  |  | NzAvatarModule | 
|---|
|  |  |  | NzAvatarModule, | 
|---|
|  |  |  | NzUploadModule | 
|---|
|  |  |  | ]; | 
|---|
|  |  |  | // endregion | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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: [ | 
|---|
|  |  |  | 
|---|
|  |  |  | // 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\\/` ], | 
|---|
|  |  |  | 
|---|
|  |  |  | // 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 } | 
|---|
|  |  |  | ] | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
| New file | 
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | <header-storage></header-storage> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div nz-menu-item> | 
|---|
|  |  |  | <header-langs></header-langs> | 
|---|
|  |  |  | <header-i18n></header-i18n> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </nz-dropdown> | 
|---|
|  |  |  | 
|---|
|  |  |  | 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'; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | HeaderIconComponent, | 
|---|
|  |  |  | HeaderFullScreenComponent, | 
|---|
|  |  |  | HeaderThemeComponent, | 
|---|
|  |  |  | HeaderLangsComponent, | 
|---|
|  |  |  | HeaderI18nComponent, | 
|---|
|  |  |  | HeaderStorageComponent, | 
|---|
|  |  |  | HeaderUserComponent | 
|---|
|  |  |  | ]; | 
|---|
|  |  |  | 
|---|
|  |  |  | <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> | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | .title { | 
|---|
|  |  |  | font-size: 28px; | 
|---|
|  |  |  | font-size: 33px; | 
|---|
|  |  |  | color: @heading-color; | 
|---|
|  |  |  | font-family: "Myriad Pro", "Helvetica Neue", Arial, Helvetica, sans-serif; | 
|---|
|  |  |  | font-weight: 600; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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({ | 
|---|
|  |  |  | 
|---|
|  |  |  | 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({ | 
|---|
|  |  |  | 
|---|
|  |  |  | 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, | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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: | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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" | 
|---|