Files
bbq/src/app/core/startup/startup.service.ts
Taric Xin 9161156e99 edit
2022-04-13 20:25:17 +08:00

192 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { HttpClient } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import { cacheConf } from '@conf/cache.conf';
import { sysConf } from '@conf/sys.conf';
import { ACLService } from '@delon/acl';
import { MenuService, SettingsService, TitleService, _HttpClient } from '@delon/theme';
import { AlainConfigService } from '@delon/util';
import { environment } from '@env/environment';
import { AmapService, EACacheService, EAUserService } from '@shared';
import { NzSafeAny } from 'ng-zorro-antd/core/types';
import { NzIconService } from 'ng-zorro-antd/icon';
import { NzImageService } from 'ng-zorro-antd/image';
import { NzUploadFile } from 'ng-zorro-antd/upload';
import { Observable, zip } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { ICONS } from '../../../style-icons';
import { ICONS_AUTO } from '../../../style-icons-auto';
import { CoreService } from '../core.service';
/**
* 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,
private settingService: SettingsService,
private aclService: ACLService,
private titleService: TitleService,
private httpClient: _HttpClient,
private userSrv: EAUserService,
private amapService: AmapService,
public cacheSrv: EACacheService,
private coreSrv: CoreService,
private nzImageService: NzImageService,
private alainConfigService: AlainConfigService
) {
iconSrv.addIcon(...ICONS_AUTO, ...ICONS);
this.settingService.setLayout('fixSiderbar', true);
// 全局修改sf图片预览方式
alainConfigService.set('sf', {
ui: {
preview: (file: NzUploadFile) => {
if (file.url) {
this.nzImageService.preview([{ src: file.url }]);
}
}
}
});
}
// TODO: 退出登录时需要清理用户信息
load(): Promise<void> {
return new Promise(resolve => {
this.amapService.getCurrentPosition().subscribe(res => {
if (res.position) {
this.coreSrv.position = { lat: res.position.lat, lng: res.position.lng };
}
});
let data;
if (this.coreSrv.loginStatus) {
// 本地菜单
// data = this.loadMockData();
// 远程菜单
data = this.loadRemoteData();
} else {
data = this.loadMockData();
}
data
.pipe(
catchError(res => {
console.warn(`StartupService.load: Network request failed`, res);
resolve();
return [];
})
)
.subscribe(
([appData, userData, menuData]) => this.initSystem(appData, userData, menuData),
err => {
console.log(err);
},
() => resolve()
);
});
}
/**
* 系统初始化
*
* @param langData 翻译数据
* @param appData App应用数据
* @param userData 用户数据
* @param menuData 菜单数据
*/
private initSystem(appData: NzSafeAny, userData: NzSafeAny, menuData: NzSafeAny): void {
// 应用信息:包括站点名、描述、年份
this.settingService.setApp(appData);
// 用户信息:包括姓名、头像、邮箱地址
this.settingService.setUser(userData);
this.cacheSrv.set(cacheConf.env, {
appId: sysConf.appId,
tenantId: userData?.tenantId || sysConf.tenantId,
enterpriseId: userData?.enterpriseId || sysConf.enterpriseId
});
// ACL设置权限为全量
this.aclService.setFull(false);
// 初始化菜单
if (menuData) {
this.menuService.add(menuData);
}
// 设置页面标题的后缀
this.titleService.default = '';
this.titleService.suffix = appData.name;
}
/**
* @description 加载本地模拟数据
* @returns 程序初始化数据
*/
loadMockData(): Observable<[object, object, object]> {
// 登录时调用远程数据, 非登录状态下调用Mock数据
// App数据
const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app));
// 用户数据
const userData = this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user));
// 菜单数据
const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.data.menu));
return zip(appData, userData, menuData);
}
/**
* @description 加载远程数据
* @returns 程序初始化数据
*/
loadRemoteData(): Observable<[object, object, object]> {
// 登录时调用远程数据, 非登录状态下调用Mock数据
// App数据
const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app));
// 用户数据
const userData = this.httpClient.post(this.userSrv.$api_get_user_by_token, {}).pipe(map((res: any) => res.data));
// 菜单数据
const menuData = this.httpClient
.post(this.coreSrv.$api_get_current_user_menus, {
appId: this.coreSrv.envSrv.getEnvironment().appId
})
.pipe(map((res: any) => res.data));
// const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.data.menu));
return zip(appData, userData, menuData);
}
// load(): Observable<void> {
// const defaultLang = this.i18n.defaultLang;
// return zip(this.i18n.loadLangData(defaultLang), this.httpClient.get('assets/tmp/app-data.json')).pipe(
// // 接收其他拦截器后产生的异常消息
// catchError(res => {
// console.warn(`StartupService.load: Network request failed`, res);
// return [];
// }),
// map(([langData, appData]: [Record<string, string>, NzSafeAny]) => {
// // setting language data
// this.i18n.use(defaultLang, langData);
// // 应用信息:包括站点名、描述、年份
// this.settingService.setApp(appData.app);
// // 用户信息:包括姓名、头像、邮箱地址
// this.settingService.setUser(appData.user);
// // ACL设置权限为全量
// this.aclService.setFull(true);
// // 初始化菜单
// this.menuService.add(appData.menu);
// // 设置页面标题的后缀
// this.titleService.default = '';
// this.titleService.suffix = appData.app.name;
// })
// );
// }
}