127 lines
4.5 KiB
TypeScript
127 lines
4.5 KiB
TypeScript
import { Injectable, Inject } from '@angular/core';
|
||
import { Router } from '@angular/router';
|
||
import { HttpClient } from '@angular/common/http';
|
||
import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
||
import { ALAIN_I18N_TOKEN, MenuService, SettingsService, TitleService } from '@delon/theme';
|
||
import { ACLService } from '@delon/acl';
|
||
import { I18NService } from '../i18n/i18n.service';
|
||
import { Observable, zip, of } from 'rxjs';
|
||
import { catchError, map } from 'rxjs/operators';
|
||
import type { NzSafeAny } from 'ng-zorro-antd/core/types';
|
||
import { NzIconService } from 'ng-zorro-antd/icon';
|
||
|
||
import { ICONS } from '../../../style-icons';
|
||
import { ICONS_AUTO } from '../../../style-icons-auto';
|
||
/**
|
||
* Used for application startup
|
||
* Generally used to get the basic data of the application, like: Menu Data, User Data, etc.
|
||
*/
|
||
@Injectable()
|
||
export class StartupService {
|
||
constructor(
|
||
iconSrv: NzIconService,
|
||
private menuService: MenuService,
|
||
@Inject(ALAIN_I18N_TOKEN) private i18n: I18NService,
|
||
private settingService: SettingsService,
|
||
private aclService: ACLService,
|
||
private titleService: TitleService,
|
||
@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService,
|
||
private httpClient: HttpClient,
|
||
private router: Router
|
||
) {
|
||
iconSrv.addIcon(...ICONS_AUTO, ...ICONS);
|
||
}
|
||
|
||
|
||
private viaHttp(): Observable<void> {
|
||
const defaultLang = this.i18n.defaultLang;
|
||
return zip(this.i18n.loadLangData(defaultLang), this.httpClient.get('http://localhost:4200/assets/tmp/app-data.json')).pipe(
|
||
catchError((res: NzSafeAny) => {
|
||
console.warn(`StartupService.load: Network request failed`, res);
|
||
setTimeout(() => this.router.navigateByUrl(`/exception/500`));
|
||
return [];
|
||
}),
|
||
map(([langData, appData]: [Record<string, string>, NzSafeAny]) => {
|
||
// setting language data
|
||
this.i18n.use(defaultLang, langData);
|
||
|
||
// Application data
|
||
// Application information: including site name, description, year
|
||
this.settingService.setApp(appData.app);
|
||
// User information: including name, avatar, email address
|
||
// this.settingService.setUser(appData.user);
|
||
// ACL: Set the permissions to full, https://ng-alain.com/acl/getting-started
|
||
this.aclService.setFull(true);
|
||
// Menu data, https://ng-alain.com/theme/menu
|
||
this.menuService.add(appData.menu);
|
||
// Can be set page suffix title, https://ng-alain.com/theme/title
|
||
this.titleService.suffix = appData.app.name;
|
||
})
|
||
);
|
||
}
|
||
|
||
|
||
|
||
private viaMockI18n(): Observable<void> {
|
||
const defaultLang = this.i18n.defaultLang;
|
||
return this.i18n.loadLangData(defaultLang).pipe(
|
||
map((langData: NzSafeAny) => {
|
||
this.i18n.use(defaultLang, langData);
|
||
|
||
this.viaMock();
|
||
})
|
||
);
|
||
}
|
||
|
||
private viaMock(): Observable<void> {
|
||
// const tokenData = this.tokenService.get();
|
||
// if (!tokenData.token) {
|
||
// this.router.navigateByUrl(this.tokenService.login_url!);
|
||
// return;
|
||
// }
|
||
// mock
|
||
const app: any = {
|
||
name: `HertzBeat`,
|
||
description: `面向开发者,易用友好的高性能监控云服务`
|
||
};
|
||
const user: any = {
|
||
name: 'Admin',
|
||
avatar: './assets/tmp/img/avatar.svg',
|
||
email: 'tomsun28@outlook.com',
|
||
token: '123456789'
|
||
};
|
||
// Application information: including site name, description, year
|
||
this.settingService.setApp(app);
|
||
// User information: including name, avatar, email address
|
||
this.settingService.setUser(user);
|
||
// ACL: Set the permissions to full, https://ng-alain.com/acl/getting-started
|
||
this.aclService.setFull(true);
|
||
// Menu data, https://ng-alain.com/theme/menu
|
||
this.menuService.add([
|
||
{
|
||
text: 'Main',
|
||
group: true,
|
||
children: [
|
||
{
|
||
text: 'Dashboard',
|
||
link: '/dashboard',
|
||
icon: { type: 'icon', value: 'appstore' }
|
||
}
|
||
]
|
||
}
|
||
]);
|
||
// Can be set page suffix title, https://ng-alain.com/theme/title
|
||
this.titleService.suffix = app.name;
|
||
|
||
return of();
|
||
}
|
||
|
||
load(): Observable<void> {
|
||
// http
|
||
return this.viaHttp();
|
||
// mock: Don’t use it in a production environment. ViaMock is just to simulate some data to make the scaffolding work normally
|
||
// mock:请勿在生产环境中这么使用,viaMock 单纯只是为了模拟一些数据使脚手架一开始能正常运行
|
||
// return this.viaMockI18n();
|
||
}
|
||
}
|