6 files deleted
3 files added
26 files modified
| | |
| | | "scripts": [ |
| | | "../node_modules/@antv/g2/dist/g2.min.js", |
| | | "../node_modules/@antv/data-set/dist/data-set.min.js", |
| | | "../node_modules/@antv/g2-plugin-slider/dist/g-2.0.0.min.js" |
| | | "../node_modules/@antv/g2-plugin-slider/dist/g2-plugin-slider.min.js" |
| | | ], |
| | | "environmentSource": "environments/environment.ts", |
| | | "environments": { |
| | |
| | | "@delon/acl": "0.6.1", |
| | | "@delon/auth": "0.6.1", |
| | | "@delon/theme": "0.6.1", |
| | | "@delon/mock": "0.6.1", |
| | | "@delon/cache": "0.6.1", |
| | | "@ngx-translate/core": "^9.0.0", |
| | | "@ngx-translate/http-loader": "^2.0.0", |
| | |
| | | ], |
| | | providers: [ |
| | | { provide: LOCALE_ID, useValue: 'zh-Hans' }, |
| | | // TODO 暂时关闭登陆验证 |
| | | //{ provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true}, |
| | | { provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true}, |
| | | { provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true}, |
| | | { provide: ALAIN_I18N_TOKEN, useClass: I18NService, multi: false }, |
| | | StartupService, |
| | |
| | | import { AlainAuthModule } from '@delon/auth'; |
| | | import { AlainACLModule } from '@delon/acl'; |
| | | import { DelonCacheModule } from '@delon/cache'; |
| | | // 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 }) ] : []; |
| | | |
| | | |
| | | @NgModule({ |
| | | imports: [ |
| | |
| | | // acl |
| | | AlainACLModule.forRoot(), |
| | | // cache |
| | | DelonCacheModule.forRoot(), |
| | | // mock |
| | | ...MOCKMODULE |
| | | DelonCacheModule.forRoot() |
| | | ] |
| | | }) |
| | | export class DelonModule { |
| | |
| | | <span class="title">ng-alain</span> |
| | | </a> |
| | | </div> |
| | | <p class="desc">武林中最有影响力的《葵花宝典》;欲练神功,挥刀自宫</p> |
| | | <p class="desc"></p> |
| | | </div> |
| | | <router-outlet></router-outlet> |
| | | <global-footer [links]="links"> |
| | |
| | | </div> |
| | | <nz-card [nzBordered]="false"> |
| | | <div class="mb-md"> |
| | | <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <i class="anticon anticon-plus"></i><span>新建</span> |
| | | </button> |
| | | <ng-container *ngIf="selectedRows.length > 0"> |
| | |
| | | styles: [] |
| | | }) |
| | | export class DeviceEditComponent implements OnInit { |
| | | private monitorPoints:any [] = []; |
| | | private deviceVersions:any [] = []; |
| | | private operateUsers:any [] = []; |
| | | private isSaving = false; |
| | | public monitorPoints:any [] = []; |
| | | public deviceVersions:any [] = []; |
| | | public operateUsers:any [] = []; |
| | | public isSaving = false; |
| | | constructor( |
| | | private subject: NzModalSubject, |
| | | private formBuilder: FormBuilder, |
| | |
| | | <pro-header [title]="grid.title"></pro-header> |
| | | <nz-card [nzBordered]="false"> |
| | | <div class="mb-md"> |
| | | <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <i class="anticon anticon-plus"></i><span>新建</span> |
| | | </button> |
| | | <ng-container *ngIf="grid.selectedIndexs.length > 0"> |
| | |
| | | </nz-table> |
| | | <div class="modal-footer"> |
| | | <button nz-button type="button" (click)="close()">关闭</button> |
| | | <button nz-button [nzType]="'primary'" (click)="save($event)" [nzLoading]="isSaving"> |
| | | <button nz-button [nzType]="'primary'" (click)="save($event,null,null)" [nzLoading]="isSaving"> |
| | | <span > |
| | | 保存<span *ngIf="isSaving" >中</span> |
| | | </span> |
| | |
| | | <pro-header [title]="grid.title"></pro-header> |
| | | <nz-card [nzBordered]="false"> |
| | | <div class="mb-md"> |
| | | <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <i class="anticon anticon-plus"></i><span>新建</span> |
| | | </button> |
| | | <ng-container *ngIf="grid.selectedIndexs.length > 0"> |
| | |
| | | </nz-input> |
| | | </div> |
| | | <div nz-col [nzSpan]="1"> |
| | | <button nz-button [nzType]="'primary'" [disabled]="disabled" (click)="mapSearch($event)" class="mr-sm"> |
| | | <button nz-button [nzType]="'primary'" (click)="mapSearch($event)" class="mr-sm"> |
| | | <i class="anticon anticon-search"></i><span>搜索</span> |
| | | </button> |
| | | </div> |
| | |
| | | export class CoordinatesPickerComponent{ |
| | | Default_LNG = 121; |
| | | Default_LAT = 31.4; |
| | | isSaving = false; |
| | | markerOption:{ |
| | | point:Point, |
| | | options:MarkerOptions |
| | |
| | | this.subject.destroy(); |
| | | } |
| | | save() { |
| | | this.isSaving = true; |
| | | this.subject.next(); |
| | | this.subject.destroy(); |
| | | } |
New file |
| | |
| | | <form nz-form [formGroup]="form" (ngSubmit)="submit()" role="form"> |
| | | <nz-alert *ngIf="error" [nzType]="'error'" [nzMessage]="error" [nzShowIcon]="true" class="mb-lg"></nz-alert> |
| | | <div nz-form-item> |
| | | <div nz-form-control [nzValidateStatus]="userName"> |
| | | <nz-input formControlName="userName" [nzPlaceHolder]="'admin'" [nzSize]="'large'"> |
| | | <ng-template #prefix> |
| | | <i class="anticon anticon-user"></i> |
| | | </ng-template> |
| | | </nz-input> |
| | | <ng-container *ngIf="userName.dirty || userName.touched"> |
| | | <p nz-form-explain *ngIf="userName.errors?.required">请输入账户名!</p> |
| | | <p nz-form-explain *ngIf="userName.errors?.minlength">至少五个字符</p> |
| | | </ng-container> |
| | | </div> |
| | | </div> |
| | | <div nz-form-item> |
| | | <div nz-form-control [nzValidateStatus]="password"> |
| | | <nz-input formControlName="password" [nzPlaceHolder]="'888888'" [nzType]="'password'" [nzSize]="'large'"> |
| | | <ng-template #prefix> |
| | | <i class="anticon anticon-lock"></i> |
| | | </ng-template> |
| | | </nz-input> |
| | | <div nz-form-explain *ngIf="(password.dirty || password.touched) && password.errors?.required">请输入密码!</div> |
| | | </div> |
| | | </div> |
| | | <div nz-form-item nz-row> |
| | | <div nz-col [nzSpan]="12"> |
| | | <label nz-checkbox formControlName="remember"> |
| | | <span>自动登录</span> |
| | | </label> |
| | | </div> |
| | | <div nz-col [nzSpan]="12" class="text-right"> |
| | | <a class="forgot" (click)="msg.error('请找欧阳锋')">忘记密码?</a> |
| | | </div> |
| | | </div> |
| | | <div nz-form-item> |
| | | <button nz-button [nzType]="'primary'" [nzLoading]="loading" [nzSize]="'large'" class="ant-btn__block"> |
| | | <span>登录</span> |
| | | </button> |
| | | </div> |
| | | </form> |
| | | <div class="other"> |
| | | 其他登录方式 |
| | | <nz-tooltip [nzTitle]="'in fact Auth0 via window'"> |
| | | <span nz-tooltip class="icon-alipay" (click)="open('auth0', 'window')"></span> |
| | | </nz-tooltip> |
| | | <nz-tooltip [nzTitle]="'in fact Github via redirect'"> |
| | | <span nz-tooltip class="icon-taobao" (click)="open('github')"></span> |
| | | </nz-tooltip> |
| | | <nz-tooltip [nzTitle]="'真的是微博'"> |
| | | <span nz-tooltip class="icon-weibo" (click)="open('weibo', 'window')"></span> |
| | | </nz-tooltip> |
| | | <a class="register" routerLink="/passport/register">注册账户</a> |
| | | </div> |
New file |
| | |
| | | @import '~@delon/theme/styles/antd/themes/default.less'; |
| | | |
| | | :host { |
| | | display: block; |
| | | width: 368px; |
| | | margin: 0 auto; |
| | | |
| | | ::ng-deep { |
| | | .tabs { |
| | | padding: 0 2px; |
| | | margin: 0 -2px; |
| | | .ant-tabs-tab { |
| | | font-size: 16px; |
| | | line-height: 24px; |
| | | } |
| | | .ant-input-affix-wrapper .ant-input:not(:first-child) { |
| | | padding-left: 34px; |
| | | } |
| | | } |
| | | |
| | | .ant-tabs .ant-tabs-bar { |
| | | border-bottom: 0; |
| | | margin-bottom: 24px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .ant-form-item { |
| | | margin-bottom: 24px; |
| | | } |
| | | |
| | | .icon-alipay, .icon-taobao, .icon-weibo { |
| | | display: inline-block; |
| | | width: 24px; |
| | | height: 24px; |
| | | background: url('https://gw.alipayobjects.com/zos/rmsportal/itDzjUnkelhQNsycranf.svg'); |
| | | margin-left: 16px; |
| | | vertical-align: middle; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .icon-alipay { |
| | | background-position: -24px 0; |
| | | |
| | | &:hover { |
| | | background-position: 0 0; |
| | | } |
| | | } |
| | | |
| | | .icon-taobao { |
| | | background-position: -24px -24px; |
| | | |
| | | &:hover { |
| | | background-position: 0 -24px; |
| | | } |
| | | } |
| | | |
| | | .icon-weibo { |
| | | background-position: -24px -48px; |
| | | |
| | | &:hover { |
| | | background-position: 0 -48px; |
| | | } |
| | | } |
| | | |
| | | .other { |
| | | text-align: left; |
| | | margin-top: 24px; |
| | | line-height: 22px; |
| | | |
| | | .register { |
| | | float: right; |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | import { SettingsService } from '@delon/theme'; |
| | | import { Component, OnDestroy, Inject } 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 { environment } from '@env/environment'; |
| | | |
| | | @Component({ |
| | | selector: 'passport-login', |
| | | templateUrl: './login.component.html', |
| | | styleUrls: [ './login.component.less' ], |
| | | providers: [ SocialService ] |
| | | }) |
| | | export class UserLoginComponent implements OnDestroy { |
| | | |
| | | form: FormGroup; |
| | | error = ''; |
| | | type = 0; |
| | | loading = false; |
| | | |
| | | constructor( |
| | | fb: FormBuilder, |
| | | private router: Router, |
| | | public msg: NzMessageService, |
| | | private settingsService: SettingsService, |
| | | private socialService: SocialService, |
| | | @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) { |
| | | this.form = fb.group({ |
| | | userName: [null, [Validators.required, Validators.minLength(5)]], |
| | | password: [null, Validators.required], |
| | | mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]], |
| | | captcha: [null, [Validators.required]], |
| | | remember: [true] |
| | | }); |
| | | } |
| | | |
| | | // region: fields |
| | | |
| | | get userName() { return this.form.controls.userName; } |
| | | get password() { return this.form.controls.password; } |
| | | get mobile() { return this.form.controls.mobile; } |
| | | get captcha() { return this.form.controls.captcha; } |
| | | |
| | | // endregion |
| | | |
| | | switch(ret: any) { |
| | | this.type = ret.index; |
| | | } |
| | | |
| | | // region: get captcha |
| | | |
| | | count = 0; |
| | | interval$: any; |
| | | |
| | | getCaptcha() { |
| | | this.count = 59; |
| | | this.interval$ = setInterval(() => { |
| | | this.count -= 1; |
| | | if (this.count <= 0) |
| | | clearInterval(this.interval$); |
| | | }, 1000); |
| | | } |
| | | |
| | | // endregion |
| | | |
| | | submit() { |
| | | this.error = ''; |
| | | if (this.type === 0) { |
| | | this.userName.markAsDirty(); |
| | | this.password.markAsDirty(); |
| | | if (this.userName.invalid || this.password.invalid) return; |
| | | } else { |
| | | this.mobile.markAsDirty(); |
| | | this.captcha.markAsDirty(); |
| | | if (this.mobile.invalid || this.captcha.invalid) return; |
| | | } |
| | | // mock http |
| | | this.loading = true; |
| | | setTimeout(() => { |
| | | this.loading = false; |
| | | if (this.type === 0) { |
| | | if (this.userName.value !== 'admin' || this.password.value !== '123456') { |
| | | this.error = `账户或密码错误`; |
| | | return; |
| | | } |
| | | } |
| | | |
| | | this.tokenService.set({ |
| | | token: '123456789', |
| | | name: this.userName.value, |
| | | email: `cipchk@qq.com`, |
| | | id: 10000, |
| | | time: +new Date |
| | | }); |
| | | this.router.navigate(['/']); |
| | | }, 1000); |
| | | } |
| | | |
| | | // region: social |
| | | |
| | | open(type: string, openType: SocialOpenType = 'href') { |
| | | let url = ``; |
| | | let callback = ``; |
| | | if (environment.production) |
| | | callback = 'https://cipchk.github.io/ng-alain/callback/' + type; |
| | | else |
| | | callback = 'http://localhost:4200/callback/' + type; |
| | | switch (type) { |
| | | case 'auth0': |
| | | url = `//cipchk.auth0.com/login?client=8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5&redirect_uri=${decodeURIComponent(callback)}`; |
| | | break; |
| | | case 'github': |
| | | url = `//github.com/login/oauth/authorize?client_id=9d6baae4b04a23fcafa2&response_type=code&redirect_uri=${decodeURIComponent(callback)}`; |
| | | break; |
| | | case 'weibo': |
| | | url = `https://api.weibo.com/oauth2/authorize?client_id=1239507802&response_type=code&redirect_uri=${decodeURIComponent(callback)}`; |
| | | break; |
| | | } |
| | | if (openType === 'window') { |
| | | this.socialService.login(url, '/', { |
| | | type: 'window' |
| | | }).subscribe(res => { |
| | | if (res) { |
| | | this.settingsService.setUser(res); |
| | | this.router.navigateByUrl('/'); |
| | | } |
| | | }); |
| | | } else { |
| | | this.socialService.login(url, '/', { |
| | | type: 'href' |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // endregion |
| | | |
| | | ngOnDestroy(): void { |
| | | if (this.interval$) clearInterval(this.interval$); |
| | | } |
| | | } |
| | |
| | | import { DashboardAnalysisComponent } from './dashboard/analysis/analysis.component'; |
| | | import { DashboardMonitorComponent } from './dashboard/monitor/monitor.component'; |
| | | import { DashboardWorkplaceComponent } from './dashboard/workplace/workplace.component'; |
| | | import { UserLoginComponent } from 'app/routes/passport/login/login.component'; |
| | | |
| | | |
| | | const routes: Routes = [ |
| | |
| | | { path: 'sensors', loadChildren: './sensors/sensors.module#SensorsModule' }, |
| | | { path: 'systems', loadChildren: './systems/systems.module#SystemsModule' }, |
| | | ] |
| | | }, // passport |
| | | { |
| | | path: 'passport', |
| | | component: LayoutPassportComponent, |
| | | children: [ |
| | | { path: 'login', component: UserLoginComponent } |
| | | ] |
| | | }, |
| | | { path: '**', redirectTo: 'dashboard' } |
| | | ]; |
| | |
| | | import { UserLoginComponent } from './passport/login/login.component'; |
| | | import { DateService } from '@business/services/util/date.service'; |
| | | import { _HttpClient } from '@delon/theme'; |
| | | import { NgModule } from '@angular/core'; |
| | |
| | | DashboardV1Component, |
| | | DashboardAnalysisComponent, |
| | | DashboardMonitorComponent, |
| | | DashboardWorkplaceComponent |
| | | DashboardWorkplaceComponent, |
| | | UserLoginComponent |
| | | ], |
| | | providers: [ |
| | | _HttpClient, |
| | |
| | | <pro-header [title]="grid.title"></pro-header> |
| | | <nz-card [nzBordered]="false"> |
| | | <div class="mb-md"> |
| | | <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <i class="anticon anticon-plus"></i><span>新建</span> |
| | | </button> |
| | | <ng-container *ngIf="grid.selectedIndexs.length > 0"> |
| | | <button nz-button [nzSize]="'large'" (click)="deleteSelected()">批量删除</button> |
| | | <button nz-button [nzSize]="'large'" (click)="deleteSelected($event)">批量删除</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="modal-footer"> |
| | | <button nz-button type="button" (click)="close()">关闭</button> |
| | | <button nz-button [nzLoading]="http.loading" [nzType]="'primary'" [disabled]="!validateForm.valid">保存</button> |
| | | <button nz-button [nzType]="'primary'" [disabled]="!validateForm.valid">保存</button> |
| | | </div> |
| | | </form> |
| | |
| | | |
| | | export class AccountComponent implements OnInit { |
| | | |
| | | private isDeleteOptions = [ |
| | | public isDeleteOptions = [ |
| | | {value: '1', label: '是'}, |
| | | {value: '0', label: '否'} |
| | | ]; |
| | |
| | | ngOnDestroy(): void { |
| | | this.backToList(); |
| | | } |
| | | private organization: Organization; |
| | | public organization: Organization; |
| | | grid: Grid<object> = new Grid<object>(null); |
| | | validateForm: FormGroup; |
| | | constructor( |
| | |
| | | } |
| | | } |
| | | } |
| | | private hasDegression = false; |
| | | refreshHasDegression(value){ |
| | | public hasDegression = false; |
| | | public refreshHasDegression(value){ |
| | | if(value){ |
| | | this.hasDegression = true; |
| | | }else{ |
| | |
| | | <nz-card [nzBordered]="false"> |
| | | <div class="mb-md"> |
| | | <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'"> |
| | | <i class="anticon anticon-plus"></i><span>新建</span> |
| | | </button> |
| | | <ng-container *ngIf="grid.selectedIndexs.length > 0"> |
| | | <button nz-button [nzSize]="'large'" (click)="deleteSelected()">批量删除</button> |
| | | <button nz-button [nzSize]="'large'" (click)="deleteSelected($event)">批量删除</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> |
| | |
| | | ngOnInit(): void { |
| | | } |
| | | constructor( |
| | | private organizationService: OrganizationService |
| | | public organizationService: OrganizationService |
| | | ) {} |
| | | } |
| | |
| | | </div> |
| | | <div class="modal-footer"> |
| | | <button nz-button type="button" (click)="close()">关闭</button> |
| | | <button nz-button [nzLoading]="http.loading" [nzType]="'primary'">保存</button> |
| | | <button nz-button [nzType]="'primary'">保存</button> |
| | | </div> |
| | | </form> |
| | |
| | | <th nz-th><span>创建日期</span></th> |
| | | <th nz-th> |
| | | <span>过期日期</span> |
| | | <nz-table-sort [(nzValue)]="sortMap.updatedAt" (nzValueChange)="sort('expire_time', $event)"></nz-table-sort> |
| | | <nz-table-sort [(nzValue)]="sortMap" (nzValueChange)="sort('expire_time', $event)"></nz-table-sort> |
| | | </th> |
| | | <th nz-th><span>操作</span></th> |
| | | </tr> |
| | |
| | | </div> |
| | | <div class="modal-footer"> |
| | | <button nz-button type="button" (click)="close()">关闭</button> |
| | | <button nz-button [nzLoading]="http.loading" [nzType]="'primary'">保存</button> |
| | | <button nz-button [nzType]="'primary'">保存</button> |
| | | </div> |
| | | </form> |
| | |
| | | export class UserInstallerEditComponent implements OnInit { |
| | | |
| | | user: any; |
| | | private validateForm: FormGroup; |
| | | public validateForm: FormGroup; |
| | | |
| | | constructor( |
| | | private modalHelper: ModalHelper, |
| | |
| | | production: true, |
| | | hmr: false, |
| | | useHash: true, |
| | | SERVER_BASH_URL: `http://47.96.15.25:8001/` |
| | | SERVER_BASH_URL:`http://47.96.171.62:8080/screen_api_v2/` |
| | | }; |
| | |
| | | version "0.6.1" |
| | | resolved "http://registry.npm.taobao.org/@delon/cache/download/@delon/cache-0.6.1.tgz#13b412897743dc2ad612c4c4fca280c3dc044825" |
| | | |
| | | "@delon/mock@0.6.1": |
| | | version "0.6.1" |
| | | resolved "http://registry.npm.taobao.org/@delon/mock/download/@delon/mock-0.6.1.tgz#e52bbdd708ff83680c985d0aa4ace282168de873" |
| | | |
| | | "@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" |
| | |
| | | resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" |
| | | dependencies: |
| | | jsbn "~0.1.0" |
| | | |
| | | echarts@^3.8.5: |
| | | version "3.8.5" |
| | | resolved "https://registry.yarnpkg.com/echarts/-/echarts-3.8.5.tgz#58e4a51d2743c6fb75257b0dc0a9cf9f5378ac0e" |
| | | dependencies: |
| | | zrender "3.7.4" |
| | | |
| | | ee-first@1.1.1: |
| | | version "1.1.1" |
| | |
| | | zone.js@^0.8.14, zone.js@^0.8.18: |
| | | version "0.8.19" |
| | | resolved "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.19.tgz#a4b522cd9e8b7b616a638c297d720d4c7f292f71" |
| | | |
| | | zrender@3.7.4: |
| | | version "3.7.4" |
| | | resolved "https://registry.yarnpkg.com/zrender/-/zrender-3.7.4.tgz#f847d53948481ef6d42906d1ea9aeec7acbefdf2" |